Home Indietro Su Avanti
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
0017 ;********************************************************
0018 ;* *
0019 ;* COLD START INITIALIZATION ROUTINE FOR *
0020 ;* CONFIGURING THE SYSTEM AFTER A POWER-ON *
0021 ;* OR PUSHBUTTON RESET. *
0022 ;* 18-Oct-80 *
0023 ;* *
0024 ;********************************************************
0025 ;
0026 ;
0027 ; -- MONITOR ENTRY POINT TABLE --
0028 ;
F000 C32AF0 0029 COLD: JP INIT ;MONITOR COLD ENTRY POINT
F003 C32BF1 0030 WARM: JP PROMPT ;MONITOR WARM ENTRY POINT
F006 C331F4 0031 CONST: JP KBDST ;CONSOLE STATUS VECTOR
F009 C339F4 0032 CONIN: JP KBDIN ;CONSOLE INPUT VECTOR
F00C C320F5 0033 CONOUT: JP CRTOUT ;CONSOLE OUTPUT VECTOR
F00F C320F5 0034 JP CRTOUT ;CRT OUTPUT VECTOR
F012 C3E8F4 0035 JP SIOST ;SIO CHANEL B STATUS VECTOR
F015 C3F0F4 0036 JP SIOIN ;SIO CHANEL B INPUT VECTOR
F018 C3FEF4 0037 JP SIOOUT ;SIO CHANEL B OUTPUT VECTOR
F01B C3B1F6 0038 JP SELECT ;DISK DRIVE SELECT
F01E C3E9F6 0039 JP HOME ;HOME R/W HEAD
F021 C3FBF6 0040 JP SEEK ;SEEK TO TRACK
F024 C32AF7 0041 JP READ ;READ SECTOR
F027 C31FF7 0042 JP WRITE ;WRITE SECTOR
0043 ;
0044 ;
0045 ;
0046 ; DO A SHORT POST-RESET TIME DELAY. ALSO INITIALIZES THE
0047 ; STACK POINTER AND FILLS THE MONITOR SCRATCH RAM WITH ZEROS.
0048 ;
F02A F3 0049 INIT: DI
F02B 2100FF 0050 LD HL,RAM ;POINT TO START OF MONITOR RAM
F02E 3600 0051 INIT1: LD (HL),0 ;FILL 256 BYTE SPACE WITH ZEROS
F030 F9 0052 LD SP,HL ;DO SOMETHING USEFUL TO ADD DELAY
F031 2C 0053 INC L
F032 20FA 0054 JR NZ,INIT1-$ ;LOOP TAKES ABOUT 4 MILLISECONDS
0055 ;
0056 ; INITIALIZE THE Z-80 FOR INTERRUPT MODE #2
0057
F034 7C 0058 LD A,H
PAGE 0002
ADDR CODE STMT SOURCE STATEMENT
F035 ED47 0059 LD I,A ;LOAD I REG WITH MSB OF VECTOR TABLE
F037 ED5E 0060 IM 2 ; AND SELECT INTERRUPT MODE 2
0061 ;
F039 CDECF5 0062 CALL CLRSCN ;FILL THE CRT MEMORY WITH BLANKS
0063 ;
0064 ; STORE ANY NON-ZERO VALUES FOR VARIABLES IN MEMORY
0065 ;
F03C 21D3F0 0066 LD HL,INTAB ;POINT TO DEFAULT VARIABLE TABLE
F03F 0600 0067 INIT2: LD B,0
F041 4E 0068 LD C,(HL) ;BC=DATA BLOCK BYTECOUNT
F042 23 0069 INC HL
F043 5E 0070 LD E,(HL) ;DE=DESTINATION FOR DATA
F044 23 0071 INC HL
F045 56 0072 LD D,(HL)
F046 23 0073 INC HL
F047 EDB0 0074 LDIR ;COPY DATA @ HL TO VARIABLES @ DE
F049 CB7E 0075 BIT 7,(HL)
F04B 28F2 0076 JR Z,INIT2-$ ;LOOP AGAIN IF NOT AT END OF TABLE
0077 ;
0078 ; INITIALIZE THE PROGRAMMABLE I/O DEVICES
0079 ;
F04D 23 0080 INC HL ;POINT TO I/O INIT DATA TABLE
F04E 46 0081 INIT3: LD B,(HL) ;B=INIT LOOP BYTECOUNT
F04F 23 0082 INC HL
F050 4E 0083 LD C,(HL) ;C=DEVICE CONTROL PORT#
F051 23 0084 INC HL
F052 EDB3 0085 OTIR ;SEND DATA @ HL TO PORT @ C
F054 CB7E 0086 BIT 7,(HL) ;TEST FOR TABLE END MARKER
F056 28F6 0087 JR Z,INIT3-$ ;LOOP AGAIN IF NOT AT END
0088 ;
0089 ; DETERMINE IF CONSOLE I/O CONFIGURATION WILL BE FOR THE
0090 ; ON-BOARD CRT AND KEYBOARD OR AN EXTERNAL SERIAL TERMINAL.
0091 ;
F058 ED78 0092 IN A,(C) ;TEST SIO READ REGISTER 2 TO DETERMINE
F05A FE06 0093 CP 00000110B ; IF THE SIO IS INSTALLED IN THE BOARD
F05C 2012 0094 JR NZ,PARALL-$ ;SKIP CONFIGURATION TEST IF NO SIO
F05E DB1E 0095 IN A,(KBDDAT) ;MAKE SURE KBD PIO 'READY' IS RESET
F060 0610 0096 LD B,00010000B ;B=RESET SIO EXTERNAL STATUS COMMAND
F062 ED41 0097 DECIDE: OUT (C),B ;TEST FOR ARRIVAL OF A SERIAL
F064 ED78 0098 IN A,(C) ; INPUT CHARACTER START BIT
F066 CB67 0099 BIT 4,A
F068 200E 0100 JR NZ,BAUD-$ ;EXIT LOOP IF START BIT DETECTED
F06A DB1C 0101 IN A,(BITDAT)
F06C CB5F 0102 BIT 3,A ;TEST FOR DATA READY STROBE FROM
F06E 20F2 0103 JR NZ,DECIDE-$ ; PARALLEL KBD AND LOOP IF INACTIVE
F070 DB1E 0104 PARALL: IN A,(KBDDAT) ;DISCARD FIRST KEYBOARD CHARACTER
F072 3E83 0105 LD A,10000011B
F074 D31F 0106 OUT (KBDCTL),A ;ENABLE INTERRUPTS FROM KBD PIO
F076 182D 0107 JR SIGNON-$ ;GO SIGNON WITH BULIT-IN CONSOLE I/O
0108 ;
0109 ;
0110 ; AUTOMATIC BAUD RATE SETTING ROUTINE FOR SIO
0111 ;
F078 AF 0112 BAUD: XOR A
F079 ED41 0113 BAUD1: OUT (C),B
F07B ED50 0114 IN D,(C) ;READ SIO STATUS REGISTER
F07D CB62 0115 BIT 4,D ;TEST THE SYNC/HUNT BIT
F07F 28F8 0116 JR Z,BAUD1-$ ;LOOP UNTIL IT CHANGES STATE
PAGE 0003
ADDR CODE STMT SOURCE STATEMENT
F081 3C 0117 BAUD2: INC A
F082 ED41 0118 OUT (C),B ;RESET REGISTER #0 FLAGS AGAIN
F084 ED50 0119 IN D,(C) ; AND LOOP TIMING THE SYNC/HUNT BIT
F086 CB62 0120 BIT 4,D
F088 20F7 0121 JR NZ,BAUD2-$ ;REPEAT UNTIL BIT CHANGES AGAIN
F08A 21CAF0 0122 LD HL,RATES-1
F08D 23 0123 BAUD3: INC HL ;INDEX INTO BAUD RATE TABLE
F08E 17 0124 RLA ; USING COUNT DERRIVED IN A
F08F 30FC 0125 JR NC,BAUD3-$
F091 7E 0126 LD A,(HL) ;GET BAUD RATE CONTROL BYTE FROM
F092 D30C 0127 OUT (BAUDB),A ; TABLE AND OUTPUT TO COM-8116 TIMER
F094 CDF0F4 0128 CALL SIOIN ;DISARD FIRST SERIAL INPUT CHARACTER
F097 3E01 0129 LD A,1
F099 D307 0130 OUT (SIOCPB),A ;RE-PROGRAM SIO B TO GENERATE
F09B 3E1C 0131 LD A,00011100B ; INTERRUPTS ON RECIEVED DATA,
F09D D307 0132 OUT (SIOCPB),A ; PARITY DOES NOT AFFECT VECTOR
F09F 21FEF4 0133 LD HL,SIOOUT
F0A2 220DF0 0134 LD (CONOUT+1),HL ;RE-DIRECT CONSOLE OUTPUT TO SIO
0135 ;
0136 ; PRINT SIGNON MESSAGE
0137 ;
F0A5 FB 0138 SIGNON: EI
F0A6 CDECF3 0139 CALL PNEXT
F0A9 0D0A 0140 DEFB CR,LF
F0AB 2E2E2E20 0141 DEFM '... system monitor 3.3 ...'
73797374
656D206D
6F6E6974
6F722033
2E33202E
2E2E
F0C5 0D0A 0142 DEFB CR,LF
F0C7 04 0143 DEFB EOT
F0C8 C303F0 0144 JP WARM ;GO ENTER MONITOR
0145 ;
0146 ;
0147 ;
0148 ; BAUD RATE CONSTANTS FOR COM 8116 BAUD RATE GENERATOR
0149 ;
F0CB 05 0150 RATES: DEFB 0101B ; 300 BAUD
F0CC 06 0151 DEFB 0110B ; 600 BAUD
F0CD 07 0152 DEFB 0111B ; 1200 BAUD
F0CE 0A 0153 DEFB 1010B ; 2400 BAUD
F0CF 0C 0154 DEFB 1100B ; 4800 BAUD
F0D0 0E 0155 DEFB 1110B ; 9600 BAUD
F0D1 0F 0156 DEFB 1111B ; 19200 BAUD
F0D2 0F 0157 DEFB 1111B ; 19200 BAUD
0158 ;
0159 ;
>F0D3 0160 INTAB EQU $ ;INITIALIZATION DATA TABLES
0161 ;
0162 ;
0163 ; INITIALIZE THE Z-80 'I' REGISTER INTERRUPT VECTOR TABLE
0164 ;
F0D3 02 0165 DEFB 2
F0D4 1AFF 0166 DEFW SYSVEC+2
F0D6 8CF4 0167 DEFW KEYSRV ;PARALLEL KEYBOARD INTERRUPT VECTOR
0168
PAGE 0004
ADDR CODE STMT SOURCE STATEMENT
F0D8 02 0169 DEFB 2
F0D9 16FF 0170 DEFW CTCVEC+6
F0DB 9FF4 0171 DEFW TIMER ;ONE SECOND TIMER INTERRUPT VECTOR
0172
F0DD 04 0173 DEFB 4
F0DE 04FF 0174 DEFW SIOVEC+4
F0E0 AFF4 0175 DEFW SIOINT ;SIO RECIEVE INTERRUPT VECTOR
F0E2 CFF4 0176 DEFW SIOERR ;SIO PARITY, OVERRUN & FRAMING ERROR
0177 ;
0178 ; INITIALIZE DISK I/O DRIVER VARIABLES
0179 ;
F0E4 08 0180 DEFB 8
F0E5 65FF 0181 DEFW UNIT
F0E7 FF 0182 DEFB 255 ;FLAG ALL DRIVES AS DE-SELECTED
F0E8 FFFFFFFF 0183 DEFB 255,255,255,255 ;CLEAR HEAD POSITION TABLE
F0EC 00 0184 DEFB 00000000B ;SELECT FASTEST SEEK SPEED
F0ED 80 0185 DEFB 128 ;SELECT 128 BYTE SECTOR LENGTH
F0EE 1E 0186 DEFB 30 ;SET MOTOR TURN-OFF TIMER
0187 ;
0188 ; INITIALIZE THE CRT DISPLAY CURSOR
0189 ;
F0EF 02 0190 DEFB 2
F0F0 75FF 0191 DEFW CHRSAV
F0F2 20 0192 DEFB ' '
F0F3 5F 0193 DEFB '_' ;USE NON-BLINKING UNDERSCORE
0194 ;
0195 ; SET DEFAULT 'SOFTWARE' INTERRUPT VECTORS
0196 ;
F0F4 06 0197 DEFB 6
F0F5 57FF 0198 DEFW TIKVEC
F0F7 80F4 0199 DEFW DSKTMR ;POINT 'TIKVEC' TO DISK MOTOR TIMER
F0F9 44F4 0200 DEFW STASH ;POINT 'PINVEC' TO FIFO INPUT ROUTINE
F0FB 44F4 0201 DEFW STASH ;POINT 'SINVEC' TO FIFO INPUT ROUTINE
0202 ;
0203 ; SET FREE MEMORY POINTER
0204 ;
F0FD 02 0205 DEFB 2
F0FE 7AFF 0206 DEFW FREPTR
F100 E6F7 0207 DEFW ROMEND ;POINT TO FIRST LOCATION AFTER MONITOR
0208 ;
0209 ;
F102 FF 0210 DEFB -1 ;END OF VARIABLE INIT TABLE
0211 ;
0212 ;
0213 ;
>0000 0214 BAUDA EQU 00H ;CHANEL A BAUD RATE GENETATOR
>0004 0215 SIO EQU 04H ;DUAL SERIAL I/O
>0008 0216 GENPIO EQU 08H ;GENERAL PURPOSE PARALLEL I/O
>000C 0217 BAUDB EQU 0CH ;CHANEL B BAUD RATE GENERATOR
>0010 0218 WD1771 EQU 10H ;WESTERN DIGITAL DISK CONTROLLER
>0014 0219 SCROLL EQU 14H ;CRT SCROLL MEMORY SCROLL REGISTER
>0018 0220 CTC EQU 18H ;QUAD COUNTER/TIMER CIRCUIT
>001C 0221 SYSPIO EQU 1CH ;SYSTEM PARALLEL I/O
0222 ;
0223 ; INITIALIZE SYSTEM PIO FOR USE AS BANK-SWITCH,
0224 ; DISK DRIVE SELECT AND PARALLEL KEYBOARD INPUT
0225 ;
>001C 0226 BITDAT EQU SYSPIO+0
PAGE 0005
ADDR CODE STMT SOURCE STATEMENT
>001D 0227 BITCTL EQU SYSPIO+1
>001E 0228 KBDDAT EQU SYSPIO+2
>001F 0229 KBDCTL EQU SYSPIO+3
0230
F103 031D 0231 DEFB 3,BITCTL
F105 CF 0232 DEFB 11001111B ;PUT SYSTEM PIO IN BIT MODE
F106 18 0233 DEFB 00011000B ;MAKE BITS 4 AND 3 BE INPUTS
F107 40 0234 DEFB 01000000B ;DISABLE INTERRUPTS
0235 ;
F108 011C 0236 DEFB 1,BITDAT
F10A 00 0237 DEFB 00000000B ;DE-SELECT ROMS, ENABLE DRIVE 0
0238 ;
F10B 021F 0239 DEFB 2,KBDCTL
F10D 4F 0240 DEFB 01001111B ;PUT KEYBOARD PORT IN INPUT MODE
F10E 1A 0241 DEFB SYSVEC+2 ;LOAD KEYBOARD INTERRUPT VECTOR
0242 ;
0243 ;
0244 ; INITIALIZE CHANELS 2 AND 3 OF THE CTC
0245 ; TO GENERATE ONE SECOND INTERRUPTS FROM CTC3
0246 ;
>0018 0247 CTC0 EQU CTC+0 ;CTC CHANEL 0 PORT#
>0019 0248 CTC1 EQU CTC+1 ;CTC CHANEL 1
>001A 0249 CTC2 EQU CTC+2 ;CTC CHANEL 2
>001B 0250 CTC3 EQU CTC+3 ;CTC CHANEL 3
0251
F10F 0118 0252 DEFB 1,CTC0
F111 10 0253 DEFB CTCVEC ;BASE INTERRUPT VECTOR FOR CTC
0254 ;
F112 021A 0255 DEFB 2,CTC2
F114 27 0256 DEFB 00100111B ;PUT CTC2 IN TIMER MODE
F115 69 0257 DEFB 105 ;CTC2 PERIOD=105*256*400 NANOSECONDS
0258 ;
F116 021B 0259 DEFB 2,CTC3
F118 C7 0260 DEFB 11000111B ;PUT CTC3 IN COUNTER MODE
F119 5D 0261 DEFB 93 ;CTC3 PERIOD=999936 MICROSECONDS
0262 ;
0263 ;
0264 ; INITIALIZE SIO CHANEL B FOR ASYNCHRONOUS SERIAL
0265 ; INTERFACE TO PRINTER OR TERMINAL
0266 ;
>0004 0267 SIODPA EQU SIO+0 ;SIO DATA PORT A
>0005 0268 SIODPB EQU SIO+1 ;SIO DATA PORT B
>0006 0269 SIOCPA EQU SIO+2 ;SIO CONTROL/STATUS PORT A
>0007 0270 SIOCPB EQU SIO+3 ;SIO CONTROL/STATUS PORT B
0271
F11A 010C 0272 DEFB 1,BAUDB
F11C 05 0273 DEFB 0101B ;SET COM 8116 FOR 300 BAUD DEFAULT
0274
F11D 0B07 0275 DEFB 11,SIOCPB
F11F 04 0276 DEFB 4 ;SELECT REGISTER #4
F120 45 0277 DEFB 01000101B ;16X CLOCK, 1 STOP BIT, ODD PARITY
F121 01 0278 DEFB 1 ;SELECT REGISTER #1
F122 04 0279 DEFB 00000100B ;STATUS AFFECTS VECTOR, NO INTERRUPTS
F123 03 0280 DEFB 3 ;SELECT REGISTER #3
F124 41 0281 DEFB 01000001B ;7 BITS/RX CHARACTER
F125 05 0282 DEFB 5 ;SELECT REGISTER #5
F126 AA 0283 DEFB 10101010B ;7 BITS/TX CHARACTER, ASSERT DTR
F127 02 0284 DEFB 2 ;SELECT REGISTER #2
PAGE 0006
ADDR CODE STMT SOURCE STATEMENT
F128 00 0285 DEFB SIOVEC ;LOAD INTERRUPT VECTOR BASE
F129 02 0286 DEFB 2 ;SELECT READ REG #2 FOR SIO TEST
0287
F12A FF 0288 DEFB -1 ;END-OF-TABLE
0289 ;
0290 ; INIT DONE
0291 ;
0292 ;
0293 INCLUDE MONITOR.ASM
0294 ;********************************************************
0295 ;* *
0296 ;* BASIC HEX MONITOR FOR Z-80 PROCESSORS *
0297 ;* 3-Aug-80 *
0298 ;* *
0299 ;********************************************************
0300 ;
0301 ;
0302 ;
0303 ;
F12B CDECF3 0304 PROMPT: CALL PNEXT
F12E 0D0A 0305 DEFB CR,LF
F130 2A20 0306 DEFM '* '
F132 04 0307 DEFB EOT
F133 2188FF 0308 LD HL,LINBUF
F136 0E20 0309 LD C,32
F138 CD3BF3 0310 CALL GETLIN ;INPUT A BUFERED CONSOLE LINE
F13B 3835 0311 JR C,WHAT-$ ;PRINT 'WHAT ?' IF INPUT ERROR
0312
F13D AF 0313 XOR A
F13E 3284FF 0314 LD (ESCFLG),A
F141 CDFCF3 0315 CALL CRLFS
F144 3A88FF 0316 LD A,(LINBUF) ;GET FIRST CHARACTER IN LINE
F147 FE0D 0317 CP CR
F149 28E0 0318 JR Z,PROMPT-$ ;JUMP IF A NULL LINE
F14B 2182F1 0319 LD HL,CMDTAB ;SEARCH FOR A MATCHING CHARACTER
F14E 010B00 0320 LD BC,CMDSIZ/3 ; IN COMMAND SEARCH TABLE
F151 CD60F3 0321 CALL SEARCH
F154 201C 0322 JR NZ,WHAT-$ ;TRY AGAIN IF SEACRH FAILS
F156 C5 0323 PUSH BC
F157 FD2189FF 0324 LD IY,LINBUF+1
F15B CD6AF3 0325 CALL PARAMS ;INPUT NUMERIC PARAMETERS FROM
F15E DDE1 0326 POP IX ; LINE BUFFER AND TEST IF ERROR
F160 3810 0327 JR C,WHAT-$
F162 2A7CFF 0328 LD HL,(PARAM1)
F165 ED5B7EFF 0329 LD DE,(PARAM2)
F169 ED4B80FF 0330 LD BC,(PARAM3)
F16D CD80F1 0331 CALL CALLX ;CALL SUBROUTINE @ IX
F170 30B9 0332 JR NC,PROMPT-$ ;GO BACK TO PROMPT IF NO ERRORS
0333
F172 CDECF3 0334 WHAT: CALL PNEXT
F175 20776861 0335 DEFM ' what ?'
74203F
F17C 07 0336 DEFB 'G'-64 ;SAY 'what ?' AND BEEP THE BELL
F17D 04 0337 DEFB EOT
F17E 18AB 0338 JR PROMPT-$
0339 ;
0340 ;
F180 DDE9 0341 CALLX: JP (IX) ;CALL SUBROUTINE @ IX
PAGE 0007
ADDR CODE STMT SOURCE STATEMENT
0342 ;
0343 ;
0344 ;
F182 52 0345 CMDTAB: DEFB 'R'
F183 4F 0346 DEFB 'O'
F184 49 0347 DEFB 'I'
F185 47 0348 DEFB 'G'
F186 54 0349 DEFB 'T'
F187 46 0350 DEFB 'F'
F188 4D 0351 DEFB 'M'
F189 43 0352 DEFB 'C'
F18A 42 0353 DEFB 'B'
F18B 44 0354 DEFB 'D'
F18C 53 0355 DEFB 'S'
0356
F18D 29F3 0357 DEFW SWITCH ;SWITCH CONSOLE OUTPUT VECTOR
F18F 05F2 0358 DEFW MEMDMP ;DUMP MEMORY IN HEX/ASCII
F191 A3F1 0359 DEFW BOOT ;BOOT UP CP/M
F193 E6F2 0360 DEFW BLOCK ;MEMORY BLOCK MOVE
F195 57F2 0361 DEFW VIEW ;MEMORY EXAMINE/CHANGE
F197 D8F2 0362 DEFW FILL ;FILL MEMORY
F199 8CF2 0363 DEFW TEST ;RAM DIAGNOSTIC
F19B 81F2 0364 DEFW GOTO ;JUMP TO MEMORY LOCATION
F19D FEF2 0365 DEFW INCMD ;READ FROM INPUT PORT
F19F 20F3 0366 DEFW OUTCMD ;WRITE TO OUTPUT PORT
F1A1 BDF1 0367 DEFW DSKCMD ;DISPLAY DISK SECTOR DATA
0368
>0021 0369 CMDSIZ EQU $-CMDTAB
0370 ;
0371 ;
0372 ;********************************************************
0373 ;* *
0374 ;* MONITOR COMMAND ACTION ROUTINES PACKAGE *
0375 ;* *
0376 ;********************************************************
0377 ;
0378 ;
0379 ;
0380 ;
0381 ;
0382 ; -- DISK BOOT LOADER COMMAND --
0383 ;
F1A3 0E00 0384 BOOT: LD C,0 ;SELECT DRIVE 0 FOR BOOT LOAD
F1A5 CDB1F6 0385 CALL SELECT
F1A8 203D 0386 JR NZ,DSKERR-$
F1AA CDE9F6 0387 CALL HOME ;HOME HEAD TO TRACK 0
F1AD 2038 0388 JR NZ,DSKERR-$ ;ERROR IF NOT READY OR AT TR0
F1AF 218000 0389 LD HL,0080H ;POINT TO CP/M READ BUFFER
F1B2 0E01 0390 LD C,1 ;SELECT SECTOR 1
F1B4 CD2AF7 0391 CALL READ ;READ TRACK 0/ SECTOR 1
F1B7 202E 0392 JR NZ,DSKERR-$
F1B9 F1 0393 POP AF ;CLEAN UP STACK
F1BA C38000 0394 JP 0080H ;GO EXECUTE LOADER
0395 ;
0396 ;
0397 ; -- DISK SECTOR READ COMMAND --
0398 ;
F1BD FE03 0399 DSKCMD: CP 3 ;CHECK PARAMETER COUNT
PAGE 0008
ADDR CODE STMT SOURCE STATEMENT
F1BF 37 0400 SCF
F1C0 C0 0401 RET NZ
F1C1 4D 0402 LD C,L ;USE FIRST ARG AS UNIT#
F1C2 CDB1F6 0403 CALL SELECT
F1C5 2020 0404 JR NZ,DSKERR-$
F1C7 217EFF 0405 LD HL,PARAM2
F1CA 4E 0406 LD C,(HL) ;USE SECOND ARG AS TRACK#
F1CB CDFBF6 0407 CALL SEEK
F1CE 2017 0408 JR NZ,DSKERR-$
F1D0 2180FF 0409 LD HL,PARAM3
F1D3 4E 0410 LD C,(HL) ;USE THIRD ARG AS SECTOR#
F1D4 218000 0411 LD HL,0080H
F1D7 CD2AF7 0412 CALL READ
F1DA CBC7 0413 SET 0,A ;MARK ERROR BYTE AS DUE TO READ
F1DC 2009 0414 JR NZ,DSKERR-$
F1DE 218000 0415 LD HL,0080H
F1E1 110800 0416 LD DE,8
F1E4 C327F2 0417 JP DUMP ;DUMP DISK READ BUFFER AND RETURN
0418 ;
0419 ;
F1E7 4F 0420 DSKERR: LD C,A ;SAVE 1771 STATUS
F1E8 CDECF3 0421 CALL PNEXT
F1EB 6469736B 0422 DEFM 'disk error '
20657272
6F7220
F1F6 04 0423 DEFB EOT
F1F7 0608 0424 LD B,8 ;PRINT 1771 ERROR BYTE IN BINARY
F1F9 AF 0425 DSKR2: XOR A
F1FA CB11 0426 RL C
F1FC CE30 0427 ADC A,'0' ;TRANSFORM A INTO ASCII '1' OR '0'
F1FE CD15F4 0428 CALL OUTPUT
F201 10F6 0429 DJNZ DSKR2-$ ;REPEAT FOR 8 BITS
F203 B7 0430 OR A
F204 C9 0431 RET
0432 ;
0433 ;
0434 ;
0435 ; -- MEMORY DUMP COMMAND --
0436 ;
F205 3D 0437 MEMDMP: DEC A ;CHECK PARAMETER COUNT
F206 2806 0438 JR Z,MDMP2-$
F208 3D 0439 DEC A
F209 2808 0440 JR Z,MDMP3-$
F20B 2A86FF 0441 MDMP1: LD HL,(LAST)
F20E 111000 0442 MDMP2: LD DE,16
F211 180D 0443 JR MDMP3B-$
0444
F213 EB 0445 MDMP3: EX DE,HL
F214 ED52 0446 SBC HL,DE ;DERRIVE BYTECOUNT FOR DUMP RANGE
F216 0604 0447 LD B,4
F218 CB3C 0448 MDMP3A: SRL H ;DIVIDE BYTECOUNT BY 16
F21A CB1D 0449 RR L
F21C 10FA 0450 DJNZ MDMP3A-$
F21E 23 0451 INC HL
F21F EB 0452 EX DE,HL
F220 CD27F2 0453 MDMP3B: CALL DUMP ;DUMP DE*16 BYTES STRTING AT HL
F223 2286FF 0454 LD (LAST),HL
F226 C9 0455 RET
PAGE 0009
ADDR CODE STMT SOURCE STATEMENT
0456 ;
0457 ;
F227 E5 0458 DUMP: PUSH HL ;SAVE STARTING ADDRESS
F228 CDCDF3 0459 CALL PUT4HS ;PRINT STARTING ADDRESS IN HEX
F22B CD02F4 0460 CALL SPACE
F22E 0610 0461 LD B,16
F230 7E 0462 DUMP2: LD A,(HL) ;GET A DATA BYTE @ HL
F231 23 0463 INC HL
F232 CDD2F3 0464 CALL PUT2HS ;PRINT THE DATA IN HEX
F235 10F9 0465 DJNZ DUMP2-$ ;REPEAT 16 TIMES
F237 E1 0466 POP HL ;RESTORE STARTING ADDRESS
F238 0610 0467 LD B,16
F23A 7E 0468 DUMP3: LD A,(HL) ;GET BACK DATA BYTE @ HL
F23B 23 0469 INC HL
F23C CBBF 0470 RES 7,A
F23E FE20 0471 CP 20H
F240 3804 0472 JR C,DUMP4-$
F242 FE7F 0473 CP 7FH
F244 3802 0474 JR C,DUMP5-$
F246 3E2E 0475 DUMP4: LD A,'.' ;PRINT A DOT IF DATA < 20 OR > 7F
F248 CD15F4 0476 DUMP5: CALL OUTPUT ;PRINT ASCII CHARACTER IN A
F24B 10ED 0477 DJNZ DUMP3-$
F24D CDFCF3 0478 CALL CRLFS
F250 C0 0479 RET NZ ;EXIT IF ESCAPE REQUEST IS INDICATED
F251 1B 0480 DEC DE
F252 7A 0481 LD A,D
F253 B3 0482 OR E
F254 20D1 0483 JR NZ,DUMP-$
F256 C9 0484 RET
0485 ;
0486 ;
0487 ;
0488 ;
0489 ; -- MEMORY EXAMINE COMMAND --
0490 ;
F257 CDCEF2 0491 VIEW: CALL MDATA
F25A CD07F4 0492 CALL ECHO
F25D FE0D 0493 CP CR
F25F 281B 0494 JR Z,VIEW4-$
F261 FE2D 0495 CP '-'
F263 2819 0496 JR Z,VIEW5-$
F265 CDBDF3 0497 VIEW2: CALL ASCHEX
F268 3F 0498 CCF
F269 D0 0499 RET NC
F26A 07 0500 RLCA
F26B 07 0501 RLCA
F26C 07 0502 RLCA
F26D 07 0503 RLCA
F26E 4F 0504 LD C,A
F26F CD07F4 0505 CALL ECHO
F272 CDBDF3 0506 CALL ASCHEX
F275 3F 0507 CCF
F276 D0 0508 RET NC
F277 B1 0509 OR C
F278 77 0510 VIEW3: LD (HL),A
F279 CDB9F2 0511 CALL CHECK
F27C 23 0512 VIEW4: INC HL
F27D 23 0513 INC HL
PAGE 0010
ADDR CODE STMT SOURCE STATEMENT
F27E 2B 0514 VIEW5: DEC HL
F27F 18D6 0515 JR VIEW-$
0516 ;
0517 ;
0518 ;
0519 ; -- JUMP TO MEMORY LOCATION COMMAND --
0520 ;
F281 3D 0521 GOTO: DEC A ;CHECK PARAMETER COUNT
F282 37 0522 SCF
F283 C0 0523 RET NZ
F284 E5 0524 PUSH HL
F285 DDE1 0525 POP IX
F287 CD80F1 0526 CALL CALLX ;CALL ADDRESS PASSED IN HL
F28A B7 0527 OR A
F28B C9 0528 RET ;RETURN IF WE GET BACK AGAIN
0529 ;
0530 ;
0531 ;
0532 ; -- MEMORY READ/WRITE DIAGNOSTIC COMMAND --
0533 ;
F28C FE02 0534 TEST: CP 2 ;CHECK PARAMETER COUNT
F28E 37 0535 SCF
F28F C0 0536 RET NZ
F290 13 0537 INC DE
F291 5A 0538 LD E,D ;GET ENDING PAGE ADDRESS INTO E
F292 54 0539 LD D,H ;GET STARTING PAGE ADDRESS INTO D
F293 0600 0540 LD B,0 ;INITIALIZE PASS COUNTER
F295 62 0541 TEST1: LD H,D ;POINT HL TO START OF BLOCK
F296 2E00 0542 LD L,0
F298 7D 0543 TEST2: LD A,L
F299 AC 0544 XOR H ;GENERATE TEST BYTE
F29A A8 0545 XOR B
F29B 77 0546 LD (HL),A ;STORE BYTE IN RAM
F29C 23 0547 INC HL
F29D 7C 0548 LD A,H
F29E BB 0549 CP E ;CHECK FOR END OF TEST BLOCK
F29F 20F7 0550 JR NZ,TEST2-$
0551 ; NOW READ BACK EACH BYTE & COMPARE
F2A1 62 0552 LD H,D
F2A2 2E00 0553 LD L,0 ;POINT HL BACK TO START
F2A4 7D 0554 TEST3: LD A,L
F2A5 AC 0555 XOR H ;RE-GENERATE TEST BYTE DATA
F2A6 A8 0556 XOR B
F2A7 CDB9F2 0557 CALL CHECK ;VERIFY MEMORY DATA STILL GOOD
F2AA C0 0558 RET NZ ;EXIT IF ESCAPE REQUEST IS INDICATED
F2AB 23 0559 INC HL ; ELSE GO ON TO NEXT BYTE
F2AC 7C 0560 LD A,H
F2AD BB 0561 CP E ;CHECK FOR END OF BLOCK
F2AE 20F4 0562 JR NZ,TEST3-$
F2B0 04 0563 INC B ;BUMP PASS COUNT
F2B1 3E2B 0564 LD A,'+'
F2B3 CD15F4 0565 CALL OUTPUT ;PRINT '+' AND ALLOW FOR EXIT
F2B6 28DD 0566 JR Z,TEST1-$ ;DO ANOTHER PASS IF NO ESCAPE
F2B8 C9 0567 RET
0568 ;
0569 ;
0570 ;
F2B9 BE 0571 CHECK: CP (HL)
PAGE 0011
ADDR CODE STMT SOURCE STATEMENT
F2BA C8 0572 RET Z ;RETURN IF (HL)=A
F2BB F5 0573 PUSH AF
F2BC CDCEF2 0574 CALL MDATA ;PRINT WHAT WAS ACTUALLY READ
F2BF CDECF3 0575 CALL PNEXT
F2C2 73686F75 0576 DEFM 'should='
6C643D
F2C9 04 0577 DEFB EOT
F2CA F1 0578 POP AF
F2CB C3D2F3 0579 JP PUT2HS ;PRINT WHAT SHOULD HAVE BEEN READ
0580 ;
0581 ;
F2CE CDFCF3 0582 MDATA: CALL CRLFS
F2D1 CDCDF3 0583 CALL PUT4HS
F2D4 7E 0584 LD A,(HL)
F2D5 C3D2F3 0585 JP PUT2HS
0586 ;
0587 ;
0588 ;
0589 ; -- FILL MEMORY WITH CONSTANT COMMAND --
0590 ;
F2D8 FE03 0591 FILL: CP 3 ;CHECK IF PARAMETER COUNT=3
F2DA 37 0592 SCF
F2DB C0 0593 RET NZ
F2DC 71 0594 FILL1: LD (HL),C
F2DD E5 0595 PUSH HL
F2DE B7 0596 OR A
F2DF ED52 0597 SBC HL,DE ;COMPARE HL TO END ADDRESS IN DE
F2E1 E1 0598 POP HL
F2E2 23 0599 INC HL ;ADVANCE POINTER AFTER COMPARISON
F2E3 38F7 0600 JR C,FILL1-$
F2E5 C9 0601 RET
0602 ;
0603 ;
0604 ;
0605 ;
0606 ; -- MEMORY BLOCK MOVE COMMAND --
0607 ;
F2E6 FE03 0608 BLOCK: CP 3 ;CHECK IF PARAMETER COUNT=3
F2E8 37 0609 SCF
F2E9 C0 0610 RET NZ
F2EA CDF3F2 0611 CALL BLOCAD
F2ED 79 0612 LD A,C
F2EE B0 0613 OR B
F2EF C8 0614 RET Z ;EXIT NOW IF BC=0
F2F0 EDB0 0615 LDIR
F2F2 C9 0616 RET
0617 ;
0618 ;
0619 ;
F2F3 EB 0620 BLOCAD: EX DE,HL
F2F4 B7 0621 OR A ;CLEAR CARRY
F2F5 ED52 0622 SBC HL,DE ;GET DIFFRENCE BETWEEN
F2F7 EB 0623 EX DE,HL ;HL & DE FOR BYTECOUNT
F2F8 D5 0624 PUSH DE
F2F9 C5 0625 PUSH BC
F2FA D1 0626 POP DE ;GET OLD BC INTO DE
F2FB C1 0627 POP BC
F2FC 03 0628 INC BC ;GET COUNT+1 INTO BC
PAGE 0012
ADDR CODE STMT SOURCE STATEMENT
F2FD C9 0629 RET
0630 ;
0631 ;
0632 ;
0633 ;
0634 ; -- READ FROM INPUT PORT COMMAND --
0635 ;
F2FE 3D 0636 INCMD: DEC A ;CHECK IF PARAMETER COUNT=1
F2FF 37 0637 SCF
F300 C0 0638 RET NZ
F301 4D 0639 LD C,L ;POINT C TO INPUT PORT
F302 CDFCF3 0640 IN1: CALL CRLFS
F305 79 0641 LD A,C
F306 CDD2F3 0642 CALL PUT2HS
F309 ED78 0643 IN A,(C)
F30B CDD2F3 0644 CALL PUT2HS
F30E CD07F4 0645 CALL ECHO
F311 FE0D 0646 CP CR
F313 2806 0647 JR Z,IN2-$
F315 FE2D 0648 CP '-'
F317 2804 0649 JR Z,IN3-$
F319 B7 0650 OR A
F31A C9 0651 RET
0652
F31B 0C 0653 IN2: INC C
F31C 0C 0654 INC C
F31D 0D 0655 IN3: DEC C
F31E 18E2 0656 JR IN1-$
0657 ;
0658 ;
0659 ;
0660 ; -- WRITE TO OUTPUT PORT COMMAND --
0661 ;
F320 FE02 0662 OUTCMD: CP 2 ;CHECK IF PARAMETER COUNT=2
F322 37 0663 SCF
F323 C0 0664 RET NZ
F324 4D 0665 LD C,L ;POINT C TO OUTPUT PORT
F325 ED59 0666 OUT (C),E ;OUTPUT DATA PASSED IN E
F327 B7 0667 OR A
F328 C9 0668 RET
0669 ;
0670 ;
0671 ; -- SWITCH CONSOLE OUTPUT DEVICE COMMAND --
0672 ;
F329 2185FF 0673 SWITCH: LD HL,COFLAG
F32C 34 0674 INC (HL) ;TOGGLE CONSOLE OUTPUT TYPE FLAG
F32D CB46 0675 BIT 0,(HL)
F32F 21FEF4 0676 LD HL,SIOOUT
F332 2803 0677 JR Z,SWIT2-$ ;JUMP IF ZERO TO ONE TRANSITION
F334 2120F5 0678 LD HL,CRTOUT
F337 220DF0 0679 SWIT2: LD (CONOUT+1),HL ;STORE NEW CONSOLE OUTPUT ADDRESS
F33A C9 0680 RET
0681 ;
0682 ;
0683 ;********************************************************
0684 ;* *
0685 ;* CONSOLE I/O PACKAGE AND UTILITY ROUTINES *
0686 ;* *
PAGE 0013
ADDR CODE STMT SOURCE STATEMENT
0687 ;********************************************************
0688 ;
0689 ;
0690 ;
F33B 41 0691 GETLIN: LD B,C ;SAVE MAX LINE LENGTH PARAMETER IN B
F33C CD07F4 0692 GLIN1: CALL ECHO ;GET A CHARACTER FROM THE CONSOLE
F33F FE0D 0693 CP CR ;CHECK FOR CARRIAGE RETURN
F341 280E 0694 JR Z,GLIN2-$
F343 FE08 0695 CP 'H'-64 ;CHECK FOR CTL-H BACKSPACE
F345 280C 0696 JR Z,GLIN4-$
F347 FE20 0697 CP ' '
F349 D8 0698 RET C ;OTHER CONTROL CHARACTERS ARE ILLEGAL
F34A 77 0699 LD (HL),A
F34B 23 0700 INC HL ;STORE CHARACTER IN BUFFER
F34C 0D 0701 DEC C
F34D 20ED 0702 JR NZ,GLIN1-$ ;GET ANOTHER IF THERE'S MORE ROOM
F34F 37 0703 SCF
F350 C9 0704 RET ;RETURN WITH CARRY=1 IF TOO
0705 ;MANY CHARACTERS ARE ENTERED
F351 77 0706 GLIN2: LD (HL),A ;PUT CARRIAGE RETURN ON END OF LINE
F352 C9 0707 RET ;RETURN WITH CARRY BIT=0
0708
F353 2B 0709 GLIN4: DEC HL ;DELETE LAST CHARACTER FROM BUFFER
F354 CDECF3 0710 CALL PNEXT
F357 2008 0711 DEFB ' ','H'-64 ;PRINT A SPACE TO OVERWRITE THE
F359 04 0712 DEFB EOT ; LAST CHARACTER, THEN DO A BACKSPACE
F35A 0C 0713 INC C
F35B 78 0714 LD A,B ;MAKE SURE YOU'RE NOT TRYING TO
F35C 91 0715 SUB C ;BACKSPACE PAST THE START OF THE LINE
F35D 30DD 0716 JR NC,GLIN1-$
F35F C9 0717 RET
0718 ;
0719 ;
0720 ;
F360 EDB1 0721 SEARCH: CPIR ;SEARCH TABLE @HL FOR MATCH WITH A
F362 C0 0722 RET NZ ;EXIT NOW IF SEARCH FAILS
F363 09 0723 ADD HL,BC
F364 09 0724 ADD HL,BC ;ADD RESIDUE FROM CPIR BYTECOUNT
F365 09 0725 ADD HL,BC ; TO HL 3 TIMES TO GET POINTER
F366 4E 0726 LD C,(HL) ; TO ADDRESS PART OF TABLE ENTRY
F367 23 0727 INC HL
F368 46 0728 LD B,(HL)
F369 C9 0729 RET ;EXIT WITH Z=1 TO INDICATE MATCH
0730 ;
0731 ;
0732 ;
0733 ;
F36A 010000 0734 PARAMS: LD BC,0
F36D FD7E00 0735 LD A,(IY+0)
F370 FE0D 0736 CP CR ;CHECK IF LINE TERMINATES
F372 2008 0737 JR NZ,PARA2-$ ; IMMEDIATELY WITH A RETURN
F374 AF 0738 XOR A
F375 C9 0739 RET ;RETURN WITH PARAM COUNT=0 IF SO
0740
F376 0C 0741 PARA1: INC C
F377 0C 0742 INC C
F378 CB59 0743 BIT 3,C
F37A 37 0744 SCF
PAGE 0014
ADDR CODE STMT SOURCE STATEMENT
F37B C0 0745 RET NZ ;ERROR IF > 4 NUMBERS ENTERED
F37C C5 0746 PARA2: PUSH BC ;SAVE PARAMETER COUNT
F37D CD9FF3 0747 CALL GETHEX ;READ A NUMBER FROM LINE BUFFER
F380 C1 0748 POP BC
F381 D8 0749 PARA4: RET C ;ERROR IF RESULT OVER 16 BITS
F382 DD217CFF 0750 LD IX,PARAM1 ;POINT TO PARAMETER STORAGE AREA
F386 DD09 0751 ADD IX,BC ;ADD PARAMETER COUNT IN BC
F388 DD7500 0752 LD (IX+0),L
F38B DD7401 0753 LD (IX+1),H ;STORE DATA RETURNED FROM 'GETHEX'
F38E FE20 0754 CP ' '
F390 28E4 0755 JR Z,PARA1-$ ;GET ANOTHER ITEM IF SPACE
F392 FE2C 0756 CP ','
F394 28E0 0757 JR Z,PARA1-$ ;GET ANOTHER ITEM IF COMMA
F396 FE0D 0758 CP CR
F398 37 0759 SCF ;ELSE CHECK FOR CARRIAGE RETURN
F399 C0 0760 RET NZ ; AND EXIT WITH CY=1 IF NOT
F39A 79 0761 PAREND: LD A,C
F39B CB3F 0762 SRL A ;A=COUNT OF NUMBERS ENTERED
F39D 3C 0763 INC A
F39E C9 0764 RET
0765 ;
0766 ; GETHEX CONVERTS ASCII TO BINARY AND DOES
0767 ; HIGH LIMIT CHECKS TO LESS THAN 17 BITS.
0768 ; CARRY SET ON ILLEGAL CONVERSION RESULT
0769 ; TERMINATING CHARACTER RETURNS IN A.
0770 ; HL RETURNS WITH 16 BIT BINARY INTEGER
0771 ;
F39F 210000 0772 GETHEX: LD HL,0
F3A2 180B 0773 JR GNUM3-$
0774
F3A4 0604 0775 GNUM1: LD B,4
F3A6 29 0776 GNUM2: ADD HL,HL ;MULTIPLY RESULT BY 16
F3A7 D8 0777 RET C ;RETURN IF IT OVERFLOWS 16 BITS
F3A8 10FC 0778 DJNZ GNUM2-$
F3AA 5F 0779 LD E,A ;APPEND NEW LOW ORDER DIGIT
F3AB 1600 0780 LD D,0 ;AND GET RESULT BACK INTO DE
F3AD 19 0781 ADD HL,DE
F3AE D8 0782 RET C ;RETURN IF OVERFLOW
F3AF FD7E00 0783 GNUM3: LD A,(IY+0) ;GET A CHARACTER FROM LINE INPUT
F3B2 FD23 0784 INC IY ; BUFFER @ IY AND BUMP IY
F3B4 4F 0785 LD C,A
F3B5 CDBDF3 0786 CALL ASCHEX ;CONVERT ASCII TO NUMERIC
F3B8 30EA 0787 JR NC,GNUM1-$
F3BA 79 0788 LD A,C
F3BB B7 0789 OR A
F3BC C9 0790 RET
0791 ;
0792 ;
F3BD D630 0793 ASCHEX: SUB '0'
F3BF D8 0794 RET C
F3C0 FE0A 0795 CP 10
F3C2 3F 0796 CCF
F3C3 D0 0797 RET NC
F3C4 D607 0798 SUB 7
F3C6 FE0A 0799 CP 10
F3C8 D8 0800 RET C
F3C9 FE10 0801 CP 16
F3CB 3F 0802 CCF
PAGE 0015
ADDR CODE STMT SOURCE STATEMENT
F3CC C9 0803 RET
0804 ;
0805 ;
0806 ;
F3CD 7C 0807 PUT4HS: LD A,H
F3CE CDD8F3 0808 CALL PUT2HX
F3D1 7D 0809 LD A,L
F3D2 CDD8F3 0810 PUT2HS: CALL PUT2HX
F3D5 C302F4 0811 JP SPACE
0812 ;
0813 ;
F3D8 F5 0814 PUT2HX: PUSH AF
F3D9 1F 0815 RRA
F3DA 1F 0816 RRA
F3DB 1F 0817 RRA
F3DC 1F 0818 RRA
F3DD CDE1F3 0819 CALL PUTNIB
F3E0 F1 0820 POP AF
F3E1 E60F 0821 PUTNIB: AND 00001111B
F3E3 C690 0822 ADD A,90H
F3E5 27 0823 DAA
F3E6 CE40 0824 ADC A,40H
F3E8 27 0825 DAA
F3E9 C315F4 0826 JP OUTPUT
0827 ;
0828 ;
0829 ; PMSG PRINTS THE STRING OF ASCII CHARACTERS
0830 ; POINTED TO BY THE RELATIVE ADDRESS IN DE
0831 ; UNTIL AN EOT IS ENCOUNTERED IN THE STRING.
0832 ;
>0004 0833 EOT EQU 04H
>000D 0834 CR EQU 0DH
>000A 0835 LF EQU 0AH
0836 ;
0837
F3EC E3 0838 PNEXT: EX (SP),HL
F3ED CDF2F3 0839 CALL PMSG
F3F0 E3 0840 EX (SP),HL
F3F1 C9 0841 RET
0842 ;
F3F2 7E 0843 PMSG: LD A,(HL)
F3F3 23 0844 INC HL
F3F4 FE04 0845 CP EOT
F3F6 C8 0846 RET Z
F3F7 CD15F4 0847 CALL OUTPUT
F3FA 18F6 0848 JR PMSG-$
0849 ;
0850 ;
0851 ; CRLFS OUTPUTS A RETURN-LINEFEED-SPACE
0852 ; TO THE CONSOLE DEVICE
0853 ;
F3FC CDECF3 0854 CRLFS: CALL PNEXT
F3FF 0D0A04 0855 DEFB CR,LF,EOT
F402 3E20 0856 SPACE: LD A,' '
F404 C315F4 0857 JP OUTPUT
0858 ;
0859 ;
0860 ;
PAGE 0016
ADDR CODE STMT SOURCE STATEMENT
0861 ; ECHO INPUTS ONE CHARACTER FROM THE CONSOLE
0862 ; DEVICE, PRINTS IT ON THE CONSOLE OUTPUT AND
0863 ; THEN RETURNS IT IN REGISTER A WITH BIT 7 RESET
0864 ;
0865 ; OUTPUT PRINTS THE CHARACTER IN REGISTER A ON
0866 ; THE CONSOLE OUTPUT DEVICE AND THEN DOES A CHECK
0867 ; FOR CONSOLE INPUT TO FREEZE OR ABORT OUTPUT.
0868 ;
0869
F407 CD09F0 0870 ECHO: CALL CONIN ;INPUT A CHARACTER AND ECHO IT
F40A F5 0871 PUSH AF
F40B CD0CF0 0872 CALL CONOUT
F40E F1 0873 POP AF
F40F FE5B 0874 CP 'Z'+1
F411 D8 0875 RET C
F412 D620 0876 SUB 32 ;CONVERT UPPER CASE TO LOWER CASE
F414 C9 0877 RET
0878 ;
0879 ;
0880 ;
F415 CD0CF0 0881 OUTPUT: CALL CONOUT
F418 CD06F0 0882 CALL CONST ;SEE IF CONSOLE INPUT IS PENDING
F41B 280F 0883 JR Z,OUTP2-$
F41D CD09F0 0884 CALL CONIN
F420 FE0D 0885 CP CR ;SEE IF CARRIAGE RETURN WAS TYPED
F422 2805 0886 JR Z,OUTP1-$
F424 CD09F0 0887 CALL CONIN ;WAIT FOR ANOTHER INPUT CHARACTER
F427 1803 0888 JR OUTP2-$ ; THEN RETURN TO CALLING ROUTINE
0889
F429 3284FF 0890 OUTP1: LD (ESCFLG),A ;SET ESCAPE FLAG TO NON-ZERO VALUE
F42C 3A84FF 0891 OUTP2: LD A,(ESCFLG)
F42F B7 0892 OR A ;RETURN CURRENT STATUS OF ESCAPE
F430 C9 0893 RET ; FLAG TO CALLING ROUTINE
0894 ;
0895 ;
0896 ;
0897 INCLUDE INTSRV.ASM
0898 ;********************************************************
0899 ;* *
0900 ;* INTERRUPT SERVICE ROUTINES FOR KEYBOARD *
0901 ;* INPUT AND REAL-TIME CLOCK FUNCTIONS *
0902 ;* 3-Aug-80 *
0903 ;* *
0904 ;********************************************************
0905 ;
0906 ;
0907 ;
0908 ;
F431 3A30FF 0909 KBDST: LD A,(FIFCNT) ;GET INPUT FIFO BYTECOUNT
F434 B7 0910 OR A ;TEST IF EQUAL ZERO
F435 C8 0911 RET Z ;EXIT WITH A=0 IF QUEUE IS EMPTY
F436 3EFF 0912 LD A,255
F438 C9 0913 RET ;ELSE SET A=255 TO INDICATE DATA READY
0914 ;
0915 ;
0916 ;
F439 CD31F4 0917 KBDIN: CALL KBDST
F43C 28FB 0918 JR Z,KBDIN-$ ;LOOP UNTIL KEYBOARD INPUT READY
PAGE 0017
ADDR CODE STMT SOURCE STATEMENT
F43E E5 0919 PUSH HL
F43F CD6DF4 0920 CALL REMOVE ;GET CHARACTER FROM INPUT QUEUE
F442 E1 0921 POP HL
F443 C9 0922 RET
0923 ;
0924 ;
0925 ;
0926 ;
0927 ;
F444 2133FF 0928 STASH: LD HL,LOCK ;POINT TO SHIFT LOCK VARIABLES
F447 BE 0929 CP (HL) ;TEST IF A=SHIFT LOCK CHARACTER
F448 23 0930 INC HL ; THEN POINT TO LOCK FLAG
F449 2002 0931 JR NZ,STASH2-$ ;JUMP IF NOT THE SHIFT CHARACTER
F44B 34 0932 INC (HL) ; ELSE COMPLIMENT THE SHIFT LOCK
F44C C9 0933 RET ; AND EXIT NOW
0934
F44D CB46 0935 STASH2: BIT 0,(HL) ;TEST THE SHIFT LOCK FLAG
F44F 280A 0936 JR Z,STASH3-$ ;JUMP IF SHIFT LOCK NOT SET
F451 FE40 0937 CP 40H ;ELSE CHECK FOR SHIFABLE CHARACTER
F453 3806 0938 JR C,STASH3-$ ; AND JUMP IF NOT EQUAL OR GREATER
F455 FE7F 0939 CP 7FH ; THAN '@' AND LESS THAN RUBOUT
F457 3002 0940 JR NC,STASH3-$
F459 EE20 0941 XOR 00100000B ;ELSE TOGGLE BIT 5 OF THE CHARACTER
F45B 4F 0942 STASH3: LD C,A
F45C 2130FF 0943 LD HL,FIFCNT ;BUMP INPUT FIFO CHARACTER COUNT
F45F 7E 0944 LD A,(HL)
F460 3C 0945 INC A
F461 FE10 0946 CP 16
F463 D0 0947 RET NC ;EXIT NOW IF FIFO IS FULL
F464 77 0948 LD (HL),A ; ELSE INCREMENT FIFO COUNT
F465 2131FF 0949 LD HL,FIFIN ;POINT HL TO FIFO INPUT OFFSET
F468 CD74F4 0950 CALL INDEX
F46B 71 0951 LD (HL),C ;STORE CHARACTER IN FIFO @ HL
F46C C9 0952 RET
0953 ;
0954 ;
0955 ;
0956 ;
F46D 2130FF 0957 REMOVE: LD HL,FIFCNT
F470 35 0958 DEC (HL)
F471 2132FF 0959 LD HL,FIFOUT ;POINT HL TO FIFO OUTPUT OFFSET
F474 7E 0960 INDEX: LD A,(HL)
F475 3C 0961 INC A
F476 E60F 0962 AND 00001111B ;INCREMENT FIFO POINTER
F478 77 0963 LD (HL),A ; MODULO 16 AND REPLACE
F479 2120FF 0964 LD HL,FIFO
F47C 85 0965 ADD A,L ;INDEX INTO FIFO BY OFFSET IN A
F47D 6F 0966 LD L,A
F47E 7E 0967 LD A,(HL)
F47F C9 0968 RET
0969 ;
0970 ;
0971 ; SOFTWARE DISK MOTOR TURN-OFF TIMER ROUTINE
0972 ;
F480 216CFF 0973 DSKTMR: LD HL,MOTOR ;DECREMENT DISK TURN-OFF TIMER
F483 35 0974 DEC (HL)
F484 C0 0975 RET NZ ;EXIT IF NOT TIMED OUT YET
F485 DB1C 0976 IN A,(BITDAT)
PAGE 0018
ADDR CODE STMT SOURCE STATEMENT
F487 F644 0977 OR 01000100B ;DISABLE ALL DRIVE SELECTS AND
F489 D31C 0978 OUT (BITDAT),A ; TURN OFF THE SPINDLE MOTORS
F48B C9 0979 RET
0980 ;
0981 ;
0982 ; -- INTERRUPT SERVICE ROUTINE FOR PARALLEL KEYBOARD --
0983 ;
F48C ED7335FF 0984 KEYSRV: LD (SPSAVE),SP ;SAVE USER STACK POINTER AND
F490 3157FF 0985 LD SP,TMPSTK+32 ; SWITCH TO LOCAL STACK
F493 E5 0986 PUSH HL
F494 D5 0987 PUSH DE
F495 C5 0988 PUSH BC
F496 F5 0989 PUSH AF ;SAVE MACHINE STATE
F497 DB1E 0990 IN A,(KBDDAT) ;READ KEYBOARD INPUT PORT
F499 2F 0991 CPL
F49A 2A59FF 0992 LD HL,(PINVEC) ;GET KBD INTERRUPT ROUTINE VECTOR
F49D 1822 0993 JR DSPTCH-$ ; AND JUMP TO DISPATCH POINT
0994 ;
0995 ;
0996 ;
0997 ; -- INTERRUPT SERVICE ROUTINE FOR ONE SECOND TIMER --
0998 ;
F49F ED7335FF 0999 TIMER: LD (SPSAVE),SP ;SAVE USER STACK POINTER AND
F4A3 3157FF 1000 LD SP,TMPSTK+32 ; SWITCH TO LOCAL STACK
F4A6 E5 1001 PUSH HL
F4A7 D5 1002 PUSH DE
F4A8 C5 1003 PUSH BC
F4A9 F5 1004 PUSH AF
F4AA 2A57FF 1005 LD HL,(TIKVEC) ;GET CLOCK INTERRUPT ROUTINE VECTOR
F4AD 1812 1006 JR DSPTCH-$ ; AND JUMP TO DISPATCH POINT
1007 ;
1008 ;
1009 ;
1010 ; -- SERIAL INPUT INTERRUPT SERVICE ROUTINE FOR SIO --
1011 ;
F4AF ED7335FF 1012 SIOINT: LD (SPSAVE),SP ;SAVE USER STACK POINTER AND
F4B3 3157FF 1013 LD SP,TMPSTK+32 ; SWITCH TO LOCAL STACK
F4B6 E5 1014 PUSH HL
F4B7 D5 1015 PUSH DE
F4B8 C5 1016 PUSH BC
F4B9 F5 1017 PUSH AF ;SAVE MACHINE STATE
F4BA DB05 1018 IN A,(SIODPB) ;READ SIO DATA INPUT PORT
F4BC E67F 1019 AND 01111111B
F4BE 2A5BFF 1020 LD HL,(SINVEC) ;GET SERIAL INPUT ROUTINE VECTOR
F4C1 CDE7F4 1021 DSPTCH: CALL CALLHL ;CALL SUBROUTINE ADDRESSED BY H
F4C4 F1 1022 POP AF
F4C5 C1 1023 POP BC
F4C6 D1 1024 POP DE
F4C7 E1 1025 POP HL
F4C8 ED7B35FF 1026 LD SP,(SPSAVE)
F4CC FB 1027 EI ;RE-ENABLE INTERRUPTS AND RETURN
F4CD ED4D 1028 RETI
1029 ;
1030 ;
1031 ; -- RX ERROR INTERRUPT SERVICE ROUTINE FOR SIO --
1032 ;
1033 ; ARRIVE HERE IF RECIEVE INTERRUPT FROM FRAMING, OVERRUN
1034 ; AND PARITY ERRORS. (PARITY CAN BE DISABLED)
PAGE 0019
ADDR CODE STMT SOURCE STATEMENT
1035 ;
F4CF ED7335FF 1036 SIOERR: LD (SPSAVE),SP ;SAVE USER STACK POINTER AND
F4D3 3157FF 1037 LD SP,TMPSTK+32 ; SWITCH TO LOCAL STACK
F4D6 F5 1038 PUSH AF
F4D7 CDF5F4 1039 CALL SIOIN2 ;CLEAR BAD CHARACTER FROM SIO
F4DA 3E07 1040 LD A,'G'-64
F4DC CD15F5 1041 CALL SIOXMT ;OUTPUT A CTL-G AS A WARNING
F4DF F1 1042 POP AF
F4E0 ED7B35FF 1043 LD SP,(SPSAVE)
F4E4 FB 1044 EI
F4E5 ED4D 1045 RETI
1046 ;
1047 ;
F4E7 E9 1048 CALLHL: JP (HL)
1049 ;
1050 ;
1051 ;
1052 ; POLLED MODE I/O ROUTINES FOR SIO CHANEL B
1053 ;
F4E8 DB07 1054 SIOST: IN A,(SIOCPB) ;GET SIO STATUS REGISTER
F4EA E601 1055 AND 00000001B
F4EC C8 1056 RET Z ;ACC=0 IF NO DATA AVAILABLE
F4ED 3EFF 1057 LD A,255
F4EF C9 1058 RET
1059 ;
1060 ;
F4F0 CDE8F4 1061 SIOIN: CALL SIOST ;TEST CONSOLE STATUS
F4F3 28FB 1062 JR Z,SIOIN-$ ;LOOP UNTIL DATA IS RECIEVED
F4F5 3E30 1063 SIOIN2: LD A,00110000B ;RESET STATUS BITS IN SIO FOR
F4F7 D307 1064 OUT (SIOCPB),A ; PARITY/OVERRUN/FRAMING ERRORS,
F4F9 DB05 1065 IN A,(SIODPB) ; THEN GET THE INPUT CHARACTER
F4FB E67F 1066 AND 01111111B
F4FD C9 1067 RET
1068 ;
1069 ;
F4FE FE20 1070 SIOOUT: CP ' ' ;TEST FOR CONTROL CHARACTERS
F500 3013 1071 JR NC,SIOXMT-$ ;JUMP IF PRINTABLE CHARACTER
F502 CD15F5 1072 CALL SIOXMT ; ELSE SEND CONTROL CHARACTER
F505 3A79FF 1073 LD A,(NULLS) ; AND THEN SEND NULLS AS PADDING
F508 3C 1074 INC A ;GET NULL PAD COUNT AND FIX SO
F509 1806 1075 JR PAD1-$ ; THAT COUNT=0 SENDS NO NULLS
1076
F50B F5 1077 PAD: PUSH AF
F50C AF 1078 XOR A
F50D CD15F5 1079 CALL SIOXMT ;OUTPUT A NULL TO THE SIO
F510 F1 1080 POP AF
F511 3D 1081 PAD1: DEC A
F512 20F7 1082 JR NZ,PAD-$ ;LOOP SENDING NULLS TO SIO
F514 C9 1083 RET
1084 ;
1085 ;
F515 F5 1086 SIOXMT: PUSH AF
F516 DB07 1087 SIOX1: IN A,(SIOCPB)
F518 E604 1088 AND 00000100B ;TEST TBE STATUS BIT
F51A 28FA 1089 JR Z,SIOX1-$
F51C F1 1090 POP AF
F51D D305 1091 OUT (SIODPB),A ;OUTPUT DATA TO SIO
F51F C9 1092 RET
PAGE 0020
ADDR CODE STMT SOURCE STATEMENT
1093 ;
1094 ;
1095 ;
1096 ;
1097 INCLUDE CRTOUT.ASM
1098 ;********************************************************
1099 ;* *
1100 ;* MEMORY-MAPPED CRT OUTPUT DRIVER *
1101 ;* *
1102 ;* Russell Smith 18-August-1980 *
1103 ;* *
1104 ;********************************************************
1105 ;
1106 ;
>0030 1107 CRTBAS EQU CRTMEM.SHR.8 ;STARTING PAGE# OF 3K CRT SPACE
>003C 1108 CRTTOP EQU CRTMEM+3072.SHR.8 ;ENDING PAGE# OF CRT SPACE
1109 ;
1110 ;
F520 E5 1111 CRTOUT: PUSH HL
F521 D5 1112 PUSH DE
F522 C5 1113 PUSH BC
F523 CBBF 1114 RES 7,A
F525 4F 1115 LD C,A
F526 F3 1116 DI ;KEEP THE WOLVES AWAY FOR A WHILE
F527 ED7335FF 1117 LD (SPSAVE),SP
F52B 3157FF 1118 LD SP,TMPSTK+32 ;POINT SP TO TOP OF LOCAL STACK
F52E DB1C 1119 IN A,(BITDAT)
F530 CBFF 1120 SET 7,A ;SELECT ROM/CRT MEMORY BANK
F532 D31C 1121 OUT (BITDAT),A
1122 ;
1123 ; FIRST REMOVE THE OLD CURSOR CHARACTER FROM THE SCREEN
1124 ;
F534 2175FF 1125 LD HL,CHRSAV ;GET CHARACTER NOW OVERLAYED BY CURSOR
F537 46 1126 LD B,(HL)
F538 2A73FF 1127 LD HL,(CURSOR) ;LOAD HL WITH CURSOR POINTER
F53B 7C 1128 LD A,H
F53C E60F 1129 AND 00001111B ;A LITTLE INSURANCE THAT HL CAN'T
F53E F630 1130 OR CRTBAS ; EVER POINT OUTSIDE THE CRT MEMORY
F540 67 1131 LD H,A
F541 70 1132 LD (HL),B ;REMOVE CURSOR BY RESTORING CHARACTER
1133 ;
1134 ; PROCESS CHARACTER PASSED IN C
1135 ;
F542 CD65F5 1136 CALL OUTCH
1137 ;
1138 ; NOW STORE A NEW CURSOR CHARACTER AT THE CURSOR LOCATION
1139 ;
F545 7E 1140 LD A,(HL) ;GET CHARACTER AT NEW CURSOR LOCATION
F546 3275FF 1141 LD (CHRSAV),A ;SAVE FOR NEXT TIME 'CRTOUT' IS CALLED
F549 FE20 1142 CP ' ' ;TEST IF CHARACTER IS A SPACE
F54B CBFF 1143 SET 7,A ;THEN TURN ON BIT 7 TO ENABLE BLINK
F54D 2003 1144 JR NZ,CRT2-$ ;JUMP IF CHARACTER IS NON-BLANK
F54F 3A76FF 1145 LD A,(CSRCHR) ; ELSE GET CHARACTER USED FOR CURSOR
F552 77 1146 CRT2: LD (HL),A ;STORE CHARACTER IN A AS CURSOR MARK
F553 2273FF 1147 LD (CURSOR),HL ;SAVE HL AS CURSOR POINTER
1148
F556 ED7B35FF 1149 LD SP,(SPSAVE)
F55A DB1C 1150 IN A,(BITDAT)
PAGE 0021
ADDR CODE STMT SOURCE STATEMENT
F55C CBBF 1151 RES 7,A ;SWITCH BACK THE LOWER 16K OF RAM
F55E D31C 1152 OUT (BITDAT),A
F560 FB 1153 EI ;INTERRUPTS ARE SAFE AGAIN
F561 C1 1154 POP BC
F562 D1 1155 POP DE
F563 E1 1156 POP HL
F564 C9 1157 RET
1158 ;
1159 ;
1160 ;
F565 1178FF 1161 OUTCH: LD DE,LEADIN
F568 1A 1162 LD A,(DE) ;GET LEAD-IN SEQUENCE STATE
F569 B7 1163 OR A
F56A C270F6 1164 JP NZ,MULTI ;JUMP IF IN A LEAD-IN SEQUENCE
F56D 79 1165 LD A,C ; ELSE PROCESS CHARACTER IN C
F56E FE20 1166 CP ' '
F570 380F 1167 JR C,CONTRL-$ ;JUMP IF A CONTROL CHARACTER
F572 71 1168 DISPLA: LD (HL),C ; ELSE STORE DISPLAYABLE CHARACTER
F573 23 1169 INC HL ; AND ADVANCE POINTER TO NEXT COLUMN
F574 7D 1170 LD A,L
F575 E67F 1171 AND 01111111B ;EXTRACT COLUMN# FROM HL
F577 FE50 1172 CP 80
F579 D8 1173 RET C ;EXIT IF NOT PAST COLUMN 79
F57A CDE7F5 1174 CALL RETURN ; ELSE DO AUTOMATIC CARRIAGE RETURN
F57D CD42F6 1175 CALL LFEED ; AND LINEFEED
F580 C9 1176 RET
1177 ;
1178 ;
1179 ;
F581 E5 1180 CONTRL: PUSH HL
F582 218FF5 1181 LD HL,CTLTAB ;SEARCH FOR CONTROL CHARACTER
F585 010D00 1182 LD BC,CTLSIZ/3 ; HANDLING SUBROUTINE IN TABLE
F588 CD60F3 1183 CALL SEARCH
F58B E1 1184 POP HL
F58C C0 1185 RET NZ ;EXIT IF NOT IMPLEMENTED
F58D C5 1186 PUSH BC
F58E C9 1187 RET ;DO SNEAKY JUMP TO PRESERVE REGISTERS
1188
F58F 1F 1189 CTLTAB: DEFB '_'-64
F590 1E 1190 DEFB '^'-64
F591 1B 1191 DEFB '['-64
F592 1A 1192 DEFB 'Z'-64
F593 18 1193 DEFB 'X'-64
F594 11 1194 DEFB 'Q'-64
F595 0D 1195 DEFB 'M'-64
F596 0C 1196 DEFB 'L'-64
F597 0B 1197 DEFB 'K'-64
F598 0A 1198 DEFB 'J'-64
F599 09 1199 DEFB 'I'-64
F59A 08 1200 DEFB 'H'-64
F59B 07 1201 DEFB 'G'-64
1202
F59C DCF5 1203 DEFW BELL ;CTL-G IS THE BELL
F59E BEF5 1204 DEFW BAKSPC ;CTL-H IS CURSOR LEFT
F5A0 CCF5 1205 DEFW TAB ;CTL-I IS TAB
F5A2 42F6 1206 DEFW LFEED ;CTL-J IS CURSOR DOWN
F5A4 2CF6 1207 DEFW UPCSR ;CTL-K IS CURSOR UP
F5A6 C4F5 1208 DEFW FORSPC ;CTL-L IS CURSOR RIGHT
PAGE 0022
ADDR CODE STMT SOURCE STATEMENT
F5A8 E7F5 1209 DEFW RETURN ;CTL-M IS CARRIAGE RETURN
F5AA 11F6 1210 DEFW CLREOS ;CTL-Q IS CLEAR TO END-OF-SCREEN
F5AC 03F6 1211 DEFW CLREOL ;CTL-X IS CLEAR TO END-OF-LINE
F5AE ECF5 1212 DEFW CLRSCN ;CTL-Z IS CLEAR SCREEN
F5B0 B6F5 1213 DEFW ESCAPE ;CTL-[ IS ESCAPE
F5B2 6CF6 1214 DEFW HOMEUP ;CTL-^ IS HOME UP
F5B4 BAF5 1215 DEFW STUFF ;CTL-_ IS DISPLAY CONTROL CHARS
1216
>0027 1217 CTLSIZ EQU $-CTLTAB
1218 ;
1219 ;
F5B6 3E01 1220 ESCAPE: LD A,1
F5B8 12 1221 LD (DE),A ;SET LEAD-IN SEQUENCE STATE
F5B9 C9 1222 RET ; FOR XY CURSOR POSITIONING MODE
1223 ;
1224 ;
F5BA 3E04 1225 STUFF: LD A,4
F5BC 12 1226 LD (DE),A ;SET LEAD-IN SEQUENCE STATE
F5BD C9 1227 RET ; FOR CONTROL CHAR OUTPUT MODE
1228 ;
1229 ;
F5BE 7D 1230 BAKSPC LD A,L ;CHECK FOR LEFT MARGIN
F5BF E67F 1231 AND 01111111B
F5C1 C8 1232 RET Z ;ABORT IF IN LEFTMOST COLUMN
F5C2 2B 1233 DEC HL ;BACK UP CURSOR POINTER
F5C3 C9 1234 RET
1235 ;
1236 ;
F5C4 7D 1237 FORSPC: LD A,L ;CHECK FOR RIGHTMOST COLUNM
F5C5 E67F 1238 AND 01111111B
F5C7 FE4F 1239 CP 79
F5C9 D0 1240 RET NC ;DO NOTHING IF ALREADY THERE
F5CA 23 1241 INC HL
F5CB C9 1242 RET ;ELSE ADVANCE THE CURSOR POINTER
1243 ;
1244 ;
F5CC 110800 1245 TAB: LD DE,8 ;TABS ARE EVERY 8 COLUMNS
F5CF 7D 1246 LD A,L ;GET COLUMN COMPONENT OF
F5D0 E678 1247 AND 01111000B ; PREVIOUS TAB POSITION
F5D2 83 1248 ADD A,E
F5D3 FE50 1249 CP 80 ;EXIT IF NEXT TAB COLUMN WOULD
F5D5 D0 1250 RET NC ; BE PAST THE RIGHT MARGIN
F5D6 7D 1251 LD A,L
F5D7 E6F8 1252 AND 11111000B ;ELSE INCREMENT THE CURSOR
F5D9 6F 1253 LD L,A ; POINTER FOR REAL
F5DA 19 1254 ADD HL,DE
F5DB C9 1255 RET
1256 ;
1257 ;
F5DC DB1C 1258 BELL: IN A,(BITDAT)
F5DE CBEF 1259 SET 5,A ;TOGGLE BIT 5 OF SYSTEM PIO TO
F5E0 D31C 1260 OUT (BITDAT),A ; TRIGGER BELL HARDWARE TO SOUND
F5E2 CBAF 1261 RES 5,A
F5E4 D31C 1262 OUT (BITDAT),A
F5E6 C9 1263 RET
1264 ;
1265 ;
F5E7 7D 1266 RETURN: LD A,L
PAGE 0023
ADDR CODE STMT SOURCE STATEMENT
F5E8 E680 1267 AND 10000000B
F5EA 6F 1268 LD L,A ;MOVE CURSOR POINTER BACK
F5EB C9 1269 RET ; TO START OF LINE
1270 ;
1271 ;
F5EC 210030 1272 CLRSCN: LD HL,CRTMEM
F5EF E5 1273 PUSH HL
F5F0 110130 1274 LD DE,CRTMEM+1
F5F3 01000C 1275 LD BC,24*128
F5F6 3620 1276 LD (HL),' '
F5F8 EDB0 1277 LDIR ;FILL CRT MEMORY WITH SPACES
F5FA E1 1278 POP HL ;POINT TO HOME CURSOR POSITION
F5FB 3E17 1279 LD A,23
F5FD 3277FF 1280 LD (BASE),A ;MAKE BASE LINE# BE 23 AND
F600 D314 1281 OUT (SCROLL),A ; STORE IN SCROLL REGISTER
F602 C9 1282 RET
1283 ;
1284 ;
F603 E5 1285 CLREOL: PUSH HL ;SAVE CURSOR POINTER
F604 7D 1286 LD A,L
F605 E67F 1287 AND 01111111B ;GET COLUMN# COMPONENT OF
F607 4F 1288 LD C,A ; CURSOR POINTER INTO C
F608 3E50 1289 LD A,80 ;CALCULATE HOW MANY CHARACTERS
F60A 91 1290 SUB C ; REMAIN ON CURRENT LINE
F60B 47 1291 LD B,A
F60C CD66F6 1292 CALL CLR ;CLEAR REST OF LINE @ HL
F60F E1 1293 POP HL
F610 C9 1294 RET
1295 ;
1296 ;
F611 CD03F6 1297 CLREOS: CALL CLREOL ;CLEAR REMAINDER OF CURRENT ROW
F614 E5 1298 PUSH HL
F615 3A77FF 1299 LD A,(BASE)
F618 4F 1300 LD C,A ;COPY BASE SCREEN ROW# TO C
F619 7D 1301 CLRS1: LD A,L
F61A 17 1302 RLA
F61B 7C 1303 LD A,H
F61C 17 1304 RLA ;GET ROW# COMPONENT OF HL INTO A
F61D E61F 1305 AND 00011111B
F61F B9 1306 CP C ;SEE IF HL IS AT BOTTOM ROW OF SCREEN
F620 2808 1307 JR Z,CLRS2-$ ; AND LEAVE CLEAR LOOP IF SO
F622 CD37F6 1308 CALL DNCSR ;ELSE POINT HL TO NEXT ROW DOWN
F625 CD60F6 1309 CALL CLRLIN ; AND FILL THAT LINE WITH SPACES
F628 18EF 1310 JR CLRS1-$
1311
F62A E1 1312 CLRS2: POP HL ;RESTORE ORIGINAL CURSOR POINTER
F62B C9 1313 RET
1314 ;
1315 ;
F62C 1180FF 1316 UPCSR: LD DE,-128 ;SUBTRACT 1 FROM ROW# COMPONENT
F62F 19 1317 ADD HL,DE ; OF CURSOR POINTER IN HL
F630 7C 1318 LD A,H
F631 FE30 1319 CP CRTBAS ;CHECK FOR UNDERFLOW OF POINTER
F633 D0 1320 RET NC
F634 263B 1321 LD H,CRTTOP-1 ;WRAP CURSOR AROUND MODULO 3K
F636 C9 1322 RET
1323 ;
1324 ;
PAGE 0024
ADDR CODE STMT SOURCE STATEMENT
F637 118000 1325 DNCSR: LD DE,128 ;ADD 1 TO ROW# COMPONENT
F63A 19 1326 ADD HL,DE ; OF CURSOR POINTER IN HL
F63B 7C 1327 LD A,H
F63C FE3C 1328 CP CRTTOP ;CHECK FOR OVERFLOW OF POINTER
F63E D8 1329 RET C
F63F 2630 1330 LD H,CRTBAS ;RESET POINTER MODULO 128*24
F641 C9 1331 RET
1332 ;
1333 ;
1334 ;
F642 7D 1335 LFEED: LD A,L
F643 17 1336 RLA
F644 7C 1337 LD A,H
F645 17 1338 RLA ;EXTRACT ROW# COMPONENT OF HL
F646 E61F 1339 AND 00011111B
F648 4F 1340 LD C,A ;COPY ROW# INTO C FOR SCROLL TEST
F649 CD37F6 1341 CALL DNCSR ;MOVE CURSOR TO NEXT ROW DOWN
F64C 3A77FF 1342 LD A,(BASE) ;TEST IF CURSOR WAS ON BOTTOM ROW
F64F B9 1343 CP C ; OF SCREEN BEFORE MOVING DOWN
F650 C0 1344 RET NZ ;EXIT IF NOT AT BOTTOM
1345
F651 E5 1346 PUSH HL ;ELSE PREP TO SCROLL SCREEN UP
F652 CD60F6 1347 CALL CLRLIN ;FILL NEW BOTTOM LINE WITH SPACES
F655 29 1348 ADD HL,HL
F656 7C 1349 LD A,H ;GET ROW# COMPONENT OF HL INTO A
F657 E61F 1350 AND 00011111B
F659 3277FF 1351 LD (BASE),A ;STORE NEW BASE LINE#
F65C D314 1352 OUT (SCROLL),A ;NOW SCROLL UP NEW BLANK BOTTOM LINE
F65E E1 1353 POP HL
F65F C9 1354 RET
1355 ;
1356 ;
F660 7D 1357 CLRLIN: LD A,L
F661 E680 1358 AND 10000000B ;POINT HL TO FIRST COLUMN OF ROW
F663 6F 1359 LD L,A
F664 0650 1360 LD B,80
F666 3620 1361 CLR: LD (HL),' ' ;STORE ASCII SPACES AT ADDRESS IN HL
F668 23 1362 INC HL ; AND INCREMENT HL
F669 10FB 1363 DJNZ CLR-$ ;REPEAT NUMBER OF TIMES GIVEN BY B
F66B C9 1364 RET
1365 ;
1366 ;
F66C 0E20 1367 HOMEUP: LD C,' ' ;FAKE-OUT CURSOR ADDRESSING ROUTINE
F66E 1817 1368 JR SETROW-$ ; TO DO HOMEUP ALMOST FOR FREE
1369 ;
1370 ;
F670 EB 1371 MULTI: EX DE,HL ;UNCONDITIONALLY RESET THE LEAD-IN
F671 3600 1372 LD (HL),0 ; STATE TO ZERO BEFORE GOING ON
F673 EB 1373 EX DE,HL
F674 FE01 1374 CP 1
F676 2008 1375 JR NZ,M2TST-$
F678 79 1376 SETXY: LD A,C ;GET SECOND CHAR OF SEQUENCE
F679 FE3D 1377 CP '='
F67B C0 1378 RET NZ ;ABORT SEQUENCE IF NOT '='
F67C 3E02 1379 LD A,2
F67E 12 1380 LD (DE),A ;MAKE LEADIN=2 NEXT TIME
F67F C9 1381 RET
1382
PAGE 0025
ADDR CODE STMT SOURCE STATEMENT
F680 FE02 1383 M2TST: CP 2
F682 2019 1384 JR NZ,M3TST-$
F684 3E03 1385 LD A,3
F686 12 1386 LD (DE),A ;MAKE LEADIN=3 NEXT TIME
F687 3A77FF 1387 SETROW: LD A,(BASE) ;ARRIVE HERE ON THIRD CHARACTER
F68A 81 1388 ADD A,C ; OF ESC,'=',ROW,COL SEQUENCE
F68B D61F 1389 SUB ' '-1
F68D D618 1390 SETR2: SUB 24
F68F 30FC 1391 JR NC,SETR2-$ ;MAKE SURE ROW# IS BETWEEN 0 AND 23
F691 C618 1392 ADD A,24
F693 F660 1393 OR CRTMEM.SHR.7 ;MERGE IN MSB'S OF CRT MEMORY
F695 67 1394 LD H,A
F696 2E00 1395 LD L,0
F698 CB3C 1396 SRL H
F69A CB1D 1397 RR L
F69C C9 1398 RET
1399
F69D FE03 1400 M3TST: CP 3
F69F 200C 1401 JR NZ,M4TST-$
F6A1 79 1402 SETCOL: LD A,C ;ARRIVE HERE ON FOURTH CHARACTER
F6A2 D620 1403 SUB ' ' ; OF ESC,'=',ROW,COL SEQUENCE
F6A4 D650 1404 SETC2: SUB 80
F6A6 30FC 1405 JR NC,SETC2-$ ;MAKE SURE COL# IS BETWEEN 0 AND 79
F6A8 C650 1406 ADD A,80
F6AA B5 1407 OR L ;MERGE IN COL# WITH L
F6AB 6F 1408 LD L,A
F6AC C9 1409 RET
1410
F6AD CD72F5 1411 M4TST: CALL DISPLA ;DISPLAY THE CONTROL CHARACTER
F6B0 C9 1412 RET ; PASSED IN C
1413 ;
1414 ;
1415 ;
1416 ;
1417 INCLUDE DISKIO.ASM
1418 ;********************************************************
1419 ;* *
1420 ;* DISK INPUT/OUTPUT DRIVER SUBROUTINE PACKAGE *
1421 ;* FOR WESTERN DIGITAL 1771 DISK CONTROLLER *
1422 ;* *
1423 ;* bullet-proof error recovery added 12-APR-80 *
1424 ;* *
1425 ;********************************************************
1426 ;
1427 ;
1428 ; EQUATES FOR DISK CONTROLLER PORTS AND COMMAND CODES
1429 ;
>0010 1430 STSREG EQU WD1771+0 ;STATUS REGISTER
>0010 1431 CMDREG EQU WD1771+0 ;COMMAND REGISTER
>0011 1432 TRKREG EQU WD1771+1 ;TRACK REGISTER
>0012 1433 SECREG EQU WD1771+2 ;SECTOR REGISTER
>0013 1434 DATREG EQU WD1771+3 ;DATA REGISTER
1435 ;
>0088 1436 RDCMD EQU 10001000B ;READ COMMAND
>00A8 1437 WRTCMD EQU 10101000B ;WRITE COMMAND
>001C 1438 SKCMD EQU 00011100B ;SEEK COMMAND
>00D0 1439 FINCMD EQU 11010000B ;FORCE INTR COMMAND
>000C 1440 RSTCMD EQU 00001100B ;RESTORE COMMAND
PAGE 0026
ADDR CODE STMT SOURCE STATEMENT
>0004 1441 HLOAD EQU 00000100B ;RD/WRT HEAD LOAD ENABLE
1442 ;
>00C9 1443 RET EQU 0C9H ;SUBROUTINE RETURN INSTR OPCODE
>0066 1444 NMIVEC EQU 0066H ;THE NON-MASKABLE INTERRUPT IS
1445 ;USED FOR DATA SYNCRONIZATION BETWEEN
1446 ;THE Z-80 AND 1771 DISK CONTROLLER
1447 ;
1448 ;
1449 ;
F6B1 79 1450 SELECT: LD A,C ;GET UNIT# PASSED IN C AND
F6B2 FE04 1451 CP 4 ; CHECK FOR MAXIMUM VALID#
F6B4 D0 1452 RET NC ;ERROR IF NUMBER > 3
F6B5 CDB8F7 1453 CALL TURNON ;MAKE SURE DISKS ARE TURNED ON
F6B8 DB1C 1454 IN A,(BITDAT)
F6BA 47 1455 LD B,A ;SAVE CURRENT DRIVE SELECT DATA
F6BB E6F8 1456 AND 11111000B ;MERGE IN NEW DRIVE UNIT# IN C
F6BD B1 1457 OR C ; IN PLACE OF THE CURRENT ONE
F6BE D31C 1458 OUT (BITDAT),A ; TO SELECT THE NEW DISK DRIVE
F6C0 CDAEF7 1459 CALL FORCE ;TEST NEW DRIVE'S READY STATUS
F6C3 2806 1460 JR Z,SEL2-$ ; AND CONTINUE IF ITS READY
F6C5 78 1461 LD A,B
F6C6 D31C 1462 OUT (BITDAT),A ;ELSE PUT BACK OLD DRIVE SELECT DATA
F6C8 3E80 1463 LD A,10000000B ; AND RETURN DRIVE-NOT-READY STATUS
F6CA C9 1464 RET
1465
F6CB 2165FF 1466 SEL2: LD HL,UNIT ;POINT HL TO DRIVE SELECT DATA
F6CE 7E 1467 LD A,(HL) ;LOAD A WITH CURRENT UNIT#
F6CF 71 1468 LD (HL),C ; AND STORE NEW UNIT# FROM C
F6D0 FEFF 1469 CP 255 ;TEST IF NO DRIVE HAS BEEN SELECTED
F6D2 2806 1470 JR Z,SEL3-$ ; YET AND SKIP NEXT SEGMENT IF SO
F6D4 23 1471 INC HL ;POINT TO HEAD POSITION TABLE
F6D5 85 1472 ADD A,L ; AND ADD IN NEW UNIT# AS INDEX
F6D6 6F 1473 LD L,A
F6D7 DB11 1474 IN A,(TRKREG) ;GET CURRENT HEAD POSITION
F6D9 77 1475 LD (HL),A ; AND STORE IN TABLE @ HL
F6DA 2166FF 1476 SEL3: LD HL,TRKTAB
F6DD 7D 1477 LD A,L
F6DE 81 1478 ADD A,C ;INDEX INTO TABLE TO GET
F6DF 6F 1479 LD L,A ; HEAD POSITION OF NEW DRIVE
F6E0 7E 1480 LD A,(HL)
F6E1 FEFF 1481 CP 255 ;TEST IF NEW DRIVE HAS EVER BEEN
F6E3 2804 1482 JR Z,HOME-$ ; SELECTED AND DO A HOME IF NOT
F6E5 D311 1483 OUT (TRKREG),A ;OUTPUT THE DRIVE'S CURRENT HEAD
F6E7 AF 1484 XOR A ; POSITION TO THE TRACK REGISTER
F6E8 C9 1485 RET
1486 ;
1487 ;
1488 ;
F6E9 CDABF7 1489 HOME: CALL READY ;CLEAR DISK CONTROLLER
F6EC C0 1490 RET NZ ;EXIT IF DRIVE NOT READY
F6ED AF 1491 XOR A
F6EE 326DFF 1492 LD (TRACK),A ;SET TRACK# IN MEM TO ZERO
F6F1 060C 1493 RESTOR: LD B,RSTCMD ;LOAD B WITH A RESTORE COMMAND
F6F3 CD93F7 1494 CALL STEP ;EXECUTE HEAD MOVING OPERATION
F6F6 EE04 1495 XOR 00000100B ;GET TRUE TRACK 0 STATUS
F6F8 E69C 1496 AND 10011100B ;MASK TO ERROR BITS
F6FA C9 1497 RET ;RETURN 1771 STATUS IN A
1498 ;
PAGE 0027
ADDR CODE STMT SOURCE STATEMENT
1499 ;
1500 ;
F6FB CDABF7 1501 SEEK: CALL READY ;CLEAR DISK CONTROLLER
F6FE C0 1502 RET NZ ;EXIT IF DRIVE NOT READY
F6FF 79 1503 LD A,C ;GET TRACK# DATA FROM C AND
F700 FE4D 1504 CP 77 ; CHECK FOR MAXIMUM VALID#
F702 D0 1505 RET NC ;FORGET IT IF TRACK# > 76
F703 326DFF 1506 LD (TRACK),A ; ELSE STORE TRACK# FOR SEEK
F706 D313 1507 OUT (DATREG),A ;OUTPUT TRACK # TO 1771
F708 061C 1508 LD B,SKCMD ;LOAD B WITH A SEEK COMMAND AND
F70A CD93F7 1509 CALL STEP ; GO SEEK WITH PROPER STEP RATE
F70D E698 1510 AND 10011000B ;MASK TO READY,SEEK AND CRC ERROR
F70F C8 1511 RET Z ; BITS AND RETURN IF ALL GOOD
1512
F710 CDF1F6 1513 CALL RESTOR ;ELSE TRY TO RE-CAILBRATE HEAD
F713 C0 1514 RET NZ ;ERROR IF WE CAN'T FIND TRACK 0
F714 79 1515 LD A,C
F715 D313 1516 OUT (DATREG),A ;OUTPUT TRACK# TO 1771
F717 061C 1517 LD B,SKCMD
F719 CD93F7 1518 CALL STEP ;TRY TO SEEK THE TRACK AGAIN
F71C E698 1519 AND 10011000B
F71E C9 1520 RET ;RETURN FINAL SEEK STATUS IN A
1521 ;
1522 ;
1523 ;
F71F CDABF7 1524 WRITE: CALL READY ;CLEAR THE DISK CONTROLLER
F722 C0 1525 RET NZ ;EXIT IF DRIVE NOT READY
F723 CB77 1526 BIT 6,A
F725 C0 1527 RET NZ ;EXIT IF DISK IS WRITE-PROTECTED
F726 06A8 1528 LD B,WRTCMD
F728 1806 1529 JR RDWRT-$
1530
F72A CDABF7 1531 READ: CALL READY ;CLEAR DISK CONTROLLER
F72D C0 1532 RET NZ ;EXIT IF DRIVE NOT READY
F72E 0688 1533 LD B,RDCMD
F730 2271FF 1534 RDWRT: LD (IOPTR),HL ;STORE DISK I/O DATA POINTER
F733 216EFF 1535 LD HL,SECTOR
F736 71 1536 LD (HL),C ;STORE SECTOR# FOR READ/WRITE
F737 23 1537 INC HL
F738 70 1538 LD (HL),B ;SAVE READ/WRITE COMMAND BYTE
F739 23 1539 INC HL
F73A 3602 1540 LD (HL),2 ;SET DISK OPERATION RE-TRY COUNT
F73C F3 1541 RW1: DI ;NO INTERRUPTS DURING DISK I/O
F73D 216600 1542 LD HL,NMIVEC ;SAVE BYTE AT NMI VECTOR LOCATION
F740 56 1543 LD D,(HL) ; IN D FOR DURATION OF READ/WRITE
F741 36C9 1544 LD (HL),RET ; LOOP AND REPLACE IT WITH A RET
F743 216BFF 1545 LD HL,RECLEN
F746 46 1546 LD B,(HL) ;B=NUMBER OF BYTES/SECTOR
F747 0E13 1547 LD C,DATREG ;C=1771 DATA REGISTER PORT#
F749 2A71FF 1548 LD HL,(IOPTR) ;HL=DISK READ/WRITE DATA POINTER
F74C 3A6EFF 1549 LD A,(SECTOR) ;GET SECTOR NUMBER
F74F D312 1550 OUT (SECREG),A ;OUTPUT SECTOR# TO 1771
F751 CDAEF7 1551 CALL FORCE ;ISSUE A FORCE INTERRUPT COMMAND
F754 CB6F 1552 BIT 5,A ; TO TEST CURRENT HEAD LOAD STATUS
F756 3A6FFF 1553 LD A,(CMDTYP) ;GET READ OR WRITE COMMAND BYTE
F759 2002 1554 JR NZ,RW2-$ ;JUMP IF HEAD IS ALREADY LOADED
F75B F604 1555 OR HLOAD ; ELSE MERGE IN HLD BIT
F75D CDA3F7 1556 RW2: CALL CMDOUT ;START THE 1771 DOING IT'S THING
PAGE 0028
ADDR CODE STMT SOURCE STATEMENT
F760 CB6F 1557 BIT 5,A ;TEST IF COMMAND IS A READ OR WRITE
F762 200D 1558 JR NZ,WLOOP-$ ; AND JUMP TO THE CORRECT LOOP
F764 76 1559 RLOOP: HALT
F765 EDA2 1560 INI
F767 C264F7 1561 JP NZ,RLOOP
F76A CD9CF7 1562 CALL BUSY ;LOOP UNTIL 1771 COMES UN-BUSY
F76D E69C 1563 AND 10011100B ;MASK OFF TO READY, NOT FOUND, CRC
F76F 180B 1564 JR RW3-$ ; AND LOST DATA STATUS BITS
1565
F771 76 1566 WLOOP: HALT
F772 EDA3 1567 OUTI
F774 C271F7 1568 JP NZ,WLOOP
F777 CD9CF7 1569 CALL BUSY
F77A E6BC 1570 AND 10111100B ;MASK OFF AS ABOVE PLUS WRITE FAULT
F77C 216600 1571 RW3: LD HL,NMIVEC
F77F 72 1572 LD (HL),D ;RESTORE BYTE @ NMI VECTOR
F780 FB 1573 EI
F781 C8 1574 RET Z ;RETURN IF NO DISK I/O ERRORS
F782 2170FF 1575 LD HL,RETRY
F785 35 1576 DEC (HL) ;DECREMENT RE-TRY COUNT AND
F786 2002 1577 JR NZ,RW4-$ ; EXECUTE COMAND AGAIN IF NOT=0
F788 B7 1578 OR A
F789 C9 1579 RET ;ELSE RETURN 1771 ERROR STATUS
1580
F78A 216DFF 1581 RW4: LD HL,TRACK
F78D 4E 1582 LD C,(HL) ;GET TRACK# FOR CURRENT OPERATION
F78E CDFBF6 1583 CALL SEEK ;TRY TO RE-CAILBRATE THE HEAD
F791 18A9 1584 JR RW1-$ ; BEFORE READING OR WRITING AGAIN
1585 ;
1586 ;
1587 ;
F793 3A6AFF 1588 STEP: LD A,(SPEED) ;GET STEP SPEED VARIABLE
F796 E603 1589 AND 00000011B
F798 B0 1590 OR B ;MERGE WITH SEEK/HOME COMMAND IN B
F799 CDA3F7 1591 CALL CMDOUT ;OUTPUT COMMAND AND DELAY
F79C DB10 1592 BUSY: IN A,(STSREG)
F79E CB47 1593 BIT 0,A ;TEST BUSY BIT FROM
F7A0 20FA 1594 JR NZ,BUSY-$ ; 1771 AND LOOP TILL=0
F7A2 C9 1595 RET
1596 ;
1597 ;
1598 ;
F7A3 D310 1599 CMDOUT: OUT (CMDREG),A ;OUTPUT A COMMAND TO THE 1771
F7A5 CDA8F7 1600 CALL PAUSE ;WASTE 44 MICROSECONDS
F7A8 E3 1601 PAUSE: EX (SP),HL
F7A9 E3 1602 EX (SP),HL
F7AA C9 1603 RET
1604 ;
1605 ;
1606 ;
F7AB CDB8F7 1607 READY: CALL TURNON ;KEEP THOSE DISKS SPINING FOLKS
F7AE 3ED0 1608 FORCE: LD A,FINCMD ;ISSUE A FORCE INTERRUPT COMMAND
F7B0 CDA3F7 1609 CALL CMDOUT
F7B3 DB10 1610 IN A,(STSREG) ;READ STATUS REGISTER CONTENTS
F7B5 CB7F 1611 BIT 7,A ;TEST DRIVE NOT READY BIT
F7B7 C9 1612 RET
1613 ;
1614 ;
PAGE 0029
ADDR CODE STMT SOURCE STATEMENT
1615 ;
F7B8 3E1E 1616 TURNON: LD A,30
F7BA 326CFF 1617 LD (MOTOR),A ;RE-LOAD THE MOTOR TURN-OFF TIMER
F7BD CDA8F7 1618 CALL PAUSE
F7C0 DB1C 1619 IN A,(BITDAT)
F7C2 CB57 1620 BIT 2,A ;TEST IF MOTORS HAVE BEEN STOPPED
F7C4 C8 1621 RET Z ; AND EXIT IF STILL TURNED ON
F7C5 E6BB 1622 AND 10111011B ;ELSE RE-ENABLE THE DRIVE SELECTS
F7C7 D31C 1623 OUT (BITDAT),A ; AND ACTIVATE THE MOTOR RELAY
F7C9 C5 1624 PUSH BC
F7CA 0600 1625 LD B,0 ;SET READY LOOP MAX TIMEOUT
F7CC CDDCF7 1626 TURN2: CALL WAIT ;WAIT 1/93 SECOND AND TEST READY
F7CF 2802 1627 JR Z,TURN3-$ ;EXIT LOOP IF DRIVE READY
F7D1 10F9 1628 DJNZ TURN2-$ ; ELSE TRY AGAIN UP TO 256 TIMES
F7D3 0609 1629 TURN3: LD B,9
F7D5 CDDCF7 1630 TURN4: CALL WAIT ;GIVE ABOUT 1/10 SECOND MORE DELAY
F7D8 10FB 1631 DJNZ TURN4-$
F7DA C1 1632 POP BC
F7DB C9 1633 RET
1634 ;
1635 ;
F7DC DB1B 1636 WAIT: IN A,(CTC3) ;GET CURRENT CTC3 COUNT VALUE
F7DE 4F 1637 LD C,A
F7DF DB1B 1638 WAIT2: IN A,(CTC3)
F7E1 B9 1639 CP C ;TEST IF CTC3 HAS CHANGED BY 1 COUNT
F7E2 28FB 1640 JR Z,WAIT2-$ ; AND LOOP UNTIL IT CHANGES
F7E4 18C8 1641 JR FORCE-$ ; THEN GO TEST DRIVE READY STATUS
1642 ;
1643 ;
1644 ;
1645 ;
1646 ;
F7E6 0000 1647 ROMEND: DEFW 0 ;TAIL OF FREE MEMORY LINKED LIST
1648 ;
>FF00 1649 ORG RAM
1650 INCLUDE MEMORY.ASM
1651 ;********************************************************
1652 ;* *
1653 ;* STORAGE ALLOCATION FOR 256 BYTE SCRATCH RAM *
1654 ;* *
1655 ;********************************************************
1656 ;
1657 ;
1658
>FF00 1659 VECTAB EQU $ ;INTERRUPT VECTOR TABLE STARTS HERE
>FF00 1660 SIOVEC: DEFS 16 ;SPACE FOR 8 VECTORS FOR SIO
>FF10 1661 CTCVEC: DEFS 8 ;SPACE FOR 4 VECTORS FOR CTC
>FF18 1662 SYSVEC: DEFS 4 ;SPACE FOR 2 VECTORS FOR SYSTEM PIO
>FF1C 1663 GENVEC: DEFS 4 ;SPACE FOR 2 VECTORS FOR GENERAL PIO
1664 ;
1665 ;
1666 ; KEYBOARD DATA INPUT FIFO VARIABLES
1667
>FF20 1668 FIFO: DEFS 16 ;CONSOLE INPUT FIFO
>FF30 1669 FIFCNT: DEFS 1 ;FIFO DATA COUNTER
>FF31 1670 FIFIN: DEFS 1 ;FIFI INPUT POINTER
>FF32 1671 FIFOUT: DEFS 1 ;FIFO OUTPUT POINTER
>FF33 1672 LOCK: DEFS 2 ;SHIFT LOCK CHARACTER+FLAG BYTE
PAGE 0030
ADDR CODE STMT SOURCE STATEMENT
1673 ;
1674 ;
1675 ; STACK POINTER SAVE AND LOCAL STACK FOR INTERRUPT ROUTINES
1676
>FF35 1677 SPSAVE: DEFS 2 ;USER STACK POINTER SAVE AREA
>FF37 1678 TMPSTK: DEFS 32 ;LOCAL STACK FOR INTERRUPTS
1679 ;
1680 ;
1681 ; 'SOFTWARE' VECTORS FOR INTERRUPT SERVICE ROUTINES
1682
>FF57 1683 TIKVEC: DEFS 2 ;ONE SECOND INTERRUPT ROUTINE VECTOR
>FF59 1684 PINVEC: DEFS 2 ;PARALLEL CONSOLE INPUT VECTOR
>FF5B 1685 SINVEC: DEFS 2 ;SERIAL CONSOLE INPUT VECTOR
1686 ;
1687 ;
1688 ; CLOCK-TIMER INTERRUPT VARIABLES
1689
>FF5D 1690 TIKCNT: DEFS 2 ;BINARY CLOCK TICK COUNTER
>FF5F 1691 DAY: DEFS 1 ;CALENDAR DAY
>FF60 1692 MONTH: DEFS 1 ; MONTH
>FF61 1693 YEAR: DEFS 1 ; YEAR
>FF62 1694 HRS: DEFS 1 ;CLOCK HOURS REGISTER
>FF63 1695 MINS: DEFS 1 ; MINUTES RETISTER
>FF64 1696 SECS: DEFS 1 ; SECONDS REGISTER
1697 ;
1698 ;
1699 ; DISK I/O DRIVER VARIABLES
1700
>FF65 1701 UNIT: DEFS 1 ;CURRENTLY SELECTED DISK#
>FF66 1702 TRKTAB: DEFS 4 ;4 DRIVE HEAD POSITION TABLE
>FF6A 1703 SPEED: DEFS 1 ;SEEK SPEED FOR 1771 COMMANDS
>FF6B 1704 RECLEN: DEFS 1 ;SECTOR RECORD LENGTH VARIABLE
>FF6C 1705 MOTOR: DEFS 1 ;DRIVE MOTOR TURN-OFF TIMER
>FF6D 1706 TRACK: DEFS 1
>FF6E 1707 SECTOR: DEFS 1
>FF6F 1708 CMDTYP: DEFS 1 ;COMMAND BYTE FOR READS/WRITES
>FF70 1709 RETRY: DEFS 1 ;DISK OPERATION RE-TRY COUNT
>FF71 1710 IOPTR: DEFS 2 ;DISK I/O BUFFER POINTER
1711 ;
1712 ;
1713 ;
1714 ; CRT OUTPUT DRIVER VARIABLES
1715
>FF73 1716 CURSOR: DEFS 2 ;CURSOR POINTER
>FF75 1717 CHRSAV: DEFS 1 ;CHARACTER OVERLAYED BY CURSOR
>FF76 1718 CSRCHR: DEFS 1 ;CHARACTER USED FOR A CURSOR
>FF77 1719 BASE: DEFS 1 ;CURRENT CONTENTS OF SCROLL REGISTER
>FF78 1720 LEADIN: DEFS 1 ;STATE OF LEAD-IN SEQUENCE HANDLER
1721 ;
1722 ;
1723 ; NULL PAD COUNT FOR SERIAL OUTPUT DELAY
1724
>FF79 1725 NULLS: DEFS 1 ;# OF NULLS SENT AFTER CONTROL CHARS.
1726 ;
1727 ;
1728 ; LISTHEAD POINTER FOR DYNAMIC MEMORY ALLOCATION SCHEME
1729
>FF7A 1730 FREPTR: DEFS 2
PAGE 0031
ADDR CODE STMT SOURCE STATEMENT
1731 ;
1732 ;
1733 ; CONSOLE MONITOR PROGRAM VARIABLES
1734
>FF7C 1735 PARAM1: DEFS 2 ;STORAGE FOR NUMBERS READ
>FF7E 1736 PARAM2: DEFS 2 ; FROM LINE INPUT BUFFER
>FF80 1737 PARAM3: DEFS 2 ; BY 'PARAMS' SUBROUTINE
>FF82 1738 PARAM4: DEFS 2
>FF84 1739 ESCFLG: DEFS 1 ;CONSOLE ESCAPE FLAG
>FF85 1740 COFLAG: DEFS 1 ;CONSOLE OUTPUT TOGGLE
>FF86 1741 LAST: DEFS 2 ;LAST ADDRESS USED BY 'MEMDMP'
>FF88 1742 LINBUF: DEFS 64 ;CONSOLE LINE INPUT BUFFER
1743 ;
1744 ;
1745
1746 ;
1747 END
ERRORS=0000