SD SYSTEMS Z80 ASSEMBLER PAGE 0001 ADDR CODE STMT SOURCE STATEMENT 0001 ;******************************************************** 0002 ;* * 0003 ;* BIGBOARD MONITOR ROM, NON-RELOCATABLE VERSION * 0004 ;* Russell Smith 2-August-1980 * 0005 ;* * 0006 ;******************************************************** 0007 ; 0008 ; 0009 PSECT ABS >F000 0010 ROM EQU 0F000H ;START OF 2K ROM >FF00 0011 RAM EQU 0FF00H ;START OF 256 BYTE RAM >3000 0012 CRTMEM EQU 3000H ;BASE OF 4K CRT MEMORY 0013 ; 0014 ; >F000 0015 ORG ROM 0016 INCLUDE INIT.ASM +0001 ;******************************************************** +0002 ;* * +0003 ;* COLD START INITIALIZATION ROUTINE FOR * +0004 ;* CONFIGURING THE SYSTEM AFTER A POWER-ON * +0005 ;* OR PUSHBUTTON RESET. * +0006 ;* 18-Oct-80 * +0007 ;* * +0008 ;******************************************************** +0009 ; +0010 ; +0011 ; -- MONITOR ENTRY POINT TABLE -- +0012 ; F000 C32AF0 +0013 COLD: JP INIT ;MONITOR COLD ENTRY POINT F003 C32BF1 +0014 WARM: JP PROMPT ;MONITOR WARM ENTRY POINT F006 C331F4 +0015 CONST: JP KBDST ;CONSOLE STATUS VECTOR F009 C339F4 +0016 CONIN: JP KBDIN ;CONSOLE INPUT VECTOR F00C C320F5 +0017 CONOUT: JP CRTOUT ;CONSOLE OUTPUT VECTOR F00F C320F5 +0018 JP CRTOUT ;CRT OUTPUT VECTOR F012 C3E8F4 +0019 JP SIOST ;SIO CHANEL B STATUS VECTOR F015 C3F0F4 +0020 JP SIOIN ;SIO CHANEL B INPUT VECTOR F018 C3FEF4 +0021 JP SIOOUT ;SIO CHANEL B OUTPUT VECTOR F01B C3B1F6 +0022 JP SELECT ;DISK DRIVE SELECT F01E C3E9F6 +0023 JP HOME ;HOME R/W HEAD F021 C3FBF6 +0024 JP SEEK ;SEEK TO TRACK F024 C32AF7 +0025 JP READ ;READ SECTOR F027 C31FF7 +0026 JP WRITE ;WRITE SECTOR +0027 ; +0028 ; +0029 ; +0030 ; DO A SHORT POST-RESET TIME DELAY. ALSO INITIALIZES THE +0031 ; STACK POINTER AND FILLS THE MONITOR SCRATCH RAM WITH ZEROS. +0032 ; F02A F3 +0033 INIT: DI F02B 2100FF +0034 LD HL,RAM ;POINT TO START OF MONITOR RAM F02E 3600 +0035 INIT1: LD (HL),0 ;FILL 256 BYTE SPACE WITH ZEROS F030 F9 +0036 LD SP,HL ;DO SOMETHING USEFUL TO ADD DELAY F031 2C +0037 INC L F032 20FA +0038 JR NZ,INIT1-$ ;LOOP TAKES ABOUT 4 MILLISECONDS +0039 ; +0040 ; INITIALIZE THE Z-80 FOR INTERRUPT MODE #2 +0041 F034 7C +0042 LD A,H SD SYSTEMS Z80 ASSEMBLER PAGE 0002 ADDR CODE STMT SOURCE STATEMENT F035 ED47 +0043 LD I,A ;LOAD I REG WITH MSB OF VECTOR TABLE F037 ED5E +0044 IM 2 ; AND SELECT INTERRUPT MODE 2 +0045 ; F039 CDECF5 +0046 CALL CLRSCN ;FILL THE CRT MEMORY WITH BLANKS +0047 ; +0048 ; STORE ANY NON-ZERO VALUES FOR VARIABLES IN MEMORY +0049 ; F03C 21D3F0 +0050 LD HL,INTAB ;POINT TO DEFAULT VARIABLE TABLE F03F 0600 +0051 INIT2: LD B,0 F041 4E +0052 LD C,(HL) ;BC=DATA BLOCK BYTECOUNT F042 23 +0053 INC HL F043 5E +0054 LD E,(HL) ;DE=DESTINATION FOR DATA F044 23 +0055 INC HL F045 56 +0056 LD D,(HL) F046 23 +0057 INC HL F047 EDB0 +0058 LDIR ;COPY DATA @ HL TO VARIABLES @ DE F049 CB7E +0059 BIT 7,(HL) F04B 28F2 +0060 JR Z,INIT2-$ ;LOOP AGAIN IF NOT AT END OF TABLE +0061 ; +0062 ; INITIALIZE THE PROGRAMMABLE I/O DEVICES +0063 ; F04D 23 +0064 INC HL ;POINT TO I/O INIT DATA TABLE F04E 46 +0065 INIT3: LD B,(HL) ;B=INIT LOOP BYTECOUNT F04F 23 +0066 INC HL F050 4E +0067 LD C,(HL) ;C=DEVICE CONTROL PORT# F051 23 +0068 INC HL F052 EDB3 +0069 OTIR ;SEND DATA @ HL TO PORT @ C F054 CB7E +0070 BIT 7,(HL) ;TEST FOR TABLE END MARKER F056 28F6 +0071 JR Z,INIT3-$ ;LOOP AGAIN IF NOT AT END +0072 ; +0073 ; DETERMINE IF CONSOLE I/O CONFIGURATION WILL BE FOR THE +0074 ; ON-BOARD CRT AND KEYBOARD OR AN EXTERNAL SERIAL TERMINAL. +0075 ; F058 ED78 +0076 IN A,(C) ;TEST SIO READ REGISTER 2 TO DETERMINE F05A FE06 +0077 CP 00000110B ; IF THE SIO IS INSTALLED IN THE BOARD F05C 2012 +0078 JR NZ,PARALL-$ ;SKIP CONFIGURATION TEST IF NO SIO F05E DB1E +0079 IN A,(KBDDAT) ;MAKE SURE KBD PIO 'READY' IS RESET F060 0610 +0080 LD B,00010000B ;B=RESET SIO EXTERNAL STATUS COMMAND F062 ED41 +0081 DECIDE: OUT (C),B ;TEST FOR ARRIVAL OF A SERIAL F064 ED78 +0082 IN A,(C) ; INPUT CHARACTER START BIT F066 CB67 +0083 BIT 4,A F068 200E +0084 JR NZ,BAUD-$ ;EXIT LOOP IF START BIT DETECTED F06A DB1C +0085 IN A,(BITDAT) F06C CB5F +0086 BIT 3,A ;TEST FOR DATA READY STROBE FROM F06E 20F2 +0087 JR NZ,DECIDE-$ ; PARALLEL KBD AND LOOP IF INACTIVE F070 DB1E +0088 PARALL: IN A,(KBDDAT) ;DISCARD FIRST KEYBOARD CHARACTER F072 3E83 +0089 LD A,10000011B F074 D31F +0090 OUT (KBDCTL),A ;ENABLE INTERRUPTS FROM KBD PIO F076 182D +0091 JR SIGNON-$ ;GO SIGNON WITH BULIT-IN CONSOLE I/O +0092 ; +0093 ; +0094 ; AUTOMATIC BAUD RATE SETTING ROUTINE FOR SIO +0095 ; F078 AF +0096 BAUD: XOR A F079 ED41 +0097 BAUD1: OUT (C),B F07B ED50 +0098 IN D,(C) ;READ SIO STATUS REGISTER F07D CB62 +0099 BIT 4,D ;TEST THE SYNC/HUNT BIT F07F 28F8 +0100 JR Z,BAUD1-$ ;LOOP UNTIL IT CHANGES STATE SD SYSTEMS Z80 ASSEMBLER PAGE 0003 ADDR CODE STMT SOURCE STATEMENT F081 3C +0101 BAUD2: INC A F082 ED41 +0102 OUT (C),B ;RESET REGISTER #0 FLAGS AGAIN F084 ED50 +0103 IN D,(C) ; AND LOOP TIMING THE SYNC/HUNT BIT F086 CB62 +0104 BIT 4,D F088 20F7 +0105 JR NZ,BAUD2-$ ;REPEAT UNTIL BIT CHANGES AGAIN F08A 21CAF0 +0106 LD HL,RATES-1 F08D 23 +0107 BAUD3: INC HL ;INDEX INTO BAUD RATE TABLE F08E 17 +0108 RLA ; USING COUNT DERRIVED IN A F08F 30FC +0109 JR NC,BAUD3-$ F091 7E +0110 LD A,(HL) ;GET BAUD RATE CONTROL BYTE FROM F092 D30C +0111 OUT (BAUDB),A ; TABLE AND OUTPUT TO COM-8116 TIMER F094 CDF0F4 +0112 CALL SIOIN ;DISARD FIRST SERIAL INPUT CHARACTER F097 3E01 +0113 LD A,1 F099 D307 +0114 OUT (SIOCPB),A ;RE-PROGRAM SIO B TO GENERATE F09B 3E1C +0115 LD A,00011100B ; INTERRUPTS ON RECIEVED DATA, F09D D307 +0116 OUT (SIOCPB),A ; PARITY DOES NOT AFFECT VECTOR F09F 21FEF4 +0117 LD HL,SIOOUT F0A2 220DF0 +0118 LD (CONOUT+1),HL ;RE-DIRECT CONSOLE OUTPUT TO SIO +0119 ; +0120 ; PRINT SIGNON MESSAGE +0121 ; F0A5 FB +0122 SIGNON: EI F0A6 CDECF3 +0123 CALL PNEXT F0A9 0D0A +0124 DEFB CR,LF F0AB 2E2E2E20 +0125 DEFM '... system monitor 3.3 ...' 73797374 656D206D 6F6E6974 6F722033 2E33202E 2E2E F0C5 0D0A +0126 DEFB CR,LF F0C7 04 +0127 DEFB EOT F0C8 C303F0 +0128 JP WARM ;GO ENTER MONITOR +0129 ; +0130 ; +0131 ; +0132 ; BAUD RATE CONSTANTS FOR COM 8116 BAUD RATE GENERATOR +0133 ; F0CB 05 +0134 RATES: DEFB 0101B ; 300 BAUD F0CC 06 +0135 DEFB 0110B ; 600 BAUD F0CD 07 +0136 DEFB 0111B ; 1200 BAUD F0CE 0A +0137 DEFB 1010B ; 2400 BAUD F0CF 0C +0138 DEFB 1100B ; 4800 BAUD F0D0 0E +0139 DEFB 1110B ; 9600 BAUD F0D1 0F +0140 DEFB 1111B ; 19200 BAUD F0D2 0F +0141 DEFB 1111B ; 19200 BAUD +0142 ; +0143 ; >F0D3 +0144 INTAB EQU $ ;INITIALIZATION DATA TABLES +0145 ; +0146 ; +0147 ; INITIALIZE THE Z-80 'I' REGISTER INTERRUPT VECTOR TABLE +0148 ; F0D3 02 +0149 DEFB 2 F0D4 1AFF +0150 DEFW SYSVEC+2 F0D6 8CF4 +0151 DEFW KEYSRV ;PARALLEL KEYBOARD INTERRUPT VECTOR +0152 SD SYSTEMS Z80 ASSEMBLER PAGE 0004 ADDR CODE STMT SOURCE STATEMENT F0D8 02 +0153 DEFB 2 F0D9 16FF +0154 DEFW CTCVEC+6 F0DB 9FF4 +0155 DEFW TIMER ;ONE SECOND TIMER INTERRUPT VECTOR +0156 F0DD 04 +0157 DEFB 4 F0DE 04FF +0158 DEFW SIOVEC+4 F0E0 AFF4 +0159 DEFW SIOINT ;SIO RECIEVE INTERRUPT VECTOR F0E2 CFF4 +0160 DEFW SIOERR ;SIO PARITY, OVERRUN & FRAMING ERROR +0161 ; +0162 ; INITIALIZE DISK I/O DRIVER VARIABLES +0163 ; F0E4 08 +0164 DEFB 8 F0E5 65FF +0165 DEFW UNIT F0E7 FF +0166 DEFB 255 ;FLAG ALL DRIVES AS DE-SELECTED F0E8 FFFFFFFF +0167 DEFB 255,255,255,255 ;CLEAR HEAD POSITION TABLE F0EC 00 +0168 DEFB 00000000B ;SELECT FASTEST SEEK SPEED F0ED 80 +0169 DEFB 128 ;SELECT 128 BYTE SECTOR LENGTH F0EE 1E +0170 DEFB 30 ;SET MOTOR TURN-OFF TIMER +0171 ; +0172 ; INITIALIZE THE CRT DISPLAY CURSOR +0173 ; F0EF 02 +0174 DEFB 2 F0F0 75FF +0175 DEFW CHRSAV F0F2 20 +0176 DEFB ' ' F0F3 5F +0177 DEFB '_' ;USE NON-BLINKING UNDERSCORE +0178 ; +0179 ; SET DEFAULT 'SOFTWARE' INTERRUPT VECTORS +0180 ; F0F4 06 +0181 DEFB 6 F0F5 57FF +0182 DEFW TIKVEC F0F7 80F4 +0183 DEFW DSKTMR ;POINT 'TIKVEC' TO DISK MOTOR TIMER F0F9 44F4 +0184 DEFW STASH ;POINT 'PINVEC' TO FIFO INPUT ROUTINE F0FB 44F4 +0185 DEFW STASH ;POINT 'SINVEC' TO FIFO INPUT ROUTINE +0186 ; +0187 ; SET FREE MEMORY POINTER +0188 ; F0FD 02 +0189 DEFB 2 F0FE 7AFF +0190 DEFW FREPTR F100 E6F7 +0191 DEFW ROMEND ;POINT TO FIRST LOCATION AFTER MONITOR +0192 ; +0193 ; F102 FF +0194 DEFB -1 ;END OF VARIABLE INIT TABLE +0195 ; +0196 ; +0197 ; >0000 +0198 BAUDA EQU 00H ;CHANEL A BAUD RATE GENETATOR >0004 +0199 SIO EQU 04H ;DUAL SERIAL I/O >0008 +0200 GENPIO EQU 08H ;GENERAL PURPOSE PARALLEL I/O >000C +0201 BAUDB EQU 0CH ;CHANEL B BAUD RATE GENERATOR >0010 +0202 WD1771 EQU 10H ;WESTERN DIGITAL DISK CONTROLLER >0014 +0203 SCROLL EQU 14H ;CRT SCROLL MEMORY SCROLL REGISTER >0018 +0204 CTC EQU 18H ;QUAD COUNTER/TIMER CIRCUIT >001C +0205 SYSPIO EQU 1CH ;SYSTEM PARALLEL I/O +0206 ; +0207 ; INITIALIZE SYSTEM PIO FOR USE AS BANK-SWITCH, +0208 ; DISK DRIVE SELECT AND PARALLEL KEYBOARD INPUT +0209 ; >001C +0210 BITDAT EQU SYSPIO+0 SD SYSTEMS Z80 ASSEMBLER PAGE 0005 ADDR CODE STMT SOURCE STATEMENT >001D +0211 BITCTL EQU SYSPIO+1 >001E +0212 KBDDAT EQU SYSPIO+2 >001F +0213 KBDCTL EQU SYSPIO+3 +0214 F103 031D +0215 DEFB 3,BITCTL F105 CF +0216 DEFB 11001111B ;PUT SYSTEM PIO IN BIT MODE F106 18 +0217 DEFB 00011000B ;MAKE BITS 4 AND 3 BE INPUTS F107 40 +0218 DEFB 01000000B ;DISABLE INTERRUPTS +0219 ; F108 011C +0220 DEFB 1,BITDAT F10A 00 +0221 DEFB 00000000B ;DE-SELECT ROMS, ENABLE DRIVE 0 +0222 ; F10B 021F +0223 DEFB 2,KBDCTL F10D 4F +0224 DEFB 01001111B ;PUT KEYBOARD PORT IN INPUT MODE F10E 1A +0225 DEFB SYSVEC+2 ;LOAD KEYBOARD INTERRUPT VECTOR +0226 ; +0227 ; +0228 ; INITIALIZE CHANELS 2 AND 3 OF THE CTC +0229 ; TO GENERATE ONE SECOND INTERRUPTS FROM CTC3 +0230 ; >0018 +0231 CTC0 EQU CTC+0 ;CTC CHANEL 0 PORT# >0019 +0232 CTC1 EQU CTC+1 ;CTC CHANEL 1 >001A +0233 CTC2 EQU CTC+2 ;CTC CHANEL 2 >001B +0234 CTC3 EQU CTC+3 ;CTC CHANEL 3 +0235 F10F 0118 +0236 DEFB 1,CTC0 F111 10 +0237 DEFB CTCVEC ;BASE INTERRUPT VECTOR FOR CTC +0238 ; F112 021A +0239 DEFB 2,CTC2 F114 27 +0240 DEFB 00100111B ;PUT CTC2 IN TIMER MODE F115 69 +0241 DEFB 105 ;CTC2 PERIOD=105*256*400 NANOSECONDS +0242 ; F116 021B +0243 DEFB 2,CTC3 F118 C7 +0244 DEFB 11000111B ;PUT CTC3 IN COUNTER MODE F119 5D +0245 DEFB 93 ;CTC3 PERIOD=999936 MICROSECONDS +0246 ; +0247 ; +0248 ; INITIALIZE SIO CHANEL B FOR ASYNCHRONOUS SERIAL +0249 ; INTERFACE TO PRINTER OR TERMINAL +0250 ; >0004 +0251 SIODPA EQU SIO+0 ;SIO DATA PORT A >0005 +0252 SIODPB EQU SIO+1 ;SIO DATA PORT B >0006 +0253 SIOCPA EQU SIO+2 ;SIO CONTROL/STATUS PORT A >0007 +0254 SIOCPB EQU SIO+3 ;SIO CONTROL/STATUS PORT B +0255 F11A 010C +0256 DEFB 1,BAUDB F11C 05 +0257 DEFB 0101B ;SET COM 8116 FOR 300 BAUD DEFAULT +0258 F11D 0B07 +0259 DEFB 11,SIOCPB F11F 04 +0260 DEFB 4 ;SELECT REGISTER #4 F120 45 +0261 DEFB 01000101B ;16X CLOCK, 1 STOP BIT, ODD PARITY F121 01 +0262 DEFB 1 ;SELECT REGISTER #1 F122 04 +0263 DEFB 00000100B ;STATUS AFFECTS VECTOR, NO INTERRUPTS F123 03 +0264 DEFB 3 ;SELECT REGISTER #3 F124 41 +0265 DEFB 01000001B ;7 BITS/RX CHARACTER F125 05 +0266 DEFB 5 ;SELECT REGISTER #5 F126 AA +0267 DEFB 10101010B ;7 BITS/TX CHARACTER, ASSERT DTR F127 02 +0268 DEFB 2 ;SELECT REGISTER #2 SD SYSTEMS Z80 ASSEMBLER PAGE 0006 ADDR CODE STMT SOURCE STATEMENT F128 00 +0269 DEFB SIOVEC ;LOAD INTERRUPT VECTOR BASE F129 02 +0270 DEFB 2 ;SELECT READ REG #2 FOR SIO TEST +0271 F12A FF +0272 DEFB -1 ;END-OF-TABLE +0273 ; +0274 ; INIT DONE +0275 ; +0276 ; 0017 INCLUDE MONITOR.ASM +0001 ;******************************************************** +0002 ;* * +0003 ;* BASIC HEX MONITOR FOR Z-80 PROCESSORS * +0004 ;* 3-Aug-80 * +0005 ;* * +0006 ;******************************************************** +0007 ; +0008 ; +0009 ; +0010 ; F12B CDECF3 +0011 PROMPT: CALL PNEXT F12E 0D0A +0012 DEFB CR,LF F130 2A20 +0013 DEFM '* ' F132 04 +0014 DEFB EOT F133 2188FF +0015 LD HL,LINBUF F136 0E20 +0016 LD C,32 F138 CD3BF3 +0017 CALL GETLIN ;INPUT A BUFERED CONSOLE LINE F13B 3835 +0018 JR C,WHAT-$ ;PRINT 'WHAT ?' IF INPUT ERROR +0019 F13D AF +0020 XOR A F13E 3284FF +0021 LD (ESCFLG),A F141 CDFCF3 +0022 CALL CRLFS F144 3A88FF +0023 LD A,(LINBUF) ;GET FIRST CHARACTER IN LINE F147 FE0D +0024 CP CR F149 28E0 +0025 JR Z,PROMPT-$ ;JUMP IF A NULL LINE F14B 2182F1 +0026 LD HL,CMDTAB ;SEARCH FOR A MATCHING CHARACTER F14E 010B00 +0027 LD BC,CMDSIZ/3 ; IN COMMAND SEARCH TABLE F151 CD60F3 +0028 CALL SEARCH F154 201C +0029 JR NZ,WHAT-$ ;TRY AGAIN IF SEACRH FAILS F156 C5 +0030 PUSH BC F157 FD2189FF +0031 LD IY,LINBUF+1 F15B CD6AF3 +0032 CALL PARAMS ;INPUT NUMERIC PARAMETERS FROM F15E DDE1 +0033 POP IX ; LINE BUFFER AND TEST IF ERROR F160 3810 +0034 JR C,WHAT-$ F162 2A7CFF +0035 LD HL,(PARAM1) F165 ED5B7EFF +0036 LD DE,(PARAM2) F169 ED4B80FF +0037 LD BC,(PARAM3) F16D CD80F1 +0038 CALL CALLX ;CALL SUBROUTINE @ IX F170 30B9 +0039 JR NC,PROMPT-$ ;GO BACK TO PROMPT IF NO ERRORS +0040 F172 CDECF3 +0041 WHAT: CALL PNEXT F175 20776861 +0042 DEFM ' what ?' 74203F F17C 07 +0043 DEFB 'G'-64 ;SAY 'what ?' AND BEEP THE BELL F17D 04 +0044 DEFB EOT F17E 18AB +0045 JR PROMPT-$ +0046 ; +0047 ; F180 DDE9 +0048 CALLX: JP (IX) ;CALL SUBROUTINE @ IX SD SYSTEMS Z80 ASSEMBLER PAGE 0007 ADDR CODE STMT SOURCE STATEMENT +0049 ; +0050 ; +0051 ; F182 52 +0052 CMDTAB: DEFB 'R' F183 4F +0053 DEFB 'O' F184 49 +0054 DEFB 'I' F185 47 +0055 DEFB 'G' F186 54 +0056 DEFB 'T' F187 46 +0057 DEFB 'F' F188 4D +0058 DEFB 'M' F189 43 +0059 DEFB 'C' F18A 42 +0060 DEFB 'B' F18B 44 +0061 DEFB 'D' F18C 53 +0062 DEFB 'S' +0063 F18D 29F3 +0064 DEFW SWITCH ;SWITCH CONSOLE OUTPUT VECTOR F18F 05F2 +0065 DEFW MEMDMP ;DUMP MEMORY IN HEX/ASCII F191 A3F1 +0066 DEFW BOOT ;BOOT UP CP/M F193 E6F2 +0067 DEFW BLOCK ;MEMORY BLOCK MOVE F195 57F2 +0068 DEFW VIEW ;MEMORY EXAMINE/CHANGE F197 D8F2 +0069 DEFW FILL ;FILL MEMORY F199 8CF2 +0070 DEFW TEST ;RAM DIAGNOSTIC F19B 81F2 +0071 DEFW GOTO ;JUMP TO MEMORY LOCATION F19D FEF2 +0072 DEFW INCMD ;READ FROM INPUT PORT F19F 20F3 +0073 DEFW OUTCMD ;WRITE TO OUTPUT PORT F1A1 BDF1 +0074 DEFW DSKCMD ;DISPLAY DISK SECTOR DATA +0075 >0021 +0076 CMDSIZ EQU $-CMDTAB +0077 ; +0078 ; +0079 ;******************************************************** +0080 ;* * +0081 ;* MONITOR COMMAND ACTION ROUTINES PACKAGE * +0082 ;* * +0083 ;******************************************************** +0084 ; +0085 ; +0086 ; +0087 ; +0088 ; +0089 ; -- DISK BOOT LOADER COMMAND -- +0090 ; F1A3 0E00 +0091 BOOT: LD C,0 ;SELECT DRIVE 0 FOR BOOT LOAD F1A5 CDB1F6 +0092 CALL SELECT F1A8 203D +0093 JR NZ,DSKERR-$ F1AA CDE9F6 +0094 CALL HOME ;HOME HEAD TO TRACK 0 F1AD 2038 +0095 JR NZ,DSKERR-$ ;ERROR IF NOT READY OR AT TR0 F1AF 218000 +0096 LD HL,0080H ;POINT TO CP/M READ BUFFER F1B2 0E01 +0097 LD C,1 ;SELECT SECTOR 1 F1B4 CD2AF7 +0098 CALL READ ;READ TRACK 0/ SECTOR 1 F1B7 202E +0099 JR NZ,DSKERR-$ F1B9 F1 +0100 POP AF ;CLEAN UP STACK F1BA C38000 +0101 JP 0080H ;GO EXECUTE LOADER +0102 ; +0103 ; +0104 ; -- DISK SECTOR READ COMMAND -- +0105 ; F1BD FE03 +0106 DSKCMD: CP 3 ;CHECK PARAMETER COUNT SD SYSTEMS Z80 ASSEMBLER PAGE 0008 ADDR CODE STMT SOURCE STATEMENT F1BF 37 +0107 SCF F1C0 C0 +0108 RET NZ F1C1 4D +0109 LD C,L ;USE FIRST ARG AS UNIT# F1C2 CDB1F6 +0110 CALL SELECT F1C5 2020 +0111 JR NZ,DSKERR-$ F1C7 217EFF +0112 LD HL,PARAM2 F1CA 4E +0113 LD C,(HL) ;USE SECOND ARG AS TRACK# F1CB CDFBF6 +0114 CALL SEEK F1CE 2017 +0115 JR NZ,DSKERR-$ F1D0 2180FF +0116 LD HL,PARAM3 F1D3 4E +0117 LD C,(HL) ;USE THIRD ARG AS SECTOR# F1D4 218000 +0118 LD HL,0080H F1D7 CD2AF7 +0119 CALL READ F1DA CBC7 +0120 SET 0,A ;MARK ERROR BYTE AS DUE TO READ F1DC 2009 +0121 JR NZ,DSKERR-$ F1DE 218000 +0122 LD HL,0080H F1E1 110800 +0123 LD DE,8 F1E4 C327F2 +0124 JP DUMP ;DUMP DISK READ BUFFER AND RETURN +0125 ; +0126 ; F1E7 4F +0127 DSKERR: LD C,A ;SAVE 1771 STATUS F1E8 CDECF3 +0128 CALL PNEXT F1EB 6469736B +0129 DEFM 'disk error ' 20657272 6F7220 F1F6 04 +0130 DEFB EOT F1F7 0608 +0131 LD B,8 ;PRINT 1771 ERROR BYTE IN BINARY F1F9 AF +0132 DSKR2: XOR A F1FA CB11 +0133 RL C F1FC CE30 +0134 ADC A,'0' ;TRANSFORM A INTO ASCII '1' OR '0' F1FE CD15F4 +0135 CALL OUTPUT F201 10F6 +0136 DJNZ DSKR2-$ ;REPEAT FOR 8 BITS F203 B7 +0137 OR A F204 C9 +0138 RET +0139 ; +0140 ; +0141 ; +0142 ; -- MEMORY DUMP COMMAND -- +0143 ; F205 3D +0144 MEMDMP: DEC A ;CHECK PARAMETER COUNT F206 2806 +0145 JR Z,MDMP2-$ F208 3D +0146 DEC A F209 2808 +0147 JR Z,MDMP3-$ F20B 2A86FF +0148 MDMP1: LD HL,(LAST) F20E 111000 +0149 MDMP2: LD DE,16 F211 180D +0150 JR MDMP3B-$ +0151 F213 EB +0152 MDMP3: EX DE,HL F214 ED52 +0153 SBC HL,DE ;DERRIVE BYTECOUNT FOR DUMP RANGE F216 0604 +0154 LD B,4 F218 CB3C +0155 MDMP3A: SRL H ;DIVIDE BYTECOUNT BY 16 F21A CB1D +0156 RR L F21C 10FA +0157 DJNZ MDMP3A-$ F21E 23 +0158 INC HL F21F EB +0159 EX DE,HL F220 CD27F2 +0160 MDMP3B: CALL DUMP ;DUMP DE*16 BYTES STRTING AT HL F223 2286FF +0161 LD (LAST),HL F226 C9 +0162 RET SD SYSTEMS Z80 ASSEMBLER PAGE 0009 ADDR CODE STMT SOURCE STATEMENT +0163 ; +0164 ; F227 E5 +0165 DUMP: PUSH HL ;SAVE STARTING ADDRESS F228 CDCDF3 +0166 CALL PUT4HS ;PRINT STARTING ADDRESS IN HEX F22B CD02F4 +0167 CALL SPACE F22E 0610 +0168 LD B,16 F230 7E +0169 DUMP2: LD A,(HL) ;GET A DATA BYTE @ HL F231 23 +0170 INC HL F232 CDD2F3 +0171 CALL PUT2HS ;PRINT THE DATA IN HEX F235 10F9 +0172 DJNZ DUMP2-$ ;REPEAT 16 TIMES F237 E1 +0173 POP HL ;RESTORE STARTING ADDRESS F238 0610 +0174 LD B,16 F23A 7E +0175 DUMP3: LD A,(HL) ;GET BACK DATA BYTE @ HL F23B 23 +0176 INC HL F23C CBBF +0177 RES 7,A F23E FE20 +0178 CP 20H F240 3804 +0179 JR C,DUMP4-$ F242 FE7F +0180 CP 7FH F244 3802 +0181 JR C,DUMP5-$ F246 3E2E +0182 DUMP4: LD A,'.' ;PRINT A DOT IF DATA < 20 OR > 7F F248 CD15F4 +0183 DUMP5: CALL OUTPUT ;PRINT ASCII CHARACTER IN A F24B 10ED +0184 DJNZ DUMP3-$ F24D CDFCF3 +0185 CALL CRLFS F250 C0 +0186 RET NZ ;EXIT IF ESCAPE REQUEST IS INDICATED F251 1B +0187 DEC DE F252 7A +0188 LD A,D F253 B3 +0189 OR E F254 20D1 +0190 JR NZ,DUMP-$ F256 C9 +0191 RET +0192 ; +0193 ; +0194 ; +0195 ; +0196 ; -- MEMORY EXAMINE COMMAND -- +0197 ; F257 CDCEF2 +0198 VIEW: CALL MDATA F25A CD07F4 +0199 CALL ECHO F25D FE0D +0200 CP CR F25F 281B +0201 JR Z,VIEW4-$ F261 FE2D +0202 CP '-' F263 2819 +0203 JR Z,VIEW5-$ F265 CDBDF3 +0204 VIEW2: CALL ASCHEX F268 3F +0205 CCF F269 D0 +0206 RET NC F26A 07 +0207 RLCA F26B 07 +0208 RLCA F26C 07 +0209 RLCA F26D 07 +0210 RLCA F26E 4F +0211 LD C,A F26F CD07F4 +0212 CALL ECHO F272 CDBDF3 +0213 CALL ASCHEX F275 3F +0214 CCF F276 D0 +0215 RET NC F277 B1 +0216 OR C F278 77 +0217 VIEW3: LD (HL),A F279 CDB9F2 +0218 CALL CHECK F27C 23 +0219 VIEW4: INC HL F27D 23 +0220 INC HL SD SYSTEMS Z80 ASSEMBLER PAGE 0010 ADDR CODE STMT SOURCE STATEMENT F27E 2B +0221 VIEW5: DEC HL F27F 18D6 +0222 JR VIEW-$ +0223 ; +0224 ; +0225 ; +0226 ; -- JUMP TO MEMORY LOCATION COMMAND -- +0227 ; F281 3D +0228 GOTO: DEC A ;CHECK PARAMETER COUNT F282 37 +0229 SCF F283 C0 +0230 RET NZ F284 E5 +0231 PUSH HL F285 DDE1 +0232 POP IX F287 CD80F1 +0233 CALL CALLX ;CALL ADDRESS PASSED IN HL F28A B7 +0234 OR A F28B C9 +0235 RET ;RETURN IF WE GET BACK AGAIN +0236 ; +0237 ; +0238 ; +0239 ; -- MEMORY READ/WRITE DIAGNOSTIC COMMAND -- +0240 ; F28C FE02 +0241 TEST: CP 2 ;CHECK PARAMETER COUNT F28E 37 +0242 SCF F28F C0 +0243 RET NZ F290 13 +0244 INC DE F291 5A +0245 LD E,D ;GET ENDING PAGE ADDRESS INTO E F292 54 +0246 LD D,H ;GET STARTING PAGE ADDRESS INTO D F293 0600 +0247 LD B,0 ;INITIALIZE PASS COUNTER F295 62 +0248 TEST1: LD H,D ;POINT HL TO START OF BLOCK F296 2E00 +0249 LD L,0 F298 7D +0250 TEST2: LD A,L F299 AC +0251 XOR H ;GENERATE TEST BYTE F29A A8 +0252 XOR B F29B 77 +0253 LD (HL),A ;STORE BYTE IN RAM F29C 23 +0254 INC HL F29D 7C +0255 LD A,H F29E BB +0256 CP E ;CHECK FOR END OF TEST BLOCK F29F 20F7 +0257 JR NZ,TEST2-$ +0258 ; NOW READ BACK EACH BYTE & COMPARE F2A1 62 +0259 LD H,D F2A2 2E00 +0260 LD L,0 ;POINT HL BACK TO START F2A4 7D +0261 TEST3: LD A,L F2A5 AC +0262 XOR H ;RE-GENERATE TEST BYTE DATA F2A6 A8 +0263 XOR B F2A7 CDB9F2 +0264 CALL CHECK ;VERIFY MEMORY DATA STILL GOOD F2AA C0 +0265 RET NZ ;EXIT IF ESCAPE REQUEST IS INDICATED F2AB 23 +0266 INC HL ; ELSE GO ON TO NEXT BYTE F2AC 7C +0267 LD A,H F2AD BB +0268 CP E ;CHECK FOR END OF BLOCK F2AE 20F4 +0269 JR NZ,TEST3-$ F2B0 04 +0270 INC B ;BUMP PASS COUNT F2B1 3E2B +0271 LD A,'+' F2B3 CD15F4 +0272 CALL OUTPUT ;PRINT '+' AND ALLOW FOR EXIT F2B6 28DD +0273 JR Z,TEST1-$ ;DO ANOTHER PASS IF NO ESCAPE F2B8 C9 +0274 RET +0275 ; +0276 ; +0277 ; F2B9 BE +0278 CHECK: CP (HL) SD SYSTEMS Z80 ASSEMBLER PAGE 0011 ADDR CODE STMT SOURCE STATEMENT F2BA C8 +0279 RET Z ;RETURN IF (HL)=A F2BB F5 +0280 PUSH AF F2BC CDCEF2 +0281 CALL MDATA ;PRINT WHAT WAS ACTUALLY READ F2BF CDECF3 +0282 CALL PNEXT F2C2 73686F75 +0283 DEFM 'should=' 6C643D F2C9 04 +0284 DEFB EOT F2CA F1 +0285 POP AF F2CB C3D2F3 +0286 JP PUT2HS ;PRINT WHAT SHOULD HAVE BEEN READ +0287 ; +0288 ; F2CE CDFCF3 +0289 MDATA: CALL CRLFS F2D1 CDCDF3 +0290 CALL PUT4HS F2D4 7E +0291 LD A,(HL) F2D5 C3D2F3 +0292 JP PUT2HS +0293 ; +0294 ; +0295 ; +0296 ; -- FILL MEMORY WITH CONSTANT COMMAND -- +0297 ; F2D8 FE03 +0298 FILL: CP 3 ;CHECK IF PARAMETER COUNT=3 F2DA 37 +0299 SCF F2DB C0 +0300 RET NZ F2DC 71 +0301 FILL1: LD (HL),C F2DD E5 +0302 PUSH HL F2DE B7 +0303 OR A F2DF ED52 +0304 SBC HL,DE ;COMPARE HL TO END ADDRESS IN DE F2E1 E1 +0305 POP HL F2E2 23 +0306 INC HL ;ADVANCE POINTER AFTER COMPARISON F2E3 38F7 +0307 JR C,FILL1-$ F2E5 C9 +0308 RET +0309 ; +0310 ; +0311 ; +0312 ; +0313 ; -- MEMORY BLOCK MOVE COMMAND -- +0314 ; F2E6 FE03 +0315 BLOCK: CP 3 ;CHECK IF PARAMETER COUNT=3 F2E8 37 +0316 SCF F2E9 C0 +0317 RET NZ F2EA CDF3F2 +0318 CALL BLOCAD F2ED 79 +0319 LD A,C F2EE B0 +0320 OR B F2EF C8 +0321 RET Z ;EXIT NOW IF BC=0 F2F0 EDB0 +0322 LDIR F2F2 C9 +0323 RET +0324 ; +0325 ; +0326 ; F2F3 EB +0327 BLOCAD: EX DE,HL F2F4 B7 +0328 OR A ;CLEAR CARRY F2F5 ED52 +0329 SBC HL,DE ;GET DIFFRENCE BETWEEN F2F7 EB +0330 EX DE,HL ;HL & DE FOR BYTECOUNT F2F8 D5 +0331 PUSH DE F2F9 C5 +0332 PUSH BC F2FA D1 +0333 POP DE ;GET OLD BC INTO DE F2FB C1 +0334 POP BC F2FC 03 +0335 INC BC ;GET COUNT+1 INTO BC SD SYSTEMS Z80 ASSEMBLER PAGE 0012 ADDR CODE STMT SOURCE STATEMENT F2FD C9 +0336 RET +0337 ; +0338 ; +0339 ; +0340 ; +0341 ; -- READ FROM INPUT PORT COMMAND -- +0342 ; F2FE 3D +0343 INCMD: DEC A ;CHECK IF PARAMETER COUNT=1 F2FF 37 +0344 SCF F300 C0 +0345 RET NZ F301 4D +0346 LD C,L ;POINT C TO INPUT PORT F302 CDFCF3 +0347 IN1: CALL CRLFS F305 79 +0348 LD A,C F306 CDD2F3 +0349 CALL PUT2HS F309 ED78 +0350 IN A,(C) F30B CDD2F3 +0351 CALL PUT2HS F30E CD07F4 +0352 CALL ECHO F311 FE0D +0353 CP CR F313 2806 +0354 JR Z,IN2-$ F315 FE2D +0355 CP '-' F317 2804 +0356 JR Z,IN3-$ F319 B7 +0357 OR A F31A C9 +0358 RET +0359 F31B 0C +0360 IN2: INC C F31C 0C +0361 INC C F31D 0D +0362 IN3: DEC C F31E 18E2 +0363 JR IN1-$ +0364 ; +0365 ; +0366 ; +0367 ; -- WRITE TO OUTPUT PORT COMMAND -- +0368 ; F320 FE02 +0369 OUTCMD: CP 2 ;CHECK IF PARAMETER COUNT=2 F322 37 +0370 SCF F323 C0 +0371 RET NZ F324 4D +0372 LD C,L ;POINT C TO OUTPUT PORT F325 ED59 +0373 OUT (C),E ;OUTPUT DATA PASSED IN E F327 B7 +0374 OR A F328 C9 +0375 RET +0376 ; +0377 ; +0378 ; -- SWITCH CONSOLE OUTPUT DEVICE COMMAND -- +0379 ; F329 2185FF +0380 SWITCH: LD HL,COFLAG F32C 34 +0381 INC (HL) ;TOGGLE CONSOLE OUTPUT TYPE FLAG F32D CB46 +0382 BIT 0,(HL) F32F 21FEF4 +0383 LD HL,SIOOUT F332 2803 +0384 JR Z,SWIT2-$ ;JUMP IF ZERO TO ONE TRANSITION F334 2120F5 +0385 LD HL,CRTOUT F337 220DF0 +0386 SWIT2: LD (CONOUT+1),HL ;STORE NEW CONSOLE OUTPUT ADDRESS F33A C9 +0387 RET +0388 ; +0389 ; +0390 ;******************************************************** +0391 ;* * +0392 ;* CONSOLE I/O PACKAGE AND UTILITY ROUTINES * +0393 ;* * SD SYSTEMS Z80 ASSEMBLER PAGE 0013 ADDR CODE STMT SOURCE STATEMENT +0394 ;******************************************************** +0395 ; +0396 ; +0397 ; F33B 41 +0398 GETLIN: LD B,C ;SAVE MAX LINE LENGTH PARAMETER IN B F33C CD07F4 +0399 GLIN1: CALL ECHO ;GET A CHARACTER FROM THE CONSOLE F33F FE0D +0400 CP CR ;CHECK FOR CARRIAGE RETURN F341 280E +0401 JR Z,GLIN2-$ F343 FE08 +0402 CP 'H'-64 ;CHECK FOR CTL-H BACKSPACE F345 280C +0403 JR Z,GLIN4-$ F347 FE20 +0404 CP ' ' F349 D8 +0405 RET C ;OTHER CONTROL CHARACTERS ARE ILLEGAL F34A 77 +0406 LD (HL),A F34B 23 +0407 INC HL ;STORE CHARACTER IN BUFFER F34C 0D +0408 DEC C F34D 20ED +0409 JR NZ,GLIN1-$ ;GET ANOTHER IF THERE'S MORE ROOM F34F 37 +0410 SCF F350 C9 +0411 RET ;RETURN WITH CARRY=1 IF TOO +0412 ;MANY CHARACTERS ARE ENTERED F351 77 +0413 GLIN2: LD (HL),A ;PUT CARRIAGE RETURN ON END OF LINE F352 C9 +0414 RET ;RETURN WITH CARRY BIT=0 +0415 F353 2B +0416 GLIN4: DEC HL ;DELETE LAST CHARACTER FROM BUFFER F354 CDECF3 +0417 CALL PNEXT F357 2008 +0418 DEFB ' ','H'-64 ;PRINT A SPACE TO OVERWRITE THE F359 04 +0419 DEFB EOT ; LAST CHARACTER, THEN DO A BACKSPACE F35A 0C +0420 INC C F35B 78 +0421 LD A,B ;MAKE SURE YOU'RE NOT TRYING TO F35C 91 +0422 SUB C ;BACKSPACE PAST THE START OF THE LINE F35D 30DD +0423 JR NC,GLIN1-$ F35F C9 +0424 RET +0425 ; +0426 ; +0427 ; F360 EDB1 +0428 SEARCH: CPIR ;SEARCH TABLE @HL FOR MATCH WITH A F362 C0 +0429 RET NZ ;EXIT NOW IF SEARCH FAILS F363 09 +0430 ADD HL,BC F364 09 +0431 ADD HL,BC ;ADD RESIDUE FROM CPIR BYTECOUNT F365 09 +0432 ADD HL,BC ; TO HL 3 TIMES TO GET POINTER F366 4E +0433 LD C,(HL) ; TO ADDRESS PART OF TABLE ENTRY F367 23 +0434 INC HL F368 46 +0435 LD B,(HL) F369 C9 +0436 RET ;EXIT WITH Z=1 TO INDICATE MATCH +0437 ; +0438 ; +0439 ; +0440 ; F36A 010000 +0441 PARAMS: LD BC,0 F36D FD7E00 +0442 LD A,(IY+0) F370 FE0D +0443 CP CR ;CHECK IF LINE TERMINATES F372 2008 +0444 JR NZ,PARA2-$ ; IMMEDIATELY WITH A RETURN F374 AF +0445 XOR A F375 C9 +0446 RET ;RETURN WITH PARAM COUNT=0 IF SO +0447 F376 0C +0448 PARA1: INC C F377 0C +0449 INC C F378 CB59 +0450 BIT 3,C F37A 37 +0451 SCF SD SYSTEMS Z80 ASSEMBLER PAGE 0014 ADDR CODE STMT SOURCE STATEMENT F37B C0 +0452 RET NZ ;ERROR IF > 4 NUMBERS ENTERED F37C C5 +0453 PARA2: PUSH BC ;SAVE PARAMETER COUNT F37D CD9FF3 +0454 CALL GETHEX ;READ A NUMBER FROM LINE BUFFER F380 C1 +0455 POP BC F381 D8 +0456 PARA4: RET C ;ERROR IF RESULT OVER 16 BITS F382 DD217CFF +0457 LD IX,PARAM1 ;POINT TO PARAMETER STORAGE AREA F386 DD09 +0458 ADD IX,BC ;ADD PARAMETER COUNT IN BC F388 DD7500 +0459 LD (IX+0),L F38B DD7401 +0460 LD (IX+1),H ;STORE DATA RETURNED FROM 'GETHEX' F38E FE20 +0461 CP ' ' F390 28E4 +0462 JR Z,PARA1-$ ;GET ANOTHER ITEM IF SPACE F392 FE2C +0463 CP ',' F394 28E0 +0464 JR Z,PARA1-$ ;GET ANOTHER ITEM IF COMMA F396 FE0D +0465 CP CR F398 37 +0466 SCF ;ELSE CHECK FOR CARRIAGE RETURN F399 C0 +0467 RET NZ ; AND EXIT WITH CY=1 IF NOT F39A 79 +0468 PAREND: LD A,C F39B CB3F +0469 SRL A ;A=COUNT OF NUMBERS ENTERED F39D 3C +0470 INC A F39E C9 +0471 RET +0472 ; +0473 ; GETHEX CONVERTS ASCII TO BINARY AND DOES +0474 ; HIGH LIMIT CHECKS TO LESS THAN 17 BITS. +0475 ; CARRY SET ON ILLEGAL CONVERSION RESULT +0476 ; TERMINATING CHARACTER RETURNS IN A. +0477 ; HL RETURNS WITH 16 BIT BINARY INTEGER +0478 ; F39F 210000 +0479 GETHEX: LD HL,0 F3A2 180B +0480 JR GNUM3-$ +0481 F3A4 0604 +0482 GNUM1: LD B,4 F3A6 29 +0483 GNUM2: ADD HL,HL ;MULTIPLY RESULT BY 16 F3A7 D8 +0484 RET C ;RETURN IF IT OVERFLOWS 16 BITS F3A8 10FC +0485 DJNZ GNUM2-$ F3AA 5F +0486 LD E,A ;APPEND NEW LOW ORDER DIGIT F3AB 1600 +0487 LD D,0 ;AND GET RESULT BACK INTO DE F3AD 19 +0488 ADD HL,DE F3AE D8 +0489 RET C ;RETURN IF OVERFLOW F3AF FD7E00 +0490 GNUM3: LD A,(IY+0) ;GET A CHARACTER FROM LINE INPUT F3B2 FD23 +0491 INC IY ; BUFFER @ IY AND BUMP IY F3B4 4F +0492 LD C,A F3B5 CDBDF3 +0493 CALL ASCHEX ;CONVERT ASCII TO NUMERIC F3B8 30EA +0494 JR NC,GNUM1-$ F3BA 79 +0495 LD A,C F3BB B7 +0496 OR A F3BC C9 +0497 RET +0498 ; +0499 ; F3BD D630 +0500 ASCHEX: SUB '0' F3BF D8 +0501 RET C F3C0 FE0A +0502 CP 10 F3C2 3F +0503 CCF F3C3 D0 +0504 RET NC F3C4 D607 +0505 SUB 7 F3C6 FE0A +0506 CP 10 F3C8 D8 +0507 RET C F3C9 FE10 +0508 CP 16 F3CB 3F +0509 CCF SD SYSTEMS Z80 ASSEMBLER PAGE 0015 ADDR CODE STMT SOURCE STATEMENT F3CC C9 +0510 RET +0511 ; +0512 ; +0513 ; F3CD 7C +0514 PUT4HS: LD A,H F3CE CDD8F3 +0515 CALL PUT2HX F3D1 7D +0516 LD A,L F3D2 CDD8F3 +0517 PUT2HS: CALL PUT2HX F3D5 C302F4 +0518 JP SPACE +0519 ; +0520 ; F3D8 F5 +0521 PUT2HX: PUSH AF F3D9 1F +0522 RRA F3DA 1F +0523 RRA F3DB 1F +0524 RRA F3DC 1F +0525 RRA F3DD CDE1F3 +0526 CALL PUTNIB F3E0 F1 +0527 POP AF F3E1 E60F +0528 PUTNIB: AND 00001111B F3E3 C690 +0529 ADD A,90H F3E5 27 +0530 DAA F3E6 CE40 +0531 ADC A,40H F3E8 27 +0532 DAA F3E9 C315F4 +0533 JP OUTPUT +0534 ; +0535 ; +0536 ; PMSG PRINTS THE STRING OF ASCII CHARACTERS +0537 ; POINTED TO BY THE RELATIVE ADDRESS IN DE +0538 ; UNTIL AN EOT IS ENCOUNTERED IN THE STRING. +0539 ; >0004 +0540 EOT EQU 04H >000D +0541 CR EQU 0DH >000A +0542 LF EQU 0AH +0543 ; +0544 F3EC E3 +0545 PNEXT: EX (SP),HL F3ED CDF2F3 +0546 CALL PMSG F3F0 E3 +0547 EX (SP),HL F3F1 C9 +0548 RET +0549 ; F3F2 7E +0550 PMSG: LD A,(HL) F3F3 23 +0551 INC HL F3F4 FE04 +0552 CP EOT F3F6 C8 +0553 RET Z F3F7 CD15F4 +0554 CALL OUTPUT F3FA 18F6 +0555 JR PMSG-$ +0556 ; +0557 ; +0558 ; CRLFS OUTPUTS A RETURN-LINEFEED-SPACE +0559 ; TO THE CONSOLE DEVICE +0560 ; F3FC CDECF3 +0561 CRLFS: CALL PNEXT F3FF 0D0A04 +0562 DEFB CR,LF,EOT F402 3E20 +0563 SPACE: LD A,' ' F404 C315F4 +0564 JP OUTPUT +0565 ; +0566 ; +0567 ; SD SYSTEMS Z80 ASSEMBLER PAGE 0016 ADDR CODE STMT SOURCE STATEMENT +0568 ; ECHO INPUTS ONE CHARACTER FROM THE CONSOLE +0569 ; DEVICE, PRINTS IT ON THE CONSOLE OUTPUT AND +0570 ; THEN RETURNS IT IN REGISTER A WITH BIT 7 RESET +0571 ; +0572 ; OUTPUT PRINTS THE CHARACTER IN REGISTER A ON +0573 ; THE CONSOLE OUTPUT DEVICE AND THEN DOES A CHECK +0574 ; FOR CONSOLE INPUT TO FREEZE OR ABORT OUTPUT. +0575 ; +0576 F407 CD09F0 +0577 ECHO: CALL CONIN ;INPUT A CHARACTER AND ECHO IT F40A F5 +0578 PUSH AF F40B CD0CF0 +0579 CALL CONOUT F40E F1 +0580 POP AF F40F FE5B +0581 CP 'Z'+1 F411 D8 +0582 RET C F412 D620 +0583 SUB 32 ;CONVERT UPPER CASE TO LOWER CASE F414 C9 +0584 RET +0585 ; +0586 ; +0587 ; F415 CD0CF0 +0588 OUTPUT: CALL CONOUT F418 CD06F0 +0589 CALL CONST ;SEE IF CONSOLE INPUT IS PENDING F41B 280F +0590 JR Z,OUTP2-$ F41D CD09F0 +0591 CALL CONIN F420 FE0D +0592 CP CR ;SEE IF CARRIAGE RETURN WAS TYPED F422 2805 +0593 JR Z,OUTP1-$ F424 CD09F0 +0594 CALL CONIN ;WAIT FOR ANOTHER INPUT CHARACTER F427 1803 +0595 JR OUTP2-$ ; THEN RETURN TO CALLING ROUTINE +0596 F429 3284FF +0597 OUTP1: LD (ESCFLG),A ;SET ESCAPE FLAG TO NON-ZERO VALUE F42C 3A84FF +0598 OUTP2: LD A,(ESCFLG) F42F B7 +0599 OR A ;RETURN CURRENT STATUS OF ESCAPE F430 C9 +0600 RET ; FLAG TO CALLING ROUTINE +0601 ; +0602 ; +0603 ; 0018 INCLUDE INTSRV.ASM +0001 ;******************************************************** +0002 ;* * +0003 ;* INTERRUPT SERVICE ROUTINES FOR KEYBOARD * +0004 ;* INPUT AND REAL-TIME CLOCK FUNCTIONS * +0005 ;* 3-Aug-80 * +0006 ;* * +0007 ;******************************************************** +0008 ; +0009 ; +0010 ; +0011 ; F431 3A30FF +0012 KBDST: LD A,(FIFCNT) ;GET INPUT FIFO BYTECOUNT F434 B7 +0013 OR A ;TEST IF EQUAL ZERO F435 C8 +0014 RET Z ;EXIT WITH A=0 IF QUEUE IS EMPTY F436 3EFF +0015 LD A,255 F438 C9 +0016 RET ;ELSE SET A=255 TO INDICATE DATA READY +0017 ; +0018 ; +0019 ; F439 CD31F4 +0020 KBDIN: CALL KBDST F43C 28FB +0021 JR Z,KBDIN-$ ;LOOP UNTIL KEYBOARD INPUT READY SD SYSTEMS Z80 ASSEMBLER PAGE 0017 ADDR CODE STMT SOURCE STATEMENT F43E E5 +0022 PUSH HL F43F CD6DF4 +0023 CALL REMOVE ;GET CHARACTER FROM INPUT QUEUE F442 E1 +0024 POP HL F443 C9 +0025 RET +0026 ; +0027 ; +0028 ; +0029 ; +0030 ; F444 2133FF +0031 STASH: LD HL,LOCK ;POINT TO SHIFT LOCK VARIABLES F447 BE +0032 CP (HL) ;TEST IF A=SHIFT LOCK CHARACTER F448 23 +0033 INC HL ; THEN POINT TO LOCK FLAG F449 2002 +0034 JR NZ,STASH2-$ ;JUMP IF NOT THE SHIFT CHARACTER F44B 34 +0035 INC (HL) ; ELSE COMPLIMENT THE SHIFT LOCK F44C C9 +0036 RET ; AND EXIT NOW +0037 F44D CB46 +0038 STASH2: BIT 0,(HL) ;TEST THE SHIFT LOCK FLAG F44F 280A +0039 JR Z,STASH3-$ ;JUMP IF SHIFT LOCK NOT SET F451 FE40 +0040 CP 40H ;ELSE CHECK FOR SHIFABLE CHARACTER F453 3806 +0041 JR C,STASH3-$ ; AND JUMP IF NOT EQUAL OR GREATER F455 FE7F +0042 CP 7FH ; THAN '@' AND LESS THAN RUBOUT F457 3002 +0043 JR NC,STASH3-$ F459 EE20 +0044 XOR 00100000B ;ELSE TOGGLE BIT 5 OF THE CHARACTER F45B 4F +0045 STASH3: LD C,A F45C 2130FF +0046 LD HL,FIFCNT ;BUMP INPUT FIFO CHARACTER COUNT F45F 7E +0047 LD A,(HL) F460 3C +0048 INC A F461 FE10 +0049 CP 16 F463 D0 +0050 RET NC ;EXIT NOW IF FIFO IS FULL F464 77 +0051 LD (HL),A ; ELSE INCREMENT FIFO COUNT F465 2131FF +0052 LD HL,FIFIN ;POINT HL TO FIFO INPUT OFFSET F468 CD74F4 +0053 CALL INDEX F46B 71 +0054 LD (HL),C ;STORE CHARACTER IN FIFO @ HL F46C C9 +0055 RET +0056 ; +0057 ; +0058 ; +0059 ; F46D 2130FF +0060 REMOVE: LD HL,FIFCNT F470 35 +0061 DEC (HL) F471 2132FF +0062 LD HL,FIFOUT ;POINT HL TO FIFO OUTPUT OFFSET F474 7E +0063 INDEX: LD A,(HL) F475 3C +0064 INC A F476 E60F +0065 AND 00001111B ;INCREMENT FIFO POINTER F478 77 +0066 LD (HL),A ; MODULO 16 AND REPLACE F479 2120FF +0067 LD HL,FIFO F47C 85 +0068 ADD A,L ;INDEX INTO FIFO BY OFFSET IN A F47D 6F +0069 LD L,A F47E 7E +0070 LD A,(HL) F47F C9 +0071 RET +0072 ; +0073 ; +0074 ; SOFTWARE DISK MOTOR TURN-OFF TIMER ROUTINE +0075 ; F480 216CFF +0076 DSKTMR: LD HL,MOTOR ;DECREMENT DISK TURN-OFF TIMER F483 35 +0077 DEC (HL) F484 C0 +0078 RET NZ ;EXIT IF NOT TIMED OUT YET F485 DB1C +0079 IN A,(BITDAT) SD SYSTEMS Z80 ASSEMBLER PAGE 0018 ADDR CODE STMT SOURCE STATEMENT F487 F644 +0080 OR 01000100B ;DISABLE ALL DRIVE SELECTS AND F489 D31C +0081 OUT (BITDAT),A ; TURN OFF THE SPINDLE MOTORS F48B C9 +0082 RET +0083 ; +0084 ; +0085 ; -- INTERRUPT SERVICE ROUTINE FOR PARALLEL KEYBOARD -- +0086 ; F48C ED7335FF +0087 KEYSRV: LD (SPSAVE),SP ;SAVE USER STACK POINTER AND F490 3157FF +0088 LD SP,TMPSTK+32 ; SWITCH TO LOCAL STACK F493 E5 +0089 PUSH HL F494 D5 +0090 PUSH DE F495 C5 +0091 PUSH BC F496 F5 +0092 PUSH AF ;SAVE MACHINE STATE F497 DB1E +0093 IN A,(KBDDAT) ;READ KEYBOARD INPUT PORT F499 2F +0094 CPL F49A 2A59FF +0095 LD HL,(PINVEC) ;GET KBD INTERRUPT ROUTINE VECTOR F49D 1822 +0096 JR DSPTCH-$ ; AND JUMP TO DISPATCH POINT +0097 ; +0098 ; +0099 ; +0100 ; -- INTERRUPT SERVICE ROUTINE FOR ONE SECOND TIMER -- +0101 ; F49F ED7335FF +0102 TIMER: LD (SPSAVE),SP ;SAVE USER STACK POINTER AND F4A3 3157FF +0103 LD SP,TMPSTK+32 ; SWITCH TO LOCAL STACK F4A6 E5 +0104 PUSH HL F4A7 D5 +0105 PUSH DE F4A8 C5 +0106 PUSH BC F4A9 F5 +0107 PUSH AF F4AA 2A57FF +0108 LD HL,(TIKVEC) ;GET CLOCK INTERRUPT ROUTINE VECTOR F4AD 1812 +0109 JR DSPTCH-$ ; AND JUMP TO DISPATCH POINT +0110 ; +0111 ; +0112 ; +0113 ; -- SERIAL INPUT INTERRUPT SERVICE ROUTINE FOR SIO -- +0114 ; F4AF ED7335FF +0115 SIOINT: LD (SPSAVE),SP ;SAVE USER STACK POINTER AND F4B3 3157FF +0116 LD SP,TMPSTK+32 ; SWITCH TO LOCAL STACK F4B6 E5 +0117 PUSH HL F4B7 D5 +0118 PUSH DE F4B8 C5 +0119 PUSH BC F4B9 F5 +0120 PUSH AF ;SAVE MACHINE STATE F4BA DB05 +0121 IN A,(SIODPB) ;READ SIO DATA INPUT PORT F4BC E67F +0122 AND 01111111B F4BE 2A5BFF +0123 LD HL,(SINVEC) ;GET SERIAL INPUT ROUTINE VECTOR F4C1 CDE7F4 +0124 DSPTCH: CALL CALLHL ;CALL SUBROUTINE ADDRESSED BY H F4C4 F1 +0125 POP AF F4C5 C1 +0126 POP BC F4C6 D1 +0127 POP DE F4C7 E1 +0128 POP HL F4C8 ED7B35FF +0129 LD SP,(SPSAVE) F4CC FB +0130 EI ;RE-ENABLE INTERRUPTS AND RETURN F4CD ED4D +0131 RETI +0132 ; +0133 ; +0134 ; -- RX ERROR INTERRUPT SERVICE ROUTINE FOR SIO -- +0135 ; +0136 ; ARRIVE HERE IF RECIEVE INTERRUPT FROM FRAMING, OVERRUN +0137 ; AND PARITY ERRORS. (PARITY CAN BE DISABLED) SD SYSTEMS Z80 ASSEMBLER PAGE 0019 ADDR CODE STMT SOURCE STATEMENT +0138 ; F4CF ED7335FF +0139 SIOERR: LD (SPSAVE),SP ;SAVE USER STACK POINTER AND F4D3 3157FF +0140 LD SP,TMPSTK+32 ; SWITCH TO LOCAL STACK F4D6 F5 +0141 PUSH AF F4D7 CDF5F4 +0142 CALL SIOIN2 ;CLEAR BAD CHARACTER FROM SIO F4DA 3E07 +0143 LD A,'G'-64 F4DC CD15F5 +0144 CALL SIOXMT ;OUTPUT A CTL-G AS A WARNING F4DF F1 +0145 POP AF F4E0 ED7B35FF +0146 LD SP,(SPSAVE) F4E4 FB +0147 EI F4E5 ED4D +0148 RETI +0149 ; +0150 ; F4E7 E9 +0151 CALLHL: JP (HL) +0152 ; +0153 ; +0154 ; +0155 ; POLLED MODE I/O ROUTINES FOR SIO CHANEL B +0156 ; F4E8 DB07 +0157 SIOST: IN A,(SIOCPB) ;GET SIO STATUS REGISTER F4EA E601 +0158 AND 00000001B F4EC C8 +0159 RET Z ;ACC=0 IF NO DATA AVAILABLE F4ED 3EFF +0160 LD A,255 F4EF C9 +0161 RET +0162 ; +0163 ; F4F0 CDE8F4 +0164 SIOIN: CALL SIOST ;TEST CONSOLE STATUS F4F3 28FB +0165 JR Z,SIOIN-$ ;LOOP UNTIL DATA IS RECIEVED F4F5 3E30 +0166 SIOIN2: LD A,00110000B ;RESET STATUS BITS IN SIO FOR F4F7 D307 +0167 OUT (SIOCPB),A ; PARITY/OVERRUN/FRAMING ERRORS, F4F9 DB05 +0168 IN A,(SIODPB) ; THEN GET THE INPUT CHARACTER F4FB E67F +0169 AND 01111111B F4FD C9 +0170 RET +0171 ; +0172 ; F4FE FE20 +0173 SIOOUT: CP ' ' ;TEST FOR CONTROL CHARACTERS F500 3013 +0174 JR NC,SIOXMT-$ ;JUMP IF PRINTABLE CHARACTER F502 CD15F5 +0175 CALL SIOXMT ; ELSE SEND CONTROL CHARACTER F505 3A79FF +0176 LD A,(NULLS) ; AND THEN SEND NULLS AS PADDING F508 3C +0177 INC A ;GET NULL PAD COUNT AND FIX SO F509 1806 +0178 JR PAD1-$ ; THAT COUNT=0 SENDS NO NULLS +0179 F50B F5 +0180 PAD: PUSH AF F50C AF +0181 XOR A F50D CD15F5 +0182 CALL SIOXMT ;OUTPUT A NULL TO THE SIO F510 F1 +0183 POP AF F511 3D +0184 PAD1: DEC A F512 20F7 +0185 JR NZ,PAD-$ ;LOOP SENDING NULLS TO SIO F514 C9 +0186 RET +0187 ; +0188 ; F515 F5 +0189 SIOXMT: PUSH AF F516 DB07 +0190 SIOX1: IN A,(SIOCPB) F518 E604 +0191 AND 00000100B ;TEST TBE STATUS BIT F51A 28FA +0192 JR Z,SIOX1-$ F51C F1 +0193 POP AF F51D D305 +0194 OUT (SIODPB),A ;OUTPUT DATA TO SIO F51F C9 +0195 RET SD SYSTEMS Z80 ASSEMBLER PAGE 0020 ADDR CODE STMT SOURCE STATEMENT +0196 ; +0197 ; +0198 ; +0199 ; 0019 INCLUDE CRTOUT.ASM +0001 ;******************************************************** +0002 ;* * +0003 ;* MEMORY-MAPPED CRT OUTPUT DRIVER * +0004 ;* * +0005 ;* Russell Smith 18-August-1980 * +0006 ;* * +0007 ;******************************************************** +0008 ; +0009 ; >0030 +0010 CRTBAS EQU CRTMEM.SHR.8 ;STARTING PAGE# OF 3K CRT SPACE >003C +0011 CRTTOP EQU CRTMEM+3072.SHR.8 ;ENDING PAGE# OF CRT SPACE +0012 ; +0013 ; F520 E5 +0014 CRTOUT: PUSH HL F521 D5 +0015 PUSH DE F522 C5 +0016 PUSH BC F523 CBBF +0017 RES 7,A F525 4F +0018 LD C,A F526 F3 +0019 DI ;KEEP THE WOLVES AWAY FOR A WHILE F527 ED7335FF +0020 LD (SPSAVE),SP F52B 3157FF +0021 LD SP,TMPSTK+32 ;POINT SP TO TOP OF LOCAL STACK F52E DB1C +0022 IN A,(BITDAT) F530 CBFF +0023 SET 7,A ;SELECT ROM/CRT MEMORY BANK F532 D31C +0024 OUT (BITDAT),A +0025 ; +0026 ; FIRST REMOVE THE OLD CURSOR CHARACTER FROM THE SCREEN +0027 ; F534 2175FF +0028 LD HL,CHRSAV ;GET CHARACTER NOW OVERLAYED BY CURSOR F537 46 +0029 LD B,(HL) F538 2A73FF +0030 LD HL,(CURSOR) ;LOAD HL WITH CURSOR POINTER F53B 7C +0031 LD A,H F53C E60F +0032 AND 00001111B ;A LITTLE INSURANCE THAT HL CAN'T F53E F630 +0033 OR CRTBAS ; EVER POINT OUTSIDE THE CRT MEMORY F540 67 +0034 LD H,A F541 70 +0035 LD (HL),B ;REMOVE CURSOR BY RESTORING CHARACTER +0036 ; +0037 ; PROCESS CHARACTER PASSED IN C +0038 ; F542 CD65F5 +0039 CALL OUTCH +0040 ; +0041 ; NOW STORE A NEW CURSOR CHARACTER AT THE CURSOR LOCATION +0042 ; F545 7E +0043 LD A,(HL) ;GET CHARACTER AT NEW CURSOR LOCATION F546 3275FF +0044 LD (CHRSAV),A ;SAVE FOR NEXT TIME 'CRTOUT' IS CALLED F549 FE20 +0045 CP ' ' ;TEST IF CHARACTER IS A SPACE F54B CBFF +0046 SET 7,A ;THEN TURN ON BIT 7 TO ENABLE BLINK F54D 2003 +0047 JR NZ,CRT2-$ ;JUMP IF CHARACTER IS NON-BLANK F54F 3A76FF +0048 LD A,(CSRCHR) ; ELSE GET CHARACTER USED FOR CURSOR F552 77 +0049 CRT2: LD (HL),A ;STORE CHARACTER IN A AS CURSOR MARK F553 2273FF +0050 LD (CURSOR),HL ;SAVE HL AS CURSOR POINTER +0051 F556 ED7B35FF +0052 LD SP,(SPSAVE) F55A DB1C +0053 IN A,(BITDAT) SD SYSTEMS Z80 ASSEMBLER PAGE 0021 ADDR CODE STMT SOURCE STATEMENT F55C CBBF +0054 RES 7,A ;SWITCH BACK THE LOWER 16K OF RAM F55E D31C +0055 OUT (BITDAT),A F560 FB +0056 EI ;INTERRUPTS ARE SAFE AGAIN F561 C1 +0057 POP BC F562 D1 +0058 POP DE F563 E1 +0059 POP HL F564 C9 +0060 RET +0061 ; +0062 ; +0063 ; F565 1178FF +0064 OUTCH: LD DE,LEADIN F568 1A +0065 LD A,(DE) ;GET LEAD-IN SEQUENCE STATE F569 B7 +0066 OR A F56A C270F6 +0067 JP NZ,MULTI ;JUMP IF IN A LEAD-IN SEQUENCE F56D 79 +0068 LD A,C ; ELSE PROCESS CHARACTER IN C F56E FE20 +0069 CP ' ' F570 380F +0070 JR C,CONTRL-$ ;JUMP IF A CONTROL CHARACTER F572 71 +0071 DISPLA: LD (HL),C ; ELSE STORE DISPLAYABLE CHARACTER F573 23 +0072 INC HL ; AND ADVANCE POINTER TO NEXT COLUMN F574 7D +0073 LD A,L F575 E67F +0074 AND 01111111B ;EXTRACT COLUMN# FROM HL F577 FE50 +0075 CP 80 F579 D8 +0076 RET C ;EXIT IF NOT PAST COLUMN 79 F57A CDE7F5 +0077 CALL RETURN ; ELSE DO AUTOMATIC CARRIAGE RETURN F57D CD42F6 +0078 CALL LFEED ; AND LINEFEED F580 C9 +0079 RET +0080 ; +0081 ; +0082 ; F581 E5 +0083 CONTRL: PUSH HL F582 218FF5 +0084 LD HL,CTLTAB ;SEARCH FOR CONTROL CHARACTER F585 010D00 +0085 LD BC,CTLSIZ/3 ; HANDLING SUBROUTINE IN TABLE F588 CD60F3 +0086 CALL SEARCH F58B E1 +0087 POP HL F58C C0 +0088 RET NZ ;EXIT IF NOT IMPLEMENTED F58D C5 +0089 PUSH BC F58E C9 +0090 RET ;DO SNEAKY JUMP TO PRESERVE REGISTERS +0091 F58F 1F +0092 CTLTAB: DEFB '_'-64 F590 1E +0093 DEFB '^'-64 F591 1B +0094 DEFB '['-64 F592 1A +0095 DEFB 'Z'-64 F593 18 +0096 DEFB 'X'-64 F594 11 +0097 DEFB 'Q'-64 F595 0D +0098 DEFB 'M'-64 F596 0C +0099 DEFB 'L'-64 F597 0B +0100 DEFB 'K'-64 F598 0A +0101 DEFB 'J'-64 F599 09 +0102 DEFB 'I'-64 F59A 08 +0103 DEFB 'H'-64 F59B 07 +0104 DEFB 'G'-64 +0105 F59C DCF5 +0106 DEFW BELL ;CTL-G IS THE BELL F59E BEF5 +0107 DEFW BAKSPC ;CTL-H IS CURSOR LEFT F5A0 CCF5 +0108 DEFW TAB ;CTL-I IS TAB F5A2 42F6 +0109 DEFW LFEED ;CTL-J IS CURSOR DOWN F5A4 2CF6 +0110 DEFW UPCSR ;CTL-K IS CURSOR UP F5A6 C4F5 +0111 DEFW FORSPC ;CTL-L IS CURSOR RIGHT SD SYSTEMS Z80 ASSEMBLER PAGE 0022 ADDR CODE STMT SOURCE STATEMENT F5A8 E7F5 +0112 DEFW RETURN ;CTL-M IS CARRIAGE RETURN F5AA 11F6 +0113 DEFW CLREOS ;CTL-Q IS CLEAR TO END-OF-SCREEN F5AC 03F6 +0114 DEFW CLREOL ;CTL-X IS CLEAR TO END-OF-LINE F5AE ECF5 +0115 DEFW CLRSCN ;CTL-Z IS CLEAR SCREEN F5B0 B6F5 +0116 DEFW ESCAPE ;CTL-[ IS ESCAPE F5B2 6CF6 +0117 DEFW HOMEUP ;CTL-^ IS HOME UP F5B4 BAF5 +0118 DEFW STUFF ;CTL-_ IS DISPLAY CONTROL CHARS +0119 >0027 +0120 CTLSIZ EQU $-CTLTAB +0121 ; +0122 ; F5B6 3E01 +0123 ESCAPE: LD A,1 F5B8 12 +0124 LD (DE),A ;SET LEAD-IN SEQUENCE STATE F5B9 C9 +0125 RET ; FOR XY CURSOR POSITIONING MODE +0126 ; +0127 ; F5BA 3E04 +0128 STUFF: LD A,4 F5BC 12 +0129 LD (DE),A ;SET LEAD-IN SEQUENCE STATE F5BD C9 +0130 RET ; FOR CONTROL CHAR OUTPUT MODE +0131 ; +0132 ; F5BE 7D +0133 BAKSPC LD A,L ;CHECK FOR LEFT MARGIN F5BF E67F +0134 AND 01111111B F5C1 C8 +0135 RET Z ;ABORT IF IN LEFTMOST COLUMN F5C2 2B +0136 DEC HL ;BACK UP CURSOR POINTER F5C3 C9 +0137 RET +0138 ; +0139 ; F5C4 7D +0140 FORSPC: LD A,L ;CHECK FOR RIGHTMOST COLUNM F5C5 E67F +0141 AND 01111111B F5C7 FE4F +0142 CP 79 F5C9 D0 +0143 RET NC ;DO NOTHING IF ALREADY THERE F5CA 23 +0144 INC HL F5CB C9 +0145 RET ;ELSE ADVANCE THE CURSOR POINTER +0146 ; +0147 ; F5CC 110800 +0148 TAB: LD DE,8 ;TABS ARE EVERY 8 COLUMNS F5CF 7D +0149 LD A,L ;GET COLUMN COMPONENT OF F5D0 E678 +0150 AND 01111000B ; PREVIOUS TAB POSITION F5D2 83 +0151 ADD A,E F5D3 FE50 +0152 CP 80 ;EXIT IF NEXT TAB COLUMN WOULD F5D5 D0 +0153 RET NC ; BE PAST THE RIGHT MARGIN F5D6 7D +0154 LD A,L F5D7 E6F8 +0155 AND 11111000B ;ELSE INCREMENT THE CURSOR F5D9 6F +0156 LD L,A ; POINTER FOR REAL F5DA 19 +0157 ADD HL,DE F5DB C9 +0158 RET +0159 ; +0160 ; F5DC DB1C +0161 BELL: IN A,(BITDAT) F5DE CBEF +0162 SET 5,A ;TOGGLE BIT 5 OF SYSTEM PIO TO F5E0 D31C +0163 OUT (BITDAT),A ; TRIGGER BELL HARDWARE TO SOUND F5E2 CBAF +0164 RES 5,A F5E4 D31C +0165 OUT (BITDAT),A F5E6 C9 +0166 RET +0167 ; +0168 ; F5E7 7D +0169 RETURN: LD A,L SD SYSTEMS Z80 ASSEMBLER PAGE 0023 ADDR CODE STMT SOURCE STATEMENT F5E8 E680 +0170 AND 10000000B F5EA 6F +0171 LD L,A ;MOVE CURSOR POINTER BACK F5EB C9 +0172 RET ; TO START OF LINE +0173 ; +0174 ; F5EC 210030 +0175 CLRSCN: LD HL,CRTMEM F5EF E5 +0176 PUSH HL F5F0 110130 +0177 LD DE,CRTMEM+1 F5F3 01000C +0178 LD BC,24*128 F5F6 3620 +0179 LD (HL),' ' F5F8 EDB0 +0180 LDIR ;FILL CRT MEMORY WITH SPACES F5FA E1 +0181 POP HL ;POINT TO HOME CURSOR POSITION F5FB 3E17 +0182 LD A,23 F5FD 3277FF +0183 LD (BASE),A ;MAKE BASE LINE# BE 23 AND F600 D314 +0184 OUT (SCROLL),A ; STORE IN SCROLL REGISTER F602 C9 +0185 RET +0186 ; +0187 ; F603 E5 +0188 CLREOL: PUSH HL ;SAVE CURSOR POINTER F604 7D +0189 LD A,L F605 E67F +0190 AND 01111111B ;GET COLUMN# COMPONENT OF F607 4F +0191 LD C,A ; CURSOR POINTER INTO C F608 3E50 +0192 LD A,80 ;CALCULATE HOW MANY CHARACTERS F60A 91 +0193 SUB C ; REMAIN ON CURRENT LINE F60B 47 +0194 LD B,A F60C CD66F6 +0195 CALL CLR ;CLEAR REST OF LINE @ HL F60F E1 +0196 POP HL F610 C9 +0197 RET +0198 ; +0199 ; F611 CD03F6 +0200 CLREOS: CALL CLREOL ;CLEAR REMAINDER OF CURRENT ROW F614 E5 +0201 PUSH HL F615 3A77FF +0202 LD A,(BASE) F618 4F +0203 LD C,A ;COPY BASE SCREEN ROW# TO C F619 7D +0204 CLRS1: LD A,L F61A 17 +0205 RLA F61B 7C +0206 LD A,H F61C 17 +0207 RLA ;GET ROW# COMPONENT OF HL INTO A F61D E61F +0208 AND 00011111B F61F B9 +0209 CP C ;SEE IF HL IS AT BOTTOM ROW OF SCREEN F620 2808 +0210 JR Z,CLRS2-$ ; AND LEAVE CLEAR LOOP IF SO F622 CD37F6 +0211 CALL DNCSR ;ELSE POINT HL TO NEXT ROW DOWN F625 CD60F6 +0212 CALL CLRLIN ; AND FILL THAT LINE WITH SPACES F628 18EF +0213 JR CLRS1-$ +0214 F62A E1 +0215 CLRS2: POP HL ;RESTORE ORIGINAL CURSOR POINTER F62B C9 +0216 RET +0217 ; +0218 ; F62C 1180FF +0219 UPCSR: LD DE,-128 ;SUBTRACT 1 FROM ROW# COMPONENT F62F 19 +0220 ADD HL,DE ; OF CURSOR POINTER IN HL F630 7C +0221 LD A,H F631 FE30 +0222 CP CRTBAS ;CHECK FOR UNDERFLOW OF POINTER F633 D0 +0223 RET NC F634 263B +0224 LD H,CRTTOP-1 ;WRAP CURSOR AROUND MODULO 3K F636 C9 +0225 RET +0226 ; +0227 ; SD SYSTEMS Z80 ASSEMBLER PAGE 0024 ADDR CODE STMT SOURCE STATEMENT F637 118000 +0228 DNCSR: LD DE,128 ;ADD 1 TO ROW# COMPONENT F63A 19 +0229 ADD HL,DE ; OF CURSOR POINTER IN HL F63B 7C +0230 LD A,H F63C FE3C +0231 CP CRTTOP ;CHECK FOR OVERFLOW OF POINTER F63E D8 +0232 RET C F63F 2630 +0233 LD H,CRTBAS ;RESET POINTER MODULO 128*24 F641 C9 +0234 RET +0235 ; +0236 ; +0237 ; F642 7D +0238 LFEED: LD A,L F643 17 +0239 RLA F644 7C +0240 LD A,H F645 17 +0241 RLA ;EXTRACT ROW# COMPONENT OF HL F646 E61F +0242 AND 00011111B F648 4F +0243 LD C,A ;COPY ROW# INTO C FOR SCROLL TEST F649 CD37F6 +0244 CALL DNCSR ;MOVE CURSOR TO NEXT ROW DOWN F64C 3A77FF +0245 LD A,(BASE) ;TEST IF CURSOR WAS ON BOTTOM ROW F64F B9 +0246 CP C ; OF SCREEN BEFORE MOVING DOWN F650 C0 +0247 RET NZ ;EXIT IF NOT AT BOTTOM +0248 F651 E5 +0249 PUSH HL ;ELSE PREP TO SCROLL SCREEN UP F652 CD60F6 +0250 CALL CLRLIN ;FILL NEW BOTTOM LINE WITH SPACES F655 29 +0251 ADD HL,HL F656 7C +0252 LD A,H ;GET ROW# COMPONENT OF HL INTO A F657 E61F +0253 AND 00011111B F659 3277FF +0254 LD (BASE),A ;STORE NEW BASE LINE# F65C D314 +0255 OUT (SCROLL),A ;NOW SCROLL UP NEW BLANK BOTTOM LINE F65E E1 +0256 POP HL F65F C9 +0257 RET +0258 ; +0259 ; F660 7D +0260 CLRLIN: LD A,L F661 E680 +0261 AND 10000000B ;POINT HL TO FIRST COLUMN OF ROW F663 6F +0262 LD L,A F664 0650 +0263 LD B,80 F666 3620 +0264 CLR: LD (HL),' ' ;STORE ASCII SPACES AT ADDRESS IN HL F668 23 +0265 INC HL ; AND INCREMENT HL F669 10FB +0266 DJNZ CLR-$ ;REPEAT NUMBER OF TIMES GIVEN BY B F66B C9 +0267 RET +0268 ; +0269 ; F66C 0E20 +0270 HOMEUP: LD C,' ' ;FAKE-OUT CURSOR ADDRESSING ROUTINE F66E 1817 +0271 JR SETROW-$ ; TO DO HOMEUP ALMOST FOR FREE +0272 ; +0273 ; F670 EB +0274 MULTI: EX DE,HL ;UNCONDITIONALLY RESET THE LEAD-IN F671 3600 +0275 LD (HL),0 ; STATE TO ZERO BEFORE GOING ON F673 EB +0276 EX DE,HL F674 FE01 +0277 CP 1 F676 2008 +0278 JR NZ,M2TST-$ F678 79 +0279 SETXY: LD A,C ;GET SECOND CHAR OF SEQUENCE F679 FE3D +0280 CP '=' F67B C0 +0281 RET NZ ;ABORT SEQUENCE IF NOT '=' F67C 3E02 +0282 LD A,2 F67E 12 +0283 LD (DE),A ;MAKE LEADIN=2 NEXT TIME F67F C9 +0284 RET +0285 SD SYSTEMS Z80 ASSEMBLER PAGE 0025 ADDR CODE STMT SOURCE STATEMENT F680 FE02 +0286 M2TST: CP 2 F682 2019 +0287 JR NZ,M3TST-$ F684 3E03 +0288 LD A,3 F686 12 +0289 LD (DE),A ;MAKE LEADIN=3 NEXT TIME F687 3A77FF +0290 SETROW: LD A,(BASE) ;ARRIVE HERE ON THIRD CHARACTER F68A 81 +0291 ADD A,C ; OF ESC,'=',ROW,COL SEQUENCE F68B D61F +0292 SUB ' '-1 F68D D618 +0293 SETR2: SUB 24 F68F 30FC +0294 JR NC,SETR2-$ ;MAKE SURE ROW# IS BETWEEN 0 AND 23 F691 C618 +0295 ADD A,24 F693 F660 +0296 OR CRTMEM.SHR.7 ;MERGE IN MSB'S OF CRT MEMORY F695 67 +0297 LD H,A F696 2E00 +0298 LD L,0 F698 CB3C +0299 SRL H F69A CB1D +0300 RR L F69C C9 +0301 RET +0302 F69D FE03 +0303 M3TST: CP 3 F69F 200C +0304 JR NZ,M4TST-$ F6A1 79 +0305 SETCOL: LD A,C ;ARRIVE HERE ON FOURTH CHARACTER F6A2 D620 +0306 SUB ' ' ; OF ESC,'=',ROW,COL SEQUENCE F6A4 D650 +0307 SETC2: SUB 80 F6A6 30FC +0308 JR NC,SETC2-$ ;MAKE SURE COL# IS BETWEEN 0 AND 79 F6A8 C650 +0309 ADD A,80 F6AA B5 +0310 OR L ;MERGE IN COL# WITH L F6AB 6F +0311 LD L,A F6AC C9 +0312 RET +0313 F6AD CD72F5 +0314 M4TST: CALL DISPLA ;DISPLAY THE CONTROL CHARACTER F6B0 C9 +0315 RET ; PASSED IN C +0316 ; +0317 ; +0318 ; +0319 ; 0020 INCLUDE DISKIO.ASM +0001 ;******************************************************** +0002 ;* * +0003 ;* DISK INPUT/OUTPUT DRIVER SUBROUTINE PACKAGE * +0004 ;* FOR WESTERN DIGITAL 1771 DISK CONTROLLER * +0005 ;* * +0006 ;* bullet-proof error recovery added 12-APR-80 * +0007 ;* * +0008 ;******************************************************** +0009 ; +0010 ; +0011 ; EQUATES FOR DISK CONTROLLER PORTS AND COMMAND CODES +0012 ; >0010 +0013 STSREG EQU WD1771+0 ;STATUS REGISTER >0010 +0014 CMDREG EQU WD1771+0 ;COMMAND REGISTER >0011 +0015 TRKREG EQU WD1771+1 ;TRACK REGISTER >0012 +0016 SECREG EQU WD1771+2 ;SECTOR REGISTER >0013 +0017 DATREG EQU WD1771+3 ;DATA REGISTER +0018 ; >0088 +0019 RDCMD EQU 10001000B ;READ COMMAND >00A8 +0020 WRTCMD EQU 10101000B ;WRITE COMMAND >001C +0021 SKCMD EQU 00011100B ;SEEK COMMAND >00D0 +0022 FINCMD EQU 11010000B ;FORCE INTR COMMAND >000C +0023 RSTCMD EQU 00001100B ;RESTORE COMMAND SD SYSTEMS Z80 ASSEMBLER PAGE 0026 ADDR CODE STMT SOURCE STATEMENT >0004 +0024 HLOAD EQU 00000100B ;RD/WRT HEAD LOAD ENABLE +0025 ; >00C9 +0026 RET EQU 0C9H ;SUBROUTINE RETURN INSTR OPCODE >0066 +0027 NMIVEC EQU 0066H ;THE NON-MASKABLE INTERRUPT IS +0028 ;USED FOR DATA SYNCRONIZATION BETWEEN +0029 ;THE Z-80 AND 1771 DISK CONTROLLER +0030 ; +0031 ; +0032 ; F6B1 79 +0033 SELECT: LD A,C ;GET UNIT# PASSED IN C AND F6B2 FE04 +0034 CP 4 ; CHECK FOR MAXIMUM VALID# F6B4 D0 +0035 RET NC ;ERROR IF NUMBER > 3 F6B5 CDB8F7 +0036 CALL TURNON ;MAKE SURE DISKS ARE TURNED ON F6B8 DB1C +0037 IN A,(BITDAT) F6BA 47 +0038 LD B,A ;SAVE CURRENT DRIVE SELECT DATA F6BB E6F8 +0039 AND 11111000B ;MERGE IN NEW DRIVE UNIT# IN C F6BD B1 +0040 OR C ; IN PLACE OF THE CURRENT ONE F6BE D31C +0041 OUT (BITDAT),A ; TO SELECT THE NEW DISK DRIVE F6C0 CDAEF7 +0042 CALL FORCE ;TEST NEW DRIVE'S READY STATUS F6C3 2806 +0043 JR Z,SEL2-$ ; AND CONTINUE IF ITS READY F6C5 78 +0044 LD A,B F6C6 D31C +0045 OUT (BITDAT),A ;ELSE PUT BACK OLD DRIVE SELECT DATA F6C8 3E80 +0046 LD A,10000000B ; AND RETURN DRIVE-NOT-READY STATUS F6CA C9 +0047 RET +0048 F6CB 2165FF +0049 SEL2: LD HL,UNIT ;POINT HL TO DRIVE SELECT DATA F6CE 7E +0050 LD A,(HL) ;LOAD A WITH CURRENT UNIT# F6CF 71 +0051 LD (HL),C ; AND STORE NEW UNIT# FROM C F6D0 FEFF +0052 CP 255 ;TEST IF NO DRIVE HAS BEEN SELECTED F6D2 2806 +0053 JR Z,SEL3-$ ; YET AND SKIP NEXT SEGMENT IF SO F6D4 23 +0054 INC HL ;POINT TO HEAD POSITION TABLE F6D5 85 +0055 ADD A,L ; AND ADD IN NEW UNIT# AS INDEX F6D6 6F +0056 LD L,A F6D7 DB11 +0057 IN A,(TRKREG) ;GET CURRENT HEAD POSITION F6D9 77 +0058 LD (HL),A ; AND STORE IN TABLE @ HL F6DA 2166FF +0059 SEL3: LD HL,TRKTAB F6DD 7D +0060 LD A,L F6DE 81 +0061 ADD A,C ;INDEX INTO TABLE TO GET F6DF 6F +0062 LD L,A ; HEAD POSITION OF NEW DRIVE F6E0 7E +0063 LD A,(HL) F6E1 FEFF +0064 CP 255 ;TEST IF NEW DRIVE HAS EVER BEEN F6E3 2804 +0065 JR Z,HOME-$ ; SELECTED AND DO A HOME IF NOT F6E5 D311 +0066 OUT (TRKREG),A ;OUTPUT THE DRIVE'S CURRENT HEAD F6E7 AF +0067 XOR A ; POSITION TO THE TRACK REGISTER F6E8 C9 +0068 RET +0069 ; +0070 ; +0071 ; F6E9 CDABF7 +0072 HOME: CALL READY ;CLEAR DISK CONTROLLER F6EC C0 +0073 RET NZ ;EXIT IF DRIVE NOT READY F6ED AF +0074 XOR A F6EE 326DFF +0075 LD (TRACK),A ;SET TRACK# IN MEM TO ZERO F6F1 060C +0076 RESTOR: LD B,RSTCMD ;LOAD B WITH A RESTORE COMMAND F6F3 CD93F7 +0077 CALL STEP ;EXECUTE HEAD MOVING OPERATION F6F6 EE04 +0078 XOR 00000100B ;GET TRUE TRACK 0 STATUS F6F8 E69C +0079 AND 10011100B ;MASK TO ERROR BITS F6FA C9 +0080 RET ;RETURN 1771 STATUS IN A +0081 ; SD SYSTEMS Z80 ASSEMBLER PAGE 0027 ADDR CODE STMT SOURCE STATEMENT +0082 ; +0083 ; F6FB CDABF7 +0084 SEEK: CALL READY ;CLEAR DISK CONTROLLER F6FE C0 +0085 RET NZ ;EXIT IF DRIVE NOT READY F6FF 79 +0086 LD A,C ;GET TRACK# DATA FROM C AND F700 FE4D +0087 CP 77 ; CHECK FOR MAXIMUM VALID# F702 D0 +0088 RET NC ;FORGET IT IF TRACK# > 76 F703 326DFF +0089 LD (TRACK),A ; ELSE STORE TRACK# FOR SEEK F706 D313 +0090 OUT (DATREG),A ;OUTPUT TRACK # TO 1771 F708 061C +0091 LD B,SKCMD ;LOAD B WITH A SEEK COMMAND AND F70A CD93F7 +0092 CALL STEP ; GO SEEK WITH PROPER STEP RATE F70D E698 +0093 AND 10011000B ;MASK TO READY,SEEK AND CRC ERROR F70F C8 +0094 RET Z ; BITS AND RETURN IF ALL GOOD +0095 F710 CDF1F6 +0096 CALL RESTOR ;ELSE TRY TO RE-CAILBRATE HEAD F713 C0 +0097 RET NZ ;ERROR IF WE CAN'T FIND TRACK 0 F714 79 +0098 LD A,C F715 D313 +0099 OUT (DATREG),A ;OUTPUT TRACK# TO 1771 F717 061C +0100 LD B,SKCMD F719 CD93F7 +0101 CALL STEP ;TRY TO SEEK THE TRACK AGAIN F71C E698 +0102 AND 10011000B F71E C9 +0103 RET ;RETURN FINAL SEEK STATUS IN A +0104 ; +0105 ; +0106 ; F71F CDABF7 +0107 WRITE: CALL READY ;CLEAR THE DISK CONTROLLER F722 C0 +0108 RET NZ ;EXIT IF DRIVE NOT READY F723 CB77 +0109 BIT 6,A F725 C0 +0110 RET NZ ;EXIT IF DISK IS WRITE-PROTECTED F726 06A8 +0111 LD B,WRTCMD F728 1806 +0112 JR RDWRT-$ +0113 F72A CDABF7 +0114 READ: CALL READY ;CLEAR DISK CONTROLLER F72D C0 +0115 RET NZ ;EXIT IF DRIVE NOT READY F72E 0688 +0116 LD B,RDCMD F730 2271FF +0117 RDWRT: LD (IOPTR),HL ;STORE DISK I/O DATA POINTER F733 216EFF +0118 LD HL,SECTOR F736 71 +0119 LD (HL),C ;STORE SECTOR# FOR READ/WRITE F737 23 +0120 INC HL F738 70 +0121 LD (HL),B ;SAVE READ/WRITE COMMAND BYTE F739 23 +0122 INC HL F73A 3602 +0123 LD (HL),2 ;SET DISK OPERATION RE-TRY COUNT F73C F3 +0124 RW1: DI ;NO INTERRUPTS DURING DISK I/O F73D 216600 +0125 LD HL,NMIVEC ;SAVE BYTE AT NMI VECTOR LOCATION F740 56 +0126 LD D,(HL) ; IN D FOR DURATION OF READ/WRITE F741 36C9 +0127 LD (HL),RET ; LOOP AND REPLACE IT WITH A RET F743 216BFF +0128 LD HL,RECLEN F746 46 +0129 LD B,(HL) ;B=NUMBER OF BYTES/SECTOR F747 0E13 +0130 LD C,DATREG ;C=1771 DATA REGISTER PORT# F749 2A71FF +0131 LD HL,(IOPTR) ;HL=DISK READ/WRITE DATA POINTER F74C 3A6EFF +0132 LD A,(SECTOR) ;GET SECTOR NUMBER F74F D312 +0133 OUT (SECREG),A ;OUTPUT SECTOR# TO 1771 F751 CDAEF7 +0134 CALL FORCE ;ISSUE A FORCE INTERRUPT COMMAND F754 CB6F +0135 BIT 5,A ; TO TEST CURRENT HEAD LOAD STATUS F756 3A6FFF +0136 LD A,(CMDTYP) ;GET READ OR WRITE COMMAND BYTE F759 2002 +0137 JR NZ,RW2-$ ;JUMP IF HEAD IS ALREADY LOADED F75B F604 +0138 OR HLOAD ; ELSE MERGE IN HLD BIT F75D CDA3F7 +0139 RW2: CALL CMDOUT ;START THE 1771 DOING IT'S THING SD SYSTEMS Z80 ASSEMBLER PAGE 0028 ADDR CODE STMT SOURCE STATEMENT F760 CB6F +0140 BIT 5,A ;TEST IF COMMAND IS A READ OR WRITE F762 200D +0141 JR NZ,WLOOP-$ ; AND JUMP TO THE CORRECT LOOP F764 76 +0142 RLOOP: HALT F765 EDA2 +0143 INI F767 C264F7 +0144 JP NZ,RLOOP F76A CD9CF7 +0145 CALL BUSY ;LOOP UNTIL 1771 COMES UN-BUSY F76D E69C +0146 AND 10011100B ;MASK OFF TO READY, NOT FOUND, CRC F76F 180B +0147 JR RW3-$ ; AND LOST DATA STATUS BITS +0148 F771 76 +0149 WLOOP: HALT F772 EDA3 +0150 OUTI F774 C271F7 +0151 JP NZ,WLOOP F777 CD9CF7 +0152 CALL BUSY F77A E6BC +0153 AND 10111100B ;MASK OFF AS ABOVE PLUS WRITE FAULT F77C 216600 +0154 RW3: LD HL,NMIVEC F77F 72 +0155 LD (HL),D ;RESTORE BYTE @ NMI VECTOR F780 FB +0156 EI F781 C8 +0157 RET Z ;RETURN IF NO DISK I/O ERRORS F782 2170FF +0158 LD HL,RETRY F785 35 +0159 DEC (HL) ;DECREMENT RE-TRY COUNT AND F786 2002 +0160 JR NZ,RW4-$ ; EXECUTE COMAND AGAIN IF NOT=0 F788 B7 +0161 OR A F789 C9 +0162 RET ;ELSE RETURN 1771 ERROR STATUS +0163 F78A 216DFF +0164 RW4: LD HL,TRACK F78D 4E +0165 LD C,(HL) ;GET TRACK# FOR CURRENT OPERATION F78E CDFBF6 +0166 CALL SEEK ;TRY TO RE-CAILBRATE THE HEAD F791 18A9 +0167 JR RW1-$ ; BEFORE READING OR WRITING AGAIN +0168 ; +0169 ; +0170 ; F793 3A6AFF +0171 STEP: LD A,(SPEED) ;GET STEP SPEED VARIABLE F796 E603 +0172 AND 00000011B F798 B0 +0173 OR B ;MERGE WITH SEEK/HOME COMMAND IN B F799 CDA3F7 +0174 CALL CMDOUT ;OUTPUT COMMAND AND DELAY F79C DB10 +0175 BUSY: IN A,(STSREG) F79E CB47 +0176 BIT 0,A ;TEST BUSY BIT FROM F7A0 20FA +0177 JR NZ,BUSY-$ ; 1771 AND LOOP TILL=0 F7A2 C9 +0178 RET +0179 ; +0180 ; +0181 ; F7A3 D310 +0182 CMDOUT: OUT (CMDREG),A ;OUTPUT A COMMAND TO THE 1771 F7A5 CDA8F7 +0183 CALL PAUSE ;WASTE 44 MICROSECONDS F7A8 E3 +0184 PAUSE: EX (SP),HL F7A9 E3 +0185 EX (SP),HL F7AA C9 +0186 RET +0187 ; +0188 ; +0189 ; F7AB CDB8F7 +0190 READY: CALL TURNON ;KEEP THOSE DISKS SPINING FOLKS F7AE 3ED0 +0191 FORCE: LD A,FINCMD ;ISSUE A FORCE INTERRUPT COMMAND F7B0 CDA3F7 +0192 CALL CMDOUT F7B3 DB10 +0193 IN A,(STSREG) ;READ STATUS REGISTER CONTENTS F7B5 CB7F +0194 BIT 7,A ;TEST DRIVE NOT READY BIT F7B7 C9 +0195 RET +0196 ; +0197 ; SD SYSTEMS Z80 ASSEMBLER PAGE 0029 ADDR CODE STMT SOURCE STATEMENT +0198 ; F7B8 3E1E +0199 TURNON: LD A,30 F7BA 326CFF +0200 LD (MOTOR),A ;RE-LOAD THE MOTOR TURN-OFF TIMER F7BD CDA8F7 +0201 CALL PAUSE F7C0 DB1C +0202 IN A,(BITDAT) F7C2 CB57 +0203 BIT 2,A ;TEST IF MOTORS HAVE BEEN STOPPED F7C4 C8 +0204 RET Z ; AND EXIT IF STILL TURNED ON F7C5 E6BB +0205 AND 10111011B ;ELSE RE-ENABLE THE DRIVE SELECTS F7C7 D31C +0206 OUT (BITDAT),A ; AND ACTIVATE THE MOTOR RELAY F7C9 C5 +0207 PUSH BC F7CA 0600 +0208 LD B,0 ;SET READY LOOP MAX TIMEOUT F7CC CDDCF7 +0209 TURN2: CALL WAIT ;WAIT 1/93 SECOND AND TEST READY F7CF 2802 +0210 JR Z,TURN3-$ ;EXIT LOOP IF DRIVE READY F7D1 10F9 +0211 DJNZ TURN2-$ ; ELSE TRY AGAIN UP TO 256 TIMES F7D3 0609 +0212 TURN3: LD B,9 F7D5 CDDCF7 +0213 TURN4: CALL WAIT ;GIVE ABOUT 1/10 SECOND MORE DELAY F7D8 10FB +0214 DJNZ TURN4-$ F7DA C1 +0215 POP BC F7DB C9 +0216 RET +0217 ; +0218 ; F7DC DB1B +0219 WAIT: IN A,(CTC3) ;GET CURRENT CTC3 COUNT VALUE F7DE 4F +0220 LD C,A F7DF DB1B +0221 WAIT2: IN A,(CTC3) F7E1 B9 +0222 CP C ;TEST IF CTC3 HAS CHANGED BY 1 COUNT F7E2 28FB +0223 JR Z,WAIT2-$ ; AND LOOP UNTIL IT CHANGES F7E4 18C8 +0224 JR FORCE-$ ; THEN GO TEST DRIVE READY STATUS +0225 ; +0226 ; +0227 ; +0228 ; 0021 ; F7E6 0000 0022 ROMEND: DEFW 0 ;TAIL OF FREE MEMORY LINKED LIST 0023 ; >FF00 0024 ORG RAM 0025 INCLUDE MEMORY.ASM +0001 ;******************************************************** +0002 ;* * +0003 ;* STORAGE ALLOCATION FOR 256 BYTE SCRATCH RAM * +0004 ;* * +0005 ;******************************************************** +0006 ; +0007 ; +0008 >FF00 +0009 VECTAB EQU $ ;INTERRUPT VECTOR TABLE STARTS HERE >FF00 +0010 SIOVEC: DEFS 16 ;SPACE FOR 8 VECTORS FOR SIO >FF10 +0011 CTCVEC: DEFS 8 ;SPACE FOR 4 VECTORS FOR CTC >FF18 +0012 SYSVEC: DEFS 4 ;SPACE FOR 2 VECTORS FOR SYSTEM PIO >FF1C +0013 GENVEC: DEFS 4 ;SPACE FOR 2 VECTORS FOR GENERAL PIO +0014 ; +0015 ; +0016 ; KEYBOARD DATA INPUT FIFO VARIABLES +0017 >FF20 +0018 FIFO: DEFS 16 ;CONSOLE INPUT FIFO >FF30 +0019 FIFCNT: DEFS 1 ;FIFO DATA COUNTER >FF31 +0020 FIFIN: DEFS 1 ;FIFI INPUT POINTER >FF32 +0021 FIFOUT: DEFS 1 ;FIFO OUTPUT POINTER >FF33 +0022 LOCK: DEFS 2 ;SHIFT LOCK CHARACTER+FLAG BYTE SD SYSTEMS Z80 ASSEMBLER PAGE 0030 ADDR CODE STMT SOURCE STATEMENT +0023 ; +0024 ; +0025 ; STACK POINTER SAVE AND LOCAL STACK FOR INTERRUPT ROUTINES +0026 >FF35 +0027 SPSAVE: DEFS 2 ;USER STACK POINTER SAVE AREA >FF37 +0028 TMPSTK: DEFS 32 ;LOCAL STACK FOR INTERRUPTS +0029 ; +0030 ; +0031 ; 'SOFTWARE' VECTORS FOR INTERRUPT SERVICE ROUTINES +0032 >FF57 +0033 TIKVEC: DEFS 2 ;ONE SECOND INTERRUPT ROUTINE VECTOR >FF59 +0034 PINVEC: DEFS 2 ;PARALLEL CONSOLE INPUT VECTOR >FF5B +0035 SINVEC: DEFS 2 ;SERIAL CONSOLE INPUT VECTOR +0036 ; +0037 ; +0038 ; CLOCK-TIMER INTERRUPT VARIABLES +0039 >FF5D +0040 TIKCNT: DEFS 2 ;BINARY CLOCK TICK COUNTER >FF5F +0041 DAY: DEFS 1 ;CALENDAR DAY >FF60 +0042 MONTH: DEFS 1 ; MONTH >FF61 +0043 YEAR: DEFS 1 ; YEAR >FF62 +0044 HRS: DEFS 1 ;CLOCK HOURS REGISTER >FF63 +0045 MINS: DEFS 1 ; MINUTES RETISTER >FF64 +0046 SECS: DEFS 1 ; SECONDS REGISTER +0047 ; +0048 ; +0049 ; DISK I/O DRIVER VARIABLES +0050 >FF65 +0051 UNIT: DEFS 1 ;CURRENTLY SELECTED DISK# >FF66 +0052 TRKTAB: DEFS 4 ;4 DRIVE HEAD POSITION TABLE >FF6A +0053 SPEED: DEFS 1 ;SEEK SPEED FOR 1771 COMMANDS >FF6B +0054 RECLEN: DEFS 1 ;SECTOR RECORD LENGTH VARIABLE >FF6C +0055 MOTOR: DEFS 1 ;DRIVE MOTOR TURN-OFF TIMER >FF6D +0056 TRACK: DEFS 1 >FF6E +0057 SECTOR: DEFS 1 >FF6F +0058 CMDTYP: DEFS 1 ;COMMAND BYTE FOR READS/WRITES >FF70 +0059 RETRY: DEFS 1 ;DISK OPERATION RE-TRY COUNT >FF71 +0060 IOPTR: DEFS 2 ;DISK I/O BUFFER POINTER +0061 ; +0062 ; +0063 ; +0064 ; CRT OUTPUT DRIVER VARIABLES +0065 >FF73 +0066 CURSOR: DEFS 2 ;CURSOR POINTER >FF75 +0067 CHRSAV: DEFS 1 ;CHARACTER OVERLAYED BY CURSOR >FF76 +0068 CSRCHR: DEFS 1 ;CHARACTER USED FOR A CURSOR >FF77 +0069 BASE: DEFS 1 ;CURRENT CONTENTS OF SCROLL REGISTER >FF78 +0070 LEADIN: DEFS 1 ;STATE OF LEAD-IN SEQUENCE HANDLER +0071 ; +0072 ; +0073 ; NULL PAD COUNT FOR SERIAL OUTPUT DELAY +0074 >FF79 +0075 NULLS: DEFS 1 ;# OF NULLS SENT AFTER CONTROL CHARS. +0076 ; +0077 ; +0078 ; LISTHEAD POINTER FOR DYNAMIC MEMORY ALLOCATION SCHEME +0079 >FF7A +0080 FREPTR: DEFS 2 SD SYSTEMS Z80 ASSEMBLER PAGE 0031 ADDR CODE STMT SOURCE STATEMENT +0081 ; +0082 ; +0083 ; CONSOLE MONITOR PROGRAM VARIABLES +0084 >FF7C +0085 PARAM1: DEFS 2 ;STORAGE FOR NUMBERS READ >FF7E +0086 PARAM2: DEFS 2 ; FROM LINE INPUT BUFFER >FF80 +0087 PARAM3: DEFS 2 ; BY 'PARAMS' SUBROUTINE >FF82 +0088 PARAM4: DEFS 2 >FF84 +0089 ESCFLG: DEFS 1 ;CONSOLE ESCAPE FLAG >FF85 +0090 COFLAG: DEFS 1 ;CONSOLE OUTPUT TOGGLE >FF86 +0091 LAST: DEFS 2 ;LAST ADDRESS USED BY 'MEMDMP' >FF88 +0092 LINBUF: DEFS 64 ;CONSOLE LINE INPUT BUFFER +0093 ; +0094 ; 0026 0027 ; 0028 END SD SYSTEMS Z80 ASSEMBLER PAGE 0032 ADDR CODE STMT SOURCE STATEMENT ASCHEX F3BD BAKSPC F5BE BASE FF77 BAUD F078 BAUD1 F079 BAUD2 F081 BAUD3 F08D BAUDA 0000 BAUDB 000C BELL F5DC BITCTL 001D BITDAT 001C BLOCAD F2F3 BLOCK F2E6 BOOT F1A3 BUSY F79C CALLHL F4E7 CALLX F180 CHECK F2B9 CHRSAV FF75 CLR F666 CLREOL F603 CLREOS F611 CLRLIN F660 CLRS1 F619 CLRS2 F62A CLRSCN F5EC CMDOUT F7A3 CMDREG 0010 CMDSIZ 0021 CMDTAB F182 CMDTYP FF6F COFLAG FF85 COLD F000 CONIN F009 CONOUT F00C CONST F006 CONTRL F581 CR 000D CRLFS F3FC CRT2 F552 CRTBAS 0030 CRTMEM 3000 CRTOUT F520 CRTTOP 003C CSRCHR FF76 CTC 0018 CTC0 0018 CTC1 0019 CTC2 001A CTC3 001B CTCVEC FF10 CTLSIZ 0027 CTLTAB F58F CURSOR FF73 DATREG 0013 DAY FF5F DECIDE F062 DISPLA F572 DNCSR F637 DSKCMD F1BD DSKERR F1E7 DSKR2 F1F9 DSKTMR F480 DSPTCH F4C1 DUMP F227 DUMP2 F230 DUMP3 F23A DUMP4 F246 DUMP5 F248 ECHO F407 EOT 0004 ESCAPE F5B6 ESCFLG FF84 FIFCNT FF30 FIFIN FF31 FIFO FF20 FIFOUT FF32 FILL F2D8 FILL1 F2DC FINCMD 00D0 FORCE F7AE FORSPC F5C4 FREPTR FF7A GENPIO 0008 GENVEC FF1C GETHEX F39F GETLIN F33B GLIN1 F33C GLIN2 F351 GLIN4 F353 GNUM1 F3A4 GNUM2 F3A6 GNUM3 F3AF GOTO F281 HLOAD 0004 HOME F6E9 HOMEUP F66C HRS FF62 IN1 F302 IN2 F31B IN3 F31D INCMD F2FE INDEX F474 INIT F02A INIT1 F02E INIT2 F03F INIT3 F04E INTAB F0D3 IOPTR FF71 KBDCTL 001F KBDDAT 001E KBDIN F439 KBDST F431 KEYSRV F48C LAST FF86 LEADIN FF78 LF 000A LFEED F642 LINBUF FF88 LOCK FF33 M2TST F680 M3TST F69D M4TST F6AD MDATA F2CE MDMP1 F20B MDMP2 F20E MDMP3 F213 MDMP3A F218 MDMP3B F220 MEMDMP F205 MINS FF63 MONTH FF60 MOTOR FF6C MULTI F670 NMIVEC 0066 NULLS FF79 OUTCH F565 OUTCMD F320 OUTP1 F429 OUTP2 F42C OUTPUT F415 PAD F50B PAD1 F511 PARA1 F376 PARA2 F37C PARA4 F381 PARALL F070 PARAM1 FF7C PARAM2 FF7E PARAM3 FF80 PARAM4 FF82 PARAMS F36A PAREND F39A PAUSE F7A8 PINVEC FF59 PMSG F3F2 PNEXT F3EC PROMPT F12B PUT2HS F3D2 PUT2HX F3D8 PUT4HS F3CD PUTNIB F3E1 RAM FF00 RATES F0CB RDCMD 0088 RDWRT F730 READ F72A READY F7AB RECLEN FF6B REMOVE F46D RESTOR F6F1 RET 00C9 RETRY FF70 RETURN F5E7 RLOOP F764 ROM F000 ROMEND F7E6 RSTCMD 000C RW1 F73C RW2 F75D RW3 F77C RW4 F78A SCROLL 0014 SEARCH F360 SECREG 0012 SECS FF64 SECTOR FF6E SEEK F6FB SEL2 F6CB SEL3 F6DA SELECT F6B1 SETC2 F6A4 SETCOL F6A1 SETR2 F68D SETROW F687 SETXY F678 SIGNON F0A5 SINVEC FF5B SIO 0004 SIOCPA 0006 SIOCPB 0007 SIODPA 0004 SIODPB 0005 SIOERR F4CF SIOIN F4F0 SIOIN2 F4F5 SIOINT F4AF SIOOUT F4FE SIOST F4E8 SIOVEC FF00 SIOX1 F516 SIOXMT F515 SKCMD 001C SPACE F402 SPEED FF6A SPSAVE FF35 STASH F444 STASH2 F44D STASH3 F45B STEP F793 STSREG 0010 STUFF F5BA SWIT2 F337 SWITCH F329 SYSPIO 001C SYSVEC FF18 TAB F5CC SD SYSTEMS Z80 ASSEMBLER PAGE 0033 ADDR CODE STMT SOURCE STATEMENT TEST F28C TEST1 F295 TEST2 F298 TEST3 F2A4 TIKCNT FF5D TIKVEC FF57 TIMER F49F TMPSTK FF37 TRACK FF6D TRKREG 0011 TRKTAB FF66 TURN2 F7CC TURN3 F7D3 TURN4 F7D5 TURNON F7B8 UNIT FF65 UPCSR F62C VECTAB FF00 VIEW F257 VIEW2 F265 VIEW3 F278 VIEW4 F27C VIEW5 F27E WAIT F7DC WAIT2 F7DF WARM F003 WD1771 0010 WHAT F172 WLOOP F771 WRITE F71F WRTCMD 00A8 YEAR FF61 SD SYSTEMS Z80 ASSEMBLER PAGE 0034 ADDR CODE STMT SOURCE STATEMENT CROSS REFERENCE LISTING SYMBOL VALUE TYPE STMT STATEMENT REFERENCES ------ ----- ---- ---- -------------------- ASCHEX F3BD +0500 +0493 +0213 +0204 BAKSPC F5BE +0133 +0107 BASE FF77 +0069 +0290 +0254 +0245 +0202 +0183 BAUD F078 +0096 +0084 BAUD1 F079 +0097 +0100 BAUD2 F081 +0101 +0105 BAUD3 F08D +0107 +0109 BAUDA 0000 +0198 BAUDB 000C +0201 +0256 +0111 BELL F5DC +0161 +0106 BITCTL 001D +0211 +0215 BITDAT 001C +0210 +0206 +0202 +0045 +0041 +0037 +0165 +0163 +0161 - +0055 +0053 +0024 +0022 +0081 +0079 +0220 +0085 - BLOCAD F2F3 +0327 +0318 BLOCK F2E6 +0315 +0067 BOOT F1A3 +0091 +0066 BUSY F79C +0175 +0177 +0152 +0145 CALLHL F4E7 +0151 +0124 CALLX F180 +0048 +0233 +0038 CHECK F2B9 +0278 +0264 +0218 CHRSAV FF75 +0067 +0044 +0028 +0175 CLR F666 +0264 +0266 +0195 CLREOL F603 +0188 +0200 +0114 CLREOS F611 +0200 +0113 CLRLIN F660 +0260 +0250 +0212 CLRS1 F619 +0204 +0213 CLRS2 F62A +0215 +0210 CLRSCN F5EC +0175 +0115 +0046 CMDOUT F7A3 +0182 +0192 +0174 +0139 CMDREG 0010 +0014 +0182 CMDSIZ 0021 +0076 +0027 CMDTAB F182 +0052 +0076 +0026 CMDTYP FF6F +0058 +0136 COFLAG FF85 +0090 +0380 COLD F000 +0013 CONIN F009 +0016 +0594 +0591 +0577 CONOUT F00C +0017 +0588 +0579 +0386 +0118 CONST F006 +0015 +0589 CONTRL F581 +0083 +0070 CR 000D +0541 +0592 +0562 +0465 +0443 +0400 +0353 +0200 +0024 - +0012 +0126 +0124 CRLFS F3FC +0561 +0347 +0289 +0185 +0022 CRT2 F552 +0049 +0047 CRTBAS 0030 +0010 +0233 +0222 +0033 CRTMEM 3000 0012 +0296 +0177 +0175 +0011 +0010 CRTOUT F520 +0014 +0385 +0018 +0017 CRTTOP 003C +0011 +0231 +0224 CSRCHR FF76 +0068 +0048 CTC 0018 +0204 +0234 +0233 +0232 +0231 CTC0 0018 +0231 +0236 CTC1 0019 +0232 CTC2 001A +0233 +0239 CTC3 001B +0234 +0221 +0219 +0243 SD SYSTEMS Z80 ASSEMBLER PAGE 0035 ADDR CODE STMT SOURCE STATEMENT CTCVEC FF10 +0011 +0237 +0154 CTLSIZ 0027 +0120 +0085 CTLTAB F58F +0092 +0120 +0084 CURSOR FF73 +0066 +0050 +0030 DATREG 0013 +0017 +0130 +0099 +0090 DAY FF5F +0041 DECIDE F062 +0081 +0087 DISPLA F572 +0071 +0314 DNCSR F637 +0228 +0244 +0211 DSKCMD F1BD +0106 +0074 DSKERR F1E7 +0127 +0121 +0115 +0111 +0099 +0095 +0093 DSKR2 F1F9 +0132 +0136 DSKTMR F480 +0076 +0183 DSPTCH F4C1 +0124 +0109 +0096 DUMP F227 +0165 +0190 +0160 +0124 DUMP2 F230 +0169 +0172 DUMP3 F23A +0175 +0184 DUMP4 F246 +0182 +0179 DUMP5 F248 +0183 +0181 ECHO F407 +0577 +0399 +0352 +0212 +0199 EOT 0004 +0540 +0562 +0552 +0419 +0284 +0130 +0044 +0014 +0127 - ESCAPE F5B6 +0123 +0116 ESCFLG FF84 +0089 +0598 +0597 +0021 FIFCNT FF30 +0019 +0060 +0046 +0012 FIFIN FF31 +0020 +0052 FIFO FF20 +0018 +0067 FIFOUT FF32 +0021 +0062 FILL F2D8 +0298 +0069 FILL1 F2DC +0301 +0307 FINCMD 00D0 +0022 +0191 FORCE F7AE +0191 +0224 +0134 +0042 FORSPC F5C4 +0140 +0111 FREPTR FF7A +0080 +0190 GENPIO 0008 +0200 GENVEC FF1C +0013 GETHEX F39F +0479 +0454 GETLIN F33B +0398 +0017 GLIN1 F33C +0399 +0423 +0409 GLIN2 F351 +0413 +0401 GLIN4 F353 +0416 +0403 GNUM1 F3A4 +0482 +0494 GNUM2 F3A6 +0483 +0485 GNUM3 F3AF +0490 +0480 GOTO F281 +0228 +0071 HLOAD 0004 +0024 +0138 HOME F6E9 +0072 +0065 +0094 +0023 HOMEUP F66C +0270 +0117 HRS FF62 +0044 IN1 F302 +0347 +0363 IN2 F31B +0360 +0354 IN3 F31D +0362 +0356 INCMD F2FE +0343 +0072 INDEX F474 +0063 +0053 INIT F02A +0033 +0013 INIT1 F02E +0035 +0038 INIT2 F03F +0051 +0060 INIT3 F04E +0065 +0071 SD SYSTEMS Z80 ASSEMBLER PAGE 0036 ADDR CODE STMT SOURCE STATEMENT INTAB F0D3 +0144 +0050 IOPTR FF71 +0060 +0131 +0117 KBDCTL 001F +0213 +0223 +0090 KBDDAT 001E +0212 +0093 +0088 +0079 KBDIN F439 +0020 +0021 +0016 KBDST F431 +0012 +0020 +0015 KEYSRV F48C +0087 +0151 LAST FF86 +0091 +0161 +0148 LEADIN FF78 +0070 +0064 LF 000A +0542 +0562 +0012 +0126 +0124 LFEED F642 +0238 +0109 +0078 LINBUF FF88 +0092 +0031 +0023 +0015 LOCK FF33 +0022 +0031 M2TST F680 +0286 +0278 M3TST F69D +0303 +0287 M4TST F6AD +0314 +0304 MDATA F2CE +0289 +0281 +0198 MDMP1 F20B +0148 MDMP2 F20E +0149 +0145 MDMP3 F213 +0152 +0147 MDMP3A F218 +0155 +0157 MDMP3B F220 +0160 +0150 MEMDMP F205 +0144 +0065 MINS FF63 +0045 MONTH FF60 +0042 MOTOR FF6C +0055 +0200 +0076 MULTI F670 +0274 +0067 NMIVEC 0066 +0027 +0154 +0125 NULLS FF79 +0075 +0176 OUTCH F565 +0064 +0039 OUTCMD F320 +0369 +0073 OUTP1 F429 +0597 +0593 OUTP2 F42C +0598 +0595 +0590 OUTPUT F415 +0588 +0564 +0554 +0533 +0272 +0183 +0135 PAD F50B +0180 +0185 PAD1 F511 +0184 +0178 PARA1 F376 +0448 +0464 +0462 PARA2 F37C +0453 +0444 PARA4 F381 +0456 PARALL F070 +0088 +0078 PARAM1 FF7C +0085 +0457 +0035 PARAM2 FF7E +0086 +0112 +0036 PARAM3 FF80 +0087 +0116 +0037 PARAM4 FF82 +0088 PARAMS F36A +0441 +0032 PAREND F39A +0468 PAUSE F7A8 +0184 +0201 +0183 PINVEC FF59 +0034 +0095 PMSG F3F2 +0550 +0555 +0546 PNEXT F3EC +0545 +0561 +0417 +0282 +0128 +0041 +0011 +0123 PROMPT F12B +0011 +0045 +0039 +0025 +0014 PUT2HS F3D2 +0517 +0351 +0349 +0292 +0286 +0171 PUT2HX F3D8 +0521 +0517 +0515 PUT4HS F3CD +0514 +0290 +0166 PUTNIB F3E1 +0528 +0526 RAM FF00 0011 0024 +0034 RATES F0CB +0134 +0106 RDCMD 0088 +0019 +0116 SD SYSTEMS Z80 ASSEMBLER PAGE 0037 ADDR CODE STMT SOURCE STATEMENT RDWRT F730 +0117 +0112 READ F72A +0114 +0119 +0098 +0025 READY F7AB +0190 +0114 +0107 +0084 +0072 RECLEN FF6B +0054 +0128 REMOVE F46D +0060 +0023 RESTOR F6F1 +0076 +0096 RET 00C9 +0026 +0127 RETRY FF70 +0059 +0158 RETURN F5E7 +0169 +0112 +0077 RLOOP F764 +0142 +0144 ROM F000 0010 0015 ROMEND F7E6 0022 +0191 RSTCMD 000C +0023 +0076 RW1 F73C +0124 +0167 RW2 F75D +0139 +0137 RW3 F77C +0154 +0147 RW4 F78A +0164 +0160 SCROLL 0014 +0203 +0255 +0184 SEARCH F360 +0428 +0086 +0028 SECREG 0012 +0016 +0133 SECS FF64 +0046 SECTOR FF6E +0057 +0132 +0118 SEEK F6FB +0084 +0166 +0114 +0024 SEL2 F6CB +0049 +0043 SEL3 F6DA +0059 +0053 SELECT F6B1 +0033 +0110 +0092 +0022 SETC2 F6A4 +0307 +0308 SETCOL F6A1 +0305 SETR2 F68D +0293 +0294 SETROW F687 +0290 +0271 SETXY F678 +0279 SIGNON F0A5 +0122 +0091 SINVEC FF5B +0035 +0123 SIO 0004 +0199 +0254 +0253 +0252 +0251 SIOCPA 0006 +0253 SIOCPB 0007 +0254 +0190 +0167 +0157 +0259 +0116 +0114 SIODPA 0004 +0251 SIODPB 0005 +0252 +0194 +0168 +0121 SIOERR F4CF +0139 +0160 SIOIN F4F0 +0164 +0165 +0112 +0020 SIOIN2 F4F5 +0166 +0142 SIOINT F4AF +0115 +0159 SIOOUT F4FE +0173 +0383 +0117 +0021 SIOST F4E8 +0157 +0164 +0019 SIOVEC FF00 +0010 +0269 +0158 SIOX1 F516 +0190 +0192 SIOXMT F515 +0189 +0182 +0175 +0174 +0144 SKCMD 001C +0021 +0100 +0091 SPACE F402 +0563 +0518 +0167 SPEED FF6A +0053 +0171 SPSAVE FF35 +0027 +0052 +0020 +0146 +0139 +0129 +0115 +0102 +0087 - STASH F444 +0031 +0185 +0184 STASH2 F44D +0038 +0034 STASH3 F45B +0045 +0043 +0041 +0039 STEP F793 +0171 +0101 +0092 +0077 STSREG 0010 +0013 +0193 +0175 STUFF F5BA +0128 +0118 SD SYSTEMS Z80 ASSEMBLER PAGE 0038 ADDR CODE STMT SOURCE STATEMENT SWIT2 F337 +0386 +0384 SWITCH F329 +0380 +0064 SYSPIO 001C +0205 +0213 +0212 +0211 +0210 SYSVEC FF18 +0012 +0225 +0150 TAB F5CC +0148 +0108 TEST F28C +0241 +0070 TEST1 F295 +0248 +0273 TEST2 F298 +0250 +0257 TEST3 F2A4 +0261 +0269 TIKCNT FF5D +0040 TIKVEC FF57 +0033 +0108 +0182 TIMER F49F +0102 +0155 TMPSTK FF37 +0028 +0021 +0140 +0116 +0103 +0088 TRACK FF6D +0056 +0164 +0089 +0075 TRKREG 0011 +0015 +0066 +0057 TRKTAB FF66 +0052 +0059 TURN2 F7CC +0209 +0211 TURN3 F7D3 +0212 +0210 TURN4 F7D5 +0213 +0214 TURNON F7B8 +0199 +0190 +0036 UNIT FF65 +0051 +0049 +0165 UPCSR F62C +0219 +0110 VECTAB FF00 +0009 VIEW F257 +0198 +0222 +0068 VIEW2 F265 +0204 VIEW3 F278 +0217 VIEW4 F27C +0219 +0201 VIEW5 F27E +0221 +0203 WAIT F7DC +0219 +0213 +0209 WAIT2 F7DF +0221 +0223 WARM F003 +0014 +0128 WD1771 0010 +0202 +0017 +0016 +0015 +0014 +0013 WHAT F172 +0041 +0034 +0029 +0018 WLOOP F771 +0149 +0151 +0141 WRITE F71F +0107 +0026 WRTCMD 00A8 +0020 +0111 YEAR FF61 +0043 ERRORS=0000