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