P.F.M. (Power Fuck Monitor)

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
Translate »