!$ W! $ G !52>2!6f!> 2>2EAG>? >  .... Cal-Tex Computers 60K CP/M version 2.2 .... ......... release date 15-September-82 ......... lØPSViVSÇ3ÊÏÔFYZÙs1ͦ{s1{s1`{1R!"2<2 h!~8`,0F>,,!!0N#^#V#~ :8O!~ ""y2  :<2!"5 cannot boot8! y >Ӂہ >ȯZ(yӀہGۀ˿ہG(ۀC!qC`iz(n&#!y2<o! = "C#FR>22>:2O :2O! !*( (!!":Gm!"!K:2&o)) 2~ R>͍:(R :(7(:2*":2j *2~ R͍2y(+(:! *[R !~ "RER~2:2*" 57(:2*":2" !4~ݾ8 ( 6*#"G:=?<2:=ݦ &o))))))) [: >2:!*[R:!ɯ22:*!">2͘!6!"2͘!2:O((:M8 MOx!((*:O:($'(_:A2o!_5{85{ !5:?5:?>!5 (ɯ2<~#O dP P0O  0yI BIOS error on A: not readywrt protectwrt faultnot foundbad crcoverrundrqbusy track sector ? \X COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<ԯ2 Շ!۶2:2a{_:۷ʖ:۷>Ľʖ:=2–!B!6#5ʖ:۷Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ "ַ"͌#>?͌͘ =_.:;<> Oօo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USER""""""!yO#< Ty#O 3ׯ21y_͸2y2ͽ:Է˜1͘A͌>>͌92^ :۷¥.!_~#fow]٭ڎڥ!v"!çREAD ERRORçNO FILE^:۷ ! ~ 3#0 Wx x ր ւ G ~ # 3x~#B!Y~ɯ2:۷=!۾ý:۷=!۾:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ ٯw4!Y~ʆ͌†t=ʆf ^ T ٯ2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Yڸpsp2mÆÆf ͧÆFILE EXISTS _: É: :۷ʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~2ۯ2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: !۶ Â$$$ SUB""""""ܙܥܫܱ"C{2!"E9"1A߯22!ty)K!G_^#V*Cސ~E ,&-AGMSߛ!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 O͐  :߷E B 2>: ߷b# : ߷y! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: ! ߾ Hù H H $O͐: 2 *CN# x: 2 p&x~+é7ݯ2 H! >w_: ! ߾5ͤNkͱ¦ͱxʊ#Nx: ߷! ߖ2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#2E>! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \S*C :qn& ^#V>O^"*}:*)=":O:页o"*C *C!ͮ~2~2ͦ:2ͮ:O:w:w |g}o*鯆# CRTOUT MAC` DISKIO MAC~ENTRYS MAC INIT MAC^!"#$%&'()*+,0+>Y24+EOF FILE 1, NOT FILE 2 $  X:Yg^EOF FILE 2 BEFORE FILE 1 $  ͂FILES MATCH, LENGTH IS<   NO FILE1 FILE$!l. ;U ]!mͶD~# ;!\R ;*Q*S}|ڮ!"S*Q{zҠ*OINTSRV MAC3-./0123MEMORY MAC#45678MONITOR MACp9:;<=>?@ABCDEFROM MAC GH $   Ð ڥ0_w#¶N BYTES $2>)w\Ð|*w,"!~0*S#"Sɯ2:2N!"Q"S.<  NO FILE2 FILE$GSCRATCH MACI 4!FILES UNEQUAL AFTER $  PLAST DATA READ FROM FILE 1: $ *-,~ ʨ w w ڱұ_COMPARE.COM 1/8/78 $ "1:m 8 ]!mͶD~# ;!\R ;y!ͼ G:6QxJS*u :<2<2͝ $ 2> w>(_͜͜:2>)w\Ð|*w,"!~0*w#"wɯ2^2r!"u"wR<   NO FILE1 FILE$!l. ;U ]!mͶD~# ;!\R ;*Q*S}|ڮ!"S*Q{zҠ*OOLUMN# 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 $   Ð ڥ0_w#¶N BYTES $2>)w\Ð|*w,"!~0*S#"Sɯ2:2N!"Q"S.<  NO FILE2 FILE$GET 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 (4!FILES UNEQUAL AFTER $  PLAST DATA READ FROM FILE 1: $ *-,~ ʨ w w ڱұ_,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 :<2<2͝ $ 2> w>(_͜͜:2>)w\Ð|*w,"!~0Y24+EOF FILE 1, NOT FILE 2 $  X:Yg^EOF FILE 2 BEFORE FILE 1 $  ͂FILES MATCH, LENGTH ISY 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 L0 ;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 MILLISL,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 POLAXOR 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,POB 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 DEEMOVE ;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,CFROM 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 CAST 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 STACMONCOPY 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 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 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 DEFSNCLUDE 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*** ; ;