IMD 1.18: 30/01/2015 20:00:12 CAL-TEX COMPUTERS, INC. "BIG BOARD II" ROM MONITOR SOURCE    CRTOUT MAC` DISKIO MAC~ENTRYS MAC INIT MAC^!"#$%&'()*+,) ; ; CTLTAB: DEFB 'G'-64 DEFB 'H'-64 DEFB 'I'-64 DEFB 'J'-64 DEFB 'K'-64 DEFB 'L'-64 DEFB 'M'-64 DEFB 'Q'-64 ATACTER PASSED IN C TO VIDEO DISPLAY ; CRTOUT: LD HL,(ESCVEC) LD A,H OR L ;TEST IF IN AN ESCAPE SEQUENCE JR NZ,CRT2 INTSRV MAC3-./0123MEMORY MAC#45678MONITOR MACp9:;<=>?@ABCDEFROM MAC GH DEFB 'X'-64 DEFB 'Z'-64 DEFB '['-64 DEFB '^'-64 DEFB '_'-64 DEFW STUFF ;CTL-_ ... DISPLAY CONTROL CHARACTERS DEF;JUMP IF 'ESCVEC' IS NON-ZERO RES 7,C ;CONFINE CHARACTERS TO 0..127 RANGE LD A,C CP ' ' JR C,CRT3 ;JUMP IF A CONTROLSCRATCH MACISWEEP36 COMJKLMNOPQRSTUVWXYSWEEP36 COM\Z[\]^_`abcdeW HOMEUP ;CTL-^ ... CURSOR HOME DEFW ESCAPE ;CTL-[ ... ESCAPE DEFW CLRALL ;CTL-Z ... CLEAR SCREEN DEFW CLREOL ;CTL-X . CHARACTER CALL DISPLAY RET ; ; CRT2: LD DE,0 LD (ESCVEC),DE ;UNCONDITIONALLY CLEAR 'ESCVEC' JP (HL) ;THEN GO TO R;******************************************************** ;* * ;* CRT DRIVER FOR 6845 CRT CONTROLLER AND SMC * ;* 8002.. CLEAR TO END OF LINE DEFW CLREOS ;CTL-Q ... CLEAR TO END OF SCREEN DEFW RETURN ;CTL-M ... CARRIAGE RETURN DEFW RIGHT OUTINE @HL ; ; ; CRT3: LD HL,CTLTAB LD BC,CTLSIZ/3 CALL SEARCH ;SEARCH FOR CONTROL CHARACTER IN TABLE RET NZ JP (HL CHARACTER GENERATOR/ATTRIBUTES CHIP * ;* * ;******************************************************** ; ; ; OUTPUT CH  ;CTL-L ... CURSOR RIGHT DEFW UPLINE ;CTL-K ... INVERSE LINEFEED/CURSOR UP DEFW DNLINE ;CTL-J ... LINEFEED/CURSOR DOWN DOLUMN# JR CSRMOV ; UP: LD DE,00FFH ;DECREMENT ROW# JR CSRMOV ; DOWN: LD DE,0001H ;INCREMENT ROW# CSRMOV: LD HL,(RC) ;G(PORT0),A RET ; ; ; ; ; ; ESCAPE: LD HL,ESCSEQ ;PROCESS SECOND CHARACTER OF ESCAPE LD (ESCVEC),HL ; SEQUENCE NEXT TIME,ATTMEM ADD HL,DE ;POINT TO CURRENT CURSOR ATTRIBUTE BYTE LD A,(HL) BIT 7,A ;TEST IF CURSOR HAS BEEN TURNED ON YET RE (COL),A ;ELSE STORE UPDATED COLUMN# LD HL,(CURSOR) INC HL RES 3,H ;BUMP CURSOR POINTER MODULO 2048 LD (CURSOR),HL CK OFF FOR MODULO 2048 ROLL-AROUND LD H,A LD (CURSOR),HL ;STORE NEW RELATIVE CURSOR POINTER SETCSR: LD A,(MOVECS) OR A EFW HTAB ;CTL-I ... HORIZONTAL TAB DEFW LEFT ;CTL-H ... BACKSPACE/CURSOR LEFT DEFW BELL ;CTL-G ... AUDIBLE BELL CTLSIZ EET CURRENT ROW# IN L AND COL# IN H LD A,L ADD A,E ;ADD -1,0,OR 1 TO ROW# CP 24 RET NC ;EXIT IF ROW OUT OF RANGE LD LE RET ; ; STUFF: LD HL,DISPLA LD (ESCVEC),HL ;SET LEAD-IN SEQUENCE STATE RET ; FOR CONTROL CHAR OUTPUT MODE ; ; ; T Z ; AND EXIT IF NOT XOR 10010000B ;ELSE RESET BIT 7 AND INVERT BIT 4 OF LD (HL),A ; CURSOR BYTE IF VSYNC HAS CHANGED TALL SETCSR ;MARK NEXT CURSOR POSITION RET ; DISP2: LD HL,CRTFLG BIT AUTONL,(HL) RET Z ;EXIT IF AUTO NEWLINE DISABLED ;TEST IF NEW-CURSOR FLAG HAS BEEN SET RET NZ ;EXIT NOW IF SO LD A,11010111B ;ELSE ENABLE VSYNC INTERRUPT FROM CTC OUT (QU $-CTLTAB ; ; ; ; ; DISPLAY: LD HL,(CURSOR) LD DE,CHRMEM ADD HL,DE ;GET POINTER TO CHARACTER IN DISPLAY EX DE,H,A LD A,H ADD A,D ;ADD -1,0 OR 1 TO COLUMN# CP 80 RET NC ;EXIT IF COLUMN OUT OF BOUNDS LD H,A GOTOXY: LD (RC),HL  HTAB: LD A,(COL) AND 00000111B LD C,A LD A,8 SUB C ;COMPUTE DISTANCE TO NEXT TAB STOP LD D,A LD E,0 JR CSRMOV ;HEM RET ; ; ; MULT80: ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD D,H LD E,L ;DE=ROW*16 ADD HL,HL ADD HL,H XOR A LD (COL),A ;RESET COLUMN NUMBER AND DO LINEFEED CALL DNLINE RET ; ; ; ; ; BELL: LD A,BUZZER+ON OUT (PORTCTCA3),A LD A,1 OUT (CTCA3),A LD (MOVECS),A ;SET FLAG FOR INTERRUPT ROUTINE RET ; ; ; ZAPCSR: DI LD A,00000011B L LD HL,4096 ADD HL,DE ;GET POINTER TO MATCHING ATTRIBUTE EX DE,HL LD A,(ATTRIB) LD (HL),C ;OUTPUT CHARACTER AND ATT ;STORE NEW ROW/COLUMN VALUES LD B,0 LD C,H ;PUT COLUMN# INTO BC AS 16 BITS LD H,0 CALL MULT80 ;MULTILPY 16 BIT ROW# BADVANCE COLUMN# AND CURSOR TO NEXT TAB ; LEFT: LD DE,0FF00H ;DECREMENT COLUMN# JR CSRMOV ; RIGHT: LD DE,0100H ;INCREMENT CL ;HL=ROW*64 ADD HL,DE ;HL=(ROW*64)+(ROW*16) RET ; ; ; UPLINE: LD A,(ROW) OR A JR NZ,UP ;DO CURSOR-UP IF NOT ON0),A LD BC,200 BELL2: DJNZ BELL2 ;DELAY ABOUT 1 MILLISECOND DEC C JR NZ,BELL2 ;REPEAT 200 TIMES LD A,BUZZER+OFF OUT  OUT (CTCA3),A ;DISABLE VSYNC INTERRUPT FROM CTCA3 EI XOR A LD (MOVECS),A ;RESET CURSOR-MOVE FLAG LD HL,(CURSOR) LD DRIBUTE LD (DE),A LD A,(COL) INC A ;INCREMENT COLUMN NUMBER CP 80 JR NC,DISP2 ;CHECK FOR AUTO NEWLINE IF AT END LDY 80 ADD HL,BC ;HL=(ROW*80)+COL LD DE,(START) ADD HL,DE ;ADD CRTC START ADDRESS TO POINTER LD A,H AND 00000111B ;MAS  TOP LINE LD DE,-80 ;ELSE SCROLL SCREEN DOWN LD BC,0 JR LFEED ; ; DNLINE: LD A,(ROW) CP 23 JR NZ,DOWN ;DO CURSO H,0 LD L,A ADD HL,DE ;SUM IS TOTAL CHARACTERS TO ERASE LD B,H LD C,L LD HL,(CURSOR) CALL CLRLINE ;GO FILL DISPLAY POINTER AND BYTECOUNT PUSH BC LD D,H LD E,L INC DE LDIR ;FILL CHARACTER LINE WITH SPACES POP BC POP HL ;RESTOR LDDR ;EXPAND CONTENTS OF ATTRIBUTE MEMORY RET ; ; ; DELLINE: CALL RETURN ;DO CARRIAGE RETURN LD A,23 LD HL,ROW: LD A,(SCROLL) OR A JR NZ,LFEED2 ;LOOP UNTIL VSYNC INTERRUPT SERVICED RET ; ; ; ; RETURN: LD HL,(RC) LD H,0 CALLADD HL,BC EX DE,HL POP BC LDIR ;COMPRESS CONTENTS OF CHARACTER MEMORY CALL ZAPCSR POP HL POP DE LD BC,ATTMEM AR-DOWN IF NOT ON BOTTOM ROW LD DE,80 ;ELSE SCROLL SCREEN UP LD BC,23*80 LFEED: LD HL,CRTFLG BIT NOSCRL,(HL) RET NZ ;E WITH SPACES/ATTRIBUTES CALL SETCSR ;PUT CURSOR BACK IN ORIGINAL SPOT RET ; ; ; CLRALL: LD HL,CHRMEM LD DE,CHRMEM+1 E POINTER AND BYTECOUNT LD D,H LD E,L INC DE LDIR ;FILL ATTRIBUTE LINE WITH ATTRIB BYTE RET ; ; ; CLREOS: LD A,2 SUB (HL) ;COMPUTE # OF ROWS TO END OF SCREEN JP Z,CLREOL LD H,0 LD L,A CALL MULT80 ;MULTIPLY BY 80 LD B,H LD  GOTOXY ;RESET COLUMN# TO ZERO RET ; ; ; CLRLINE: LD DE,CHRMEM ADD HL,DE EX DE,HL LD HL,4096 ADD HL,DE EX DE,DD HL,BC EX DE,HL ADD HL,BC EX DE,HL POP BC LDIR ;COMPRESS CONTENTS OF ATTRIBUTE MEMORY RET ; ; ; ; EXPAND: XIT IF SCROLL IS DISABLED LD (NEWLIN),BC ;STORE RELATIVE ADDRESS OF NEW LINE LD HL,(START) ADD HL,DE ;ADD +80/-80 TO 68 LD BC,2047 LD A,(BLANK) LD (HL),A LDIR ;FILL CHARACTER MEMORY WITH SPACES LD HL,ATTMEM LD DE,ATTMEM+1 LD BC,2047 3 LD HL,ROW SUB (HL) ;COMPUTE NUMBER OF ROWS TO SCREEN-END LD H,0 LD L,A CALL MULT80 ;MULTIPLY BY 80 GIVING RESULT IC,L ;RESULT IS BYTECOUNT FOR BLOCK MOVE LD DE,(CURSOR) LD HL,80 ADD HL,DE CALL COMPRESS ;COMPRESS SCREEN TO DELETE LINEHL LD A,(BLANK) LD (HL),A ;STORE A BLANK AT START OF CHAR LINE LD A,(ATTRIB) LD (DE),A ;STORE ATTRIBUTE AT START OF AT PUSH BC PUSH DE PUSH HL PUSH BC LD BC,CHRMEM ADD HL,BC EX DE,HL ADD HL,BC EX DE,HL POP BC LDDR ;EXPAND CO45 START ADDRESS REG LD A,H AND 00000111B ;DO MODULO 2048 ROLL-AROUND LD H,A LD (START),HL ;STORE NEW STARTING ADDRESS  LD A,(ATTRIB) LD (HL),A LDIR ;FILL ATTRIBUTE MEMORY WITH NULL BYTES HOMEUP: LD HL,0 CALL GOTOXY ;RESET ROW/COLUMN N HL EX DE,HL JR CLR2 ; CLREOL: LD DE,0 CLR2: LD A,80 LD HL,COL SUB (HL) ;COMPUTE NUMBER OF COLUMNS TO LINE-END LD LD HL,(START) LD DE,23*80 ADD HL,DE ;GET RELATIVE START OF LAST LINE LD A,H AND 00000111B LD H,A LD BC,80 CALLTR LINE DEC BC LD A,B OR C ;DECREMENT BYTECOUNT AND TEST IF=0 RET Z ;EXIT IF DONE ALERADY PUSH DE ;ELSE SAVE LINENTENTS OF CHARACTER MEMORY CALL ZAPCSR POP HL POP DE LD BC,ATTMEM ADD HL,BC EX DE,HL ADD HL,BC EX DE,HL POP BC LD A,1 LD (SCROLL),A ;SET SCROLL-FLAG FOR INTERRUPT LD HL,(RC) CALL GOTOXY ;COMPUTE NEW CURSOR AND ARM INTERRUPT LFEED2NUMBERS TO ZERO RET ; ; ; ; ; COMPRESS: PUSH BC PUSH DE PUSH HL PUSH BC LD BC,CHRMEM ADD HL,BC EX DE,HL   CLRLINE ;CLEAR BOTTOM LINE CALL SETCSR ;RE-DISPLAY THE CURSOR RET ; ; ; INSLINE: CALL RETURN ;DO CARRIAGE RETURN B 'E' ;INSERT LINE DEFB 'R' ;DELETE LINE DEFB '*' ;CLEAR SCREEN DEFB ':' ;CLEAR SCREEN DEFB 'T' ;CLEAR TO END OF LIF LINE LD E,L DEC HL ;HL POINTS ONE BYTE BEFORE THAT CALL EXPAND LD HL,(CURSOR) LD BC,1 CALL CLRLINE ;PUT A BLANK  INTO L CALL GOTOXY ;GO COMPUTE RELATIVE CURSOR POINTER RET ; ; ; ; SETATTR: LD HL,SATTR2 LD (ESCVEC),HL RET ; NT PUSH BC LD HL,(CURSOR) LD D,H ;DE POINTS TO CHAR AT CURSOR LOCATION LD E,L INC HL ;HL POINTS ONE BYTE AHEAD OF THE HERE ON THIRD CHARACTER SUB ' ' ; OF CURSOR POSITIONING SEQUENCE RET C SETR2: SUB 24 JR NC,SETR2 ;MAKE SURE ROW# IS BE LD A,23 LD HL,ROW SUB (HL) ;COMPUTE # OF ROWS TO END OF SCREEN JP Z,CLREOL LD H,0 LD L,A CALL MULT80 ;MULTIPLY NE DEFB 't' ;CLEAR TO END OF LINE DEFB 'Y' ;CLEAR TO END OF SCREEN DEFB 'y' ;CLEAR TO END OF SCREEN DEFB 'G' ;SET ATAT CURSOR LOCATION CALL SETCSR ;REPLACE CURSOR RET ; ; ; ESCSEQ: LD A,C ;PUT LEAD-IN CHARACTER IN ACC LD HL,ESCTAB  ; ; SATTR2: LD A,C CALL ASCHEX ;CONVERT THIRD CHAR IN SEQUENCE TO HEX RET C ;EXIT IF OUT OF RANGE LD B,0 LD C,AAT CALL COMPRESS POP BC LD HL,(CURSOR) ADD HL,BC LD BC,1 CALL CLRLINE ;PUT BLANK AT END OF LINE CALL SETCSR ;REPTWEEN 0 AND 23 ADD A,24 LD (ROWTMP),A ;SAVE TEMPORARY ROW# LD HL,SETCOL LD (ESCVEC),HL ;GO TO 'SETCOL' ON NEXT CHARACTERBY 80 LD B,H LD C,L ;RESULT IS BYTECOUNT FOR BLOCK MOVE LD HL,(CURSOR) ADD HL,BC DEC HL EX DE,HL LD HL,80 ADD HTRIBUTE DEFB 'M' ;SET GRAPHICS MODE DEFB '.' ;SET PARAMETER BYTE DEFW SETPARM DEFW SETMODE DEFW SETATTR DEFW CLR LD BC,ESCSIZ/3 CALL SEARCH ;SEARCH FOR SECOND CHAR OF ESCAPE SEQ RET NZ ; IN TABLE AND EXIT IF NO MATCH JP (HL) ;GO  LD HL,BLANK LD (HL),' ' ;USE ASCII SPACE FOR BLANKS LD A,00000011B ;USE ALPHANUMERIC ATTRIBUTE MODE BIT 3,C ;TEST IF ALACE DESTROYED CURSOR RET ; ; ; ; INSCHAR: LD HL,COL LD A,79 SUB (HL) ;COMPUTE NUMBER OF COLUMNS LEFT IN LINE JP RET ; ; ; SETCOL: LD A,C ;ARRIVE HERE ON FOURTH CHARACTER SUB ' ' ; OF ESC,'=',ROW,COL SEQUENCE RET C SETC2: SUB 8L,DE EX DE,HL CALL EXPAND ;EXPAND SCREEN TO MAKE NEW LINE CALL CLREOL ;CLEAR NEW LINE RET ; ; ; DELCHAR: LD HL,CEOS DEFW CLREOS DEFW CLREOL DEFW CLREOL DEFW CLRALL DEFW CLRALL DEFW DELLINE DEFW INSLINE DEFW DELCHAR DEFW INTO LEAD-IN ROUTINE ; ; ESCTAB: DEFB '=' ;CURSOR ADDRESSING DEFB 'Q' ;INSERT CHARACTER DEFB 'W' ;DELETE CHARACTER DEFLPHA OR GRAPHICS MODE JR Z,SATTR3 LD (HL),0 ;SWITCH TO ZEROS FOR BLANKS AND LOAD LD A,(GRMODE) ; A WITH SELECTED GRAPHICS Z,CLREOL LD B,0 LD C,A ;USE RESULT FOR LDDR BYTECOUNT LD HL,(CURSOR) ADD HL,BC LD D,H ;DE POINTS TO CHAR AT END O0 JR NC,SETC2 ;MAKE SURE COL# IS BETWEEN 0 AND 79 ADD A,80 LD H,A ;PUT COLUMN# INTO H LD A,(ROWTMP) LD L,A ;PUT ROW#OL LD A,79 SUB (HL) ;COMPUTE NUMBER OF COLUMNS LEFT IN LINE JP Z,CLREOL LD B,0 LD C,A ;USE RESULT FOR LDIR BYTECOUSCHAR DEFW SETRC ESCSIZ EQU $-ESCTAB ; ; ; ; SETRC: LD HL,SETROW LD (ESCVEC),HL RET ; ; ; SETROW: LD A,C ;ARRIV  MODE BITS SATTR3: LD HL,BITTAB RES 3,C ADD HL,BC ;INDEX INTO BIT TABLE FOR ATTRIBUTES OR (HL) ;MERGE MODE AND ATTRIBUT EQU 11010000B ;FORCE INTERRUPT COMMAND STEPOUT EQU 01100000B ;STEP OUT COMMAND STEPIN EQU 01000000B ;STEP IN COMMAND ; ; ; * ;******************************************************** ; ; ; EQUATES FOR DISK CONTROLLER PORTS AND COMMAND CODES ; SSITY CONTROLS XOR A ;INDICATE SELECT WAS SUCCESSFUL SELX: CALL SETTIMER ;RESET DRIVE TURN-OFF TIMER RET ; ; ; ; DSEA AND 00000111B INC A ;TRANSFORM CODE TO NUMBER IN RANGE 1..8 LD B,A XOR A SCF SPARM3: RLA DJNZ SPARM3 ;DERRIVE BD E,4 ADD HL,DE ;NOW INDEX TO DENSITY BYTE FOR UNIT LD A,(DSKTYP) AND 00000001B LD (HL),A ;REMEMBER CURRENT DENSITY COE BITS LD (ATTRIB),A ;STORE NEW ATTRIBUTE BYTE RET ; ; ; BITTAB: DEFB 0 DEFB UNDLINE DEFB BLINK DEFB BLINK+UNDLINE ; SELECT: LD A,C ;GET UNIT# PASSED IN C AND CP 4 ; CHECK FOR MAXIMUM VALID# RET NC ;ERROR IF UNIT# > 3 CALL DSELTSREG EQU WD179X+0 ;STATUS REGISTER CMDREG EQU WD179X+0 ;COMMAND REGISTER TRKREG EQU WD179X+1 ;TRACK REGISTER SECREG EQU WD17L: LD HL,SELTAB ;POINT TO DRIVE SELECT BITS TABLE AND 00000011B LD D,0 LD E,A ADD HL,DE ;ADD UNIT# TO HL TO INDEX INTIT POSITION FROM CODE BYTE LD HL,CRTFLG BIT 3,C ;TEST IF PARAM BIT IS TO BE SET/RESET JR Z,SPARM4 OR (HL) ;SET PARAMNTROL BIT LD HL,TRKTAB LD E,C ;INDEX INTO TABLE TO GET LAST KNOWN ADD HL,DE ; HEAD POSITION OF NEW DRIVE LD A,(HL)  DEFB REVERSE DEFB REVERSE+UNDLINE DEFB REVERSE+BLINK DEFB REVERSE+BLINK+UNDLINE ; ; ; ; SETMODE: LD HL,SMODE2  ;DERRIVE NEW DRIVE SELECT BIT PATTERN CALL READY ;EMIT NEW SELECT BITS AND TEST READY JR NZ,SELX ;JUMP IF DRIVE NOT READ9X+2 ;SECTOR REGISTER DATREG EQU WD179X+3 ;DATA REGISTER ; ; RDCMD EQU 10001000B ;READ COMMAND RIDCMD EQU 11000000B ;READ IO TABLE LD A,(HL) LD (SELCPY),A ;STORE NEW STATE OF SELECT/MUX PORT RET SELTAB: DEFB 10001010B ;BITS FOR UNIT #0 DEFBETER BIT @HL LD (HL),A RET ; SPARM4: CPL AND (HL) ;RESET PARAMETER BIT @HL LD (HL),A RET ; ; ;  OUT (TRKREG),A ;OUTPUT THE DRIVE'S CURRENT HEAD LD (TRACK),A ; POSITION TO THE 179X AND SAVE LD E,4 ADD HL,DE ;INEDX TO LD (ESCVEC),HL RET ; ; ; SMODE2: LD A,C AND 00000011B LD (GRMODE),A ;STORE BITS FOR GRAPHICS MODE FIELD RET ; OFY LD HL,UNIT LD D,0 LD E,(HL) ;LOAD DE WITH LAST SELECTED DRIVE UNIT# LD (HL),C ;THEN STORE NEW UNIT# PASSED IN C D COMMAND WRTCMD EQU 10101000B ;WRITE COMMAND SKCMD EQU 00011100B ;SEEK COMMAND RSTCMD EQU 00001000B ;RESTORE COMMAND FINCMD 01001010B ;BITS FOR UNIT #1 DEFB 00101010B ;BITS FOR UNIT #2 DEFB 00011010B ;BITS FOR UNIT #3 ; ; ; ; ; HOME: LD C,;******************************************************** ;* * ;* DISK I/O DRIVER FOR BETTERBOARD 24-JUNE-82 * ;* NEW DRIVE'S DENSITY SETTING LD A,(DSKTYP) AND 11111110B ;MERGE IN NEW DENSITY CONTROL BIT OR (HL) CALL SETDENS ;SET DEN ATTRIBUTE BYTE ; ; ; SETPARM: LD HL,SPARM2 LD (ESCVEC),HL RET ; ; SPARM2: LD A,C CALL ASCHEX RET C LD C, LD HL,TRKTAB ADD HL,DE ;INDEX INTO HEAD POSITION TABLE LD A,(TRACK) LD (HL),A ;STORE PREVIOUS DRIVE'S TRACK NUMBER L 0 ;TREAT HOME AS SEEK TO TRACK ZERO SEEK: CALL READY JR NZ,SEEKX ;EXIT IF DRIVE NOT READY LD A,(TRACK) SUB C ;TEST LD D,STEPOUT ;D WILL CARRY STEP OUT/IN COMMAND LD A,B SUB C ;GET DIFFERENCE BETWEEN TRACK NUMS JR NC,STEP2 ;JUMP IF SEEK  ACC=0 IF TRACK# VERIFIED LD A,(FNDTRY) CP 7 JR Z,FTRK3 ;JUMP IF ON FIRST OR SECOND RETRY LD HL,SPEED INC (HL) ;ELT) DEC A ;DECREMENT STEP COUNT JR Z,DOSTP2 ;JUMP IF LAST STEP TO BE DONE LD (STPCNT),A ;ELSE STORE DECREMENTED COUNT C=255 IF ERROR) OUT (TRKREG),A ;ALSO PUT IN 179X TRACK REGISTER POP AF SEEKX: CALL SETTIMER ;RESET DRIVE TURN-OFF TIMER ECOND INTERRUPT STEP3: LD A,(STPCNT) OR A JR NZ,STEP3 ;LOOP UNTIL STEP COUNTER REACHES ZERO LD A,(SELCPY) SET 3,A ;TAKIF ALREADY AT DESIRED TRACK JR Z,SEEKX ;EXIT WITH ACC=0 IF SO LD A,(TRACK) ;GET CURRENT TRACK# INTO ACC CP 255 ;TEST ITOWARDS OUTER TRACKS LD D,STEPIN LD A,C SUB B ;ELSE SWAP DIRECTION AND DIFFERENCE STEP2: JR Z,STEP4 ;GO DO VERIFY IF NOSE REDUCE STEP SPEED BY 1 MILLISEC FTRK3: DEC A LD (FNDTRY),A ;DECREMENT SEEK RETRY COUNT AND KEEP JR NZ,FTRK2 ; TRYING OVELD A,(SPEED) LD (HL),A ;STORE STEP SPEED FOR NEXT OPERATION RET ; DOSTP2: LD A,(SETTLE) LD (HL),A ;STORE HEAD SETTLING RET ;RETURN WITH COMPLETION STATUS IN ACC ; ; ; ; FINDTRK: LD A,7 LD (FNDTRY),A ;SET RETRY COUNT FOR HEAD POSITIONINE 179X TEST PIN BACK HIGH OUT (SELMUX),A STEP4: CALL VERIFY ;ELSE READ AN ID-MARK TO VERIFY SEEK STEPX: RET ; ; ; ; .F HEAD POSITION IS JR NZ,SEEK2 ; KNOWN GOOD AND JUMP IF SO LD A,RSTCMD+3 CALL DISKOP ;EXECUTE RESTORE AT SLOWEST STEP S STEPS NEEDED LD (STPCNT),A ;ELSE STORE STEP COUNT AND STEP IN/OUT LD A,D ; COMMAND BYTE CARRIED IN D LD (STPCMD),A LR (POSSIBLY AT SLOWER RATE) LD A,00010000B ;INDICATE PERMANENT SEEK ERROR OR A FTRK4: LD C,255 ;SET C=255 AS BAD TRACK I TIME PARAMETER LD HL,DOSETTLE LD (STPVEC),HL ;DO SETTLING DELAY ON NEXT INTERRUPT RET ; ; ; DOSETTLE: LD HL,STPDLY G FTRK2: PUSH BC CALL STEP ;HAVE A GO AT STEPPING TO TRACK IN C POP BC JR NZ,FTRK4 ;JUMP IF READY/NOT FOUND/CRC/BUSY ERR... ROUTINES FOR INTERRUPT DRIVEN SEEK FUNCTION .... ; DOSTEP: LD HL,STPDLY DEC (HL) ;DECREMENT STEP SPEED DELAY COUNT PEED XOR 00000100B ;COMPLIMENT TRK0 STATUS BIT AND 10000101B JR NZ,SEEKX ;EXIT IF RESTORE CANNOT BE DONE SEEK2: LD B,A D A,1 LD (STPDLY),A LD HL,DOSTEP ;START STEPPER FINITE STATE MACHINE LD (STPVEC),HL LD A,(SELCPY) RES 3,A ;MAKE 179X NDICATOR RET ;RETURN WITH SEEK ERROR STATUS IN A ; ; ; ; ; ; ; STEP FROM TRACK# IN B TOWARDS TRACK# IN C ; STEP:  DEC (HL) ;DECREMENT SETTLING TIME DELAY COUNT RET NZ XOR A LD (STPCNT),A ;SET STEP COUNT TO ZERO WHEN FINISHED LD HOR IN A,(SECREG) LD B,A ;PUT ACTUAL CURRENT TRACK# INTO B SUB C ;COMPARE IF WE GOT THERE THIS TIME RET Z ;EXIT WITHRET NZ ;EXIT IF NOT TIME TO ISSUE STEP CMD LD A,(STPCMD) OUT (CMDREG),A ;OUTPUT STEP IN/OUT COMMAND TO 179X LD A,(STPCN ;PUT STARTING TRACK# INTO B CALL FINDTRK ;GO LOOKING FOR TRACK# IN C PUSH AF LD A,C LD (TRACK),A ;STORE FINAL TRACK# (TEST INPUT LOW TO DISABLE OUT (SELMUX),A ; INTERNAL OPERATION TIME DELAYS LD A,10000001B OUT (CTCB2),A ;START CTC 1 MILLIS L,SEEKX LD (STPVEC),HL ;PUT SEEK FSM TO SLEEP LD A,00000001B OUT (CTCB2),A ;STOP 1 MILLISECOND INTERRUPT RET ; ; ; ;URN-OFF TIMER RET ; ; ; ; WRITE: CALL READY ;CLEAR THE DISK CONTROLLER JR NZ,WRITEX ;EXIT IF DRIVE NOT READY BITFB SMC1+OFF ;5 INCH SINGLE DENSITY DEFB SMC2+ON DEFB DDEN+ON DEFB SMC1+ON ;5 INCH DOUBLE DENSITY DEFB SMC2+OFF DEFB D WRITE COMMAND BYTE CP WRTCMD JR Z,RW2 ;JUMP IF DISK OPERATION IS A WRITE INC HL INC HL ;ELSE SKIP NEXT TWO BYTES IN DED ; ; ; ; FLIPDENS: LD A,(DSKTYP) XOR 00000001B ;COMPLIMENT DENSITY BIT OF DRIVE TYPE SETDENS: LD (DSKTYP),A AND TRY),A ;SET DISK OPERATION RE-TRY COUNT RW1: LD A,(SECTOR) ;OUTPUT SECTOR NUMBER FOR READ/WRITE OUT (SECREG),A LD HL,DMAP VERIFY: LD A,RIDCMD CALL DISKOP ;READ NEXT ID-MARK TO VERIFY SEEK AND 10011001B JR Z,VERFY2 ;JUMP IF ID MARK READ SUC 6,A JR NZ,WRITEX ;EXIT IF DISK IS WRITE-PROTECTED LD B,WRTCMD CALL RDWRT WRITEX: CALL SETTIMER ;RESET DISK TIMER RDEN+OFF ; ; ; ; ; READID: CALL READY ;CLEAR DISK CONTROLLER JR NZ,RDIDX ;EXIT IF DRIVE NOT READY LD B,RIDCMD CAMA PGM LD B,2 RW2: OTIR ;OUTPUT LAST OF DMA PROGRAM BYTES CALL DISKOP ;DO 179X COMMAND AND LOOP TILL INTRQ LD B,4 OT00000011B LD B,0 LD C,A LD HL,SMCTAB ADD HL,BC ;INDEX INTO SMC DATA SEPARATOR CONTROL ADD HL,BC ; BYTE TABLE FOR NEWGM ;PREPARE TO OUTPUT DMA INITIALIZATION LD B,8 LD C,DMA OTIR ;FIRST 6 BYTES ARE DMA RESETS LD DE,(BLKSIZ) OUT (C),ECESSFULLY CALL FLIPDENS ;ELSE SWITCH DISK DENSITY CONFIGURATION LD A,RIDCMD CALL DISKOP ;TRY AGAIN IN NEW DENSITY ANDET ; ; ; ; READ: CALL READY ;CLEAR DISK CONTROLLER JR NZ,READX ;EXIT IF DRIVE NOT READY LD B,RDCMD CALL RDWRT LL RDWRT ;READ ID RECORD INTO BUFFER (HL) JR NZ,RDIDX ;EXIT IF DISK ERROR LD HL,(IOPTR) LD DE,6 ADD HL,DE ;POINT TO IR ;DISABLE DMA AND INITIATE READ SEQUENCE IN L,(C) IN H,(C) ;READ BYTECOUNT INTO HL AND 10011111B ;MASK READY/RNF/CRC/ DENSITY SETTING ADD HL,BC LD B,3 LD C,PORT0 OTIR ;OUTPUT 3 BYTES TO SET DISK DENSITY RET SMCTAB: DEFB SMC1+ON ; ;NEXT TWO BYTES ARE MAX DMA BLOCKCOUNT OUT (C),D LD B,3 OTIR ;NEXT 3 BYTES ARE CONSTANTS LD DE,(IOPTR) OUT (C),E  10011001B VERFY2: PUSH AF ;SAVE STATUS OF READ-ID CALL FORCE ;CLEAR OVERRUN AND DRQ BITS IN 179X POP AF RET Z ;EXIT I READX: CALL SETTIMER ;RESET DISK TIMER RET ; ; ; ; ; RDWRT: LD (IOPTR),HL ;STORE DISK I/O DATA POINTER LD A,C LD 7TH BYTE AFTER ID RECORD LD A,(DSKTYP) LD (HL),A ;STORE DISK TYPE BYTE THERE XOR A RDIDX: CALL SETTIMER ;RESET DRIVE TOVERRUN/DRQ/BUSY RET Z ;RETURN IF NO DISK I/O ERRORS LD (ERRTYP),A CALL RECOVER ;DO READ/WRITE ERROR RECOVERY ROUTINE 8 INCH SINGLE DENSITY DEFB SMC2+OFF DEFB DDEN+ON DEFB SMC1+OFF ;8 INCH DOUBLE DENSITY DEFB SMC2+OFF DEFB DDEN+OFF DE;NEXT 2 BYTES ARE TRANSFER ADDRESS OUT (C),D OUTI ;NEXT BYTE SETS READY/WAIT/RESTART LD B,4 LD A,(CMDTYP) ;GET READ ORF AN ID MARK WAS FOUND PUSH AF CALL FLIPDENS ;ELSE GO BACK TO ORIGINAL DENSITY POP AF RET ;RETURN WITH ERROR INDICAT(SECTOR),A ;STORE SECTOR# FOR READ/WRITE LD A,B LD (CMDTYP),A ;STORE READ/WRITE/READID COMMAND BYTE LD A,(MAXRWT) LD (RW   JR NZ,RW3 ;SKIP RETRY IF IRRECOVERABLE ERROR LD HL,RWTRY DEC (HL) JR NZ,RW1 ;ELSE DECREMENT RETRY COUNT TILL=0 RW3: L ; READ (179X PUTS TRK# IN SECTOR REG) LD C,A CP B JR Z,RECOV4 ;JUMP IF HEAD IS ON CORRECT TRACK CP 255 ;ERROR IF TRKP ;STEP BACK TO ORIGINAL TRACK RET ; ; ARRIVE HERE IF RECORD-NOT-FOUND ERROR ; RECOV3: LD A,(DSKTYP) ;SAVE DENSITY CONTROGH=RDY, /CE NOT MUXED, NO RESTART DEFB 11001111B ;LOAD DESTINATION ADDRESS DEFB 00000001B ;XFER B->A, NOTHING FOLLOWS DE,MAXRWT SUB (HL) ;TEST IF THIS IS FIRST CRC ERROR RETRY RET Z ;IF SO EXIT AND ALLOW RETRY TO BE DONE IN A,(TRKREG) ;ELS SET RIGHT ; RECOV5: LD A,00010000B OR A ;INDICATE ERROR DUE TO NON-EXISTENT RET ; SECTOR OR INDETERMINATE TRACK# ; D A,(ERRTYP) OR A RET ;RETURN ORIGINAL ERROR CONDITION IN ACC ; ; ; ; RECOVER: LD B,A AND 10000111B ;ISOLATE READREG SET TO 255 PREVIOUSLY JR Z,RECOV5 CALL FINDTRK ;ELSE GO TO TRACK=C FROM TRACK=B PUSH AF LD A,C ;PUT FINAL TRACK# IL BYTE BEFORE PUSH AF ; CALLING TRACK VERIFY ROUTINE CALL VERIFY ;DO A READ-ID COMMAND TO SEE IF ANY POP DE ; SECTOR ONFB 11001111B ;LOAD SOURCE ADDRESS DEFB 10000111B ;ENABLE DMA DEFB 10000011B ;DISABLE DMA DEFB 10111011B ;READ MASK FOLLOSE PREPARE TO WIGGLE BACK AND FORTH LD B,A ; TO AN ADJACENT TRACK TO RE-CALIBRATE OR A ; AND REMOVE POSSIBLE MEDIA CONTAMI; ; ; DMAPGM: DEFB 11000011B ;DMA RESET COMMAND DEFB 11000011B DEFB 11000011B DEFB 11000011B DEFB 11000011B DEFB 11Y/OVERRUN/DRQ/BUSY ERRORS JR Z,RECOV1 ; AND JUMP IF NONE OF THOSE IS SET CALL FORCE ;CLEAR ERROR FLAGS IN 179X STATUS REGN 179X TRACK OUT (TRKREG),A ; REGISTER (C=255 IF SEEK ERROR) POP AF RET ;RETURN COMPLETION STATUS IN ACC ; ; ERROR IS  THIS TRACK CAN BE READ RET NZ ;ERROR IF NO ID MARK FOUND LD A,(CMDTYP) CP RIDCMD ;BYPASS TRACK# CHECK IF DOING READ-IWS DEFB 00000110B ;MASK FOR BYTECOUNT HIGH/LOW DEFB 10100111B ;INITIATE READ SEQUENCE ; ; ; ; ; DISKOP: CALL CMDOUT NANT JR NZ,RCOV2A LD C, 1 ;STEP TO TRACK#1 IF ON TRACK# 0 JR RCOV2B ; RCOV2A: DEC A ;STEP TO NEXT OUTER TRACK LD C,A000011B DEFB 01101101B ;XFER A->B, PORT A AND BYTCNT FOLLOWS DEFB DATREG DEFB 00101100B ;PORT A IS I/O, FIXED ADDRESS  LD A,B OR A ;RETURN ERROR STATUS IN ACC RET ; ; ARRIVE HERE IF CRC OR RECORD-NOT-FOUND ERROR ; RECOV1: BIT 4,B JR DUE TO NON-EXISTENT SECTOR# OR BEING IN WRONG DENSITY ; RECOV4: LD A,(DSKTYP) CP D ;SEE IF DENSITY WAS CHANGED BY 'VERIFY' D JR Z,RECOV4 IN A,(SECREG) ;TEST IF CONTENTS OF TRACK REGISTER LD B,A ; MATCHES TRACK# FROM ID MARK JUST IN A,(TRKREG) XOR A ;RESET SECONDS-NOT-READY COUNT FOR LD (RDYCNT),A ; FOR USE AS LOOP EXIT TIMER DSKOP2: IN A,(STSREG) BIT 0,A ;TEST RCOV2B: PUSH BC CALL STEP ;STEP HEAD TO ADJACENT TRACK POP DE LD B,E ;EXCHANGE CONTENTS OF B AND C LD C,D CALL STEDEFB 00010000B ;PORT B IS MEMORY, INCREMENTING ADDRESS DEFB 10001101B ;SINGLE BYTE MODE, PORT B FOLLOWS DEFB 10001010B ;HINZ,RECOV3 ;JUMP IF SECTOR ID RECORD NOT FOUND ; ; ERROR IS DUE TO BAD CRC IN DATA OR ID FIELD ; RECOV2: LD A,(RWTRY) LD HL JR Z,RECOV5 ; AND EXIT WITH RNF ERROR IF NOT XOR A ;CLEAR ACC TO INDICATE RETRY SHOULD RET ; BE DONE NOW THAT DENSITY I   DISK CONTROLLER BUSY STATUS BIT RET Z ;EXIT IF BUSY BIT GOES AWAY LD A,(RDYCNT) ;ELSE TEST IF NOT-READY COUNTER HAS OR,A ;PUT REVS-TO-READY PARAM INTO B XOR A LD (RDYCNT),A ;CLEAR SECONDS-NOT-READY COUNTER CALL FORCE ;RESET 179X SO READY  STATUS RET ; AND RETURN TYPE 1 STATUS IN ACC ; ; ; ; SETTIMER: PUSH AF ;SAVE COMPLETION STATUS CARRIED IN ACC LD  RET NZ ;EXIT IF DISK IS STILL ROTATING LD HL,RDYCNT INC (HL) ;BUMP SECONDS-NOT-READY COUNT RET ; ; ; ARRIVE HERE I; ; ; ; ; READY: LD A,1 LD (INUSE),A ;SET DISKS-ACTIVE FLAG FOR BACKGROUND LD A,(SELCPY) OUT (SELMUX),A ;OUTPUT CUR POP BC OR A ;RETURN DRIVE READY STATUS IN A RET ; ; ; ; .... BACKGROUND DISK ACTIVITY MONITOR .... ; DISKTEST: LD  A ; BEEN BUMPED BY BACKGROUND SCAN JR Z,DSKOP2 ;KEEP LOOKING IF STILL READY CALL FORCE ;ELSE ABORT DISK COMMAND LD A,CAN BE TESTED SPIN2: LD A,(RDYCNT) CP 4 ;TEST IF DRIVES HAVE BEEN NOT-READY JR NC,SPIN4 ; FOR MORE THAT 4 SECONDS IN A,(A,(NSTOP) LD (DSKCNT),A ;SET INDEX COUNTER FOR DISK TIMEOUT XOR A LD (INUSE),A ;CLEAR DISKS-ACTIVE FLAG FOR BACKGROUND PF NO DISK OPERATIONS ARE GOING ON ; DTST2: LD A,C SUB (HL) ;COMPUTE PULSES SINCE LAST INTERRUPT JR Z,DTST3 ;TURN DRIVES RENT DRIVE SELECT/MUX BITS LD A,(DSKCNT) OR A ;TEST IF BACKGROUND TIMER EQUALS ZERO JR Z,READY2 ;JUMP IF DRIVES HAVE BEENHL,OLDCTC ;POINT TO LAST INDEX COUNTER VALUE IN A,(CTCA1) ;READ INDEX PULSE COUNT FROM CTC LD C,(HL) LD (HL),A ;LOAD C WI00000001B OR A ;RETURN WITH 179X BUSY ERROR INDICATED RET ; ; ; ; CMDOUT: OUT (CMDREG),A ;OUTPUT DISK CONTROLLER COMSTSREG) BIT 7,A JR NZ,SPIN2 ;STAY IN INNER LOOP TILL DRIVE READY IN A,(CTCA1) ;READ INDEX PULSE COUNT FROM CTC SUB C OP AF RET ; ; ; ; SPINUP: PUSH BC LD A,MOTOR+ON OUT (PORT0),A ;TURN ON THE MOTOR CONTROL LINE LD A,HLDTIM+ON OUOFF IF NO INDEX PULSES LD B,A LD A,(DSKCNT) SUB B ;SUBTRACT COUNT DIFFERENCE FROM TIMER JR C,DTST3 ;JUMP IF DISK TIM STOPPED CALL FORCE ;CLEAR CONTROLLER AND TEST DRIVE READY BIT 7,A RET Z ;EXIT IF READY READY2: CALL SPINUP ;ELSE TH LAST COUNT AND STORE NEW LD A,(INUSE) ;TEST STATE OF DISK ACTIVITY FLAG OR A JR Z,DTST2 ;DO DRIVE TURN-OFF STUFF IF NOMAND BYTE LD A,12 COUT2: DEC A JR NZ,COUT2 ;DELAY 50 MICROSECONDS RET ; ; ; ; FORCE: LD A,FINCMD ;LOAD FORCE-INTER;COMPUTE CHANGE IN INDEX COUNTER CTC NEG ;RESULT IS NEGATIVE, SO SWITCH IT CP B JR C,SPIN2 ;LOOP UNTIL SPECIFIED NUMBERT (PORT0),A ;ACTIVATE THE HEAD LOAD SOLENOIDS IN A,(CTCA1) LD C,A ;PUT CURRENT INDEX PULSE COUNT IN C LD A,(NREVS) LD BEOUT JR Z,DTST3 LD (DSKCNT),A ;ELSE STORE UPDATED VALUE FOR NEXT TIME RET ; DTST3: LD A,1 ;SET FLAG TO STOP ANY FURTHSTART THE DRIVES AND CHECK READY RET NZ ;EXIT IF NOT RUNNING UP TO SPEED CALL FORCE BIT 7,A ;ELSE TEST THE DRIVE READYT IN-USE ; ; ; ARRIVE HERE IF DISK I/O IS CURRENTLY BEING DONE ; LD A,(HL) CP C ;TEST IF ANY INDEX PULSES IN LAST SEC RUPT-IMMEDIATE CMD CALL CMDOUT ;CLEAR 179X AND LATCH READY/HLD/TK0 ETC IN A,(STSREG) ;READ STATUS REGISTER CONTENTS RET  OF REVS XOR A JR SPIN5 ;EXIT WITH DRIVE READY INDICATED ; SPIN4: LD A,10000000B ;INDICATE DRIVE-NOT-READY ERROR SPIN5:  ER ACCESS TO LD (INUSE),A ; THIS POINT UNTIL NEXT DISK OPERATION XOR A LD (DSKCNT),A ;CLEAR COUNTER TO INDICATE DRIVES-OFF; ; ; VIDOUT: DI LD (CRTSAV),SP LD SP,CRTSTK ;POINT SP TO TOP OF LOCAL STACK PUSH HL PUSH DE PUSH BC LD C,A ;MUT ;SIO CHANEL B OUTPUT VECTOR JP SELECT ;DISK DRIVE SELECT JP HOME ;HOME R/W HEAD JP SEEK ;SEEK TO TRACK JP READ ;; CURRENTLY SELECTED IN MONITOR ADD A,A ADD A,A AND 00001000B LD (DSCOPY),A ;STORE CONTROL BYTE FOR D/S BIT OUT (PORT0EI RET ; ; ; ; LOAD: DI LD A,(CONFIG) ADD A,A ADD A,A ADD A,A OUT (PORT0),A LD C,(HL) LD A,(DSCOPY) OUT LD A,MOTOR+OFF OUT (PORT0),A ;TURN OFF THE MOTOR CONTROL LINE LD A,HLDTIM+OFF OUT (PORT0),A ;DEACTIVATE THE HEAD LOAD LOVE OUTPUT CHARACTER TO C LD A,(DSCOPY) ;SAVE CURRENT RAM/ROM CONTROL BYTE PUSH AF ; ON STACK FOR DURATION OF 'CRTOUT' LDREAD SECTOR JP WRITE ;WRITE SECTOR JP READID ; ; ; REINIT: DI LD A,DYSTAT+OFF OUT (PORT0),A ;SWITCH ROMS ON IN LO),A ;SWITCH TO SPECIFIED LOWER BANK POP AF EI RET ;DO JUMP BY POPPING STACK ; ; ; ; MEMTEST: DI LD A,(CONFIG)  PAGE ; ; ; ; -- MONITOR ENTRY POINT TABLE -- COLD: JP REINIT ;MONITOR COLD ENTRY POINT WARM: JP ROLLIN ;MONITOR WARM  (PORT0),A EI RET ; ; STORE: DI LD A,(CONFIG) ADD A,A ADD A,A ADD A,A OUT (PORT0),A LD (HL),C LD A,(DSCOPINE LD A,(SELCPY) ;GET CURRENT DATA AT SELECT/MUX PORT, AND 00001111B ; MASK ALL DRIVE SELECT BITS TO ZEROS OUT (SELMUX),A A,DYSTAT+OFF LD (DSCOPY),A ;SET 'DSCOPY' TO ENABLE LOWER 32K BANK OUT (PORT0),A ;TURN ON ROMS AND CRT MEMORY EI LD HLW 32K MEMORY JP 0 ;JUMP TO ABSOLUTE LOCATION 0 ; ; ; ROLLIN: DI LD A,DYSTAT+OFF OUT (PORT0),A ;TURN ROMS ON AND ALS ADD A,A ADD A,A ADD A,A OUT (PORT0),A ;SWITCH TO SELECTED MEMORY BANK TO TEST MTST2: LD A,L XOR H ;GENERATE TEST BYTEENTRY POINT CONST: JP KBDST ;CONSOLE STATUS VECTOR CONIN: JP KBDIN ;CONSOLE INPUT VECTOR CONOUT: JP VIDOUT ;CONSOLE OUTPUTY) OUT (PORT0),A EI RET ; ; ; MOVE: DI LD A,(CONFIG) ADD A,A ADD A,A ADD A,A OUT (PORT0),A LDIR LD A,( ;AND RE-OUTPUT TO DESELECT DRIVES RET ; ; ; ; ; ,(CRTVEC) CALL DISPATCH ;CALL SELECTED CRTOUT ROUTINE DI POP AF ;RESTORE OLD MEMORY MAP BIT SETTING LD (DSCOPY),A ;GOO SET MEMORY LD (DSCOPY),A ; BANK SWITCH VARIABLE TO INDICATE LD SP,STACK ; WE WILL BE EXECUTING FROM ROM EI JP PROMPT  XOR B LD (HL),A ;STORE BYTE IN RAM INC HL LD A,H CP E ;CHECK FOR END OF TEST BLOCK JR NZ,MTST2 ; NOW READ BAC VECTOR JP VIDOUT ;CRT OUTPUT VECTOR JP SIOST ;SIO CHANEL B STATUS VECTOR JP SIOIN ;SIO CHANEL B INPUT VECTOR JP SIOODSCOPY) OUT (PORT0),A EI RET ; ; ; EXITMON: DI PUSH AF LD A,(CONFIG) ;SET BANK SWITCH STATE TO VALUE ADD A,A  BACK TO MEMORY CONFIGURATION OUT (PORT0),A ; AS IT WAS BEFORE CALLING 'CRTOUT' POP BC POP DE POP HL LD SP,(CRTSAV)  K EACH BYTE & COMPARE LD H,D LD L,0 ;POINT HL BACK TO START MTST3: LD A,L XOR H ;RE-GENERATE TEST BYTE DATA XOR B CT ROUTINES TO HIGH MEMORY ; LD HL,MONCOPY LD DE,MONITR LD BC,MONLEN LDIR ; ; MOVE COPY OF INITIALIZED GLOBAL VARIABLEC HL INC E ;BUMP E TO DO INNER LOOP 256 TIMES JR NZ,RTST2 DJNZ RTST2 ;REPEAT 8 TIMES FOR 2048 BYTES LD C,8 RTST3: DDENS ;SET SMC DATA SEPRARATOR INITAL VALUE ; ; INITIALIZE THE Z-80 FOR INTERRUPT MODE #2 LD HL,RAM LD A,H LD I,A ;LOANG THE SYSTEM AFTER A POWER-ON * ;* OR PUSHBUTTON RESET. * ;* * ;**************************************************45 ACCORDINGLY JR Z,SKIP1 LD HL,M2TAB SKIP1: CALL INITCRT ;PROGRAM 6845 CONFIGURATION REGISTERS CALL CLRALL ;CLEAR VIDEP (HL) ;COMPARE EXPECTED MEMORY DATA WITH JR NZ,MTST4 ; ACTUAL CONTENTS @HL AND EXIT IF <> INC HL LD A,H CP E ;CHECK S TO HIGH MEMORY ; LD HL,RAMCOPY LD DE,RAM LD BC,RAMLEN LDIR ; ; ; INITIALIZE Z80 FAMILY PROGRAMMABLE I/O DEVICES ;EC HL DEC E RRCA CP (HL) ;VERIFY THAT TEST PATTERN IS WRITTEN JR NZ,$ ;STICK FOREVER IF MONITOR RAM FAILURE EX DE,HLD I REG WITH MSB OF VECTOR TABLE IM 2 ; AND SELECT INTERRUPT MODE 2 ; ; ; DETERMINE IF CONSOLE I/O CONFIGURATION WILL BE F****** ; ; ; INIT: DI LD SP,TSTSTK LD DE,0 LD A,10H CALL CRCGEN ;VERIFY CRC IN FIRST 4K ROM INIT1: JR NZ,$ ;LOOP O DISPLAY MEMORY ; ; SET DISK PARAMETERS FOR 5 OR 8 INCH DRIVES ; IN A,(SENSE) BIT 5,A ;TEST DISK-TYPE SENSE SWITCH INPUFOR END OF BLOCK JR NZ,MTST3 MTST4: LD A,(DSCOPY) OUT (PORT0),A EI RET ;  LD HL,IOTAB ;POINT TO I/O INIT TABLE INIT3: LD B,(HL) ;B=INIT LOOP BYTECOUNT INC HL LD C,(HL) ;C=DEVICE CONTROL PORT#  CP (HL) EX DE,HL JR NZ,$ ;STICK FOREVER IF GLOBAL RAM FAILURE DJNZ RTST3 DEC C JR NZ,RTST3 ADD A,A JR NZ,RTSOR THE ; ON-BOARD CRT AND KEYBOARD OR AN EXTERNAL SERIAL TERMINAL. ; LD DE,1000H LD A,18H CALL CRCGEN ;CHECK CRC OF SECFOREVER IF BAD CRC ; ; ; PERFORM READ/WRITE TEST OF MONITOR AND GLOBAL VARIABLES RAM ; RAMTST: LD HL,MONITR LD DE,RAM LT JR Z,SKIP2 ; AND JUMP IF 8 INCH DRIVES INDICATED LD A,00000011B LD (DSKTYP),A ;SET DISK TYPE FOR MINI-FLOPPIES LD A,1 INC HL OTIR ;SEND DATA @ HL TO PORT @ C BIT 7,(HL) ;TEST FOR TABLE END MARKER JR Z,INIT3 ;LOOP AGAIN IF NOT AT END T1 ;DO 8 PASSES OVER MEMORY BLOCKS ; ; LD SP,STACK ;LOAD STACK POINTER NOW THAT IT IS SAFE ; ; ; MOVE COPY OF RAM-RESIDENOND ROM CALL Z,1000H ;EXECUTE SECOND ROM IF CRC VERIFIES CALL BELL ;BEEP THE BUZZER TO SAY WE ARE ALIVE IN A,(SENSE) D A,1 RTST1: LD B,8 RTST2: LD (HL),A ;WRITE TEST BYTE INTO MONITOR/GLOBALS LD (DE),A RLCA ;ROTATE BIT PATTERN IN A IN5 LD (NREVS),A ;REQUIRE 15 REVOLUTIONS BEFORE READY LD A,5*20 LD (NSTOP),A ;STOP MOTORS AFTER 20 SECONDS SKIP2: CALL FLIP;******************************************************** ;* * ;* COLD START INITIALIZATION ROUTINE FOR * ;* CONFIGURI; ; ; FIRE-UP CRT DISPLAY ; LD HL,M1TAB IN A,(SENSE) ;TEST SENSE SWITCHES FOR 5*7 OR 7*9 BIT 4,A ; FONT AND PROGRAM 68   AND 00001011B LD C,A ;SAVE STATE OF SENSE INPUT PORT DECIDE: IN A,(SENSE) AND 00001011B ;TEST FOR ARRIVAL OF A START BIT  LD HL,SIOOUT LD (CONOUT+1),HL ;RE-DIRECT CONSOLE OUTPUT TO SIO JR SIGNON ; ; DIVIDE RATIO TABLE FOR CTC-DERRIVED BAUD RAT PORT# INC HL LD D,(HL) ;LOAD D WITH SIO A/B DATA PORT# INC HL LD (SIOADR),DE ;SAVE SIO CONTROL/DATA PORT NUMBERS LD  DEFW INIT1 ;RETURN POINT FOR FIRST CRC CHECK TSTSTK EQU $ ; ; ; ; COMPUTE CRC16 OVER CONTENTS OF ROM TO VERIFY ROM INTEGRBAUD3: INC DE ;INDEX INTO BAUD RATE TABLE RL B ; USING COUNT DERRIVED IN B JR NC,BAUD3 LD HL,SIOATAB ;POINT TO SIO CHARITY AND PROGRAM INTERRUPTS ; PARALL: IN A,(SENSE) XOR C BIT 3,A JR NZ,PARALL ;WAIT UNTIL STROBE GOES AWAY PARL3: LD A,OR XOR C ; A CHANGE IN THE KEYBOARD STROBE JR Z,DECIDE BIT 3,A JR NZ,PARALL ;JUMP IF INPUT IF FROM KEYBOARD ; ; AUTOMES ; RATES: DEFB 128 ; 300 BAUD DEFB 64 ; 600 BAUD DEFB 32 ; 1200 BAUD DEFB 16 ; 2400 BAUD DEFB 8 ; 4800 BC,E BAUD5: IN A,(C) ;LOOP UNTIL SIO CHANNEL RECEIVES BIT 0,A ; GARBLED FIRST CHARACTER JR Z,BAUD5 LD C,D IN A,(C) ;TITY ; CRCGEN: LD HL,-1 ;SET CRC16 ACCUMULATOR TO ALL ONES CRCG1: LD B,8 ;PREPARE TO RUN ROM BYTE THRU CRC GEN EX AF,AF' NNEL A INIT STUFF BIT 0,C ;TEST IF USING SIO CHANNEL A OR B JR NZ,BAUD4 ;JUMP IF USING CHANNEL A LD HL,SIOBTAB ;ELSE POIN11000111B ;PROGRAM CTCA0 FOR KBD INTERRUPT BIT 3,C JR NZ,PARL4 ;DETERMINE SENSE OF KBD STROBE SET 4,A PARL4: OUT (CTCA0),ATIC BAUD RATE SETTING ROUTINE FOR SIO ; BAUD: AND 00000011B LD C,A ;GET MASK BIT FOR SIO CHANNEL A/B LD B,0 BAUD1: IN AAUD DEFB 4 ; 9600 BAUD DEFB 2 ; 19200 BAUD DEFB 2 ; 19200 BAUD ; ; SIOATAB: DEFB CTCB1 ;SIO CHANNEL A BAUDRATE CHEN READ AND DISCARD THE CHARACTER LD C,E LD A,1 OUT (C),A ;RE-PROGRAM SIO CHANNEL TO GENERATE LD A,00011100B ; INTERRU LD A,(DE) LD C,A CRCG2: LD A,C XOR H ;XOR DATA BIT WITH MSB OF CRC RLCA ADC HL,HL ;SHIFT RESULTING BIT LEFT INTO CRCT TO OTHER INIT DATA TABLE BAUD4: LD C,(HL) ;GET BAUDRATE CTC PORT# FROM TABLE INC HL LD A,01000111B OUT (C),A ;PUT BAUA LD A,1 OUT (CTCA0),A ;COUNT STROBES MODULO 1 SIGNON: EI CALL PNEXT DEFB CR,LF,LF DEFB '... Bigboard_II System Monit,(SENSE) ;READ SENSE INPUT PORT AND C ;TEST SIO RECEIVE INPUT BIT JR Z,BAUD1 ;LOOP UNTIL IT CHANGES STATE BAUD2: EX (SP),TC DEFB SIOCPA ; CONTROL PORT DEFB SIODPA ; DATA PORT DEFB 1 ; CONSOLE# ; SIOBTAB: DEFB CTCB0 ;SIO CHANNEL B BAUDRPTS ON RECIEVED DATA, OUT (C),A ; PARITY DOES NOT AFFECT VECTOR LD A,(HL) LD (CONNUM),A ;STORE NUMBER OF CONSOLE DEVICE  RRCA JR NC,CRCG3 ;JUMP IF BIT WAS A ZERO LD A,H XOR 00010000B ;ELSE XOR CRC WITH POLY COEFFICIENTS LD H,A LD A,L DRATE CTC IN COUNTER MODE LD A,(DE) OUT (C),A ;SET DIVIDE RATIO FOR SELECTED RATE LD E,(HL) ;LOAD E WITH SIO A/B CONTROLor 7-July-82 ...' DEFB CR,LF,LF DEFB EOT JP PROMPT ;GO ENTER MONITOR ; ; ; ; DUMMY STACK FOR POWER-UP CRC CHECK ; HL ;DELAY A BIT EX (SP),HL INC B IN A,(SENSE) ;LOOP TO MEASURE THE START BIT TIME AND C JR NZ,BAUD2 LD DE,RATES-1 ATE CTC DEFB SIOCPB ; CONTROL PORT DEFB SIODPB ; DATA PORT DEFB 2 ; CONSOLE# ; ; ; ; DETERMINE KEYBOARD STROBE POLA XOR 00100000B LD L,A CRCG3: RL C ;ADVANCE TO NEXT DATA BIT DJNZ CRCG2 EX AF,AF' INC DE CP D ;TEST FOR ENDING PAGE N ; ; ON EQU 00001000B OFF EQU 00000000B ; ; BIT ASSIGNMENTS FOR LATCH 'U14' ; BUZZER EQU 7 MOTOR EQU 6 HLDTIM EQU 5 DIO DATA PORT B SIOCPB EQU SIO+3 ;SIO CONTROL/STATUS PORT B ; ; CTCA0 EQU CTCA ;CTC A CHANNEL 0 (KEYBOARD STROBE) CTCA1 EQOUNTER MODE DEFB 0 ;COUNT INDEX PULSES MODULO-256 ; ; DEFB 1,CTCB0 DEFB CTCBV ;BASE INTERRUPT VECTOR FOR CTC B DEFUDRATES AND TIMERS DMA EQU 8CH ;Z80 DMA CONTROLLER PORT3 EQU 0C0H ;MEMORY CONTROL 74LS259 SENSE EQU 0C4H ;SENSE INPUTS 74LRT3 DEFB ATTEN+ON ;ATTRIBUTE ENABLE ON DEFB FDCRST+ON ;179X RESET PIN HIGH DEFB 1,SELMUX DEFB 00001010B ;ALL DRIVES OFUMBER JR NZ,CRCG1 LD A,H OR L ;HL SHOULD=0 IF VALID CRC16 RET ; ; ; ; INITCRT: LD B,16 ;WRITE TO 16 REGISTERS IDEN EQU 4 SMC2 EQU 3 SMC1 EQU 2 SIDSEL EQU 1 DYSTAT EQU 0 ; ; ; BIT ASSIGNMENTS FOR LATCH 'U41' ; ATTEN EQU 7 ;ATTRIBUU CTCA+1 ;CTC A CHANNEL 1 (INDEX PULSE COUNT) CTCA2 EQU CTCA+2 ;CTC A CHANNEL 2 (SIO A SYNC INTERRUPT) CTCA3 EQU CTCA+3 ;CTB 2,CTCB0 DEFB 01000111B ;PUT CTC0 IN COUNTER MODE DEFB 128 ;DIVIDE BY 128 GIVES 300 BAUD FOR SIO B DEFB 2,CTCB1 DEFBS244 PORT0 EQU 0C8H ;MISC CONTROL BITS 74LS259 SELMUX EQU 0CCH ;DRIVE SELECT/DMA MUX 74LS273 KBD EQU 0D0H ;KEYBOARD INPUTSF, /TEST=1, DRQ->RDY ; ; ; DO SOFTWARE RESET OF DMA AS RECOMENDED BY ZILOG ; DEFB 6,DMA DEFB 11000011B DEFB 11000011B N 6845 LD C,0 INCRT1: LD A,C OUT (CRTADD),A ;OUTPUT REGISTER NUMBER TO CRTC LD A,(HL) INC HL OUT (CRTDAT),A ;OUTPUT DTE ENABLE PIN FDCRST EQU 6 ;DISK CONTROLLER RESET STDBB EQU 5 ;STD/BETTERBOARD BANK SELECT VPP EQU 4 ;PROM VPP ENABLE PGMC A CHANNEL 3 (VSYNC INTERRUPT) ; ; CTCB0 EQU CTCB ;CTC B CHANNEL 0 (SIO A BAUDRATE) CTCB1 EQU CTCB+1 ;CTC B CHANNEL 1 (SI 01000111B ;PUT CTC1 IN COUNTER MODE DEFB 128 ;DIVIDE BY 128 GIVES 300 BAUD FOR SIO A DEFB 2,CTCB2 DEFB 00000111B ;PUT  74LS373 WD179X EQU 0D4H ;WESTERN DIGITAL DISK CONTROLLER GENPIO EQU 0D8H ;GENERAL PURPOSE PARALLEL PORTS CRTC EQU 0DCH ;6 DEFB 11000011B DEFB 11000011B DEFB 11000011B DEFB 11000011B ; ; ; PROGRAM CTC A AND B FOR VARIOUS INTERRUPT ; AND TIATA TO SELECTED REGISTER INC C DJNZ INCRT1 RET ; ; ; ; PAGE ; ; ; ... INPUT/OUTPUT PORT EQUATES AND INITIALIZATIO EQU 3 ;PROM PGM ENABLE OEVPP EQU 2 ;PROM OE/VPP SWITCH DECODE EQU 1 ;BYTEWIDE MEMORY DECODE CONTROL OUTEN EQU 0 ;BYTEWIDO B BAUDRATE) CTCB2 EQU CTCB+2 ;CTC B CHANNEL 2 (1 MILLISECOND TIMER) CTCB3 EQU CTCB+3 ;CTC B CHANNEL 3 (CLOCK INTERRUPT) ;CTC2 IN TIMER MODE DEFB 250 ;PULSE EVERY 250*4 MICROSECONDS DEFB 2,CTCB3 DEFB 11000111B ;PUT CTC3 IN COUNTER MODE DEF845 CRT CONTROLLER ; ; SIODPA EQU SIO+0 ;SIO DATA PORT A SIOCPA EQU SIO+1 ;SIO CONTROL/STATUS PORT A SIODPB EQU SIO+2 ;SMING FUNCTIONS ; DEFB 1,CTCA0 DEFB CTCAV ;BASE INTERRUPT VECTOR FOR CTC A DEFB 2,CTCA1 DEFB 01000111B ;PUT CTC1 IN CN TABLES ... ; ; SIO EQU 80H ;DUAL SERIAL I/O CTCA EQU 84H ;CTC FOR KEYBOARD/FDC/SIO INTERRUPTS CTCB EQU 88H ;CTC FOR BAE MEMORY /OE CONTROL ; ; ; ; IOTAB EQU $ ;I/O INITIALIZATION TABLE ; ; INITIALIZATION FOR TTL BIT LATCHES ; DEFB 2,PO B 250 ;INTERRUPT EVERY 250 MILLISECONDS ; ; ; INITIALIZE SIO CHANNEL A AND B FOR ASYNCHRONOUS SERIAL ; INTERFACE TO PRINTER100000B ;CURSOR START RASTER DEFB 0 ;CURSOR END RASTER DEFB 0 ;START ADDRESS MSB DEFB 0 ;START ADDRESS LSB DEFB 0 ;C0B ;REVERSE VIDEO UNDLINE EQU 00001000B ;UNDERLINE STRIKE EQU 00000100B ;STRIKETHRU ; ; INITIALIZATION FOR 80*24 DISPLAY USI;******************************************************** ;* * ;* INTERRUPT SERVICE ROUTINES FOR KEYBOARD * ;* INPUT A00B ;INTERRUPTS OFF DEFB 3 ;SELECT REGISTER #3 DEFB 01000001B ;7 BITS/RX CHARACTER DEFB 5 ;SELECT REGISTER #5 DEFB 101FB 0 ;CURSOR END RASTER DEFB 0 ;START ADDRESS MSB DEFB 0 ;START ADDRESS LSB DEFB 0 ;CURSOR ADDRESS MSB DEFB 0 ;CURS OR TERMINAL ; DEFB 10,SIOCPB DEFB 4 ;SELECT REGISTER #4 DEFB 01000101B ;16X CLOCK, 1 STOP BIT DEFB 1 ;SELECT REGISTEURSOR ADDRESS MSB DEFB 0 ;CURSOR ADDRESS LSB ; ; ; INITIALIZATION FOR 80*24 DISPLAY USING 16 Mhz CLOCK ; AND 9 DOT BY 12 NG 11 MHZ CLOCK ; AND 7 DOT BY 10 RASTER CHARACTER CELL SIZE ; M1TAB: DEFB 99 ;HORIZ TOTAL-1 DEFB 80 ;HORIZ DISPLAYED DND REAL-TIME CLOCK FUNCTIONS * ;* * ;******************************************************** ; ; ; ; KBDST: LD A,01010B ;7 BITS/TX CHARACTER ; ; DEFB -1 ;END-OF-TABLE ; ; ; PAGE ; ; ; ... EQUATES AND INITIALIZATION TABLES FOR 68OR ADDRESS LSB ; ; ; ; R #1 DEFB 00000100B ;STATUS AFFECTS VECTOR DEFB 3 ;SELECT REGISTER #3 DEFB 01000001B ;7 BITS/RX CHARACTER DEFB 5 ;SELERASTER CHARACTER CELL SIZE ; M2TAB: DEFB 96 ;HORIZ TOTAL-1 DEFB 80 ;HORIZ DISPLAYED DEFB 71 ;HORIZ SYNC POSITION-1 DEEFB 82 ;HORIZ SYNC POSITION-1 DEFB 28H ;VERT/HORIZ SYNC WIDTH DEFB 25 ;VERT TOTAL-1 DEFB 2 ;VERT TOTAL ADJUST DEFB 2(FIFCNT) ;GET INPUT FIFO BYTECOUNT OR A ;TEST IF EQUAL ZERO RET Z ;EXIT WITH A=0 IF QUEUE IS EMPTY LD A,255 RET ;ELS45 CRTC ... ; ; CHRMEM EQU 6000H ;2K BYTE CHARACTER MEMORY ATTMEM EQU 7000H ;2K BYTE ATTRIBUTE MEMORY ; CRTADD EQU CRTC CT REGISTER #5 DEFB 10101010B ;7 BITS/TX CHARACTER DEFB 2 ;SELECT REGISTER #2 DEFB SIOVEC ;BASE SIO INTERRUPT VECTOR FB 28H ;VERT/HORIZ SYNC WIDTH DEFB 25 ;VERT TOTAL-1 DEFB 16 ;VERT TOTAL ADJUST DEFB 24 ;VERT DISPLAYED DEFB 26 ;VER4 ;VERT DISPLAYED DEFB 25 ;VERT SYNC POSITION-1 DEFB 00000000B ;INTERLACE AND SKEW DEFB 9 ;MAX RASTER ADDRESS DEFB 00E SET A=255 TO INDICATE DATA READY ; ; ; KBDIN: CALL KBDST JR Z,KBDIN ;LOOP UNTIL KEYBOARD INPUT READY PUSH HL CALL R ;6845 ADDRESS REGISTER CRTDAT EQU CRTC+1 ;6845 DATA REGISTER BLINK EQU 01000000B ;BLINK ATTRIBUTE BIT REVERSE EQU 0001000 DEFB 8,SIOCPA DEFB 4 ;SELECT REGISTER #4 DEFB 01000101B ;16X CLOCK, 1 STOP BIT DEFB 1 ;SELECT REGISTER #1 DEFB 000000T SYNC POSITION-1 DEFB 00000010B ;INTERLACE AND SKEW DEFB 11 ;MAX RASTER ADDRESS DEFB 00100000B ;CURSOR START RASTER DE EMOVE ;GET CHARACTER FROM INPUT QUEUE POP HL RET ; ; ; ; ; STASH: LD C,A ;PUT CHARACTER IN C LD A,(FIFSIZ) AND 0 LD SP,IRQSTK ; SWITCH TO LOCAL STACK PUSH HL PUSH DE PUSH BC PUSH AF LD HL,(TICKS) INC HL ;BUMP FREE RUNNING CLORETURN RETI ; ; ; ; -- INTERRUPT SERVICE ROUTINE FOR ONE MILLISECOND TIMER -- ; MILLISEC: LD (IRQSAV),SP ;SAVE USER ST LD A,13 OUT (CRTADD),A ;SELECT 6845 REGISTER #13 LD A,L OUT (CRTDAT),A ;OUTPUT LSB OF START ADDRESS LD DE,(NEWLIN) L ;INDEX INTO FIFO BY OFFSET IN A LD L,A LD A,H ADC A,0 ;CARRY ADD OUT TO 16 BITS LD H,A LD A,(HL) RET ; ; ; ;INTERRUPT SERVICE ROUTINE FOR CRTC VSYNC INTERRUPT -- ; VSYNC: LD (IRQSAV),SP ;SAVE USER STACK POINTER AND LD SP,IRQSTK ; SW0111111B LD B,A ;PUT MAX FIFO SIZE IN B LD HL,FIFCNT ;BUMP FIFO CHARACTER COUNT LD A,(HL) INC A CP B RET NC ;EXIT CK TICK COUNTER LD (TICKS),HL LD HL,(TIKVEC) CALL DISPATCH ;DO EXTRA CLOCK TICK ACTIVITY LD HL,TIKCNT DEC (HL) ;DECREACK POINTER AND LD SP,IRQSTK ; SWITCH TO LOCAL STACK PUSH HL PUSH DE PUSH BC PUSH AF LD HL,(STPVEC) CALL DISPATCH ADD HL,DE ;GET RELATIVE ADDRESS OF NEW BLANK LINE LD A,H AND 00000111B ;MAKE SURE TO ROLL-AROUND MOD 2048 LD H,A LD BC, ; ; ; -- INTERRUPT SERVICE ROUTINE FOR PARALLEL KEYBOARD -- ; KEYSRV: LD (IRQSAV),SP ;SAVE USER STACK POINTER AND LD SP,ITCH TO LOCAL STACK PUSH HL PUSH DE PUSH BC PUSH AF LD A,(DSCOPY) PUSH AF ;SAVE D/S CONTROL BYTE ON STACK LD A,DYNOW IF FIFO IS FULL LD (HL),A ; ELSE INCREMENT FIFO COUNT LD HL,FIFIN ;POINT HL TO FIFO INPUT OFFSET CALL INDEX LD (HL)MENT CLOCK TICK PRE-SCALER JR NZ,TIMER2 ;JUMP IF CURRENT SECOND NOT PASSED LD A,(NTICKS) ;ELSE RELOAD TICK COUNT AND DO ;CALL MILLISECOND INTERRUPT ROUTINE POP AF POP BC POP DE POP HL LD SP,(IRQSAV) EI RETI ; ; ; DISPATCH: JP (H80 CALL CLRLINE ;CLEAR NEW BOTTOM LINE ON SCREN VSYNC2: LD HL,(OLDCSR) ;POINT TO LAST CURSOR ATTRIBUTE BYTE LD A,(HL) IRQSTK ; SWITCH TO LOCAL STACK PUSH HL PUSH DE PUSH BC PUSH AF ;SAVE MACHINE STATE IN A,(KBD) ;READ KEYBOARD INPUT PSTAT+OFF OUT (PORT0),A ;SWITCH-ON STATIC MEMORY BANK LD A,(SCROLL) OR A JR Z,VSYNC2 ;JUMP IF NO SCROLL REQUESTED THIS ,C ;STORE CHARACTER IN FIFO @ HL RET ; ; ; ; REMOVE: LD HL,FIFCNT DEC (HL) LD HL,FIFOUT ;POINT HL TO FIFO OUTPUT OFFLD (HL),A ; VARIOUS ONCE-A-SECOND THINGS CALL CLOCK ;UPDATE TIME-OF-DAY CLOCK CALL DISKTEST ;DO BACKGROUND DISK ACTIVITY ML) ; ; ; ; -- INTERRUPT SERVICE ROUTINE FOR CLOCK TICK INTERRUPT -- ; TIMER: LD (IRQSAV),SP ;SAVE USER STACK POINTER ANDBIT 7,A ;TEST MSB (INDICATES CURSOR ACTIVE) JR Z,VSYNC3 ;JUMP IF CURSOR HAS BEEN WRITTEN OVER XOR 10010000B ;ELSE CLEAR MSBORT LD HL,(KBDVEC) CALL DISPATCH POP AF POP BC POP DE POP HL LD SP,(IRQSAV) RETI: EI ;RE-ENABLE INTERRUPTS AND TIME LD HL,(START) LD A,12 OUT (CRTADD),A ;SELECT 6845 REGSITER #12 LD A,H OUT (CRTDAT),A ;OUTPUT MSB OF START ADDRESSSET INDEX: LD A,(HL) INC A AND 00111111B ;INCREMENT FIFO POINTER LD (HL),A ; MODULO 64 AND REPLACE LD HL,FIFO ADD A,ONITOR TIMER2: POP AF POP BC POP DE POP HL LD SP,(IRQSAV) EI ;RE-ENABLE INTERRUPTS AND RETURN RETI ; ; ; --   AND COMPLIMENT REVERSE LD (HL),A ; VIDEO BIT TO REMOVE CURSOR VSYNC3: LD HL,(CURSOR) LD DE,ATTMEM ADD HL,DE ;POINT TO TH DATA PORT# IN A,(C) ;INPUT AND DISCARD BAD CHARACTER POP BC POP AF EI RETI ; ; ; ; ; SIOOUT: PUSH BC PUS LD HL,SIOADR+1 LD C,(HL) ;LOAD C WITH SIO DATA PORT# IN A,(C) AND 01111111B LD HL,(RDAVEC) CALL DISPATCH ;GO PROCESEI ;RE-ENABLE INTERRUPTS AND RETURN RETI ; ; ; ; POLLED MODE I/O ROUTINES FOR SIO CHANEL B ; SIOST: IN A,(SIOCPB) ;GET ROLLED OVER JR C,CLOCK3 XOR A ;RESET TO ZERO IF ROLL OVER CLOCK3: LD (DE),A ;STORE UPDATED TIME DATA RET C ;EXIT IF NATTRIBUTE FOR NEW CURSOR LD A,(HL) XOR 10010000B ;SET MSB AND COMPLIMENT REVERSE VIDEO LD (HL),A ; TO CREATE NEW CURSOR AH AF LD A,(SIOADR) LD C,A ;LOAD C WITH SIO STATUS PORT# SIOUT1: IN A,(C) AND 00000100B ;TEST TBE STATUS BIT JR Z,SIOUTS SIO INPUT CHARACTER POP AF POP BC POP DE POP HL LD SP,(IRQSAV) EI RETI ; ; ; -- RX ERROR INTERRUPT SERVICE RO SIO STATUS REGISTER AND 00000001B RET Z ;ACC=0 IF NO DATA AVAILABLE LD A,255 RET ; ; SIOIN: CALL SIOST ;TEST CONSOO MORE NEEDS TO BE DONE INC HL INC DE ;ELSE POINT TO NEXT DATA & CONSTANT DJNZ CLOCK2 CLOCK4: RET TODTAB: DEFB 60H ;TTRIBUTE BYTE LD (OLDCSR),HL ;STORE POINTER FOR NEXT CURSOR UPDATE LD A,00000011B OUT (CTCA3),A ;TURN OFF VSYNC INTERRUP1 LD A,(SIOADR+1) LD C,A ;LOAD C WITH SIO DATA PORT# NOW POP AF OUT (C),A ;OUTPUT DATA TO SIO POP BC RET ; ; ; UTINE FOR SIO CONSOLE -- ; SIOERR: LD (IRQSAV),SP LD SP,IRQSTK PUSH AF PUSH BC LD A,(SIOADR) LD C,A ;LOAD C WITH LE STATUS JR Z,SIOIN ;LOOP UNTIL DATA IS IN A,(SIODPB) ; READY AT SIO DATA PORT AND 01111111B RET ; ; ; ; -- RX INT60 SECONDS/MINUTE DEFB 60H ;60 MINUTES/HOUR DEFB 24H ;24 HOURS/DAY DEFB 99H ;OVERFLOW TO DAYS ; ; ; T XOR A LD (SCROLL),A ;RESET SCROLL-REQUEST FLAG LD (MOVECS),A ;RESET CURSOR-MOVE-REQUEST FLAG POP AF ;POP MEMORY CON ; ; ; CLOCK: LD DE,TOD ;POINT DE TO START OF TIME-OF-DAY LD HL,TODTAB ;POINT HL TO HH:MM:SS TABLE LD B,4 CLOCK2: LD A,SIO CONTROL PORT# LD A,00110000B OUT (C),A ;RESET SIO EXTERNAL STATUS/INTERRUPTS LD A,(SIOADR+1) LD C,A ;NOW LOAD C WIERRUPT SERVICE ROUTINE FOR SIO CONSOLE -- ; SIOINT: LD (IRQSAV),SP LD SP,IRQSTK PUSH HL PUSH DE PUSH BC PUSH AF TROL BYTE OFF STACK OUT (PORT0),A ;SWITCH BACK TO PRE-INTERRUPT CONFIG POP AF POP BC POP DE POP HL LD SP,(IRQSAV) (DE) ADD A,1 ;INCREMENT TIME WITH ADD INSTRUCTION DAA ; SO DECIMAL ADJUST WILL WORK RIGHT CP (HL) ;COMPARE IF HH/MM/SS ;******************************************************** ;* * ;* STORAGE ALLOCATION FOR 256 BYTE SCRATCH RAM * ;* UT ROUTINES. ; KBDVEC: DEFW STASH ;PARALLEL KEYBOARD RDAVEC: DEFW STASH ;SIO RECEIVED DATA INTERRUPT TIKVEC: DEFW CLOCK4  0 ;FIFO INPUT POINTER FIFOUT: DEFB 0 ;FIFO OUTPUT POINTER FIFSIZ: DEFB 32 ;MAX FIFO SIZE PARAM ; ; CONNUM: DEFB 0 ;CUR ;MAXIMUM RETRY NUMBER FOR DISK I/O SECTOR: DEFB 0 ;SECTOR# FOR READ/WRITE SECTOR CMDTYP: DEFB 0 ;COMMAND BYTE FOR READS/WRT VERT SYNC) CTCBV: DEFW RETI DEFW RETI DEFW MILLISEC ;CTCB2 INTERRUPT (MILLISECOND TIMER) DEFW TIMER ;CTCB3 INTERRUP5 ;CURRENTLY SELECTED DISK# TRACK: DEFB 255 ;TRACK POSITION OF SELECTED DRIVE TRKTAB: DEFB 255,255,255,255 ;HEAD POSITIONS F * ;******************************************************** ; ; SIOVEC: DEFW RETI ;SIOB TX INTERRUPT DEFW RETI ;SIOB E;ONE-SECOND INTERRUPT MONVEC: DEFW EXT2 ;EXTENDED MONITOR CRTVEC: DEFW CRTOUT ;CRT OUTPUT DRIVER ; ; ; CLOCK-TIMER INTERRRENT CONSOLE DEVICE# (0,1 OR 2) SIOADR: DEFB 0 ;CONSOLE SIO CONTROL/DATA PORT NUMBER DEFB 0 ; ; CONFIG: DEFB 00000001B ;SRITES RWTRY: DEFB 0 ;READ/WRITE RETRY COUNT FNDTRY: DEFB 0 ;SEEK RETRY COUNT ERRTYP: DEFB 0 ;ERROR STATUS FOR READ/WRITE RT (CLOCK TICK) DMAVEC: DEFW RETI ;DMA READY INTERRUPT DEFW RETI ;DMA MATCH INTERRUPT DEFW RETI ;DMA END-OF-BLOCK INTEROR 4 DRIVES DEFB 0,0,0,0 ;DENSITY CONTROL BITS FOR 4 DRIVES SPEED: DEFB 6 ;SEEK SPEED FOR 1771 COMMANDS SETTLE: DEFB 15 ;XTERNAL/STATUS INTERRUPT DEFW SIOINT ;SIOB RX INTERRUPT DEFW SIOERR ;SIOB SPECIAL RX CONDITION INTERRUPT DEFW RETI ;SIOUPT VARIABLES TOD EQU $ SECS: DEFB 0 ;CLOCK SECONDS MINS: DEFB 0 ; MINUTES HRS: DEFB 0 ; HOURS DAY: DEFB 0 TDBB AND D/S BITS FOR MONITOR DSCOPY: DEFB DYSTAT+OFF ;CONTROL BYTE FOR D/S BANK SWITCH BIT STDCPY: DEFB STDBB+OFF ;CONTROL BYOUTINES IOPTR: DEFW 0 ;DISK I/O BUFFER POINTER SELCPY: DEFB 0 ;COPY OF DATA IN SELECT/MUX OUTPUTS STPVEC: DEFW STEPX ;VECTRUPT DEFW RETI ;DMA MATCH/END INTERRUPT DEFW 0,0,0,0,0,0,0,0 ;EXTRA INTERRUPT VECTORS DEFW 0,0,0,0,0,0,0,0 DEFW 0,0,0HEAD SETTLING TIME BLKSIZ: DEFW 1024 ;MAX DMA BLOCK SIZE FOR READ/WRITE NSTOP: DEFB 6*20 ;NUMBER OF INDEX PULSES TILL DISK SA TX INTERRUPT DEFW RETI ;SIOA EXTERNAL/STATUS INTERRUPT DEFW SIOINT ;SIOA RX INTERRUPT DEFW SIOERR ;SIOA SPECIAL RX CO;CALENDAR DAY MONTH: DEFB 0 ; MONTH YEAR: DEFB 0 ; YEAR ; TICKS: DEFW 0 ;CLOCK TICK INTERRUPT COUNTER NTICKS: DEFB 4TE FOR STD BANK SWITCH BIT ; ; ; VECTORS FOR EXTRA FUNCTIONS IN KBD/SIO/TIMER INTERRUPTS ; AND FOR EXTENDED MONITOR AND CRTOOR FOR STEP FINITE STATE MACHINE STPCMD: DEFB 0 ;... 179X STEP COMMAND BYTE STPCNT: DEFB 0 ;... LOOP COUNT STPDLY: DEFB 0 ,0,0,0,0,0 DEFW 0,0,0,0,0,0,0,0 ; ; ; KEYBOARD DATA INPUT FIFO VARIABLES FIFCNT: DEFB 0 ;FIFO DATA COUNTER FIFIN: DEFBTOP NREVS: DEFB 3 ;NUMBER OF INDEX PULSES BEFORE READY DSKTYP: DEFB 00000001B ;DISK TYPE / DENSITY INDICATOR MAXRWT: DEFB 5 NDITION INTERRUPT CTCAV: DEFW KEYSRV ;CTCA0 INTERRUPT (KBD STROBE) DEFW RETI DEFW RETI DEFW VSYNC ;CTCA3 INTERRUPT (C ;NUMBER OF TICKS PER SECOND TIKCNT: DEFB 1 ;PRESCALER FOR 1 SECOND TIMER ; ; ; DISK I/O DRIVER VARIABLES UNIT: DEFB 25 ;... DELAY COUNT INUSE: DEFB 0 ;DISKS IN-USE FLAG FOR BACKGROUND DSKCNT: DEFB 0 ;... DISK TURN-OFF COUNTER RDYCNT: DEFB 0  RET ; ; CALLX: JP (IX) ;CALL SUBROUTINE @ IX ; ; ; CMDTAB: DEFB 'V' DEFB 'R' DEFB 'O' DEFB 'I' DEFB 'G' DEFB  ;RELATIVE ADDR OF NEW LINE AFTER SCROLL MOVECS: DEFB 0 ;CURSOR-MOVE REQUEST FLAG CURSOR: DEFW 0 ;OFFSET (0..2047) TO CURSOMDSIZ/3 ; IN COMMAND SEARCH TABLE CALL SEARCH CALL NZ,EXTEND ;TRY EXTENDED FUNCTION JUMP IF NO MATCH JR NZ,WHAT PUSH HL ;... NOT-READY TIMER OLDCTC: DEFB 0 ;... LAST CTCA1 COUNT ; ; ; ; CRT OUTPUT DRIVER VARIABLES RC EQU $ ;ROW/COLUMN FOR;******************************************************** ;* * ;* BASIC HEX MONITOR FOR Z-80 PROCESSORS * ;* * 'T' DEFB 'F' DEFB 'M' DEFB 'C' DEFB 'B' DEFB 'D' DEFB 'X' DEFB CR DEFW DUMMY DEFW BANKSW ;BANKSWITCH COMMANR LOCATION OLDCSR: DEFW ATTMEM ;POINTER TO CURSOR IN ATTR MEMORY CRTFLG: DEFB 00000001B ;CRT PARAMETER BITS AUTONL EQU 0  CALL PARAMS ;INPUT NUMERIC PARAMETERS FROM POP IX ; LINE BUFFER AND TEST IF ERROR JR C,WHAT LD HL,(PARAM1) LD DE,(PA CRT CURSOR LOCATION ROW: DEFB 0 COL: DEFB 0 BLANK: DEFB ' ' ;CHARACTER USED FOR BLANK FILL ATTRIB: DEFB 00000011B ;CURRENT;******************************************************** ; ; ; ; PROMPT: CALL PNEXT DEFB CR,LF,'* ',EOT LD HL,LINBUF D DEFW MEMDMP ;DUMP MEMORY IN HEX/ASCII DEFW BOOT ;BOOT FROM FLOPPY DEFW BLOCK ;MEMORY BLOCK MOVE DEFW VIEW ;MEMORY ;AUTO-NEWLINE NOSCRL EQU 1 ;NO SCROLL DSPTIM EQU 2 ;CLOCK TIME DISPLAY ; ; ; ; ; FREE MEMORY LIST POINTER FREPTR: DERAM2) LD BC,(PARAM3) CALL CALLX ;CALL SUBROUTINE @ IX JR NC,PROMPT ;GO BACK TO PROMPT IF NO ERRORS WHAT: CALL PNEXT  CHARACTER ATTRIBUTE BITS GRMODE: DEFB 00000000B ;MODE BITS FOR GRAPHICS MODE ESCVEC: DEFW 0 ;POINTER FOR LEAD-IN SEQUENCE RO LD C,LINSIZ CALL GETLIN ;INPUT A BUFERED CONSOLE LINE JR C,WHAT ;PRINT 'WHAT ?' IF INPUT ERROR CALL CRLFS XOR A LEXAMINE/CHANGE DEFW FILL ;FILL MEMORY DEFW TEST ;RAM DIAGNOSTIC DEFW GOTO ;JUMP TO MEMORY LOCATION DEFW INCMD ;READ FW TAIL ; ; DEFM ' what ?' DEFB EOT JR PROMPT ; ; ; EXTEND: LD HL,(MONVEC) CALL DISPATCH ;PROCESS EXTENDED MONITOR FUNCTION EXT2:UTINES ROWTMP: DEFB 0 SCROLL: DEFB 0 ;SCROLL REQUEST FLAG START: DEFW 0 ;CONTENTS OF 6845 START ADDRESS REG NEWLIN: DEFW 0D (BREAK),A ;CLEAR CONSOLE BREAK FLAG LD A,(LINBUF) LD IY,LINBUF+1 LD HL,CMDTAB ;SEARCH FOR A MATCHING CHARACTER LD BC,C FROM INPUT PORT DEFW OUTCMD ;WRITE TO OUTPUT PORT DEFW DSKCMD ;DISPLAY DISK SECTOR DATA DEFW VERCMD ;MEMORY BLOCK COMPA COMMAND -- ; BOOT: LD C,0 ;SELECT DRIVE 0 FOR BOOT LOAD CALL SELECT JR NZ,DSKERR CALL HOME ;HOME HEAD TO TRACK 0 JRT ERROR STATUS IN HEX DSKADR: LD A,(DSKTYP) BIT 0,A ;DETERMINE IF SINGLE/DOUBLE DENSITY LD A,'S' JR Z,DSKAD1 LD A,'D' MP2: CALL LOAD ;GET A DATA BYTE @ HL LD A,C INC HL CALL PUT2HS ;PRINT THE DATA IN HEX DJNZ DUMP2 ;REPEAT 16 TIMES PECOND ARG AS TRACK# CALL SEEK JR NZ,DSKERR LD HL,PARAM3 DSK2B: LD C,(HL) ;USE THIRD ARG AS SECTOR# LD HL,DSKBUF CALL ; ; ; -- MEMORY DUMP COMMAND -- ; MEMDMP: DEC A ;CHECK PARAMETER COUNT JR Z,MDMP2 DEC A JR Z,MDMP3 MDMP1: LD HL,(LRE CMDSIZ EQU $-CMDTAB ; ; ;******************************************************** ;* * ;* MONITOR COMMAND ACTIO NZ,DSKERR ;ERROR IF CANNOT RESTORE LD HL,DSKBUF ;POINT TO MONITOR'S SECTOR BUFFER LD C,1 ;SELECT SECTOR 1 CALL READ ;RE DSKAD1: CALL OUTPUT ;DISPLAY 'SD' OR 'DD' LD HL,DADMSG CALL PMSG LD A,(UNIT) ;NOW DISPLAY UNIT/TRACK/SECTOR CALL PUT2HOP HL ;RESTORE STARTING ADDRESS LD B,16 DUMP3: CALL LOAD ;GET BACK DATA BYTE @ HL LD A,C INC HL RES 7,A CP 20H JR READ ;READ SECTOR INTO (BUFFER) JR NZ,DSKERR INC HL ;ADD 1 TO DMA BYTECOUNT RETURNED IN HL EX DE,HL LD B,4 DSK2C: SRAST) MDMP2: LD DE,16 JR MDMP3B MDMP3: EX DE,HL SBC HL,DE ;DERRIVE BYTECOUNT FOR DUMP RANGE LD B,4 MDMP3A: SRL H ;DIN ROUTINES PACKAGE * ;* * ;******************************************************** ; ; ; ; -- DISK SECTOR READ COMAD TRACK 0/ SECTOR 1 JR NZ,DSKERR LD HL,CONFIG SET 0,(HL) ;SET CONFIG BYTE FOR RAM AT 0000H LD HL,DSKBUF LD DE,0080S ;PRINT DRIVE UNIT# LD A,'T' CALL OUTPUT LD A,(TRACK) CALL PUT2HS ;PRINT TRACK# IN HEX LD A,'S' CALL OUTPUT LD  C,DUMP4 CP 7FH JR C,DUMP5 DUMP4: LD A,'.' ;PRINT A DOT IF DATA < 20 OR > 7F DUMP5: CALL OUTPUT ;PRINT ASCII CHARACTER IL D RR E ;DIVIDE BYTECOUNT BY 4 DJNZ DSK2C LD HL,DSKBUF CALL DUMP ;DUMP DISK READ BUFFER AND JR DSKADR ; PRINT UNITVIDE BYTECOUNT BY 16 RR L DJNZ MDMP3A INC HL EX DE,HL MDMP3B: CALL DUMP ;DUMP DE*16 BYTES STRTING AT HL LD (LAST),HLMAND -- ; DSKCMD: CP 3 ;CHECK PARAMETER COUNT JR Z,DSK1 OR A SCF RET NZ LD HL,SECTOR INC (HL) ;BUMP LAST USED SEH LD BC,128 CALL MOVE ;COPY BOOT CP/M STANDARD LOCATION DI LD SP,STACK LD HL,ROLLIN PUSH HL ;PUSH ADDRESS IN CASE A,(SECTOR) CALL PUT2HS ;PRINT SECTOR# IN HEX DUMMY: OR A RET DADMSG: DEFB 'D U',EOT ; ; ; ; ; -- DISK BOOT LOADERN A DJNZ DUMP3 CALL CRLFS RET NZ ;EXIT IF ESCAPE REQUEST IS INDICATED DEC DE LD A,D OR E JR NZ,DUMP RET ; ; /TRACK/SECTOR DSKERR: PUSH AF ;SAVE 1771 STATUS CALL PNEXT DEFM 'disk error ' DEFB EOT POP AF CALL PUT2HS ;PRIN RET ; ; ; DUMP: PUSH HL ;SAVE STARTING ADDRESS CALL PUT4HS ;PRINT STARTING ADDRESS IN HEX CALL SPACE LD B,16 DUCTOR NUMBER JR DSK2B ; DSK1: LD C,L ;USE FIRST ARG AS UNIT# CALL SELECT JR NZ,DSKERR LD HL,PARAM2 LD C,(HL) ;USE SBOOT RETURNS LD HL,0080H PUSH HL ;PUSH TRANSFER ADDRESS FOR 'EXITMON' JP EXITMON ;TURN OFF ROMS AND EXECUTE LOADER ; ; ; -- READ FROM INPUT PORT COMMAND -- ; INCMD: DEC A ;CHECK IF PARAMETER COUNT=1 SCF RET NZ LD C,L ;POINT C TO INPUT PO CALL LOAD ;LOAD C WITH ERROR BYTE LD A,L XOR H XOR B ;RE-GENERATE BYTE IN ERROR CALL CHECK ;GO PRINT RESULT RET NZPARAM4) LD BC,(PARAM5) ;PUT REST OF PARAMS IN REGISTERS JP EXITMON ;SET D/S BANKSWITCH AND EXIT MONITOR ; ; ; ; -- MEMOCP 3 ;CHECK IF PARAMETER COUNT=3 SCF RET NZ CALL BLOCAD LD A,C OR B RET Z ;EXIT NOW IF BC=0 CALL MOVE ;MOVE ALL ECHO JR VIEW3 VIEW2: CALL ASCHEX CCF RET NC RLCA RLCA RLCA RLCA LD C,A CALL ECHO CALL ASCHEX CC CALL PUT2HS RET ; ; ; ; -- FILL MEMORY WITH CONSTANT COMMAND -- ; FILL: CP 3 ;CHECK IF PARAMETER COUNT=3 SCF RT IN1: CALL CRLFS LD A,C CALL PUT2HS IN A,(C) CALL PUT2HS CALL ECHO CP CR JR Z,IN2 CP '-' JR Z,IN3 OR A  ;EXIT ROUTINE IF BREAK REQUESTED INC HL LD A,H CP E JR NZ,TEST3 ;CHECK REST OF BLOCK FOR ERRORS TEST4: INC B ;BUMPRY READ/WRITE DIAGNOSTIC COMMAND -- ; TEST: CP 2 ;CHECK PARAMETER COUNT SCF RET NZ INC DE LD E,D ;GET ENDING PAGE ADBLOCK WITH BANK SWITCH OR A RET ; ; ; BLOCAD: EX DE,HL OR A ;CLEAR CARRY SBC HL,DE ;GET DIFFRENCE BETWEEN EX DE,CF RET NC OR C VIEW3: LD C,A CALL STORE VIEW4: INC HL INC HL VIEW5: DEC HL JR VIEW ; ; ; ; -- JUMP TO MEMORY LRET NZ EX DE,HL OR A SBC HL,DE ;END-START EQUALS BYTECOUNT EX DE,HL RET C RET Z ;RETURN IF START => END ADDRESS RET IN2: INC C INC C IN3: DEC C JR IN1 ; ; ; ; -- WRITE TO OUTPUT PORT COMMAND -- ; OUTCMD: CP 2 ;CHECK IF PARAM PASS COUNT LD A,'+' CALL OUTPUT ;PRINT '+' AND ALLOW FOR EXIT JR Z,TEST1 ;DO ANOTHER PASS IF NO ESCAPE RET ; ; ; DRESS INTO E LD D,H ;GET STARTING PAGE ADDRESS INTO D LD B,0 ;INITIALIZE PASS COUNTER TEST1: LD H,D ;POINT HL TO START OHL ;HL & DE FOR BYTECOUNT PUSH DE PUSH BC POP DE ;GET OLD BC INTO DE POP BC INC BC ;GET COUNT+1 INTO BC RET ; OCATION COMMAND -- ; GOTO: OR A ;CHECK IF PARAMETER COUNT <> ZERO SCF RET Z DI LD SP,STACK LD DE,ROLLIN PUSH DE CALL STORE ;STORE C AT (HL) IN PROPER BANK LD B,D LD C,E ;PUT BYTECOUNT IN BC FROM DE LD D,H LD E,L INC DE ;PUTETER COUNT=2 SCF RET NZ LD C,L ;POINT C TO OUTPUT PORT OUT (C),E ;OUTPUT DATA PASSED IN E OR A RET ; ; ; ; -- CHECK: CP C RET Z ;RETURN IF C=A PUSH AF CALL MDATA ;PRINT WHAT WAS ACTUALLY READ CALL PNEXT DEFM 'should=' DEFBF BLOCK LD L,0 TEST2: CALL MEMTEST ;CALL BANK-SWITCH MEMORY TEST ROUTINE JR Z,TEST4 ;DO ANOTHER PASS IF NO ERRORS TEST3:; ; ; -- MEMORY BLOCK COMPARE COMMAND -- ; VERCMD: CP 3 ;CHECK IF PARAMETER COUNT=3 SCF RET NZ CALL BLOCAD JR VERF2 ;PUSH MONITOR ENTRY ADDRESS FOR RETURN PUSH HL ;PUSH TRANSFER ADDRESS AFTER THAT LD A,(PARAM2) LD HL,(PARAM3) LD DE,( START+1 IN DE CALL MOVE ;FILL BLOCK USING LDIR TRICK OR A RET ; ; ; ; ; -- MEMORY BLOCK MOVE COMMAND -- ; BLOCK: MEMORY EXAMINE COMMAND -- ; VIEW: CALL MDATA CALL ECHO CP CR JR Z,VIEW4 CP '-' JR Z,VIEW5 CP ',' JR NZ,VIEW2 C EOT POP AF CALL PUT2HS ;PRINT WHAT SHOULD HAVE BEEN READ RET ; ; MDATA: CALL CRLFS CALL PUT4HS CALL LOAD LD A,  VERF1: PUSH BC EX DE,HL CALL LOAD ;READ BYTE @DE IN CURRENT BANK EX DE,HL LD B,C CALL LOAD ;NOW READ BYTE @HL BACK TO SOURCE MEMORY BANK RET NZ ;ABORT IF SOURCE <> DEST INC HL DEC BC LD A,B OR C JR NZ,SHADOW RET ; ; ; ; (CONFIG),A ;STORE NEW CONFIGURATION BITS RET ; BANK3: EI CALL PNEXT DEFB 'ERR AT ',EOT CALL PUT4HS OR A RET ; ; SEARCH: CPIR ;SEARCH TABLE @HL FOR MATCH WITH A RET NZ ;EXIT NOW IF SEARCH FAILS ADD HL,BC ADD HL,BC ;ADD RESIDUE FRF STD/BB BIT IS DIFFERENT JR Z,BANK2A ;EXIT IF NO CHANGE IN RAM BANK SWITCH DI ;NO INTERRUPTS WHILE COPYING MEMORY LD DEC C JR NZ,GLIN1 ;GET ANOTHER IF THERE'S MORE ROOM SCF RET ;RETURN WITH CARRY=1 IF TOO ;MANY CHARACTERS ARE ENTERLD A,B CALL CHECK ;COMPARE DATA @DE AND @HL POP BC RET NZ ;EXIT IF ESCAPE REQUEST IS INDICATED INC HL INC DE DEC B******************************************************** ;* * ;* CONSOLE I/O PACKAGE AND UTILITY ROUTINES * ;* *  ; ; ; HL ... BLOCK POINTER ; BC ... BYTECOUNT ; D ... DEST BANK CONTROL BYTE ; E ... SOURCE BANK CONTROL BYTE ; SHADOOM CPIR BYTECOUNT ADD HL,BC ; TO HL 3 TIMES TO GET POINTER LD A,(HL) ; TO ADDRESS PART OF TABLE ENTRY INC HL LD H,(HL)A,(STDCPY) LD E,A ;E=SOURCE BANK CONTROL BYTE XOR 00001000B LD D,A ;OPPOSITE BANK GOES IN D LD HL,MONITR ;ELSE MAKE SHED GLIN2: LD (HL),A ;PUT CARRIAGE RETURN ON END OF LINE RET ;RETURN WITH CARRY BIT=0 GLIN4: DEC HL ;DELETE LAST CHARAC VERF2: LD A,B OR C JR NZ,VERF1 RET ; ; ; ; -- MEMORY BANK SWITCH COMMAND -- ; ; BANKSW: CP 2 CCF RET C ;ERR ;******************************************************** ; ; ; GETLIN: LD B,C ;SAVE MAX LINE LENGTH PARAMETER IN B GLIN1W: LD A,(HL) ;GET MEMORY BYTE FROM SOURCE BANK EX AF,AF' LD A,D OUT (PORT3),A ;SWITCH TO DESTINATION MEMORY BANK EX A LD L,A RET ;EXIT WITH Z=1 TO INDICATE MATCH ; ; ; ; PARAMS: LD BC,0 LD A,(IY+0) CP CR ;CHECK IF LINE TERMINATESADOOW COPY OF UPPER 4K LD BC,4096 ; OF RAM BEFORE SWITCHING BANKS CALL SHADOW JR NZ,BANK3 ;JUMP IF BLOCK NOT COPIED CORRECTER FROM BUFFER CALL PNEXT DEFB ' ','H'-64 ;PRINT A SPACE TO OVERWRITE THE DEFB EOT ; LAST CHARACTER, THEN DO A BACKSPACOR IF NOT PARAM COUNT NOT 0 OR 1 OR A JR NZ,BANK2 ;JUMP IF NEW PARAM ENTERED LD A,(CONFIG) CALL PUT2HS ;DISPLAY CURRE: CALL ECHO ;GET A CHARACTER FROM THE CONSOLE CP CR ;CHECK FOR CARRIAGE RETURN JR Z,GLIN2 CP 'H'-64 ;CHECK FOR CTL-H BAF,AF' LD (HL),A ;STORE DATA BYTE INTO DEST BANK CP (HL) ;READ BACK FROM DEST AND COMPARE LD A,E OUT (PORT3),A ;SWITCH  JR NZ,PARA2 ; IMMEDIATELY WITH A RETURN XOR A RET ;RETURN WITH PARAM COUNT=0 IF SO PARA1: INC C ;ADD 2 TO PARAM BUCTLY LD A,D OUT (PORT3),A ;SWITCH TO OPPOSITE BANK AND STAY LD (STDCPY),A EI BANK2A: LD A,(PARAM1) AND 00000011B LDE INC C LD A,B ;MAKE SURE YOU'RE NOT TRYING TO SUB C ;BACKSPACE PAST THE START OF THE LINE JR NC,GLIN1 RET ; ; ;NT 'CONFIG' BYTE OR A RET ; BANK2: LD A,L LD HL,CONFIG XOR (HL) ;COMPARE NEW CONFIG TO OLD SETTING BIT 1,A ;TEST ICKSPACE JR Z,GLIN4 CP ' ' RET C ;OTHER CONTROL CHARACTERS ARE ILLEGAL LD (HL),A INC HL ;STORE CHARACTER IN BUFFER  FFER INDEX IN BC INC C LD A,C CP 10 CCF RET C ;ERROR IF > 5 NUMBERS ENTERED PARA2: PUSH BC ;SAVE PARAMETER COUNT  INC HL CP EOT RET Z CALL OUTPUT JR PMSG ; ; ; ; CRLFS OUTPUTS A RETURN-LINEFEED-SPACE ; TO THE CONSOLE DEVICE ; CCF RET ; ; ; PUT4HS: LD A,H CALL PUT2HX LD A,L PUT2HS: CALL PUT2HX CALL SPACE RET ; ; PUT2HX: PUSH AF RR;******************************************************** ;* * ;* Monitor ROM for Bigboard_II single board * ;* compute LD HL,0 JR GNUM3 GNUM1: LD B,4 GNUM2: ADD HL,HL ;MULTIPLY RESULT BY 16 RET C ;RETURN IF IT OVERFLOWS 16 BITS DJNZ E TO LOWER CASE RET ; ; ; OUTPUT: CALL CONOUT CALL CONST ;SEE IF CONSOLE INPUT IS PENDING JR Z,OUTP2 CALL CONIN CCALL GETHEX ;READ A NUMBER FROM LINE BUFFER POP BC RET C ;ERROR IF RESULT OVER 16 BITS LD IX,PARAM1 ;POINT TO PARAMETER  CRLFS: CALL PNEXT DEFB CR,LF,EOT SPACE: LD A,' ' CALL OUTPUT RET ; ; ; ; ECHO INPUTS ONE CHARACTER FROM THE CONSOLEA RRA RRA RRA CALL PUTNIB POP AF PUTNIB: AND 00001111B ADD A,90H DAA ADC A,40H DAA CALL OUTPUT RET r. * ;* * ;* copyright (C) 1982 by Russell Smith. * ;* all rights reserved by Russell Smith. * ;* * ;* laGNUM2 LD E,A ;APPEND NEW LOW ORDER DIGIT LD D,0 ;AND GET RESULT BACK INTO DE ADD HL,DE RET C ;RETURN IF OVERFLOW GNUP CR ;SEE IF CARRIAGE RETURN WAS TYPED JR Z,OUTP1 CALL CONIN ;WAIT FOR ANOTHER INPUT CHARACTER JR OUTP2 ; THEN RETURN TSTORAGE AREA ADD IX,BC ;ADD PARAMETER COUNT IN BC LD (IX+0),L LD (IX+1),H ;STORE DATA RETURNED FROM 'GETHEX' CP ' ' J ; DEVICE, PRINTS IT ON THE CONSOLE OUTPUT AND ; THEN RETURNS IT IN REGISTER A WITH BIT 7 RESET ; ; OUTPUT PRINTS THE CHARAC; ; ; PMSG PRINTS THE STRING OF ASCII CHARACTERS ; POINTED TO BY THE RELATIVE ADDRESS IN DE ; UNTIL AN EOT IS ENCOUNTERED INst revision date ... 8-July-1982 * ;* * ;******************************************************** ; ; ASEG MONITR M3: LD A,(IY+0) ;GET A CHARACTER FROM LINE INPUT INC IY ; BUFFER @ IY AND BUMP IY LD C,A CALL ASCHEX ;CONVERT ASCII TO NO CALLING ROUTINE OUTP1: LD (BREAK),A ;SET ESCAPE FLAG TO NON-ZERO VALUE OUTP2: LD A,(BREAK) OR A ;RETURN CURRENT STATUS R Z,PARA1 ;GET ANOTHER ITEM IF SPACE CP ',' JR Z,PARA1 ;GET ANOTHER ITEM IF COMMA CP CR SCF ;ELSE CHECK FOR CARRIATER IN REGISTER A ON ; THE CONSOLE OUTPUT DEVICE AND THEN DOES A CHECK ; FOR CONSOLE INPUT TO FREEZE OR ABORT OUTPUT. ; EC THE STRING. ; EOT EQU 04H CR EQU 0DH LF EQU 0AH ; PNEXT: EX (SP),HL CALL PMSG EX (SP),HL RET ; PMSG: LD A,(HL)EQU 0F000H DSKBUF EQU 0F800H RAM EQU 0FF00H ; ; ; ORG 0000H ;PUT ROM-RESIDENT STUFF HERE INCLUDE INIT.MAC ;COLD STARUMERIC JR NC,GNUM1 LD A,C OR A RET ; ; ASCHEX: SUB '0' RET C CP 10 CCF RET NC SUB 7 CP 10 RET C CP 16OF ESCAPE RET ; FLAG TO CALLING ROUTINE ; ; ; ; GE RETURN RET NZ ; AND EXIT WITH CY=1 IF NOT LD A,C SRL A ;A=COUNT OF NUMBERS ENTERED INC A RET ; ; ; ; GETHEX:HO: CALL CONIN ;INPUT A CHARACTER AND ECHO IT PUSH AF CALL CONOUT POP AF CP 'Z'+1 RET C SUB 32 ;CONVERT UPPER CAS T INITIALIZATION INCLUDE CRTOUT.MAC ;MEMORY-MAPPED CRT OUTPUT DRIVER INCLUDE MONITOR.MAC ;ROM MONITOR ROUTINES ; ; ; ;  24 ;LOCAL STACK FOR INTERRUPTS IRQSTK EQU $ ; ; ; CRTSAV: DEFS 2 ;STACK POINTER SAVE FOR 'CRTOUT' DEFS 24 ;LOCAL STACc>GpU͝4#!hcxuT,I52th!h͓!uhU͙4#T!h &U4L?w5!|h6:|h9!h~#RC!`/B!jMONCOPY EQU $ .PHASE MONITR ;PUT RAM-RESIDENT STUFF HERE MONSTRT EQU $ INCLUDE ENTRYS.MAC ;MONITOR ENTRY POINTS INCLK FOR SAME CRTSTK EQU $ ; ; ; ; VARIABLES FOR ROM MONITOR ; PARAM1: DEFS 2 ;HEX NUMERIC PARAMETERS PARSED PARAM2: DEFS c> Uʹ8]RC!`/B*h> $Sʹ8!tc>Uʹ8]!h/RC! a/B|4*h X^#V> $Sʹ8!vc>Uʹ8|4+*hUDE INTSRV.MAC INCLUDE DISKIO.MAC MONLEN EQU $-MONSTRT MONEND EQU $ .DEPHASE ; ; ; ; RAMCOPY EQU $ .PHASE RAM 2 ; FROM COMMAND LINE BY 'PARAMS' PARAM3: DEFS 2 PARAM4: DEFS 2 PARAM5: DEFS 2 BREAK: DEFS 1 ;KEYBOARD BREAK FLAG FOR COMM X>Uʹ8]ͨ4!h&U!h!}h&U!yc}hxuT!h~#!zc}hxuT!{c}hxuTRC>/E!|c>`^>2rh!"ph4!7|;R8C!@c>UB]ͥ4͙4~R*5og#}͙4w͙4~og@ }3>!sh&U͝4#![cxuT>2th RAMSTRT EQU $ INCLUDE MEMORY.MAC ;INITIALIZED VARIABLES RAMLEN EQU $-RAMSTRT .DEPHASE ; ; ; ; .PHASE MONEND IANDS LAST: DEFS 2 ;LAST ADDRESS USED BY 'DUMP' LENGTH: DEFS 2 ;SECTOR LENGTH FOR DISK COMMAND LINBUF: DEFS 64 ;LINE INPUT ; PAGE ; ; ; -- UNINITIALIZED SCRATCH MEMORY FOR SYSTEM -- ; ; IRQSAV: DEFS 2 ;STACK POINTER SAVE FOR INTERRUPTS DEFSUB]6!~c}hxuT!c}hxuT!hʹ/6!c}hxuT̀.6!c}hxuT!h/6!c}hxuTDRC!a!uh]c>_U,͝4#͝4#>U!^c> Us8+M>DTG!uh>_U!hcuh>VT!uhUͰQ}2th*ph:thogͼX͝4#hc>GpU͝4#hNCLUDE SCRATCH.MAC TAIL EQU $ ;END OF RESERVED MEMORY IN MON .DEPHASE ; ; ; ; END BUFFER LINSIZ EQU $-LINBUF DEFS 32 ;STACK FOR ROM MONITOR STACK EQU $ ; ; FIFO: DEFS 64 ;***TEMP*** ; ;  /B!c>Uʹ8]!hc>pU!h)2h!h"2~hRAC>/E]6!c}hxuTY6!c}hxuTnͬ 6!yc}hxuTƒ4/B!c>Uʹ8]!h)2h:h¢ :hog+"i!h> "h!cͱX*nh##~og+++7*hSͦVR"hR) C>/E!7a/B!c>Uʹ8*h> p ͙4~og+"h!h> "h!cͱX*nh##~og+++7R"h*h*h X"h!"h#"h*h"h*h*hͼX |4*h X~og"h|4_T*-i#"+i*-i+")iæ*h*+iͼX-!"+i*+iÐRQC!Ea/B!c>Uʹ8]!1i)2/i:/ic:/i͙4w!sh0i>GpU:xh2th!u*h X&U͡4 :hog)))))~|4*h Xw͡4:hog)))))~|4*h Xw:h|4*h*iͼX *i*i X*ixuT5 *i#"i *i*i*!i XxuT` *!i+"!i5 *!i*iͼX *i*i*i6!c}hxuT˜ -6!c}hxuT­)6!zc}hxuTs 6!c}hxuT!h>0!hʹ/6!c}hxuT!h16!c}h$Sʹ8!c>Uʹ8!h>Uʹ8!c>Uʹ8]R: C>/E] ^#V"i*i~2i!i4D5"nh75"i*nh^#V>ogkX#"i*nh^*h X~og)))))|4*h X~og"h:hJ !"h*h#"h*h))))"h*h >ogkX"h*h*h|4+++*hhyh>[U?^#V"5i*5i~og>$S!:i&U*5i~og |!:i{?TG!7i>_U!:i>?TG!7i>_U!7iUÏUH^#V"Bi*Bi Xw͡4:hog)))))~|4*h Xw|4+*h X~c>GpU42h!h4 {̈́!"h"h!h"hÁ!h~# X-T*i*i X*i*!i X-T*i*!i X*i-T*i#"i*!i+"!i *i#"i*%i*iͼX*!ixuT 16!c}hxuT"6!{c}hxuT6!|h6_ͥ4x!ch >98|q͙4#c>GpU͙4 c>GpU~!hc> pU͙#V#"i!" i*i"i*i* iͼX !" i* i | *i~! iF!Tր *i+"i* i#" iæ *i#"i* i#" iÓ *i|!h~# |4* Xs#r*h*h+*hkX*h X"h*h*h|4*h Xs#r|4*h X^#V*h"h*h#"hR+ C!a/B*h>"Di>2Fi*Bin&}2Gi:Giog:FiogͼX?*Di:Fiog>w!Fi4*BiUÏUÞ^#V"Hi*HiU!~c>Us8"Ji!Ji~#ʒ*Hi*Ji=TG!R…!"h#"h*h"h*h*hͼXz|4*h X|4*h XxuT|4*h X|4*h Xx*#iͼXͼXC*#i*i*i))s#r*!i*i++*i))s#r*i"#iu*i*i*i))s#r*%i*i++*i))s#r*!i"%iï t 1^4 6?͙46?͙4~=2h!h4:th2h:ph2hþ:th2h:th2h͡4"h!h/5!"h:h2h:h2h:hog:hogͼX\!hP5͙4"h!hh# X"i|4*h## X"i|4*h### X"i|4"i!"i*i*i))6#6*h*i++*i))s#r!i#{* $Sʹ8!c>Uʹ8*h> $Sʹ8!c>Uʹ8]R^ C!&a/B!c>Uʹ8*h> $Sʹ8!c> Uʹ8]Ro C>/E]; R C!2ai> _U!Pi͡ÏUÝ!c>UÏU^#V"_i!ai6!"ni*_in&"pi*pi*niͼX*_i*ni]8TG!ti>pU!ri!ai ͣT*ni#"niü!aiUuT|4*h X~|4*h XA*h#"h|4*h X|4*h X-T*h#"hÕ*h"h#V"'i*'i!c xuTš!*h")i!"+i*)i*+iͼX*+i*)i>ogkX"-i|4*-i X>U|4*-i XT*'i 42h:hU*h#"h͡4#:hog)))))!h>G_U!h|4*h X&U͡4 :hog)))))!h>_U!h|4i*i))^#V"#i*i++*i))^#V"%i*i+"i*#i*%iͼXx*#i"i*%i"!i*i*!i>ogkX"i*i*i*i X-T*!i UI^#V"ui*uin&"wi*wi |/*wi |>*wi }3>*uiG&U*ui>UÏURiC!Ja/B!c> Uʹ8]RC>/E!Qa/B!dC!b/B!Zf>Uʹ8]R C!b/B!sh>Uʹ8|4*i^#V X"i!c>U!i͓Tʹ8*i>Uʹ8!af>Uʹ8*i>*i >GpU*i 6?*ic>GpU*i> DT*iG>pU*i > ?T*iG>pU*i6*i6?*ic>GpU|4*j |e*j*j]> DT!j*j]> DTuT*j*j]> DTG!c>uT[*j#"j>ò^#V"j*j!af>28"C>/E!a/B!e>Uʹ8]RC>/E!a/B!e>Uʹ8]RC>/E!a/B!e>Uʹ8]R%C>/E!a/B!e>U!Tj3!Xj &U!Nj*j#"jR/C>/E]Üdj~# 8|4*fj^#V X>U!af>U|4*fj^#V X>Uʹ8]RC!Xa/B!&d>Uʹ8]RC!_a/B!7d>Uʹ8]&RC>/E!fa/B!Hd> Uʹ8]RC!ka/B!Qd>Uʹ8]!iAf>GpU*i~TR;C!b/B!bf>Uʹ8]ͨ4!i&U!i!i&U!AfixuT»*i"i!i"5*i|4**i^#V X"i!iP5*i"i!i4ʥRC>/E!a/B!f>Uʹ8!sh>Uʹ8|4*i^#V X"i!c>U!j!j~#ʽ*j*j+M8TG!j>pU*j*j#=TG!j>pU*j!j>lU!jzf>GpU!j6!"j*j |:j/4!j*j]>ʹ8!sh>Uʹ8!uhUʹ8!c>Uʹ8]͙4~=2i!i4RTC!a/B!e>Uʹ8]qC!a/B?!yi28"i!TT!lj &U!"hj*hj |*dj*hj]> DTG!xj>pU!cxjxuT!lj*hj]> DTxjpU*hj#"hjÔ!"jj"hj*hj |RUʹ8]R*C>/E!ra/B!jd>Uʹ8]RLC>/E!ya/B!d>#Uʹ8]RnC>/E!a/B!d>Uʹ8]RC>/E!ai^#V X>GpU*i|4*i^#V X>GpU0RC>/E!$b/B!ef> Uʹ8]C!)b/B?!i Uʹ8!f>Uʹ8]!i͵'RC!a/B!f>Uʹ8]*i"i!i/RC!a/B!$f>Uʹ8]ͨ4!i&UDTG!]c>uT*!j6!j*j>?TcpU*j#"j!j6!"j*j |:j/!j*j]>DTG!]c>uT‰!j6!j*j>?yi*i#=TG!i>_U!iK!yiVT¶!]cyi>28|!cyi>28|ͿRC>/E]!ik!i &!lj*hj]> DTG!xj>pU!~cxjxuTH!lj*jj]> DTxjpU*jj#"jj*hj#"hj*jj"hj*hj |!lj*hj]> DT~cpU*hj#/B!d>$Uʹ8]RC>/E!a/B!d>-Uʹ8]RC>/E!a/B!e>3Uʹ8]RC>/E!a/B!9e>Uʹ8]RC>i!ci>28#=TG!j>_U!jK!iVT:!-jk!i &UReC!.b/B!of> Uʹ8]C!3b/B?!iUʹ8]lRlC!b/B!Qf> Uʹ8]*i"i!i/RTcpU*j#"j?!j>U!af>U!jTTÏU^#V"j͡4"j!j/5*j"j!j42j:j>3>͡4 :jog)))))U!iRC>/E]üi~# !|4*h# X"i͙4~*iw|4*i^#V X*i#>GpU|4*i^#V X"hjX!{jlj> _U!yjkÏUhj~# ¤|4*j^#V X>U!af>U|4*j^#V XTT!j &U!"j/E!a/B!Le>Uʹ8]R:C>/E!a/B!he>Uʹ8]R\C>/E!a/B!e>Uʹ8]R~C>/E!a/B!e>Uʹ8]R]RC>/E]!i!ci>28#=TG!1j>_U!/jK!iVT!Fjk!j &U!"j*h"Hj*Hj*jͼX!Jj͟ _T >|j~# |4*h# X"j*j~*jw|4*j^#V X*j#>GpU|4*j^#V X*j ^#V X~!k %*)k"9k!7k͵%R%C>/E!vb/B!k>Uʹ8!c>U!;k͓Tʹ8!af>Uʹ8*)k#>Uʹ8*)k >U!eb/B!-g>Uʹ8]!j/͙4"j!j2~h4"ͨ4!j&U!j6)j~# "*j~"*j~og@ }3>!k&U|4*h|4*j^#V X~!k:thT)RT)C>/E!b/B!g>#Uʹ8!g> Uʹ8]|4*j^#V X~!kʱ)*'k*)kj= *h*hͼX R C>/E]!"h"R C>/E!Lb/B!f>)Uʹ8]ͨ4!j&U!j!c_T2jR!C>/E!Qb/k*k#"kó&!"k*'k~=2`k!^k4!akP5!"k*k+"ck*ck*kͼX/:k'*%k*k)"gk!ek/5*'k"kk!ik5t'!k6!k6:h'*%k*>GpU*j 6?*jc>GpU*j~=2j!j4|4*j^#V X"j!jP5!j͵VRC>/E!8b/B!f>Uʹ8]*j"jʹ8!Ng>Uʹ8]>*)k"?k!=k5*'k 6*)k6*'k"Ck!Ak5_%R]%C!b/B!gg>Uʹ8]|4*j^#V X"Ek!EkP5*# X"'k*'k#")k*j~*'kw|4*j^#V X*'k#>GpU|4*j^#V X*'k >GpU*'k 6*)k*'k$-T-T*'k"k!k4ʫ)*'k"k!k5!k"5*)k"k!k4 S2~h:k-k~# )!h6R)C!b/B! h>Uʹ8]R&B!f>%Uʹ8]ͨ4!j&U!j!g_T2j:jW!RW!C>/E!Vb/B!g>Uʹ8]Rh!C>/E]!j6!"j*h"j*j*jk)"qk!mk͎5"!k*k@ "k*k#"k2'k&*'k"uk!sk4 S2~h:h:k(*)k "%k*'k6*'k 6*'k"yk!wk4 S2~h!k6:k~(!j/R#C!=b/B!}f>Uʹ8]ͨ4!j&U!j!j&U!AfjxuTT!j<5V!j5RyC!Bb/B!f> Uʹ8]>é )k"Ik!Gk4 S2~h͎4*h XͼX >@ogkX"k:h%!"!k*!k"#kR%C>/E!b/B!g>Uʹ8]*j"Kk!Kk/R3&C4~*)kw!shkxuT­#*'k {DT5gpU:xh#|4*j^#V X~2k#:xh2k!+kP5*'k"/k!-k͵Y$RV$C>/E!jb*C!b/B!b*k^#V XUʹ8]*k^#V+++|,R*C!b/B?!kVTc*>!ck>28}2k:kʍ*!k:k_ͼX/:j/!|4+*j X!]cxuTʸ!:j!!!:j!!*j#"jy!?":jr"R!C>/E![b/B!g>Uʹ8]!!"k"k*k+"{k*{k*kͼX/:k/{(*%k*k)"k!}k/5*'k"k!k 5Q(!k6g(*%k*k)"k!k͎5"#k*k@ "k*k#"k('*!RC!Gb/B!f>Uʹ8]ͨ4!j&U!j!Af_Tʹ͙4"j!j|4+*h X!]cxuT* *h|4*h X^#!b/B!g>Uʹ8!k>Uʹ8!Mk͓ʹ8!c>Uʹ8]:hW&RW&C!b/B!g>Uʹ8]*)k#"%k!k6!k6:k'!"k*)k~=2Qk/B!k>Uʹ8!c>U!1k͓Tʹ8*'k#>Uʹ8!af>Uʹ8*'k >Uʹ8!6g>Uʹ8]>*'k"5k!3k5!shkxuT|4*j8T~cpU!~ck>28}2k!kK8TG!k>pU!k*k&U:k*!k=TG!yh>_U!hh> pU,!k:kog++M8TG!yh>j/R!"C!`b/B!$g> Uʹ8]ͨ4!j&U!j!j&U!AfjxuT["͙4"j!j2~ho"!cjxuTo"!j6"R"C>/Ek*#kͼXʴ(!k6R(C>/E!b/B!g>Uʹ8]:k(R(C!b/B!g>Uʹ8]*'k 6?*'k"k!k5ñ)!shkxuT±)VͼX"h*h|4+++*h X^#VͼX"h*h+"h*h"j*h"j*j*jͼX |4*j X|4*j# X-T*j#"!Ok4|4*j^#V X"Rk!RkP5!"k*k+"Tk*Tk*kͼX/:k/ '*%k*k)"Xk!Vk/5*k@ "k*)k"\k!Zk 5'!k6*k" _U!k:kog#=TG!k>_U!kK!k28!]ck>28|Y+!kk!k28}2k:k}+!hk> lU+!kͼX"h|4+*k^#V X~c>GpUR1C!b/B!Oh>Uʹ8*h> $Sʹ8!Jh>Uʹ8*h> $Sʹ8!Mh>Uʹ8]*k"k!kʹ/a4|ʹ8!af>Uʹ8|4*k^#V X>Uʹ8]/^#V"k*k^#V*hͼX|/R/C>/E]*k6#6/*k^#V#r+s;0^#V"!]cxuT&.:k-|4*k X~2xh!k͓!yhGpU*h|4*k X^#V444ͨ4!l&U!mhlxuT/4ͨ4!l&U44!l6*l#"lp32!#l4 S2~hR`4C>/E]ͩ_^#V#Nd4WY *n:kog+M8T!h> DTpU!k:kog#=T!h > DTpU!h> DT͙4#>pU!h > DT͙4 >pU!h4*h# X"l͙4~*lw|4*h X*l#>GpU|4*h X*l >GpU*l 6*l 6R2C>/E]k*k^#V+|.0*h*ks#rR+0C>/E]:0*k^#V+r+s1^#V"k|4+*k^#V X!]cxuT0|4+*k^#V X]c>GX"h*h|4+++*k X^#VͼX"h4=.ͨ4!k&U!k6*k#"k]-:kk.Rk.C!b/B!h> Uʹ8]R|.C>/E]/**n{ozg̀4|g}o!\!l!3>d4Y!4* >  d4Yl4l4l4K> DTG!c>uT2h!hyh>VT9,!yhuh>[U:th2xhy,!]cyh>VTO,>2xhy,!yhU!h> Us8|l,>y,!yhUͰQ}2xh*ph:xh|4*h X"l!lP5!l4 S2~h*l#" l͎4*h XͼX >@ogkX" l* l> og7" l!l6!l6:l:l/A4!pU|4*k^#V X^#V*h"h|4+++*k^#V X^#V*h"hR1C!b/B!0h>Uʹ8*h> $Sʹ8!Jh>Uʹ8*h> $SR.C>/E]!"k*h"k*k*kͼX.|4+*k X!hxuT.R.C>/E!b/B!(h>Uʹ8]!k/!k>0*k#"kÝ.l4l4l4l4l4l4l4 d4Y l4d4yg)r5|g}!o f55x!ogͼX,>,,C!b/B?*k&U]*k!h>uT,>*k"k!k*k&U*kn& "k:rhog*kͼX*k+|,>"l"l* l+"l*l*lͼX/:l/`3* l*l"l!l/5*l "l!l 5V3!l6*l" l*l#"l3!"l"l* l+"l*l*lͼX/:lʹ8!Mh>Uʹ8]1^#V"k|4+*k^#V X!]cxuTˆ1*h|4*k^#V X^#VͼX"h*h|4+++*k^#V X^#V|7|{zͶ7|XDM̓XogX7QY,8QY!9ͫR/C>/E]ñ/^#V"kR/C!b/B!sh>Uʹ8|4*k^#V X"k!c>U!k͓Tʹ8|4*k^#V X>Ub5r#s#|5l4l45ң5_ҩ5go˜54*k}}.R&-C!b/B!c>Uʹ8]!k)2k:k8-:xhG-!k6L-!k6!k6!"k*h"k*k*kͼX/:kG.|4+*k X>4!"l!hh>S!jh>ST͠Q"l*l*lͼX/:l3* l*l*l!l>GpU!lhlxuT3!l63!!lͳ4*l#"lã3*l "l V+|73333$8!!ͫU/<|éXF98e8Oe8\8# i8G8d8D8glG:.l_:+lO x*`# Ⱦ¡>!i#9w$G:/`>x+->S>x+>-S>>+>-> 3B >x=>Gj?> "?Zʉ<* ͪ><:-l2-l:/lO:*lͪ>)>(<:)l2>h=:)l>=:)l͏>=:/lO:)lͲ>ͪ>)>9GC~#'CCyCO:|`*CsCͦC3C{;C*H`|dCj& *H`*7`ͼX#ͼX> ܮC> ܮCͦC> C{=>'ĮC!9ʕC=~GyOʕ: Xͬ:Æ::*`ҧ:Ϳ:Ø:y2.`ʳ:~#z0 0!2`_w!*`~:4_!`sXX2-`G:.`<2*`=X:`X@oW͈A##pAUAK0X *A0_X *AXK0w# 7AxUA͓A A{AGZkA+w`Ax͓ApAxO >ʬ8~ ʢ8ʛ8#Ï8#Ä8H o&>"`88BZ!988~#͢?8> ͢?8&99x2+`y 82,`:J` ??!9`x>?͙?>E> 6?>> ͢?(? H?xB?>͙?> S?j?>x]?>>=E]?ʗ?x!7`?͗?j?:.<:)l2-l:/lO> ͪ>)>.<:-lX=:*l05=:/lO> ͪ>b=:/l=O:)lͲ>ͪ>:/lO:*lͪ>:-l2-lb=:/lO:*lͪ>)>(<:)lV¦=:-lʔ=:-l2-l#'ŽC{>'̮CͮCyC{=>'ĮC{>b̮C*7`++|2m!mEɯC>C>2m"m"m`i"m!9"m! mCfm ~# C*fm~[D*fmB;;:`;!.`5!1`4X:,`G:+`(;!/`:>20`e;͢?!+`54;:,`!.`<_!`>w w>+W;!-`~5>.͝;G:0`x0„;:-`AX{Ao>g9##ͩAX ʓA ʓA XH½A!6l{Z> 3B AAHA AxA> BA AABx!7`B"%l9<;*%l“9x2+`=XA 29A2929G:+`=Xx2,`"%l9!.`F6!`~#V9x=21`;>E͢?:1`+o9-/ ͢??>25l!3l8E:H`ʾ?!7`Ҿ?> ?> ??22l!0lEA?y<>?= ?x@O)Bo͈A####Wp2>”=:/l=O:-lͲ>ͪ>:-l =<2-l->.<:/lO:)lp>=:-l=:)lB==:-l*=> ͪ>)>.<:/lO:)lC=D:/`=> ͪ> ͪ>>:)l~0D!`m>UG3!!!`ʹF!`"tm!rmxHXD!`m>UG3!R.!!`ʹF!`"xm!vmxHmD*hm"zm!zmxH!|mF*lm^#V!@`s#r*nm^> !/`~ʗ;5!-`4!*`5-20`x!*`^4{;Ҷ;!`~0>0"'l*`~2+l:/`;R>;X:+l2,l>V?>!,l;5~/o :2`<>9?><>*BA:H`BB:7`HB>2Dl!Bl8E!El{Z×BB^B^#VpBNB͗B3B#FiB#NiB#^#r+s#^#V++r+s~ x0͢?0͢?*%l9x2+`y2,`"%l9B;:+`!,`:͹;G9!9~#͢?ù9*%l9)B2`2/`22`<2*`!9ͬ: 9+9ͬ: :- A @60#1@E@>ew#.@e#@x1@͓A @{AGZ+y=\@x=T@0 \@60$^@w h@+6.$y=>@x=>@@x<C>ͪ> >Rͪ>>ͪ> >Bͪ>)>)>.<:,l*'l!/l4!.l4S+-$G:+lOx*`## I><>S?>>+?>>-?>>C?>>D?>:/,.B!#V!B`s#r*jm^#V'T|*P`'T|GʲD!mE*jm^#V}*P`}GD!mE:`D*jm^#V}*P`}GD!mE:`E?> < <*:,l!9q#=<">>2-l<2.l2/l͝;2*l:.l_:+l">*`~2)l:)l9<:-lo<:-l2-l2>o<:/l=O:-lͲ>ͪ>:/lO:*lͪ>)>(<3B53BB5^Bq#p3BOB4~ ҵB_Bs#r#s#r#q!B{ZBBa`BB Format Overflow*c`-&t`!flCO:`yC!:>2/`ͬ:Ͷ:":: : Ϳ:ͬ: :.9:ͬ:Ͷ:9:Ϳ:ͬ:*:eC:E†:ͬ:+S:ͬ:\:-\:ͬ:Ͷ:XGͬ:Ͷ:z:xGGGͬ:‚:@!9ͩA ̩A ʨ@ ʨ@w# XÐ@H !9 ʻ@+wð@xOo>g9x ͩAX @ @w#@)B=@<)B<_)BK)B  *jm^#V}E!mE^#V"m!a`"m*m"m!m{Z2m!m8E^#V"m:|`GE:~`sE*mpE*m5!m6:m mE͠E_ENEßE!mE*m F^ F^! n^r+s6 #6 ! n4^N*O|K}=ºKmKKJKO>~KK>LN*O|LYJ=KyKF^L;<>[]y *OeI ͏IÛIeI$͏IeI1ڽI o&))))\xH  I#w I͏I͕I*O# JA JG͏I~G~#~O?:P#~:P! p! y! q<>P<ͺOɯ~#N#F#w#q#pͱO͡O~hP#!!@P! 6?<ʣP=))|G*m6#6âG*m6<#6*m6#6*m6#6*m6#6*m 6*m^#V}oQ}2m*m^#V}G!m44*mDNÂO(ICIʂO~WK>DNʂO*O~,N>ÂO5NPÂO*O!*~!/2O*O|YN(^#V^I^I{zlNzN2OzʛN:OE*m5!?`6!mE:?`ʜE*m6yEH2m:mE!a`"m!"m!m{Z!7`6#6!m6 :`E!mE^#V"m!3`"m*m"m!m;MF!a`"m!>~L=L>Lq2O*O/"OMKrL{WKFK*O*O#:OO[LFK#s#rdL`KMK4LWKLFKr+s{ƒL!eI:J 6Jp4͏I+ͧI8J#eIDJ#*0J6?4Jw͏IJeIKJ͏I8J#6 DJ.„J͏I ͧIxJeIʄJ#*pJ6?tJw͏I_JeIʋJ͏ _!xڗPPFNvPwxG>O>G!$q#p#6P"_n"bn2anx2dn͡O2enͱO!an~5iQO Q=6Q:dn6Q*bn^#V}H>2m*m^#V}:H*m~#:H*m6#6*m"m*m"m*m"m!m͛L*m^#V|wH*m"n!"n!m{Z^#V^#VNͧKqÖNNK#vN*O|N*~N=!ON:OLNNwíNM>(ICIʂO|}ʂO~> ҂O<ÂO(ICIʂO|O*"m!m{ZFóF:|`F*m~ ,F*7`#"7`óF*m~ @F!7`6#6óF:`F*m~ bF*;`#";`!9`6#6óF*m~ ³F*9`#"9`!9`#F!9`6O4*O+>|ʒL+}o(I2I~2O2I"OCI:OҡMJLG:OҡM*OpL4#6ÂO^I:OL͌L*O++"OL}+L͒L}|2O"IxJ#6 „J%#6J*O##^ ~?¤J# JxCON CON RDR PUN LST M!J ~͕I$Gx|g}o0^:c`ڕH!H{Z2c`O!t`¤H6éH +~#w!d` s#r!c`4]HHa`HH I/O Stack Overflow:?`H!3`" n!nͫMH!n6I:?`2nOw=ÂO*O_*O^#V6+6++ͽYÂO(IUIʂO>҂O"N#F#~2Iq#p#w>ÂO(IUIʂO>‚O*~^I!qO=cO>!*O" s#r#w=#6*9`*J`#ͼX|³F!a`"m!"m!m{ZFE!?`6"m!9"m!mF! 9^m~# F*m^#V|F*m*m -TO^I͌L"O1'Y|ʡM##"O6*Os#rI O{ O*O:Ow?M6bM*O"Oɯ*O+>K^#VFK#{#z>K6#6FK r+s! nF#~ڝK! n6P vQ"gn>3R*gn"in̓QͰQ*in"in̓QͰQ*inG!9!x R R+Q$%XgR-Q0X:X0T])X)XX)Xo|!?`6:n I*7`#"7`:n $I!7`6#6:n"O"O*O^#V#"O^#V2I>I"O>I"O|CI|~2I>IyasIA =.:O*O }!fn6 4>2en*bn!4#4#4~#N#F#y#x#:en*bn!!:dnOOҺO:fn*m nb"G*m !m>lUU*mT!m&U*m~#hG*m^#V)))|hG*m6P#6*m~#¢G*m^#VOw# „M*O~#LP*O^>ÂO*Ow#wÂO(ICIʂOͧK2IqÂO(ICIʂO2INKÂO*O~" 4#4#4(ICIʂO~M5N;PʂOWK> gXþQ{R$%X}R|Xz-̩Xo&9}O!9 w#AR60#60! 9~ pR!97>?'w#aR-!9~͵RʉR~Xx>X!>)ҖX ҞX=ʧX)ÐXɯo>g^#V#N#F{ozg||/=!X{ZXXXXX Conversion2Y!X{ZXYYYWͩXDM>!=))ҍV ÓV͞V|g}omWVQWV͌W2zn"{n!}nr#q#p͌W*{n"{n!znw!nr#q#p:~nG:n=X:nG:n=X:}nG:n=XBADG!`~/]]_ Condition Stack Overflow$4Ox!n w#s#r#s#r!9!` s#r!`N!n +++++h]#{]#zʆ]T#ʙT ‚T T > #ÙT!9Oo>gyͽT~#o>gxGTGpUwF#"knxUT*kn!9G_>WObk++͛[>[>(@[yw[>)@[|![3[\|-[3[͛[ͭ[é_>,@[>[> _F^ F^ F^0:@[@[N[N[>[|\[}\[ ڇ[d#͵RvR! 9~.›R+60çR0§R6 #R+r>o&9y>o&90w+R6.!9͌W}!RX/[>#@[*n>=^#V#h[[[>: iXog|X>"S)X=S|/G!͇S mS>0|S rS>-5Y4zY{ڸY##^#V# ##s#rs#r#s#r+++~sw#r####}*n}|,Z*{z,Z+F+N+V+5^{2Z{z2Z}|2Z{ Z Zi`~33333333###~›WGOW_goހ_W+~G~+N+f.zWzW ))WW}W$WWWxWWW> Y>Yyƀ.~# ^*P`)))))|` )| ^*3`|}*`"7`:c`*a`3`w# =^*`{ W^ [^!#"`Í^Copyright (c) 1980 Digital Re |U 6 #ÇUo&9DM^#V#_ + wžUmWU͌W2mnxU>XͩX#"nn"xn`i"vn͌W*nn"nn!mnw`i"pn͛V͞V"rn*pn*vn͂V"pn\>?@[!f\͛[͛[>=@[^#V|8\}/\.))\Û[#F>A[> #S\~ >.[~ [=D\^#V# File: Traceback:\\3~ST]))ԇS寕iO>`G>0 ҪS<âS DM0 > og|SͩX!ͰWSw#sw#r##q#p i`N#F#^#V~2Zq4#p+i`##s#r8Z_TZ_ FREE Request Out-of-Range$ Free Space Overwrite$GKғZMbkÓZ`\FGOS\{E=XD=XzE=XD=X\e. +X 1XS\e. ?'w# Tȇ!T)'Tyw# -T~#DT~#WZ!a`{#z*@`*B`]xyxZD[_!|\^#V  #"n*nDM!nx~Ÿ_#~+Ÿ_+F+Nq#p*n+"nʚ_ҝ_=P_!+~O~#~G!>w!/xx_yʕ_ >O6# o_ r.U: Untag a file.V: View a file at console.X: Exit to CP/M.?: Redisplay menu.sp or cr: Next file.Drive New name or * : ABC ToDEMRTUV???????????? Files occupying k(k remaining) Which******k remaining on Drive : NewSWEEP versji1jiijjXjyfjj{j              directory. drive0123456789#****Aborted.Tagging Total of tagged files = k (k) Total of tagged files = ( __=ɯ ~#fo++_!n~#_*n_©____  Insufficient Memory$ Invalid I/O List End of ExeCannot rename. already exists.File is R/O. Okay to rename?(Y/N)YO.K. to rename Renaming ====> . ? Old name: New name: ision 3.6 - July 2, 1982by Robert FisherDePaul UniversityChicago, IllinoisCommands:A: Again. Retag # files.B: Backup to last filjjjjjjjhjjjjjjj   thhh hhhhchchhhwhhhhh02h +hh<h> J h chicution$ ` 8 8 8 R/O. Delete anyway?(Y/N) Deleted. Delete? (Y/N):Erase tagged or untagged files? (T/U) : Do you wish to be prompted? (Y/N) :e.C: Copy file with optional verify.D: Delete file.E: Erase all tagged/untagged files.L: Login new disk and user and reset sk/kk5k9kk?kCkIkkQkXk\k`kkgkkk!kqkukykk  and user (and v to verif ./i-&')*+(%12c0iRitiSYSINSYSPRINT  NType A at prompt to abort.Erase ?(Y/N/A)Erasing $is R/O. File not copied. is R/O. File not copied. Out of directory spaceCystem.M: Mass copy of tagged files with optional verify.R: Rename file(s).S: Space remaining on disk.T: Tag file for transfek#kkkkk'kkkkkckxhkkkky): and user: : Sorry, CP/M2.2 is required.??*1234567890 No files. . k :LSX iihieyiiiiiii    $ ' '   opying =====> with verification CRC check failed. Error. Disk full. Warning: source = target. Re-log drive for an accurate ! lllll2l5l>l?la`@lDlMlNla`OlQl Invalid Format Itemnmmmmmm Stream/Record Sequen/Direct Input/Output Keyed Access P< $contmxm3`Tmm*m8mFmdmemmm mmmmm mmmmmmmm.datmmmmmnn nn" # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L