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 MACIåSWEEP36 COM€JKLMNOPQRSTUVWXYåSWEEP36 COM\Z[\]^_`abcdeååååååååååååååååååååååååååååååååååW 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 (PORT0åEI 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 PROCESåEI ;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 WIåERRUPT 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 LåEXAMINE/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 STACåc>GÍpUÍ�4#ë!hcxÍuTÂ,ÍI52th!“hÍ“!uhÍÍUõÍ™4#ñÍÛT!‡h Í&UÍ×4ÍLÍÉÍ?Íw5!|h6€:|h·ò9!ƒh~#¶Â�RŒÍÄC!ø`Í/B!jååMONCOPY 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ÍÜ]ÃR·ÍÄC!ÿ`Í/B*…h> Í$SÍ´8!tc>ÍUÍ´8ÍÜ]!•hÍ/RÍÄC! aÍ/BÍ|4ûÿå*…hÍ XÑ^#Vë> Í$SÍ´8!vc>ÍUÍ´8Í|4+å*…hååUDE 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}hxÍuTÆÿŸ!ƒhõ~#¶ÖŸÁ !zc}hõxÍuTÆÿŸÁ !{c}hõxÍuTÆÿŸÁ ò‹RˆÍÄC>Í/E!|c>ÍåÍ`^>2rh!"phÍÒ4å!ÑÍÌ7|µÂ;R8ÍÄC!@c>ÍUÍôBÍÜ]Í¥4Í™4~·ÂRÍ*5o‡Ÿg#}õÍ™4ñwÍ™4~o‡Ÿg@ }õ3>!shÍ&UÍ�4#ë![cxÍuTÂ�>ÿ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 DEFSUÍôBÍÜ]Ã6!~c}hxÍuTÖŸ!c}hõxÍuTÖŸÁ°ò¸!šhÍ´/Ã6!€c}hxÍuTÂÍÍ€.Ã6!�c}hxÍuTÂå!œhÍû/Ã6!‚c}hxÍuTÂDRÍÄC!aå!uh]c>Í_UÃ,Í�4#åÍ�4#>ÍU!^cõ> ÍUÍs8+Má>ÍDTëG!uh>Í_U!hcuh>ÍVTÊú!uhÍUͰQ}2th*phë:tho‡ŸgͼXò÷Í�4#hc>GÍpUÃÍ�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ÍÜ]!¦h‰c>ÍpU!¢hÍÌ)2§h!žhÍÅ"2~hRAÍÄC>Í/EÍÜ]Ã6!‰c}hxÍuTÂYÍÃ6!Šc}hxÍuTÂnͬ Ã6!yc}hxÍuTƒÍ4/B!¿c>ÍUÍ´8ÍÜ]!úhÍÌ)2ùh:ùhÖÿ¢ É:ùho‡Ÿg+"i!þhÍ> "õh!œcͱX*nh##~o‡Ÿg+++ÍÝ7*õhÍÀSͦVÍÏR"õhR) ÍÄC>Í/E!7aÍ/B!Èc>ÍUÍ´8*õh> ÍÉÃp Í™4~o‡Ÿg+"ñh!ïhÍ> "ëh!œcͱX*nh##~o‡Ÿg+++ÍÝ7ÍÏR"éh*éhå*ëhÑÍ X"ëh!"íh#"áh*ƒh"óh*óhë*áhͼXúí Í|4úÿå*áhÍ XÑ~o‡Ÿg"åhÍ|4øÍ_TÒ*-i#"+iÃ*-i+")iæ*ƒhë*+iͼXò-!"+i*+iÉÃ�RQÍÄC!EaÍ/B!ïc>ÍUÍ´8ÍÜ]!1iÍÌ)2/i:/iÖÿÂcÉ:/iõÍ™4ñw!sh0i>GÍpU:xh2th!uå*ƒhÍ XÑñÍ&UÍ¡4 :®håo‡Ÿg)))))Ñ~õÍ|4ùÿå*ƒhÍ XÑñwÍ¡4:®håo‡Ÿg)))))Ñ~õÍ|4øÿå*ƒhÍ XÑñw:¯hõÍ|4÷ÿå*ƒhÍë*iͼXúë *iìÿå*iÍ XÑå*iÑxÍuTÒ5 *i#"ià *iå*iìÿå*!iÍ XÑÑxÍuTÒ` *!i+"!iÃ5 *!ië*iͼXúè *iå*iìÿå*iÍÃ6!‹c}hxÍuT˜Í -Ã6!Œc}hxÍuT­Í)Ã6!zc}hxÍuTÂÂÍs Ã6!�c}hxÍuTÂà!¨hÍ>0!ªhÍ´/Ã6!Žc}hxÍuTÂø!¬hÍ1Ã6!�c}h$SÍ´8!Îc>ÍUÍ´8!øh>ÍUÍ´8!ãc>ÍUÍ´8ÍÜ]R: ÍÄC>Í/EÍÜ]ÉÃê ^#Vë"i*i~2i!iÍÜ4ÍD5"nhÍ75"i*nh^#Vë>åo‡ŸgÑÍkX#"i*nh^ÿå*áhÍ XÑ~o‡Ÿg)))))åÍ|4ùÿå*áhÍ XÑ~o‡ŸgÑ"ãh:æh·òJ !"åh*ãh#"ãh*ãh))))"ãh*åh >åo‡ŸgÑÍkX"çh*ãhë*çhåÍ|4+++å*áhÍhyh>Í[UÍÉÍ?ÉÃó^#Vë"5i*5i~o‡Ÿg>Í$S!:iÍ&U*5i~o‡Ÿgöÿ |·òÖ!:i{Í?TëG!7i>Í_UÃê!:i>Í?TëG!7i>Í_U!7iÍUÃ�UÃH^#Vë"Bi*Bi XÑñwÍ¡4:®håo‡Ÿg)))))Ñ~õÍ|4úÿå*ƒhÍ XÑñwÍ|4+å*ƒhÍ XÑ~c>GÍpUÍý42®hÃ!¯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å*!ixÍuT Íþ1Ã6!�c}hxÍuTÂ"ÍÉÃ6!{c}hxÍuTÂ6!|h6Ã_Í¥4Ãx!�c‡h >Í98|µÂqÍ™4#‘c>GÍpUÍ™4 ™c>GÍpUÃ~!‡hœc> Í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ìÿå* XÑÑs#r*çhë*éh+å*éhÑÍkXå*éhÑÍ X"çh*ãhë*çhåÍ|4ûÿå*áhÍ XÑÑs#rÍ|4ûÿå*áhÍ XÑ^#Vëë*íh"íh*áh#"áhÃÓR+ ÍÄC!aÍ/B*ƒh>"Di>2Fi*Bin&}2Gi:Gio‡Ÿgë:Fio‡ŸgͼXú?*Di:Fiåo‡ŸgÑ>¦w!Fi4Ã*BiÍUÃ�UÞ^#Vë"Hi*HiÍU!~cõ>ÍUÍs8"Ji!Ji~#¶Ê’*Hiå*JiëáÍ=TëG!R¶Â…É!"Ûh#"Ýh*ƒh"ßh*ßhë*ÝhͼXúzÍ|4ìÿå*ÛhÍ XÑåÍ|4ìÿå*ÝhÍ XÑÑxÍuTÆÿŸõÍ|4ôÿå*ÛhÍ XÑåÍ|4ôÿå*ÝhÍ XÑÑxÍë*#iͼXÑͼXòC*#iå*iüÿå*i))ÑÑs#r*!iå*i++å*i))ÑÑs#r*i"#iÃu*iå*iüÿå*i))ÑÑs#r*%iå*i++å*i))ÑÑs#r*!i"%iï Ãt ÉÃ1^4 6?Í™46?Í™4~=2·h!µhÍÜ4:th·ò²¯2±h:ph2°hþ:th2±h:th2°hÍ¡4"ºh!¸hÍ/5!"ƒh:±h2¯h:°h2¼h:¼ho‡Ÿgë:¯ho‡ŸgͼXú\!½hÍP5Í™4"Áh!¿hƒh#Í 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!2aÍi> Í_U!PiÍ¡Ã�UÃ�!öc>ÍUÃ�UÉÃ^#Vë"_i!ai6!"ni*_in&"pi*pië*niͼXúù*_iå*ni]áÍ8TëG!ti>ÍpU!riÍ!ai Í£T*ni#"niü!aiÍUÃuTÆÿŸÁ°õÍ|4÷ÿå*ÛhÍ XÑ~õÍ|4÷ÿå*ÝhÍ XÑñ–ÆÿŸÁ°òA*Ûh#"ÛhÍ|4ìÿå*ÛhÍ XÑåÍ|4ìÿå*ÝhÍ XÑëáÍ-T*Ýh#"ÝhÕ*Ûh"ƒh#Vë"'i*'ië!äc xÍuTš!É*ƒh")i!"+i*)ië*+iͼXú*+ië*)i>åo‡ŸgÑÍkX"-iÍ|4ôÿå*-iÍ XÑ>ÍUõÍ|4ìÿå*-iÍ XÑñÍÛT*'i Íõ42®h:®hÖÿÊU*ƒh#"ƒhÍ¡4#:®håo‡Ÿg)))))Ñë!Åh>GÍ_U!ÃhÍöõÍ|4ìÿå*ƒhÍ XÑñÍ&UÍ¡4 :®håo‡Ÿg)))))Ñë!Ðh>Í_U!ÎhÍöõÍ|4ôÿiüÿå*i))Ñ^#Vë"#i*i++å*i))Ñ^#Vë"%i*i+"i*#ië*%iͼXòx*#i"i*%i"!i*ië*!i>åo‡ŸgÑÍkX"i*iå*iìÿå*iÍ XÑëáÍ-T*!i �UÃI^#Vë"ui*uin&"wi*wiŸÿ |/*wi… õ|Á ò>*wiàÿ }õ3>*uiGÍ&U*ui>ÍUÃ�UÃÆRiÍÄC!JaÍ/B!öc> ÍUÍ´8ÍÜ]R‹ÍÄC>Í/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 Ñ>GÍpU*Äi 6?*Äi�c>GÍpU*Ài> ÍDTå*ÄiGÑ>ÍpU*Ài > Í?Tå*ÄiGÑ>ÍpU*Äi6*Äi6?*Äi�c>GÍpUÍ|4*”jóÿ |·òe*�jå*”j]á> ÍDTå!–jõå*”j]á> ÍDTÁÑÍuTÆÿŸ*�jõå*”j]á> ÍDTëG!�c>ÍuTÆÿŸÁ ò[¯É*”j#"”jÃ>€Éò^#Vë"£j*£jë!af>Í28"¥ ÍÄC>Í/E!¿aÍ/B!®e>ÍUÍ´8ÍÜ]RÂÍÄC>Í/E!ÆaÍ/B!¿e>ÍUÍ´8ÍÜ]RäÍÄC>Í/E!ÍaÍ/B!Òe>ÍUÍ´8ÍÜ]R%ÍÄC>Í/E!ÔaÍ/B!çe>ÍU!TjÍ3!Xj Í&U!NjÍ*j#"jÃéR/ÍÄC>Í/EÍÜ]ÉÜdj~# Â8Í|4ôÿå*fj^#VëÍ XÑ>ÍU!afõ>ÍUõÍ|4ìÿå*fj^#VëÍ XÑñ>ÍUÍ´8ÍÜ]R¨ÍÄC!XaÍ/B!&d>ÍUÍ´8ÍÜ]RÅÍÄC!_aÍ/B!7d>ÍUÍ´8ÍÜ]ÉÃ&RëÍÄC>Í/E!faÍ/B!Hd> ÍUÍ´8ÍÜ]RÍÄC!kaÍ/B!Qd>ÍÍUÍ´8ÍÜ]!ÆiAf>GÍpU*Âi~·òTR;ÍÄC!bÍ/B!bf>ÍUÍ´8ÍÜ]ͨ4!âiÍ&U!àiÍ!ÆiÍ&U!AfÆixÍuT»*Äi"åi!ãiÍ"5*ÄiåÍ|4ìÿå*÷ÿå*¾i^#VëÍ XÑ"Ëi!ËiÍP5*Äi"Ïi!ÍiÍõ4ÖÿÊ¥R¤ÍÄC>Í/E!ãaÍ/B!f>ÍUÍ´8!sh>ÍUÍ´8Í|4÷ÿå*¾i^#VëÍ XÑ"Ñi!ãc>ÍU!Ñj!¥j~#¶Ê½*£jå*¥j+MáÍ8TëG!©j>ÍpU*£jå*¥j#ëáÍ=TëG!±j>ÍpUÃÕ*£jë!©j>ÍlU!±jzf>GÍpU!´j6!"§j*§j÷ÿ |õ:´j/Á ò4!©jå*§j]á>ÍÍ´8!sh>ÍUÍ´8!uhÍUÍ´8!ãc>ÍUÍ´8ÍÜ]ÉÃÍ™4~=2’i!�iÍÜ4RTÍÄC!ÙaÍ/B!íe>ÍUÍ´8ÍÜ]�qÍÀC!ÞaÍ/BÍÏ?!yiÍÍ28"Ži!ÍÛTÍíT!lj Í&U!"hj*hjóÿ |·òë*djå*hj]á> ÍDTëG!xj>ÍpU!�cxjxÍuTÊá!ljå*hj]á> ÍDTxjÍpU*hj#"hjÔ!"jj"hj*hjóÿ |·òRUÍ´8ÍÜ]R*ÍÄC>Í/E!raÍ/B!jd>ÍUÍ´8ÍÜ]RLÍÄC>Í/E!yaÍ/B!‚d>#ÍUÍ´8ÍÜ]RnÍÄC>Í/E!€aÍ/B!¥d>ÍUÍ´8ÍÜ]R�ÍÄC>Í/E!‡a;i^#VëÍ XÑÑ>GÍpU*ÄiåÍ|4ôÿå*¾i^#VëÍ XÑÑ>GÍpUÉÃ0RáÍÄC>Í/E!$bÍ/B!ef> ÍUÍ´8ÍÜ]�þÍÀC!)bÍ/BÍÏ?!çiÍ ÍUÍ´8!f>ÍUÍ´8ÍÜ]É!Ói͵·ò'RÌÍÄC!ôaÍ/B!f>ÍUÍ´8ÍÜ]*¾i"Õi!ÕiÍ/RõÍÄC!ûaÍ/B!$f>ÍUÍ´8ÍÜ]ͨ4!ÙiÍ&UDTëG!]c>ÍuTÂ*!´j6€!©jå*§jëá>Í?T‘cÍpU*§j#"§jÃà!´j6!"§j*§jüÿ |õ:´j/Á ò“!±jå*§j]á>ÍDTëG!]c>ÍuT‰!´j6€!±jå*§jëá>Í?yiå*Ži#ëáÍ=TëG!•i>Í_U!“iÍK!yiÍÍVT¶ÉÃ!]cyi>Í28|µÆÿŸ!�cyiõ>Í28|µÆÿŸÁ°òâÍ¿ÃRóÍÄC>Í/EÍÜ]!°iÍk!²i Í&!ljå*hj]á> ÍDTëG!xj>ÍpU!~cxjxÍuTÊH!ljå*jj]á> ÍDTxjÍpU*jj#"jj*hj#"hjÃô*jj"hj*hjóÿ |·ò†!ljå*hj]á> ÍDT~cÍpU*hj#/B!µd>$ÍUÍ´8ÍÜ]R²ÍÄC>Í/E!ŽaÍ/B!Ùd>-ÍUÍ´8ÍÜ]RÔÍÄC>Í/E!•aÍ/B!e>3ÍUÍ´8ÍÜ]RöÍÄC>Í/E!œaÍ/B!9e>ÍUÍ´8ÍÜ]RÍÄC>iå!ãcçi>Í28#ëáÍ=TëG!j>Í_U!jÍK!çiÍÍVTÂ:É!-jÍk!üi Í&UReÍÄC!.bÍ/B!of> ÍUÍ´8ÍÜ]�‚ÍÀC!3bÍ/BÍÏ?!çiÍÍUÍ´8ÍÜ]ÃlRlÍÄC!bÍ/B!Qf> ÍUÍ´8ÍÜ]*¾i"Üi!ÜiÍ/R•ÍÄT™cÍpU*§j#"§jÃ?!±j>ÍU!afõ>ÍU!©jÍÛTÍíTÃ�UÃ^#Vë"µjÍ¡4"ºj!¸jÍ/5*µj"¼j!¼jÍõ42·j:·jÖÿÂá¯É>õ3>õÍ¡4 :·jåo‡Ÿg)))))ÑñU!ªiÍRÍÄC>Í/EÍÜ]Éü¾i~# Â!Í|4ìÿå*ƒh#Í XÑ"ÄiÍ™4~*ÄiwÍ|4ìÿå*¾i^#VëÍ XÑå*Äi#Ñ>GÍpUÍ|4ôÿå*¾i^#VëÍ X"hjÃX!{jlj> Í_U!yjÍkÃ�UÃh�j~# ¤Í|4ôÿå*’j^#VëÍ XÑ>ÍU!afõ>ÍUõÍ|4ìÿå*’j^#VëÍ XÑñÍÛTÍíT!–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Ü]R“ÍÄC>Í/EÍÜ]!çiå!ãcçi>Í28#ëáÍ=TëG!1j>Í_U!/jÍK!çiÍÍVTÂÏÉ!FjÍk!j Í&U!"j*ƒh"Hj*Hjë*jͼXú!JjÍŸ·ò Í_TÒ >€ÉïÉÉÃ|¾j~# ÂÍ|4ìÿå*ƒh#Í XÑ"Âj*Àj~*ÂjwÍ|4ìÿå*¾j^#VëÍ XÑå*Âj#Ñ>GÍpUÍ|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!ùjÍ2~hÍÈ4·òÀ"ͨ4!àjÍ&U!âj6€ÉÉÃÉ)ýj~# ÂÊ"*ÿj~ÖÿÂÝ"¯É*ÿj~o‡Ÿg@ }õ3>!kÍ&UÍ|4ìÿå*ƒh|4÷ÿå*ýj^#VëÍ XÑ~!k–ÖŸõ:thÁ°òT)RT)ÍÄC>Í/E! bÍ/B!Çg>#ÍUÍ´8!êg> ÍUÍ´8ÍÜ]Í|4÷ÿå*ýj^#VëÍ XÑ~!k–ʱ)*'kå*)këájÃ= *ƒhë*…hͼXò¨ R¢ ÍÄC>Í/EÍÜ]!"…hÉÃÂ"RÎ ÍÄC>Í/E!LbÍ/B!³f>)ÍUÍ´8ÍÜ]ͨ4!èjÍ&U!æjÍ!�cÍ_TÖŸ2åjR!ÍÄC>Í/E!QbÍ/k*k#"kó&!"k*'k~=2`k!^kÍÜ4!akÍP5!"k*k+"ck*ckë*kͼX/õ:kÁ ò¥'*%kå*k)Ñ"gk!ekÍ/5*'k"kk!ikÍ5ÖÊt'!k6!k6€:’h·ò‘'*%kå*Ñ>GÍpU*Âj 6?*Âj�c>GÍpU*Àj~=2Çj!ÅjÍÜ4Í|4÷ÿå*¾j^#VëÍ XÑ"Èj!ÈjÍP5!Êj͵·òVRúÍÄC>Í/E!8bÍ/B!f>ÍUÍ´8ÍÜ]*¾j"ÌjÍ´8!Ng>ÍUÍ´8ÍÜ]>€É*)k"?k!=kÍ5*'k 6*)k6*'k"Ck!AkÍ5ÖÿÂ_%R]%ÍÄC!‚bÍ/B!gg>ÍUÍ´8ÍÜ]¯ÉÍ|4÷ÿå*ýj^#VëÍ XÑ"Ek!EkÍP5*#Í XÑ"'k*'k#")k*ÿj~*'kwÍ|4ìÿå*ýj^#VëÍ XÑå*'k#Ñ>GÍpUÍ|4ôÿå*ýj^#VëÍ XÑå*'k Ñ>GÍpU*'k 6*)kå*'këá$Í-TÍÍ-T*'k"‘k!�kÍõ4ÖÿÊ«)*'k"•k!“kÍ5!—kÍ"5*)k"›k!™kÍí4Í S2~h:kÉÃ-�k~# ÂÑ)!’h6Rû)ÍÄC!¥bÍ/B! h>ÍUÍ´8ÍÜ]R&B!Üf>%ÍUÍ´8ÍÜ]ͨ4!ëjÍ&U!éjÍ!gÍ_TÆÿŸ2áj:áj·òW!RW!ÍÄC>Í/E!VbÍ/B!g>ÍUÍ´8ÍÜ]Rh!ÍÄC>Í/EÍÜ]!âj6!"ãj*ƒh"ìj*ìjë*ãjk)Ñ"qk!mkÍŽ5"!k*k@ "k*k#"kÃ2'Ãk&*'k"uk!skÍí4Í S2~h:’hõ:kÁ ò´(*)k "%k*'k6*'k 6*'k"yk!wkÍå4Í S2~h!k6:k·ú~(!ÌjÍ/R#ÍÄC!=bÍ/B!}f>ÍUÍ´8ÍÜ]ͨ4!ÐjÍ&U!ÎjÍ!ÄjÍ&U!AfÄjxÍuTÂT!ÑjÍ<5ÃV¯É!ÓjÍ5RyÍÄC!BbÍ/B!šf> ÍUÍ´8ÍÜ]>€Éé )k"Ik!GkÍå4Í S2~hÍŽ4å*ƒh Í XÑͼXÜÿ >@åo‡ŸgÑÍkX"k:’h·òÉ%!"!k*!k"#kRë%ÍÄC>Í/E!‡bÍ/B!g>ÍUÍ´8ÍÜ]*ýj"Kk!KkÍ/R3&ÍÄC™4~*)kw!shkxÍuT­#*'k {ÍDT5gÍpU:xh·òÒ#Í|4÷ÿå*ýj^#VëÍ XÑ~2kÃØ#:xh2k!+kÍP5*'k"/k!-k͵·òY$RV$ÍÄC>Í/E!jbÍ*ÍÄC!ªbÍ/B!Èbå*�k^#VëÍ XÑÍUÍ´8ÍÜ]*�k^#Vë+++|·ò�,�R*ÍÀC!¯bÍ/BÍÏ?!¦kÍÍVTÂc*>ÿÉ!ãc¦k>Í28}2¤k:¤k·Ê�*!¦k:¤k_ͼX/õ:âj/Á òÌ!Í|4+å*ãjÍ XÑë!]cxÍuTʸ!:åj·úµ!ÍÕ!ÃÂ!:åj·òÂ!ÍÕ!*ãj#"ãjÃy!ÍÉÍ?ÃÁ":áj·òr"Rþ!ÍÄC>Í/E![bÍ/B!g>ÍUÍ´8ÍÜ]!î!"k"k*k+"{k*{kë*kͼX/õ:k/Á ò{(*%kå*k)Ñ"k!}kÍ/5*'k"ƒk!�kÍ 5ÖÊQ(!k6€Ãg(*%kå*k)Ñ"‰k!…kÍŽ5"#k*k@ "k*k#"kÃ(Ãù'*!RœÍÄC!GbÍ/B!£f>ÍUÍ´8ÍÜ]ͨ4!ÙjÍ&U!×jÍ!AfÍ_TʹÉÍ™4"Üj!ÚjÍ·úÊÉÍ|4+å*…hÍ XÑë!]cxÍuTÂ* *håÍ|4ûÿå*…hÍ XÑ^#!ŒbÍ/B!‡g>ÍUÍ´8!k>ÍUÍ´8!Mk͓ʹ8!ãc>ÍUÍ´8ÍÜ]:’h·òW&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!3kÍ5!shkxÍuTÖŸõÍ|4÷ÿå*ýjÍ8T~cÍpU!~c¦k>Í28}2¤k!¦kKÍ8TëG!½k>ÍpU!»kÍ*ŸkÍ&U:¤k·Âæ*!¦kÍ=TëG!yh>Í_U!‡hh> ÍpUÃ,!¦k:¤kåo‡Ÿg++MáÍ8TëG!yh>jÍ/R!"ÍÄC!`bÍ/B!$g> ÍUÍ´8ÍÜ]ͨ4!òjÍ&U!ðjÍ!àjÍ&U!AfàjxÍuTÂ["Í™4"õj!ójÍ2~hÃo"!€càjxÍuTÂo"!â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!‹kÍ5ñ)!shkxÍuT±)Í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#"Õ!OkÍÜ4Í|4÷ÿå*ýj^#VëÍ XÑ"Rk!RkÍP5!"k*k+"Tk*Tkë*kͼX/õ:k/Á ò '*%kå*k)Ñ"Xk!VkÍ/5*k@ "k*)k"\k!ZkÍ 5ÖÊ'!k6€*k" Í_U!¦k:¤kåo‡Ÿg#ëáÍ=TëG!Àk>Í_U!¾kÍK!¦kÍÍ28å!]c¦k>Í28Ñ|µÊY+!ÕkÍk!¦kÍÍ28}2¤k:¤k·Â}+!‡h¦k> ÍlUÃÇ+!¦këÑͼX"�hÍ|4+å*ýk^#VëÍ XÑ~c>GÍpURî1ÍÄC!Þ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ë"ë!]cxÍuTÂ&.:Þk·òº-Í|4÷ÿå*ÙkÍ XÑ~2xh!åkÍ“!yhÍGÍpU*håÍ|4ûÿå*ÙkÍ XÑ^#VëÑÍÍÈ4·ò44ͨ4!lÍ&U!mhlxÍuTÂ/4ͨ4!lÍ&UÃ44!l6*l#"lÃp3Ãò2!#lÍí4Í S2~hR`4ÍÄC>Í/EÍÜ]ÉÍ©_^#V#ëNëÉÍd4WYÉå ÍáÉ*ÛnÉ:¤kåo‡Ÿg+MáÍ8Tå!‡hõ> ÍDTÁÑÍpU!¦k:¤kåo‡Ÿg#ëáÍ=Tå!‡h õ> ÍDTÁÑÍpU!‡h> ÍDTåõÍ™4#ÁÑ>ÍpU!‡h > ÍDTåõÍ™4 ÁÑ>ÍpU!‡h4ìÿå*ƒh#Í XÑ"lÍ™4~*lwÍ|4ìÿå*…hÍ XÑå*l#Ñ>GÍpUÍ|4ôÿå*…hÍ XÑå*l Ñ>GÍpU*l 6*l 6R€2ÍÄC>Í/EÍÜ]ùk*ùk^#Vë+|µÂ.0*ƒhå*ùkÑs#rR+0ÍÄC>Í/EÍÜ]Ã:0*ùk^#Vë+ër+sÉÃ1^#Vë"ûkÍ|4+å*ûk^#VëÍ XÑë!]cxÍuTÊÈ0Í|4+å*ûk^#VëÍ XÑ]c>G¼X"h*�håÍ|4+++å*ÙkÍ XÑ^#VëÑͼX"�hÍÈ4·ò=.ͨ4!ÝkÍ&U!Ük6*Ùk#"ÙkÃ]-:Ük·úk.Rk.ÍÄC!¾bÍ/B!h> ÍUÍ´8ÍÜ]R|.ÍÄC>Í/EÍÜ]ÉÃ/*ë*Ûn{•ozœgÉÍ€4|·g}oÉ!\É!lÉ!€ÉÃÍáõ3>éÍd4YÃ!Í4å*é Í·È>ÿÉ Ã ÃÍd4YÃÍl4ÃÍl4ÃÍl4ÃÃK> ÍDTëG!�c>ÍuTÖŸ2’h!hyh>ÍVTÂ9,!yhuh>Í[U:th2xhÃy,!]cyh>ÍVTÂO,>ÿ2xhÃy,!yhÍU!hõ> ÍUÍs8|µÊl,>ÿÉÃy,!yhÍUͰQ}2xh*phë:xhÍ|4÷ÿå*…hÍ XÑ"l!lÍP5!lÍå4Í S2~h*l#" lÍŽ4å*ƒh Í XÑͼXîÿ >@åo‡ŸgÑÍkX" l* l> åo‡ŸgÑÍÇ7" l!l6!l6€:lõ:l/Á òA4!ÍpUÍ|4ûÿå*ûk^#VëÍ XÑ^#Vëë*h"hÍ|4+++å*ûk^#VëÍ XÑ^#Vëë*�h"�hR1ÍÄC!ÖbÍ/B!0h>ÍUÍ´8*h> Í$SÍ´8!Jh>ÍUÍ´8*�h> Í$SR‘.ÍÄC>Í/EÍÜ]!"ëk*ƒh"ík*íkë*ëkͼXúÿ.Í|4+å*ëkÍ XÑë!hxÍuTÂõ.Ré.ÍÄC>Í/E!ÅbÍ/B!(h>ÍUÍ´8ÍÜ]!ïkÍ/!ñkÍ>0*ëk#"ëkÃ�.Íl4ÃÍl4ÃÍl4ÃÍl4ÃÍl4ÃÃÍl4ÃÃÍl4ÃÃÿ ÃÍd4Y ÃÍl4ÕÍd4yá¬g)Òr5|îg}î!o Âf5ɶ5x!o‡ŸgͼXò�,>ÿÉÃÕ,�­,ÍÀC!´bÍ/BÍÏ?*ŸkÍ&UÍÜ]*Ÿkë!h>ÍuTÂÁ,>ÿÉ*Ÿk"×k!×kÍ*ŸkÍ&U*Ÿkn&Àÿ "¡k:rho‡Ÿgë*¡kͼX*¡k+õ|Á°òþ,>ÿÉÍ×"l"l* l+"l*lë*lͼX/õ:l/Á ò`3* lå*lÑ"l!lÍ/5*l€ "l!lÍ 5ÖÊV3!l6€*l" l*l#"lÃ3!"l"l* l+"l*lë*lͼX/õ:lÁÍ´8!Mh>ÍUÍ´8ÍÜ]ÉÃû1^#Vë"ýkÍ|4+å*ýk^#VëÍ XÑë!]cxÍuTˆ1*håÍ|4ûÿå*ýk^#VëÍ XÑ^#VëÑͼX"h*�håÍ|4+++å*ýk^#VëÍ XÑ^#V|ªòÀ7|·ðëÉ{•zœØëÉͶ7ëÉ|·ô©XDMë̓XëÉo‡ŸgÍÃXÂî7áÑÑ�QYÅÕéõÍ,8�QYå!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Ñ>ÍUÍb5ër#s#ëÂ|5ÉÍl4ÕÍl4á€Õ¶5¬‡Ò£5ƒ_Ò©5­goј5É4*¡k}ÉÃ}.R&-ÍÄC!¹bÍ/B!ƒc>ÍUÍ´8ÍÜ]!ßkÍÌ)2Ûk:ÛkÖÿÂ8-É:xh·òG-!Þk6€ÃL-!Þk6!Ük6€!"Ùk*ƒh"ãk*ãkë*ÙkͼX/õ:ÜkÁ òG.Í|4+å*ÙkÍ XÑ ò>4!"l!hh>ÍÚS!jh>ÍÚSÍTÍ Q"l*lë*lͼX/õ:lÁ òö3* lå*lë*lÑë!l>GÍpU!lhlxÍuTÂæ3!l6Ãì3!!lͳ4*l#"lã3*l€ "l VÑÁá+|µÂ÷7ñá3333ò$8å!�å!åÅÕÍ«UÑÁáÅÕé·ð/<É|·ðéXëFëÃ98·Êe8OÊe8ÅÅÕå¾Â\8# Êi8ÂG8áÑÁÃd8áÑÁÂD8Á¯glÉáÑÁñ�·ÉG:.l_:+l“O x*`# Ⱦ¡>·É!i#9wÉþ$ÈG:/`·ÂË>xþ+Èþ-Êß>þSÊÙ>xþ+Êß>þ-ÈþSÊÜ>>+É>-É> ÉÍ3Bþ Âû>x=úõ>‡‡‡ÆGÍj?Ãâ>þ Â"?Zʉ<þ*ÂÔ Íª>ÃÎ<:-læ2-l:/lO:*lͪ>Í)>Ã(<:)lÍ2>Âh=:)lÍ>Â=:)lÍ�>Â=:/lO:)lͲ>ͪ>Í)>ÃåÑ9GÊC~#þ'ÂCÃCyÃCõO:|`·ú*CÃsCͦCú3C{þÂ;C*H`|µÊdCj& Õå*H`ë*7`ͼX#ëáͼXÑ> Ü®C> Ü®CͦC> ô®C{=>'Ä®CñÁ!9·Ê•C=õ~�Gy€Oñ·Ê•:þ ÂÎXͬ:Æ:ÑùÕ:*`þÒ§:¯Í¿:Ø:y2.`Éʳ:~#ÉzÉÖ0þ ØÆ0·Éå!2`_¶w!*`~þÒÜ:4Õ_!`ÑsáÉáÈÃÎX·úÎX2-`G:.`�<2*`=øÂÎX:`·ÂÎXÉÂû@oW͈A##ñùõÕÍpAÊUAKÖ0ÚÎXþ Ú*AÆ0æ_ÆÉþÒÎXõæ Â*A·ÂÎXKñæÆ0w# Â7Ax·ÊUAÍ“Aþ ÂAÍ{Añ’õGåZÑÊkA+wÃ`AñÑùëéx·ÈÍ“AÊpAÉx·ÈÍO Å>ʬ8ÅåÕ~ë Ê¢8¾Ê›8#Ã�8ÑáÁ#Ä8ÑáÁñ�H åÑÑùÕo&ÉõÍâ>"`ÑþÂî8ÂÇ8BZ!9Êæ8ÊÝ8~#Í¢?ÃÍ8> Í¢?ÂÝ8ëÑ&9ùëéþÂ9x2+`y Âý8¯2,`:J`·Ê ?�Ú?!9`x–Êâ>Ú?Í™?Ãâ>ÍÎEÃâ>þ Â6?Êâ>Å> Í¢?ÁÃ(?þ ÂH?xÂB?>Í™?Ãâ>þ ÂS?Íj?Ãâ>þÀxÂ]?>·Êâ>=õÍÎEñÃ]?Ê—?x!7`–Ò?ÅÍ—?ÁÃj?:.<:)lö€2-l:/lO> ͪ>Í)>Ã.<:-læ€ÊX=:*lþ0Â5=:/lO> ͪ>Ãb=:/l=O:)lͲ>ͪ>:/lO:*lͪ>:-læ2-lÃb=:/lO:*lͪ>Í)>Ã(<:)lþV¦=:-læ€Ê”=:-læ2-l#þ'ÂŽC{þ>'Ì®CÍ®CñÃyCùÅ{=>'Ä®C{·>bÌ®CÉ*7`++|·ÉõÅÕå2m!mÍÜEáÑÁñɯÃËC>ÃËC>2m"më"m`i"m!9"m! mÃçCfm ~# ÂìC*fm~Öò[D*fmõÍB;ñÂ;:`·Ê;!.`5!1`4ÊÎX:,`G:+`Ê(;�!/`–Íã:>20`Íe;Í¢?!+`5Â4;É:,`!.`†<øþÐ_!`>†wþ ØÖ w>+ÃW;!-`~5·>.ÈÍ�;G:0`·xÈþ0„;:-`“AÂÎXÃ{A¯•o>Ÿg9##ÉÍ©AÊÎXþ Ê“Aþ Ê“Aþ ÚÎXÉÅÕåÍÚHþ½A!6lÍ{Z> ·áÑÁÉÍ3Bþ ÂÖAÊÁAÅÍÚHÁÃÊAþ ÂèAxÂâA>Í BÃÁAþ ÀÍñAÃÁAÊBx!7`–ÒBÅÍá"%lÍÔ9¯<Í;*%léþ“9xÖ2+`=úÎXA Â29AÖú29þÒ29G:+`=¸ÚÎXx2,`á"%lÍÔ9!.`F6!`~#¶ÊV9x=21`¯Í;>EÍ¢?:1`·+òo9-/<õxÍ¢?ñÖ Ú€9Ãw9H`·ÊŠ?¸Ú—?:7`¸È> Í¢?Ã?>25l!3lÃ8EÅÕåõ:H`·Ê¾?!7`¾Ò¾?> ÍÆ?> ÍÆ?ñÍÆ?áÑÁÉ22l!0lÃÜEÍÁAþÂã?y<>Âê?= Ãê?þÂx@¯O€�Ú)Boõ͈A####ñÑùÕõWÍpÍ2>”=:/l=O:-lͲ>ͪ>:-læ =<2-lÍ->Ã.<:/lO:)lÍp>ÂÛ=:-læ€ÂÆ=:)lþBÊÐ=ÃÒ=:-læþ*ÊÒ=> ͪ>Í)>Ã.<:/lO:)lþCÊé=þD:/`·Âü=> ͪ> ͪ>Ã>:)lþ~·Â0D!`m>ÍUGÅ3!�å!åååå!…`Í´F!…`"tm!rmÍxHÃXD!`m>ÍUGÅ3!R.å!åååå!ª`Í´F!ª`"xm!vmÍxHÃmD*hm"zm!zmÍxH!|mÍÓF*lm^#Vëå!@`Ñs#r*nm^·> À!/`~·Ê—;5!-`4!*`5-¯20`xÉ!*`^4{·ú¶;þÒ¶;!`~Æ0É>0Éá"'l*`~2+l:/`·ÊÔ;ÍR>ÊÔ;ÍÎX:+l2,l>VÍ?>!,lÂæ;5~/o&ÿ#9ù:2`·Â<>9Í?>Ê<>*ÍBÁÃñA:H`·ÊB¸ÚB:7`¸ÈÅÍÚHÁÃB>2Dl!BlÃ8E!ElÃ{Zë×BÍØB^ÍãB^#Vþ�ÊpBþ€ÂNBÍ—BÃ3Bë#FåþÒiBá#NåþÂiBá#åÕ^Ñ#ër+sáÉÕ#^#V++r+s~Æ õxÆ0Í¢?ñÆ0Í¢?*%léþÂÑ9x2+`y2,`á"%lÍÔ9ÍB;:+`!,`–Íã:͹;GÊÊ9!9~#ùÍ¢?ù9*%léÊÊ9Ã)B¯2`2/`22`<2*`!9ͬ:þ Êé9þ+Âü9ͬ:à :þ- A @60#Ã1@þEÂ@>ew#þ.Â@þeÂ#@x·Ê1@Í“Aþ  @Í{Añ’GåZÑÅ+y=ú\@x=úT@Ö0þ Ú\@60ã$ãÃ^@w Âh@+6.ã$ãy=ò>@x=ò>@ñÑùëéþÂã@Ñx<CÂ>ͪ> >Rͪ>Ã>ͪ> >Bͪ>Í)>Í)>Ã.<:,l*'lé!/l4!.l4ÉþSÈþ+Èþ-Èþ$ÈÉG:+lOx*`#¾È# ÂI><É>SÍ?>È>+Í?>È>-Í?>È>CÍ?>È>DÍ?>Éþ:Èþ/Èþ,Èþ.ÈþBÉ!#Vëå!B`Ñs#r*jm^#VëÍ'T|æÀ*P`õÍ'T|æÀGñ�ʲD!€mÍE*jm^#Vë}‡‡‡æÀ*P`õ}‡‡‡æÀGñ�ÊÕD!‚mÍE:€`·úùD*jm^#Vë}æÀ*P`õ}æÀGñ�ÊùD!„mÍE:ƒ`·úE?>Ê < à <*:,l!9q#=Â<Ã">>2-l<2.l2/lÍ�;2*l:.l_:+l“ú">*`~2)l:)lþ9Â<:-læ€Êo<:-læ2-lÍ2>Âo<:/l=O:-lͲ>ͪ>:/lO:*lͪ>Í)>Ã(<þ·ÁÊ3B5Â3BÍØB5^ÍãBq#pÃ3BOÕÍØB4~þ ÒµB_ÍãBÑs#r#s#r#qÉ!»BÃ{ZÃBÄBa`ÅBÇB Format Overflow*c`-&t`É!flÉÃCO:„`·yúC!:>2/`ͬ:Ͷ:Ò":·Â: Ê: Í¿:ͬ:à :þ.Â9:ͬ:Ͷ:Ò9:Í¿:ͬ:Ã*:þeÊC:þE†:ͬ:þ+ÂS:ͬ:Ã\:þ-Â\:ͬ:Ͷ:ÒÎXGͬ:Ͷ:Òz:õx‡G‡‡€Gñ€Gͬ:õ‚:¯ÂÀ@!ÿ9ùÿÍ©Aþ Ì©Aþ ʨ@þ ʨ@w# ÊÎX¯Ã�@H ëå!9 Ê»@+wð@ÑùëxéO¯�o>Ÿg9ùÕx ÈÍ©AÊÎXþ ÊÎ@þ ÊÎ@w#ÃË@ÖÚ)B=òí@<þÒ)B<_Ê)BK¯€Ú)B  *jm^#Vë}òE!†mÍEÉ^#Vë"ˆm!a`"Žm*ˆm"’m!ŠmÍ{ZÉ2–m!”mÃ8E^#Vë"›m:|`·úGEÉ:~`·òsE*›m¯–òpE*›m5!�m6:�mÖ ÊmEÍ EÃ_EÃNEßE!žmÍÜE*›m¯–òŸ ÍF^ ÍF^! n^r+s6 #6 ! n4^NÉ*›O|·ÂÍK}=ºKÍmKÃÉKÍÅJ·ÊÅK¯ÉÍO>ÿ·É~þÊÙK·ÊÙK¯É>ÍLNÉ*›O|·ÂLYÍÅJ=ÊòK¯ÉyþÂþKÍF^ÃLÍþ;Èþ<Èþ>Èþ[Èþ]Éy·È É*•OëÍeIþ ÀÍ�IÛIÍeIþ$ÀÍ�IÍeIÖ1þÚ½I ÉÅÕåo&))))\xH ëá ·ÊÚI#w ÂÚIÑÁÍ�I¯ÉÍ•I*›O#·Ê JÞAþÒ 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}2Ým*Ùm^#Vë}‡‡‡‡òùG!Ým44*ÙmÍDNÂOÍ(IÍCIÊ‚O~þÌWK>ÍDNÊ‚O*›O~þÊ,N>ÿÂOÍ5NÍÃPÂO*›Oë!*~!/É2ŸO*›Oÿÿ|·ÊYN(^#VÕÍ^IãåÍ^Iëá{•zœÚlNëáz·úÐN¯2šOz³Ê›NÕå:ŸOE*›m5!?`6! mÍÜE:?`·ÊœE*›m6ÃyEÉÍÚH2�m:�mÖÂÍE!a`"¦m!"ªm!¢mÍ{Z!7`6#6!�m6 É:„`·òÛE!­mÍÜEÉ^#Vë"³m!3`"¹m*³m"·m!µm;M·úF!a`"¿m!>ÿ·É~þÊL=ÊL¯ÉÅ>ÍLÁÈqÉ2 O*›O/"�OÍMKÚrL{²ÈÍWKÍFK*�OëÍ*›O#ë: OOÍ·Ê[LÍFK#s#rÃdLÍ`KÍMKÚ4LÍWK€ÍÃLÍFKr+s{æƒL!eIþ:ÊJ 6ÃJp4Í�I+ͧIÊ8J#ÍeIÊDJ#þ*Â0J6?Ã4JwÍ�IÂJÍeIÊKJÍ�IÃ8J#6 ÂDJþ.„JÍ�I ͧIÊxJÍeIÊ„J#þ*ÂpJ6?ÃtJwÍ�IÂ_JÍeIÊ‹JÍ�‡‡‡‡‡Æ _!€x¾Ú—PÂ�PFNÅÃvPÑá¯wxG>�O>ˆG!$q#p#6ÉÃÅP"_në"bn2anx2dnÍ¡O¯2enͱO!an~5·ÊiQÍàOÊ Q=Â6Q:dnþÂ6Q*bnëÍ^#Vë}‡‡òH>2Ým*Ù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ͧKáÑÈqÖNNÍàKáÑÈ#ÃvN*›O|·ÊÐN*~·ÊÐN=!šO¾ÚÍNõ:ŸOõÍLÊÊNñÖÂÆNwñíNÁÁÉÍÑM>ÿ·ÉÍ(IÍCIÊ‚O|·}Ê‚O~þ> Ò‚O†<ÂOÍ(IÍCIÊ‚O|·ÂO*—"Ãm!»mÍ{Z·òFó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`6šO4*�O+>ÿ·É|µÊ’L+€}æ€oÉÍ(IÍ2I~2™OÍ2I"•OÍCI:™OþÒ¡MÍÎJÊÔLG:™OþÒ¡M*—Op®ÂÎL4#6ÂOÍ^I:™OþÚïLÍŒLå*‘O++"‘OáÃøL}´+ÊüLÍ’L}‡|2ŒO"IÃxJ#6 „J%#6Â�J*›O##^ ~þ?¤J# Â�Jx·ÉCON CON RDR PUN LST M!¿J ~ÉÍ•Iþ$Â�Gx·È|g}oÍ0^:c`þÚ•H!ºHÍ{Z¯2c`O!t`·Â¤H6ÿéH +~#wÑ!d` s#r!c`4Íè]ÉÂHÃHa`ÄHÆH I/O Stack Overflow:?`ÖÂúH!3`" n!nÍ«M·ú÷H!n6ÃI:?`2nO¯w=ÂO*›OÍ_*—O^#V6+6ë++ͽYÂOÍ(IÍUIÊ‚Oþ>Ò‚O"N#F#~Í2Iq#p#w>ÿÂOÍ(IÍUIÊ‚Oþ>‚O*~Í^Ië!·ÊqO=ÒcO>!ë*›O" s#r#w=Ã#6*9`å*J`#ÑͼX|µÂ³F!a`"Ém!"Ím!ÅmÍ{Z·ú®FÍÎE!?`6€É"ÏmÁ!9"Ñm!ÏmÅÍÓFÁ! 9^ùÅÉÙm~# ÂØF*Ùm^#Vë|µÊíFÉ*Ùmå*Ûmëá Í-TŠOÍ^IÍŒL"�O1Í'Y|µÊ¡M##"›O6ÿë*—Os#rÍéI O{þ Ê O*›O:™OwþÚ?M6ëæÂbM*�O"�OÕÍÑ<ÂxM:™Oþ OÃiMÕÍÑÍ<Ê O!"�O*›O(þ Â�áÁÁ·É¯É*›O+ÉÍ>K^#VÉÍFK#{–#zžÉÍ>K6#6ÉÍFKë€ ër+sÉ! nF#~�Ú�K! n6Pë ÍÃvQá"gn>Í3R*gnéá"in̓QͰQ*inéá"in̓QͰQå*inãÉõÅG!9ë!x·Ê Rþ ÊRþ+ÂÙQã$%ÂÎXgãÃRþ-ÊÎQþ0úÎXþ:òÎXÖ0ÕT])ÚÎX)ÚÎXÚÎX)ÚÎX…o|!?`6:nÖ ÚI*7`#"7`:nÖ Â$I!7`6#6:nÉ"‘OÑá"“Oëé*‘O^#V#"‘OëÉ^#VëÉÍ2IÍ>I"—OÍ>I"›O|µÉÍCIÈ|·È~ÉÍ2IÍ>IÉy·ÈÖaþÒsIÆAÉþ Èþ=Èþ.Èþ:È‚Oë*“Oåë·É Í}!fn6ÿþ Ø4É€ÍÉ>ÿ2en·É*bn!4À#4À#4Éå~#N#F#–y#žx#žáÉ:en·À*bnë!!:dnþÊûOÍÐOÒºO:fn·È*Ûm nb¯½œò"G*Ûm ë!Þm>ÍlUÃÍU*ÙmÍÙT!ÞmÍ&U*Ùm~#¶ÂhG*Ùm^#Vë)))|·úhG*Ùm6P#6*Ùm~#¶Â¢G*Ùm^#VëŠOw# „M*›O~#þÌLP*›OÍî^>ÿÂO*—O¯w#wÂOÍ(IÍCIÊ‚OͧKÍ2IqÂOÍ(IÍCIÊ‚OÍ2INÍàKÂO*›O~ÖÈ" 4À#4À#4ÉÍ(IÍCIÊ‚O~þÂÿMÍ5N;PÊ‚OÍWK> ÎgÚÎXÑþQÑ{þÊR$%ÂÎX}ÃR|‡ÚÎXzþ-Ì©XëñÁo&9ùëÅ}ÉO!9îÿëùÅ w#ÂARÁ60#60! 9~ ·òpR!97>š?žÆ'w#ÂaR-!9~͵RʉR~©XÉëx±>ÊîX!>ë)Ò–Xëå ÒžXãá=ʧX)Ã�Xëɯ•o>œgÉ^#V#N#FáÅÕé{•ozœgÉ|µÈ|/æÀ=É!ÔXÃ{ZÜXÝXÞXàXâX Conversion2Y!÷XÃ{ZÿXYYY°WÍ©XDM>!ëë=È)ë)Ò�V ÓVÍžV|§g}oÉÍmW°VÍQW°VÕÍŒW2zn"{n!}nr#q#páÍŒWÕë*{n"{nÑ!zn®æ€w!€nr#q#p:~nG:‚nÍ=Xå:nG:�nÍ=Xå:}nG:‚nÍ=XåBADGë!Õ`~þÚ/]]ÃÄ_ Condition Stack Overflow$4Ox!…n w#s#r#ÑÕs#r!9ë!Ö` s#rÉë!Õ`N!…n È+++++¾Âh]#{¾Â�]#z¾Ê†]›T–À#Ê™T ‚TÖ ÀÂ�TÉ È> –À#ÙTë!9åO…o>ŒgãëyͽTáÑùëéåõ~õ#…o>ŒgxÁ�Gñ¸ÒÒTGÍpUá†wÉF#ëá"knëõxÍUÍíT*kné!9G…_>ŒW€Obk++Í›[Í>[>(Í@[ÁyÍw[>)Í@[á|µÊ![Í3[Í\á|µÊ-[Í3[Í›[Í­[é_å>,Í@[Í>[áÉ> _ÃF^ ÍF^ ÃF^æÆ0þ:Ú@[ÆÃ@[õÍN[ñÃN[åÍ>[áå|Í\[á}Ã\[þ Ú‡[d¹Ô#͵RÂvR! 9~þ.›R+60çRþ0§R6 #Â�R+r>‘o&9Ñyùëéåõ>ƒo&9ñæÆ0w+ÂÌR6.áÉ!9ÍŒWõ}!·ÂåRñÑÁÁÕÉþòÎXÖ/[>#Í@[*Õnøÿ>·È=^#V#åõëÍh[ñáÃâ[Íù[>:åæþ Òiñü©XÑÁÁÕÉo‡Ÿg|·ü©X>�·Ê"S)ÚÎX=ÃS|ÉÁë/˜G!͇Sþ ÂmS>0ñ·ò|Sþ ÂrS>-Áñ¸ÐÚ5Y4z·Â�Y{þÚ¸Yå##^#V# ëãå##s#rëÑs#r#ëãës#r+++ë~æs¶w#rá####É}´Èë*Ûn}“|šÒ,Z*{•zœÒ,Zë+F+N+V+5^{Ú2Z{•zœÒ2Z}‘|˜Ò2Z{²Ê ZÚ Zi`~æá33333333ÅÕé###~·Â›WGOW_goÉÞ€_ŸW+~ö€G~æ€+N+f.ëÉõz³´µÂÀWñÉz·úÑW ë)ë)ÒÀWÃÀW}‡ÒæW$ÂæWÂæWÂæW€x©úøWÊýWÊýW>à Y>ÃYyÆ€.~# Â^*P`)))))|` )| Â^*3`|·À}þÐ*ö`"7`É:c`·È*a`3`w# Â=^É*ö`{þ ÒW^þ Â[^!#"ö`ÃÃ�^Copyright (c) 1980 Digital Re Â|Uñ È6 #ÇU·Èo&9DMõ^#VÕ#_ + wžUÑñùëéÍmW°UÕÍŒW2mnx·ÂÁU>ÃîXÍ©X#"nnë"xn`i"vnáÍŒWÕë*nn"nn!mn®w`i"pnáÍ›VÍžV"rn*pnë*vnÍ‚V"pnë\>?Í@[áÉå!f\Í›[áåÍ›[>=Í@[á^#Vë|·Â8\}þÚ/\.))ç\Û[#F>A€Äô[> #õþÂS\~þ >.Äù[~þ Äù[ñ=ÈÃD\ë^#V#ëÉ File: Traceback:Œ\“\á3åÃ~SåÕT]))ÑÔ‡Sá寕iO>œ`G>0 ÒªS<âSÁ DMþ0Àþ À> Éo‡Ÿg|·æ€õòËSÍ©Xë!ñͰWáÅÕé<Áë!øÿ9ùÅ<·Ow#È ÂéS·>™úúS¯w#ÈÃús¶w#rë##q#p Øi`N#F#^#Vë~Ò2Zq4#p+ëi`##s#rÉ8ZÃÄ_TZÃÄ_ FREE Request Out-of-Range$ Free Space Overwrite$GKþÒ“ZMbkÓZÍ`\FÍGñªî€OS\É{EåÍ=XãåDÍ=XãåzEÍ=XãDÍ=X\e.Á Ò+XÁ Ò1XS\e.Á Òš?žë†'w# TëÑùëéȇÃ!TÈ)Ã'Ty°Èw# Ã-T~#ÃDT~#W“ÿÉþÚàZë!a`{–À#z–À*@`å*B`åÍÜ]áÑùëéáÑÁxÖÈy·xòìZ·ÈÕåÅõÍD[ñ_!|\^#Vë  #"×nÉë*×nDM!Ùnx±È~»ÂŸ_#¶È~+ºÂŸ_ëå+F+Náëq#p*×n+"×n·Êš_þÒ�_=ÂP_!+~æO~#~G!>€‘æw!/x·Âx_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 versjçi1jçiüijjXjyfjj{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 filºjÇjÂjÐjÂjÂjÙj…hèjëjãjòjãjãjãj€ ÿ�€ ÿ�€ÿ�€ÿ€ÿ��€ÿ�€ÿ�€ÿ�€ÿ�€ÿ�€ÿ�€ÿ�€ÿ�€ÿ�€ÿ�€ÿ�€ÿ�€ÿ�€ÿ�€ÿ�€ÿ€ÿ��€ÿ€ÿ th…h™h …h…h…h§h‡c¦hc¦…h…h…h¦w¦·hºh¯hÁhÅh‚02Ðh +hÜhÜ<ÿ‡h> �J ñh Æcøhicution$ ` 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-&')*+(%12ôc0iRitiSYSINSYSPRINT€ ÿ�€ 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 transfeƒk#k‰k�k‘k•k'k›k½kÀk¦k‡cÝkxhÙkÛkëkëky): and user: : Sorry, CP/M2.2 is required.??*1234567890 No files. . k :LSX ’i•i…h²iÿeyiÏiÄiÙiÄiâiåi ÿÿ�€ÿ€ÿ��€ÿ�€ÿÿÿÿ�€ ÿÿÿ�€ÿ�€ÿÿÿÿÿ�€ÿ�€ ÿ�€ $ÿ�€ 'ÿ�€ 'ÿ�€ÿ�€ ÿ�€ ÿ�€ ÿ�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 Itemåååânååååååmmmmmm Stream/Record Sequen/Direct Input/Output Keyed Access P< $contmxm3`Tmåååååm*m8mFmdmem’m–m —m˜m™mšmªm ¬m¹m¯m°mÃm±m²mÍm.datÝmÞmöm×mØmnnååååå nnå" åååååååååååååååååååååååååå# åååååååååååååååååååååååååå$ åååååååååååååååååååååååååå% åååååååååååååååååååååååååå& åååååååååååååååååååååååååå' åååååååååååååååååååååååååå( åååååååååååååååååååååååååå) åååååååååååååååååååååååååå* åååååååååååååååååååååååååå+ åååååååååååååååååååååååååå, åååååååååååååååååååååååååå- åååååååååååååååååååååååååå. åååååååååååååååååååååååååå/ åååååååååååååååååååååååååå0 åååååååååååååååååååååååååå1 åååååååååååååååååååååååååå2 åååååååååååååååååååååååååå3 åååååååååååååååååååååååååå4 åååååååååååååååååååååååååå5 åååååååååååååååååååååååååå6 åååååååååååååååååååååååååå7 åååååååååååååååååååååååååå8 åååååååååååååååååååååååååå9 åååååååååååååååååååååååååå: åååååååååååååååååååååååååå; åååååååååååååååååååååååååå< åååååååååååååååååååååååååå= åååååååååååååååååååååååååå> åååååååååååååååååååååååååå? åååååååååååååååååååååååååå@ ååååååååååååååååååååååååååA ååååååååååååååååååååååååååB ååååååååååååååååååååååååååC ååååååååååååååååååååååååååD ååååååååååååååååååååååååååE ååååååååååååååååååååååååååF ååååååååååååååååååååååååååG ååååååååååååååååååååååååååH ååååååååååååååååååååååååååI ååååååååååååååååååååååååååJ ååååååååååååååååååååååååååK ååååååååååååååååååååååååååL åååååååååååååååååååååååååå