MACRO-80 3.4 01-Dec-80 PAGE 1 ;******************************************************** ;* * ;* Monitor ROM for Bigboard_II single board * ;* computer. * ;* * ;* copyright (C) 1982 by Russell Smith. * ;* all rights reserved by Russell Smith. * ;* * ;* last revision date ... 8-July-1982 * ;* * ;******************************************************** ; ; 0000' ASEG F000 MONITR EQU 0F000H F800 DSKBUF EQU 0F800H FF00 RAM EQU 0FF00H ; ; ; ORG 0000H ;PUT ROM-RESIDENT STUFF HERE C INCLUDE INIT.MAC ;COLD START INITIALIZATION C ;******************************************************** C ;* * C ;* COLD START INITIALIZATION ROUTINE FOR * C ;* CONFIGURING THE SYSTEM AFTER A POWER-ON * C ;* OR PUSHBUTTON RESET. * C ;* * C ;******************************************************** C ; C ; C ; 0000 F3 C INIT: DI 0001 31 0162 C LD SP,TSTSTK 0004 11 0000 C LD DE,0 0007 3E 10 C LD A,10H 0009 CD 0162 C CALL CRCGEN ;VERIFY CRC IN FIRST 4K ROM 000C 20 FE C INIT1: JR NZ,$ ;LOOP FOREVER IF BAD CRC C ; C ; C ; PERFORM READ/WRITE TEST OF MONITOR AND GLOBAL VARIABLES RAM C ; 000E 21 F000 C RAMTST: LD HL,MONITR 0011 11 FF00 C LD DE,RAM 0014 3E 01 C LD A,1 0016 06 08 C RTST1: LD B,8 0018 77 C RTST2: LD (HL),A ;WRITE TEST BYTE INTO MONITOR/GLOBALS 0019 12 C LD (DE),A 001A 07 C RLCA ;ROTATE BIT PATTERN IN A 001B 23 C INC HL 001C 1C C INC E ;BUMP E TO DO INNER LOOP 256 TIMES 001D 20 F9 C JR NZ,RTST2 001F 10 F7 C DJNZ RTST2 ;REPEAT 8 TIMES FOR 2048 BYTES C 0021 0E 08 C LD C,8 MACRO-80 3.4 01-Dec-80 PAGE 1-1 0023 2B C RTST3: DEC HL 0024 1D C DEC E 0025 0F C RRCA 0026 BE C CP (HL) ;VERIFY THAT TEST PATTERN IS WRITTEN 0027 20 FE C JR NZ,$ ;STICK FOREVER IF MONITOR RAM FAILURE 0029 EB C EX DE,HL 002A BE C CP (HL) 002B EB C EX DE,HL 002C 20 FE C JR NZ,$ ;STICK FOREVER IF GLOBAL RAM FAILURE 002E 10 F3 C DJNZ RTST3 0030 0D C DEC C 0031 20 F0 C JR NZ,RTST3 C 0033 87 C ADD A,A 0034 20 E0 C JR NZ,RTST1 ;DO 8 PASSES OVER MEMORY BLOCKS C ; C ; 0036 31 F65B C LD SP,STACK ;LOAD STACK POINTER NOW THAT IT IS SAFE C ; C ; C ; MOVE COPY OF RAM-RESIDENT ROUTINES TO HIGH MEMORY C ; 0039 21 0982 C LD HL,MONCOPY 003C 11 F000 C LD DE,MONITR 003F 01 05B8 C LD BC,MONLEN 0042 ED B0 C LDIR C ; C ; MOVE COPY OF INITIALIZED GLOBAL VARIABLES TO HIGH MEMORY C ; 0044 21 0F3A C LD HL,RAMCOPY 0047 11 FF00 C LD DE,RAM 004A 01 00BE C LD BC,RAMLEN 004D ED B0 C LDIR C ; C ; C ; INITIALIZE Z80 FAMILY PROGRAMMABLE I/O DEVICES C ; 004F 21 0195 C LD HL,IOTAB ;POINT TO I/O INIT TABLE 0052 46 C INIT3: LD B,(HL) ;B=INIT LOOP BYTECOUNT 0053 23 C INC HL 0054 4E C LD C,(HL) ;C=DEVICE CONTROL PORT# 0055 23 C INC HL 0056 ED B3 C OTIR ;SEND DATA @ HL TO PORT @ C 0058 CB 7E C BIT 7,(HL) ;TEST FOR TABLE END MARKER 005A 28 F6 C JR Z,INIT3 ;LOOP AGAIN IF NOT AT END C ; C ; C ; FIRE-UP CRT DISPLAY C ; 005C 21 01D5 C LD HL,M1TAB 005F DB C4 C IN A,(SENSE) ;TEST SENSE SWITCHES FOR 5*7 OR 7*9 0061 CB 67 C BIT 4,A ; FONT AND PROGRAM 6845 ACCORDINGLY 0063 28 03 C JR Z,SKIP1 0065 21 01E5 C LD HL,M2TAB 0068 CD 0186 C SKIP1: CALL INITCRT ;PROGRAM 6845 CONFIGURATION REGISTERS 006B CD 03AB C CALL CLRALL ;CLEAR VIDEO DISPLAY MEMORY MACRO-80 3.4 01-Dec-80 PAGE 1-2 C ; C ; SET DISK PARAMETERS FOR 5 OR 8 INCH DRIVES C ; 006E DB C4 C IN A,(SENSE) 0070 CB 6F C BIT 5,A ;TEST DISK-TYPE SENSE SWITCH INPUT 0072 28 0F C JR Z,SKIP2 ; AND JUMP IF 8 INCH DRIVES INDICATED 0074 3E 03 C LD A,00000011B 0076 32 FF96 C LD (DSKTYP),A ;SET DISK TYPE FOR MINI-FLOPPIES 0079 3E 0F C LD A,15 007B 32 FF95 C LD (NREVS),A ;REQUIRE 15 REVOLUTIONS BEFORE READY 007E 3E 64 C LD A,5*20 0080 32 FF94 C LD (NSTOP),A ;STOP MOTORS AFTER 20 SECONDS 0083 CD F3B4 C SKIP2: CALL FLIPDENS ;SET SMC DATA SEPRARATOR INITAL VALUE C ; C ; INITIALIZE THE Z-80 FOR INTERRUPT MODE #2 C 0086 21 FF00 C LD HL,RAM 0089 7C C LD A,H 008A ED 47 C LD I,A ;LOAD I REG WITH MSB OF VECTOR TABLE 008C ED 5E C IM 2 ; AND SELECT INTERRUPT MODE 2 C ; C ; C ; DETERMINE IF CONSOLE I/O CONFIGURATION WILL BE FOR THE C ; ON-BOARD CRT AND KEYBOARD OR AN EXTERNAL SERIAL TERMINAL. C ; 008E 11 1000 C LD DE,1000H 0091 3E 18 C LD A,18H 0093 CD 0162 C CALL CRCGEN ;CHECK CRC OF SECOND ROM 0096 CC 1000 C CALL Z,1000H ;EXECUTE SECOND ROM IF CRC VERIFIES C 0099 CD 0279 C CALL BELL ;BEEP THE BUZZER TO SAY WE ARE ALIVE 009C DB C4 C IN A,(SENSE) 009E E6 0B C AND 00001011B 00A0 4F C LD C,A ;SAVE STATE OF SENSE INPUT PORT 00A1 DB C4 C DECIDE: IN A,(SENSE) 00A3 E6 0B C AND 00001011B ;TEST FOR ARRIVAL OF A START BIT OR 00A5 A9 C XOR C ; A CHANGE IN THE KEYBOARD STROBE 00A6 28 F9 C JR Z,DECIDE 00A8 CB 5F C BIT 3,A 00AA 20 64 C JR NZ,PARALL ;JUMP IF INPUT IF FROM KEYBOARD C ; C ; AUTOMATIC BAUD RATE SETTING ROUTINE FOR SIO C ; 00AC E6 03 C BAUD: AND 00000011B 00AE 4F C LD C,A ;GET MASK BIT FOR SIO CHANNEL A/B 00AF 06 00 C LD B,0 00B1 DB C4 C BAUD1: IN A,(SENSE) ;READ SENSE INPUT PORT 00B3 A1 C AND C ;TEST SIO RECEIVE INPUT BIT 00B4 28 FB C JR Z,BAUD1 ;LOOP UNTIL IT CHANGES STATE 00B6 E3 C BAUD2: EX (SP),HL ;DELAY A BIT 00B7 E3 C EX (SP),HL 00B8 04 C INC B 00B9 DB C4 C IN A,(SENSE) ;LOOP TO MEASURE THE START BIT TIME 00BB A1 C AND C 00BC 20 F8 C JR NZ,BAUD2 00BE 11 00FF C LD DE,RATES-1 MACRO-80 3.4 01-Dec-80 PAGE 1-3 00C1 13 C BAUD3: INC DE ;INDEX INTO BAUD RATE TABLE 00C2 CB 10 C RL B ; USING COUNT DERRIVED IN B 00C4 30 FB C JR NC,BAUD3 C 00C6 21 0108 C LD HL,SIOATAB ;POINT TO SIO CHANNEL A INIT STUFF 00C9 CB 41 C BIT 0,C ;TEST IF USING SIO CHANNEL A OR B 00CB 20 03 C JR NZ,BAUD4 ;JUMP IF USING CHANNEL A 00CD 21 010C C LD HL,SIOBTAB ;ELSE POINT TO OTHER INIT DATA TABLE 00D0 4E C BAUD4: LD C,(HL) ;GET BAUDRATE CTC PORT# FROM TABLE 00D1 23 C INC HL 00D2 3E 47 C LD A,01000111B 00D4 ED 79 C OUT (C),A ;PUT BAUDRATE CTC IN COUNTER MODE 00D6 1A C LD A,(DE) 00D7 ED 79 C OUT (C),A ;SET DIVIDE RATIO FOR SELECTED RATE 00D9 5E C LD E,(HL) ;LOAD E WITH SIO A/B CONTROL PORT# 00DA 23 C INC HL 00DB 56 C LD D,(HL) ;LOAD D WITH SIO A/B DATA PORT# 00DC 23 C INC HL 00DD ED 53 FF6D C LD (SIOADR),DE ;SAVE SIO CONTROL/DATA PORT NUMBERS 00E1 4B C LD C,E 00E2 ED 78 C BAUD5: IN A,(C) ;LOOP UNTIL SIO CHANNEL RECEIVES 00E4 CB 47 C BIT 0,A ; GARBLED FIRST CHARACTER 00E6 28 FA C JR Z,BAUD5 00E8 4A C LD C,D 00E9 ED 78 C IN A,(C) ;THEN READ AND DISCARD THE CHARACTER 00EB 4B C LD C,E 00EC 3E 01 C LD A,1 00EE ED 79 C OUT (C),A ;RE-PROGRAM SIO CHANNEL TO GENERATE 00F0 3E 1C C LD A,00011100B ; INTERRUPTS ON RECIEVED DATA, 00F2 ED 79 C OUT (C),A ; PARITY DOES NOT AFFECT VECTOR 00F4 7E C LD A,(HL) 00F5 32 FF6C C LD (CONNUM),A ;STORE NUMBER OF CONSOLE DEVICE 00F8 21 F24B C LD HL,SIOOUT 00FB 22 F00D C LD (CONOUT+1),HL ;RE-DIRECT CONSOLE OUTPUT TO SIO 00FE 18 25 C JR SIGNON C ; C ; DIVIDE RATIO TABLE FOR CTC-DERRIVED BAUD RATES C ; 0100 80 C RATES: DEFB 128 ; 300 BAUD 0101 40 C DEFB 64 ; 600 BAUD 0102 20 C DEFB 32 ; 1200 BAUD 0103 10 C DEFB 16 ; 2400 BAUD 0104 08 C DEFB 8 ; 4800 BAUD 0105 04 C DEFB 4 ; 9600 BAUD 0106 02 C DEFB 2 ; 19200 BAUD 0107 02 C DEFB 2 ; 19200 BAUD C ; C ; 0108 C SIOATAB: 0108 89 C DEFB CTCB1 ;SIO CHANNEL A BAUDRATE CTC 0109 81 C DEFB SIOCPA ; CONTROL PORT 010A 80 C DEFB SIODPA ; DATA PORT 010B 01 C DEFB 1 ; CONSOLE# C ; 010C C SIOBTAB: 010C 88 C DEFB CTCB0 ;SIO CHANNEL B BAUDRATE CTC MACRO-80 3.4 01-Dec-80 PAGE 1-4 010D 83 C DEFB SIOCPB ; CONTROL PORT 010E 82 C DEFB SIODPB ; DATA PORT 010F 02 C DEFB 2 ; CONSOLE# C ; C ; C ; C ; DETERMINE KEYBOARD STROBE POLARITY AND PROGRAM INTERRUPTS C ; 0110 DB C4 C PARALL: IN A,(SENSE) 0112 A9 C XOR C 0113 CB 5F C BIT 3,A 0115 20 F9 C JR NZ,PARALL ;WAIT UNTIL STROBE GOES AWAY 0117 3E C7 C PARL3: LD A,11000111B ;PROGRAM CTCA0 FOR KBD INTERRUPT 0119 CB 59 C BIT 3,C 011B 20 02 C JR NZ,PARL4 ;DETERMINE SENSE OF KBD STROBE 011D CB E7 C SET 4,A 011F D3 84 C PARL4: OUT (CTCA0),A 0121 3E 01 C LD A,1 0123 D3 84 C OUT (CTCA0),A ;COUNT STROBES MODULO 1 0125 FB C SIGNON: EI 0126 CD 093C C CALL PNEXT 0129 0D 0A 0A C DEFB CR,LF,LF 012C 2E 2E 2E 20 C DEFB '... Bigboard_II System Monitor 7-July-82 ...' 0130 42 69 67 62 C 0134 6F 61 72 64 C 0138 5F 49 49 20 C 013C 53 79 73 74 C 0140 65 6D 20 4D C 0144 6F 6E 69 74 C 0148 6F 72 20 20 C 014C 37 2D 4A 75 C 0150 6C 79 2D 38 C 0154 32 20 2E 2E C 0158 2E C 0159 0D 0A 0A C DEFB CR,LF,LF 015C 04 C DEFB EOT 015D C3 0576 C JP PROMPT ;GO ENTER MONITOR C ; C ; C ; C ; DUMMY STACK FOR POWER-UP CRC CHECK C ; 0160 000C C DEFW INIT1 ;RETURN POINT FOR FIRST CRC CHECK 0162 C TSTSTK EQU $ C ; C ; C ; C ; COMPUTE CRC16 OVER CONTENTS OF ROM TO VERIFY ROM INTEGRITY C ; 0162 21 FFFF C CRCGEN: LD HL,-1 ;SET CRC16 ACCUMULATOR TO ALL ONES 0165 06 08 C CRCG1: LD B,8 ;PREPARE TO RUN ROM BYTE THRU CRC GEN 0167 08 C EX AF,AF' 0168 1A C LD A,(DE) 0169 4F C LD C,A 016A 79 C CRCG2: LD A,C 016B AC C XOR H ;XOR DATA BIT WITH MSB OF CRC MACRO-80 3.4 01-Dec-80 PAGE 1-5 016C 07 C RLCA 016D ED 6A C ADC HL,HL ;SHIFT RESULTING BIT LEFT INTO CRC 016F 0F C RRCA 0170 30 08 C JR NC,CRCG3 ;JUMP IF BIT WAS A ZERO 0172 7C C LD A,H 0173 EE 10 C XOR 00010000B ;ELSE XOR CRC WITH POLY COEFFICIENTS 0175 67 C LD H,A 0176 7D C LD A,L 0177 EE 20 C XOR 00100000B 0179 6F C LD L,A 017A CB 11 C CRCG3: RL C ;ADVANCE TO NEXT DATA BIT 017C 10 EC C DJNZ CRCG2 017E 08 C EX AF,AF' 017F 13 C INC DE 0180 BA C CP D ;TEST FOR ENDING PAGE NUMBER 0181 20 E2 C JR NZ,CRCG1 0183 7C C LD A,H 0184 B5 C OR L ;HL SHOULD=0 IF VALID CRC16 0185 C9 C RET C ; C ; C ; C ; 0186 C INITCRT: 0186 06 10 C LD B,16 ;WRITE TO 16 REGISTERS IN 6845 0188 0E 00 C LD C,0 018A 79 C INCRT1: LD A,C 018B D3 DC C OUT (CRTADD),A ;OUTPUT REGISTER NUMBER TO CRTC 018D 7E C LD A,(HL) 018E 23 C INC HL 018F D3 DD C OUT (CRTDAT),A ;OUTPUT DATA TO SELECTED REGISTER 0191 0C C INC C 0192 10 F6 C DJNZ INCRT1 0194 C9 C RET C ; C ; C ; C ; C PAGE MACRO-80 3.4 01-Dec-80 PAGE 1-6 C C ; C ; C ; ... INPUT/OUTPUT PORT EQUATES AND INITIALIZATION TABLES ... C ; C ; 0080 C SIO EQU 80H ;DUAL SERIAL I/O 0084 C CTCA EQU 84H ;CTC FOR KEYBOARD/FDC/SIO INTERRUPTS 0088 C CTCB EQU 88H ;CTC FOR BAUDRATES AND TIMERS 008C C DMA EQU 8CH ;Z80 DMA CONTROLLER 00C0 C PORT3 EQU 0C0H ;MEMORY CONTROL 74LS259 00C4 C SENSE EQU 0C4H ;SENSE INPUTS 74LS244 00C8 C PORT0 EQU 0C8H ;MISC CONTROL BITS 74LS259 00CC C SELMUX EQU 0CCH ;DRIVE SELECT/DMA MUX 74LS273 00D0 C KBD EQU 0D0H ;KEYBOARD INPUTS 74LS373 00D4 C WD179X EQU 0D4H ;WESTERN DIGITAL DISK CONTROLLER 00D8 C GENPIO EQU 0D8H ;GENERAL PURPOSE PARALLEL PORTS 00DC C CRTC EQU 0DCH ;6845 CRT CONTROLLER C ; C ; 0080 C SIODPA EQU SIO+0 ;SIO DATA PORT A 0081 C SIOCPA EQU SIO+1 ;SIO CONTROL/STATUS PORT A 0082 C SIODPB EQU SIO+2 ;SIO DATA PORT B 0083 C SIOCPB EQU SIO+3 ;SIO CONTROL/STATUS PORT B C ; C ; 0084 C CTCA0 EQU CTCA ;CTC A CHANNEL 0 (KEYBOARD STROBE) 0085 C CTCA1 EQU CTCA+1 ;CTC A CHANNEL 1 (INDEX PULSE COUNT) 0086 C CTCA2 EQU CTCA+2 ;CTC A CHANNEL 2 (SIO A SYNC INTERRUPT) 0087 C CTCA3 EQU CTCA+3 ;CTC A CHANNEL 3 (VSYNC INTERRUPT) C ; C ; 0088 C CTCB0 EQU CTCB ;CTC B CHANNEL 0 (SIO A BAUDRATE) 0089 C CTCB1 EQU CTCB+1 ;CTC B CHANNEL 1 (SIO B BAUDRATE) 008A C CTCB2 EQU CTCB+2 ;CTC B CHANNEL 2 (1 MILLISECOND TIMER) 008B C CTCB3 EQU CTCB+3 ;CTC B CHANNEL 3 (CLOCK INTERRUPT) C ; C ; C ; 0008 C ON EQU 00001000B 0000 C OFF EQU 00000000B C ; C ; BIT ASSIGNMENTS FOR LATCH 'U14' C ; 0007 C BUZZER EQU 7 0006 C MOTOR EQU 6 0005 C HLDTIM EQU 5 0004 C DDEN EQU 4 0003 C SMC2 EQU 3 0002 C SMC1 EQU 2 0001 C SIDSEL EQU 1 0000 C DYSTAT EQU 0 C ; C ; C ; BIT ASSIGNMENTS FOR LATCH 'U41' MACRO-80 3.4 01-Dec-80 PAGE 1-7 C ; 0007 C ATTEN EQU 7 ;ATTRIBUTE ENABLE PIN 0006 C FDCRST EQU 6 ;DISK CONTROLLER RESET 0005 C STDBB EQU 5 ;STD/BETTERBOARD BANK SELECT 0004 C VPP EQU 4 ;PROM VPP ENABLE 0003 C PGM EQU 3 ;PROM PGM ENABLE 0002 C OEVPP EQU 2 ;PROM OE/VPP SWITCH 0001 C DECODE EQU 1 ;BYTEWIDE MEMORY DECODE CONTROL 0000 C OUTEN EQU 0 ;BYTEWIDE MEMORY /OE CONTROL C ; C ; C ; C ; 0195 C IOTAB EQU $ ;I/O INITIALIZATION TABLE C ; C ; INITIALIZATION FOR TTL BIT LATCHES C ; 0195 02 C0 C DEFB 2,PORT3 0197 0F C DEFB ATTEN+ON ;ATTRIBUTE ENABLE ON 0198 0E C DEFB FDCRST+ON ;179X RESET PIN HIGH C 0199 01 CC C DEFB 1,SELMUX 019B 0A C DEFB 00001010B ;ALL DRIVES OFF, /TEST=1, DRQ->RDY C ; C ; C ; DO SOFTWARE RESET OF DMA AS RECOMENDED BY ZILOG C ; 019C 06 8C C DEFB 6,DMA 019E C3 C DEFB 11000011B 019F C3 C DEFB 11000011B 01A0 C3 C DEFB 11000011B 01A1 C3 C DEFB 11000011B 01A2 C3 C DEFB 11000011B 01A3 C3 C DEFB 11000011B C ; C ; C ; PROGRAM CTC A AND B FOR VARIOUS INTERRUPT C ; AND TIMING FUNCTIONS C ; 01A4 01 84 C DEFB 1,CTCA0 01A6 10 C DEFB CTCAV ;BASE INTERRUPT VECTOR FOR CTC A C 01A7 02 85 C DEFB 2,CTCA1 01A9 47 C DEFB 01000111B ;PUT CTC1 IN COUNTER MODE 01AA 00 C DEFB 0 ;COUNT INDEX PULSES MODULO-256 C ; C ; 01AB 01 88 C DEFB 1,CTCB0 01AD 18 C DEFB CTCBV ;BASE INTERRUPT VECTOR FOR CTC B C 01AE 02 88 C DEFB 2,CTCB0 01B0 47 C DEFB 01000111B ;PUT CTC0 IN COUNTER MODE 01B1 80 C DEFB 128 ;DIVIDE BY 128 GIVES 300 BAUD FOR SIO B C 01B2 02 89 C DEFB 2,CTCB1 01B4 47 C DEFB 01000111B ;PUT CTC1 IN COUNTER MODE MACRO-80 3.4 01-Dec-80 PAGE 1-8 01B5 80 C DEFB 128 ;DIVIDE BY 128 GIVES 300 BAUD FOR SIO A C 01B6 02 8A C DEFB 2,CTCB2 01B8 07 C DEFB 00000111B ;PUT CTC2 IN TIMER MODE 01B9 FA C DEFB 250 ;PULSE EVERY 250*4 MICROSECONDS C 01BA 02 8B C DEFB 2,CTCB3 01BC C7 C DEFB 11000111B ;PUT CTC3 IN COUNTER MODE 01BD FA C DEFB 250 ;INTERRUPT EVERY 250 MILLISECONDS C ; C ; C ; INITIALIZE SIO CHANNEL A AND B FOR ASYNCHRONOUS SERIAL C ; INTERFACE TO PRINTER OR TERMINAL C ; 01BE 0A 83 C DEFB 10,SIOCPB 01C0 04 C DEFB 4 ;SELECT REGISTER #4 01C1 45 C DEFB 01000101B ;16X CLOCK, 1 STOP BIT 01C2 01 C DEFB 1 ;SELECT REGISTER #1 01C3 04 C DEFB 00000100B ;STATUS AFFECTS VECTOR 01C4 03 C DEFB 3 ;SELECT REGISTER #3 01C5 41 C DEFB 01000001B ;7 BITS/RX CHARACTER 01C6 05 C DEFB 5 ;SELECT REGISTER #5 01C7 AA C DEFB 10101010B ;7 BITS/TX CHARACTER 01C8 02 C DEFB 2 ;SELECT REGISTER #2 01C9 00 C DEFB SIOVEC ;BASE SIO INTERRUPT VECTOR C 01CA 08 81 C DEFB 8,SIOCPA 01CC 04 C DEFB 4 ;SELECT REGISTER #4 01CD 45 C DEFB 01000101B ;16X CLOCK, 1 STOP BIT 01CE 01 C DEFB 1 ;SELECT REGISTER #1 01CF 00 C DEFB 00000000B ;INTERRUPTS OFF 01D0 03 C DEFB 3 ;SELECT REGISTER #3 01D1 41 C DEFB 01000001B ;7 BITS/RX CHARACTER 01D2 05 C DEFB 5 ;SELECT REGISTER #5 01D3 AA C DEFB 10101010B ;7 BITS/TX CHARACTER C ; C ; 01D4 FF C DEFB -1 ;END-OF-TABLE C ; C ; C ; C PAGE MACRO-80 3.4 01-Dec-80 PAGE 1-9 C C ; C ; C ; ... EQUATES AND INITIALIZATION TABLES FOR 6845 CRTC ... C ; C ; 6000 C CHRMEM EQU 6000H ;2K BYTE CHARACTER MEMORY 7000 C ATTMEM EQU 7000H ;2K BYTE ATTRIBUTE MEMORY C ; 00DC C CRTADD EQU CRTC ;6845 ADDRESS REGISTER 00DD C CRTDAT EQU CRTC+1 ;6845 DATA REGISTER C 0040 C BLINK EQU 01000000B ;BLINK ATTRIBUTE BIT 0010 C REVERSE EQU 00010000B ;REVERSE VIDEO 0008 C UNDLINE EQU 00001000B ;UNDERLINE 0004 C STRIKE EQU 00000100B ;STRIKETHRU C ; C ; INITIALIZATION FOR 80*24 DISPLAY USING 11 MHZ CLOCK C ; AND 7 DOT BY 10 RASTER CHARACTER CELL SIZE C ; 01D5 63 C M1TAB: DEFB 99 ;HORIZ TOTAL-1 01D6 50 C DEFB 80 ;HORIZ DISPLAYED 01D7 52 C DEFB 82 ;HORIZ SYNC POSITION-1 01D8 28 C DEFB 28H ;VERT/HORIZ SYNC WIDTH 01D9 19 C DEFB 25 ;VERT TOTAL-1 01DA 02 C DEFB 2 ;VERT TOTAL ADJUST 01DB 18 C DEFB 24 ;VERT DISPLAYED 01DC 19 C DEFB 25 ;VERT SYNC POSITION-1 01DD 00 C DEFB 00000000B ;INTERLACE AND SKEW 01DE 09 C DEFB 9 ;MAX RASTER ADDRESS 01DF 20 C DEFB 00100000B ;CURSOR START RASTER 01E0 00 C DEFB 0 ;CURSOR END RASTER 01E1 00 C DEFB 0 ;START ADDRESS MSB 01E2 00 C DEFB 0 ;START ADDRESS LSB 01E3 00 C DEFB 0 ;CURSOR ADDRESS MSB 01E4 00 C DEFB 0 ;CURSOR ADDRESS LSB C ; C ; C ; INITIALIZATION FOR 80*24 DISPLAY USING 16 Mhz CLOCK C ; AND 9 DOT BY 12 RASTER CHARACTER CELL SIZE C ; 01E5 60 C M2TAB: DEFB 96 ;HORIZ TOTAL-1 01E6 50 C DEFB 80 ;HORIZ DISPLAYED 01E7 47 C DEFB 71 ;HORIZ SYNC POSITION-1 01E8 28 C DEFB 28H ;VERT/HORIZ SYNC WIDTH 01E9 19 C DEFB 25 ;VERT TOTAL-1 01EA 10 C DEFB 16 ;VERT TOTAL ADJUST 01EB 18 C DEFB 24 ;VERT DISPLAYED 01EC 1A C DEFB 26 ;VERT SYNC POSITION-1 01ED 02 C DEFB 00000010B ;INTERLACE AND SKEW 01EE 0B C DEFB 11 ;MAX RASTER ADDRESS 01EF 20 C DEFB 00100000B ;CURSOR START RASTER 01F0 00 C DEFB 0 ;CURSOR END RASTER 01F1 00 C DEFB 0 ;START ADDRESS MSB 01F2 00 C DEFB 0 ;START ADDRESS LSB MACRO-80 3.4 01-Dec-80 PAGE 1-10 01F3 00 C DEFB 0 ;CURSOR ADDRESS MSB 01F4 00 C DEFB 0 ;CURSOR ADDRESS LSB C ; C ; C ; C ; C INCLUDE CRTOUT.MAC ;MEMORY-MAPPED CRT OUTPUT DRIVER C ;******************************************************** C ;* * C ;* CRT DRIVER FOR 6845 CRT CONTROLLER AND SMC * C ;* 8002 CHARACTER GENERATOR/ATTRIBUTES CHIP * C ;* * C ;******************************************************** C ; C ; C ; OUTPUT CHATACTER PASSED IN C TO VIDEO DISPLAY C ; 01F5 C CRTOUT: 01F5 2A FFAE C LD HL,(ESCVEC) 01F8 7C C LD A,H 01F9 B5 C OR L ;TEST IF IN AN ESCAPE SEQUENCE 01FA 20 0B C JR NZ,CRT2 ;JUMP IF 'ESCVEC' IS NON-ZERO C 01FC CB B9 C RES 7,C ;CONFINE CHARACTERS TO 0..127 RANGE 01FE 79 C LD A,C 01FF FE 20 C CP ' ' 0201 38 0C C JR C,CRT3 ;JUMP IF A CONTROL CHARACTER C 0203 CD 0241 C CALL DISPLAY 0206 C9 C RET C ; C ; 0207 11 0000 C CRT2: LD DE,0 020A ED 53 FFAE C LD (ESCVEC),DE ;UNCONDITIONALLY CLEAR 'ESCVEC' 020E E9 C JP (HL) ;THEN GO TO ROUTINE @HL C ; C ; C ; 020F 21 021A C CRT3: LD HL,CTLTAB 0212 01 000D C LD BC,CTLSIZ/3 0215 CD 08AC C CALL SEARCH ;SEARCH FOR CONTROL CHARACTER IN TABLE 0218 C0 C RET NZ 0219 E9 C JP (HL) C ; C ; 021A 07 C CTLTAB: DEFB 'G'-64 021B 08 C DEFB 'H'-64 021C 09 C DEFB 'I'-64 021D 0A C DEFB 'J'-64 021E 0B C DEFB 'K'-64 021F 0C C DEFB 'L'-64 0220 0D C DEFB 'M'-64 0221 11 C DEFB 'Q'-64 0222 18 C DEFB 'X'-64 0223 1A C DEFB 'Z'-64 0224 1B C DEFB '['-64 MACRO-80 3.4 01-Dec-80 PAGE 1-11 0225 1E C DEFB '^'-64 0226 1F C DEFB '_'-64 C 0227 0291 C DEFW STUFF ;CTL-_ ... DISPLAY CONTROL CHARACTERS 0229 03C9 C DEFW HOMEUP ;CTL-^ ... CURSOR HOME 022B 028A C DEFW ESCAPE ;CTL-[ ... ESCAPE 022D 03AB C DEFW CLRALL ;CTL-Z ... CLEAR SCREEN 022F 0392 C DEFW CLREOL ;CTL-X ... CLEAR TO END OF LINE 0231 0383 C DEFW CLREOS ;CTL-Q ... CLEAR TO END OF SCREEN 0233 0355 C DEFW RETURN ;CTL-M ... CARRIAGE RETURN 0235 02AB C DEFW RIGHT ;CTL-L ... CURSOR RIGHT 0237 0313 C DEFW UPLINE ;CTL-K ... INVERSE LINEFEED/CURSOR UP 0239 0321 C DEFW DNLINE ;CTL-J ... LINEFEED/CURSOR DOWN 023B 0298 C DEFW HTAB ;CTL-I ... HORIZONTAL TAB 023D 02A6 C DEFW LEFT ;CTL-H ... BACKSPACE/CURSOR LEFT 023F 0279 C DEFW BELL ;CTL-G ... AUDIBLE BELL 0027 C CTLSIZ EQU $-CTLTAB C ; C ; C ; C ; C ; 0241 C DISPLAY: 0241 2A FFB7 C LD HL,(CURSOR) 0244 11 6000 C LD DE,CHRMEM 0247 19 C ADD HL,DE ;GET POINTER TO CHARACTER IN DISPLAY 0248 EB C EX DE,HL 0249 21 1000 C LD HL,4096 024C 19 C ADD HL,DE ;GET POINTER TO MATCHING ATTRIBUTE 024D EB C EX DE,HL 024E 3A FFAC C LD A,(ATTRIB) 0251 71 C LD (HL),C ;OUTPUT CHARACTER AND ATTRIBUTE 0252 12 C LD (DE),A 0253 3A FFAA C LD A,(COL) 0256 3C C INC A ;INCREMENT COLUMN NUMBER 0257 FE 50 C CP 80 0259 30 10 C JR NC,DISP2 ;CHECK FOR AUTO NEWLINE IF AT END C 025B 32 FFAA C LD (COL),A ;ELSE STORE UPDATED COLUMN# 025E 2A FFB7 C LD HL,(CURSOR) 0261 23 C INC HL 0262 CB 9C C RES 3,H ;BUMP CURSOR POINTER MODULO 2048 0264 22 FFB7 C LD (CURSOR),HL 0267 CD 02DF C CALL SETCSR ;MARK NEXT CURSOR POSITION 026A C9 C RET C ; 026B 21 FFBB C DISP2: LD HL,CRTFLG 026E CB 46 C BIT AUTONL,(HL) 0270 C8 C RET Z ;EXIT IF AUTO NEWLINE DISABLED C 0271 AF C XOR A 0272 32 FFAA C LD (COL),A ;RESET COLUMN NUMBER AND DO LINEFEED 0275 CD 0321 C CALL DNLINE 0278 C9 C RET C ; C ; MACRO-80 3.4 01-Dec-80 PAGE 1-12 C ; C ; C ; 0279 3E 0F C BELL: LD A,BUZZER+ON 027B D3 C8 C OUT (PORT0),A 027D 01 00C8 C LD BC,200 0280 10 FE C BELL2: DJNZ BELL2 ;DELAY ABOUT 1 MILLISECOND 0282 0D C DEC C 0283 20 FB C JR NZ,BELL2 ;REPEAT 200 TIMES 0285 3E 07 C LD A,BUZZER+OFF 0287 D3 C8 C OUT (PORT0),A 0289 C9 C RET C ; C ; C ; C ; C ; C ; 028A 21 04AE C ESCAPE: LD HL,ESCSEQ ;PROCESS SECOND CHARACTER OF ESCAPE 028D 22 FFAE C LD (ESCVEC),HL ; SEQUENCE NEXT TIME 0290 C9 C RET C ; C ; 0291 21 0241 C STUFF: LD HL,DISPLA 0294 22 FFAE C LD (ESCVEC),HL ;SET LEAD-IN SEQUENCE STATE 0297 C9 C RET ; FOR CONTROL CHAR OUTPUT MODE C ; C ; C ; 0298 3A FFAA C HTAB: LD A,(COL) 029B E6 07 C AND 00000111B 029D 4F C LD C,A 029E 3E 08 C LD A,8 02A0 91 C SUB C ;COMPUTE DISTANCE TO NEXT TAB STOP 02A1 57 C LD D,A 02A2 1E 00 C LD E,0 02A4 18 12 C JR CSRMOV ;ADVANCE COLUMN# AND CURSOR TO NEXT TAB C ; 02A6 11 FF00 C LEFT: LD DE,0FF00H ;DECREMENT COLUMN# 02A9 18 0D C JR CSRMOV C ; 02AB 11 0100 C RIGHT: LD DE,0100H ;INCREMENT COLUMN# 02AE 18 08 C JR CSRMOV C ; 02B0 11 00FF C UP: LD DE,00FFH ;DECREMENT ROW# 02B3 18 03 C JR CSRMOV C ; 02B5 11 0001 C DOWN: LD DE,0001H ;INCREMENT ROW# 02B8 2A FFA9 C CSRMOV: LD HL,(RC) ;GET CURRENT ROW# IN L AND COL# IN H 02BB 7D C LD A,L 02BC 83 C ADD A,E ;ADD -1,0,OR 1 TO ROW# 02BD FE 18 C CP 24 02BF D0 C RET NC ;EXIT IF ROW OUT OF RANGE 02C0 6F C LD L,A 02C1 7C C LD A,H 02C2 82 C ADD A,D ;ADD -1,0 OR 1 TO COLUMN# MACRO-80 3.4 01-Dec-80 PAGE 1-13 02C3 FE 50 C CP 80 02C5 D0 C RET NC ;EXIT IF COLUMN OUT OF BOUNDS 02C6 67 C LD H,A C 02C7 22 FFA9 C GOTOXY: LD (RC),HL ;STORE NEW ROW/COLUMN VALUES 02CA 06 00 C LD B,0 02CC 4C C LD C,H ;PUT COLUMN# INTO BC AS 16 BITS 02CD 26 00 C LD H,0 02CF CD 0309 C CALL MULT80 ;MULTILPY 16 BIT ROW# BY 80 02D2 09 C ADD HL,BC ;HL=(ROW*80)+COL 02D3 ED 5B FFB2 C LD DE,(START) 02D7 19 C ADD HL,DE ;ADD CRTC START ADDRESS TO POINTER 02D8 7C C LD A,H 02D9 E6 07 C AND 00000111B ;MASK OFF FOR MODULO 2048 ROLL-AROUND 02DB 67 C LD H,A 02DC 22 FFB7 C LD (CURSOR),HL ;STORE NEW RELATIVE CURSOR POINTER C 02DF 3A FFB6 C SETCSR: LD A,(MOVECS) 02E2 B7 C OR A ;TEST IF NEW-CURSOR FLAG HAS BEEN SET 02E3 C0 C RET NZ ;EXIT NOW IF SO C 02E4 3E D7 C LD A,11010111B ;ELSE ENABLE VSYNC INTERRUPT FROM CTC 02E6 D3 87 C OUT (CTCA3),A 02E8 3E 01 C LD A,1 02EA D3 87 C OUT (CTCA3),A 02EC 32 FFB6 C LD (MOVECS),A ;SET FLAG FOR INTERRUPT ROUTINE 02EF C9 C RET C ; C ; C ; 02F0 C ZAPCSR: 02F0 F3 C DI 02F1 3E 03 C LD A,00000011B 02F3 D3 87 C OUT (CTCA3),A ;DISABLE VSYNC INTERRUPT FROM CTCA3 02F5 FB C EI 02F6 AF C XOR A 02F7 32 FFB6 C LD (MOVECS),A ;RESET CURSOR-MOVE FLAG 02FA 2A FFB7 C LD HL,(CURSOR) 02FD 11 7000 C LD DE,ATTMEM 0300 19 C ADD HL,DE ;POINT TO CURRENT CURSOR ATTRIBUTE BYTE 0301 7E C LD A,(HL) 0302 CB 7F C BIT 7,A ;TEST IF CURSOR HAS BEEN TURNED ON YET 0304 C8 C RET Z ; AND EXIT IF NOT C 0305 EE 90 C XOR 10010000B ;ELSE RESET BIT 7 AND INVERT BIT 4 OF 0307 77 C LD (HL),A ; CURSOR BYTE IF VSYNC HAS CHANGED THEM 0308 C9 C RET C ; C ; C ; 0309 C MULT80: 0309 29 C ADD HL,HL 030A 29 C ADD HL,HL 030B 29 C ADD HL,HL 030C 29 C ADD HL,HL 030D 54 C LD D,H MACRO-80 3.4 01-Dec-80 PAGE 1-14 030E 5D C LD E,L ;DE=ROW*16 030F 29 C ADD HL,HL 0310 29 C ADD HL,HL ;HL=ROW*64 0311 19 C ADD HL,DE ;HL=(ROW*64)+(ROW*16) 0312 C9 C RET C ; C ; C ; 0313 C UPLINE: 0313 3A FFA9 C LD A,(ROW) 0316 B7 C OR A 0317 20 97 C JR NZ,UP ;DO CURSOR-UP IF NOT ON TOP LINE 0319 11 FFB0 C LD DE,-80 ;ELSE SCROLL SCREEN DOWN 031C 01 0000 C LD BC,0 031F 18 0D C JR LFEED C ; C ; 0321 C DNLINE: 0321 3A FFA9 C LD A,(ROW) 0324 FE 17 C CP 23 0326 20 8D C JR NZ,DOWN ;DO CURSOR-DOWN IF NOT ON BOTTOM ROW 0328 11 0050 C LD DE,80 ;ELSE SCROLL SCREEN UP 032B 01 0730 C LD BC,23*80 032E 21 FFBB C LFEED: LD HL,CRTFLG 0331 CB 4E C BIT NOSCRL,(HL) 0333 C0 C RET NZ ;EXIT IF SCROLL IS DISABLED C 0334 ED 43 FFB4 C LD (NEWLIN),BC ;STORE RELATIVE ADDRESS OF NEW LINE 0338 2A FFB2 C LD HL,(START) 033B 19 C ADD HL,DE ;ADD +80/-80 TO 6845 START ADDRESS REG 033C 7C C LD A,H 033D E6 07 C AND 00000111B ;DO MODULO 2048 ROLL-AROUND 033F 67 C LD H,A 0340 22 FFB2 C LD (START),HL ;STORE NEW STARTING ADDRESS 0343 3E 01 C LD A,1 0345 32 FFB1 C LD (SCROLL),A ;SET SCROLL-FLAG FOR INTERRUPT 0348 2A FFA9 C LD HL,(RC) 034B CD 02C7 C CALL GOTOXY ;COMPUTE NEW CURSOR AND ARM INTERRUPT 034E 3A FFB1 C LFEED2: LD A,(SCROLL) 0351 B7 C OR A 0352 20 FA C JR NZ,LFEED2 ;LOOP UNTIL VSYNC INTERRUPT SERVICED 0354 C9 C RET C ; C ; C ; C ; 0355 2A FFA9 C RETURN: LD HL,(RC) 0358 26 00 C LD H,0 035A CD 02C7 C CALL GOTOXY ;RESET COLUMN# TO ZERO 035D C9 C RET C ; C ; C ; 035E C CLRLINE: 035E 11 6000 C LD DE,CHRMEM 0361 19 C ADD HL,DE MACRO-80 3.4 01-Dec-80 PAGE 1-15 0362 EB C EX DE,HL 0363 21 1000 C LD HL,4096 0366 19 C ADD HL,DE 0367 EB C EX DE,HL 0368 3A FFAB C LD A,(BLANK) 036B 77 C LD (HL),A ;STORE A BLANK AT START OF CHAR LINE 036C 3A FFAC C LD A,(ATTRIB) 036F 12 C LD (DE),A ;STORE ATTRIBUTE AT START OF ATTR LINE 0370 0B C DEC BC 0371 78 C LD A,B 0372 B1 C OR C ;DECREMENT BYTECOUNT AND TEST IF=0 0373 C8 C RET Z ;EXIT IF DONE ALERADY C 0374 D5 C PUSH DE ;ELSE SAVE LINE POINTER AND BYTECOUNT 0375 C5 C PUSH BC 0376 54 C LD D,H 0377 5D C LD E,L 0378 13 C INC DE 0379 ED B0 C LDIR ;FILL CHARACTER LINE WITH SPACES 037B C1 C POP BC 037C E1 C POP HL ;RESTORE POINTER AND BYTECOUNT 037D 54 C LD D,H 037E 5D C LD E,L 037F 13 C INC DE 0380 ED B0 C LDIR ;FILL ATTRIBUTE LINE WITH ATTRIB BYTE 0382 C9 C RET C ; C ; C ; 0383 3E 17 C CLREOS: LD A,23 0385 21 FFA9 C LD HL,ROW 0388 96 C SUB (HL) ;COMPUTE NUMBER OF ROWS TO SCREEN-END 0389 26 00 C LD H,0 038B 6F C LD L,A 038C CD 0309 C CALL MULT80 ;MULTIPLY BY 80 GIVING RESULT IN HL 038F EB C EX DE,HL 0390 18 03 C JR CLR2 C ; 0392 11 0000 C CLREOL: LD DE,0 0395 3E 50 C CLR2: LD A,80 0397 21 FFAA C LD HL,COL 039A 96 C SUB (HL) ;COMPUTE NUMBER OF COLUMNS TO LINE-END 039B 26 00 C LD H,0 039D 6F C LD L,A 039E 19 C ADD HL,DE ;SUM IS TOTAL CHARACTERS TO ERASE 039F 44 C LD B,H 03A0 4D C LD C,L 03A1 2A FFB7 C LD HL,(CURSOR) 03A4 CD 035E C CALL CLRLINE ;GO FILL DISPLAY WITH SPACES/ATTRIBUTES 03A7 CD 02DF C CALL SETCSR ;PUT CURSOR BACK IN ORIGINAL SPOT 03AA C9 C RET C ; C ; C ; 03AB 21 6000 C CLRALL: LD HL,CHRMEM 03AE 11 6001 C LD DE,CHRMEM+1 MACRO-80 3.4 01-Dec-80 PAGE 1-16 03B1 01 07FF C LD BC,2047 03B4 3A FFAB C LD A,(BLANK) 03B7 77 C LD (HL),A 03B8 ED B0 C LDIR ;FILL CHARACTER MEMORY WITH SPACES 03BA 21 7000 C LD HL,ATTMEM 03BD 11 7001 C LD DE,ATTMEM+1 03C0 01 07FF C LD BC,2047 03C3 3A FFAC C LD A,(ATTRIB) 03C6 77 C LD (HL),A 03C7 ED B0 C LDIR ;FILL ATTRIBUTE MEMORY WITH NULL BYTES C 03C9 21 0000 C HOMEUP: LD HL,0 03CC CD 02C7 C CALL GOTOXY ;RESET ROW/COLUMN NUMBERS TO ZERO 03CF C9 C RET C ; C ; C ; C ; C ; 03D0 C COMPRESS: 03D0 C5 C PUSH BC 03D1 D5 C PUSH DE 03D2 E5 C PUSH HL 03D3 C5 C PUSH BC 03D4 01 6000 C LD BC,CHRMEM 03D7 09 C ADD HL,BC 03D8 EB C EX DE,HL 03D9 09 C ADD HL,BC 03DA EB C EX DE,HL 03DB C1 C POP BC 03DC ED B0 C LDIR ;COMPRESS CONTENTS OF CHARACTER MEMORY 03DE CD 02F0 C CALL ZAPCSR 03E1 E1 C POP HL 03E2 D1 C POP DE 03E3 01 7000 C LD BC,ATTMEM 03E6 09 C ADD HL,BC 03E7 EB C EX DE,HL 03E8 09 C ADD HL,BC 03E9 EB C EX DE,HL 03EA C1 C POP BC 03EB ED B0 C LDIR ;COMPRESS CONTENTS OF ATTRIBUTE MEMORY 03ED C9 C RET C ; C ; C ; C ; 03EE C EXPAND: 03EE C5 C PUSH BC 03EF D5 C PUSH DE 03F0 E5 C PUSH HL 03F1 C5 C PUSH BC 03F2 01 6000 C LD BC,CHRMEM 03F5 09 C ADD HL,BC 03F6 EB C EX DE,HL 03F7 09 C ADD HL,BC 03F8 EB C EX DE,HL MACRO-80 3.4 01-Dec-80 PAGE 1-17 03F9 C1 C POP BC 03FA ED B8 C LDDR ;EXPAND CONTENTS OF CHARACTER MEMORY 03FC CD 02F0 C CALL ZAPCSR 03FF E1 C POP HL 0400 D1 C POP DE 0401 01 7000 C LD BC,ATTMEM 0404 09 C ADD HL,BC 0405 EB C EX DE,HL 0406 09 C ADD HL,BC 0407 EB C EX DE,HL 0408 C1 C POP BC 0409 ED B8 C LDDR ;EXPAND CONTENTS OF ATTRIBUTE MEMORY 040B C9 C RET C ; C ; C ; 040C C DELLINE: 040C CD 0355 C CALL RETURN ;DO CARRIAGE RETURN 040F 3E 17 C LD A,23 0411 21 FFA9 C LD HL,ROW 0414 96 C SUB (HL) ;COMPUTE # OF ROWS TO END OF SCREEN 0415 CA 0392 C JP Z,CLREOL C 0418 26 00 C LD H,0 041A 6F C LD L,A 041B CD 0309 C CALL MULT80 ;MULTIPLY BY 80 041E 44 C LD B,H 041F 4D C LD C,L ;RESULT IS BYTECOUNT FOR BLOCK MOVE 0420 ED 5B FFB7 C LD DE,(CURSOR) 0424 21 0050 C LD HL,80 0427 19 C ADD HL,DE 0428 CD 03D0 C CALL COMPRESS ;COMPRESS SCREEN TO DELETE LINE 042B 2A FFB2 C LD HL,(START) 042E 11 0730 C LD DE,23*80 0431 19 C ADD HL,DE ;GET RELATIVE START OF LAST LINE 0432 7C C LD A,H 0433 E6 07 C AND 00000111B 0435 67 C LD H,A 0436 01 0050 C LD BC,80 0439 CD 035E C CALL CLRLINE ;CLEAR BOTTOM LINE 043C CD 02DF C CALL SETCSR ;RE-DISPLAY THE CURSOR 043F C9 C RET C ; C ; C ; 0440 C INSLINE: 0440 CD 0355 C CALL RETURN ;DO CARRIAGE RETURN 0443 3E 17 C LD A,23 0445 21 FFA9 C LD HL,ROW 0448 96 C SUB (HL) ;COMPUTE # OF ROWS TO END OF SCREEN 0449 CA 0392 C JP Z,CLREOL C 044C 26 00 C LD H,0 044E 6F C LD L,A 044F CD 0309 C CALL MULT80 ;MULTIPLY BY 80 0452 44 C LD B,H MACRO-80 3.4 01-Dec-80 PAGE 1-18 0453 4D C LD C,L ;RESULT IS BYTECOUNT FOR BLOCK MOVE 0454 2A FFB7 C LD HL,(CURSOR) 0457 09 C ADD HL,BC 0458 2B C DEC HL 0459 EB C EX DE,HL 045A 21 0050 C LD HL,80 045D 19 C ADD HL,DE 045E EB C EX DE,HL 045F CD 03EE C CALL EXPAND ;EXPAND SCREEN TO MAKE NEW LINE 0462 CD 0392 C CALL CLREOL ;CLEAR NEW LINE 0465 C9 C RET C ; C ; C ; 0466 C DELCHAR: 0466 21 FFAA C LD HL,COL 0469 3E 4F C LD A,79 046B 96 C SUB (HL) ;COMPUTE NUMBER OF COLUMNS LEFT IN LINE 046C CA 0392 C JP Z,CLREOL C 046F 06 00 C LD B,0 0471 4F C LD C,A ;USE RESULT FOR LDIR BYTECOUNT 0472 C5 C PUSH BC 0473 2A FFB7 C LD HL,(CURSOR) 0476 54 C LD D,H ;DE POINTS TO CHAR AT CURSOR LOCATION 0477 5D C LD E,L 0478 23 C INC HL ;HL POINTS ONE BYTE AHEAD OF THAT 0479 CD 03D0 C CALL COMPRESS 047C C1 C POP BC 047D 2A FFB7 C LD HL,(CURSOR) 0480 09 C ADD HL,BC 0481 01 0001 C LD BC,1 0484 CD 035E C CALL CLRLINE ;PUT BLANK AT END OF LINE 0487 CD 02DF C CALL SETCSR ;REPLACE DESTROYED CURSOR 048A C9 C RET C ; C ; C ; C ; 048B C INSCHAR: 048B 21 FFAA C LD HL,COL 048E 3E 4F C LD A,79 0490 96 C SUB (HL) ;COMPUTE NUMBER OF COLUMNS LEFT IN LINE 0491 CA 0392 C JP Z,CLREOL C 0494 06 00 C LD B,0 0496 4F C LD C,A ;USE RESULT FOR LDDR BYTECOUNT 0497 2A FFB7 C LD HL,(CURSOR) 049A 09 C ADD HL,BC 049B 54 C LD D,H ;DE POINTS TO CHAR AT END OF LINE 049C 5D C LD E,L 049D 2B C DEC HL ;HL POINTS ONE BYTE BEFORE THAT 049E CD 03EE C CALL EXPAND 04A1 2A FFB7 C LD HL,(CURSOR) 04A4 01 0001 C LD BC,1 04A7 CD 035E C CALL CLRLINE ;PUT A BLANK AT CURSOR LOCATION MACRO-80 3.4 01-Dec-80 PAGE 1-19 04AA CD 02DF C CALL SETCSR ;REPLACE CURSOR 04AD C9 C RET C ; C ; C ; 04AE 79 C ESCSEQ: LD A,C ;PUT LEAD-IN CHARACTER IN ACC 04AF 21 04BA C LD HL,ESCTAB 04B2 01 000E C LD BC,ESCSIZ/3 04B5 CD 08AC C CALL SEARCH ;SEARCH FOR SECOND CHAR OF ESCAPE SEQ 04B8 C0 C RET NZ ; IN TABLE AND EXIT IF NO MATCH C 04B9 E9 C JP (HL) ;GO TO LEAD-IN ROUTINE C ; C ; 04BA 3D C ESCTAB: DEFB '=' ;CURSOR ADDRESSING 04BB 51 C DEFB 'Q' ;INSERT CHARACTER 04BC 57 C DEFB 'W' ;DELETE CHARACTER 04BD 45 C DEFB 'E' ;INSERT LINE 04BE 52 C DEFB 'R' ;DELETE LINE 04BF 2A C DEFB '*' ;CLEAR SCREEN 04C0 3A C DEFB ':' ;CLEAR SCREEN 04C1 54 C DEFB 'T' ;CLEAR TO END OF LINE 04C2 74 C DEFB 't' ;CLEAR TO END OF LINE 04C3 59 C DEFB 'Y' ;CLEAR TO END OF SCREEN 04C4 79 C DEFB 'y' ;CLEAR TO END OF SCREEN 04C5 47 C DEFB 'G' ;SET ATTRIBUTE 04C6 4D C DEFB 'M' ;SET GRAPHICS MODE 04C7 2E C DEFB '.' ;SET PARAMETER BYTE C 04C8 0552 C DEFW SETPARM 04CA 0544 C DEFW SETMODE 04CC 0512 C DEFW SETATTR 04CE 0383 C DEFW CLREOS 04D0 0383 C DEFW CLREOS 04D2 0392 C DEFW CLREOL 04D4 0392 C DEFW CLREOL 04D6 03AB C DEFW CLRALL 04D8 03AB C DEFW CLRALL 04DA 040C C DEFW DELLINE 04DC 0440 C DEFW INSLINE 04DE 0466 C DEFW DELCHAR 04E0 048B C DEFW INSCHAR 04E2 04E4 C DEFW SETRC 002A C ESCSIZ EQU $-ESCTAB C ; C ; C ; C ; 04E4 21 04EB C SETRC: LD HL,SETROW 04E7 22 FFAE C LD (ESCVEC),HL 04EA C9 C RET C ; C ; C ; 04EB 79 C SETROW: LD A,C ;ARRIVE HERE ON THIRD CHARACTER 04EC D6 20 C SUB ' ' ; OF CURSOR POSITIONING SEQUENCE MACRO-80 3.4 01-Dec-80 PAGE 1-20 04EE D8 C RET C 04EF D6 18 C SETR2: SUB 24 04F1 30 FC C JR NC,SETR2 ;MAKE SURE ROW# IS BETWEEN 0 AND 23 04F3 C6 18 C ADD A,24 04F5 32 FFB0 C LD (ROWTMP),A ;SAVE TEMPORARY ROW# 04F8 21 04FF C LD HL,SETCOL 04FB 22 FFAE C LD (ESCVEC),HL ;GO TO 'SETCOL' ON NEXT CHARACTER 04FE C9 C RET C ; C ; C ; 04FF 79 C SETCOL: LD A,C ;ARRIVE HERE ON FOURTH CHARACTER 0500 D6 20 C SUB ' ' ; OF ESC,'=',ROW,COL SEQUENCE 0502 D8 C RET C 0503 D6 50 C SETC2: SUB 80 0505 30 FC C JR NC,SETC2 ;MAKE SURE COL# IS BETWEEN 0 AND 79 0507 C6 50 C ADD A,80 0509 67 C LD H,A ;PUT COLUMN# INTO H 050A 3A FFB0 C LD A,(ROWTMP) 050D 6F C LD L,A ;PUT ROW# INTO L 050E CD 02C7 C CALL GOTOXY ;GO COMPUTE RELATIVE CURSOR POINTER 0511 C9 C RET C ; C ; C ; C ; 0512 C SETATTR: 0512 21 0519 C LD HL,SATTR2 0515 22 FFAE C LD (ESCVEC),HL 0518 C9 C RET C ; C ; C ; 0519 C SATTR2: 0519 79 C LD A,C 051A CD 090B C CALL ASCHEX ;CONVERT THIRD CHAR IN SEQUENCE TO HEX 051D D8 C RET C ;EXIT IF OUT OF RANGE C 051E 06 00 C LD B,0 0520 4F C LD C,A 0521 21 FFAB C LD HL,BLANK 0524 36 20 C LD (HL),' ' ;USE ASCII SPACE FOR BLANKS 0526 3E 03 C LD A,00000011B ;USE ALPHANUMERIC ATTRIBUTE MODE 0528 CB 59 C BIT 3,C ;TEST IF ALPHA OR GRAPHICS MODE 052A 28 05 C JR Z,SATTR3 052C 36 00 C LD (HL),0 ;SWITCH TO ZEROS FOR BLANKS AND LOAD 052E 3A FFAD C LD A,(GRMODE) ; A WITH SELECTED GRAPHICS MODE BITS 0531 21 053C C SATTR3: LD HL,BITTAB 0534 CB 99 C RES 3,C 0536 09 C ADD HL,BC ;INDEX INTO BIT TABLE FOR ATTRIBUTES 0537 B6 C OR (HL) ;MERGE MODE AND ATTRIBUTE BITS 0538 32 FFAC C LD (ATTRIB),A ;STORE NEW ATTRIBUTE BYTE 053B C9 C RET C ; C ; C ; MACRO-80 3.4 01-Dec-80 PAGE 1-21 053C 00 C BITTAB: DEFB 0 053D 08 C DEFB UNDLINE 053E 40 C DEFB BLINK 053F 48 C DEFB BLINK+UNDLINE 0540 10 C DEFB REVERSE 0541 18 C DEFB REVERSE+UNDLINE 0542 50 C DEFB REVERSE+BLINK 0543 58 C DEFB REVERSE+BLINK+UNDLINE C ; C ; C ; C ; 0544 C SETMODE: 0544 21 054B C LD HL,SMODE2 0547 22 FFAE C LD (ESCVEC),HL 054A C9 C RET C ; C ; C ; 054B C SMODE2: 054B 79 C LD A,C 054C E6 03 C AND 00000011B 054E 32 FFAD C LD (GRMODE),A ;STORE BITS FOR GRAPHICS MODE FIELD 0551 C9 C RET ; OF ATTRIBUTE BYTE C ; C ; C ; 0552 C SETPARM: 0552 21 0559 C LD HL,SPARM2 0555 22 FFAE C LD (ESCVEC),HL 0558 C9 C RET C ; C ; 0559 C SPARM2: 0559 79 C LD A,C 055A CD 090B C CALL ASCHEX 055D D8 C RET C C 055E 4F C LD C,A 055F E6 07 C AND 00000111B 0561 3C C INC A ;TRANSFORM CODE TO NUMBER IN RANGE 1..8 0562 47 C LD B,A 0563 AF C XOR A 0564 37 C SCF 0565 17 C SPARM3: RLA 0566 10 FD C DJNZ SPARM3 ;DERRIVE BIT POSITION FROM CODE BYTE 0568 21 FFBB C LD HL,CRTFLG 056B CB 59 C BIT 3,C ;TEST IF PARAM BIT IS TO BE SET/RESET 056D 28 03 C JR Z,SPARM4 C 056F B6 C OR (HL) ;SET PARAMETER BIT @HL 0570 77 C LD (HL),A 0571 C9 C RET C ; 0572 2F C SPARM4: CPL 0573 A6 C AND (HL) ;RESET PARAMETER BIT @HL MACRO-80 3.4 01-Dec-80 PAGE 1-22 0574 77 C LD (HL),A 0575 C9 C RET C ; C ; C ; C INCLUDE MONITOR.MAC ;ROM MONITOR ROUTINES C ;******************************************************** C ;* * C ;* BASIC HEX MONITOR FOR Z-80 PROCESSORS * C ;* * C ;******************************************************** C ; C ; C ; C ; 0576 CD 093C C PROMPT: CALL PNEXT 0579 0D 0A 2A 20 C DEFB CR,LF,'* ',EOT 057D 04 C 057E 21 F5FB C LD HL,LINBUF 0581 0E 40 C LD C,LINSIZ 0583 CD 0887 C CALL GETLIN ;INPUT A BUFERED CONSOLE LINE 0586 38 34 C JR C,WHAT ;PRINT 'WHAT ?' IF INPUT ERROR C 0588 CD 094C C CALL CRLFS 058B AF C XOR A 058C 32 F5F6 C LD (BREAK),A ;CLEAR CONSOLE BREAK FLAG 058F 3A F5FB C LD A,(LINBUF) 0592 FD 21 F5FC C LD IY,LINBUF+1 0596 21 05D2 C LD HL,CMDTAB ;SEARCH FOR A MATCHING CHARACTER 0599 01 000D C LD BC,CMDSIZ/3 ; IN COMMAND SEARCH TABLE 059C CD 08AC C CALL SEARCH 059F C4 05C9 C CALL NZ,EXTEND ;TRY EXTENDED FUNCTION JUMP IF NO MATCH 05A2 20 18 C JR NZ,WHAT 05A4 E5 C PUSH HL 05A5 CD 08B7 C CALL PARAMS ;INPUT NUMERIC PARAMETERS FROM 05A8 DD E1 C POP IX ; LINE BUFFER AND TEST IF ERROR 05AA 38 10 C JR C,WHAT 05AC 2A F5EC C LD HL,(PARAM1) 05AF ED 5B F5EE C LD DE,(PARAM2) 05B3 ED 4B F5F0 C LD BC,(PARAM3) 05B7 CD 05D0 C CALL CALLX ;CALL SUBROUTINE @ IX 05BA 30 BA C JR NC,PROMPT ;GO BACK TO PROMPT IF NO ERRORS C 05BC CD 093C C WHAT: CALL PNEXT 05BF 20 77 68 61 C DEFM ' what ?' 05C3 74 20 3F C 05C6 04 C DEFB EOT 05C7 18 AD C JR PROMPT C ; C ; C ; 05C9 2A FF78 C EXTEND: LD HL,(MONVEC) 05CC CD F15A C CALL DISPATCH ;PROCESS EXTENDED MONITOR FUNCTION 05CF C9 C EXT2: RET C ; C ; MACRO-80 3.4 01-Dec-80 PAGE 1-23 05D0 DD E9 C CALLX: JP (IX) ;CALL SUBROUTINE @ IX C ; C ; C ; 05D2 56 C CMDTAB: DEFB 'V' 05D3 52 C DEFB 'R' 05D4 4F C DEFB 'O' 05D5 49 C DEFB 'I' 05D6 47 C DEFB 'G' 05D7 54 C DEFB 'T' 05D8 46 C DEFB 'F' 05D9 4D C DEFB 'M' 05DA 43 C DEFB 'C' 05DB 42 C DEFB 'B' 05DC 44 C DEFB 'D' 05DD 58 C DEFB 'X' 05DE 0D C DEFB CR C 05DF 0678 C DEFW DUMMY 05E1 0828 C DEFW BANKSW ;BANKSWITCH COMMAND 05E3 06B5 C DEFW MEMDMP ;DUMP MEMORY IN HEX/ASCII 05E5 067F C DEFW BOOT ;BOOT FROM FLOPPY 05E7 07ED C DEFW BLOCK ;MEMORY BLOCK MOVE 05E9 0738 C DEFW VIEW ;MEMORY EXAMINE/CHANGE 05EB 07D5 C DEFW FILL ;FILL MEMORY 05ED 0788 C DEFW TEST ;RAM DIAGNOSTIC 05EF 076B C DEFW GOTO ;JUMP TO MEMORY LOCATION 05F1 070D C DEFW INCMD ;READ FROM INPUT PORT 05F3 072F C DEFW OUTCMD ;WRITE TO OUTPUT PORT 05F5 05F9 C DEFW DSKCMD ;DISPLAY DISK SECTOR DATA 05F7 0807 C DEFW VERCMD ;MEMORY BLOCK COMPARE C 0027 C CMDSIZ EQU $-CMDTAB C ; C ; C ;******************************************************** C ;* * C ;* MONITOR COMMAND ACTION ROUTINES PACKAGE * C ;* * C ;******************************************************** C ; C ; C ; C ; -- DISK SECTOR READ COMMAND -- C ; 05F9 FE 03 C DSKCMD: CP 3 ;CHECK PARAMETER COUNT 05FB 28 09 C JR Z,DSK1 05FD B7 C OR A 05FE 37 C SCF 05FF C0 C RET NZ 0600 21 FF98 C LD HL,SECTOR 0603 34 C INC (HL) ;BUMP LAST USED SECTOR NUMBER 0604 18 12 C JR DSK2B C ; 0606 4D C DSK1: LD C,L ;USE FIRST ARG AS UNIT# 0607 CD F27B C CALL SELECT MACRO-80 3.4 01-Dec-80 PAGE 1-24 060A 20 27 C JR NZ,DSKERR 060C 21 F5EE C LD HL,PARAM2 060F 4E C LD C,(HL) ;USE SECOND ARG AS TRACK# 0610 CD F2CF C CALL SEEK 0613 20 1E C JR NZ,DSKERR 0615 21 F5F0 C LD HL,PARAM3 0618 4E C DSK2B: LD C,(HL) ;USE THIRD ARG AS SECTOR# 0619 21 F800 C LD HL,DSKBUF 061C CD F408 C CALL READ ;READ SECTOR INTO (BUFFER) 061F 20 12 C JR NZ,DSKERR 0621 23 C INC HL ;ADD 1 TO DMA BYTECOUNT RETURNED IN HL 0622 EB C EX DE,HL 0623 06 04 C LD B,4 0625 CB 3A C DSK2C: SRL D 0627 CB 1B C RR E ;DIVIDE BYTECOUNT BY 4 0629 10 FA C DJNZ DSK2C 062B 21 F800 C LD HL,DSKBUF 062E CD 06D7 C CALL DUMP ;DUMP DISK READ BUFFER AND 0631 18 15 C JR DSKADR ; PRINT UNIT/TRACK/SECTOR C 0633 F5 C DSKERR: PUSH AF ;SAVE 1771 STATUS 0634 CD 093C C CALL PNEXT 0637 64 69 73 6B C DEFM 'disk error ' 063B 20 65 72 72 C 063F 6F 72 20 20 C 0643 04 C DEFB EOT 0644 F1 C POP AF 0645 CD 0920 C CALL PUT2HS ;PRINT ERROR STATUS IN HEX 0648 3A FF96 C DSKADR: LD A,(DSKTYP) 064B CB 47 C BIT 0,A ;DETERMINE IF SINGLE/DOUBLE DENSITY 064D 3E 53 C LD A,'S' 064F 28 02 C JR Z,DSKAD1 0651 3E 44 C LD A,'D' 0653 CD 0966 C DSKAD1: CALL OUTPUT ;DISPLAY 'SD' OR 'DD' 0656 21 067A C LD HL,DADMSG 0659 CD 0942 C CALL PMSG 065C 3A FF86 C LD A,(UNIT) ;NOW DISPLAY UNIT/TRACK/SECTOR 065F CD 0920 C CALL PUT2HS ;PRINT DRIVE UNIT# 0662 3E 54 C LD A,'T' 0664 CD 0966 C CALL OUTPUT 0667 3A FF87 C LD A,(TRACK) 066A CD 0920 C CALL PUT2HS ;PRINT TRACK# IN HEX 066D 3E 53 C LD A,'S' 066F CD 0966 C CALL OUTPUT 0672 3A FF98 C LD A,(SECTOR) 0675 CD 0920 C CALL PUT2HS ;PRINT SECTOR# IN HEX 0678 B7 C DUMMY: OR A 0679 C9 C RET C 067A 44 20 20 55 C DADMSG: DEFB 'D U',EOT 067E 04 C C ; C ; C ; C ; C ; -- DISK BOOT LOADER COMMAND -- MACRO-80 3.4 01-Dec-80 PAGE 1-25 C ; 067F 0E 00 C BOOT: LD C,0 ;SELECT DRIVE 0 FOR BOOT LOAD 0681 CD F27B C CALL SELECT 0684 20 AD C JR NZ,DSKERR 0686 CD F2CD C CALL HOME ;HOME HEAD TO TRACK 0 0689 20 A8 C JR NZ,DSKERR ;ERROR IF CANNOT RESTORE 068B 21 F800 C LD HL,DSKBUF ;POINT TO MONITOR'S SECTOR BUFFER 068E 0E 01 C LD C,1 ;SELECT SECTOR 1 0690 CD F408 C CALL READ ;READ TRACK 0/ SECTOR 1 0693 20 9E C JR NZ,DSKERR C 0695 21 FF6F C LD HL,CONFIG 0698 CB C6 C SET 0,(HL) ;SET CONFIG BYTE FOR RAM AT 0000H 069A 21 F800 C LD HL,DSKBUF 069D 11 0080 C LD DE,0080H 06A0 01 0080 C LD BC,128 06A3 CD F094 C CALL MOVE ;COPY BOOT CP/M STANDARD LOCATION 06A6 F3 C DI 06A7 31 F65B C LD SP,STACK 06AA 21 F035 C LD HL,ROLLIN 06AD E5 C PUSH HL ;PUSH ADDRESS IN CASE BOOT RETURNS 06AE 21 0080 C LD HL,0080H 06B1 E5 C PUSH HL ;PUSH TRANSFER ADDRESS FOR 'EXITMON' 06B2 C3 F0A6 C JP EXITMON ;TURN OFF ROMS AND EXECUTE LOADER C ; C ; C ; C ; C ; -- MEMORY DUMP COMMAND -- C ; 06B5 3D C MEMDMP: DEC A ;CHECK PARAMETER COUNT 06B6 28 06 C JR Z,MDMP2 06B8 3D C DEC A 06B9 28 08 C JR Z,MDMP3 06BB 2A F5F7 C MDMP1: LD HL,(LAST) 06BE 11 0010 C MDMP2: LD DE,16 06C1 18 0D C JR MDMP3B C 06C3 EB C MDMP3: EX DE,HL 06C4 ED 52 C SBC HL,DE ;DERRIVE BYTECOUNT FOR DUMP RANGE 06C6 06 04 C LD B,4 06C8 CB 3C C MDMP3A: SRL H ;DIVIDE BYTECOUNT BY 16 06CA CB 1D C RR L 06CC 10 FA C DJNZ MDMP3A 06CE 23 C INC HL 06CF EB C EX DE,HL 06D0 CD 06D7 C MDMP3B: CALL DUMP ;DUMP DE*16 BYTES STRTING AT HL 06D3 22 F5F7 C LD (LAST),HL 06D6 C9 C RET C ; C ; C ; 06D7 E5 C DUMP: PUSH HL ;SAVE STARTING ADDRESS 06D8 CD 091B C CALL PUT4HS ;PRINT STARTING ADDRESS IN HEX 06DB CD 0952 C CALL SPACE 06DE 06 10 C LD B,16 MACRO-80 3.4 01-Dec-80 PAGE 1-26 06E0 CD F072 C DUMP2: CALL LOAD ;GET A DATA BYTE @ HL 06E3 79 C LD A,C 06E4 23 C INC HL 06E5 CD 0920 C CALL PUT2HS ;PRINT THE DATA IN HEX 06E8 10 F6 C DJNZ DUMP2 ;REPEAT 16 TIMES 06EA E1 C POP HL ;RESTORE STARTING ADDRESS 06EB 06 10 C LD B,16 06ED CD F072 C DUMP3: CALL LOAD ;GET BACK DATA BYTE @ HL 06F0 79 C LD A,C 06F1 23 C INC HL 06F2 CB BF C RES 7,A 06F4 FE 20 C CP 20H 06F6 38 04 C JR C,DUMP4 06F8 FE 7F C CP 7FH 06FA 38 02 C JR C,DUMP5 06FC 3E 2E C DUMP4: LD A,'.' ;PRINT A DOT IF DATA < 20 OR > 7F 06FE CD 0966 C DUMP5: CALL OUTPUT ;PRINT ASCII CHARACTER IN A 0701 10 EA C DJNZ DUMP3 0703 CD 094C C CALL CRLFS 0706 C0 C RET NZ ;EXIT IF ESCAPE REQUEST IS INDICATED 0707 1B C DEC DE 0708 7A C LD A,D 0709 B3 C OR E 070A 20 CB C JR NZ,DUMP 070C C9 C RET C ; C ; C ; -- READ FROM INPUT PORT COMMAND -- C ; 070D 3D C INCMD: DEC A ;CHECK IF PARAMETER COUNT=1 070E 37 C SCF 070F C0 C RET NZ 0710 4D C LD C,L ;POINT C TO INPUT PORT 0711 CD 094C C IN1: CALL CRLFS 0714 79 C LD A,C 0715 CD 0920 C CALL PUT2HS 0718 ED 78 C IN A,(C) 071A CD 0920 C CALL PUT2HS 071D CD 0958 C CALL ECHO 0720 FE 0D C CP CR 0722 28 06 C JR Z,IN2 0724 FE 2D C CP '-' 0726 28 04 C JR Z,IN3 0728 B7 C OR A 0729 C9 C RET C 072A 0C C IN2: INC C 072B 0C C INC C 072C 0D C IN3: DEC C 072D 18 E2 C JR IN1 C ; C ; C ; C ; -- WRITE TO OUTPUT PORT COMMAND -- C ; 072F FE 02 C OUTCMD: CP 2 ;CHECK IF PARAMETER COUNT=2 MACRO-80 3.4 01-Dec-80 PAGE 1-27 0731 37 C SCF 0732 C0 C RET NZ 0733 4D C LD C,L ;POINT C TO OUTPUT PORT 0734 ED 59 C OUT (C),E ;OUTPUT DATA PASSED IN E 0736 B7 C OR A 0737 C9 C RET C ; C ; C ; C ; -- MEMORY EXAMINE COMMAND -- C ; 0738 CD 07C7 C VIEW: CALL MDATA 073B CD 0958 C CALL ECHO 073E FE 0D C CP CR 0740 28 24 C JR Z,VIEW4 0742 FE 2D C CP '-' 0744 28 22 C JR Z,VIEW5 0746 FE 2C C CP ',' 0748 20 05 C JR NZ,VIEW2 074A CD 0958 C CALL ECHO 074D 18 13 C JR VIEW3 C 074F CD 090B C VIEW2: CALL ASCHEX 0752 3F C CCF 0753 D0 C RET NC 0754 07 C RLCA 0755 07 C RLCA 0756 07 C RLCA 0757 07 C RLCA 0758 4F C LD C,A 0759 CD 0958 C CALL ECHO 075C CD 090B C CALL ASCHEX 075F 3F C CCF 0760 D0 C RET NC 0761 B1 C OR C 0762 4F C VIEW3: LD C,A 0763 CD F083 C CALL STORE 0766 23 C VIEW4: INC HL 0767 23 C INC HL 0768 2B C VIEW5: DEC HL 0769 18 CD C JR VIEW C ; C ; C ; C ; -- JUMP TO MEMORY LOCATION COMMAND -- C ; 076B B7 C GOTO: OR A ;CHECK IF PARAMETER COUNT <> ZERO 076C 37 C SCF 076D C8 C RET Z C 076E F3 C DI 076F 31 F65B C LD SP,STACK 0772 11 F035 C LD DE,ROLLIN 0775 D5 C PUSH DE ;PUSH MONITOR ENTRY ADDRESS FOR RETURN 0776 E5 C PUSH HL ;PUSH TRANSFER ADDRESS AFTER THAT 0777 3A F5EE C LD A,(PARAM2) MACRO-80 3.4 01-Dec-80 PAGE 1-28 077A 2A F5F0 C LD HL,(PARAM3) 077D ED 5B F5F2 C LD DE,(PARAM4) 0781 ED 4B F5F4 C LD BC,(PARAM5) ;PUT REST OF PARAMS IN REGISTERS 0785 C3 F0A6 C JP EXITMON ;SET D/S BANKSWITCH AND EXIT MONITOR C ; C ; C ; C ; -- MEMORY READ/WRITE DIAGNOSTIC COMMAND -- C ; 0788 FE 02 C TEST: CP 2 ;CHECK PARAMETER COUNT 078A 37 C SCF 078B C0 C RET NZ 078C 13 C INC DE 078D 5A C LD E,D ;GET ENDING PAGE ADDRESS INTO E 078E 54 C LD D,H ;GET STARTING PAGE ADDRESS INTO D 078F 06 00 C LD B,0 ;INITIALIZE PASS COUNTER 0791 62 C TEST1: LD H,D ;POINT HL TO START OF BLOCK 0792 2E 00 C LD L,0 0794 CD F0B8 C TEST2: CALL MEMTEST ;CALL BANK-SWITCH MEMORY TEST ROUTINE 0797 28 0F C JR Z,TEST4 ;DO ANOTHER PASS IF NO ERRORS 0799 CD F072 C TEST3: CALL LOAD ;LOAD C WITH ERROR BYTE 079C 7D C LD A,L 079D AC C XOR H 079E A8 C XOR B ;RE-GENERATE BYTE IN ERROR 079F CD 07B1 C CALL CHECK ;GO PRINT RESULT 07A2 C0 C RET NZ ;EXIT ROUTINE IF BREAK REQUESTED C 07A3 23 C INC HL 07A4 7C C LD A,H 07A5 BB C CP E 07A6 20 F1 C JR NZ,TEST3 ;CHECK REST OF BLOCK FOR ERRORS 07A8 04 C TEST4: INC B ;BUMP PASS COUNT 07A9 3E 2B C LD A,'+' 07AB CD 0966 C CALL OUTPUT ;PRINT '+' AND ALLOW FOR EXIT 07AE 28 E1 C JR Z,TEST1 ;DO ANOTHER PASS IF NO ESCAPE 07B0 C9 C RET C ; C ; C ; 07B1 B9 C CHECK: CP C 07B2 C8 C RET Z ;RETURN IF C=A C 07B3 F5 C PUSH AF 07B4 CD 07C7 C CALL MDATA ;PRINT WHAT WAS ACTUALLY READ 07B7 CD 093C C CALL PNEXT 07BA 73 68 6F 75 C DEFM 'should=' 07BE 6C 64 3D C 07C1 04 C DEFB EOT 07C2 F1 C POP AF 07C3 CD 0920 C CALL PUT2HS ;PRINT WHAT SHOULD HAVE BEEN READ 07C6 C9 C RET C ; C ; 07C7 CD 094C C MDATA: CALL CRLFS 07CA CD 091B C CALL PUT4HS 07CD CD F072 C CALL LOAD MACRO-80 3.4 01-Dec-80 PAGE 1-29 07D0 79 C LD A,C 07D1 CD 0920 C CALL PUT2HS 07D4 C9 C RET C ; C ; C ; C ; -- FILL MEMORY WITH CONSTANT COMMAND -- C ; 07D5 FE 03 C FILL: CP 3 ;CHECK IF PARAMETER COUNT=3 07D7 37 C SCF 07D8 C0 C RET NZ C 07D9 EB C EX DE,HL 07DA B7 C OR A 07DB ED 52 C SBC HL,DE ;END-START EQUALS BYTECOUNT 07DD EB C EX DE,HL 07DE D8 C RET C 07DF C8 C RET Z ;RETURN IF START => END ADDRESS C 07E0 CD F083 C CALL STORE ;STORE C AT (HL) IN PROPER BANK 07E3 42 C LD B,D 07E4 4B C LD C,E ;PUT BYTECOUNT IN BC FROM DE 07E5 54 C LD D,H 07E6 5D C LD E,L 07E7 13 C INC DE ;PUT START+1 IN DE 07E8 CD F094 C CALL MOVE ;FILL BLOCK USING LDIR TRICK 07EB B7 C OR A 07EC C9 C RET C ; C ; C ; C ; C ; -- MEMORY BLOCK MOVE COMMAND -- C ; 07ED FE 03 C BLOCK: CP 3 ;CHECK IF PARAMETER COUNT=3 07EF 37 C SCF 07F0 C0 C RET NZ 07F1 CD 07FC C CALL BLOCAD 07F4 79 C LD A,C 07F5 B0 C OR B 07F6 C8 C RET Z ;EXIT NOW IF BC=0 C 07F7 CD F094 C CALL MOVE ;MOVE BLOCK WITH BANK SWITCH 07FA B7 C OR A 07FB C9 C RET C ; C ; C ; 07FC EB C BLOCAD: EX DE,HL 07FD B7 C OR A ;CLEAR CARRY 07FE ED 52 C SBC HL,DE ;GET DIFFRENCE BETWEEN 0800 EB C EX DE,HL ;HL & DE FOR BYTECOUNT 0801 D5 C PUSH DE 0802 C5 C PUSH BC 0803 D1 C POP DE ;GET OLD BC INTO DE 0804 C1 C POP BC MACRO-80 3.4 01-Dec-80 PAGE 1-30 0805 03 C INC BC ;GET COUNT+1 INTO BC 0806 C9 C RET C ; C ; C ; C ; -- MEMORY BLOCK COMPARE COMMAND -- C ; 0807 FE 03 C VERCMD: CP 3 ;CHECK IF PARAMETER COUNT=3 0809 37 C SCF 080A C0 C RET NZ 080B CD 07FC C CALL BLOCAD 080E 18 13 C JR VERF2 C 0810 C5 C VERF1: PUSH BC 0811 EB C EX DE,HL 0812 CD F072 C CALL LOAD ;READ BYTE @DE IN CURRENT BANK 0815 EB C EX DE,HL 0816 41 C LD B,C 0817 CD F072 C CALL LOAD ;NOW READ BYTE @HL 081A 78 C LD A,B 081B CD 07B1 C CALL CHECK ;COMPARE DATA @DE AND @HL 081E C1 C POP BC 081F C0 C RET NZ ;EXIT IF ESCAPE REQUEST IS INDICATED 0820 23 C INC HL 0821 13 C INC DE 0822 0B C DEC BC 0823 78 C VERF2: LD A,B 0824 B1 C OR C 0825 20 E9 C JR NZ,VERF1 0827 C9 C RET C ; C ; C ; C ; -- MEMORY BANK SWITCH COMMAND -- C ; C ; 0828 FE 02 C BANKSW: CP 2 082A 3F C CCF 082B D8 C RET C ;ERROR IF NOT PARAM COUNT NOT 0 OR 1 082C B7 C OR A 082D 20 08 C JR NZ,BANK2 ;JUMP IF NEW PARAM ENTERED C 082F 3A FF6F C LD A,(CONFIG) 0832 CD 0920 C CALL PUT2HS ;DISPLAY CURRENT 'CONFIG' BYTE 0835 B7 C OR A 0836 C9 C RET C ; 0837 7D C BANK2: LD A,L 0838 21 FF6F C LD HL,CONFIG 083B AE C XOR (HL) ;COMPARE NEW CONFIG TO OLD SETTING 083C CB 4F C BIT 1,A ;TEST IF STD/BB BIT IS DIFFERENT 083E 28 1A C JR Z,BANK2A ;EXIT IF NO CHANGE IN RAM BANK SWITCH C 0840 F3 C DI ;NO INTERRUPTS WHILE COPYING MEMORY 0841 3A FF71 C LD A,(STDCPY) 0844 5F C LD E,A ;E=SOURCE BANK CONTROL BYTE MACRO-80 3.4 01-Dec-80 PAGE 1-31 0845 EE 08 C XOR 00001000B 0847 57 C LD D,A ;OPPOSITE BANK GOES IN D 0848 21 F000 C LD HL,MONITR ;ELSE MAKE SHADOOW COPY OF UPPER 4K 084B 01 1000 C LD BC,4096 ; OF RAM BEFORE SWITCHING BANKS 084E CD 0874 C CALL SHADOW 0851 20 10 C JR NZ,BANK3 ;JUMP IF BLOCK NOT COPIED CORRECTLY 0853 7A C LD A,D 0854 D3 C0 C OUT (PORT3),A ;SWITCH TO OPPOSITE BANK AND STAY 0856 32 FF71 C LD (STDCPY),A 0859 FB C EI 085A 3A F5EC C BANK2A: LD A,(PARAM1) 085D E6 03 C AND 00000011B 085F 32 FF6F C LD (CONFIG),A ;STORE NEW CONFIGURATION BITS 0862 C9 C RET C ; 0863 FB C BANK3: EI 0864 CD 093C C CALL PNEXT 0867 45 52 52 20 C DEFB 'ERR AT ',EOT 086B 41 54 20 04 C 086F CD 091B C CALL PUT4HS 0872 B7 C OR A 0873 C9 C RET C ; C ; C ; C ; C ; HL ... BLOCK POINTER C ; BC ... BYTECOUNT C ; D ... DEST BANK CONTROL BYTE C ; E ... SOURCE BANK CONTROL BYTE C ; 0874 C SHADOW: 0874 7E C LD A,(HL) ;GET MEMORY BYTE FROM SOURCE BANK 0875 08 C EX AF,AF' 0876 7A C LD A,D 0877 D3 C0 C OUT (PORT3),A ;SWITCH TO DESTINATION MEMORY BANK 0879 08 C EX AF,AF' 087A 77 C LD (HL),A ;STORE DATA BYTE INTO DEST BANK 087B BE C CP (HL) ;READ BACK FROM DEST AND COMPARE 087C 7B C LD A,E 087D D3 C0 C OUT (PORT3),A ;SWITCH BACK TO SOURCE MEMORY BANK 087F C0 C RET NZ ;ABORT IF SOURCE <> DEST 0880 23 C INC HL 0881 0B C DEC BC 0882 78 C LD A,B 0883 B1 C OR C 0884 20 EE C JR NZ,SHADOW 0886 C9 C RET C ; C ; C ; C ;******************************************************** C ;* * C ;* CONSOLE I/O PACKAGE AND UTILITY ROUTINES * C ;* * C ;******************************************************** MACRO-80 3.4 01-Dec-80 PAGE 1-32 C ; C ; C ; 0887 41 C GETLIN: LD B,C ;SAVE MAX LINE LENGTH PARAMETER IN B 0888 CD 0958 C GLIN1: CALL ECHO ;GET A CHARACTER FROM THE CONSOLE 088B FE 0D C CP CR ;CHECK FOR CARRIAGE RETURN 088D 28 0E C JR Z,GLIN2 088F FE 08 C CP 'H'-64 ;CHECK FOR CTL-H BACKSPACE 0891 28 0C C JR Z,GLIN4 0893 FE 20 C CP ' ' 0895 D8 C RET C ;OTHER CONTROL CHARACTERS ARE ILLEGAL 0896 77 C LD (HL),A 0897 23 C INC HL ;STORE CHARACTER IN BUFFER 0898 0D C DEC C 0899 20 ED C JR NZ,GLIN1 ;GET ANOTHER IF THERE'S MORE ROOM 089B 37 C SCF 089C C9 C RET ;RETURN WITH CARRY=1 IF TOO C ;MANY CHARACTERS ARE ENTERED 089D 77 C GLIN2: LD (HL),A ;PUT CARRIAGE RETURN ON END OF LINE 089E C9 C RET ;RETURN WITH CARRY BIT=0 C 089F 2B C GLIN4: DEC HL ;DELETE LAST CHARACTER FROM BUFFER 08A0 CD 093C C CALL PNEXT 08A3 20 08 C DEFB ' ','H'-64 ;PRINT A SPACE TO OVERWRITE THE 08A5 04 C DEFB EOT ; LAST CHARACTER, THEN DO A BACKSPACE 08A6 0C C INC C 08A7 78 C LD A,B ;MAKE SURE YOU'RE NOT TRYING TO 08A8 91 C SUB C ;BACKSPACE PAST THE START OF THE LINE 08A9 30 DD C JR NC,GLIN1 08AB C9 C RET C ; C ; C ; 08AC ED B1 C SEARCH: CPIR ;SEARCH TABLE @HL FOR MATCH WITH A 08AE C0 C RET NZ ;EXIT NOW IF SEARCH FAILS 08AF 09 C ADD HL,BC 08B0 09 C ADD HL,BC ;ADD RESIDUE FROM CPIR BYTECOUNT 08B1 09 C ADD HL,BC ; TO HL 3 TIMES TO GET POINTER 08B2 7E C LD A,(HL) ; TO ADDRESS PART OF TABLE ENTRY 08B3 23 C INC HL 08B4 66 C LD H,(HL) 08B5 6F C LD L,A 08B6 C9 C RET ;EXIT WITH Z=1 TO INDICATE MATCH C ; C ; C ; C ; 08B7 01 0000 C PARAMS: LD BC,0 08BA FD 7E 00 C LD A,(IY+0) 08BD FE 0D C CP CR ;CHECK IF LINE TERMINATES 08BF 20 09 C JR NZ,PARA2 ; IMMEDIATELY WITH A RETURN 08C1 AF C XOR A 08C2 C9 C RET ;RETURN WITH PARAM COUNT=0 IF SO C 08C3 0C C PARA1: INC C ;ADD 2 TO PARAM BUFFER INDEX IN BC 08C4 0C C INC C MACRO-80 3.4 01-Dec-80 PAGE 1-33 08C5 79 C LD A,C 08C6 FE 0A C CP 10 08C8 3F C CCF 08C9 D8 C RET C ;ERROR IF > 5 NUMBERS ENTERED 08CA C5 C PARA2: PUSH BC ;SAVE PARAMETER COUNT 08CB CD 08ED C CALL GETHEX ;READ A NUMBER FROM LINE BUFFER 08CE C1 C POP BC 08CF D8 C RET C ;ERROR IF RESULT OVER 16 BITS 08D0 DD 21 F5EC C LD IX,PARAM1 ;POINT TO PARAMETER STORAGE AREA 08D4 DD 09 C ADD IX,BC ;ADD PARAMETER COUNT IN BC 08D6 DD 75 00 C LD (IX+0),L 08D9 DD 74 01 C LD (IX+1),H ;STORE DATA RETURNED FROM 'GETHEX' 08DC FE 20 C CP ' ' 08DE 28 E3 C JR Z,PARA1 ;GET ANOTHER ITEM IF SPACE 08E0 FE 2C C CP ',' 08E2 28 DF C JR Z,PARA1 ;GET ANOTHER ITEM IF COMMA C 08E4 FE 0D C CP CR 08E6 37 C SCF ;ELSE CHECK FOR CARRIAGE RETURN 08E7 C0 C RET NZ ; AND EXIT WITH CY=1 IF NOT 08E8 79 C LD A,C 08E9 CB 3F C SRL A ;A=COUNT OF NUMBERS ENTERED 08EB 3C C INC A 08EC C9 C RET C ; C ; C ; C ; 08ED 21 0000 C GETHEX: LD HL,0 08F0 18 0B C JR GNUM3 C 08F2 06 04 C GNUM1: LD B,4 08F4 29 C GNUM2: ADD HL,HL ;MULTIPLY RESULT BY 16 08F5 D8 C RET C ;RETURN IF IT OVERFLOWS 16 BITS 08F6 10 FC C DJNZ GNUM2 08F8 5F C LD E,A ;APPEND NEW LOW ORDER DIGIT 08F9 16 00 C LD D,0 ;AND GET RESULT BACK INTO DE 08FB 19 C ADD HL,DE 08FC D8 C RET C ;RETURN IF OVERFLOW 08FD FD 7E 00 C GNUM3: LD A,(IY+0) ;GET A CHARACTER FROM LINE INPUT 0900 FD 23 C INC IY ; BUFFER @ IY AND BUMP IY 0902 4F C LD C,A 0903 CD 090B C CALL ASCHEX ;CONVERT ASCII TO NUMERIC 0906 30 EA C JR NC,GNUM1 0908 79 C LD A,C 0909 B7 C OR A 090A C9 C RET C ; C ; 090B D6 30 C ASCHEX: SUB '0' 090D D8 C RET C 090E FE 0A C CP 10 0910 3F C CCF 0911 D0 C RET NC 0912 D6 07 C SUB 7 0914 FE 0A C CP 10 MACRO-80 3.4 01-Dec-80 PAGE 1-34 0916 D8 C RET C 0917 FE 10 C CP 16 0919 3F C CCF 091A C9 C RET C ; C ; C ; 091B 7C C PUT4HS: LD A,H 091C CD 0927 C CALL PUT2HX 091F 7D C LD A,L 0920 CD 0927 C PUT2HS: CALL PUT2HX 0923 CD 0952 C CALL SPACE 0926 C9 C RET C ; C ; 0927 F5 C PUT2HX: PUSH AF 0928 1F C RRA 0929 1F C RRA 092A 1F C RRA 092B 1F C RRA 092C CD 0930 C CALL PUTNIB 092F F1 C POP AF 0930 E6 0F C PUTNIB: AND 00001111B 0932 C6 90 C ADD A,90H 0934 27 C DAA 0935 CE 40 C ADC A,40H 0937 27 C DAA 0938 CD 0966 C CALL OUTPUT 093B C9 C RET C ; C ; C ; PMSG PRINTS THE STRING OF ASCII CHARACTERS C ; POINTED TO BY THE RELATIVE ADDRESS IN DE C ; UNTIL AN EOT IS ENCOUNTERED IN THE STRING. C ; 0004 C EOT EQU 04H 000D C CR EQU 0DH 000A C LF EQU 0AH C ; C 093C E3 C PNEXT: EX (SP),HL 093D CD 0942 C CALL PMSG 0940 E3 C EX (SP),HL 0941 C9 C RET C ; 0942 7E C PMSG: LD A,(HL) 0943 23 C INC HL 0944 FE 04 C CP EOT 0946 C8 C RET Z 0947 CD 0966 C CALL OUTPUT 094A 18 F6 C JR PMSG C ; C ; C ; C ; CRLFS OUTPUTS A RETURN-LINEFEED-SPACE C ; TO THE CONSOLE DEVICE MACRO-80 3.4 01-Dec-80 PAGE 1-35 C ; 094C CD 093C C CRLFS: CALL PNEXT 094F 0D 0A 04 C DEFB CR,LF,EOT 0952 3E 20 C SPACE: LD A,' ' 0954 CD 0966 C CALL OUTPUT 0957 C9 C RET C ; C ; C ; C ; ECHO INPUTS ONE CHARACTER FROM THE CONSOLE C ; DEVICE, PRINTS IT ON THE CONSOLE OUTPUT AND C ; THEN RETURNS IT IN REGISTER A WITH BIT 7 RESET C ; C ; OUTPUT PRINTS THE CHARACTER IN REGISTER A ON C ; THE CONSOLE OUTPUT DEVICE AND THEN DOES A CHECK C ; FOR CONSOLE INPUT TO FREEZE OR ABORT OUTPUT. C ; C 0958 CD F009 C ECHO: CALL CONIN ;INPUT A CHARACTER AND ECHO IT 095B F5 C PUSH AF 095C CD F00C C CALL CONOUT 095F F1 C POP AF 0960 FE 5B C CP 'Z'+1 0962 D8 C RET C 0963 D6 20 C SUB 32 ;CONVERT UPPER CASE TO LOWER CASE 0965 C9 C RET C ; C ; C ; 0966 CD F00C C OUTPUT: CALL CONOUT 0969 CD F006 C CALL CONST ;SEE IF CONSOLE INPUT IS PENDING 096C 28 0F C JR Z,OUTP2 096E CD F009 C CALL CONIN 0971 FE 0D C CP CR ;SEE IF CARRIAGE RETURN WAS TYPED 0973 28 05 C JR Z,OUTP1 0975 CD F009 C CALL CONIN ;WAIT FOR ANOTHER INPUT CHARACTER 0978 18 03 C JR OUTP2 ; THEN RETURN TO CALLING ROUTINE C 097A 32 F5F6 C OUTP1: LD (BREAK),A ;SET ESCAPE FLAG TO NON-ZERO VALUE 097D 3A F5F6 C OUTP2: LD A,(BREAK) 0980 B7 C OR A ;RETURN CURRENT STATUS OF ESCAPE 0981 C9 C RET ; FLAG TO CALLING ROUTINE C ; C ; C ; C ; ; ; ; ; 0982 MONCOPY EQU $ .PHASE MONITR ;PUT RAM-RESIDENT STUFF HERE F000 MONSTRT EQU $ C INCLUDE ENTRYS.MAC ;MONITOR ENTRY POINTS MACRO-80 3.4 01-Dec-80 PAGE 1-36 C PAGE MACRO-80 3.4 01-Dec-80 PAGE 1-37 C C ; C ; C ; C ; -- MONITOR ENTRY POINT TABLE -- C F000 C3 F02D C COLD: JP REINIT ;MONITOR COLD ENTRY POINT F003 C3 F035 C WARM: JP ROLLIN ;MONITOR WARM ENTRY POINT F006 C3 F0DF C CONST: JP KBDST ;CONSOLE STATUS VECTOR F009 C3 F0E7 C CONIN: JP KBDIN ;CONSOLE INPUT VECTOR F00C C3 F044 C CONOUT: JP VIDOUT ;CONSOLE OUTPUT VECTOR F00F C3 F044 C JP VIDOUT ;CRT OUTPUT VECTOR F012 C3 F1F9 C JP SIOST ;SIO CHANEL B STATUS VECTOR F015 C3 F201 C JP SIOIN ;SIO CHANEL B INPUT VECTOR F018 C3 F24B C JP SIOOUT ;SIO CHANEL B OUTPUT VECTOR F01B C3 F27B C JP SELECT ;DISK DRIVE SELECT F01E C3 F2CD C JP HOME ;HOME R/W HEAD F021 C3 F2CF C JP SEEK ;SEEK TO TRACK F024 C3 F408 C JP READ ;READ SECTOR F027 C3 F3F6 C JP WRITE ;WRITE SECTOR F02A C3 F3DA C JP READID C ; C ; C ; F02D C REINIT: F02D F3 C DI F02E 3E 00 C LD A,DYSTAT+OFF F030 D3 C8 C OUT (PORT0),A ;SWITCH ROMS ON IN LOW 32K MEMORY F032 C3 0000 C JP 0 ;JUMP TO ABSOLUTE LOCATION 0 C ; C ; C ; F035 C ROLLIN: F035 F3 C DI F036 3E 00 C LD A,DYSTAT+OFF F038 D3 C8 C OUT (PORT0),A ;TURN ROMS ON AND ALSO SET MEMORY F03A 32 FF70 C LD (DSCOPY),A ; BANK SWITCH VARIABLE TO INDICATE F03D 31 F65B C LD SP,STACK ; WE WILL BE EXECUTING FROM ROM F040 FB C EI F041 C3 0576 C JP PROMPT C ; C ; C ; F044 C VIDOUT: F044 F3 C DI F045 ED 73 F5D2 C LD (CRTSAV),SP F049 31 F5EC C LD SP,CRTSTK ;POINT SP TO TOP OF LOCAL STACK F04C E5 C PUSH HL F04D D5 C PUSH DE F04E C5 C PUSH BC F04F 4F C LD C,A ;MOVE OUTPUT CHARACTER TO C F050 3A FF70 C LD A,(DSCOPY) ;SAVE CURRENT RAM/ROM CONTROL BYTE F053 F5 C PUSH AF ; ON STACK FOR DURATION OF 'CRTOUT' F054 3E 00 C LD A,DYSTAT+OFF F056 32 FF70 C LD (DSCOPY),A ;SET 'DSCOPY' TO ENABLE LOWER 32K BANK MACRO-80 3.4 01-Dec-80 PAGE 1-38 F059 D3 C8 C OUT (PORT0),A ;TURN ON ROMS AND CRT MEMORY F05B FB C EI C F05C 2A FF7A C LD HL,(CRTVEC) F05F CD F15A C CALL DISPATCH ;CALL SELECTED CRTOUT ROUTINE C F062 F3 C DI F063 F1 C POP AF ;RESTORE OLD MEMORY MAP BIT SETTING F064 32 FF70 C LD (DSCOPY),A ;GO BACK TO MEMORY CONFIGURATION F067 D3 C8 C OUT (PORT0),A ; AS IT WAS BEFORE CALLING 'CRTOUT' F069 C1 C POP BC F06A D1 C POP DE F06B E1 C POP HL F06C ED 7B F5D2 C LD SP,(CRTSAV) F070 FB C EI F071 C9 C RET C ; C ; C ; C ; F072 C LOAD: F072 F3 C DI F073 3A FF6F C LD A,(CONFIG) F076 87 C ADD A,A F077 87 C ADD A,A F078 87 C ADD A,A F079 D3 C8 C OUT (PORT0),A F07B 4E C LD C,(HL) F07C 3A FF70 C LD A,(DSCOPY) F07F D3 C8 C OUT (PORT0),A F081 FB C EI F082 C9 C RET C ; C ; F083 C STORE: F083 F3 C DI F084 3A FF6F C LD A,(CONFIG) F087 87 C ADD A,A F088 87 C ADD A,A F089 87 C ADD A,A F08A D3 C8 C OUT (PORT0),A F08C 71 C LD (HL),C F08D 3A FF70 C LD A,(DSCOPY) F090 D3 C8 C OUT (PORT0),A F092 FB C EI F093 C9 C RET C ; C ; C ; F094 C MOVE: F094 F3 C DI F095 3A FF6F C LD A,(CONFIG) F098 87 C ADD A,A F099 87 C ADD A,A F09A 87 C ADD A,A F09B D3 C8 C OUT (PORT0),A MACRO-80 3.4 01-Dec-80 PAGE 1-39 F09D ED B0 C LDIR F09F 3A FF70 C LD A,(DSCOPY) F0A2 D3 C8 C OUT (PORT0),A F0A4 FB C EI F0A5 C9 C RET C ; C ; C ; F0A6 C EXITMON: F0A6 F3 C DI F0A7 F5 C PUSH AF F0A8 3A FF6F C LD A,(CONFIG) ;SET BANK SWITCH STATE TO VALUE F0AB 87 C ADD A,A ; CURRENTLY SELECTED IN MONITOR F0AC 87 C ADD A,A F0AD 87 C ADD A,A F0AE E6 08 C AND 00001000B F0B0 32 FF70 C LD (DSCOPY),A ;STORE CONTROL BYTE FOR D/S BIT F0B3 D3 C8 C OUT (PORT0),A ;SWITCH TO SPECIFIED LOWER BANK F0B5 F1 C POP AF F0B6 FB C EI F0B7 C9 C RET ;DO JUMP BY POPPING STACK C ; C ; C ; C ; F0B8 C MEMTEST: F0B8 F3 C DI F0B9 3A FF6F C LD A,(CONFIG) F0BC 87 C ADD A,A F0BD 87 C ADD A,A F0BE 87 C ADD A,A F0BF D3 C8 C OUT (PORT0),A ;SWITCH TO SELECTED MEMORY BANK TO TEST F0C1 7D C MTST2: LD A,L F0C2 AC C XOR H ;GENERATE TEST BYTE F0C3 A8 C XOR B F0C4 77 C LD (HL),A ;STORE BYTE IN RAM F0C5 23 C INC HL F0C6 7C C LD A,H F0C7 BB C CP E ;CHECK FOR END OF TEST BLOCK F0C8 20 F7 C JR NZ,MTST2 C ; NOW READ BACK EACH BYTE & COMPARE F0CA 62 C LD H,D F0CB 2E 00 C LD L,0 ;POINT HL BACK TO START F0CD 7D C MTST3: LD A,L F0CE AC C XOR H ;RE-GENERATE TEST BYTE DATA F0CF A8 C XOR B F0D0 BE C CP (HL) ;COMPARE EXPECTED MEMORY DATA WITH F0D1 20 05 C JR NZ,MTST4 ; ACTUAL CONTENTS @HL AND EXIT IF <> F0D3 23 C INC HL F0D4 7C C LD A,H F0D5 BB C CP E ;CHECK FOR END OF BLOCK F0D6 20 F5 C JR NZ,MTST3 F0D8 3A FF70 C MTST4: LD A,(DSCOPY) F0DB D3 C8 C OUT (PORT0),A F0DD FB C EI F0DE C9 C RET MACRO-80 3.4 01-Dec-80 PAGE 1-40 C ; C INCLUDE INTSRV.MAC C ;******************************************************** C ;* * C ;* INTERRUPT SERVICE ROUTINES FOR KEYBOARD * C ;* INPUT AND REAL-TIME CLOCK FUNCTIONS * C ;* * C ;******************************************************** C ; C ; C ; C ; F0DF 3A FF68 C KBDST: LD A,(FIFCNT) ;GET INPUT FIFO BYTECOUNT F0E2 B7 C OR A ;TEST IF EQUAL ZERO F0E3 C8 C RET Z ;EXIT WITH A=0 IF QUEUE IS EMPTY F0E4 3E FF C LD A,255 F0E6 C9 C RET ;ELSE SET A=255 TO INDICATE DATA READY C ; C ; C ; F0E7 CD F0DF C KBDIN: CALL KBDST F0EA 28 FB C JR Z,KBDIN ;LOOP UNTIL KEYBOARD INPUT READY F0EC E5 C PUSH HL F0ED CD F109 C CALL REMOVE ;GET CHARACTER FROM INPUT QUEUE F0F0 E1 C POP HL F0F1 C9 C RET C ; C ; C ; C ; C ; F0F2 4F C STASH: LD C,A ;PUT CHARACTER IN C F0F3 3A FF6B C LD A,(FIFSIZ) F0F6 E6 3F C AND 00111111B F0F8 47 C LD B,A ;PUT MAX FIFO SIZE IN B F0F9 21 FF68 C LD HL,FIFCNT ;BUMP FIFO CHARACTER COUNT F0FC 7E C LD A,(HL) F0FD 3C C INC A F0FE B8 C CP B F0FF D0 C RET NC ;EXIT NOW IF FIFO IS FULL F100 77 C LD (HL),A ; ELSE INCREMENT FIFO COUNT F101 21 FF69 C LD HL,FIFIN ;POINT HL TO FIFO INPUT OFFSET F104 CD F110 C CALL INDEX F107 71 C LD (HL),C ;STORE CHARACTER IN FIFO @ HL F108 C9 C RET C ; C ; C ; C ; F109 21 FF68 C REMOVE: LD HL,FIFCNT F10C 35 C DEC (HL) F10D 21 FF6A C LD HL,FIFOUT ;POINT HL TO FIFO OUTPUT OFFSET F110 7E C INDEX: LD A,(HL) F111 3C C INC A F112 E6 3F C AND 00111111B ;INCREMENT FIFO POINTER F114 77 C LD (HL),A ; MODULO 64 AND REPLACE MACRO-80 3.4 01-Dec-80 PAGE 1-41 F115 21 F65B C LD HL,FIFO F118 85 C ADD A,L ;INDEX INTO FIFO BY OFFSET IN A F119 6F C LD L,A F11A 7C C LD A,H F11B CE 00 C ADC A,0 ;CARRY ADD OUT TO 16 BITS F11D 67 C LD H,A F11E 7E C LD A,(HL) F11F C9 C RET C ; C ; C ; C ; C ; C ; C ; -- INTERRUPT SERVICE ROUTINE FOR PARALLEL KEYBOARD -- C ; F120 ED 73 F5B8 C KEYSRV: LD (IRQSAV),SP ;SAVE USER STACK POINTER AND F124 31 F5D2 C LD SP,IRQSTK ; SWITCH TO LOCAL STACK F127 E5 C PUSH HL F128 D5 C PUSH DE F129 C5 C PUSH BC F12A F5 C PUSH AF ;SAVE MACHINE STATE F12B DB D0 C IN A,(KBD) ;READ KEYBOARD INPUT PORT F12D 2A FF72 C LD HL,(KBDVEC) F130 CD F15A C CALL DISPATCH F133 F1 C POP AF F134 C1 C POP BC F135 D1 C POP DE F136 E1 C POP HL F137 ED 7B F5B8 C LD SP,(IRQSAV) F13B FB C RETI: EI ;RE-ENABLE INTERRUPTS AND RETURN F13C ED 4D C RETI C ; C ; C ; C ; -- INTERRUPT SERVICE ROUTINE FOR ONE MILLISECOND TIMER -- C ; F13E C MILLISEC: F13E ED 73 F5B8 C LD (IRQSAV),SP ;SAVE USER STACK POINTER AND F142 31 F5D2 C LD SP,IRQSTK ; SWITCH TO LOCAL STACK F145 E5 C PUSH HL F146 D5 C PUSH DE F147 C5 C PUSH BC F148 F5 C PUSH AF F149 2A FFA0 C LD HL,(STPVEC) F14C CD F15A C CALL DISPATCH ;CALL MILLISECOND INTERRUPT ROUTINE F14F F1 C POP AF F150 C1 C POP BC F151 D1 C POP DE F152 E1 C POP HL F153 ED 7B F5B8 C LD SP,(IRQSAV) F157 FB C EI F158 ED 4D C RETI C ; C ; C ; MACRO-80 3.4 01-Dec-80 PAGE 1-42 F15A C DISPATCH: F15A E9 C JP (HL) C ; C ; C ; C ; -- INTERRUPT SERVICE ROUTINE FOR CLOCK TICK INTERRUPT -- C ; F15B C TIMER: F15B ED 73 F5B8 C LD (IRQSAV),SP ;SAVE USER STACK POINTER AND F15F 31 F5D2 C LD SP,IRQSTK ; SWITCH TO LOCAL STACK F162 E5 C PUSH HL F163 D5 C PUSH DE F164 C5 C PUSH BC F165 F5 C PUSH AF F166 2A FF82 C LD HL,(TICKS) F169 23 C INC HL ;BUMP FREE RUNNING CLOCK TICK COUNTER F16A 22 FF82 C LD (TICKS),HL F16D 2A FF76 C LD HL,(TIKVEC) F170 CD F15A C CALL DISPATCH ;DO EXTRA CLOCK TICK ACTIVITY F173 21 FF85 C LD HL,TIKCNT F176 35 C DEC (HL) ;DECREMENT CLOCK TICK PRE-SCALER F177 20 0A C JR NZ,TIMER2 ;JUMP IF CURRENT SECOND NOT PASSED C F179 3A FF84 C LD A,(NTICKS) ;ELSE RELOAD TICK COUNT AND DO F17C 77 C LD (HL),A ; VARIOUS ONCE-A-SECOND THINGS F17D CD F260 C CALL CLOCK ;UPDATE TIME-OF-DAY CLOCK F180 CD F579 C CALL DISKTEST ;DO BACKGROUND DISK ACTIVITY MONITOR C F183 F1 C TIMER2: POP AF F184 C1 C POP BC F185 D1 C POP DE F186 E1 C POP HL F187 ED 7B F5B8 C LD SP,(IRQSAV) F18B FB C EI ;RE-ENABLE INTERRUPTS AND RETURN F18C ED 4D C RETI C ; C ; C ; -- INTERRUPT SERVICE ROUTINE FOR CRTC VSYNC INTERRUPT -- C ; F18E ED 73 F5B8 C VSYNC: LD (IRQSAV),SP ;SAVE USER STACK POINTER AND F192 31 F5D2 C LD SP,IRQSTK ; SWITCH TO LOCAL STACK F195 E5 C PUSH HL F196 D5 C PUSH DE F197 C5 C PUSH BC F198 F5 C PUSH AF F199 3A FF70 C LD A,(DSCOPY) F19C F5 C PUSH AF ;SAVE D/S CONTROL BYTE ON STACK F19D 3E 00 C LD A,DYSTAT+OFF F19F D3 C8 C OUT (PORT0),A ;SWITCH-ON STATIC MEMORY BANK C F1A1 3A FFB1 C LD A,(SCROLL) F1A4 B7 C OR A F1A5 28 20 C JR Z,VSYNC2 ;JUMP IF NO SCROLL REQUESTED THIS TIME F1A7 2A FFB2 C LD HL,(START) F1AA 3E 0C C LD A,12 F1AC D3 DC C OUT (CRTADD),A ;SELECT 6845 REGSITER #12 MACRO-80 3.4 01-Dec-80 PAGE 1-43 F1AE 7C C LD A,H F1AF D3 DD C OUT (CRTDAT),A ;OUTPUT MSB OF START ADDRESS F1B1 3E 0D C LD A,13 F1B3 D3 DC C OUT (CRTADD),A ;SELECT 6845 REGISTER #13 F1B5 7D C LD A,L F1B6 D3 DD C OUT (CRTDAT),A ;OUTPUT LSB OF START ADDRESS F1B8 ED 5B FFB4 C LD DE,(NEWLIN) F1BC 19 C ADD HL,DE ;GET RELATIVE ADDRESS OF NEW BLANK LINE F1BD 7C C LD A,H F1BE E6 07 C AND 00000111B ;MAKE SURE TO ROLL-AROUND MOD 2048 F1C0 67 C LD H,A F1C1 01 0050 C LD BC,80 F1C4 CD 035E C CALL CLRLINE ;CLEAR NEW BOTTOM LINE ON SCREN C F1C7 2A FFB9 C VSYNC2: LD HL,(OLDCSR) ;POINT TO LAST CURSOR ATTRIBUTE BYTE F1CA 7E C LD A,(HL) F1CB CB 7F C BIT 7,A ;TEST MSB (INDICATES CURSOR ACTIVE) F1CD 28 03 C JR Z,VSYNC3 ;JUMP IF CURSOR HAS BEEN WRITTEN OVER F1CF EE 90 C XOR 10010000B ;ELSE CLEAR MSB AND COMPLIMENT REVERSE F1D1 77 C LD (HL),A ; VIDEO BIT TO REMOVE CURSOR F1D2 2A FFB7 C VSYNC3: LD HL,(CURSOR) F1D5 11 7000 C LD DE,ATTMEM F1D8 19 C ADD HL,DE ;POINT TO ATTRIBUTE FOR NEW CURSOR F1D9 7E C LD A,(HL) F1DA EE 90 C XOR 10010000B ;SET MSB AND COMPLIMENT REVERSE VIDEO F1DC 77 C LD (HL),A ; TO CREATE NEW CURSOR ATTRIBUTE BYTE F1DD 22 FFB9 C LD (OLDCSR),HL ;STORE POINTER FOR NEXT CURSOR UPDATE C F1E0 3E 03 C LD A,00000011B F1E2 D3 87 C OUT (CTCA3),A ;TURN OFF VSYNC INTERRUPT F1E4 AF C XOR A F1E5 32 FFB1 C LD (SCROLL),A ;RESET SCROLL-REQUEST FLAG F1E8 32 FFB6 C LD (MOVECS),A ;RESET CURSOR-MOVE-REQUEST FLAG C F1EB F1 C POP AF ;POP MEMORY CONTROL BYTE OFF STACK F1EC D3 C8 C OUT (PORT0),A ;SWITCH BACK TO PRE-INTERRUPT CONFIG F1EE F1 C POP AF F1EF C1 C POP BC F1F0 D1 C POP DE F1F1 E1 C POP HL F1F2 ED 7B F5B8 C LD SP,(IRQSAV) F1F6 FB C EI ;RE-ENABLE INTERRUPTS AND RETURN F1F7 ED 4D C RETI C ; C ; C ; C ; POLLED MODE I/O ROUTINES FOR SIO CHANEL B C ; F1F9 DB 83 C SIOST: IN A,(SIOCPB) ;GET SIO STATUS REGISTER F1FB E6 01 C AND 00000001B F1FD C8 C RET Z ;ACC=0 IF NO DATA AVAILABLE F1FE 3E FF C LD A,255 F200 C9 C RET C ; C ; F201 CD F1F9 C SIOIN: CALL SIOST ;TEST CONSOLE STATUS MACRO-80 3.4 01-Dec-80 PAGE 1-44 F204 28 FB C JR Z,SIOIN ;LOOP UNTIL DATA IS F206 DB 82 C IN A,(SIODPB) ; READY AT SIO DATA PORT F208 E6 7F C AND 01111111B F20A C9 C RET C ; C ; C ; C ; -- RX INTERRUPT SERVICE ROUTINE FOR SIO CONSOLE -- C ; C F20B C SIOINT: F20B ED 73 F5B8 C LD (IRQSAV),SP F20F 31 F5D2 C LD SP,IRQSTK F212 E5 C PUSH HL F213 D5 C PUSH DE F214 C5 C PUSH BC F215 F5 C PUSH AF F216 21 FF6E C LD HL,SIOADR+1 F219 4E C LD C,(HL) ;LOAD C WITH SIO DATA PORT# F21A ED 78 C IN A,(C) F21C E6 7F C AND 01111111B F21E 2A FF74 C LD HL,(RDAVEC) F221 CD F15A C CALL DISPATCH ;GO PROCESS SIO INPUT CHARACTER F224 F1 C POP AF F225 C1 C POP BC F226 D1 C POP DE F227 E1 C POP HL F228 ED 7B F5B8 C LD SP,(IRQSAV) F22C FB C EI F22D ED 4D C RETI C ; C ; C ; -- RX ERROR INTERRUPT SERVICE ROUTINE FOR SIO CONSOLE -- C ; F22F C SIOERR: F22F ED 73 F5B8 C LD (IRQSAV),SP F233 31 F5D2 C LD SP,IRQSTK F236 F5 C PUSH AF F237 C5 C PUSH BC F238 3A FF6D C LD A,(SIOADR) F23B 4F C LD C,A ;LOAD C WITH SIO CONTROL PORT# F23C 3E 30 C LD A,00110000B F23E ED 79 C OUT (C),A ;RESET SIO EXTERNAL STATUS/INTERRUPTS F240 3A FF6E C LD A,(SIOADR+1) F243 4F C LD C,A ;NOW LOAD C WITH DATA PORT# F244 ED 78 C IN A,(C) ;INPUT AND DISCARD BAD CHARACTER F246 C1 C POP BC F247 F1 C POP AF F248 FB C EI F249 ED 4D C RETI C ; C ; C ; C ; C ; F24B C SIOOUT: MACRO-80 3.4 01-Dec-80 PAGE 1-45 F24B C5 C PUSH BC F24C F5 C PUSH AF F24D 3A FF6D C LD A,(SIOADR) F250 4F C LD C,A ;LOAD C WITH SIO STATUS PORT# F251 ED 78 C SIOUT1: IN A,(C) F253 E6 04 C AND 00000100B ;TEST TBE STATUS BIT F255 28 FA C JR Z,SIOUT1 F257 3A FF6E C LD A,(SIOADR+1) F25A 4F C LD C,A ;LOAD C WITH SIO DATA PORT# NOW F25B F1 C POP AF F25C ED 79 C OUT (C),A ;OUTPUT DATA TO SIO F25E C1 C POP BC F25F C9 C RET C ; C ; C ; C ; C ; C ; F260 11 FF7C C CLOCK: LD DE,TOD ;POINT DE TO START OF TIME-OF-DAY F263 21 F277 C LD HL,TODTAB ;POINT HL TO HH:MM:SS TABLE F266 06 04 C LD B,4 F268 1A C CLOCK2: LD A,(DE) F269 C6 01 C ADD A,1 ;INCREMENT TIME WITH ADD INSTRUCTION F26B 27 C DAA ; SO DECIMAL ADJUST WILL WORK RIGHT F26C BE C CP (HL) ;COMPARE IF HH/MM/SS ROLLED OVER F26D 38 01 C JR C,CLOCK3 F26F AF C XOR A ;RESET TO ZERO IF ROLL OVER F270 12 C CLOCK3: LD (DE),A ;STORE UPDATED TIME DATA F271 D8 C RET C ;EXIT IF NO MORE NEEDS TO BE DONE F272 23 C INC HL F273 13 C INC DE ;ELSE POINT TO NEXT DATA & CONSTANT F274 10 F2 C DJNZ CLOCK2 F276 C9 C CLOCK4: RET C F277 60 C TODTAB: DEFB 60H ;60 SECONDS/MINUTE F278 60 C DEFB 60H ;60 MINUTES/HOUR F279 24 C DEFB 24H ;24 HOURS/DAY F27A 99 C DEFB 99H ;OVERFLOW TO DAYS C ; C ; C ; C INCLUDE DISKIO.MAC C ;******************************************************** C ;* * C ;* DISK I/O DRIVER FOR BETTERBOARD 24-JUNE-82 * C ;* * C ;******************************************************** C ; C ; C ; EQUATES FOR DISK CONTROLLER PORTS AND COMMAND CODES C ; 00D4 C STSREG EQU WD179X+0 ;STATUS REGISTER 00D4 C CMDREG EQU WD179X+0 ;COMMAND REGISTER 00D5 C TRKREG EQU WD179X+1 ;TRACK REGISTER 00D6 C SECREG EQU WD179X+2 ;SECTOR REGISTER MACRO-80 3.4 01-Dec-80 PAGE 1-46 00D7 C DATREG EQU WD179X+3 ;DATA REGISTER C ; C ; 0088 C RDCMD EQU 10001000B ;READ COMMAND 00C0 C RIDCMD EQU 11000000B ;READ ID COMMAND 00A8 C WRTCMD EQU 10101000B ;WRITE COMMAND 001C C SKCMD EQU 00011100B ;SEEK COMMAND 0008 C RSTCMD EQU 00001000B ;RESTORE COMMAND 00D0 C FINCMD EQU 11010000B ;FORCE INTERRUPT COMMAND 0060 C STEPOUT EQU 01100000B ;STEP OUT COMMAND 0040 C STEPIN EQU 01000000B ;STEP IN COMMAND C ; C ; C ; C ; F27B C SELECT: F27B 79 C LD A,C ;GET UNIT# PASSED IN C AND F27C FE 04 C CP 4 ; CHECK FOR MAXIMUM VALID# F27E D0 C RET NC ;ERROR IF UNIT# > 3 C F27F CD F2BB C CALL DSEL ;DERRIVE NEW DRIVE SELECT BIT PATTERN F282 CD F518 C CALL READY ;EMIT NEW SELECT BITS AND TEST READY F285 20 30 C JR NZ,SELX ;JUMP IF DRIVE NOT READY C F287 21 FF86 C LD HL,UNIT F28A 16 00 C LD D,0 F28C 5E C LD E,(HL) ;LOAD DE WITH LAST SELECTED DRIVE UNIT# F28D 71 C LD (HL),C ;THEN STORE NEW UNIT# PASSED IN C C F28E 21 FF88 C LD HL,TRKTAB F291 19 C ADD HL,DE ;INDEX INTO HEAD POSITION TABLE F292 3A FF87 C LD A,(TRACK) F295 77 C LD (HL),A ;STORE PREVIOUS DRIVE'S TRACK NUMBER F296 1E 04 C LD E,4 F298 19 C ADD HL,DE ;NOW INDEX TO DENSITY BYTE FOR UNIT F299 3A FF96 C LD A,(DSKTYP) F29C E6 01 C AND 00000001B F29E 77 C LD (HL),A ;REMEMBER CURRENT DENSITY CONTROL BIT C F29F 21 FF88 C LD HL,TRKTAB F2A2 59 C LD E,C ;INDEX INTO TABLE TO GET LAST KNOWN F2A3 19 C ADD HL,DE ; HEAD POSITION OF NEW DRIVE F2A4 7E C LD A,(HL) F2A5 D3 D5 C OUT (TRKREG),A ;OUTPUT THE DRIVE'S CURRENT HEAD F2A7 32 FF87 C LD (TRACK),A ; POSITION TO THE 179X AND SAVE F2AA 1E 04 C LD E,4 F2AC 19 C ADD HL,DE ;INEDX TO NEW DRIVE'S DENSITY SETTING F2AD 3A FF96 C LD A,(DSKTYP) F2B0 E6 FE C AND 11111110B ;MERGE IN NEW DENSITY CONTROL BIT F2B2 B6 C OR (HL) F2B3 CD F3B9 C CALL SETDENS ;SET DENSITY CONTROLS F2B6 AF C XOR A ;INDICATE SELECT WAS SUCCESSFUL C F2B7 CD F538 C SELX: CALL SETTIMER ;RESET DRIVE TURN-OFF TIMER F2BA C9 C RET C ; MACRO-80 3.4 01-Dec-80 PAGE 1-47 C ; C ; C ; F2BB C DSEL: F2BB 21 F2C9 C LD HL,SELTAB ;POINT TO DRIVE SELECT BITS TABLE F2BE E6 03 C AND 00000011B F2C0 16 00 C LD D,0 F2C2 5F C LD E,A F2C3 19 C ADD HL,DE ;ADD UNIT# TO HL TO INDEX INTO TABLE F2C4 7E C LD A,(HL) F2C5 32 FF9F C LD (SELCPY),A ;STORE NEW STATE OF SELECT/MUX PORT F2C8 C9 C RET C F2C9 8A C SELTAB: DEFB 10001010B ;BITS FOR UNIT #0 F2CA 4A C DEFB 01001010B ;BITS FOR UNIT #1 F2CB 2A C DEFB 00101010B ;BITS FOR UNIT #2 F2CC 1A C DEFB 00011010B ;BITS FOR UNIT #3 C ; C ; C ; C ; C ; F2CD C HOME: F2CD 0E 00 C LD C,0 ;TREAT HOME AS SEEK TO TRACK ZERO F2CF C SEEK: F2CF CD F518 C CALL READY F2D2 20 24 C JR NZ,SEEKX ;EXIT IF DRIVE NOT READY C F2D4 3A FF87 C LD A,(TRACK) F2D7 91 C SUB C ;TEST IF ALREADY AT DESIRED TRACK F2D8 28 1E C JR Z,SEEKX ;EXIT WITH ACC=0 IF SO C F2DA 3A FF87 C LD A,(TRACK) ;GET CURRENT TRACK# INTO ACC F2DD FE FF C CP 255 ;TEST IF HEAD POSITION IS F2DF 20 0B C JR NZ,SEEK2 ; KNOWN GOOD AND JUMP IF SO C F2E1 3E 0B C LD A,RSTCMD+3 F2E3 CD F4EF C CALL DISKOP ;EXECUTE RESTORE AT SLOWEST STEP SPEED F2E6 EE 04 C XOR 00000100B ;COMPLIMENT TRK0 STATUS BIT F2E8 E6 85 C AND 10000101B F2EA 20 0C C JR NZ,SEEKX ;EXIT IF RESTORE CANNOT BE DONE C F2EC 47 C SEEK2: LD B,A ;PUT STARTING TRACK# INTO B F2ED CD F2FC C CALL FINDTRK ;GO LOOKING FOR TRACK# IN C F2F0 F5 C PUSH AF F2F1 79 C LD A,C F2F2 32 FF87 C LD (TRACK),A ;STORE FINAL TRACK# (C=255 IF ERROR) F2F5 D3 D5 C OUT (TRKREG),A ;ALSO PUT IN 179X TRACK REGISTER F2F7 F1 C POP AF C F2F8 CD F538 C SEEKX: CALL SETTIMER ;RESET DRIVE TURN-OFF TIMER F2FB C9 C RET ;RETURN WITH COMPLETION STATUS IN ACC C ; C ; C ; C ; MACRO-80 3.4 01-Dec-80 PAGE 1-48 F2FC C FINDTRK: F2FC 3E 07 C LD A,7 F2FE 32 FF9B C LD (FNDTRY),A ;SET RETRY COUNT FOR HEAD POSITIONING F301 C5 C FTRK2: PUSH BC F302 CD F324 C CALL STEP ;HAVE A GO AT STEPPING TO TRACK IN C F305 C1 C POP BC F306 20 19 C JR NZ,FTRK4 ;JUMP IF READY/NOT FOUND/CRC/BUSY ERROR C F308 DB D6 C IN A,(SECREG) F30A 47 C LD B,A ;PUT ACTUAL CURRENT TRACK# INTO B F30B 91 C SUB C ;COMPARE IF WE GOT THERE THIS TIME F30C C8 C RET Z ;EXIT WITH ACC=0 IF TRACK# VERIFIED C F30D 3A FF9B C LD A,(FNDTRY) F310 FE 07 C CP 7 F312 28 04 C JR Z,FTRK3 ;JUMP IF ON FIRST OR SECOND RETRY F314 21 FF90 C LD HL,SPEED F317 34 C INC (HL) ;ELSE REDUCE STEP SPEED BY 1 MILLISEC F318 3D C FTRK3: DEC A F319 32 FF9B C LD (FNDTRY),A ;DECREMENT SEEK RETRY COUNT AND KEEP F31C 20 E3 C JR NZ,FTRK2 ; TRYING OVER (POSSIBLY AT SLOWER RATE) C F31E 3E 10 C LD A,00010000B ;INDICATE PERMANENT SEEK ERROR F320 B7 C OR A F321 0E FF C FTRK4: LD C,255 ;SET C=255 AS BAD TRACK INDICATOR F323 C9 C RET ;RETURN WITH SEEK ERROR STATUS IN A C ; C ; C ; C ; C ; C ; C ; STEP FROM TRACK# IN B TOWARDS TRACK# IN C C ; F324 C STEP: F324 16 60 C LD D,STEPOUT ;D WILL CARRY STEP OUT/IN COMMAND F326 78 C LD A,B F327 91 C SUB C ;GET DIFFERENCE BETWEEN TRACK NUMS F328 30 04 C JR NC,STEP2 ;JUMP IF SEEK TOWARDS OUTER TRACKS F32A 16 40 C LD D,STEPIN F32C 79 C LD A,C F32D 90 C SUB B ;ELSE SWAP DIRECTION AND DIFFERENCE F32E 28 2A C STEP2: JR Z,STEP4 ;GO DO VERIFY IF NO STEPS NEEDED C F330 32 FFA3 C LD (STPCNT),A ;ELSE STORE STEP COUNT AND STEP IN/OUT F333 7A C LD A,D ; COMMAND BYTE CARRIED IN D F334 32 FFA2 C LD (STPCMD),A F337 3E 01 C LD A,1 F339 32 FFA4 C LD (STPDLY),A F33C 21 F35E C LD HL,DOSTEP ;START STEPPER FINITE STATE MACHINE F33F 22 FFA0 C LD (STPVEC),HL F342 3A FF9F C LD A,(SELCPY) F345 CB 9F C RES 3,A ;MAKE 179X TEST INPUT LOW TO DISABLE F347 D3 CC C OUT (SELMUX),A ; INTERNAL OPERATION TIME DELAYS F349 3E 81 C LD A,10000001B F34B D3 8A C OUT (CTCB2),A ;START CTC 1 MILLISECOND INTERRUPT MACRO-80 3.4 01-Dec-80 PAGE 1-49 F34D 3A FFA3 C STEP3: LD A,(STPCNT) F350 B7 C OR A F351 20 FA C JR NZ,STEP3 ;LOOP UNTIL STEP COUNTER REACHES ZERO F353 3A FF9F C LD A,(SELCPY) F356 CB DF C SET 3,A ;TAKE 179X TEST PIN BACK HIGH F358 D3 CC C OUT (SELMUX),A C F35A CD F395 C STEP4: CALL VERIFY ;ELSE READ AN ID-MARK TO VERIFY SEEK F35D C9 C STEPX: RET C ; C ; C ; C ; .... ROUTINES FOR INTERRUPT DRIVEN SEEK FUNCTION .... C ; F35E C DOSTEP: F35E 21 FFA4 C LD HL,STPDLY F361 35 C DEC (HL) ;DECREMENT STEP SPEED DELAY COUNT F362 C0 C RET NZ ;EXIT IF NOT TIME TO ISSUE STEP CMD C F363 3A FFA2 C LD A,(STPCMD) F366 D3 D4 C OUT (CMDREG),A ;OUTPUT STEP IN/OUT COMMAND TO 179X F368 3A FFA3 C LD A,(STPCNT) F36B 3D C DEC A ;DECREMENT STEP COUNT F36C 28 08 C JR Z,DOSTP2 ;JUMP IF LAST STEP TO BE DONE C F36E 32 FFA3 C LD (STPCNT),A ;ELSE STORE DECREMENTED COUNT F371 3A FF90 C LD A,(SPEED) F374 77 C LD (HL),A ;STORE STEP SPEED FOR NEXT OPERATION F375 C9 C RET C ; F376 3A FF91 C DOSTP2: LD A,(SETTLE) F379 77 C LD (HL),A ;STORE HEAD SETTLING TIME PARAMETER F37A 21 F381 C LD HL,DOSETTLE F37D 22 FFA0 C LD (STPVEC),HL ;DO SETTLING DELAY ON NEXT INTERRUPT F380 C9 C RET C ; C ; C ; F381 C DOSETTLE: F381 21 FFA4 C LD HL,STPDLY F384 35 C DEC (HL) ;DECREMENT SETTLING TIME DELAY COUNT F385 C0 C RET NZ C F386 AF C XOR A F387 32 FFA3 C LD (STPCNT),A ;SET STEP COUNT TO ZERO WHEN FINISHED F38A 21 F2F8 C LD HL,SEEKX F38D 22 FFA0 C LD (STPVEC),HL ;PUT SEEK FSM TO SLEEP F390 3E 01 C LD A,00000001B F392 D3 8A C OUT (CTCB2),A ;STOP 1 MILLISECOND INTERRUPT F394 C9 C RET C ; C ; C ; C ; F395 C VERIFY: F395 3E C0 C LD A,RIDCMD MACRO-80 3.4 01-Dec-80 PAGE 1-50 F397 CD F4EF C CALL DISKOP ;READ NEXT ID-MARK TO VERIFY SEEK F39A E6 99 C AND 10011001B F39C 28 0A C JR Z,VERFY2 ;JUMP IF ID MARK READ SUCCESSFULLY C F39E CD F3B4 C CALL FLIPDENS ;ELSE SWITCH DISK DENSITY CONFIGURATION F3A1 3E C0 C LD A,RIDCMD F3A3 CD F4EF C CALL DISKOP ;TRY AGAIN IN NEW DENSITY F3A6 E6 99 C AND 10011001B F3A8 F5 C VERFY2: PUSH AF ;SAVE STATUS OF READ-ID F3A9 CD F510 C CALL FORCE ;CLEAR OVERRUN AND DRQ BITS IN 179X F3AC F1 C POP AF F3AD C8 C RET Z ;EXIT IF AN ID MARK WAS FOUND C F3AE F5 C PUSH AF F3AF CD F3B4 C CALL FLIPDENS ;ELSE GO BACK TO ORIGINAL DENSITY F3B2 F1 C POP AF F3B3 C9 C RET ;RETURN WITH ERROR INDICATED C ; C ; C ; C ; F3B4 C FLIPDENS: F3B4 3A FF96 C LD A,(DSKTYP) F3B7 EE 01 C XOR 00000001B ;COMPLIMENT DENSITY BIT OF DRIVE TYPE F3B9 C SETDENS: F3B9 32 FF96 C LD (DSKTYP),A F3BC E6 03 C AND 00000011B F3BE 06 00 C LD B,0 F3C0 4F C LD C,A F3C1 21 F3CE C LD HL,SMCTAB F3C4 09 C ADD HL,BC ;INDEX INTO SMC DATA SEPARATOR CONTROL F3C5 09 C ADD HL,BC ; BYTE TABLE FOR NEW DENSITY SETTING F3C6 09 C ADD HL,BC F3C7 06 03 C LD B,3 F3C9 0E C8 C LD C,PORT0 F3CB ED B3 C OTIR ;OUTPUT 3 BYTES TO SET DISK DENSITY F3CD C9 C RET C F3CE 0A C SMCTAB: DEFB SMC1+ON ;8 INCH SINGLE DENSITY F3CF 03 C DEFB SMC2+OFF F3D0 0C C DEFB DDEN+ON F3D1 02 C DEFB SMC1+OFF ;8 INCH DOUBLE DENSITY F3D2 03 C DEFB SMC2+OFF F3D3 04 C DEFB DDEN+OFF F3D4 02 C DEFB SMC1+OFF ;5 INCH SINGLE DENSITY F3D5 0B C DEFB SMC2+ON F3D6 0C C DEFB DDEN+ON F3D7 0A C DEFB SMC1+ON ;5 INCH DOUBLE DENSITY F3D8 03 C DEFB SMC2+OFF F3D9 04 C DEFB DDEN+OFF C ; C ; C ; C ; C ; F3DA C READID: MACRO-80 3.4 01-Dec-80 PAGE 1-51 F3DA CD F518 C CALL READY ;CLEAR DISK CONTROLLER F3DD 20 13 C JR NZ,RDIDX ;EXIT IF DRIVE NOT READY C F3DF 06 C0 C LD B,RIDCMD F3E1 CD F416 C CALL RDWRT ;READ ID RECORD INTO BUFFER (HL) F3E4 20 0C C JR NZ,RDIDX ;EXIT IF DISK ERROR C F3E6 2A FF9D C LD HL,(IOPTR) F3E9 11 0006 C LD DE,6 F3EC 19 C ADD HL,DE ;POINT TO 7TH BYTE AFTER ID RECORD F3ED 3A FF96 C LD A,(DSKTYP) F3F0 77 C LD (HL),A ;STORE DISK TYPE BYTE THERE F3F1 AF C XOR A C F3F2 CD F538 C RDIDX: CALL SETTIMER ;RESET DRIVE TURN-OFF TIMER F3F5 C9 C RET C ; C ; C ; C ; F3F6 C WRITE: F3F6 CD F518 C CALL READY ;CLEAR THE DISK CONTROLLER F3F9 20 09 C JR NZ,WRITEX ;EXIT IF DRIVE NOT READY C F3FB CB 77 C BIT 6,A F3FD 20 05 C JR NZ,WRITEX ;EXIT IF DISK IS WRITE-PROTECTED C F3FF 06 A8 C LD B,WRTCMD F401 CD F416 C CALL RDWRT C F404 CD F538 C WRITEX: CALL SETTIMER ;RESET DISK TIMER F407 C9 C RET C ; C ; C ; C ; F408 C READ: F408 CD F518 C CALL READY ;CLEAR DISK CONTROLLER F40B 20 05 C JR NZ,READX ;EXIT IF DRIVE NOT READY C F40D 06 88 C LD B,RDCMD F40F CD F416 C CALL RDWRT C F412 CD F538 C READX: CALL SETTIMER ;RESET DISK TIMER F415 C9 C RET C ; C ; C ; C ; C ; F416 C RDWRT: F416 22 FF9D C LD (IOPTR),HL ;STORE DISK I/O DATA POINTER F419 79 C LD A,C F41A 32 FF98 C LD (SECTOR),A ;STORE SECTOR# FOR READ/WRITE F41D 78 C LD A,B F41E 32 FF99 C LD (CMDTYP),A ;STORE READ/WRITE/READID COMMAND BYTE MACRO-80 3.4 01-Dec-80 PAGE 1-52 F421 3A FF97 C LD A,(MAXRWT) F424 32 FF9A C LD (RWTRY),A ;SET DISK OPERATION RE-TRY COUNT C F427 3A FF98 C RW1: LD A,(SECTOR) ;OUTPUT SECTOR NUMBER FOR READ/WRITE F42A D3 D6 C OUT (SECREG),A F42C 21 F4DB C LD HL,DMAPGM ;PREPARE TO OUTPUT DMA INITIALIZATION F42F 06 08 C LD B,8 F431 0E 8C C LD C,DMA F433 ED B3 C OTIR ;FIRST 6 BYTES ARE DMA RESETS F435 ED 5B FF92 C LD DE,(BLKSIZ) F439 ED 59 C OUT (C),E ;NEXT TWO BYTES ARE MAX DMA BLOCKCOUNT F43B ED 51 C OUT (C),D F43D 06 03 C LD B,3 F43F ED B3 C OTIR ;NEXT 3 BYTES ARE CONSTANTS F441 ED 5B FF9D C LD DE,(IOPTR) F445 ED 59 C OUT (C),E ;NEXT 2 BYTES ARE TRANSFER ADDRESS F447 ED 51 C OUT (C),D F449 ED A3 C OUTI ;NEXT BYTE SETS READY/WAIT/RESTART F44B 06 04 C LD B,4 F44D 3A FF99 C LD A,(CMDTYP) ;GET READ OR WRITE COMMAND BYTE F450 FE A8 C CP WRTCMD F452 28 04 C JR Z,RW2 ;JUMP IF DISK OPERATION IS A WRITE F454 23 C INC HL F455 23 C INC HL ;ELSE SKIP NEXT TWO BYTES IN DMA PGM F456 06 02 C LD B,2 F458 ED B3 C RW2: OTIR ;OUTPUT LAST OF DMA PROGRAM BYTES F45A CD F4EF C CALL DISKOP ;DO 179X COMMAND AND LOOP TILL INTRQ F45D 06 04 C LD B,4 F45F ED B3 C OTIR ;DISABLE DMA AND INITIATE READ SEQUENCE F461 ED 68 C IN L,(C) F463 ED 60 C IN H,(C) ;READ BYTECOUNT INTO HL F465 E6 9F C AND 10011111B ;MASK READY/RNF/CRC/OVERRUN/DRQ/BUSY F467 C8 C RET Z ;RETURN IF NO DISK I/O ERRORS C F468 32 FF9C C LD (ERRTYP),A F46B CD F47B C CALL RECOVER ;DO READ/WRITE ERROR RECOVERY ROUTINE F46E 20 06 C JR NZ,RW3 ;SKIP RETRY IF IRRECOVERABLE ERROR F470 21 FF9A C LD HL,RWTRY F473 35 C DEC (HL) F474 20 B1 C JR NZ,RW1 ;ELSE DECREMENT RETRY COUNT TILL=0 F476 3A FF9C C RW3: LD A,(ERRTYP) F479 B7 C OR A F47A C9 C RET ;RETURN ORIGINAL ERROR CONDITION IN ACC C ; C ; C ; C ; F47B C RECOVER: F47B 47 C LD B,A F47C E6 87 C AND 10000111B ;ISOLATE READY/OVERRUN/DRQ/BUSY ERRORS F47E 28 06 C JR Z,RECOV1 ; AND JUMP IF NONE OF THOSE IS SET C F480 CD F510 C CALL FORCE ;CLEAR ERROR FLAGS IN 179X STATUS REG F483 78 C LD A,B F484 B7 C OR A ;RETURN ERROR STATUS IN ACC F485 C9 C RET MACRO-80 3.4 01-Dec-80 PAGE 1-53 C ; C ; ARRIVE HERE IF CRC OR RECORD-NOT-FOUND ERROR C ; F486 CB 60 C RECOV1: BIT 4,B F488 20 1F C JR NZ,RECOV3 ;JUMP IF SECTOR ID RECORD NOT FOUND C ; C ; ERROR IS DUE TO BAD CRC IN DATA OR ID FIELD C ; F48A 3A FF9A C RECOV2: LD A,(RWTRY) F48D 21 FF97 C LD HL,MAXRWT F490 96 C SUB (HL) ;TEST IF THIS IS FIRST CRC ERROR RETRY F491 C8 C RET Z ;IF SO EXIT AND ALLOW RETRY TO BE DONE C F492 DB D5 C IN A,(TRKREG) ;ELSE PREPARE TO WIGGLE BACK AND FORTH F494 47 C LD B,A ; TO AN ADJACENT TRACK TO RE-CALIBRATE F495 B7 C OR A ; AND REMOVE POSSIBLE MEDIA CONTAMINANT F496 20 04 C JR NZ,RCOV2A F498 0E 01 C LD C, 1 ;STEP TO TRACK#1 IF ON TRACK# 0 F49A 18 02 C JR RCOV2B C ; F49C 3D C RCOV2A: DEC A ;STEP TO NEXT OUTER TRACK F49D 4F C LD C,A F49E C5 C RCOV2B: PUSH BC F49F CD F324 C CALL STEP ;STEP HEAD TO ADJACENT TRACK F4A2 D1 C POP DE F4A3 43 C LD B,E ;EXCHANGE CONTENTS OF B AND C F4A4 4A C LD C,D F4A5 CD F324 C CALL STEP ;STEP BACK TO ORIGINAL TRACK F4A8 C9 C RET C ; C ; ARRIVE HERE IF RECORD-NOT-FOUND ERROR C ; F4A9 3A FF96 C RECOV3: LD A,(DSKTYP) ;SAVE DENSITY CONTROL BYTE BEFORE F4AC F5 C PUSH AF ; CALLING TRACK VERIFY ROUTINE F4AD CD F395 C CALL VERIFY ;DO A READ-ID COMMAND TO SEE IF ANY F4B0 D1 C POP DE ; SECTOR ON THIS TRACK CAN BE READ F4B1 C0 C RET NZ ;ERROR IF NO ID MARK FOUND C F4B2 3A FF99 C LD A,(CMDTYP) F4B5 FE C0 C CP RIDCMD ;BYPASS TRACK# CHECK IF DOING READ-ID F4B7 28 16 C JR Z,RECOV4 F4B9 DB D6 C IN A,(SECREG) ;TEST IF CONTENTS OF TRACK REGISTER F4BB 47 C LD B,A ; MATCHES TRACK# FROM ID MARK JUST F4BC DB D5 C IN A,(TRKREG) ; READ (179X PUTS TRK# IN SECTOR REG) F4BE 4F C LD C,A F4BF B8 C CP B F4C0 28 0D C JR Z,RECOV4 ;JUMP IF HEAD IS ON CORRECT TRACK C F4C2 FE FF C CP 255 ;ERROR IF TRKREG SET TO 255 PREVIOUSLY F4C4 28 11 C JR Z,RECOV5 F4C6 CD F2FC C CALL FINDTRK ;ELSE GO TO TRACK=C FROM TRACK=B F4C9 F5 C PUSH AF F4CA 79 C LD A,C ;PUT FINAL TRACK# IN 179X TRACK F4CB D3 D5 C OUT (TRKREG),A ; REGISTER (C=255 IF SEEK ERROR) F4CD F1 C POP AF F4CE C9 C RET ;RETURN COMPLETION STATUS IN ACC MACRO-80 3.4 01-Dec-80 PAGE 1-54 C ; C ; ERROR IS DUE TO NON-EXISTENT SECTOR# OR BEING IN WRONG DENSITY C ; F4CF 3A FF96 C RECOV4: LD A,(DSKTYP) F4D2 BA C CP D ;SEE IF DENSITY WAS CHANGED BY 'VERIFY' F4D3 28 02 C JR Z,RECOV5 ; AND EXIT WITH RNF ERROR IF NOT F4D5 AF C XOR A ;CLEAR ACC TO INDICATE RETRY SHOULD F4D6 C9 C RET ; BE DONE NOW THAT DENSITY IS SET RIGHT C ; F4D7 3E 10 C RECOV5: LD A,00010000B F4D9 B7 C OR A ;INDICATE ERROR DUE TO NON-EXISTENT F4DA C9 C RET ; SECTOR OR INDETERMINATE TRACK# C ; C ; C ; C ; F4DB C3 C DMAPGM: DEFB 11000011B ;DMA RESET COMMAND F4DC C3 C DEFB 11000011B F4DD C3 C DEFB 11000011B F4DE C3 C DEFB 11000011B F4DF C3 C DEFB 11000011B F4E0 C3 C DEFB 11000011B F4E1 6D C DEFB 01101101B ;XFER A->B, PORT A AND BYTCNT FOLLOWS F4E2 D7 C DEFB DATREG C F4E3 2C C DEFB 00101100B ;PORT A IS I/O, FIXED ADDRESS F4E4 10 C DEFB 00010000B ;PORT B IS MEMORY, INCREMENTING ADDRESS F4E5 8D C DEFB 10001101B ;SINGLE BYTE MODE, PORT B FOLLOWS C F4E6 8A C DEFB 10001010B ;HIGH=RDY, /CE NOT MUXED, NO RESTART C F4E7 CF C DEFB 11001111B ;LOAD DESTINATION ADDRESS F4E8 01 C DEFB 00000001B ;XFER B->A, NOTHING FOLLOWS F4E9 CF C DEFB 11001111B ;LOAD SOURCE ADDRESS F4EA 87 C DEFB 10000111B ;ENABLE DMA C F4EB 83 C DEFB 10000011B ;DISABLE DMA F4EC BB C DEFB 10111011B ;READ MASK FOLLOWS F4ED 06 C DEFB 00000110B ;MASK FOR BYTECOUNT HIGH/LOW F4EE A7 C DEFB 10100111B ;INITIATE READ SEQUENCE C ; C ; C ; C ; C ; F4EF C DISKOP: F4EF CD F508 C CALL CMDOUT F4F2 AF C XOR A ;RESET SECONDS-NOT-READY COUNT FOR F4F3 32 FFA7 C LD (RDYCNT),A ; FOR USE AS LOOP EXIT TIMER F4F6 DB D4 C DSKOP2: IN A,(STSREG) F4F8 CB 47 C BIT 0,A ;TEST DISK CONTROLLER BUSY STATUS BIT F4FA C8 C RET Z ;EXIT IF BUSY BIT GOES AWAY C F4FB 3A FFA7 C LD A,(RDYCNT) ;ELSE TEST IF NOT-READY COUNTER HAS F4FE B7 C OR A ; BEEN BUMPED BY BACKGROUND SCAN F4FF 28 F5 C JR Z,DSKOP2 ;KEEP LOOKING IF STILL READY MACRO-80 3.4 01-Dec-80 PAGE 1-55 C F501 CD F510 C CALL FORCE ;ELSE ABORT DISK COMMAND F504 3E 01 C LD A,00000001B F506 B7 C OR A ;RETURN WITH 179X BUSY ERROR INDICATED F507 C9 C RET C ; C ; C ; C ; F508 C CMDOUT: F508 D3 D4 C OUT (CMDREG),A ;OUTPUT DISK CONTROLLER COMMAND BYTE F50A 3E 0C C LD A,12 F50C 3D C COUT2: DEC A F50D 20 FD C JR NZ,COUT2 ;DELAY 50 MICROSECONDS F50F C9 C RET C ; C ; C ; C ; F510 C FORCE: F510 3E D0 C LD A,FINCMD ;LOAD FORCE-INTERRUPT-IMMEDIATE CMD F512 CD F508 C CALL CMDOUT ;CLEAR 179X AND LATCH READY/HLD/TK0 ETC F515 DB D4 C IN A,(STSREG) ;READ STATUS REGISTER CONTENTS F517 C9 C RET C ; C ; C ; C ; C ; F518 C READY: F518 3E 01 C LD A,1 F51A 32 FFA5 C LD (INUSE),A ;SET DISKS-ACTIVE FLAG FOR BACKGROUND F51D 3A FF9F C LD A,(SELCPY) F520 D3 CC C OUT (SELMUX),A ;OUTPUT CURRENT DRIVE SELECT/MUX BITS F522 3A FFA6 C LD A,(DSKCNT) F525 B7 C OR A ;TEST IF BACKGROUND TIMER EQUALS ZERO F526 28 06 C JR Z,READY2 ;JUMP IF DRIVES HAVE BEEN STOPPED C F528 CD F510 C CALL FORCE ;CLEAR CONTROLLER AND TEST DRIVE READY F52B CB 7F C BIT 7,A F52D C8 C RET Z ;EXIT IF READY C F52E CD F545 C READY2: CALL SPINUP ;ELSE START THE DRIVES AND CHECK READY F531 C0 C RET NZ ;EXIT IF NOT RUNNING UP TO SPEED C F532 CD F510 C CALL FORCE F535 CB 7F C BIT 7,A ;ELSE TEST THE DRIVE READY STATUS F537 C9 C RET ; AND RETURN TYPE 1 STATUS IN ACC C ; C ; C ; C ; F538 C SETTIMER: F538 F5 C PUSH AF ;SAVE COMPLETION STATUS CARRIED IN ACC F539 3A FF94 C LD A,(NSTOP) F53C 32 FFA6 C LD (DSKCNT),A ;SET INDEX COUNTER FOR DISK TIMEOUT MACRO-80 3.4 01-Dec-80 PAGE 1-56 F53F AF C XOR A F540 32 FFA5 C LD (INUSE),A ;CLEAR DISKS-ACTIVE FLAG FOR BACKGROUND F543 F1 C POP AF F544 C9 C RET C ; C ; C ; C ; F545 C SPINUP: F545 C5 C PUSH BC F546 3E 0E C LD A,MOTOR+ON F548 D3 C8 C OUT (PORT0),A ;TURN ON THE MOTOR CONTROL LINE F54A 3E 0D C LD A,HLDTIM+ON F54C D3 C8 C OUT (PORT0),A ;ACTIVATE THE HEAD LOAD SOLENOIDS F54E DB 85 C IN A,(CTCA1) F550 4F C LD C,A ;PUT CURRENT INDEX PULSE COUNT IN C F551 3A FF95 C LD A,(NREVS) F554 47 C LD B,A ;PUT REVS-TO-READY PARAM INTO B F555 AF C XOR A F556 32 FFA7 C LD (RDYCNT),A ;CLEAR SECONDS-NOT-READY COUNTER F559 CD F510 C CALL FORCE ;RESET 179X SO READY CAN BE TESTED F55C 3A FFA7 C SPIN2: LD A,(RDYCNT) F55F FE 04 C CP 4 ;TEST IF DRIVES HAVE BEEN NOT-READY F561 30 11 C JR NC,SPIN4 ; FOR MORE THAT 4 SECONDS F563 DB D4 C IN A,(STSREG) F565 CB 7F C BIT 7,A F567 20 F3 C JR NZ,SPIN2 ;STAY IN INNER LOOP TILL DRIVE READY C F569 DB 85 C IN A,(CTCA1) ;READ INDEX PULSE COUNT FROM CTC F56B 91 C SUB C ;COMPUTE CHANGE IN INDEX COUNTER CTC F56C ED 44 C NEG ;RESULT IS NEGATIVE, SO SWITCH IT F56E B8 C CP B F56F 38 EB C JR C,SPIN2 ;LOOP UNTIL SPECIFIED NUMBER OF REVS F571 AF C XOR A F572 18 02 C JR SPIN5 ;EXIT WITH DRIVE READY INDICATED C ; F574 3E 80 C SPIN4: LD A,10000000B ;INDICATE DRIVE-NOT-READY ERROR F576 C1 C SPIN5: POP BC F577 B7 C OR A ;RETURN DRIVE READY STATUS IN A F578 C9 C RET C ; C ; C ; C ; .... BACKGROUND DISK ACTIVITY MONITOR .... C ; F579 C DISKTEST: F579 21 FFA8 C LD HL,OLDCTC ;POINT TO LAST INDEX COUNTER VALUE F57C DB 85 C IN A,(CTCA1) ;READ INDEX PULSE COUNT FROM CTC F57E 4E C LD C,(HL) F57F 77 C LD (HL),A ;LOAD C WITH LAST COUNT AND STORE NEW F580 3A FFA5 C LD A,(INUSE) ;TEST STATE OF DISK ACTIVITY FLAG F583 B7 C OR A F584 28 08 C JR Z,DTST2 ;DO DRIVE TURN-OFF STUFF IF NOT IN-USE C ; C ; C ; ARRIVE HERE IF DISK I/O IS CURRENTLY BEING DONE MACRO-80 3.4 01-Dec-80 PAGE 1-57 C ; F586 7E C LD A,(HL) F587 B9 C CP C ;TEST IF ANY INDEX PULSES IN LAST SEC F588 C0 C RET NZ ;EXIT IF DISK IS STILL ROTATING C F589 21 FFA7 C LD HL,RDYCNT F58C 34 C INC (HL) ;BUMP SECONDS-NOT-READY COUNT F58D C9 C RET C ; C ; C ; ARRIVE HERE IF NO DISK OPERATIONS ARE GOING ON C ; F58E 79 C DTST2: LD A,C F58F 96 C SUB (HL) ;COMPUTE PULSES SINCE LAST INTERRUPT F590 28 0D C JR Z,DTST3 ;TURN DRIVES OFF IF NO INDEX PULSES C F592 47 C LD B,A F593 3A FFA6 C LD A,(DSKCNT) F596 90 C SUB B ;SUBTRACT COUNT DIFFERENCE FROM TIMER F597 38 06 C JR C,DTST3 ;JUMP IF DISK TIMEOUT F599 28 04 C JR Z,DTST3 C F59B 32 FFA6 C LD (DSKCNT),A ;ELSE STORE UPDATED VALUE FOR NEXT TIME F59E C9 C RET C ; F59F 3E 01 C DTST3: LD A,1 ;SET FLAG TO STOP ANY FURTHER ACCESS TO F5A1 32 FFA5 C LD (INUSE),A ; THIS POINT UNTIL NEXT DISK OPERATION F5A4 AF C XOR A F5A5 32 FFA6 C LD (DSKCNT),A ;CLEAR COUNTER TO INDICATE DRIVES-OFF F5A8 3E 06 C LD A,MOTOR+OFF F5AA D3 C8 C OUT (PORT0),A ;TURN OFF THE MOTOR CONTROL LINE F5AC 3E 05 C LD A,HLDTIM+OFF F5AE D3 C8 C OUT (PORT0),A ;DEACTIVATE THE HEAD LOAD LINE F5B0 3A FF9F C LD A,(SELCPY) ;GET CURRENT DATA AT SELECT/MUX PORT, F5B3 E6 0F C AND 00001111B ; MASK ALL DRIVE SELECT BITS TO ZEROS F5B5 D3 CC C OUT (SELMUX),A ;AND RE-OUTPUT TO DESELECT DRIVES F5B7 C9 C RET C ; C ; C ; C ; C ; 05B8 MONLEN EQU $-MONSTRT F5B8 MONEND EQU $ .DEPHASE ; ; ; ; 0F3A RAMCOPY EQU $ .PHASE RAM FF00 RAMSTRT EQU $ C INCLUDE MEMORY.MAC ;INITIALIZED VARIABLES MACRO-80 3.4 01-Dec-80 PAGE 1-58 C ;******************************************************** C ;* * C ;* STORAGE ALLOCATION FOR 256 BYTE SCRATCH RAM * C ;* * C ;******************************************************** C ; C ; FF00 F13B C SIOVEC: DEFW RETI ;SIOB TX INTERRUPT FF02 F13B C DEFW RETI ;SIOB EXTERNAL/STATUS INTERRUPT FF04 F20B C DEFW SIOINT ;SIOB RX INTERRUPT FF06 F22F C DEFW SIOERR ;SIOB SPECIAL RX CONDITION INTERRUPT FF08 F13B C DEFW RETI ;SIOA TX INTERRUPT FF0A F13B C DEFW RETI ;SIOA EXTERNAL/STATUS INTERRUPT FF0C F20B C DEFW SIOINT ;SIOA RX INTERRUPT FF0E F22F C DEFW SIOERR ;SIOA SPECIAL RX CONDITION INTERRUPT C FF10 F120 C CTCAV: DEFW KEYSRV ;CTCA0 INTERRUPT (KBD STROBE) FF12 F13B C DEFW RETI FF14 F13B C DEFW RETI FF16 F18E C DEFW VSYNC ;CTCA3 INTERRUPT (CRT VERT SYNC) C FF18 F13B C CTCBV: DEFW RETI FF1A F13B C DEFW RETI FF1C F13E C DEFW MILLISEC ;CTCB2 INTERRUPT (MILLISECOND TIMER) FF1E F15B C DEFW TIMER ;CTCB3 INTERRUPT (CLOCK TICK) C FF20 F13B C DMAVEC: DEFW RETI ;DMA READY INTERRUPT FF22 F13B C DEFW RETI ;DMA MATCH INTERRUPT FF24 F13B C DEFW RETI ;DMA END-OF-BLOCK INTERRUPT FF26 F13B C DEFW RETI ;DMA MATCH/END INTERRUPT C FF28 0000 0000 C DEFW 0,0,0,0,0,0,0,0 ;EXTRA INTERRUPT VECTORS FF2C 0000 0000 C FF30 0000 0000 C FF34 0000 0000 C FF38 0000 0000 C DEFW 0,0,0,0,0,0,0,0 FF3C 0000 0000 C FF40 0000 0000 C FF44 0000 0000 C FF48 0000 0000 C DEFW 0,0,0,0,0,0,0,0 FF4C 0000 0000 C FF50 0000 0000 C FF54 0000 0000 C FF58 0000 0000 C DEFW 0,0,0,0,0,0,0,0 FF5C 0000 0000 C FF60 0000 0000 C FF64 0000 0000 C C ; C ; C ; KEYBOARD DATA INPUT FIFO VARIABLES C FF68 00 C FIFCNT: DEFB 0 ;FIFO DATA COUNTER FF69 00 C FIFIN: DEFB 0 ;FIFO INPUT POINTER FF6A 00 C FIFOUT: DEFB 0 ;FIFO OUTPUT POINTER FF6B 20 C FIFSIZ: DEFB 32 ;MAX FIFO SIZE PARAM C ; MACRO-80 3.4 01-Dec-80 PAGE 1-59 C ; FF6C 00 C CONNUM: DEFB 0 ;CURRENT CONSOLE DEVICE# (0,1 OR 2) FF6D 00 C SIOADR: DEFB 0 ;CONSOLE SIO CONTROL/DATA PORT NUMBER FF6E 00 C DEFB 0 C ; C ; FF6F 01 C CONFIG: DEFB 00000001B ;STDBB AND D/S BITS FOR MONITOR FF70 00 C DSCOPY: DEFB DYSTAT+OFF ;CONTROL BYTE FOR D/S BANK SWITCH BIT FF71 05 C STDCPY: DEFB STDBB+OFF ;CONTROL BYTE FOR STD BANK SWITCH BIT C ; C ; C ; VECTORS FOR EXTRA FUNCTIONS IN KBD/SIO/TIMER INTERRUPTS C ; AND FOR EXTENDED MONITOR AND CRTOUT ROUTINES. C ; FF72 F0F2 C KBDVEC: DEFW STASH ;PARALLEL KEYBOARD FF74 F0F2 C RDAVEC: DEFW STASH ;SIO RECEIVED DATA INTERRUPT FF76 F276 C TIKVEC: DEFW CLOCK4 ;ONE-SECOND INTERRUPT FF78 05CF C MONVEC: DEFW EXT2 ;EXTENDED MONITOR FF7A 01F5 C CRTVEC: DEFW CRTOUT ;CRT OUTPUT DRIVER C ; C ; C ; CLOCK-TIMER INTERRUPT VARIABLES C FF7C C TOD EQU $ FF7C 00 C SECS: DEFB 0 ;CLOCK SECONDS FF7D 00 C MINS: DEFB 0 ; MINUTES FF7E 00 C HRS: DEFB 0 ; HOURS FF7F 00 C DAY: DEFB 0 ;CALENDAR DAY FF80 00 C MONTH: DEFB 0 ; MONTH FF81 00 C YEAR: DEFB 0 ; YEAR C ; FF82 0000 C TICKS: DEFW 0 ;CLOCK TICK INTERRUPT COUNTER FF84 04 C NTICKS: DEFB 4 ;NUMBER OF TICKS PER SECOND FF85 01 C TIKCNT: DEFB 1 ;PRESCALER FOR 1 SECOND TIMER C ; C ; C ; DISK I/O DRIVER VARIABLES C FF86 FF C UNIT: DEFB 255 ;CURRENTLY SELECTED DISK# FF87 FF C TRACK: DEFB 255 ;TRACK POSITION OF SELECTED DRIVE FF88 FF FF FF FF C TRKTAB: DEFB 255,255,255,255 ;HEAD POSITIONS FOR 4 DRIVES FF8C 00 00 00 00 C DEFB 0,0,0,0 ;DENSITY CONTROL BITS FOR 4 DRIVES FF90 06 C SPEED: DEFB 6 ;SEEK SPEED FOR 1771 COMMANDS FF91 0F C SETTLE: DEFB 15 ;HEAD SETTLING TIME FF92 0400 C BLKSIZ: DEFW 1024 ;MAX DMA BLOCK SIZE FOR READ/WRITE FF94 78 C NSTOP: DEFB 6*20 ;NUMBER OF INDEX PULSES TILL DISK STOP FF95 03 C NREVS: DEFB 3 ;NUMBER OF INDEX PULSES BEFORE READY FF96 01 C DSKTYP: DEFB 00000001B ;DISK TYPE / DENSITY INDICATOR FF97 05 C MAXRWT: DEFB 5 ;MAXIMUM RETRY NUMBER FOR DISK I/O C FF98 00 C SECTOR: DEFB 0 ;SECTOR# FOR READ/WRITE SECTOR FF99 00 C CMDTYP: DEFB 0 ;COMMAND BYTE FOR READS/WRITES FF9A 00 C RWTRY: DEFB 0 ;READ/WRITE RETRY COUNT FF9B 00 C FNDTRY: DEFB 0 ;SEEK RETRY COUNT FF9C 00 C ERRTYP: DEFB 0 ;ERROR STATUS FOR READ/WRITE ROUTINES FF9D 0000 C IOPTR: DEFW 0 ;DISK I/O BUFFER POINTER MACRO-80 3.4 01-Dec-80 PAGE 1-60 FF9F 00 C SELCPY: DEFB 0 ;COPY OF DATA IN SELECT/MUX OUTPUTS FFA0 F35D C STPVEC: DEFW STEPX ;VECTOR FOR STEP FINITE STATE MACHINE FFA2 00 C STPCMD: DEFB 0 ;... 179X STEP COMMAND BYTE FFA3 00 C STPCNT: DEFB 0 ;... LOOP COUNT FFA4 00 C STPDLY: DEFB 0 ;... DELAY COUNT FFA5 00 C INUSE: DEFB 0 ;DISKS IN-USE FLAG FOR BACKGROUND FFA6 00 C DSKCNT: DEFB 0 ;... DISK TURN-OFF COUNTER FFA7 00 C RDYCNT: DEFB 0 ;... NOT-READY TIMER FFA8 00 C OLDCTC: DEFB 0 ;... LAST CTCA1 COUNT C ; C ; C ; C ; CRT OUTPUT DRIVER VARIABLES C FFA9 C RC EQU $ ;ROW/COLUMN FOR CRT CURSOR LOCATION FFA9 00 C ROW: DEFB 0 FFAA 00 C COL: DEFB 0 FFAB 20 C BLANK: DEFB ' ' ;CHARACTER USED FOR BLANK FILL FFAC 03 C ATTRIB: DEFB 00000011B ;CURRENT CHARACTER ATTRIBUTE BITS FFAD 00 C GRMODE: DEFB 00000000B ;MODE BITS FOR GRAPHICS MODE FFAE 0000 C ESCVEC: DEFW 0 ;POINTER FOR LEAD-IN SEQUENCE ROUTINES FFB0 00 C ROWTMP: DEFB 0 FFB1 00 C SCROLL: DEFB 0 ;SCROLL REQUEST FLAG FFB2 0000 C START: DEFW 0 ;CONTENTS OF 6845 START ADDRESS REG FFB4 0000 C NEWLIN: DEFW 0 ;RELATIVE ADDR OF NEW LINE AFTER SCROLL FFB6 00 C MOVECS: DEFB 0 ;CURSOR-MOVE REQUEST FLAG FFB7 0000 C CURSOR: DEFW 0 ;OFFSET (0..2047) TO CURSOR LOCATION FFB9 7000 C OLDCSR: DEFW ATTMEM ;POINTER TO CURSOR IN ATTR MEMORY FFBB 01 C CRTFLG: DEFB 00000001B ;CRT PARAMETER BITS C 0000 C AUTONL EQU 0 ;AUTO-NEWLINE 0001 C NOSCRL EQU 1 ;NO SCROLL 0002 C DSPTIM EQU 2 ;CLOCK TIME DISPLAY C ; C ; C ; C ; C ; FREE MEMORY LIST POINTER C FFBC F69B C FREPTR: DEFW TAIL C ; C ; 00BE RAMLEN EQU $-RAMSTRT .DEPHASE ; ; ; ; .PHASE MONEND C INCLUDE SCRATCH.MAC C ; C PAGE MACRO-80 3.4 01-Dec-80 PAGE 1-61 C C ; C ; C ; -- UNINITIALIZED SCRATCH MEMORY FOR SYSTEM -- C ; C ; F5B8 C IRQSAV: DEFS 2 ;STACK POINTER SAVE FOR INTERRUPTS F5BA C DEFS 24 ;LOCAL STACK FOR INTERRUPTS F5D2 C IRQSTK EQU $ C ; C ; C ; F5D2 C CRTSAV: DEFS 2 ;STACK POINTER SAVE FOR 'CRTOUT' F5D4 C DEFS 24 ;LOCAL STACK FOR SAME F5EC C CRTSTK EQU $ C ; C ; C ; C ; VARIABLES FOR ROM MONITOR C ; F5EC C PARAM1: DEFS 2 ;HEX NUMERIC PARAMETERS PARSED F5EE C PARAM2: DEFS 2 ; FROM COMMAND LINE BY 'PARAMS' F5F0 C PARAM3: DEFS 2 F5F2 C PARAM4: DEFS 2 F5F4 C PARAM5: DEFS 2 F5F6 C BREAK: DEFS 1 ;KEYBOARD BREAK FLAG FOR COMMANDS F5F7 C LAST: DEFS 2 ;LAST ADDRESS USED BY 'DUMP' F5F9 C LENGTH: DEFS 2 ;SECTOR LENGTH FOR DISK COMMAND F5FB C LINBUF: DEFS 64 ;LINE INPUT BUFFER 0040 C LINSIZ EQU $-LINBUF F63B C DEFS 32 ;STACK FOR ROM MONITOR F65B C STACK EQU $ C ; C ; F65B C FIFO: DEFS 64 ;***TEMP*** C ; C ; F69B TAIL EQU $ ;END OF RESERVED MEMORY IN MON .DEPHASE ; ; ; ; END MACRO-80 3.4 01-Dec-80 PAGE S Macros: Symbols: ASCHEX 090B ATTEN 0007 ATTMEM 7000 ATTRIB FFAC AUTONL 0000 BANK2 0837 BANK2A 085A BANK3 0863 BANKSW 0828 BAUD 00AC BAUD1 00B1 BAUD2 00B6 BAUD3 00C1 BAUD4 00D0 BAUD5 00E2 BELL 0279 BELL2 0280 BITTAB 053C BLANK FFAB BLINK 0040 BLKSIZ FF92 BLOCAD 07FC BLOCK 07ED BOOT 067F BREAK F5F6 BUZZER 0007 CALLX 05D0 CHECK 07B1 CHRMEM 6000 CLOCK F260 CLOCK2 F268 CLOCK3 F270 CLOCK4 F276 CLR2 0395 CLRALL 03AB CLREOL 0392 CLREOS 0383 CLRLIN 035E CMDOUT F508 CMDREG 00D4 CMDSIZ 0027 CMDTAB 05D2 CMDTYP FF99 COL FFAA COLD F000 COMPRE 03D0 CONFIG FF6F CONIN F009 CONNUM FF6C CONOUT F00C CONST F006 COUT2 F50C CR 000D CRCG1 0165 CRCG2 016A CRCG3 017A CRCGEN 0162 CRLFS 094C CRT2 0207 CRT3 020F CRTADD 00DC CRTC 00DC CRTDAT 00DD CRTFLG FFBB CRTOUT 01F5 CRTSAV F5D2 CRTSTK F5EC CRTVEC FF7A CSRMOV 02B8 CTCA 0084 CTCA0 0084 CTCA1 0085 CTCA2 0086 CTCA3 0087 CTCAV FF10 CTCB 0088 CTCB0 0088 CTCB1 0089 CTCB2 008A CTCB3 008B CTCBV FF18 CTLSIZ 0027 CTLTAB 021A CURSOR FFB7 DADMSG 067A DATREG 00D7 DAY FF7F DDEN 0004 DECIDE 00A1 DECODE 0001 DELCHA 0466 DELLIN 040C DISKOP F4EF DISKTE F579 DISP2 026B DISPAT F15A DISPLA 0241 DMA 008C DMAPGM F4DB DMAVEC FF20 DNLINE 0321 DOSETT F381 DOSTEP F35E DOSTP2 F376 DOWN 02B5 DSCOPY FF70 DSEL F2BB DSK1 0606 DSK2B 0618 DSK2C 0625 DSKAD1 0653 DSKADR 0648 DSKBUF F800 DSKCMD 05F9 DSKCNT FFA6 DSKERR 0633 DSKOP2 F4F6 DSKTYP FF96 DSPTIM 0002 DTST2 F58E DTST3 F59F DUMMY 0678 DUMP 06D7 DUMP2 06E0 DUMP3 06ED DUMP4 06FC DUMP5 06FE DYSTAT 0000 ECHO 0958 EOT 0004 ERRTYP FF9C ESCAPE 028A ESCSEQ 04AE ESCSIZ 002A ESCTAB 04BA ESCVEC FFAE EXITMO F0A6 EXPAND 03EE EXT2 05CF EXTEND 05C9 FDCRST 0006 FIFCNT FF68 FIFIN FF69 FIFO F65B FIFOUT FF6A FIFSIZ FF6B FILL 07D5 FINCMD 00D0 FINDTR F2FC FLIPDE F3B4 FNDTRY FF9B FORCE F510 FREPTR FFBC FTRK2 F301 FTRK3 F318 FTRK4 F321 GENPIO 00D8 GETHEX 08ED GETLIN 0887 GLIN1 0888 GLIN2 089D GLIN4 089F GNUM1 08F2 GNUM2 08F4 GNUM3 08FD GOTO 076B GOTOXY 02C7 GRMODE FFAD HLDTIM 0005 HOME F2CD HOMEUP 03C9 HRS FF7E HTAB 0298 IN1 0711 IN2 072A IN3 072C INCMD 070D INCRT1 018A INDEX F110 INIT 0000 INIT1 000C INIT3 0052 INITCR 0186 INSCHA 048B INSLIN 0440 INUSE FFA5 IOPTR FF9D IOTAB 0195 IRQSAV F5B8 IRQSTK F5D2 KBD 00D0 KBDIN F0E7 KBDST F0DF KBDVEC FF72 KEYSRV F120 LAST F5F7 LEFT 02A6 LENGTH F5F9 LF 000A LFEED 032E LFEED2 034E LINBUF F5FB LINSIZ 0040 LOAD F072 M1TAB 01D5 M2TAB 01E5 MAXRWT FF97 MDATA 07C7 MDMP1 06BB MDMP2 06BE MDMP3 06C3 MDMP3A 06C8 MDMP3B 06D0 MEMDMP 06B5 MEMTES F0B8 MILLIS F13E MACRO-80 3.4 01-Dec-80 PAGE S-1 MINS FF7D MONCOP 0982 MONEND F5B8 MONITR F000 MONLEN 05B8 MONSTR F000 MONTH FF80 MONVEC FF78 MOTOR 0006 MOVE F094 MOVECS FFB6 MTST2 F0C1 MTST3 F0CD MTST4 F0D8 MULT80 0309 NEWLIN FFB4 NOSCRL 0001 NREVS FF95 NSTOP FF94 NTICKS FF84 OEVPP 0002 OFF 0000 OLDCSR FFB9 OLDCTC FFA8 ON 0008 OUTCMD 072F OUTEN 0000 OUTP1 097A OUTP2 097D OUTPUT 0966 PARA1 08C3 PARA2 08CA PARALL 0110 PARAM1 F5EC PARAM2 F5EE PARAM3 F5F0 PARAM4 F5F2 PARAM5 F5F4 PARAMS 08B7 PARL3 0117 PARL4 011F PGM 0003 PMSG 0942 PNEXT 093C PORT0 00C8 PORT3 00C0 PROMPT 0576 PUT2HS 0920 PUT2HX 0927 PUT4HS 091B PUTNIB 0930 RAM FF00 RAMCOP 0F3A RAMLEN 00BE RAMSTR FF00 RAMTST 000E RATES 0100 RC FFA9 RCOV2A F49C RCOV2B F49E RDAVEC FF74 RDCMD 0088 RDIDX F3F2 RDWRT F416 RDYCNT FFA7 READ F408 READID F3DA READX F412 READY F518 READY2 F52E RECOV1 F486 RECOV2 F48A RECOV3 F4A9 RECOV4 F4CF RECOV5 F4D7 RECOVE F47B REINIT F02D REMOVE F109 RETI F13B RETURN 0355 REVERS 0010 RIDCMD 00C0 RIGHT 02AB ROLLIN F035 ROW FFA9 ROWTMP FFB0 RSTCMD 0008 RTST1 0016 RTST2 0018 RTST3 0023 RW1 F427 RW2 F458 RW3 F476 RWTRY FF9A SATTR2 0519 SATTR3 0531 SCROLL FFB1 SEARCH 08AC SECREG 00D6 SECS FF7C SECTOR FF98 SEEK F2CF SEEK2 F2EC SEEKX F2F8 SELCPY FF9F SELECT F27B SELMUX 00CC SELTAB F2C9 SELX F2B7 SENSE 00C4 SETATT 0512 SETC2 0503 SETCOL 04FF SETCSR 02DF SETDEN F3B9 SETMOD 0544 SETPAR 0552 SETR2 04EF SETRC 04E4 SETROW 04EB SETTIM F538 SETTLE FF91 SHADOW 0874 SIDSEL 0001 SIGNON 0125 SIO 0080 SIOADR FF6D SIOATA 0108 SIOBTA 010C SIOCPA 0081 SIOCPB 0083 SIODPA 0080 SIODPB 0082 SIOERR F22F SIOIN F201 SIOINT F20B SIOOUT F24B SIOST F1F9 SIOUT1 F251 SIOVEC FF00 SKCMD 001C SKIP1 0068 SKIP2 0083 SMC1 0002 SMC2 0003 SMCTAB F3CE SMODE2 054B SPACE 0952 SPARM2 0559 SPARM3 0565 SPARM4 0572 SPEED FF90 SPIN2 F55C SPIN4 F574 SPIN5 F576 SPINUP F545 STACK F65B START FFB2 STASH F0F2 STDBB 0005 STDCPY FF71 STEP F324 STEP2 F32E STEP3 F34D STEP4 F35A STEPIN 0040 STEPOU 0060 STEPX F35D STORE F083 STPCMD FFA2 STPCNT FFA3 STPDLY FFA4 STPVEC FFA0 STRIKE 0004 STSREG 00D4 STUFF 0291 TAIL F69B TEST 0788 TEST1 0791 TEST2 0794 TEST3 0799 TEST4 07A8 TICKS FF82 TIKCNT FF85 TIKVEC FF76 TIMER F15B TIMER2 F183 TOD FF7C TODTAB F277 TRACK FF87 TRKREG 00D5 TRKTAB FF88 TSTSTK 0162 UNDLIN 0008 UNIT FF86 UP 02B0 UPLINE 0313 VERCMD 0807 VERF1 0810 VERF2 0823 VERFY2 F3A8 VERIFY F395 VIDOUT F044 VIEW 0738 VIEW2 074F VIEW3 0762 VIEW4 0766 VIEW5 0768 VPP 0004 VSYNC F18E VSYNC2 F1C7 VSYNC3 F1D2 WARM F003 WD179X 00D4 WHAT 05BC WRITE F3F6 WRITEX F404 WRTCMD 00A8 YEAR FF81 ZAPCSR 02F0 No Fatal error(s) 4 07A8 TICKS FF82 TIKCNT FF85 TIKVEC FF76 TIMER F15B TIMER2 F183 TOD FF7C