IMD 1.18: 30/01/2015 20:26:11 BB II 5" & 8" Drive Interface Micro Cornucopia PO BOX 223 Bend, OR 97709  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  CRCKLISTCRC XEBEC MAC/ DEBLOCK MAC DEBLOCK MAC ADVI Xr LE: MEMORY .MAC CRC = 6B 2B --> FILE: MENTRYS .MAC CRC = 42 31 --> FILE: MONITOR .MAC CRC = 6F E6 --> FILE: SCRATCH .DDOSECT MACz{KEYDAT DOC |}MINTSRV MAC9~MEMORY MAC$RC = 63 EE --> FILE: AUTOBIOS.MAC CRC = E3 ED --> FILE: MELDING .DOC CRC = 9A 56 --> FILE: BIOS .DOC CRC = C4 A2 --MACROS MACMEMDEF MAC  CONFIG MAC!"#$PROGRAM MACR%&'()*+,-./MAC CRC = 12 D8 --> FILE: MROM .MAC CRC = EC 73 --> FILE: CRTOUT .MAC CRC = 7D CF --> FILE: MINIT .MAC CRC = A9 MENTRYS MACMONITOR MACpSCRATCH MACMROM MAC> FILE: MIXED .DOC CRC = 62 F3 --> FILE: ZMACRO .LIB CRC = 64 64 --> FILE: SYSGEN5 .COM CRC = 14 DF --> FILE: INIT5ONESECT MAC01AUTOBIOSMACd23456789:;<=>MELDING DOC"?@ABCBIOS DOC(DEFGH0F --> FILE: CALCBYTE.INT CRC = AA 42 --> FILE: CALCBYTE.PAS CRC = AA AF --> FILE: MDISKIO .MAC CRC = FE E3 --> FILE: CRTOUT MAC^MINIT MAC[CALCBYTEINTCALCBYTEPAS .COM CRC = 32 9D --> FILE: FORMAT80.COM CRC = 7C 2C --> FILE: FORMAT40.COM CRC = F4 CB --> FILE: MDEBLOCK.MAC CRC =MIXED DOC&IJKLMZMACRO LIB"NOPQRSYSGEN5 COMSINIT5 COM3TUVWXYZ --> FILE: XEBEC .MAC CRC = 28 41 --> FILE: DEBLOCK .MAC CRC = D9 7C --> FILE: MACROS .MAC CRC = 87 D6 --> FILE: M CRC .COM CRC = B2 07 --> FILE: -DISK .DOC CRC = 87 88MDISKIO MACMDISKIO MACCRC COM-DISK DOC 08 13 --> FILE: DDOSECT .MAC CRC = F9 50 --> FILE: KEYDAT .DOC CRC = 15 9F --> FILE: MINTSRV .MAC CRC = C2 3B --> FIFORMAT80COM[\]FORMAT40COM^_`MDEBLOCKMACabcdefghijklmnopMDEBLOCKMACCqrstuvwxyEMDEF .MAC CRC = 9A 43 --> FILE: CONFIG .MAC CRC = 33 D5 --> FILE: PROGRAM .MAC CRC = B1 53 --> FILE: ONESECT .MAC C a modified file.) contains the neccesary changes and a few more conveniencies like a autoboot facility.  Z,DWIN3 DWIN2: CALL RD ;READ FROM WINCHESTER JR DWIN4 ; DWIN3: CALL WRT ;WRITE TO WINCHESTER DWIN4: OR A RET Z ;EXITQU 00100000B DATA EQU 00000000B MSG EQU 00001000B BUSY EQU 00000010B INPUT EQU 00000001B OUTPUT EQU 00000000B SEL EQU 3 MAND+INPUT JR Z,RD3 ;JUMP IF READ ERROR CP DATA+INPUT JR NZ,RD1 ;ELSE LOOP UNTIL DATA READ CALL REQ LD HL,(HSTPTR)  printer driver. set to 80h/81h/89h for side A or 82h/83h/88h for side B. The one sector loader contains a short tabW NYBBLE OF HEX BYTE CALL PMSG ;PRINT DELIMITER CHARACTER @HL RET ; ; PNYBBL: AND 00001111B ADD A,90H DAA ADC A,40 Regards, ---------------------- Andy Bakkers  IF NO ERRORS FROM SASI LD HL,SASMSG CALL PMSG ;PRINT SASI BUS ERROR MESSAGE LD A,(ERRBUF) BIT 7,A ;TEST IF ADDRESS  RST EQU 2 ON EQU 00001000B OFF EQU 00000000B ; ; ; DOWINCH: LD HL,(HSTTRK) ADD HL,HL ADD HL,HL ADD HL,HL ADD HL LD B,0 LD C,SASI INIR ;INPUT SECTOR DATA FROM XEBEC RD2: IN A,(SASI+1) AND 00100001B CP COMAND+INPUT JR NZ,RD2 ;L;******************************************************** ;* * ;* DISK I/O ROUTINES FOR XEBEC S1410 CONTROLLER * ;* H DAA LD C,A CALL OVEC RET ; ; SASMSG: DEFB CR,LF DEFB 'BIOS error on SASI status=',NULL DEFB '.',NULL DEFB '.ctory entries allocated. we may want to change this for compatibility with other systems. BLS ...... CP/M block size parFIELD IS APPLICABLE JR Z,DWINX ;PRINT ONLY FIRST STATUS BYTE IF NOT RES 7,A CALL PUTHEX LD A,(ERRBUF+1) CALL PUTHEX ,HL ADD HL,HL ;CREATE DISK ADDRESS BYTES FOR DCB LD A,H LD (DCB+2),A ;STORE MIDDLE ADDRESS BYTE LD A,(HSTSEC) DEC A OOP UNTIL COMPLETION STATUS RDY RD3: CALL COMPLETE LD A,B AND 00000010B RET Z ;EXIT IF NO ERRORS CALL ERROR ;ELSE R * ;* LAST EDIT DATE: 25-AUGUST-82 * ;* * ;******************************************************** ; DMA EQU 08',NULL DEFB '.',NULL DEFB ' ',NULL ; ; ; ; DCB: DEFB 0,0,0,0,0,0 ;DEVICE CONTROL BLOCK ERRBUF: DEFB 0,0,0,0 ;ERROR STameter (expressed in Kbytes). this should probably not be changed from the 2K value now being used, but we have it j LD A,(ERRBUF+2) CALL PUTHEX LD A,(ERRBUF+3) DWINX: CALL PUTHEX LD A,1 OR A RET ;RETURN PERMANENT ERROR TO CP/M ; ;REMOVE +1 BIAS FROM WINCHESTER SECTOR AND 00011111B OR L LD (DCB+3),A ;STORE LOW ADDRESS BYTE LD A,(RWFLAG) OR A JREAD ERROR STATUS RET RDDCB: DEFB 00001000B ;READ COMMAND OPCODE DEFB 0 ;HIGH ADDRESS DEFB 0 ;MIDDLE ADDRESS DEFB 0 CH ;Z80 DMA PORT ADDRESS SELMUX EQU 0CCH ;DRIVE SEL/READY MUX CONTROL PORT SASI EQU 0D8H ;SASI BUS BASE ADDRESS COMAND EATUS BUFFER ; ; ; RD: LD HL,RDDCB CALL CMDOUT ;OUTPUT READ COMMAND TO XEBEC RD1: IN A,(SASI+1) AND 00100001B CP COust in case. FIVE EIGHT .... floppy disk type being used. LSTDAT LSTCTL LSTBAUD .. sio ports and ctc chanel for serial ; ; PUTHEX: PUSH AF RRA RRA RRA RRA CALL PNYBBL ;PRINT HIGH NYBBLE OF HEX BYTE POP AF CALL PNYBBL ;PRINT LO  ;LOW ADDRESS DEFB 1 ;BLOCK COUNT DEFB 0 ;CONTROL FIELD ; ; ; ; WRT: LD HL,WRTDCB CALL CMDOUT ;OUTPUT WRITE COMMNTROLLER #1 LD A,SEL+OFF OUT (SASI+1),A CMD1: IN A,(SASI+1) AND 00101011B ;MASK TO STATUS INPUT BITS FROM SASI CP COMAN JR NZ,ERR1 ;LOOP UNTIL STATUS BYTES AVAILABLE CALL REQ LD HL,ERRBUF LD B,4 LD C,SASI INIR ;READ STATUS BYTES INTOCK FOR SEAGATE ST-506 WINCHESTER ; MAXBLK EQU 1224 ;NUMBER OF BLOCKS ON DISK WINSTUFF: DEFW 0 ;NO SECTOR SKEW TABLE SS DEFB 0 ;LOW ADDRESS DEFB 1 ;BLOCK COUNT DEFB 0 ;CONTROL FIELD ; ; ; COMPLETE: IN A,(SASI) ;READ FIRST COMPLETIYS WERE SELECTED OR NOT LD A,(SELCPY) JR Z,REQ1 AND 00001111B REQ1: PUSH AF OR 00001111B ;SELECT SASI REQ/ACK HANDSHAKEAND TO XEBEC WRT1: IN A,(SASI+1) AND 00100001B CP DATA+OUTPUT JR NZ,WRT1 ;LOOP UNTIL WRITE DATA REQUESTED CALL REQ LD+BUSY+OUTPUT JR NZ,CMD1 ;LOOP UNTIL XEBEC ENTERS COMMAND MODE LD DE,DCB LD BC,2 LDIR ;COPY XEBEX COMMAND BYTES TO O BUFFER ERR2: IN A,(SASI+1) AND 00100001B CP COMAND+INPUT JR NZ,ERR2 ;LOOP UNTIL COMMAND COMPLETION CALL REQ CALL C DEFW 64 ;SECTORS PER TRACK DEFB 5 ;BLOCK SHIFT DEFB 00011111B ;BLOCK MASK DEFB 00000001B ;EXTENT MASK DEFW MAXBLK-1 ON BYTE LD B,A COMP2: IN A,(SASI+1) AND 00001000B JR Z,COMP2 ;LOOP UNTIL MSG INPUT BECOMES ACTIVE IN A,(SASI) ;READ SE FLIPFLOP OUT (SELMUX),A ; THROUGH DMA READY MULTIPLEXOR LD A,10001010B OUT (DMA),A ;PROGRAM DMA READY ACTIVE HIGH REQ2:D HL,(HSTPTR) LD B,0 LD C,SASI OTIR ;BLAST DATA OUT TO XEBEC WRT2: IN A,(SASI+1) AND 00100001B CP COMAND+INPUT JRBUFFER INC HL INC HL INC DE INC DE ;BUMP PAST MIDDLE/LOW ADDRESS BYTES LD BC,2 LDIR LD HL,DCB LD B,6 LD C,SASOMPLETE LD A,1 OR A RET ;RETURN PERMANENT ERROR INDICATION RSSDCB: DEFB 00000011B ;REQUEST SENSE STATUS OPCODE DEFB;MAX BLOCK# DEFW 511 ;MAX DIRECTORY ENTRY# DEFB 11110000B ;ALLOCATION MASK MSB DEFB 00000000B ;' ' LSB DEFWCOND COMPLETION BYTE LD C,A COMP3: IN A,(SASI+1) AND 00001000B JR NZ,COMP3 ;LOOP UNTIL MSG INPUT GOES AWAY AGAIN RET ; LD A,10111111B OUT (DMA),A ;ISSUE READ-DMA-STATUS COMMAND IN A,(DMA) BIT 1,A JR NZ,REQ2 ;LOOP TILL READY IS ACTIVE  NZ,WRT2 ;LOOP UNTIL COMMAND COMPLETION CALL COMPLETE LD A,B AND 00000010B RET Z ;EXIT IF NO ERRORS CALL ERROR ;EI OTIR ;PUT COMMAND BYTES OUT TO XEBEC CMD2: IN A,(SASI+1) AND 00101011B CP COMAND+BUSY+OUTPUT JR Z,CMD2 ;LOOP UNTIL 0 DEFB 0 DEFB 0 DEFB 0 DEFB 0 ; ; ; CMDOUT: LD A,1 OUT (SASI),A LD A,SEL+ON OUT (SASI+1),A ;SELECT XEBEC CO 0 ;CHECK SIZE (NOT REMOVABLE MEDIA) DEFW 0 ;RESERVED TRACKS DEFB 1 ;DEBLOCK SHIFT COUNT DEFB 00000001B ;DEBLOCK MASK ; ; ERROR: LD HL,RSSDCB CALL CMDOUT ;ISSUE READ-SENSE-STATUS COMMAND ERR1: IN A,(SASI+1) AND 00100001B CP DATA+INPUTPOP AF OUT (SELMUX),A POP AF LD (INUSE),A ;RESTORE IN-USE FLAG TO PREVIOUS STATE RET ; ; ; ; ; ; DISK PARAMETER BLLSE REQUEST-SENSE-STATUS RET WRTDCB: DEFB 00001010B ;WRITE COMMAND OPCODE DEFB 0 ;HIGH ADDRESS DEFB 0 ;MIDDLE ADDRE XEBEC LEAVES COMMAND MODE RET ; ; ; REQ: DI LD HL,INUSE LD A,(HL) LD (HL),1 EI PUSH AF OR A ;TEST IF FOLPP  DEFW 256 ;BYTES PER SECTOR ; ; ; ; IT IF DRIVE IS LOGGED-ON PUSH HL POP IX BIT 0,(IX+FLAGS) ;TEST DRIVE PRE-SELECTED FLAG RET NZ ;EXIT IF DRIVE FORMAT A ; ; ; MAGIC SELDISK ROUTINE WITH AUTO DISK PARAMETER SELECT ; PORT0 EQU 0C8H ;DISK CONTROL BIT LATCH SIDSEL EQU 1 ;BIT# LD HL,SDSTUFF LD (PRMPTR),HL ;FIRST SELECT SINGLE DENSITY PARAMETERS LD A,(IDBUFF+6) BIT 0,A ;TEST DENSITY BYTE RETURNED  ; ; HOME: LD BC,0 SETTRACK: LD (TRACK),BC RET ; ; ; ; SETSECT: LD HL,SECTOR LD (HL),C RET ; ; ; ; SORE UNIT# IN CASE OF ERROR LD C,A CALL MONITR+27 ;SELECT NEW DISK DRIVE JR NZ,PARM2 LD A,(TRACK) LD (HSTTRK),A ;STORE  TYPE5D: POP AF RESTORE JR T5DOUB TYPE5S: POP AF RESTORE JR T5SING T5DOUB: SAVE PUSH AF PRINT 255 JR Z,PARM9 SRL A PARM9: LD (DDSTUFF+6),A ;STORE VALUE FOR 'EXM' PARM10: LD HL,(PRMPTR)T CONST IN 'DDSTUFF' POP DE ;POP TRACKS-PER-DISK PARAM OFF STACK LD HL,0 LD B,A ;PREPARE TO COMPUTE 'DRM' VALUE FOR DP XOR (HL) ;COMPARE ID FIELD BYTES @HL AND @DE INC HL INC DE RET ; PAGE ; IF EIGHT ; ; DISK PARAMS FOR STANDARD SBLE LD DE,DDSTUFF+18 LD BC,3 LDIR ;STORE FORMAT PARAMS IN 'DDSTUFF' INC A LD B,A ;B=SECTOR LENGTH CODE+1 (RANGE 1,L LD (IX+11),H ;STORE IN 'DPB' POINTER SLOT LD DE,15+4+1 ADD HL,DE ;COMPUTE ADDRESS OF CHECK VECTOR LD (IX+12),L LD  IDENTICAL CALL EXOR3 JR NZ,PARM3A ;JUMP IF DENSITIES NOT IDENTICAL LD HL,2*NTRAKS-RESERV EX (SP),HL ;REPLACE DOUBLE  LD DE,(DPHPTR) PUSH DE PUSH DE PUSH DE ;SAVE 3 COPIES OF POINTER TO DISK POOP LD BC,2 LDIR ;COPY 'XLT' ADDRESS TB PARM7: ADD HL,DE DJNZ PARM7 ;GET PRODUCT OF SPT*(NTRAKS-RESERV) LD A,(DDSTUFF+4) LD B,A PARM8: SRL H ;DIVIDE TOTAL SINGLE DENSITY FORMAT ; 26 SECTORS / 128 BYTES ; SDSTUFF: DEFW XLTAB ;1-IN-6 SECTOR SKEW TABLE DEFW NSECTS ;SECTORS PE..4) LD A,(IDBUFF+1) ;GET SIDE# BYTE FROM ID RECORD SRL A ;SHIFT OUT SIDE# BIT IN LSB JR NZ,PARM5 ;JUMP IF UPPER 7 BITS A(IX+13),H ;STORE IN 'CKV' POINTER SLOT LD E,(IX+16+11) LD D,(IX+16+12) ;LOAD DE WITH CHECK VECTOR LENGTH ADD HL,DE ;COMPUSIDED #TRACKS ON STACK PARM3A: LD A,SIDSEL+OFF OUT (PORT0),A ;SWITCH BACK TO REGULAR SIDE OF DISK ENDIF LD A,(IDBUFF+3) ;O START OF DPH EX DE,HL LD BC,14 ADD HL,BC ;POINT TO REST OF DPB STUFF NOW EX DE,HL LD BC,15+4 LDIR ;COPY DPB ANDECTORS BY 'BSH' TO GET RR L ; NUMBER OF BLOCKS ON DISK DJNZ PARM8 DEC HL ;RESULT LESS 1 IS 'DSM' VALUE FOR DPB LD (DDSR TRACK DEFB 3 ;BLOCK SHIFT DEFB 00000111B ;BLOCK MASK DEFB 00000000B ;EXTENT MASK DEFW 242 ;MAX BLOCK# DEFW 63 ;MARE NON-ZERO LD A,(HL) ;ELSE USE STANDARD VALUE FOR 'SPT' JR PARM6 ; FOUND IN PARAMETER TABLE ; PARM4: ADD A,A ;MULTIPLYTE ADDRESS OF ALLOCATION VECTOR LD (IX+14),L LD (IX+15),H ;STORE IN 'ALV' POINTER SLOT POP HL XOR A ;A=0 TO INDICATE PAGET SECTOR LENGTH BYTE FROM ID RECORD AND 00000011B LD (DDSTUFF+17),A ;STORE AS DEBLOCK MASK IN 'DDSTUFF' LD H,0 LD L,A  DEBLOCK PARAMETERS POP IX ;POINT IX TO BASE OF DISK STORAGE AREAS LD HL,DIRBUF ;GET ADDRESS OF DIRECTORY BUFFER LD (IX+8 X DIRECTORY ENTRY# DEFB 11000000B ;ALLOCATION MASK MSB DEFB 00000000B ;' ' LSB DEFW 16 ;CHECK SIZE DEFW RESFB 18*2 DEFB 00000011B DEFW 512 DEFB 9*4 DEFB 00000111B DEFW 1024 DEFB 5*8 ENDIF ; ; ; BASIC DISK PARAMS  DEFW RESERV ;RESERVED TRACKS DEFB 0 ;DEBLOCK SHIFT COUNT DEFB 00000000B ;DEBLOCK MASK DEFW 128 ;BYTES PER SECTOR ;DRIVE ; SPT EQU 16 BLM EQU 19 SHFCNT EQU 31 SECMSK EQU 32 SECLEN EQU 33 FLAGS EQU 35 ; ; ; ; READDB: LD IX,(DPHPTR*2 DEFB 00000011B DEFW 512 DEFB 15*4 DEFB 00000111B DEFW 1024 DEFB 8*8 ENDIF ; ; IF FIVE ; ; DISK PARA0 ;DEBLOCK MASK (DUMMY) DEFW 0 ;BYTES PER SECTOR (DUMMY) PAGE ;********************************************************ERV ;RESERVED TRACKS DEFB 0 ;DEBLOCK SHIFT COUNT DEFB 00000000B ;DEBLOCK MASK DEFW 128 ;BYTES PER SECTOR ; ; ; 8 IFOR DOUBLE DENSITY FORMATS ; DPBGEN BLS,DIRSIZ ;GENERATE BSH/BLM/DIRMSK CONSTS ; DDSTUFF: DEFW 0 ;NO SECTOR SKEW TABLE  ; ; 5 INCH SECTOR TRANSLATE TABLE (SAME AS XEROX/CROMEMCO/OSBORNE) ; XLTAB: DEFB 01,06,11,16 DEFB 03,08,13,18 DEFB 05) ;GET POINTER TO THIS DRIVE'S PARAMETERS LD A,1 LD (DIR),A ;SET DIRECTION FOR READ LD A,(IX+SHFCNT) OR A JR NZ,REAMS FOR STANDARD SINGLE DENSITY FORMAT ; 18 SECTORS / 128 BYTES ; SDSTUFF: DEFW XLTAB ;1-IN-5 SECTOR SKEW TABLE DEFW NS ;* * ;* LOGICAL SECTOR DEBLOCKING ROUTINES FOR * ;* CBIOS DISK READ/WRITE FUNCTIONS * ;* * ;***************NCH STANDARD SECTOR TRANSLATE TABLE ; XLTAB: DEFB 01,07,13,19,25 DEFB 05,11,17,23 DEFB 03,09,15,21 DEFB 02,08,14,20,26  DEFW 0 ;SECTORS PER TRACK (DUMMY) DEFB BSHFT ;BLOCK SHIFT DEFB BMASK ;BLOCK MASK DEFB 0 ;EXTENT MASK (DUMMY) DEFW,10,15 DEFB 02,07,12,17 DEFB 04,09,14 ; ; ; SECTOR DEBLOCK PARAMS FOR 5 INCH DOUBLE DENSITY DISKS ; FRMTAB: DEFB 0000D1 ;DO DEBLOCKING IF SECTOR LENGTH > 128 CALL FLUSH ;ELSE CLEAR ANY DEFERRED WRITES LD A,1 CALL RW128 ;READ 128 BYTE SECTS ;SECTORS PER TRACK DEFB 3 ;BLOCK SHIFT DEFB 00000111B ;BLOCK MASK DEFB 00000000B ;EXTENT MASK DEFW 81 ;MAX BLOCK***************************************** ; ; WRALL EQU 0 ;WRITE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2 DEFB 06,12,18,24 DEFB 04,10,16,22 ; ; ; SECTOR DEBLOCK PARAMS FOR 8 INCH DOUBLE DENSITY DISKS ; FRMTAB: DEFB 00000000B 0 ;MAX BLOCK# (DUMMY) DEFW DIRSIZ-1 ;MAX DIRECTORY ENTRY# DEFB HIGH DIRMSK ;ALLOCATION MASK MSB DEFB LOW DIRMSK ;ALLOCAT0000B ;DEBLOCK MASK DEFW 128 ;PHYSICAL SECTOR LENGTH DEFB 28 ;LOGICAL SECTORS PER TRACK DEFB 00000001B DEFW 256 DEECTOR DIRECTLY RET ; READ1: CALL PHYSECT ;TRANSLATE SECTOR# TO HOST EQUIV LD A,(WRTACT) OR A JR Z,READ2 ;JUMP IF W# DEFW 31 ;MAX DIRECTORY ENTRY# DEFB 10000000B ;ALLOCATION MASK MSB DEFB 00000000B ;' ' LSB DEFW 8 ;CHECK SIZE  ;WRITE TO UNALLOCATED ; ; INDEX OFFSETS TO ACCESS DEBLOCK PARAMETERS RELATIVE ; TO BASE ADDRESS OF DPH ENTRY FOR SPECIFIED  ;DEBLOCK MASK DEFW 128 ;PHYSICAL SECTOR LENGTH DEFB 52 ;LOGICAL SECTORS PER TRACK DEFB 00000001B DEFW 256 DEFB 26ION MASK LSB DEFW DIRSIZ/4 ;CHECK VECTOR SIZE DEFW RESERV ;RESERVED TRACKS DEFB 0 ;DEBLOCK SHIFT COUNT (DUMMY) DEFB  RITE BUFFER ACTIVE CALL FLUSH ;ELSE CLEAR OUT DEFERRED WRITE JR READ3 ; AND THEN READ NEW BUFFER FULL ; READ2: LD A,(READ3 ;READ NEW BUFFER RET NZ CALL WRITEHST RET ; ; START WRITING UNALLOCATED BLOCK BY SETTING PARAMETERS ; UNALOC: CAED BLOCK CP WRDIR JR Z,ALLOC ;JUMP IF DIRECTORY WRITE ; ; CHECK FOR CONTINUED WRITE TO UNALLOCATED BLOCK ; LD A,(SECTOTRK) INC HL LD (NXTTRK),HL UNAL5: XOR A RET ;RETURN WITH A=0 (NO ERRORS) ; ; ; TRANSLATE SECTOR# TO HOST DISK EQUIVARS) ; ; ; ; ; WRITEDB: LD IX,(DPHPTR) ;GET POINTER TO THIS DRIVE'S PARAMETERS XOR A LD (DIR),A ;FLAG AS WRITE OPERARET NZ ;EXIT IF DISK ERROR UNAL3: LD A,(SECTMP) ;ELSE COPY NEW DISK/TRACK/SECTOR LD (HSTSEC),A ; TO HOST DISK PARAMETERS DACT) OR A JR Z,READ3 ;READ INTO BUFFER IF DEBLOCK INACTIVE CALL HOSTCMP ;CHECK IF STILL USING SAME HOST SECTOR JR ZLL FLUSH ;FINISH ANY PREVIOUS DEBLOCKED WRITES LD A,(IX+BLM) LD (RCOUNT),A ;RCOUNT=SECTORS-PER-BLOCK MINUS 1 LD A,(SECTORR) LD HL,NXTSEC CP (HL) JR NZ,ALLOC LD HL,(TRACK) LD DE,(NXTTRK) OR A ;COMPARE NEW SECTOR/TRACK TO PREVIOUSLY SBCLENT ; PHYSECT: LD B,A ;LOAD B WITH SHIFT COUNT (RANGE 1..3) LD A,(SECTOR) DEC A ;REMOVE +1 BIAS FROM SECTOR NUMBERS TION LD A,(IX+SHFCNT) OR A JR NZ,WRITE1 ;DO DEBLOCKING FOR SECTORS > 128 BYTES CALL FLUSH ;ELSE END ANY DEFERRED WR LD HL,(TRACK) LD (HSTTRK),HL LD A,(DISK) LD (HSTDSK),A LD (HSTDPH),IX ;STORE DPH POINTER FOR CALLS TO 'FLUSH' UNAL4: C,READ4 ;GET RECORD FROM BUFFER IF STILL THERE READ3: LD A,(SECTMP) ;ELSE COPY NEW DISK/TRACK/SECTOR LD (HSTSEC),A ; TO HOS) LD (NXTSEC),A LD HL,(TRACK) ;STORE PARAMS FOR COMPUTATION OF LD (NXTTRK),HL ; SUCCESSIVE SECTOR NUMBERS IN BLOCK JR UN HL,DE ; ANTICIPATED NUMBERS FOR NEXT RECORD JR NZ,ALLOC ;JUMP IF NOT IN CURRENT BLOCK LD HL,RCOUNT ;CHECK IF RCOUNT HAS PHSEC2: SRL A DJNZ PHSEC2 INC A ;REINSTATE +1 BIAS TO SECTOR# LD (SECTMP),A ;SAVE FOR BUFFER RANGE TEST RET ; ; ; DITES XOR A CALL RW128 ;WRITE 128 BYTE SECTOR DIRECTLY RET ; WRITE1: CALL PHYSECT ;TRANSLATE HOST EQUIV OF SECTOR# ALL DEBLOCK ;MOVE 128 BYTES INTO BUFFER LD HL,NXTSEC INC (HL) ;ADD 1 TO CURRENT DISK ADDRESS TO LD A,(HL) ; GET NEXT SET DISK PARAMETERS LD HL,(TRACK) LD (HSTTRK),HL LD A,(DISK) LD (HSTDSK),A CALL READHST ;READ HOST SECTOR INTO DEBLOCK AL3 ; ; ARRIVE HERE ON SUCCESSIVE WRITES TO UNALLOCATED BLOCK ; UNAL2: DEC (HL) ;RCOUNT = RCOUNT-1 CALL HOSTCMP ;TEST IFREACHED ZERO LD A,(HL) OR A JR NZ,UNAL2 ;JUMP IF CONTINUED WRITE ALLOC: CALL FLUSH ;FINISH OLD WRITE BUSINESS CALL REBLOCK: LD A,(SECTOR) DEC A ;REMOVE SECTOR NUMBER +1 BIAS AND (IX+SECMSK) ;MASK SECTOR# OFF TO GET BUFFER INDEX LD H,0 XOR A LD (RDACT),A ;RESET READ BUFFER ACTIVE FLAG LD A,C ;WRITE TYPE IN C CP WRUAL JR Z,UNALOC ;JUMP IF NEW UNALLOCATCTOR/TRACK NUMBER IN BLOCK CP (IX+SPT) JR C,UNAL5 JR Z,UNAL5 LD (HL),1 ;RESET TO SECTOR# 1 AND BUMP TRACK# LD HL,(NXTBUFFER RET NZ ;EXIT IF DISK ERROR READ4: CALL DEBLOCK ;MOVE 128 BYTES FROM BUFFER XOR A RET ;RETURN WITH A=0 (NO ERRO STILL IN SAME HOST SECTOR JR Z,UNAL4 ;PUT RECORD INTO BUFFER IF NOT FULL CALL WRITEHST ;WRITE HOST SECTOR FROM BUFFER   LD L,A ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD BC,BIGBUF ADD HL,BC ;HL = H LD (RWFLAG),A ;STORE RWFLAG 1=READ 0=WRITE IF WINCH LD A,(HSTDSK) CP NFLOPPY JP NC,DOWINCH ;DO SASI DISK ROUTINE IF  LD (HSTPTR),HL LD A,1 LD (RDACT),A CALL DOIT ;READ SECTOR FROM DISK RET Z LD HL,RDACT LD (HL),0 ;CLEAR FLAG IF D A,'A' LD (DSKMSG+16),A LD HL,DSKMSG CALL PMSG ;PRINT OUT START OF MESSAGE LD BC,08FFH ;B=LOOPCOUNT C=255 FOR CPIR SCT),A ;TERMINATE ANY WRITE TO UNALLOCATED LD A,(WRTACT) OR A RET Z PUSH IX ;SAVE CURRENT DPH POINTER IN IX LD IX,(HS+33 ;SEEK SELECTED TRACK JR Z,DOFLP4 CALL REPORT ;REPORT SEEK ERROR TO CONSOLE JR Z,DOFLP2 RET ;RETURN PERMANENT ERROOST BUFFER ADDRESS LD DE,(POINTR) ;DE = DMA ADDRESS FROM BDOS LD A,(DIR) OR A JR NZ,DEBLK2 ;SKIP IF READ LD A,1 LD (ON HARD DISK ENDIF DOFLOP: LD A,(HSTDSK) LD C,A CALL MONITR+27 ;SELECT SPECIFIED DRIVE JR Z,DOFLP2 CALL REPORT ;REPOISK READ ERROR RET ; ; ; WRITEHST: LD HL,BIGBUF LD (HSTPTR),HL XOR A LD (WRTACT),A CALL DOIT ;WRITE SECTOR TO DAN LD A,E REP2: RLA JR C,REP3 PUSH AF XOR A CPIR ;SCAN MEMORY LOOKING FOR NULL POP AF DJNZ REP2 REP3: CALL PMSTDPH) ;LOAD RIGHT POINTER FOR STUFF IN BUFFER CALL WRITEHST ;WRITE BUFFER ONTO HOST DISK POP IX ;RESTORE DPH POINTER BEFORER IF INDICATED ; DOFLP4: LD HL,(HSTPTR) LD A,(HSTSEC) LD C,A LD A,(RWFLAG) OR A ;TEST DIRECTION 1=READ 0=WRITE JWRTACT),A ;INDICATE BUFFERED WRITE IS ACTIVE EX DE,HL ;SOURCE/DEST SWAP DEBLK2: LD BC,128 LDIR RET ; ; PAGE ; ; RT SELECT ERROR TO CONSOLE JR Z,DOFLOP RET ;RETURN PERMANENT ERROR IF NOT ZERO ; DOFLP2: LD B,SIDSEL+OFF ;DEFAULT TO SELISK RET ; ; ; RW128: LD HL,NEW LD DE,HOST LD BC,6 LDIR ;FALL THROUGH INTO 'DOIT' ; ; ... MASTER DISK READ/WRITG ;PRINT ERROR TYPE STRING LD A,E AND 11000000B ;MASK TO NOT-READY AND WRITE-PROTECT JR NZ,REP5 LD HL,TSMSG CALL PM GOING BACK RET PAGE ;******************************************************** ;* * ;* HOST DISK SELECT/SEEK/READR Z,DOFLP5 CALL MONITR+36 JR DOFLP6 ; DOFLP5: CALL MONITR+39 DOFLP6: RET Z ;RETURN IF READ/WRITE SUCCESSFUL CALL REPOR HOSTCMP: LD A,(SECTMP) LD HL,HSTSEC CP (HL) RET NZ LD HL,(TRACK) LD DE,(HSTTRK) OR A SBC HL,DE RET NZ LECT DISK SIDE ZERO LD A,(HSTTRK) CP NTRAKS ;TEST IF TRACK# IS ON OTHER SIDE JR C,DOFLP3 LD B,SIDSEL+ON ;SELECT OPPOSITEE ROUTINE ... ; ; CALL WITH IX POINTING TO DISK PARAMETER TABLES ; AND ACC CONTAINING R/W OPERATION INDICATOR. ; ; DOIT: SG LD A,(HSTTRK) CALL PUTDEC CALL PMSG LD A,(HSTSEC) CALL PUTDEC LD A,1 OR A RET ; REP5: LD HL,PROMPT CALL P/WRITE ROUTINE * ;* * ;******************************************************** ; ; ; ; ; READHST: LD HL,BIGBUF T JR Z,DOFLP4 ;TRY AGAIN IF INDICATED RET ; ; ; ; REPORT: LD E,A ;SAVE PERTINENT ERROR BITS IN E LD A,(HSTDSK) ADDD A,(DISK) LD HL,HSTDSK CP (HL) RET ; ; ; ; FLUSH: XOR A LD (RDACT),A ;FLAG BUFFERED READ AS INACTIVE LD (RCOUN SIDE SUB NTRAKS ;CONVERT TRACK# TO REAL VALUE DOFLP3: LD C,A LD A,B OUT (PORT0),A ;OUTPUT SIDE SELECT BIT CALL MONITR  MSG CALL IVEC ;LOOP FOR CONSOLE INPUT CP 'C'-64 JR Z,REP6 XOR A RET ; REP6: XOR A LD (IOBYTE+1),A ;CLEAR AUTO-LOGTUFF+7),HL LD A,(DDSTUFF+5) ;GET BLOCK MASK FROM DPB SRL A SRL A SRL A ;SHIFT RIGHT 3 TIMES GIVES EXTENT MASK INC Hoverrun',NULL DEFB 'drq',NULL DEFB 'busy',NULL DEFB NULL TSMSG: DEFB ' track ',NULL DEFB ' sector ',NULL PROMPT:RAMS FOUND OK RET ;RETURN WITH DPH POINTER IN HL ; ; ; EXOR3: INC HL INC DE EXOR2: INC HL INC DE EXOR1: LD A,(DE)  PNUM: OR '0' LD C,A CALL OVEC RET ; ; PDIGIT: LD C,-1 PDIG1: INC C SUB B JR NC,PDIG1 ADD A,B PUSH AF LD ABMASK DEFL 0 REPT 16 IF BTEMP EQ 1 EXITM ENDIF BSHFT DEFL BSHFT+1 ;GENERATE BLOCK SHIFT CONSTANT BMASK DEFL (BMA BYTE IF CTL-C ABORT INC A RET ;RETURN PERMANENT BIOS ERROR ; ; ; ; CHARACTER STRING OUTPUT ROUTINE. PRINTS ASCII DATA DEC H ;TEST IF 'DSM' IS > 255 JR Z,PARM9 SRL A PARM9: LD (DDSTUFF+6),A ;STORE VALUE FOR 'EXM' PARM10: LD HL,(PRMPTR) DEFB ' ?','H'-64,NULL ; ; ; ; ;  XOR (HL) ;COMPARE ID FIELD BYTES @HL AND @DE INC HL INC DE RET ; PAGE ; IF EIGHT ; ; DISK PARAMS FOR STANDARD S,C OR A CALL NZ,PNUM ;PRINT NUMERIC CHARACTER IF NON-ZERO POP AF RET ; ; ; ; ; ; NULL EQU 00H ;NULL (END-OF-STSK SHL 1) OR 1 ;GENERATE BLOCK MASK BTEMP DEFL BTEMP/2 ENDM DTEMP DEFL DSIZE DIRMSK DEFL 0 REPT 16 IF DTEMP EQ 0  ; POINTED TO BY HL UNTIL A DOLLAR SIGN IS ENCOUNTERED ; PMSG: LD A,(HL) ;HL POINTS TO ASCII STRING INC HL OR A ;TEST F LD DE,(DPHPTR) PUSH DE PUSH DE PUSH DE ;SAVE 3 COPIES OF POINTER TO DISK POOP LD BC,2 LDIR ;COPY 'XLT' ADDRESS TB PARM7: ADD HL,DE DJNZ PARM7 ;GET PRODUCT OF SPT*(NTRAKS-RESERV) LD A,(DDSTUFF+4) LD B,A PARM8: SRL H ;DIVIDE TOTAL S;******************************************************** ;* * ;* * ;********************************************RING INDICATOR) LF EQU 0AH ;LINE FEED CR EQU 0DH ;CARRIAGE RETURN DSKMSG: DEFB CR,LF DEFB 'BIOS error on A: ',NULL EXITM ENDIF DIRMSK DEFL (DIRMSK SHR 1) OR 8000H ;GENERATE DIRECTORY MASK IF DTEMP GT ((BSIZE*1024)/32) DTEMP DEFL DTEMP-OR BYTE EQUAL ZERO RET Z LD C,A ;PRINT CHARACTER IF NOT DOLLAR SIGN CALL OVEC JR PMSG ; ; ; ; PRINT CONTENTS OF A I; ; ... MACRO DEFINITIONS FOR DISK PARAMETER GENERATION ... ; DPBGEN MACRO BSIZE,DSIZE ;PASS BLOCK SIZE (IN KBYTES) AND .XLECTORS BY 'BSH' TO GET RR L ; NUMBER OF BLOCKS ON DISK DJNZ PARM8 DEC HL ;RESULT LESS 1 IS 'DSM' VALUE FOR DPB LD (DDS************ ; ; SIOVEC: DEFS 2 ;SIOB TX INTERRUPT DEFS 2 ;SIOB EXTERNAL/STATUS INTERRUPT DEFS 2 ;SIOB RX INTERRUPT  DEFB 'not ready',NULL DEFB 'wrt protect',NULL DEFB 'wrt fault',NULL DEFB 'not found',NULL DEFB 'bad crc',NULL DEFB '((BSIZE*1024)/32) ELSE DTEMP DEFL 0 ENDIF ENDM .LIST ENDM ; N DECIMAL (RANGE 0..255) ; PUTDEC: LD B,100 CALL PDIGIT ;PRINT HUNDREDS DIGIT LD B,10 CALL PDIGIT ;PRINT TENS DIGIT IST ; DIRECTORY SIZE (IN DIRECTORY ENTRIES) BTEMP DEFL (BSIZE*1024)/128 ;NUMBER OF 128 BYTE RECORDS/BLOCK BSHFT DEFL 0  DEFS 2 ;SIOB SPECIAL RX CONDITION INTERRUPT DEFS 2 ;SIOA TX INTERRUPT DEFS 2 ;SIOA EXTERNAL/STATUS INTERRUPT DEFS 2 ;SDEFS 1 ;NUMBER OF TICKS PER SECOND TIKCNT: DEFS 1 ;PRESCALER FOR 1 SECOND TIMER ; ; ; DISK I/O DRIVER VARIABLES CURDSK:R EXTENDED MONITOR AND CRTOUT ROUTINES. ; KBDVEC: DEFS 2 ;PARALLEL KEYBOARD RDAVEC: DEFS 2 ;SIO RECEIVED DATA INTERRUPT TI ;DISKS IN-USE FLAG FOR BACKGROUND DSKCNT: DEFS 1 ;... DISK TURN-OFF COUNTER RDYCNT: DEFS 1 ;... NOT-READY TIMER OLDCTC: DE FIFCNT: DEFS 1 ;FIFO DATA COUNTER FIFIN: DEFS 1 ;FIFO INPUT POINTER FIFOUT: DEFS 1 ;FIFO OUTPUT POINTER FIFSIZ: DEFS 1 ISK I/O CURSEC: DEFS 1 ;SECTOR# FOR READ/WRITE SECTOR CMDTYP: DEFS 1 ;COMMAND BYTE FOR READS/WRITES RWTRY: DEFS 1 ;READ/IOA RX INTERRUPT DEFS 2 ;SIOA SPECIAL RX CONDITION INTERRUPT CTCAV: DEFS 2 ;CTCA0 INTERRUPT (KBD STROBE) DEFS 2 DEFS  DEFS 1 ;CURRENTLY SELECTED DISK# CURTRK: DEFS 1 ;TRACK POSITION OF SELECTED DRIVE TRKTAB: DEFS 4 ;HEAD POSITIONS FOR 4 DRIKVEC: DEFS 2 ;ONE-SECOND INTERRUPT MONVEC: DEFS 2 ;EXTENDED MONITOR CRTVEC: DEFS 2 ;CRT OUTPUT DRIVER ; ; ; CLOCK-TIMER FS 1 ;... LAST CTCA1 COUNT ; ; ; ; CRT OUTPUT DRIVER VARIABLES RC EQU $ ;ROW/COLUMN FOR CRT CURSOR LOCATION ROW: DEFS  ;MAX FIFO SIZE PARAM ; ; CONNUM: DEFS 1 ;CURRENT CONSOLE DEVICE# (0,1 OR 2) SIOADR: DEFS 1 ;CONSOLE SIO CONTROL/DATA PORTWRITE RETRY COUNT FNDTRY: DEFS 1 ;SEEK RETRY COUNT ERRTYP: DEFS 1 ;ERROR STATUS FOR READ/WRITE ROUTINES IOPTR: DEFS 2 ;DIS2 DEFS 2 ;CTCA3 INTERRUPT (CRT VERT SYNC) CTCBV: DEFS 2 DEFS 2 DEFS 2 ;CTCB2 INTERRUPT (MILLISECOND TIMER) DEFS 2 VES DEFS 4 ;DENSITY CONTROL BITS FOR 4 DRIVES SPEED: DEFS 1 ;SEEK SPEED FOR 1771 COMMANDS SETTLE: DEFS 1 ;HEAD SETTLING TINTERRUPT VARIABLES TOD EQU $ SECS: DEFS 1 ;CLOCK SECONDS MINS: DEFS 1 ; MINUTES HRS: DEFS 1 ; HOURS DAY: DE1 COL: DEFS 1 BLANK: DEFS 1 ;CHARACTER USED FOR BLANK FILL ATTRIB: DEFS 1 ;CURRENT CHARACTER ATTRIBUTE BITS GMODE: DEFS 1  NUMBER DEFS 1 ; ; CONFIG: DEFS 1 ;STDBB AND D/S BITS FOR MONITOR DSCOPY: DEFS 1 ;CONTROL BYTE FOR D/S BANK SWITCH BIT K I/O BUFFER POINTER SELCPY: DEFS 1 ;COPY OF DATA IN SELECT/MUX OUTPUTS STPVEC: DEFS 2 ;VECTOR FOR STEP FINITE STATE MACHINE;CTCB3 INTERRUPT (CLOCK TICK) DMAVEC: DEFS 2 ;DMA READY INTERRUPT DEFS 2 ;DMA MATCH INTERRUPT DEFS 2 ;DMA END-OF-BLOCKIME BLKSIZ: DEFS 2 ;MAX DMA BLOCK SIZE FOR READ/WRITE NSTOP: DEFS 1 ;NUMBER OF INDEX PULSES TILL DISK STOP NREVS: DEFS 1 ;FS 1 ;CALENDAR DAY MONTH: DEFS 1 ; MONTH YEAR: DEFS 1 ; YEAR ; TICKS: DEFS 2 ;CLOCK TICK INTERRUPT COUNTER NTICKS:  ;CURRENT DISPLAY MODE BITS ESCVEC: DEFS 2 ;POINTER FOR LEAD-IN SEQUENCE ROUTINES ROWTMP: DEFS 1 SCROLL: DEFS 1 ;SCROLL REQSTDCPY: DEFS 1 ;CONTROL BYTE FOR STD BANK SWITCH BIT ; ; ; VECTORS FOR EXTRA FUNCTIONS IN KBD/SIO/TIMER INTERRUPTS ; AND FO STPCMD: DEFS 1 ;... 179X STEP COMMAND BYTE STPCNT: DEFS 1 ;... LOOP COUNT STPDLY: DEFS 1 ;... DELAY COUNT INUSE: DEFS 1  INTERRUPT DEFS 2 ;DMA MATCH/END INTERRUPT DEFS 64 ;EXTRA INTERRUPT VECTORS ; ; ; KEYBOARD DATA INPUT FIFO VARIABLES NUMBER OF INDEX PULSES BEFORE READY DSKTYP: DEFS 1 ;DISK TYPE / DENSITY INDICATOR MAXRWT: DEFS 1 ;MAXIMUM RETRY NUMBER FOR D  UEST FLAG START: DEFS 2 ;CONTENTS OF 6845 START ADDRESS REG NEWLIN: DEFS 2 ;RELATIVE ADDR OF NEW LINE AFTER SCROLL MOVECS:  (TYPEFLAG),A ;STORE NEW CONFIG JP STARTA ;DISPLAY IT STEPCNT: PRINT PRINT PRINT call getres ld a,b or a jr z,retry xor a ld (hl),DEFS 1 ;CURSOR-MOVE REQUEST FLAG CURSOR: DEFS 2 ;OFFSET (0..2047) TO CURSOR LOCATION OLDCSR: DEFS 2 ;POINTER TO CURSOR IN A/4" DRIVES ?" (A-D) OR (CR)--'> CHARIN RES 5,A CP 13 JR Z,TIME8 CP 'A' ;CHECK VALIDITY JP C,STARTA CP 'D'+1 JP dified bios.'> CALL TYPECON ;DISPLAY CONFIG. PRINT LD A,(ACTIV) OR A JP NZ,STEPCNT PRINT 'WANT TO MAKE Anloop makebig: cp 60h ret c res 5,a ret TYPECON: PRINT LD A,(TYPEFLAG) LD C,A LD B,4 ;MAX DRIV3 * ;* 7553 KK Hengelo (o) * ;* 074-913022 * ;* Nederland * ;* * ;* Last edit date 19-May-1983 * ;* a hexin buffer LD (SPEED5),A RETRY: PRINT call getreTTR MEMORY CRTFLG: DEFS 1 ;CRT PARAMETER BITS TYPEFLAG: DEFS 1 ;DISK TYPE FLAG (FOR MIXED BIOS) SPEED8: DEFS 1 ;8 INCH DRNC,STARTA AND 7 ;MAKE IT 1-4 LD B,A LD A,1 GTSPMSK: RRCA DJNZ GTSPMSK LD B,A LD A,(TYPEFLAG) XOR B LD (TYPEFNY CHANGE ? (A-D) OR (CR) TO SKIP - ' CHARIN RES 5,A CP 13 JR Z,STEPCNT CP 'A' JP C,BEGIN CP 'D'+1 JP NC,BEGIN E NO LD A,'A' TYPEIT: SRL C CALL C,TYPE8 ;8 INCH CALL NC,TYPE5 ;5 INCH INC A DJNZ TYPEIT RET TYPE8: SAVE  * ;******************************************************** SYSRAM EQU 0FF00H BDOS EQU 5 BEGIN: XOR A LD (ACs ld a,b or a jr z,quit xor a ld (hl),a hexin buffer LD (MAXRWT),A QUIT: PRINT POP AF PUSH AF CHAROUT PRINT ' IS CONFIGURED AS "8 INCH"' POP AF RESTORE RET TIV),A STARTA: PRINT <1AH,09H,09H,1BH,'G','4','CONFIG PROGRAM',1BH,'G','0'> PRINT PRINT <1Bh,'G','1','WarninM !!!!'> RET getres: ld b,0 ;char count ld hl,buffer inloop: push bc push hl ld c,1 call bdos pop hl pop  PAGE 64 TITLE CONFIGURATOR 21-JAN-1983 MACLIB ZMACRO.LIB ;******************************************************** ;* R CR) --'> call getres ld a,b or a jr z,time5 xor a ld (hl),a hexin buffer ld (speed8),a time5: PRINT PROGRAM EXAMPROG.COM'(the .COM is optional) ; (The program will bounce ifTDPH) ;LOAD RIGHT POINTER FOR STUFF IN BUFFER CALL WRITEHST ;WRITE BUFFER ONTO HOST DISK POP IX ;RESTORE DPH POINTER BEFOREelope. ; edit 11-1-82 to remove reference to 2716's ; edit 10-21-82 to include jumper information ; ; the program is intendeE - '> POP AF PUSH AF CHAROUT PRINT ' IS CONFIGURED AS "5 1/4 INCH DOUBLE STEPS"' POP AF RESTORE RET T5SING: . ; Following programming, the 2732/2716 is verified, ; and any errors reported. The program can possibly be modified ; to bu 2732 ENDIF IF T2716 TITLE PROGRAMMER, 2716 ENDIF ; ; This routine reads a CP/M .COM file of maximum size 4k bytes  it doesn't find a .com file) ; ; The rest is automatic ; ; ;******************************************************** ;  GOING BACK RET PAGE ;******************************************************** ;* * ;* HOST DISK SELECT/SEEK/READd to be assembled using MACRO-80 ; .phase/.dephase commands work well to get code to 100h for .com file ; ; Instructions forSAVE PUSH AF PRINT POP AF PUSH AF CHAROUT PRINT ' IS CONFIGURED AS "5 1/4 INCH SINGLE STEPS"' Prn other PROMS, but the reader should proceed with caution. ; Programming requirements vary considerably. ; ; jumpering for U; and burns it in a 2732 installed in U80 of BIGBOARD II. ; Or into a 2716 installed in U81. ; The 2732/2716 is 1st checked ag * ; 2716 Entry's included 26/06/83 * ; * ; by L.Koopman * ; Waarbekenplein 13 * ; 7553 KK Hengelo (o) /WRITE ROUTINE * ;* * ;******************************************************** ; ; ; ; ; READHST: LD HL,BIGBUF  use: ; Your code should be stored in a CP/M .COM file. ; To program, for example, EXAMPROG.COM ; ; Turn on your programmingOP AF RESTORE RET ACTIV: DEFS 1 BUFFER: BUFF2 EQU $+1 DEFS 80 .XLIST .PHASE SYSRAM INCLUDE MEMDEF.MAC .DEPHA-80 (2732) is as follows: ; ; pin 18 to REC5 ; pin 20 to /OE/VPP5 ; pin 21 TO RA11 ; ; ; D. H. DURLAND ; 663 Georgia Av  * ; Tel. 074-913022 * ; Holland * ; * ; jumpering for U-81 (2716) is as follows: * ; * ; pin 18 to t ; LD C,35 ; compute file size LD DE,FCB CALL BDOS LD HL,R2 ; point to high virtual size byte LD A,(HL) DEC HL BUMFIL ; if not, go report no file ; ; now check for no type spec or .COM ; LD DE,65H ; 1st type in FCB LD HL,COMTBL L,0 OUT (SYS1),A ; switch in the PROMS EI ; ; 1st we check the PROM for 0-1 transitions ; LD HL,SRCMEM ; source code  ROMSIZ EQU 2048 ; size of a 2716 ENDIF MAXREC EQU ROMSIZ/128 PRAM EQU 8000H ; where some of this will run IF T2716 DOS ; read a record POP DE ; recover DMA ADDR OR A ; successful? JR Z,RDLP ; if not past end of file ; CP 1 ; end PGM * ; pin 20 to RECX * ; pin 21 to /OE/VPP4 * ; * ; pin 2 of U44 must be lifted for programming and * ;  OR (HL) ; middle byte JP NZ,TOOBIG ; both high bytes must be 0 ; DEC HL LD A,MAXREC CP (HL) ; least significant byteD BC,3 ; COM0: LD A,(DE) ; get type CP ' ' JR Z,COM1 ; space OK ; CP (HL) ; ck letter JP NZ,BUMFIL ; insist on s LD DE,ROMLOC ; PROM address LD A,TRUE LD (BITSOK),A ; initialize assuming OK ; CKLOOP: LD A,(DE) ; get a PROM byte O ROMLOC EQU 4000H ; ROM LOCATION ENDIF IF T2732 ROMLOC EQU 5000H ; ROM LOCATION ENDIF ROMCPY EQU 0A000H ; PROM cof file? JP NZ,BUMRD ; anything else is an error ; ; now we move the next section up to 8000 and jump to it, ; as we are goverify of a 2716 eprom. * ; * ;******************************************************** BOOT EQU 0 FCB EQU 5CH  JP C,TOOBIG ; MAXREC records maximum ; ; fill with FF 1st ; LD HL,SRCMEM LD DE,SRCMEM+1 LD (HL),0FFH LD BC,ROMSIZ pace or correct letter ; COM1: LDI ; move a letter JP PE,COM0 ; until COM moved in ; JR OPNFIL ; go open it ; COMR (HL) LD B,A ; save with (possibly) extra bits LD A,(DE) ; get PROM again CP B JR NC,CKADUP ; if no bits went up ; opied here ENDCK EQU HIGH (SRCMEM+ROMSIZ) ; ASEG org 100h ; ; PROGRM: LD SP,STACK ; Underneath code to be burned ; ; ing to bank switch in the PROMS and can't operate ; from CP/M ; LD DE,BURNIT LD HL,BURNLO LD BC,BRNEND-BURNIT LDIR ; BDOS EQU 5 CR EQU 0DH LF EQU 0AH R2 EQU 7FH SYS1 EQU 0C8H PROG EQU 0C0H CTCB3 EQU 08BH SRCMEM EQU 9000H ; park source h; byte count LDIR ; do it ; ; now the actual read ; LD DE,SRCMEM-128 RDLP: LD HL,128 ADD HL,DE ; update DMA ADDR TBL: DEFM 'COM' ; OPNFIL: LD C,15 ; open file LD DE,FCB CALL BDOS OR A ; set flags JP M,BUMFIL ; if can't find i LD A,FALSE LD (BITSOK),A ; flag for message at end JP ROMOUT ; go back to CP/M ; CKADUP: INC HL INC DE LD A,H CP E1st check to be sure a name has been entered. ; LD HL,FCB+1 ; 1 past drive LD A,(HL) CP ' ' ; is there a letter? JP Z, move code up JP BURNIT ; and go to it ; BURNLO EQU $ ; .PHASE PRAM ; out of bank switched area ; BURNIT: DI LD Aere STACK EQU SRCMEM ON EQU 00001000B OFF EQU 00000000B IF T2732 ROMSIZ EQU 4096 ; size of a 2732 ENDIF IF T2716  EX DE,HL PUSH DE ; save DMA ADDR LD C,26 ; set DMA ADDR CALL BDOS ; LD C,20 ; read sequential LD DE,FCB CALL B NDCK ; 1 past end JR C,CKLOOP ; for 2k or 4k bytes ; ; at this point we know that the PROM is at least theoretically ; proy it. ; LD B,3 LD C,PROG LD HL,NRMTBL ; table to go back to normal OTIR ; go back ; JR VERIF1 ; and verify NRMTBcomes reference MSCHG: IN A,(CTCB3) CP C ; change? JR Z,MSCHG ; until a change ; DJNZ CNTMS ; do 50x 1 millisec PP ; catch all bytes ; LD A,(ROMOK) OR A JP Z,FINIS ; if not ok, no reporting to be done ; LD DE,VERMSG ; else report100B+ON ; to turn on program voltage ; BURNLP: LD A,(BC) ; PROM copy CP (HL) ; same as source? JR Z,BURN9 ; skip burnNEND EQU $ ; BITSOK: DEFS 1 ; goes false on 0 to 1 transition request ROMOK: DEFS 1 ; goes false on bad verify ; .DEPHASgrammable. Copy it into ROMCPY for reference. ; LD HL,ROMLOC ; PROM LD DE,ROMCPY ; copy destination LD BC,ROMSIZ ; byte L: DEFB 00000100B+OFF ; to turn off program voltage DEFB 00000001B+OFF ; to enable chip set decoder DEFB 00000000B+OFF ; tOP BC ; retrieve copy address ; IF T2732 LD A,00000001B+ON OUT (PROG),A ; /DECODE high thus /CS high ENDIF IF T271 success, and quit CALL PMSG JP FINIS ; ; Report receives DE pointing to the bad PROM byte and HL pointing ; to the sour if so (save time) ; LD A,(HL) ; get source LD (DE),A ; latch it to PROM for burn ; IF T2732 LD A,00000001B+OFF OUE ; VERIFY: LD A,(BITSOK) OR A JP Z,BITNG ; go report no try ; LD DE,CRLF ; else do the verification CALL PMSG ;count LDIR ; move it ; ; here is the actual burn ; LD B,3 LD C,PROG LD HL,BRNTBL ; table of output words OTIR ;o turn off out buff and enable PROM ; VERIF1: ; ; 1st we copy the burned PROM into ROMCPY ; LD HL,ROMLOC ; PROM LD DE,R6 LD A,00000011B+OFF OUT (PROG),A ; pgm off ENDIF ; BURN9: ; can get here if PROM=source ; (see BURNLP+2) ; ce byte. HL is a relative address. ; REPORT: PUSH DE PUSH HL CALL MOVE4 ; move address into message LD A,(DE) ; get bT (PROG),A ; /DECODE low thus /CS low ENDIF IF T2716 LD A,00000011B+ON ; pgm on OUT (PROG),A ; PROGRAM PULSE ON END put crlf ; LD A,TRUE LD (ROMOK),A ; assume ok LD HL,SRCMEM ; source start LD DE,ROMCPY ; PROM copy ; VLP: LD A,(DE get set ; LD HL,SRCMEM ; source code LD DE,ROMLOC ; PROM address LD BC,ROMCPY ; copy address JR BURNLP ; and do it BOMCPY ; copy destination LD BC,ROMSIZ ; byte count LDIR ; move it ; ; Now switch out the PROMS and go back to CP/M forINC HL INC DE INC BC LD A,H CP ENDCK ; 1 past end JR C,BURNLP ; for 4k bytes ; ; PROM is now burned. Time to verifad PROM byte LD DE,ERRMS4 CALL MOVE2 ; move bad PROM byte to message LD A,(HL) ; get source byte LD DE,ERRMS6 CALL MIF ; PUSH BC ; save copy address LD B,50 ; millisecond count CNTMS: IN A,(CTCB3) ; get current count LD C,A ; it be) ; get a PROM byte CP (HL) ; match? CALL NZ,REPORT ; if not INC HL INC DE LD A,H CP ENDCK ; 1 past end JR C,VLRNTBL: DEFB 00000000B+ON ; to disable PROM outs, enable U-57 outs DEFB 00000001B+ON ; to disable PROM /CS lines DEFB 00000 verification. ; ROMOUT: DI LD A,8 OUT (SYS1),A ; switch out the PROMS EI JP VERIFY ; go do the verification ; BR OVE2 ; move to message LD DE,ERRMS1 CALL PMSG ; print the error message POP HL POP DE LD A,FALSE LD (ROMOK),A ; if$' ; FINIS: JP BOOT ; END ; $' ; TOOBIG: LD DE,BIGMSG CALL PMSG JP FINIS BIGMSG: DEFM CR,LF,'Too big for PROM',CR,LF,'$' ; BUMRD: LD DE,RDMSGECT: LD HL,DIRBUF LD C,2 CALL MONITR+36 ;READ SIGNON MESSAGE INTO TEMP BUFFER JR NZ,BTERR LD HL,CBIOS LD B,BIOSLEN/1restore entire byte MOVNIB: AND 0FH ; only low part of interest ADD A,90H DAA ADC A,40H DAA ; convert to ASCII L we get here at all, we have a problem RET ; ; MOVE4 converts the address to ASCII and moves it to the message area ; MOVE CALL PMSG JP FINIS RDMSG: DEFM CR,LF,'Bad read, aborting',CR,LF,'$' ; PMSG: LD C,9 CALL BDOS RET ; ERRMS1: D28 LD C,3 OSEC2: PUSH HL ;SAVE PARAMETERS PUSH BC CALL MONITR+36 ;CALL MONITOR DISK READ ROUTINE POP BC POP HL JR D (DE),A ; put it in the message area INC DE ; advance to next slot RET ; ; this area contains abort routines and messag4: PUSH DE LD DE,ERRMS2 LD A,H RES 7,A ; modulo 4k CALL MOVE2 ; move H to message area LEFM 'Relative ' ERRMS2: DEFS 4 ; will hold address ERRMS3: DEFM '=' ERRMS4: DEFS 2 ; will hold bad PROM byte ERRMS5:NZ,BTERR LD DE,128 ADD HL,DE INC C DJNZ OSEC2 ;REPEAT UNTIL ALL BIOS READ IN ; ; ... PUT COLDSTART INIT HERE TO CONSEes ; BITNG: LD DE,BITMSG CALL PMSG JP FINIS BITMSG: DEFM CR,LF,'Bits not all blank. Not programmable.' DEFM ' Ab;******************************************************** ;* * ;* ONE-SECTOR LOADER FOR FIRST STAGE DD BOOT * ;* D A,L CALL MOVE2 ; and L POP DE RET ; ; MOVE2 converts a HEX byte to two ASCII characters and moves ; them into the  DEFM ' should=' ERRMS6: DEFS 2 ; will hold source byte CRLF: DEFM CR,LF,'$' VERMSG: DEFM 'PROM verifies OK',CR,LF,'RVE BIOS SPACE .. ; IF WINCH LD A,RST+ON OUT (SASI+1),A ;RESET SASI BUS CONTROLLER(S) LD A,RST+OFF OUT (SASI+1),A Eorting',CR,LF,'$' ; BUMFIL: LD DE,FILMSG CALL PMSG JP FINIS FILMSG: DEFM CR,LF,'Improper file specification',CR,LF,'* ;******************************************************** ; ; ; ... READ CBIOS FROM SINGLE DENSITY TRACK ZERO ... ; ONESmessage area ; MOVE2: PUSH AF RRA RRA RRA RRA ; get high nibble into low CALL MOVNIB ; and move it POP AF ;  NDIF IF SERIAL LD HL,(MONITR+16) ;PATCH MONITOR CONOUT VECTOR TO LD (MONITR+13),HL ; DIRECT OUTPUT TO BUILT-IN CRT DRIVER  * ;* Edit by L.Koopman 20-Jan--1983 * ;* Waarbekenplein 13 * ;* 7553 KK Hengelo (o) * ;* phone 074-913022 *  ; ; ; ENTRY POINT DBBUG EQU 46D2H+BASE ;DEBLOCK BUG LOCATION IN BDOS CBIOS EQU 4A00H+BASE ;BASE OF CUSTOM BIOS CPMSIZE EQU (CBIOS-C ;EXECUTE BIOS COLDSTART ROUTINE ; ; ;LSTINIT: ;SERIAL PRINTER INIT CONSTANTS ; DEFB 4 ; DEFB 01000101B ;16X CLOCK / 1 SUBLE EQU FALSE ;SINGLE/DOUBLE SIDED DRIVE ENABLE DDTRK0 EQU FALSE ;TRACK ZERO IS DOUBLE DENSITY (5" ONLY). FIVE EQU FALSE ; ENDIF LD HL,DIRBUF CALL PMSG ;OUTPUT SIGNON MSG PARKED IN 'DIRBUF' XOR A LD (IOBYTE),A ;CLEAR IOBYTE LD A,USRDRV  ;* Nederland. * ;* * ;* To include mixed drive combination * ;* of 8 and 5 1/4 inch. * ;* * ;* * .Z80 PAGE 64 ;******************************************************** ;* * ;* -- CUSTOM BIOS FOR CP/M VERSION 2.CP)/128 ;NUMBER OF RECORDS NEEDED FOR CCP+BDOS MONITR EQU 0F000H ;BASE OF SYSTEM MONITOR SYSRAM EQU 0FF00H ;BASE OF SYSTETOP BIT / ODD PARITY ; DEFB 3 ; DEFB 01000001B ;RX 7 BIT CHARACTERS ; DEFB 5 ; DEFB 10101010B ;TX 7 BIT CHARACTERS / DTR ANDSELECT 5 INCH FLOPPYS EIGHT EQU TRUE ;SELECT 8 INCH FLOPPYS MIXED EQU FALSE ;TRUE FOR MIXED 8 & 5 INCH DRIVES SERIAL EQU FALD (IOBYTE+1),A ;SET DEFAULT DRIVE/USER FOR COLDSTART LD HL,SCRATCH LD (HL),0 LD DE,SCRATCH+1 LD BC,SCRLEN-1 LDIR ;Z ;* Last edit date: 04-JULY-1983 * ;* * ;* * ;******************************************************** ; 2 -- * ;* * ;* DOUBLE DENSITY CBIOS FOR BIGBOARD-II * ;* * ;* COPYRIGHT (C) 1982 BY RUSSELL SMITH * ;* M VARIABLES SCRATCH EQU 0F780H ;RAM AREA FOR BIOS/CPM BUFFERS ; ; ... DEFINE HOW MANY DRIVES IN SYSTEM ... ; WINCH EQU 0  RTS HIGH ; ; DEFB 01000111B ;PROGRAM CTC AND LOAD TIME CONST ; DEFB 32 ;DIVIDE BY 32 GIVES 1200 BAUD ; ; ; BTERR: LD A,LSE ;DISABLE SIO/CRT CONSOLE COMBINATION ; ; IF MIXED MSIZE EQU 59 ;MEMORY SIZE IN KBYTES (RANGE 20..60) ELSE MSIZE EERO-OUT SCRATCH MEMORY FOR BIOS ; LD HL,LSTINIT ; LD B,6 ; LD C,LSTCTL ; OTIR ;SET PRINTER PARITY/LENGTH/STOP BITS ASEG .TFCOND ;TOGGLE LIST FALSE CONDITIONALS .Z80 ;USE ZILOG MNEMONICS ; TRUE EQU 1 FALSE EQU 0 ; ; ...DEFINE THE S 818 WEST HICKORY * ;* DENTON, TEXAS 76201 * ;* * ;* LAST EDIT DATE: 21-AUGUST-82 * ;* * ;* ;NUMBER OF WINCHESTERS (0..1) IN SYSTEM NFLOPPY EQU 2 ;NUMBER OF FLOPPYS (1..4) IN SYSTEM ; ; IF FIVE TITLE 5 1/4 INCH B'?' CALL MONITR+12 ;OUTPUT ERROR INDICATION TO CONSOLE LD A,'G'-64 CALL MONITR+12 JP MONITR+3 ;JUMP BACK TO MONITOR ROM QU 60 ENDIF BASE EQU (MSIZE-20)*1024 CCP EQU 3400H+BASE ;CONSOLE COMMAND PROCESSOR BDOS EQU 3C06H+BASE ;OPERATING SYSTEM ; LD B,2 ; LD C,LSTBAUD ; OTIR ;SET PRINTER BAUDRATE LD A,1 LD (TRKTAB+4),A ;SET DRIVE ZERO TO DOUBLE DENSITY JP CBIOSYSTEM VARIABLES... ; IOBYTE EQU 0003H ;INTEL CONFIGURATION BYTE USRDRV EQU 00H ;USER/DRIVE TO LOG ON AFTER COLDSTART ; DO B ][ CBIOS. ENDIF IF EIGHT TITLE 8 INCH BB ][ CBIOS. ENDIF IF MIXED TITLE MIXED BB ][ CBIOS. ENDIF ; ; ; ... DE .LIST ; ; ; ... EQUATES FOR PRINTER DRIVER PORTS/HANDSHAKE MODE ... ; LSTDAT EQU 80H ;SIO CHANNEL A DATA PORT# LSTCTL EQ((5*N5TRAKS*2)/B5LS)/8 D5IRSIZ EQU 128 ELSE A5LLMAX EQU ((5*N5TRAKS)/B5LS)/8 D5IRSIZ EQU 64 ENDIF ; N8SECTS EQU 26 ;.8 inch version.......' ENDIF DEFB NULL ; PAGE ; ; ; ... BIOS CODE STARTS HERE WITH JUMP VECTORS ... ; ORG CBIOS ;RACKS PER SURFACE RESERV EQU 2 ;NUMBER OF RESERVED TRACKS BLS EQU 2 ;DOUBLE DENSITY BLOCKSIZE IN KBYTES IF DOUBLE ALLMAX  ENDIF .DEPHASE ; ; PAGE ORG CBIOS-128 ; ; ; ... CREATE SIGNON MESSAGE FOR SELECTED MEMORY SIZE CPM ... ; M1 EQU (MFINE TRACK/SECTOR PARAMS FOR STANDARD FLOPPYS ... ; IF FIVE NSECTS EQU 18 ;SINGLE DENSITY SECTORS PER TRACK NTRAKS EQU 40 U 81H ;SIO CHANNEL A CONTROL PORT# LSTBAUD EQU 89H ;SIO CHANNEL A BAUDRATE CTC PORT# XONXOFF EQU TRUE ;ENABLE XON-XOFF HASINGLE DENSITY SECTORS PER TRACK N8TRAKS EQU 77 ;NUMBER OF TRACKS PER SURFACE R8ESERV EQU 2 ;NUMBER OF RESERVED TRACKS B8LS JP BOOT JP WBOOT JP CONST IVEC: JP CONIN OVEC: JP CONOUT JP LIST JP CONOUT ;PUNCH VECTOR SAME AS CONOUT JP CONINEQU ((9*NTRAKS*2)/BLS)/8 DIRSIZ EQU 128 ELSE ALLMAX EQU ((9*NTRAKS)/BLS)/8 DIRSIZ EQU 128 ENDIF ENDIF IF MIXED N5SSIZE / 10) OR '0' ;TENS DIGIT OF MSIZE IN ASCII M2 EQU (MSIZE MOD 10) OR '0' ;ONES DIGIT ; DEFB CR,LF DEFB '.. Cal-Tex Com ;NUMBER OF TRACKS PER SURFACE RESERV EQU 3 ;NUMBER OF RESERVED TRACKS BLS EQU 2 ;DOUBLE DENSITY BLOCKSIZE IN KBYTES MBLK ENDSHAKE CTS EQU 00100000B ;CLEAR-TO-SEND BIT POSITION IN SIO RR0 SYNC EQU 00010000B ;SYNC/HUNT BIT DCD EQU 00001000B ;DATA- EQU 2 ;DOUBLE DENSITY BLOCKSIZE IN KBYTES IF DOUBLE A8LLMAX EQU ((9*N8TRAKS*2)/B8LS)/8 D8IRSIZ EQU 128 ELSE A8LLMAX EQU ;READER VECTOR SAME AS CONIN JP HOME JP SELENTRY ;'SELDISK' WITH LOCAL STACK JP SETTRACK JP SETSECT JP SETDMA JP RECTS EQU 18 ;SINGLE DENSITY SECTORS PER TRACK N5TRAKS EQU 80 ;NUMBER OF TRACKS PER SURFACE R5ESERV EQU 3 ;NUMBER OF RESERVEputers ',M1,M2,'K CP/M version 2.2 ..' DEFB CR,LF DEFB '...... release date 15-September-82 ......' DEFB CR,LF IF MIXED QU (((NTRAKS-RESERV)*NSECTS)/8)-1 IF DOUBLE ALLMAX EQU ((5*NTRAKS*2)/BLS)/8 DIRSIZ EQU 128 ELSE ALLMAX EQU ((5*NTRAKS)/BLCARRIER-DETECT BIT TBE EQU 00000100B ;TRANSMIT-BUFFER-EMPTY BIT TXMASK EQU DCD+TBE ;LOOP UNTIL DCD AND TBE BITS ARE TRUE ; ((9*N8TRAKS)/B8LS)/8 D8IRSIZ EQU 128 ENDIF ENDIF ; ; ; .XLIST INCLUDE MACROS.MAC ;ASSEMBLE WITH MACRO DEFINITIONS DENTRY ;'READDB' WITH LOCAL STACK JP WRTENTRY ;'WRITEDB' WITH LOCAL STACK JP LISTST JP SECTRAN ; ; ; ... ENTRY POINTS D TRACKS B5LS EQU 2 ;DOUBLE DENSITY BLOCKSIZE IN KBYTES M5BLK EQU (((N5TRAKS-R5ESERV)*N5SECTS)/8)-1 IF DOUBLE A5LLMAX EQU  DEFB '..Mixed version of 19-05-83..' ENDIF IF FIVE DEFB '.....5 1/4 inch version.....' ENDIF IF EIGHT DEFB '......S)/8 DIRSIZ EQU 64 ENDIF ENDIF ; IF EIGHT NSECTS EQU 26 ;SINGLE DENSITY SECTORS PER TRACK NTRAKS EQU 77 ;NUMBER OF T ; ; PAGE ORG CBIOS-256 .PHASE 0080H IF DDTRK0 INCLUDE DDOSECT.MAC ELSE INCLUDE ONESECT.MAC ;ONE SECTOR LOADER  FOR COMPLEX DISK ROUTINES ... ; SELENTRY: LD (SPSAVE),SP LD SP,BIOSTK PUSH IX CALL SELDISK POP IX LD SP,(SPSAVE) CP/M FROM TRACK #1 XOR A ;READ ZERO SECTORS FROM TRACK #2 WBOOT4: LD HL,CCP PUSH AF CALL RTRACK ;READ CCP+BDOS FROM DOUMS ;SELECT A: AND FIND TRACK #1 FORMAT JR NZ,BOMB ;EXIT IF PERMANENT ERROR LD HL,DPHTAB+SPT ;GET LOGICAL SECTORS-PER-TRARK2 ;BUMP SECTOR# AND LOAD ADDRESS TILL B=0 LD A,(TRACK) INC A ;BUMP TRACK# AFTER LAST SECTOR IS READ LD (TRACK),A RD/WRITE LOCAL STACK AREA DEFB 0,0,0,0 DEFB 0,0,0,0 DEFB 0,0,0,0 DEFB 0,0,0,0 DEFB 0,0,0,0 JP WBOOT2 BIOSTK-ON A: IF DRIVE# IS ILLEGALY LARGE GOCPM3: LD HL,CCP LD A,(HL) ;PEEK AT FIRST OPCODE IN CCP CP 0C3H JR NZ,BOMB ;ABOR RET ; ; ; RDENTRY: LD (SPSAVE),SP LD SP,BIOSTK PUSH IX CALL READDB POP IX LD SP,(SPSAVE) RET ; ; ; WRTENTBLE DENSITY POP BC INC B DEC B CALL NZ,RTRACK ;CONDITIONAL READ FROM TRACK #2 GOCPM: LD HL,MEMTAB ;PREPARE TO STORE VCK PARAM LD A,(HL) IF MIXED CP N8SECTS+1 ;WE BOOT FROM DOUBLE DENSITY ELSE CP NSECTS+1 ENDIF JR C,BOMB ;ERROR IF ET ; ; BOMB: LD HL,DEAD CALL PMSG JP MONITR+3 ; DEAD: DEFB ' cannot boot' DEFB NULL ; ; ; ... ASSORTED CONSTANTS  EQU $ ;BIOS STACK OVERLAYS COLDSTART CODE ; SPSAVE: DEFS 2 ;USER SP SAVE FOR COMPLEX BIOS ENTRYS ; ; ; ; ; ... WARM BOT IF NOT A JUMP INSTRUCTION JP (HL) ;ELSE JUMP INTO CCP TO START CPM ; ; ; ; RTRACK: LD C,1 ;READ TRACK FROM LOGICAL RY: LD (SPSAVE),SP LD SP,BIOSTK PUSH IX CALL WRITEDB POP IX LD SP,(SPSAVE) RET ; ; ; ; ; ... COLD BOOT ROUTINECTORS & BDOS PATCH LD B,0 GOCPM2: LD C,(HL) ;BC=BYTECOUNT INC HL LD E,(HL) INC HL LD D,(HL) ;DE=DESTINATION POINTETRACK IS SINGLE DENSITY CP CPMSIZE JR NC,WBOOT3 ;JUMP IF CCP+BDOS FITS ON ONE TRACK LD B,(HL) ;LOAD B WITH # OF SECTORSAND WHERE TO PLUG THEM IN ... ; MEMTAB: DEFB 3 ;WARMSTART VECTOR DEFW 0000H JP CBIOS+3 DEFB 3 ;BDOS VECTOR DEFW OT ROUTINE ... ; WBOOT: LD SP,0080H CALL FLUSH ;FINISH ANY DEFERRED DISK I/O WBOOT2: LD HL,DPHTAB ;SET PARAM POINTER FORSECTOR #1 RTRK2: PUSH HL PUSH BC LD (POINTR),HL LD A,C LD (SECTOR),A ;SET LOGICAL SECTOR NUMBER FOR READ CALL READDB E ... ; BOOT: DEFB 0,0,0,0 ;PUT EXTRA COLDSTART INITIALIZATION DEFB 0,0,0,0 ; CODE HERE IF NEEDED. BE SURE TO TAKE DEFR INC HL LDIR ;COPY POOP INTO MEMORY LD A,(HL) OR A ;TEST FOR END OF TABLE JR NZ,GOCPM2 LD A,(IOBYTE+1) ;DO AUT ON TRACK #1 LD A,CPMSIZE SUB B ;COMPUTE # OF EXTRA SECTORS FROM TRACK #2 JR WBOOT4 ; WBOOT3: LD B,CPMSIZE ;GET ALL OF 0005H JP BDOS DEFB 3 ;BREAKPOINT VECTOR DEFW 0038H JP MONITR+3 DEFB 5 ;CP/M 2.2 PATCH 01 3/31/81 DEFW DBBUG  DRIVE ZERO LD (DPHPTR),HL ; FORMAT DESCRIPTOR STUFF XOR A LD (DISK),A LD (LINECNT),A INC A LD (TRACK),A CALL PARA ;LOAD NEXT 128 BYTES OF CP/M POP BC POP HL JR NZ,BOMB ;EXIT IF PERMANENT ERROR LD DE,128 ADD HL,DE INC C DJNZ RTB 0,0,0,0 ; UP AT LEAST 40 BYTES OF MEMORY IN ANY DEFB 0,0,0,0 ; CASE TO MAKE ROOM FOR THE BIOS DEFB 0,0,0,0 ; SELECT/REAO LOG-ON THING THAT PEOPLE LIKE LD C,A AND 00001111B CP NFLOPPY+WINCH JR C,GOCPM3 LD C,0 ;LOG  NOP NOP LD HL,0 DEFB 2 ;DEFAULT DISK I/O POINTER DEFW POINTR DEFW 0080H DEFB 0 ;END OF TABLE ; ; PAGE ; * ;* * ;******************************************************** ; ; ; ORG SCRATCH DIRBUF: DEFS 128 ;SCRATCH DI ENDIF RET ; ; IF MIXED INCLUDE MDEBLOCK.MAC ;DEBLOCKING DISK DRIVERS ELSE INCLUDE DEBLOCK.MAC ENDIF ; IFCTOR: DEFS 1 ;BIOS SECTOR NUMBER TRACK: DEFS 2 ;BIOS TRACK NUMBER DISK: DEFS 1 ;BIOS DISK NUMBER POINTR: DEFS 2 ;BIOS DMA A=0 ; ; ; LIST: LPTLST: CALL LISTST OR A JR Z,LPTLST ;LOOP TILL SIO CAN SEND A CHARACTER LD A,C OUT (LSTDAT) DEFS 15 ;DISK PARAMETER BLOCK DEFS 4 ;DEBLOCK PARAMETERS DEFS 1 ;DEBLOCK FLAGS DEFS D8IRSIZ/4 ;CHECK VECTOR DEFS A8L ; ... CHARACTER I/O ROUTINES FOR BIOS ... ; ; CONST: JP MONITR+6 ;MONITOR CONSOLE STATUS ENTRY POINT ; ; CONIN: JP RECTORY BUFFER BIGBUF: DEFS 1024 ;HOST SECTOR BUFFER FOR DEBLOCKING ; ; ; IFE MIXED DPH MACRO LOCAL BASE BASE: DEFS 1 WINCH INCLUDE XEBEC.MAC ;DISK DRIVERS FOR XEBEC CONTROLLER ENDIF ; ; MOVLEN EQU $-CBIOS ;LENGTH TO MOVE IN DDOSECT  POINTER ; ; HOST EQU $ HSTSEC: DEFS 1 ;HOST SECTOR NUMBER HSTTRK: DEFS 2 ;HOST TRACK NUMBER HSTDSK: DEFS 1 ;HOST DISK ,A ;OUTPUT ASCII TO SIO IF XONXOFF IN A,(LSTCTL) BIT 0,A ;TEST RIO RX DATA AVAILABLE RET Z ;EXIT IF NO INPUT FROM PRLMAX ;ALLOCATION VECTOR ENDM ; DPHTAB EQU $ REPT NFLOPPY ;CREATE FLOPPY DISK DATA AREAS DPH8 ;WITH ROOM FOR 5 OR 8 IMONITR+9 ;MONITOR CONSOLE INPUT ENTRY POINT ; ; CONOUT: LD A,C JP MONITR+12 ;MONITOR CONSOLE OUTPUT ENTRY POINT ; 6 ;DISK PARAMETER HEADER DEFS 15 ;DISK PARAMETER BLOCK DEFS 4 ;DEBLOCK PARAMETERS DEFS 1 ;DEBLOCK FLAGS DEFS DIRSIZ/ IF $ GE MONITR .PRINTX /OVERLAYING SYSTEM MONITOR/ ENDIF ; BIOSLEN EQU (($ AND -128)+128)-CBIOS ;LENGTH OF CBIOS MOD 1NUMBER HSTPTR: DEFS 2 ; HSTDPH: DEFS 2 ;HOST DISK PARAMETER POINTER ; NEXT EQU $ NXTSEC: DEFS 1 ;NEXT SECTOR NUMBER NXTINTER IN A,(LSTDAT) ;ELSE GET CHARACTER AND TEST FOR RES 7,A ; 'XOFF' CHARACTER (CONTROL-S) CP 'S'-64 RET NZ LIST2NCH ENDM DPHSIZ EQU ($-DPHTAB)/NFLOPPY ENDIF ; IF WINCH DEFS 16 ;DISK PARAMETER HEADER DEFS 15 ;DISK PARAMETER B; ; LISTST: LD A,00010000B OUT (LSTCTL),A ;DO SIO CLEAR STATUS/INTERRUPT CMD IN A,(LSTCTL) AND TXMASK ;DISCARD BITS N4 ;CHECK VECTOR DEFS ALLMAX ;ALLOCATION VECTOR ENDM ; DPHTAB EQU $ REPT NFLOPPY ;CREATE FLOPPY DISK DATA AREAS DPH 28 ; PAGE ;******************************************************** ;* * ;* DISK I/O BUFFERS FOR BDOS FILE HANDLER TRK: DEFS 2 ;NEXT TRACK NUMBER ; RCOUNT: DEFS 1 ;UNALLOCATED RECORD COUNT SECTMP: DEFS 1 ;HOST EQUIVALENT OF SECTOR# RDAC: IN A,(LSTCTL) BIT 0,A JR Z,LIST2 ;LOOP TILL NEXT HANDSHAKE CHARACTER IN A,(LSTDAT) ;INPUT AND DISCADR 'XON' CHARACTERLOCK DEFS 4 ;DEBLOCK PARAMETERS DEFS 1 ;DEBLOCK FLAGS DEFS MAXBLK/8 ;ALLOCATION VECTOR ENDIF ; ; ; NEW EQU $ SEOT BEING TESTED CP TXMASK CONSTA: LD A,255 RET Z ;RETURN WITH A=255 IF PRINTER READY XOR A RET ;ELSE RETURN WITH ENDM DPHSIZ EQU ($-DPHTAB)/NFLOPPY ENDIF ; IF MIXED ; DPH8 MACRO LOCAL BASE BASE: DEFS 16 ;DISK PARAMETER HEADER  T: DEFS 1 ;READ BUFFER ACTIVE FLAG WRTACT: DEFS 1 ;WRITE BUFFER ACTIVE FLAG DIR: DEFS 1 ;DIR FOR DEFERRED RD/WRT (1=READ) te wit a man a tw 8 floppie an singl 5.25 har disk Th firs pai ar name SS60E an S000000B ;DEBLOCK MASK DEFW 128 ;BYTES PER SECTOR ; ; ; 8 INCH STANDARD SECTOR TRANSLATE TABLE ; XLTAB: DEFB 01,07,13,19,s the track was formatted and verified as correct '1' means the drivve became not ready '2' meED ANYWHERE IN CBIOS ; ; END  bootin CP/ fo th origina "Bi Board on you "Bi Boar II an runnin th formattin progRWFLAG: DEFS 1 ;DIR FOR HOST RD/WRT (1=READ) LINECNT:DEFS 1 ;LINE COUNT FOR ETX/ACK ; ; DPHPTR: DEFS 2 ;POINTER TO DPH ENS60E8 th secon DS60E am DS60E8 an th thir SW59E an SW59E4 Ther ar pair o file becaus Th diskett yo hav receive i single-density I contain sourc an he file fo th CBans a sector was read with a bad crc '3' means a sector could not be found '?' means a seek erFW XLTAB ;1-IN-6 SECTOR SKEW TABLE DEFW NSECTS ;SECTORS PER TRACK DEFB 3 ;BLOCK SHIFT DEFB 00000111B ;BLOCK MASK DEra name BB2FORMT.CO include o th diskett yo hav received Us ske o fo single-densit diskettesTRY PRMPTR: DEFS 2 ;POINTER TO DISK PARAMS IDBUFF: DEFS 8 ;BUFFER FOR ID RECORDS ON SIDE #0 IDTOP: DEFS 8 ;BUFFER FOR ID R th MOVCP͠ utilit include wit CP/͠ distribute b Digita Research Computer o Garlan Texa require codIO fo th Cal-Te "Bi Boar II i si guises Tw fo 60 CP/ syste wit a man a fou single-ror 2 Creat .CO fil containin 59 o 60 versio o you ow copy of CP/M by: FB 00000000B ;EXTENT MASK DEFW 242 ;MAX BLOCK# DEFW 63 ;MAX DIRECTORY ENTRY# DEFB 11000000B ;ALLOCATION MASK MSB DEFB  ske o fo double-densit ones Whil formattin diskette th progra wil displa on o th ECORDS ON SIDE #1 SCRLEN EQU $-SCRATCH ; ; IF $ GE SYSRAM .PRINTX /BIOS OVERLAYING SYSTEM VARIABLES/ ENDIF ; ; .X locate 20 he byte lowe tha normal To create a system disk for your "Big Board II": side 8 floppies tw fo 60 syste wit a man a tw double-side 8 floppies an tw fo 59ˠ CP/͠ sys A) Running MOVCPM as described on pages 30 and 31 of the Digital Research manual titled "An Introduction t00000000B ;' ' LSB DEFW 16 ;CHECK SIZE DEFW RESERV ;RESERVED TRACKS DEFB 0 ;DEBLOCK SHIFT COUNT DEFB 00followin symbol pe track: '.' means the track was formatted without verification '+' meanLIST ;TURN OFF LISTING .PHASE SYSRAM INCLUDE MEMDEF.MAC ;ASSEMBLE SYSTEM VARIABLES IN CASE THEY .DEPHASE ; ARE REFERENC1 Provid yoursel wit severa double-densit diskette wit single-densit trac zeroe b purchas o b o CP/M Features and Facilities." The copy of MOVCPM used must be the one that came with th write the system to is a double density one with a single density track zero. *******ES, AND 2600 FOR "59E4" FILES. #M4000,55FF,160 ;move the ccp & bdos back down 4) Exit from DDIFT DEFB BMASK ;BLOCK MASK DEFB 0 ;EXTENT MASK (DUMMY) DEFW 0 ;MAX BLOCK# (DUMMY) DEFW D5IRSIZ-1 ;MAX DIRECTORY ENTRY .HEX file of our CBIOS as follows: A>ddt cpm60k.com ;load the cp/m.com file at 0980 DEFB BMASK ;BLOCK MASK DEFB 0 ;EXTENT MASK (DUMMY) DEFW 0 ;MAX BLOCK# (DUMMY) DEFW D8IRSIZ-1 ;MAX DIRECTORY ENTRY# DEe operating system on the distribution diskette though it may have had patches made to it********************************************************* 900-97f ... t0/s1 one-sector boot 980-9ff ...T, SID, or ZSID by typing -C. You may wish to SAVŠ thi "Bi Boar II CP/ i a appropriatel name fil # DEFB HIGH DIRMSK ;ALLOCATION MASK MSB DEFB LOW DIRMSK ;ALLOCATION MASK LSB DEFW D5IRSIZ/4 ;CHECK VECTOR SIZE DEFW R5ES#M980,1F7F,4000 ;move the ccp & bdos to 4000 #F100,3FFF,0 ;zero RAM from 0100 up to 4000 FB HIGH DIRMSK ;ALLOCATION MASK MSB DEFB LOW DIRMSK ;ALLOCATION MASK LSB DEFW D8IRSIZ/4 ;CHECK VECTOR SIZE DEFW R8ESERV ;. BExitin fro MOVCP an SAVEin th syste. We recom- mend the names "CPM59K.COM" an t0/s2 signon message A00-15FF ... t0/s3 to 26 BIOS code (1.5 to 2.5 Kbytes) 1600-2BFF ... t1/s1  for for possible use later. 5 Ru th system-copying utility named SYSGEN include o th  .... Notes on BIOS/DDINIT/SYSGEN versions released 26-August-82 ... BIOS: This BIOS release should represent what we wil #Iss60ea.HEX ;load our boot & cbios at 0900 #R2000 ;USE 2000 FOR "60EA" FILES, RESERVED TRACKS DEFB 0 ;DEBLOCK SHIFT COUNT (DUMMY) DEFB 0 ;DEBLOCK MASK (DUMMY) DEFW 0 ;BYTES PER SECTOR (DUMMY) d "CPM60K.COM". Do not give the files names that imply they are specifically for "Big Boato nn CCP and BDOS portion of CP/M (5.5 Kbytes) 44 sectors if 128 bytes/sector 22 " " 256 "  CBIOS distribution diskette and follow the instructions that appear on the screen. Be certain any diskette youl be calling a 'distribution' version of the source code for the BIOS. It has been cleaned up so that most mere mortals shou2200 FOR "60E8" FILES, 2400 FOR "59E6" FIL DPBGEN B5LS,D5IRSIZ D5DSTUFF: DEFW 0 ;NO SECTOR SKEW TABLE DEFW 0 ;SECTORS PER TRACK (DUMMY) DEFB BSHFT ;BLOCK SHrd II" for they do not contain our CBIOS. 3) Use DDT, SID, or ZSID to load your CP/M and the appropriate  " 11 " " 512 " " 6 " " 1024 " "  ld be able to assemble it and produce a working system without having to do any patches or funny stuff. The main module 'AUT printer driver. set to 80h/81h/89h for side A or 82h/83h/88h for side B. The one sector loader contains a short tabnable double sided floppies. allocates blocks on other side of disk and doubles directory size DIRSIZ ... number of direu have edited your desired changes in the bios or the equates shown above. A>M80 =AUTOBIOS A>L80 */P:E900 {use serial input port and CONOUT to use built-in crt. Same trick as Bigboard PFM rom's 'S' command, but gets done aued 'MEMDEF' has been added to the CBIOS. This is simply a copy of the monitor rom variables declaration file with the variabOBIOS.MAC' has includes for all the other files such as the boot loader, signon message, deblock routines, hard disk driver le of constants for sio initialization of write reg #4,#3,#5 and the ctc. Edit this table to change parity, baudratectory entries allocated. we may want to change this for compatibility with other systems. BLS ...... CP/M block size parif 59k MSIZE then use E500 here} *AUTOBIOS *AUTOBIOS/X/N/E #ZSID CPM.COM {assumes you created file by saying 'SAVE 34 tomatically by boot. WINCH .... set to 1 to enable XEBEC drivers to be assembled in with bios. Resuting code is > 1500 bles defined using EQU's instead of DEFS's. The main use of MEMDEF is to allow us make symbolic references to the system vars iand system variables EQU's. The following items are the main ones people will be interested in; MSIZE .... memory size in  etc. We may want to make a fancier way to define these parameters, but this will do for a while. XONXOFF .. set tameter (expressed in Kbytes). this should probably not be changed from the 2K value now being used, but we have it jCPM.COM' after running MOVCPM or standard version of SYSGEN} #M980,1F7F,4000 #F100,3FFF,0 #IAUTOBIOS.HEX #ytes long, so requires 59k memsize to run. NFLOPPY .. number of floppys in system. set to 1 or 2 for hard disk sysn the CBIOS cold start initialization. Use this trick to do things like changing the disk step rate, motor turn-off delay, kKbytes. use 60k for floppy-only systems and 59k for hard disk versions. USRDRV ... user number (high nybble) and drive no TRUE to enable this protocol in printer driver. TXMASK ... set to bits to be tested for printer-ready in list routine. ust in case. FIVE EIGHT .... floppy disk type being used. LSTDAT LSTCTL LSTBAUD .. sio ports and ctc chanel for serialR2000 {if 59k MSIZE then use 2400 here} #M4000,55FF,1600 {M4000,55ff,1200 if 5 1/4 inch } You now have a picttems or you will not have enough memory for the disk allocation vectors in most cases. DOUBLE ... set to ture to eeyboard fifo size, disk spin-up delay and goodies like that. SYSGEN: Type the following magic incantations after youmber (low nybble) to log-on after cold start. use 00h unless you are strange. SERIAL ... set to TRUE to cause CONIN to  possible bits are CTS/SYNC/DCD/TBE. (always test TBE, others are optional depending on printer) A new module call ure of the reserved tracks as required by our SYSGEN parked in memory from locations 900h to 2BFFh. You can save this on a f 1. add a 74LS157 on the Bigboard 2 experiment area. as follows: ___ ___ 2MC osc JB35-3 ______ 2 Kbytes) 1200-27FF ... t1/s1 to nn CCP and BDOS portion of CP/M (5.5 Kbytes) 44 sectors if 128 bye "init" add the following: at the point where the disk parameters are set up ; ; set d8 bytes/sector 22 " " 256 " " 11 " " 512 " " 6 " " 1024 "  pin 16 Vcc pin 8 gnd pin's 12,13,14 not used (yet) 2. Make use of a modifile if desired, and then run SYSGEN (our version) to put the system on the reserved tracks of a formatted DD disk. The memory 2|1a " 1y|4______ 1MC/2MC clock JB35-2 1Mc osc JB35-1 ______3|1b | Ready/ JB4-3 ______5|2a 2y|7______ Readtes/sector 22 " " 256 " " 11 " " 512 " " 6 " " 1024 " isk parameters for 5 or 8 inch drives. ; in a,(sense) ;read dip switch bit 5, " Next info added by L.Koopman, to be compatible with the Sysgen5 program as submitted by Caltec. The mied Bigboard monitor rom. This one is used to initialize a location in the monitor ram to start with the floppy drives as in layout for the system tracks in SYSGEN8 is as follows; address sector ------ ------ 900-97f ... t0/s1 y/ JB4-2 Gnd JB4-1 ______6|2b | Wd(U28-11)JB8-3 _____11|3a 3y|9______ WD JB8-2 Wd(U10-3 " a ;test drive type jr z,skip2 ;and jump if 8 inch drives ld a,00000011b emory layout for SYSGEN5 is as follows; address sector ------ ------ 900-97f ... t0/s1 one sectordicated by the dip switch on the Bigboard 2. This location may be altered after boot by the "config" program.  one sector loader for CP/M cold boot 980-9ff ... t0/s2 signon message A00-15FF ... t0/s3 to 26 BIOS co1)JB8-1 _____10|3b | | | Select JB5-1 ______1|sel | | | IN case of a need to use the Bigboard 2 for a mixed configuration, (5 1/4 & 8 inch) the following changes must be implemented.  l䠠 (dsktyp), ;se dis typ for min drives ;next entry's are added xor a  loader for CP/M cold boot 980-9ff ... t0/s2 signon message A00-11FF ... t0/s3 to 18 BIOS code (1.5 to Rom monitor modification: Make some room (if needed) by deleting (for example "crcgen"). In the modulde (1.5 to 2.5 Kbytes) 1600-2BFF ... t1/s1 to nn CCP and BDOS portion of CP/M (5.5 Kbytes) 44 sectors if 12 |74LS157| |_stb___| |15 Gnd __________|   ;indicate all drives are 5 1/4 inch ld (typeflag),a ;this is new ld a,8 ource code these programs are not modified. These programs must be executed from the type of drive the program is e file "autobios" for a mixed configuration setup. This is done by specifying: in "system variables" EIGHT EQU FALSEack using ddt or zid, move the ccp and bdos to the right boundary and start the right sysgen to write it back. eek rate in miliseconds speed5: defb 3 ;5 1/4 inch seek rate in miliseconds Both speed bytes may b from either type of drive. Thi wil b calle 'format40.com o 'format80.com' depending on a 40 tracks;set mux (74LS157) to 5 1/4 inch out (od9h),a skip2: call flipdens ;this is existinwritten for. I.E. Drive "a" = 5 1/4 inch (with your programs bb2formt, init5 etc.) Drive "c" = 8 inch  FIVE EQU FALSE MIXED EQU TRUE The output may then be mixed with a 59K cpm version 2.2 or smaller if you like. The  Good luck. L.Koopman Waarbekenplein 13 7553 KK Hengelo (o) Tel. 074-913022 Nederland e modified by the "config" program and are used by "autobios" when selecting a drive. Assemble the new monitor sou or 80 tracks drive. You also cannot do an direct sysgen from an 5 1/4 inch drive to an 8 inch drive. Tg code ; ; initialize the z-80 for interrupt mode #2 This is all to be changed in the coding.  And you want to initialize an 8 inch floppy in drive "c". First insert an initialized 8 inch floppy in drive "c", new created bios is to big for a 60K cpm version. Restrictions. All drive selections should be made trough the biosENSITY SETTING ADD HL,BC LD B,3 LD C,PORT0 OTIR ;OUTPUT 3 BYTES TO SET DISK DENSITY RET SMCTAB: DEFB SMC1+ON ;8 rce, and make a new rom (2732) by using the provided "program.com" transient program. In order to burn a 2732 eprohis is due to the fact that the memory layout for the ccp and bdos modules are different. (see bios.doc) Y Next changes must me made in the following files: memory.mac memdef.mac at the end of the ram definitio Then log it in. Next replace the floppy in "c" by a floppy you want to initialize. Then type: C>A:BB2FOR module. The following programs are known not to do so: BB2FORMT.COM INIT5.COM In absence of the sINCH SINGLE DENSITY DEFB SMC2+OFF DEFB DDEN+ON DEFB SMC1+OFF ;8 INCH DOUBLE DENSITY DEFB SMC2+OFF DEFB DDEN+OFF DEFBm, Enter: "program rom(cr)." Where "rom" is the name of the "com" file to burn in (max 4k) 3. Assemble thou can overcome this problem by reading in either format by the corresponding sysgen program, save it as a file, read it bns add the following: typeflag: defb 00001111b ;default set to 8 inch speed8: defb 5 ;8 inch sMT(CR) And follow the format menu instructions. For 5 inch drives I wrote a format program that will execute   .XLIST ; . . . . . ; ; SAVE MACRO SAVE SPECIFIED REGITERS. ; ; SAVE R1,R2,R3,R4 ; ; R1-R4 MAY BE BC,DE,HL OR AF SAVE5 ELSE IFB IFNB LD DE,?STRING ENDIF LD C,9 CALL 5 ELSE IFNB LD HL,?STRING ENDIFBE IN <> BRACKETS. ; ; MACRO ALSO ASSEMBLES: ; CR = CARRIAGE RETURN ; LF = LINE FEED ; BEL = BELL CODE ; ; MACRO ASSUMES MACRO ADDR LOCAL IN1,IN2,OVERSUB JR OVERSUB @HEXIN: LD HL,0 ; ZERO NUMBER IN1: LD A,(DE) ; GET A CHAR OR A ; CHECK FO,R4> IFB EXITM ENDIF POP R ENDM ELSE IRP REG, POP REG ENDM ENDIF ENDM ; ; . . . . . . . ;R: AND 0FH ;MASK 4 BITS ADD A,90H ; ADD OFFSET DAA ADC A,40H DAA LD E,A LD C,2 JP 5 HEXEND: HEXOUT MACRO ?ADDRD ; IN ORDER SPECIFIED, IF REGS ARE OMITTED ; SAVE BC,DE AND HL. ; SAVE MACRO R1,R2,R3,R4 IFNB IRP R, LD A,(?ADDR) ENDIF CALL HEXPRN ENDM HEXOUT ADDR ENDM ; . . . . . ; ;HEXIN MACRO ; CONVERT A NUMB2,R3,R4> IFB EXITM ENDIF PUSH R ENDM ELSE IRP REG, PUSH REG ENDM ENDIF ENDM ; ; . . . . . ) LD C,2 CALL 5 ENDIF POP HL POP BC INC HL DEC C JR NZ,PLOOP ENDIF ENDIF ENDIF ENDM ; ; . . . . . . ;RLF CR DEFL 0DH LF DEFL 0AH BEL DEFL 07H IFB JR PASTCR @CRLF: DEFB CR DEFB LF DEFB '$' PASTCR: LD LD B,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ; SHIFT LEFT 4 ADD HL,BC ; ADD IN NEW DIGIT INC DE ; INCR BUFFER PSECOND LITERAL'> ; PRINT ADDR,$ (ASCII OUTPUT UNTIL $) ; PRINT ADDR,L,'H' (HEX OUTPUT L CHARACTERS) ; PRINT ADDR,L,'A' (ASCIER IN MEMORY FROM ; HEX TO BINARY. ; IF NO ARGUMENT, MACRO ASSUMES ; ADDR OF STRING IN HL. ; ASNWER LEFT IN HL, WITH LEAST S ; ; RESTORE MACRO RESTORE REGITERS ; (INVERSE OF SAVE) ; ; RESTORE R1,R2,R3,R4 ; ; R1-R4 MAY BE BC,DE,HL OR AF ; RESTO ; HEXOUT MACRO CONVERT BINARY NO ; AND OUTPUT TO CONSOLE. ; ; HEXOUT ADDR ; ; NUMBER ASSUMED IN A IF NO ARGUMENT. ; HEDE,@CRLF LD C,9 CALL 5 ELSE IFB JR @OVER @MESS: DEFB ?STRING DEFB '$' @OVER: LD DE,@MESS LD C,9 CALL OINTER JR IN1 ; OVERSUB: HEXIN MACRO ?ADDR IFNB LD DE,?ADDR ELSE EX DE,HL ENDIF CALL @HEXIN LD A,L I OUTPUT L CHARACTERS) ; ; LITERALS MUST BE IN SINGLE QUOTES 'LIT' ; IF LITERAL CONTAINS CONTROL CODES ENTIRE ; STRING MUST IGN. ; 8BITS IN A. CARRY SET ON ERROR. ; CONVERSION STOPS IF A ZERO IS FOUND ; IN INPUT STRING. ; ; HEXIN [ADDR] ; HEXIN RED IN ORDER SPECIFIED ; IF REGS OMITTED RESTORE HL,DE,BC. ; RESTORE MACRO R1,R2,R3,R4 IFNB IRP R,2O!>!*>:? :O! [ADDR] ; CHARIN MACRO ADDR LD C,1 ;CONSOLE INPUT CALL 5 IFNB LD (ADDR),A ENDIF ENDM ; ; . . . . . ; ; C01+? --- Cal-Tex Computers Sysgen 5 inch version --- ? Source drive nam THAT DENSITY IS SET RIGHT ; RECOV5: LD A,00010000B OR A ;INDICATE ERROR DUE TO NON-EXISTENT RET ; SECTOR OR INDETERMINation on a disk in the process of formatting it. Therefore we recommend that you remove any valuable disks that FER. ; BUFLEN LENGTH OF BUFFER (DEFAULT 127). ; INPUT MACRO ADDR,BUFLEN LD C,10 IFNB LD DE,ADDR ;SET BUFFER ADD~G!:()= *:w#p#s#r#6"*;">:<8 :($' HAROUT MACRO CONSOLE OUTPUT ; FROM A OR (ADDR) IF SPECIFIED. ; ; CHAROUT [ADDR] ; CHAROUT MACRO ADDR IFNB LD A,(e or to skip ........ 8 (>2! "!"OT ? Destination drive name or to skip ... 8 (>2! ATE TRACK# ; ; ; ; DMAPGM: DEFB 11000011B ;DMA RESET COMMAND DEFB 11000011B DEFB 11000011B DEFB 11000011B DEFB 1100 may be in the drives at this time. press any key when ready to continue ... ̀ ="  ( ="  returning to RESS ENDIF IFNB LD (DE),A ELSE LD A,127 LD (DE),A ENDIF CALL 5 ENDM ; .LIST >:<8 :($' ADDR) ENDIF LD C,2 LD E,A CALL 5 ENDM ; ; . . . . . ; ; CHARSTAT MACRO, CHECK CONSOLE STATUS. ; ; RETURN TRUE (F"! "OT ? press to repeat or any other key to exit ...  ʾ? *** ERROR ON :A O! ~#foE0011B DEFB 11000011B DEFB 01101101B ;XFER A->B, PORT A AND BYTCNT FOLLOWS DEFB DATREG DEFB 00101100B ;PORT A IS I/O, FCP/M ...  density sectors length (* indicates non-standard format) ------- ------- ------  ; ; ERROR IS DUE TO NON-EXISTENT SECTOR# OR BEING IN WRONG DENSITY ; RECOV4: LD A,(DSKTYP) CP D ;SEE IF DENSITY WAS CHANG CONTROLLER COMMAND BYTE LD A,12 COUT2: DEC A JR NZ,COUT2 ;DELAY 50 MICROSECONDS RET ; ; ; ; FORCE: LD A,FINCMD ;LF) IF CHAR READY ; FALSE (0) IF NOT. ; CHARSTAT MACRO LOCAL EXIT LD C,11 CALL 5 OR A JR Z,EXIT LD A,0FFH EXIT: ? *** press to retry or any other key to abort ...  >: NOT READY: SEEK ERROR: BAD SECTOR: VERIFY  2:1K ) : single  double :&o)^#V}y  * }&h" }bk" :*ͨ `8 *ͨ ̀ h 8OK ̀  K h y:͗ ̀ 2ɯ2 ~# milliseconds) =1 =3 1 2 3 4 5 6 7=4 012345678901234;@~ (!= :: x F#; bkwF#~# SINGLE SIDED =1 verify disk after formatting (Y/N) ͩ Y(N 27 read/write verify ......... Y( " *" ! ">ӊ:_! ~>> M > O ۅ2 Oۅ * R8>CۅD0* R8>+* R8[ !R8><2 =1 enter number of format desired (1 to 8) ͩ 189012&o) ^#VS~7 <--- format selected ........K > K :20>.K  ? > . >. O!j ˀ^#V#(R8<00 @ yK }0K 'e M > O !567890123456789012345678901234567890123456789012345678901234567890=5 ----------+---------+---------+---------+---------+------- NO!" YES!m":A2W =1 press when ready to format disk in drive A: ... ̀ hG( =" Ð (* "M >ͧ >ӊ* "ɊJ*>>2* #" ! ۅ(w* [ " R" Myx! YQ... :1K =1 enter disk (A,B,C OR D) to be initialized ͩ A8E0A27 disk being initialized .... 6G 2F:GG(*~}`:oH> M >&@.H! W >.2!:Ẏ :K *~}`.H>2F>@O --+---------+---------=6 :N(>2Gt 2G:N( t ͧ  =1 FORMATTING:GG :N( BOTTOMHD!H~(vqEv |0{U *** DRIVE NOT READY *** (drive door open? disk turned the wrong way?)w(X *** WRITE PROTECTED *** (removYQ(##/ ͢ m,χ[ G* RB8M >>> = ɷ ͬ 5 Ͷ j! YQYQK >:K =1 enter physical sector skew (from 1 to 9) ͩ 18:027 sector skew ............... K *~ :F:W >.2*~:Ẏ :K :F<2F8*~}`:oH>@O *~ :F:W >.2*~:Ẏ :K :F<2 TOP SIDE ..... (press any key to abort)=6 =:$K >BK w w ! 6 84O* ͨ  ^~(#= N Fɲ8Z|   N 8N N N e write protect tab from notch in diskette)G(a *** DRIVE MOTOR SPEED OUT OF RANGE *** (rotational period=* ( >O / ͢ m,χ! ! !  N#F#;F#!H:Fw:GG(  ~#w =1 initialize both sides of disk (Y/N) ͩ Y(N 27 media type ................ N( DOUBLE SIDEDF(8M >+2!> !> ! :!F :!GG>?2}HGO (*#"12ɯ<2!" " <N  N N  N 7N N N N  N N PN  Nrd II" for they do not contain our CBIOS. 3) Use DDT, SID, or ZSID to load your CP/M and the appropriate  N N N N PN .HEX file of our CBIOS as follows: A>ddt cpm60k.com ;load the cp/m.com file at 0980 #M980,1F7F,4000 ;move the ccp & bdos to 4000 #F100,3FFF,0 ;zero RAM from 0100 up to 4000  #Iss60ea.HEX ;load our boot & cbios at 0900 #R2000 ;USE 2000 FOR "60EA" FILES, d "CPM60K.COM". Do not give the files names that imply they are specifically for "Big Boa 1>͙  L.KOOPMAN DOUBLE DENSITY$   FORMAT PROGRAM$3  5 INCH $M  80 TRACKS VERSION$a  Ɛ'@'_zʻ DRIVE NOT READY$ S@S DISK IS WRITE PROTECTED$ S!"2   :: +6#6#> {M>  fQ! (: 1Q: G: zS+: DS: S>2 >  $  INTERRUPT DEFS 2 ;DMA MATCH/END INTERRUPT DEFS 64 ;EXTRA INTERRUPT VECTORS ; ; ; KEYBOARD DATA INPUT FIFO VARIABLES DʗSʓ Bʗ2 y2  $  $ >͙  FORMATTING !!!!!!!!!$ K 1 2 3#1&3:#1!  3#1!3l ?Stack overflow, try more P switches ͩ(:= 44"?/H4> VC4O $~  BIGBOARD II $ VERSION OF 11/02/83$ 6 FORMAT SINGLE OR DOUBLE DENSITY, OTHER=QUIT (S,D) $  ˯ FORMAT-SELECT ERROR$ 8 >[ X  FORMAT-SEEK ERROR$H ! [ - F&:2!U" : O: 2 ! " ! >N  >6# >N: z[{g* ^{#" ʶ!>6#r#: w#s# FIFCNT: DEFS 1 ;FIFO DATA COUNTER FIFIN: DEFS 1 ;FIFO INPUT POINTER FIFOUT: DEFS 1 ;FIFO OUTPUT POINTER FIFSIZ: DEFS 1  4 5 6 7$ S 012345678901234567890123456789012345678901234567890123456789012345678901234:O -0i4-= :!  3#1!3l ?Stack overflow, try more P switches ͩ(:= 44"?/H4> VC4O D S>Q2  ENTER DRIVE N0: (A - F) $ 2 0 INSERT DISK TO BE FORMATTED INTO DRIVE ---> $D : ORMAT-WTRAK ERROR$} 8 >  X  FORMAT-HOME ERROR$ >2>d2>:O! 6#6#>N >6#> 6#>NtH>N ¸fQ! (zPO1Qz: S: DS: S͜1>͙  L.KOOPMAN DOUBLE DENSITY$   FORMAT PROGRAM$3  5 INCH $M  40 TRACKS VERSION$a  56789$3 S ----------+---------+---------+---------+---------+---------+---------+---------$  $ >: O2 DEFS 2 ;CTCA3 INTERRUPT (CRT VERT SYNC) CTCBV: DEFS 2 DEFS 2 DEFS 2 ;CTCB2 INTERRUPT (MILLISECOND TIMER) DEFS 2 _: =2  AND TYPE:$  {A} TO FORMAT SIDE 0$  {B} FOR SIDE 1$ # {D} TO FORMAT BOTH SIDES AT   ( 2G:(0 >> = >( >2::(0 e 0 :22>> ۅO:G20 : $ >2 > w# S~#O( ! $ >+ >2 DISK ERROR, STATUS = $T Ñ$~  BIGBOARD II $ VERSION OF 11/02/83$ 6 FORMAT SINGLE OR DOUBLE DENSITY, OTHER=QUIT (S,D) $ >2!*" Q>2: (: ͜W: 2 ! >6# >6#r#: w#s#6#6#> 6#>{=;CTCB3 INTERRUPT (CLOCK TICK) DMAVEC: DEFS 2 ;DMA READY INTERRUPT DEFS 2 ;DMA MATCH INTERRUPT DEFS 2 ;DMA END-OF-BLOCK ONCE$ " {S} TO FORMAT THE SYSTEM TRACKS$  OTHER = QUIT$<  ( A,B,D,S ) ?$U >2 2 Aʗ0 ۅD8>_ 2 *+=+~ 0 0 ʚ3Ú3!=͇ 3#6 + D S>)2  ENTER DRIVE N0: (A - F) $ 2 0 INSERT DISK TO BE FORMATTED INTO DRIVE ---> $D : ORMAT-WTRAK ERROR$} 8 >  X  FORMAT-HOME ERROR$ >2>d2>:O! 6#6#>N >6#> 6#>NtH>N ¸fQ! (z(O1Qz: S: DS: S͜;******************************************************** ;* * ;* DISK I/O SUBROUTINES FOR CP/M CBIOS * ;* * ;*56789$3 S ----------+---------+---------+---------+---------+---------+---------+---------$  $ >: OUEST FLAG START: DEFS 2 ;CONTENTS OF 6845 START ADDRESS REG NEWLIN: DEFS 2 ;RELATIVE ADDR OF NEW LINE AFTER SCROLL MOVECS: _: =2  AND TYPE:$  {A} TO FORMAT SIDE 0$  {B} FOR SIDE 1$ # {D} TO FORMAT BOTH SIDES AT   ( 2G:(0 >> = >( >2::(0 e 0 :22>> ۅO:G20 : $ >2 > w# S~#O( ! $ >+ >2 DISK ERROR, STATUS = $T Ñ******************************************************* ; ; ; SUBROUTINES FOR RESTORE, SET-TRACK, SET-SECTOR AND ; SET-DMA B>2!*" Q>2: (: ͜W: 2 ! >6# >6#r#: w#s#6#6#> 6#>{=DEFS 1 ;CURSOR-MOVE REQUEST FLAG CURSOR: DEFS 2 ;OFFSET (0..2047) TO CURSOR LOCATION OLDCSR: DEFS 2 ;POINTER TO CURSOR IN A ONCE$ " {S} TO FORMAT THE SYSTEM TRACKS$  OTHER = QUIT$<  ( A,B,D,S ) ?$U >2 2 Aʗ0 ۅD8>_ 2 *+=+~ 0 0 ʚ3Ú3!=͇ 3#6 +Ɛ'@'_zʻ DRIVE NOT READY$ S@S DISK IS WRITE PROTECTED$ S!"2   :IOS ENTRY POINTS. THESE ONLY STORE THEIR ; RESPECTIVE PARAMETERS AND THEN EXIT WITHOUT DOING ; ANY ACTUAL DISK I/O OPERATIONS.: +6#6#> {M>  fQ! (: 1Q: G: zS+: DS: S>2 >  $ TTR MEMORY CRTFLG: DEFS 1 ;CRT PARAMETER BITS TYPEFLAG: DEFS 1 ;DISK TYPE FLAG (FOR MIXED BIOS) SPEED8: DEFS 1 ;8 INCH DRDʗSʓ Bʗ2 y2  $  $ >͙  FORMATTING !!!!!!!!!$ K 1 2 3#1&3:#1!  3#1!3l ?Stack overflow, try more P switches ͩ(:= 44"?/H4> VC4O  ˯ FORMAT-SELECT ERROR$ 8 >[ X  FORMAT-SEEK ERROR$H ! [ - F ; ; HOME: LD BC,0 SETTRACK: LD (TRACK),BC RET ; ; ; ; SETSECT: LD HL,SECTOR LD (HL),C RET ; ; ; ; S&:2!U" : O: 2 ! " ! >N  >6# >N: z[{g* ^{#" ʶ!>6#r#: w#s#IVE SPEED SPEED5: DEFS 1 ;5 1/4 INCH DRIVE SPEED ; ; ; ; ; FREE MEMORY LIST POINTER FREPTR: DEFS 2 ; ;  4 5 6 7$ S 012345678901234567890123456789012345678901234567890123456789012345678901234:O -0i4-= :!  3#1!3l ?Stack overflow, try more P switches ͩ(:= 44"?/H4> VC4O  ETDMA: LD (POINTR),BC RET ; ; ; ; SECTRAN: LD H,B LD L,C ;GET LOGICAL SECTOR# INTO HL FROM BC LD A,D OR E ;CH NC,SDSK3 LD A,R8ESERV ;SELECT 8 INCH SDSK3: ELSE LD A,RESERV ENDIF LD (TRACK),A ;SEEK DIRECTORY TRACK FOR FORMAT CHEF MIXED JR Z,SDK2A ;EXIT IF DRIVE IS LOGGED-ON SDK2C: CALL CKTYPE JP C,D8SEL ;RESET SELECTION TO 8 INCH JP D5SEL ;MNC,PARM3B LD HL,S8DSTUFF ;SELECT 8 INCH PARM3B: ELSE LD HL,SDSTUFF ENDIF LD (PRMPTR),HL ;FIRST SELECT SINGLE DENSITY T LATCH PORT1 EQU 0D9H ;DISK TYPE BIT LATCH SEL5 EQU 0 ;51/4 SELECT BIT SIDSEL EQU 1 ;BIT# OF SIDE SELECT BIT SMC1 EQU 2 DISK DRIVE JR NZ,PARM2 LD A,(TRACK) LD (HSTTRK),A ;STORE TRACK# IN CASE OF ERROR LD C,A CALL MONITR+33 ;SEEK SPECIFIEDECK FOR XLT POINTER IN DE=0 JR Z,STRAN2 ;JUMP IF NO TRANSLATE TABLE USED ADD HL,DE ;ELSE INDEX INTO TABLE BY SECTOR# LDCK ; ; PARAMS: IF WINCH LD HL,WINSTUFF LD (PRMPTR),HL ;SELECT WINCHESTER DISK PARAMS LD A,(DISK) CP NFLOPPY JP Z,UST BE 5 INCH SDK2A: ELSE RET NZ ENDIF PUSH HL POP IX BIT 0,(IX+FLAGS) ;TEST DRIVE PRE-SELECTED FLAG IF MIXPARAMETERS LD A,(IDBUFF+6) BIT 0,A ;TEST DENSITY BYTE RETURNED BY READID JP Z,PARM10 ;JUMP IF SINGLE DENSITY IF MIXED SMC2 EQU 3 DDEN EQU 4 ; ON EQU 1000B OFF EQU 0000B ; ; SELDISK: LD HL,0 ;PREP TO CHECK FOR MAX DISK# LD A,C CP NF TEST TRACK JR NZ,PARM2 LD HL,IDBUFF CALL MONITR+42 ;READ AN ID MARK FROM TEST TRACK JR Z,PARM3 PARM2: CALL REPORT ; L,(HL) LD H,0 RET ;RETURN PHYSICAL SECTOR# FROM TABLE ; STRAN2: INC HL ;MAKE SECTOR NUMBERS START AT 1 RET PAGE PARM10 ;SKIP FLOPPY FORMAT CHECK ON HARD DISK ENDIF XOR A ;SET SECTOR# TO ZERO TO INDICATE LD (HSTSEC),A ; EXPLORATORY REED JR NZ,SDK2C ;EXIT IF DRIVE FORMAT ALREADY KNOWN ELSE RET NZ ;EXIT IF DRIVE FORMAT ALREADY KNOWN ENDIF CALL FLU CALL CKTYPE LD HL,D5DSTUFF ;PRESELECT 5 INCH JR NC,PARM3C LD HL,D8DSTUFF ;SELECT 8 INCH PARM3C: ELSE LD HL,DDSTUFFLOPPY+WINCH RET NC ;ERROR (HL=0) IF DISK# TOO BIG LD (DISK),A INC A LD BC,DPHSIZ LD HL,DPHTAB-DPHSIZ SDSK2: ADD HLDISPLAY ERROR AND ALLOW RECOVERY JR Z,PARM1 ;TRY AGAIN IF NOT ABORTED LD HL,0 RET ;ELSE RETURN PERM SELECT ERROR ; ;  ; ;**************************************************************** ; * ; MAGIC SELDISK ROUTINE WITH AUTO DISK PARAMEAD OPERATION PARM1: LD A,SIDSEL+OFF OUT (PORT0),A ;MAKE SURE SIDE #0 OF DISK IS SELECTED LD A,(DISK) LD (HSTDSK),A ;STORESH ;FINISH ANY DEFERRED DISK OPERATIONS IF MIXED CALL CKTYPE ;CHECK FOR DRIVE TYPE LD A,R5ESERV ;PRESELECT 5 INCH JR ENDIF LD (PRMPTR),HL ;USE DUAL DENSITY DISK PARAMETERS IF MIXED CALL CKTYPE LD HL,N5TRAKS-R5ESERV ;PRESELECT 5 INCH ,BC DEC A JR NZ,SDSK2 LD (DPHPTR),HL ;STORE POINTER TO DISK'S DPH ENTRY BIT 0,E ;TEST LOG-ON VECTOR BIT FOR DRIVE IARRIVE HERE AFTER SUCCESSFULLY READING AN ID RECORD ; PARM3: IF MIXED CALL CKTYPE LD HL,S5DSTUFF ;PRESELECT 5 INCH JR TER SELECT * ; * ;**************************************************************** ; PORT0 EQU 0C8H ;DISK CONTROL BI UNIT# IN CASE OF ERROR LD C,A IF MIXED CALL CKTYPE CALL C,D8SEL CALL NC,D5SEL ENDIF CALL MONITR+27 ;SELECT NEW !  JR NC,PARM3D LD HL,N8TRAKS-R8ESERV PARM3D: ELSE LD HL,NTRAKS-RESERV ENDIF PUSH HL ;PUT TRACKS-PER-DISK PARAM ONTO SECTOR LENGTH CODE+1 (RANGE 1..4) LD A,(IDBUFF+1) ;GET SIDE# BYTE FROM ID RECORD SRL A ;SHIFT OUT SIDE# BIT IN LSB JR NZ, PARM3F: LD (D5DSTUFF+17),A PARM3G: ELSE LD (DDSTUFF+17),A ;STORE AS DEBLOCK MASK IN 'DDSTUFF' ENDIF LD H,0 LD L,A ;GET BLOCK MASK FROM DPB JR PARM8B PARM8A: LD (D5DSTUFF+7),HL LD A,(D5DSTUFF+5) PARM8B: ELSE LD (DDSTUFF+7),HL LD IES NOT IDENTICAL IF MIXED CALL CKTYPE LD HL,2*N5TRAKS-R5ESERV JR NC,PARM3E LD HL,2*N8TRAKS-R8ESERV PARM3E: ELSE PARAM OFF STACK LD HL,0 LD B,A ;PREPARE TO COMPUTE 'DRM' VALUE FOR DPB PARM7: ADD HL,DE DJNZ PARM7 ;GET PRODUCT OF SPT*STACK IF DOUBLE LD A,SIDSEL+ON OUT (PORT0),A ;SELECT TOP SIDE OF DISK LD HL,IDTOP CALL MONITR+42 ;ELSE READ AN ID MARKPARM5 ;JUMP IF UPPER 7 BITS ARE NON-ZERO LD A,(HL) ;ELSE USE STANDARD VALUE FOR 'SPT' JR PARM6 ; FOUND IN PARAMETER TABLE  ADD HL,HL ADD HL,HL ;MULTIPLY LENGTH CODE BY 4 FOR INDEXING IF MIXED PUSH AF CALL CKTYPE LD BC,F5RMTAB LD DE,D5A,(DDSTUFF+5) ;GET BLOCK MASK FROM DPB ENDIF SRL A SRL A SRL A ;SHIFT RIGHT 3 TIMES GIVES EXTENT MASK INC H DEC H LD HL,2*NTRAKS-RESERV ENDIF EX (SP),HL ;REPLACE DOUBLE SIDED #TRACKS ON STACK PARM3A: LD A,SIDSEL+OFF OUT (PORT0),A ;S(NTRAKS-RESERV) IF MIXED CALL CKTYPE LD A,(D5DSTUFF+4) JR NC,PARM7A LD A,(D8DSTUFF+4) PARM7A: ELSE LD A,(DDSTUF FROM TOP SIDE JR NZ,PARM3A ;JUMP IF NOT FORMATTED ON SECOND SIDE LD HL,IDBUFF LD DE,IDTOP ;ELSE COMPARE ID FIELDS TO EACH ; PARM4: ADD A,A ;MULTIPLY PHYSICAL SPT BY 2,4 OR 8 TO PARM5: DJNZ PARM4 ; TO GET EQUIVALENT 128 BYTE SECTORS PARM6: IF DSTUFF+18 JR NC,PARM3H LD BC,F8RMTAB LD DE,D8DSTUFF+18 PARM3H: POP AF ELSE LD BC,FRMTAB LD DE,DDSTUFF+18 ENDIF  ;TEST IF 'DSM' IS > 255 JR Z,PARM9 SRL A PARM9: IF MIXED LD H,A CALL CKTYPE LD A,H JR NC,PARM9A LD (D8DSTUFF+WITCH BACK TO REGULAR SIDE OF DISK ENDIF LD A,(IDBUFF+3) ;GET SECTOR LENGTH BYTE FROM ID RECORD AND 00000011B IF MIXEDF+4) ENDIF LD B,A PARM8: SRL H ;DIVIDE TOTAL SECTORS BY 'BSH' TO GET RR L ; NUMBER OF BLOCKS ON DISK DJNZ PARM8 D OTHER CALL EXOR1 JR NZ,PARM3A ;JUMP IF TRACK NUMBERS NOT IDENTICAL CALL EXOR1 CP 1 JR NZ,PARM3A ;JUMP IF SIDE NUMBERSMIXED LD H,A ;SAVE 'A' CALL CKTYPE LD A,H JR NC,PARM6A LD (D8DSTUFF+2),A ;STORE LOGICAL SPT CONST IN 'DDSTUFF' PARM6 ADD HL,BC ;ADD BASE ADDRESS OF FORMAT POOP TABLE LD BC,3 LDIR ;STORE FORMAT PARAMS IN 'DDSTUFF' INC A LD B,A ;B=6),A ;STORE VALUE FOR 'EXM' JR PARM9B PARM9A: LD (D5DSTUFF+6),A PARM9B: ELSE LD (DDSTUFF+6),A ;STORE VALUE FOR 'EXM'  LD H,A ;SAVE 'A' CALL CKTYPE LD A,H JR NC,PARM3F LD (D8DSTUFF+17),A ;STORE AS DEBLOCK MASK IN 'DDSTUFF' JR PARM3G EC HL ;RESULT LESS 1 IS 'DSM' VALUE FOR DPB IF MIXED CALL CKTYPE JR NC,PARM8A LD (D8DSTUFF+7),HL LD A,(D8DSTUFF+5)  NOT COMPLIMENTARY CALL EXOR2 JR NZ,PARM3A ;JUMP IF SECTOR LENGTHS NOT IDENTICAL CALL EXOR3 JR NZ,PARM3A ;JUMP IF DENSITA: LD (D5DSTUFF+2),A ELSE LD (DDSTUFF+2),A ;STORE LOGICAL SPT CONST IN 'DDSTUFF' ENDIF POP DE ;POP TRACKS-PER-DISK "  ENDIF PARM10: LD HL,(PRMPTR) LD DE,(DPHPTR) PUSH DE PUSH DE PUSH DE ;SAVE 3 COPIES OF POINTER TO DISK POOP LD BC,FB DDEN+ON DEFB SMC1+ON ;5 INCH DOUBLE DENSITY DEFB SMC2+OFF DEFB DDEN+OFF ; ; D8SEL: PUSH AF ;SAVE FLAGS LD A,(D: PUSH HL PUSH BC ;SAVE 'BC' LD A,(DSKTYP) AND 00000011B LD B,0 LD C,A LD HL,SMCTAB ADD HL,BC ;INDEX INTO SMC 0000000B ;' ' LSB DEFW 16 ;CHECK SIZE DEFW RESERV ;RESERVED TRACKS DEFB 0 ;DEBLOCK SHIFT COUNT DEFB 000HECK VECTOR LD (IX+12),L LD (IX+13),H ;STORE IN 'CKV' POINTER SLOT LD E,(IX+16+11) LD D,(IX+16+12) ;LOAD DE WITH CHECK VLD (NREVS),A ;3 REVS BEFORE READY LD A,5*20 ;20 SEC STOP DELAY LD (NSTOP),A LD A,SEL5+ON ;SELECT 5 1/4 INCH JR D8SELA 2 LDIR ;COPY 'XLT' ADDRESS TO START OF DPH EX DE,HL LD BC,14 ADD HL,BC ;POINT TO REST OF DPB STUFF NOW EX DE,HL LSKTYP) RES 1,A ;SET TYPE TO 8 INCH LD (DSKTYP),A LD A,(SPEED8) ;8 INCH DRIVE SPEED LD (SPEED),A LD A,1 LD (NREVS),ADATA SEPARATOR CONTROL ADD HL,BC ; BYTE TABLE FOR NEW DENSITY SETTING ADD HL,BC LD B,3 LD C,PORT0 OTIR ;OUTPUT 3 BY00000B ;DEBLOCK MASK DEFW 128 ;BYTES PER SECTOR ; ; ; 8 INCH STANDARD SECTOR TRANSLATE TABLE ; XLTAB: DEFB 01,07,13,19,2ECTOR LENGTH ADD HL,DE ;COMPUTE ADDRESS OF ALLOCATION VECTOR LD (IX+14),L LD (IX+15),H ;STORE IN 'ALV' POINTER SLOT POP; ENDIF PAGE ; IF EIGHT ; ; DISK PARAMS FOR STANDARD SINGLE DENSITY FORMAT ; 26 SECTORS / 128 BYTES ; SDSTUFF: DEFD BC,15+4 LDIR ;COPY DPB AND DEBLOCK PARAMETERS POP IX ;POINT IX TO BASE OF DISK STORAGE AREAS LD HL,DIRBUF ;GET ADDRES ;1 REVS BEFORE READY LD A,6*20 ;20 SEC STOP DELAY LD (NSTOP),A LD A,SEL5+OFF ;SELECT 8 INCH D8SELA: OUT (PORT1),A LTES TO SET DISK DENSITY POP BC POP HL RET SMCTAB: DEFB SMC1+ON ;8 INCH SINGLE DENSITY DEFB SMC2+OFF DEFB DDEN+ON 5 DEFB 05,11,17,23 DEFB 03,09,15,21 DEFB 02,08,14,20,26 DEFB 06,12,18,24 DEFB 04,10,16,22 ; ; ; SECTOR DEBLOCK PARA HL XOR A ;A=0 TO INDICATE PARAMS FOUND OK RET ;RETURN WITH DPH POINTER IN HL ; ; ; EXOR3: INC HL INC DE EXOR2: INW XLTAB ;1-IN-6 SECTOR SKEW TABLE DEFW NSECTS ;SECTORS PER TRACK DEFB 3 ;BLOCK SHIFT DEFB 00000111B ;BLOCK MASK DEFS OF DIRECTORY BUFFER LD (IX+8),L LD (IX+9),H ;STORE IN 'DIR' POINTER SLOT POP HL LD DE,16 ADD HL,DE ;COMPUTE ADDRESSD A,SIDSEL+OFF ;PRESELECT SIDE 0 OUT (PORT0),A CALL SETDENS ;SET SMC DATA SEPARATOR POP AF RET D5SEL: PUSH AF LD DEFB SMC1+OFF ;8 INCH DOUBLE DENSITY DEFB SMC2+OFF DEFB DDEN+OFF DEFB SMC1+OFF ;5 INCH SINGLE DENSITY DEFB SMC2+ON DEMS FOR 8 INCH DOUBLE DENSITY DISKS ; FRMTAB: DEFB 00000000B ;DEBLOCK MASK DEFW 128 ;PHYSICAL SECTOR LENGTH DEFB 52 ;LOC HL INC DE EXOR1: LD A,(DE) XOR (HL) ;COMPARE ID FIELD BYTES @HL AND @DE INC HL INC DE RET IF MIXED ; SETDENSB 00000000B ;EXTENT MASK DEFW 242 ;MAX BLOCK# DEFW 63 ;MAX DIRECTORY ENTRY# DEFB 11000000B ;ALLOCATION MASK MSB DEFB 0 OF DISK PARM BLOCK LD (IX+10),L LD (IX+11),H ;STORE IN 'DPB' POINTER SLOT LD DE,15+4+1 ADD HL,DE ;COMPUTE ADDRESS OF C A,(DSKTYP) SET 1,A ;SET TYPE TO 51/4 INCH LD (DSKTYP),A LD A,(SPEED5) ;5 1/4 INCH DRIVE SPEED LD (SPEED),A LD A,3 # GICAL SECTORS PER TRACK DEFB 00000001B DEFW 256 DEFB 26*2 DEFB 00000011B DEFW 512 DEFB 15*4 DEFB 00000111B FW RESERV ;RESERVED TRACKS DEFB 0 ;DEBLOCK SHIFT COUNT (DUMMY) DEFB 0 ;DEBLOCK MASK (DUMMY) DEFW 0 ;BYTES PER SECTOR0111B DEFW 1024 DEFB 5*8 ENDIF ; IFE MIXED; ; BASIC DISK PARAMS FOR DOUBLE DENSITY FORMATS ; DPBGEN BLS,DIRSIZ ;GFB 00000111B DEFW 1024 DEFB 8*8 ; ; DISK PARAMS FOR STANDARD SINGLE DENSITY FORMAT ; 18 SECTORS / 128 BYTES ; S5DSTUFNT DEFB 00000000B ;DEBLOCK MASK DEFW 128 ;BYTES PER SECTOR ; ; ; 5 INCH SECTOR TRANSLATE TABLE (SAME AS XEROX/CROMEMCO/OT DEFB 00000000B ;DEBLOCK MASK DEFW 128 ;BYTES PER SECTOR ; ; ; 8 INCH STANDARD SECTOR TRANSLATE TABLE ; X8LTAB: DEFB  DEFW 1024 DEFB 8*8 ENDIF ; ; IF FIVE ; ; DISK PARAMS FOR STANDARD SINGLE DENSITY FORMAT ; 18 SECTORS / 128 BYTES  (DUMMY) ENDIF PAGE IF MIXED ; ; DISK PARAMS FOR STANDARD SINGLE DENSITY FORMAT ; 26 SECTORS / 128 BYTES ; S8DSTUENERATE BSH/BLM/DIRMSK CONSTS ; DDSTUFF: DEFW 0 ;NO SECTOR SKEW TABLE DEFW 0 ;SECTORS PER TRACK (DUMMY) DEFB BSHFT F: DEFW X5LTAB ;1-IN-5 SECTOR SKEW TABLE DEFW N5SECTS ;SECTORS PER TRACK DEFB 3 ;BLOCK SHIFT DEFB 00000111B ;BLOCK SBORNE) ; XLTAB: DEFB 01,06,11,16 DEFB 03,08,13,18 DEFB 05,10,15 DEFB 02,07,12,17 DEFB 04,09,14 ; ; ; SECTOR DEBL01,07,13,19,25 DEFB 05,11,17,23 DEFB 03,09,15,21 DEFB 02,08,14,20,26 DEFB 06,12,18,24 DEFB 04,10,16,22 ; ; ; SECTOR; SDSTUFF: DEFW XLTAB ;1-IN-5 SECTOR SKEW TABLE DEFW NSECTS ;SECTORS PER TRACK DEFB 3 ;BLOCK SHIFT DEFB 00000111B FF: DEFW X8LTAB ;1-IN-6 SECTOR SKEW TABLE DEFW N8SECTS ;SECTORS PER TRACK DEFB 3 ;BLOCK SHIFT DEFB 00000111B ;BLOCK;BLOCK SHIFT DEFB BMASK ;BLOCK MASK DEFB 0 ;EXTENT MASK (DUMMY) DEFW 0 ;MAX BLOCK# (DUMMY) DEFW DIRSIZ-1 ;MAX DIRECTOMASK DEFB 00000000B ;EXTENT MASK DEFW M5BLK ;MAX BLOCK# DEFW 63 ;MAX DIRECTORY ENTRY# DEFB 11000000B ;ALLOCATION MASK OCK PARAMS FOR 5 INCH DOUBLE DENSITY DISKS ; FRMTAB: DEFB 00000000B ;DEBLOCK MASK DEFW 128 ;PHYSICAL SECTOR LENGTH DEFB DEBLOCK PARAMS FOR 8 INCH DOUBLE DENSITY DISKS ; F8RMTAB: DEFB 00000000B ;DEBLOCK MASK DEFW 128 ;PHYSICAL SECTOR LENGTH ;BLOCK MASK DEFB 00000000B ;EXTENT MASK DEFW MBLK ;MAX BLOCK# DEFW 63 ;MAX DIRECTORY ENTRY# DEFB 11000000B ;ALLOCATION MASK DEFB 00000000B ;EXTENT MASK DEFW 242 ;MAX BLOCK# DEFW 63 ;MAX DIRECTORY ENTRY# DEFB 11000000B ;ALLOCATION MASK MRY ENTRY# DEFB HIGH DIRMSK ;ALLOCATION MASK MSB DEFB LOW DIRMSK ;ALLOCATION MASK LSB DEFW DIRSIZ/4 ;CHECK VECTOR SIZE DEMSB DEFB 00000000B ;' ' LSB DEFW 16 ;CHECK SIZE DEFW R5ESERV ;RESERVED TRACKS DEFB 0 ;DEBLOCK SHIFT COUNT  28 ;LOGICAL SECTORS PER TRACK DEFB 00000001B DEFW 256 DEFB 18*2 DEFB 00000011B DEFW 512 DEFB 9*4 DEFB 0000 DEFB 52 ;LOGICAL SECTORS PER TRACK DEFB 00000001B DEFW 256 DEFB 26*2 DEFB 00000011B DEFW 512 DEFB 15*4 DE MASK MSB DEFB 00000000B ;' ' LSB DEFW 16 ;CHECK SIZE DEFW RESERV ;RESERVED TRACKS DEFB 0 ;DEBLOCK SHIFT COUSB DEFB 00000000B ;' ' LSB DEFW 16 ;CHECK SIZE DEFW R8ESERV ;RESERVED TRACKS DEFB 0 ;DEBLOCK SHIFT COUN$ DEFB 00000000B ;DEBLOCK MASK DEFW 128 ;BYTES PER SECTOR ; ; ; 5 INCH SECTOR TRANSLATE TABLE (SAME AS XEROX/CROMEMCO/OSBORN) ENDIF PAGE ;******************************************************** ;* * ;* LOGICAL SECTOR DEBLOCKING ROUTINESDPBGEN B5LS,D5IRSIZ D5DSTUFF: DEFW 0 ;NO SECTOR SKEW TABLE DEFW 0 ;SECTORS PER TRACK (DUMMY) DEFB BSHFT ;BLOCK SHILOCK INACTIVE CALL HOSTCMP ;CHECK IF STILL USING SAME HOST SECTOR JR Z,READ4 ;GET RECORD FROM BUFFER IF STILL THERE RMSK CONSTS ; D8DSTUFF: DEFW 0 ;NO SECTOR SKEW TABLE DEFW 0 ;SECTORS PER TRACK (DUMMY) DEFB BSHFT ;BLOCK SHIFT D LD (DIR),A ;SET DIRECTION FOR READ LD A,(IX+SHFCNT) OR A JR NZ,READ1 ;DO DEBLOCKING IF SECTOR LENGTH > 128 CALL FE) ; X5LTAB: DEFB 01,06,11,16 DEFB 03,08,13,18 DEFB 05,10,15 DEFB 02,07,12,17 DEFB 04,09,14 ; ; ; SECTOR DEBLOCK  FOR * ;* CBIOS DISK READ/WRITE FUNCTIONS * ;* * ;******************************************************** ; ; WRFT DEFB BMASK ;BLOCK MASK DEFB 0 ;EXTENT MASK (DUMMY) DEFW 0 ;MAX BLOCK# (DUMMY) DEFW D5IRSIZ-1 ;MAX DIRECTORY ENTRY#EAD3: LD A,(SECTMP) ;ELSE COPY NEW DISK/TRACK/SECTOR LD (HSTSEC),A ; TO HOST DISK PARAMETERS LD HL,(TRACK) LD (HSTTRK),HL EFB BMASK ;BLOCK MASK DEFB 0 ;EXTENT MASK (DUMMY) DEFW 0 ;MAX BLOCK# (DUMMY) DEFW D8IRSIZ-1 ;MAX DIRECTORY ENTRY# DEFLUSH ;ELSE CLEAR ANY DEFERRED WRITES LD A,1 CALL RW128 ;READ 128 BYTE SECTOR DIRECTLY RET ; READ1: CALL PHYSECT ;TRANPARAMS FOR 5 INCH DOUBLE DENSITY DISKS ; F5RMTAB: DEFB 00000000B ;DEBLOCK MASK DEFW 128 ;PHYSICAL SECTOR LENGTH DEFB 28ALL EQU 0 ;WRITE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2 ;WRITE TO UNALLOCATED ; ; INDEX OFFSETS TO ACCE DEFB HIGH DIRMSK ;ALLOCATION MASK MSB DEFB LOW DIRMSK ;ALLOCATION MASK LSB DEFW D5IRSIZ/4 ;CHECK VECTOR SIZE DEFW R5ESE LD A,(DISK) LD (HSTDSK),A CALL READHST ;READ HOST SECTOR INTO DEBLOCK BUFFER RET NZ ;EXIT IF DISK ERROR READ4: CALL DB HIGH DIRMSK ;ALLOCATION MASK MSB DEFB LOW DIRMSK ;ALLOCATION MASK LSB DEFW D8IRSIZ/4 ;CHECK VECTOR SIZE DEFW R8ESERV ;RSLATE SECTOR# TO HOST EQUIV LD A,(WRTACT) OR A JR Z,READ2 ;JUMP IF WRITE BUFFER ACTIVE CALL FLUSH ;ELSE CLEAR OUT  ;LOGICAL SECTORS PER TRACK DEFB 00000001B DEFW 256 DEFB 18*2 DEFB 00000011B DEFW 512 DEFB 9*4 DEFB 0000011SS DEBLOCK PARAMETERS RELATIVE ; TO BASE ADDRESS OF DPH ENTRY FOR SPECIFIED DRIVE ; SPT EQU 16 BLM EQU 19 SHFCNT EQU 31 SERV ;RESERVED TRACKS DEFB 0 ;DEBLOCK SHIFT COUNT (DUMMY) DEFB 0 ;DEBLOCK MASK (DUMMY) DEFW 0 ;BYTES PER SECTOR (DUMMYEBLOCK ;MOVE 128 BYTES FROM BUFFER XOR A RET ;RETURN WITH A=0 (NO ERRORS) ; ; ; ; ; WRITEDB: LD IX,(DPHPTR) ;GET ESERVED TRACKS DEFB 0 ;DEBLOCK SHIFT COUNT (DUMMY) DEFB 0 ;DEBLOCK MASK (DUMMY) DEFW 0 ;BYTES PER SECTOR (DUMMY) DEFERRED WRITE JR READ3 ; AND THEN READ NEW BUFFER FULL ; READ2: LD A,(RDACT) OR A JR Z,READ3 ;READ INTO BUFFER IF DEB1B DEFW 1024 DEFB 5*8 ; ; ; BASIC DISK PARAMS FOR DOUBLE DENSITY FORMATS ; DPBGEN B8LS,D8IRSIZ ;GENERATE BSH/BLM/DIRCMSK EQU 32 SECLEN EQU 33 FLAGS EQU 35 ; ; ; ; READDB: LD IX,(DPHPTR) ;GET POINTER TO THIS DRIVE'S PARAMETERS LD A,1 % POINTER TO THIS DRIVE'S PARAMETERS XOR A LD (DIR),A ;FLAG AS WRITE OPERATION LD A,(IX+SHFCNT) OR A JR NZ,WRITE1 ;DO ;ELSE COPY NEW DISK/TRACK/SECTOR LD (HSTSEC),A ; TO HOST DISK PARAMETERS LD HL,(TRACK) LD (HSTTRK),HL LD A,(DISK) LD D A,(IX+BLM) LD (RCOUNT),A ;RCOUNT=SECTORS-PER-BLOCK MINUS 1 LD A,(SECTOR) LD (NXTSEC),A LD HL,(TRACK) ;STORE PARAMS FORSS FROM BDOS LD A,(DIR) OR A JR NZ,DEBLK2 ;SKIP IF READ LD A,1 LD (WRTACT),A ;INDICATE BUFFERED WRITE IS ACTIVE EX DTRACK) LD DE,(NXTTRK) OR A ;COMPARE NEW SECTOR/TRACK TO PREVIOUSLY SBC HL,DE ; ANTICIPATED NUMBERS FOR NEXT RECORD JR T (RANGE 1..3) LD A,(SECTOR) DEC A ;REMOVE +1 BIAS FROM SECTOR NUMBERS PHSEC2: SRL A DJNZ PHSEC2 INC A ;REINSTATE +1  DEBLOCKING FOR SECTORS > 128 BYTES CALL FLUSH ;ELSE END ANY DEFERRED WRITES XOR A CALL RW128 ;WRITE 128 BYTE SECTOR D(HSTDSK),A LD (HSTDPH),IX ;STORE DPH POINTER FOR CALLS TO 'FLUSH' UNAL4: CALL DEBLOCK ;MOVE 128 BYTES INTO BUFFER LD HL,NX COMPUTATION OF LD (NXTTRK),HL ; SUCCESSIVE SECTOR NUMBERS IN BLOCK JR UNAL3 ; ; ARRIVE HERE ON SUCCESSIVE WRITES TO UNALLE,HL ;SOURCE/DEST SWAP DEBLK2: LD BC,128 LDIR RET ; ; PAGE ; ; HOSTCMP: LD A,(SECTMP) LD HL,HSTSEC CP (HL) NZ,ALLOC ;JUMP IF NOT IN CURRENT BLOCK LD HL,RCOUNT ;CHECK IF RCOUNT HAS REACHED ZERO LD A,(HL) OR A JR NZ,UNAL2 ;JUMPBIAS TO SECTOR# LD (SECTMP),A ;SAVE FOR BUFFER RANGE TEST RET ; ; ; DEBLOCK: LD A,(SECTOR) DEC A ;REMOVE SECTOR NUMIRECTLY RET ; WRITE1: CALL PHYSECT ;TRANSLATE HOST EQUIV OF SECTOR# XOR A LD (RDACT),A ;RESET READ BUFFER ACTIVE FLAGTSEC INC (HL) ;ADD 1 TO CURRENT DISK ADDRESS TO LD A,(HL) ; GET NEXT SECTOR/TRACK NUMBER IN BLOCK CP (IX+SPT) JR C,UNAOCATED BLOCK ; UNAL2: DEC (HL) ;RCOUNT = RCOUNT-1 CALL HOSTCMP ;TEST IF STILL IN SAME HOST SECTOR JR Z,UNAL4 ;PUT RECOR RET NZ LD HL,(TRACK) LD DE,(HSTTRK) OR A SBC HL,DE RET NZ LD A,(DISK) LD HL,HSTDSK CP (HL) RET ; ; ;  IF CONTINUED WRITE ALLOC: CALL FLUSH ;FINISH OLD WRITE BUSINESS CALL READ3 ;READ NEW BUFFER RET NZ CALL WRITEHST RBER +1 BIAS AND (IX+SECMSK) ;MASK SECTOR# OFF TO GET BUFFER INDEX LD H,0 LD L,A ADD HL,HL ADD HL,HL ADD HL,HL ADD  LD A,C ;WRITE TYPE IN C CP WRUAL JR Z,UNALOC ;JUMP IF NEW UNALLOCATED BLOCK CP WRDIR JR Z,ALLOC ;JUMP IF DIRECTORL5 JR Z,UNAL5 LD (HL),1 ;RESET TO SECTOR# 1 AND BUMP TRACK# LD HL,(NXTTRK) INC HL LD (NXTTRK),HL UNAL5: XOR A RET D INTO BUFFER IF NOT FULL CALL WRITEHST ;WRITE HOST SECTOR FROM BUFFER RET NZ ;EXIT IF DISK ERROR UNAL3: LD A,(SECTMP) ; FLUSH: XOR A LD (RDACT),A ;FLAG BUFFERED READ AS INACTIVE LD (RCOUNT),A ;TERMINATE ANY WRITE TO UNALLOCATED LD A,(WRET ; ; START WRITING UNALLOCATED BLOCK BY SETTING PARAMETERS ; UNALOC: CALL FLUSH ;FINISH ANY PREVIOUS DEBLOCKED WRITES LHL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD BC,BIGBUF ADD HL,BC ;HL = HOST BUFFER ADDRESS LD DE,(POINTR) ;DE = DMA ADDREY WRITE ; ; CHECK FOR CONTINUED WRITE TO UNALLOCATED BLOCK ; LD A,(SECTOR) LD HL,NXTSEC CP (HL) JR NZ,ALLOC LD HL,( ;RETURN WITH A=0 (NO ERRORS) ; ; ; TRANSLATE SECTOR# TO HOST DISK EQUIVALENT ; PHYSECT: LD B,A ;LOAD B WITH SHIFT COUN& TACT) OR A RET Z PUSH IX ;SAVE CURRENT DPH POINTER IN IX LD IX,(HSTDPH) ;LOAD RIGHT POINTER FOR STUFF IN BUFFER CALA CALL CKTYPE LD A,C JR NC,DFLP2A CP N8TRAKS JR DFLP2B DFLP2A: CP N5TRAKS DFLP2B: ELSE CP NTRAKS ;TEST IF TRAETER TABLES ; AND ACC CONTAINING R/W OPERATION INDICATOR. ; ; DOIT: LD (RWFLAG),A ;STORE RWFLAG 1=READ 0=WRITE IF WIN XOR A CPIR ;SCAN MEMORY LOOKING FOR NULL POP AF DJNZ REP2 REP3: CALL PMSG ;PRINT ERROR TYPE STRING LD A,E AND 11******************************** ; ; ; ; ; READHST: LD HL,BIGBUF LD (HSTPTR),HL LD A,1 LD (RDACT),A CALL DOIT ;D A,(HSTSEC) LD C,A LD A,(RWFLAG) OR A ;TEST DIRECTION 1=READ 0=WRITE JR Z,DOFLP5 CALL MONITR+36 JR DOFLP6 ; DL WRITEHST ;WRITE BUFFER ONTO HOST DISK POP IX ;RESTORE DPH POINTER BEFORE GOING BACK RET IF MIXED ;CHECK TYPE OF DICK# IS ON OTHER SIDE ENDIF JR C,DOFLP3 LD B,SIDSEL+ON ;SELECT OPPOSITE SIDE IF MIXED LD C,A CALL CKTYPE LD A,C CH LD A,(HSTDSK) CP NFLOPPY JP NC,DOWINCH ;DO SASI DISK ROUTINE IF ON HARD DISK ENDIF DOFLOP: LD A,(HSTDSK) LD C,A 000000B ;MASK TO NOT-READY AND WRITE-PROTECT JR NZ,REP5 LD HL,TSMSG CALL PMSG LD A,(HSTTRK) CALL PUTDEC CALL PMSG READ SECTOR FROM DISK RET Z LD HL,RDACT LD (HL),0 ;CLEAR FLAG IF DISK READ ERROR RET ; ; ; WRITEHST: LD HL,BIGBUFOFLP5: CALL MONITR+39 DOFLP6: RET Z ;RETURN IF READ/WRITE SUCCESSFUL CALL REPORT JR Z,DOFLP4 ;TRY AGAIN IF INDICATED RETSK TO SELECT, 5 1/4 OR 8 INCH. CKTYPE: PUSH BC LD A,(DISK) INC A ;RANGE 1-4 LD B,A LD A,(TYPEFLAG) ;GET TYPE FROM  JR NC,DFLP2C SUB N8TRAKS JR DFLP2D DFLP2C: SUB N5TRAKS DFLP2D: ELSE SUB NTRAKS ;CONVERT TRACK# TO REAL VALUE ENDCALL MONITR+27 ;SELECT SPECIFIED DRIVE JR Z,DOFLP2 CALL REPORT ;REPORT SELECT ERROR TO CONSOLE JR Z,DOFLOP RET ;RETUR LD A,(HSTSEC) CALL PUTDEC LD A,1 OR A RET ; REP5: LD HL,PROMPT CALL PMSG CALL IVEC ;LOOP FOR CONSOLE INPUT CP LD (HSTPTR),HL XOR A LD (WRTACT),A CALL DOIT ;WRITE SECTOR TO DISK RET ; ; ; RW128: LD HL,NEW LD DE,HOST L ; ; ; ; REPORT: LD E,A ;SAVE PERTINENT ERROR BITS IN E LD A,(HSTDSK) ADD A,'A' LD (DSKMSG+16),A LD HL,DSKMSG CAMONITOR RAM SKTLP: SRL A ;PUT DISK FLAG IN CARRY DJNZ SKTLP POP BC RET ENDIF PAGE ;**************************IF DOFLP3: LD C,A LD A,B OUT (PORT0),A ;OUTPUT SIDE SELECT BIT CALL MONITR+33 ;SEEK SELECTED TRACK JR Z,DOFLP4 CALLN PERMANENT ERROR IF NOT ZERO ; DOFLP2: LD B,SIDSEL+OFF ;DEFAULT TO SELECT DISK SIDE ZERO LD A,(HSTTRK) IF MIXED LD C, 'C'-64 JR Z,REP6 XOR A RET ; REP6: XOR A LD (IOBYTE+1),A ;CLEAR AUTO-LOG BYTE IF CTL-C ABORT INC A RET ;RETURN D BC,6 LDIR ;FALL THROUGH INTO 'DOIT' ; ; ... MASTER DISK READ/WRITE ROUTINE ... ; ; CALL WITH IX POINTING TO DISK PARAMLL PMSG ;PRINT OUT START OF MESSAGE LD BC,08FFH ;B=LOOPCOUNT C=255 FOR CPIR SCAN LD A,E REP2: RLA JR C,REP3 PUSH AF ****************************** ;* * ;* HOST DISK SELECT/SEEK/READ/WRITE ROUTINE * ;* * ;************************ REPORT ;REPORT SEEK ERROR TO CONSOLE JR Z,DOFLP2 RET ;RETURN PERMANENT ERROR IF INDICATED ; DOFLP4: LD HL,(HSTPTR) L' PERMANENT BIOS ERROR ; ; ; ; CHARACTER STRING OUTPUT ROUTINE. PRINTS ASCII DATA ; POINTED TO BY HL UNTIL A DOLLAR SIGN IS E AND 00000100B ;TEST TBE STATUS BIT JR Z,SIOUT1 LD A,(SIOADR+1) LD C,A ;LOAD C WITH SIO DATA PORT# NOW POP AF OUT (I RETI ; ; ; -- RX ERROR INTERRUPT SERVICE ROUTINE FOR SIO CONSOLE -- ; SIOERR: LD (IRQSAV),SP LD SP,IRQSTK PUSH AFLD A,USRDRV LD (IOBYTE+1),A ;SET DEFAULT DRIVE/USER FOR COLDSTART LD HL,SCRATCH LD (HL),0 LD DE,SCRATCH+1 LD BC,SCRLENACTER IF NON-ZERO POP AF RET ; ; ; ; ; ; NULL EQU 00H ;NULL (END-OF-STRING INDICATOR) LF EQU 0AH ;LINE FEED CR E READ IN LD DE,CBIOS ;BIOS STARTS HERE LD HL,TPA+256 ;BIOS PARKED HERE LD BC,MOVLEN LDIR ;MOVE INTO PLACE ; ; ... NCOUNTERED ; PMSG: LD A,(HL) ;HL POINTS TO ASCII STRING INC HL OR A ;TEST FOR BYTE EQUAL ZERO RET Z LD C,A ;PRINT C;******************************************************** ;* * ;* ONE-SECTOR LOADER FOR FIRST STAGE DD BOOT * ;*  PUSH BC LD A,(SIOADR) LD C,A ;LOAD C WITH SIO CONTROL PORT# LD A,00110000B OUT (C),A ;RESET SIO EXTERNAL STATUS/INT-1 LDIR ;ZERO-OUT SCRATCH MEMORY FOR BIOS LD HL,LSTINIT LD B,6 LD C,LSTCTL OTIR ;SET PRINTER PARITY/LENGTH/STOP BIQU 0DH ;CARRIAGE RETURN DSKMSG: DEFB CR,LF DEFB 'BIOS error on A: ',NULL DEFB 'not ready',NULL DEFB 'wrt protect',PUT COLDSTART INIT HERE TO CONSERVE BIOS SPACE .. ; IF WINCH LD A,RST+ON OUT (SASI+1),A ;RESET SASI BUS CONTROLLER(S) LHARACTER IF NOT DOLLAR SIGN CALL OVEC JR PMSG ; ; ; ; PRINT CONTENTS OF A IN DECIMAL (RANGE 0..255) ; PUTDEC: LD B,1* ;******************************************************** ; TPA EQU 100H ; ; ... READ CBIOS FROM DOUBLE DENSITY TRACK ZERERRUPTS LD A,(SIOADR+1) LD C,A ;NOW LOAD C WITH DATA PORT# IN A,(C) ;INPUT AND DISCARD BAD CHARACTER POP BC POP AF TS LD B,2 LD C,LSTBAUD OTIR ;SET PRINTER BAUDRATE LD A,1 LD (TRKTAB+4),A ;SET DRIVE ZERO TO DOUBLE DENSITY JP CBIONULL DEFB 'wrt fault',NULL DEFB 'not found',NULL DEFB 'bad crc',NULL DEFB 'overrun',NULL DEFB 'drq',NULL DEFB 'busy'D A,RST+OFF OUT (SASI+1),A ENDIF IF SERIAL LD HL,(MONITR+16) ;PATCH MONITOR CONOUT VECTOR TO LD (MONITR+13),HL ; DIREC00 CALL PDIGIT ;PRINT HUNDREDS DIGIT LD B,10 CALL PDIGIT ;PRINT TENS DIGIT PNUM: OR '0' LD C,A CALL OVEC RET ; O ... ; ONESECT: LD HL,TPA LD B,BIOSLEN/1024+1 LD C,1 OSEC2: PUSH HL ;SAVE PARAMETERS PUSH BC CALL MONITR+36 ;CALL EI RETI ; ; ; ; ; SIOOUT: PUSH BC PUSH AF LD A,(SIOADR) LD C,A ;LOAD C WITH SIO STATUS PORT# SIOUT1: IN A,(C)S ;EXECUTE BIOS COLDSTART ROUTINE ; ; ; LSTINIT: ;SERIAL PRINTER INIT CONSTANTS DEFB 4 DEFB 01000101B ;16X CLOCK / 1 ,NULL DEFB NULL TSMSG: DEFB ' track ',NULL DEFB ' sector ',NULL PROMPT: DEFB ' ?','H'-64,NULL ; ; ; ; ; T OUTPUT TO BUILT-IN CRT DRIVER ENDIF LD HL,TPA+128 CALL PMSG ;OUTPUT SIGNON MSG XOR A LD (IOBYTE),A ;CLEAR IOBYTE ; PDIGIT: LD C,-1 PDIG1: INC C SUB B JR NC,PDIG1 ADD A,B PUSH AF LD A,C OR A CALL NZ,PNUM ;PRINT NUMERIC CHAR MONITOR DISK READ ROUTINE POP BC POP HL JR NZ,BTERR LD DE,1024 ADD HL,DE INC C DJNZ OSEC2 ;REPEAT UNTIL ALL BIOS( STOP BIT / ODD PARITY DEFB 3 DEFB 01000001B ;RX 7 BIT CHARACTERS DEFB 5 DEFB 10101010B ;TX 7 BIT CHARACTERS / DTR AND RT 26 NC  20 Gnd 15 8 Data bit 7 16 21 Gnd 17 (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 ;ELS Gnd 3 2 Data bit 1 4 15 Gnd 5 3 m, Enter: "program rom(cr)." Where "rom" is the name of the "com" file to burn in (max 4k) 3. Assemble thS HIGH DEFB 01000111B ;PROGRAM CTC AND LOAD TIME CONST DEFB 4 ;DIVIDE BY 4 GIVES 9600 BAUD ; ; ; BTERR: LD A,'?' CAns add the following: typeflag: defb 00001111b ;default set to 8 inch speed8: defb 5 ;8 inch s 9 Data strobe 18 22 Gnd 19 10 +12 Volt E SET A=255 TO INDICATE DATA READY ; ; ; KBDIN: CALL KBDST JR Z,KBDIN ;LOOP UNTIL KEYBOARD INPUT READY PUSH HL CALL R Data bit 2 6 16 Gnd 7 4 Data bit 3 8 e file "autobios" for a mixed configuration setup. This is done by specifying: in "system variables" EIGHT EQU FALSELL MONITR+12 ;OUTPUT ERROR INDICATION TO CONSOLE LD A,'G'-64 CALL MONITR+12 JP MONITR+3 ;JUMP BACK TO MONITOR ROM ; ; ;eek rate in miliseconds speed5: defb 3 ;5 1/4 inch seek rate in miliseconds Both speed bytes may b20 23 +12 Volt 21 11 NC 22 24 -12 Volt EMOVE ;GET CHARACTER FROM INPUT QUEUE POP HL RET ; ; ; ; ; STASH: LD C,A ;PUT CHARACTER IN C LD A,(FIFSIZ) AND 0 17 Gnd 9 5 Data bit 4 10 18 Gnd 11 ;******************************************************** ;* * ;* INTERRUPT SERVICE ROUTINES FOR KEYBOARD * ;* INPUT A e modified by the "config" program and are used by "autobios" when selecting a drive. Assemble the new monitor sou 23 12 -12 Volt 24 25 NC 25 13 +5 Volt 0111111B 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  6 Data bit 5 12 19 Gnd 13 7 Data bit 6 14 ND REAL-TIME CLOCK FUNCTIONS * ;* * ;******************************************************** ; ; ; ; KBDST: LD A, Bigb 2 J1 Cannon Omschrijving. Pin no: 1 1 Data bit 0 2 14rce, and make a new rom (2732) by using the provided "program.com" transient program. In order to burn a 2732 epro) NOW IF FIFO IS FULL LD (HL),A ; ELSE INCREMENT FIFO COUNT LD HL,FIFIN ;POINT HL TO FIFO INPUT OFFSET CALL INDEX LD (HL)WITCH TO LOCAL STACK PUSH HL PUSH DE PUSH BC PUSH AF LD HL,(TICKS) INC HL ;BUMP FREE RUNNING CLOCK TICK COUNTER L ; ; -- INTERRUPT SERVICE ROUTINE FOR ONE MILLISECOND TIMER -- ; MILLISEC: LD (IRQSAV),SP ;SAVE USER STACK POINTER AND Lboth paths need this, so be efficient jr z,vsync2 ; if no scroll requested this time ; ld a,12 out (crtadd),a ; select hiIRQSTK ; SWITCH TO LOCAL STACK PUSH HL PUSH DE PUSH BC PUSH AF ;SAVE MACHINE STATE IN A,(KBD) ;READ KEYBOARD INPUT POUTINE FOR CRTC VSYNC INTERRUPT -- ; VSYNC: LD (IRQSAV),SP ;SAVE USER STACK POINTER AND LD SP,IRQSTK ; SWITCH TO LOCAL STACK,C ;STORE CHARACTER IN FIFO @ HL RET ; ; ; ; REMOVE: LD HL,FIFCNT DEC (HL) LD HL,FIFOUT ;POINT HL TO FIFO OUTPUT OFFD (TICKS),HL LD HL,(TIKVEC) CALL DISPATCH ;DO EXTRA CLOCK TICK ACTIVITY LD HL,TIKCNT DEC (HL) ;DECREMENT CLOCK TICK PRED SP,IRQSTK ; SWITCH TO LOCAL STACK PUSH HL PUSH DE PUSH BC PUSH AF LD HL,(STPVEC) CALL DISPATCH ;CALL MILLISECOND Igh start register ld a,d ; new high start out (crtdat),a ld a,13 out (crtadd),a ; select low start register ld a,e ORT BIT 7,A JR Z,KEYSRV1 ;USE TABEL IF BIT 7 IS SET LD BC,KEYTABL  PUSH HL PUSH DE PUSH BC PUSH AF LD A,(DSCOPY) PUSH AF ;SAVE D/S CONTROL BYTE ON STACK LD A,DYSTAT+OFF OUT (PORSET INDEX: LD A,(HL) INC A AND 00111111B ;INCREMENT FIFO POINTER LD (HL),A ; MODULO 64 AND REPLACE LD HL,FIFO ADD A,-SCALER JR NZ,TIMER2 ;JUMP IF CURRENT SECOND NOT PASSED LD A,(NTICKS) ;ELSE RELOAD TICK COUNT AND DO LD (HL),A ; VARIOUNTERRUPT ROUTINE POP AF POP BC POP DE POP HL LD SP,(IRQSAV) EI RETI ; ; ; DISPATCH: JP (HL) ; ; ; ; -- Iout (crtdat),a ld hl,(newlin) add hl,de ; (start)+(newlin) res 3,h ; modulo 2048 ld bc,80 push de ; have to pass (s ;TABLE LENGTH LD HL,KEYTAB ;CONVERSION TABEL CPIR LD A,(HL) KEYSRV1:LD HL,(KBDVECT0),A ;SWITCH-ON STATIC MEMORY BANK ; ; This part is almost a dead out copy of the original. I used ; de for my start refereL ;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 ; ; ; ;S ONCE-A-SECOND THINGS CALL CLOCK ;UPDATE TIME-OF-DAY CLOCK CALL DISKTEST ;DO BACKGROUND DISK ACTIVITY MONITOR TIMER2: PNTERRUPT SERVICE ROUTINE FOR CLOCK TICK INTERRUPT -- ; TIMER: LD (IRQSAV),SP ;SAVE USER STACK POINTER AND LD SP,IRQSTK ; Start) to vsync2 this ; path too. call CLRLINE pop de ; recover (start) ; ; This part is new. You can have this mod) CALL DISPATCH POP AF POP BC POP DE POP HL LD SP,(IRQSAV) RETI: EI ;RE-ENABLE INTERRUPTS AND RETURN RETI ; ;nce to save a couple of bytes. (vsync2 ; gets it if we take the jump). ; newcrsph: ld a,(scroll) or a ld de,(start) ;  ; ; ; -- INTERRUPT SERVICE ROUTINE FOR PARALLEL KEYBOARD -- ; KEYSRV: LD (IRQSAV),SP ;SAVE USER STACK POINTER AND LD SP,OP AF POP BC POP DE POP HL LD SP,(IRQSAV) EI ;RE-ENABLE INTERRUPTS AND RETURN RETI ; ; ; -- INTERRUPT SERVICE R*  without re-burning ; a PROM, and thus have your cake and eat it too. ZAPCSR is ; no longer needed, so you can take it out if- RX ERROR INTERRUPT SERVICE ROUTINE FOR SIO CONSOLE -- ; SIOERR: LD (IRQSAV),SP LD SP,IRQSTK PUSH AF PUSH BC LD A,( SIOIN: CALL SIOST ;TEST CONSOLE STATUS JR Z,SIOIN ;LOOP UNTIL DATA IS IN A,(SIODPB) ; READY AT SIO DATA PORT AND 011111CK4: RET TODTAB: DEFB 60H ;60 SECONDS/MINUTE DEFB 60H ;60 MINUTES/HOUR DEFB 24H ;24 HOURS/DAY DEFB 99H ;OVERFLOW TOCA3),A ;TURN OFF VSYNC INTERRUPT XOR A LD (SCROLL),A ;RESET SCROLL-REQUEST FLAG LD (MOVECS),A ;RESET CURSOR-MOVE-REQUEST FTO SIO POP BC RET ; ; ; ; ; ; CLOCK: LD DE,TOD ;POINT DE TO START OF TIME-OF-DAY LD HL,TODTAB ;POINT HL TO HH:MM:S you re-assemble. ; ; vsync2 receives de = (start) ; vsync2: ld hl,(cursor) ld a,15 ; low order cursor position out SIOADR) LD C,A ;LOAD C WITH SIO CONTROL PORT# LD A,00110000B OUT (C),A ;RESET SIO EXTERNAL STATUS/INTERRUPTS LD A,(SIO11B RET ; ; ; ; -- RX INTERRUPT SERVICE ROUTINE FOR SIO CONSOLE -- ; SIOINT: LD (IRQSAV),SP LD SP,IRQSTK PUSH HL DAYS ; ; KEYTAB: DB 0C3H,0D ;OLD VALUE - NEW VALUE DB 3FH KEYTABL EQU $-KEYTAB-1 ;CALCULAG POP AF ;POP MEMORY CONTROL BYTE OFF STACK OUT (PORT0),A ;SWITCH BACK TO PRE-INTERRUPT CONFIG POP AF POP BC POP S TABLE LD B,4 CLOCK2: LD A,(DE) ADD A,1 ;INCREMENT TIME WITH ADD INSTRUCTION DAA ; SO DECIMAL ADJUST WILL WORK RIGHT (crtadd),a ld a,l out (crtdat),a sub e ; if cursor position is less than ld a,14 ; start, we will bump cursor mod 204ADR+1) LD C,A ;NOW LOAD C WITH DATA PORT# IN A,(C) ;INPUT AND DISCARD BAD CHARACTER POP BC POP AF EI RETI ; ; ; PUSH DE PUSH BC PUSH AF LD HL,SIOADR+1 LD C,(HL) ;LOAD C WITH SIO DATA PORT# IN A,(C) AND 01111111B LD HL,(RDALATE LENGHT OF TABLE ; DE POP HL LD SP,(IRQSAV) EI ;RE-ENABLE INTERRUPTS AND RETURN RETI ; ; ; ; POLLED MODE I/O ROUTINES FOR SIO CHANEL  CP (HL) ;COMPARE IF HH/MM/SS ROLLED OVER JR C,CLOCK3 XOR A ;RESET TO ZERO IF ROLL OVER CLOCK3: LD (DE),A ;STORE UPDATE8 out (crtadd),a ld a,h ; high order cursor position sbc a,d ld a,h ; tentative high order byte jr nc,cursok ; if st ; ; SIOOUT: PUSH BC PUSH AF LD A,(SIOADR) LD C,A ;LOAD C WITH SIO STATUS PORT# SIOUT1: IN A,(C) AND 00000100B ;TVEC) CALL DISPATCH ;GO PROCESS SIO INPUT CHARACTER POP AF POP BC POP DE POP HL LD SP,(IRQSAV) EI RETI ; ; ; -ETER COUNT=2 SCF RET NZ LD C,L ;POINT C TO OUTPUT PORT OUT (C),E ;OUTPUT DATA PASSED IN E OR A RET ; ; ; ; -- B ; SIOST: IN A,(SIOCPB) ;GET SIO STATUS REGISTER AND 00000001B RET Z ;ACC=0 IF NO DATA AVAILABLE LD A,255 RET ; ; D TIME DATA RET C ;EXIT IF NO MORE NEEDS TO BE DONE INC HL INC DE ;ELSE POINT TO NEXT DATA & CONSTANT DJNZ CLOCK2 CLOart <=curs ; set 3,a ; else bump cursor modulo 2048 ; cursok: out (crtdat),a ; high order LD A,00000011B OUT (CTEST TBE STATUS BIT JR Z,SIOUT1 LD A,(SIOADR+1) LD C,A ;LOAD C WITH SIO DATA PORT# NOW POP AF OUT (C),A ;OUTPUT DATA + MEMORY EXAMINE COMMAND -- ; VIEW: CALL MDATA CALL ECHO CP CR JR Z,VIEW4 CP '-' JR Z,VIEW5 CP ',' JR NZ,VIEW2 CRUPT 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,0A 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 4PARAM4) LD BC,(PARAM5) ;PUT REST OF PARAMS IN REGISTERS JP EXITMON ;SET D/S BANKSWITCH AND EXIT MONITOR ; ; ; ; -- MEMOTE FOR STD BANK SWITCH BIT ; ; ; VECTORS FOR EXTRA FUNCTIONS IN KBD/SIO/TIMER INTERRUPTS ; AND FOR EXTENDED MONITOR AND CRTOALL ECHO JR VIEW3 VIEW2: CALL ASCHEX CCF RET NC RLCA RLCA RLCA RLCA LD C,A CALL ECHO CALL ASCHEX C,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: DEFBNDITION 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;******************************************************** ;* * ;* STORAGE ALLOCATION FOR 256 BYTE SCRATCH RAM * ;* UT ROUTINES. ; KBDVEC: DEFW STASH ;PARALLEL KEYBOARD RDAVEC: DEFW STASH ;SIO RECEIVED DATA INTERRUPT TIKVEC: DEFW CLOCK4 CF RET NC OR C VIEW3: LD C,A CALL STORE VIEW4: INC HL INC HL VIEW5: DEC HL JR VIEW ; ; ; ; -- JUMP TO MEMORY L 0 ;FIFO INPUT POINTER FIFOUT: DEFB 0 ;FIFO OUTPUT POINTER FIFSIZ: DEFB 32 ;MAX FIFO SIZE PARAM ; ; CONNUM: DEFB 0 ;CURRT 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 INTERROCATION COMMAND -- ; GOTO: OR A ;CHECK IF PARAMETER COUNT <> ZERO SCF RET Z DI LD SP,STACK LD DE,ROLLIN PUSH DERENT CONSOLE DEVICE# (0,1 OR 2) SIOADR: DEFB 0 ;CONSOLE SIO CONTROL/DATA PORT NUMBER DEFB 0 ; ; CONFIG: DEFB 00000001B ;ST (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 5 ;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  ;PUSH MONITOR ENTRY ADDRESS FOR RETURN PUSH HL ;PUSH TRANSFER ADDRESS AFTER THAT LD A,(PARAM2) LD HL,(PARAM3) LD DE,(TDBB AND D/S BITS FOR MONITOR DSCOPY: DEFB DYSTAT+OFF ;CONTROL BYTE FOR D/S BANK SWITCH BIT STDCPY: DEFB STDBB+OFF ;CONTROL BY, HEAD SETTLING TIME BLKSIZ: DEFW 1024 ;MAX DMA BLOCK SIZE FOR READ/WRITE NSTOP: DEFB 6*20 ;NUMBER OF INDEX PULSES TILL DISK S 00001111B ;DEFAULT SELECT 8 INCH SPEED8: DEFB 5 ;SPEED FOR 8 INCH SPEED5: DEFB 3 ;SPEED FOR 5 1/4 INCH AUTONL EQU 0  CHARACTER ATTRIBUTE BITS GRMODE: DEFB 00000000B ;MODE BITS FOR GRAPHICS MODE ESCVEC: DEFW 0 ;POINTER FOR LEAD-IN SEQUENCE RO VECTOR JP VIDOUT ;CRT OUTPUT VECTOR JP SIOST ;SIO CHANEL B STATUS VECTOR JP SIOIN ;SIO CHANEL B INPUT VECTOR JP SIOOOR FOR STEP FINITE STATE MACHINE STPCMD: DEFB 0 ;... 179X STEP COMMAND BYTE STPCNT: DEFB 0 ;... LOOP COUNT STPDLY: DEFB 0  SEARCH: CPIR ;SEARCH TABLE @HL FOR MATCH WITH A RET NZ ;EXIT NOW IF SEARCH FAILS ADD HL,BC ADD HL,BC ;ADD RESIDUE FRTOP NREVS: DEFB 3 ;NUMBER OF INDEX PULSES BEFORE READY DSKTYP: DEFB 00000001B ;DISK TYPE / DENSITY INDICATOR MAXRWT: DEFB 5 ;AUTO-NEWLINE NOSCRL EQU 1 ;NO SCROLL DSPTIM EQU 2 ;CLOCK TIME DISPLAY ; ; ; ; ; FREE MEMORY LIST POINTER FREPTR: DEUTINES ROWTMP: DEFB 0 SCROLL: DEFB 0 ;SCROLL REQUEST FLAG START: DEFW 0 ;CONTENTS OF 6845 START ADDRESS REG NEWLIN: DEFW 0UT ;SIO CHANEL B OUTPUT VECTOR JP SELECT ;DISK DRIVE SELECT JP HOME ;HOME R/W HEAD JP SEEK ;SEEK TO TRACK JP READ ;;... DELAY COUNT INUSE: DEFB 0 ;DISKS IN-USE FLAG FOR BACKGROUND DSKCNT: DEFB 0 ;... DISK TURN-OFF COUNTER RDYCNT: DEFB 0 OM 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) ;MAXIMUM RETRY NUMBER FOR DISK I/O SECTOR: DEFB 0 ;SECTOR# FOR READ/WRITE SECTOR CMDTYP: DEFB 0 ;COMMAND BYTE FOR READS/WFW TAIL ; ;  ;RELATIVE ADDR OF NEW LINE AFTER SCROLL MOVECS: DEFB 0 ;CURSOR-MOVE REQUEST FLAG CURSOR: DEFW 0 ;OFFSET (0..2047) TO CURSOREAD SECTOR JP WRITE ;WRITE SECTOR JP READID ;READ ID JP WTRAK ;IMPLEMENTED 15/01/83 ; ; ; REINIT: DI LD A,DYST;... NOT-READY TIMER OLDCTC: DEFB 0 ;... LAST CTCA1 COUNT ; ; ; ; CRT OUTPUT DRIVER VARIABLES RC EQU $ ;ROW/COLUMN FOR PAGE ; ; ; ; -- MONITOR ENTRY POINT TABLE -- COLD: JP REINIT ;MONITOR COLD ENTRY POINT WARM: JP ROLLIN ;MONITOR WARM RITES RWTRY: DEFB 0 ;READ/WRITE RETRY COUNT FNDTRY: DEFB 0 ;SEEK RETRY COUNT ERRTYP: DEFB 0 ;ERROR STATUS FOR READ/WRITE RCTER FROM BUFFER CALL PNEXT DEFB ' ','H'-64 ;PRINT A SPACE TO OVERWRITE THE DEFB EOT ; LAST CHARACTER, THEN DO A BACKSPACR LOCATION OLDCSR: DEFW ATTMEM ;POINTER TO CURSOR IN ATTR MEMORY CRTFLG: DEFB 00000001B ;CRT PARAMETER BITS TYPEFLAG: DEFBAT+OFF OUT (PORT0),A ;SWITCH ROMS ON IN LOW 32K MEMORY JP 0 ;JUMP TO ABSOLUTE LOCATION 0 ; ; ; ROLLIN: DI LD A,DYST CRT CURSOR LOCATION ROW: DEFB 0 COL: DEFB 0 BLANK: DEFB ' ' ;CHARACTER USED FOR BLANK FILL ATTRIB: DEFB 00000011B ;CURRENTENTRY POINT CONST: JP KBDST ;CONSOLE STATUS VECTOR CONIN: JP KBDIN ;CONSOLE INPUT VECTOR CONOUT: JP VIDOUT ;CONSOLE OUTPUTOUTINES IOPTR: DEFW 0 ;DISK I/O BUFFER POINTER SELCPY: DEFB 0 ;COPY OF DATA IN SELECT/MUX OUTPUTS STPVEC: DEFW STEPX ;VECTE 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 ; ; ;- AT+OFF OUT (PORT0),A ;TURN ROMS ON AND ALSO SET MEMORY LD (DSCOPY),A ; BANK SWITCH VARIABLE TO INDICATE LD SP,STACK ; WE W MTST2: LD A,L XOR H ;GENERATE TEST BYTE XOR B LD (HL),A ;STORE BYTE IN RAM INC HL LD A,H CP E ;CHECK FOR END OF,A ADD A,A OUT (PORT0),A LDIR LD A,(DSCOPY) OUT (PORT0),A EI RET ; ; ; EXITMON: DI PUSH AF LD A,(CONFIG)MDSIZ/3 ; IN COMMAND SEARCH TABLE CALL SEARCH CALL NZ,EXTEND ;TRY EXTENDED FUNCTION JUMP IF NO MATCH JR NZ,WHAT PUSH HL D MEMORY MAP BIT SETTING LD (DSCOPY),A ;GO BACK TO MEMORY CONFIGURATION OUT (PORT0),A ; AS IT WAS BEFORE CALLING 'CRTOUT' ;******************************************************** ;* * ;* BASIC HEX MONITOR FOR Z-80 PROCESSORS * ;* * ILL BE EXECUTING FROM ROM EI JP PROMPT ; ; ; VIDOUT: DI LD (CRTSAV),SP LD SP,CRTSTK ;POINT SP TO TOP OF LOCAL STAC TEST BLOCK JR NZ,MTST2 ; NOW READ BACK EACH BYTE & COMPARE LD H,D LD L,0 ;POINT HL BACK TO START MTST3: LD A,L XO ;SET BANK SWITCH STATE TO VALUE ADD A,A ; CURRENTLY SELECTED IN MONITOR ADD A,A ADD A,A AND 00001000B LD (DSCOPY),A  CALL PARAMS ;INPUT NUMERIC PARAMETERS FROM POP IX ; LINE BUFFER AND TEST IF ERROR JR C,WHAT LD HL,(PARAM1) LD DE,(PAPOP BC POP DE POP HL LD SP,(CRTSAV) EI RET ; ; ; ; LOAD: DI LD A,(CONFIG) ADD A,A ADD A,A ADD A,A OUT;******************************************************** ; ; ; ; PROMPT: CALL PNEXT DEFB CR,LF,'* ',EOT LD HL,LINBUF K PUSH HL PUSH DE PUSH BC LD C,A ;MOVE OUTPUT CHARACTER TO C LD A,(DSCOPY) ;SAVE CURRENT RAM/ROM CONTROL BYTE PUSH R H ;RE-GENERATE TEST BYTE DATA XOR B CP (HL) ;COMPARE EXPECTED MEMORY DATA WITH JR NZ,MTST4 ; ACTUAL CONTENTS @HL AND ;STORE CONTROL BYTE FOR D/S BIT OUT (PORT0),A ;SWITCH TO SPECIFIED LOWER BANK POP AF EI RET ;DO JUMP BY POPPING STACK RAM2) LD BC,(PARAM3) CALL CALLX ;CALL SUBROUTINE @ IX JR NC,PROMPT ;GO BACK TO PROMPT IF NO ERRORS WHAT: CALL PNEXT  (PORT0),A LD C,(HL) LD A,(DSCOPY) OUT (PORT0),A EI RET ; ; STORE: DI LD A,(CONFIG) ADD A,A ADD A,A ADD A LD C,LINSIZ CALL GETLIN ;INPUT A BUFERED CONSOLE LINE JR C,WHAT ;PRINT 'WHAT ?' IF INPUT ERROR CALL CRLFS XOR A LAF ; ON STACK FOR DURATION OF 'CRTOUT' LD A,DYSTAT+OFF LD (DSCOPY),A ;SET 'DSCOPY' TO ENABLE LOWER 32K BANK OUT (PORT0),AEXIT IF <> INC HL LD A,H CP E ;CHECK FOR END OF BLOCK JR NZ,MTST3 MTST4: LD A,(DSCOPY) OUT (PORT0),A EI RET ;  ; ; ; ; MEMTEST: DI LD A,(CONFIG) ADD A,A ADD A,A ADD A,A OUT (PORT0),A ;SWITCH TO SELECTED MEMORY BANK TO TESTDEFM ' what ?' DEFB EOT JR PROMPT ; ; ; EXTEND: LD HL,(MONVEC) CALL DISPATCH ;PROCESS EXTENDED MONITOR FUNCTION EXT2:,A OUT (PORT0),A LD (HL),C LD A,(DSCOPY) OUT (PORT0),A EI RET ; ; ; MOVE: DI LD A,(CONFIG) ADD A,A ADD AD (BREAK),A ;CLEAR CONSOLE BREAK FLAG LD A,(LINBUF) LD IY,LINBUF+1 LD HL,CMDTAB ;SEARCH FOR A MATCHING CHARACTER LD BC,C ;TURN ON ROMS AND CRT MEMORY EI LD HL,(CRTVEC) CALL DISPATCH ;CALL SELECTED CRTOUT ROUTINE DI POP AF ;RESTORE OLOF ESCAPE RET ; FLAG TO CALLING ROUTINE ; ; ; ; .  RET ; ; CALLX: JP (IX) ;CALL SUBROUTINE @ IX ; ; ; CMDTAB: DEFB 'V' DEFB 'R' DEFB 'O' DEFB 'I' DEFB 'G' DEFB T 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' ECOND 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'T' DEFB 'F' DEFB 'M' DEFB 'C' DEFB 'B' DEFB 'D' DEFB 'X' DEFB CR DEFW DUMMY DEFW BANKSW ;BANKSWITCH COMMAN DSKAD1: CALL OUTPUT ;DISPLAY 'SD' OR 'DD' LD HL,DADMSG CALL PMSG LD A,(UNIT) ;NOW DISPLAY UNIT/TRACK/SECTOR CALL PUT2H 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,0080D DEFW MEMDMP ;DUMP MEMORY IN HEX/ASCII DEFW BOOT ;BOOT FROM FLOPPY DEFW BLOCK ;MEMORY BLOCK MOVE DEFW VIEW ;MEMORY S ;PRINT DRIVE UNIT# LD A,'T' CALL OUTPUT LD A,(TRACK) CALL PUT2HS ;PRINT TRACK# IN HEX LD A,'S' CALL OUTPUT LD L 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 EXAMINE/CHANGE DEFW FILL ;FILL MEMORY DEFW TEST ;RAM DIAGNOSTIC DEFW GOTO ;JUMP TO MEMORY LOCATION DEFW INCMD ;READ A,(SECTOR) CALL PUT2HS ;PRINT SECTOR# IN HEX DUMMY: OR A RET DADMSG: DEFB 'D U',EOT ; ; ; ; ; -- DISK BOOT LOADER/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 ; ;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 JR/ 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 PPARAM4) LD BC,(PARAM5) ;PUT REST OF PARAMS IN REGISTERS JP EXITMON ;SET D/S BANKSWITCH AND EXIT MONITOR ; ; ; ; -- MEMOALL 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 ;BUMPOP 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 JRRY READ/WRITE DIAGNOSTIC COMMAND -- ; TEST: CP 2 ;CHECK PARAMETER COUNT SCF RET NZ INC DE LD E,D ;GET ENDING PAGE ADCF 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 ; ; ;  C,DUMP4 CP 7FH JR C,DUMP5 DUMP4: LD A,'.' ;PRINT A DOT IF DATA < 20 OR > 7F DUMP5: CALL OUTPUT ;PRINT ASCII CHARACTER IDRESS 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 OOCATION 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=' DEFBN A DJNZ DUMP3 CALL CRLFS RET NZ ;EXIT IF ESCAPE REQUEST IS INDICATED DEC DE LD A,D OR E JR NZ,DUMP RET ; ; F BLOCK LD L,0 TEST2: CALL MEMTEST ;CALL BANK-SWITCH MEMORY TEST ROUTINE JR Z,TEST4 ;DO ANOTHER PASS IF NO ERRORS TEST3: ;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,; -- 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 NZ0 CP 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  (CONFIG),A ;STORE NEW CONFIGURATION BITS RET ; BANK3: EI CALL PNEXT DEFB 'ERR AT ',EOT CALL PUT4HS OR A RET ; ;F 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 * ;* * BLOCK WITH BANK SWITCH OR A RET ; ; ; BLOCAD: EX DE,HL OR A ;CLEAR CARRY SBC HL,DE ;GET DIFFRENCE BETWEEN EX DE, ; ; ; HL ... BLOCK POINTER ; BC ... BYTECOUNT ; D ... DEST BANK CONTROL BYTE ; E ... SOURCE BANK CONTROL BYTE ; SHADOA,(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 GLIN1HL ;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 ; W: LD A,(HL) ;GET MEMORY BYTE FROM SOURCE BANK EX AF,AF' LD A,D OUT (PORT3),A ;SWITCH TO DESTINATION MEMORY BANK EX AADOOW 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 BA; ; ; -- MEMORY BLOCK COMPARE COMMAND -- ; VERCMD: CP 3 ;CHECK IF PARAMETER COUNT=3 SCF RET NZ CALL BLOCAD JR VERF2F,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 CTLY 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  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 ; ; ; ;1  SEARCH: CPIR ;SEARCH TABLE @HL FOR MATCH WITH A RET NZ ;EXIT NOW IF SEARCH FAILS ADD HL,BC ADD HL,BC ;ADD RESIDUE FR CCF RET ; ; ; PUT4HS: LD A,H CALL PUT2HX LD A,L PUT2HS: CALL PUT2HX CALL SPACE RET ; ; PUT2HX: PUSH AF RR 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 CONSOLEOM 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 RRA RRA RRA CALL PUTNIB POP AF PUTNIB: AND 00001111B ADD A,90H DAA ADC A,40H DAA CALL OUTPUT RET GNUM2 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 LD L,A RET ;EXIT WITH Z=1 TO INDICATE MATCH ; ; ; ; PARAMS: LD BC,0 LD A,(IY+0) CP CR ;CHECK IF LINE TERMINATES; ; ; PMSG PRINTS THE STRING OF ASCII CHARACTERS ; POINTED TO BY THE RELATIVE ADDRESS IN DE ; UNTIL AN EOT IS ENCOUNTERED INM3: 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 JR NZ,PARA2 ; IMMEDIATELY WITH A RETURN XOR A RET ;RETURN WITH PARAM COUNT=0 IF SO PARA1: INC C ;ADD 2 TO PARAM BU 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)UMERIC 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 CASFFER 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 ;2 ; PAGE ; ; ; -- UNINITIALIZED SCRATCH MEMORY FOR SYSTEM -- ; ; IRQSAV: DEFS 2 ;STACK POINTER SAVE FOR INTERRUPTS DEFSos. * ;* * ;* Write track entry in jump table * ;* used by format40/80. * ;* * ;* Auto boot option. * r ROM for Bigboard_II single board * ;* computer. * ;* * ;* copyright (C) 1982 by Russell Smith. * ;* all rights ROM-RESIDENT STUFF HERE INCLUDE MINIT.MAC ;COLD START INITIALIZATION INCLUDE CRTOUT.MAC ;MEMORY-MAPPED CRT OUTPUT DRIVER BUFFER LINSIZ EQU $-LINBUF DEFS 32 ;STACK FOR ROM MONITOR STACK EQU $ ; ; FIFO: DEFS 64 ;***TEMP*** ; ;  Corrected interrupt error in RW2:* ;* * ;* Version 2.1 * 24 ;LOCAL STACK FOR INTERRUPTS IRQSTK EQU $ ; ; ; CRTSAV: DEFS 2 ;STACK POINTER SAVE FOR 'CRTOUT' DEFS 24 ;LOCAL STAC;* * ;* double step option * ;* * ;* changed cursor initalization * ;* use 8645 cursor instead of 8002 * reserved by Russell Smith. * ;* * ;* last revision date ... 8-July-1982 * ;* * ;****************************** INCLUDE MONITOR.MAC ;ROM MONITOR ROUTINES ; ; ; ; MONCOPY EQU $ .PHASE MONITR ;PUT RAM-RESIDENT STUFF HERE MONSTRTsB!ek>WU8!'d>WU!yk͓1U8*ok#>WU8!f>WU8*ok >WU8!~g>WU8 ^>*ok"}k!{kF5!hekx͹T4*Ek ;* Last edit date 11/11/83 by:Andy Bakkers * ;* * ;******************************************************** ; K FOR SAME CRTSTK EQU $ ; ; ; ; VARIABLES FOR ROM MONITOR ; PARAM1: DEFS 2 ;HEX NUMERIC PARAMETERS PARSED PARAM2: DEFS  ;* * ;* changed video initialze tables * ;* table one for a 16 Mhz crystal * ;* table two for a 15 Mhz crystal *************************** ; * ;* Edit by L.Koopman * ;* Waarbekenplein 13 * ;* 7553 KK Hengelo (o) * ;* Te EQU $ INCLUDE MENTRYS.MAC ;MONITOR ENTRY POINTS INCLUDE MINTSRV.MAC INCLUDE MDISKIO.MAC MONLEN EQU $-MONSTRT MONEND EQU^#VMX~!fk %*qk"k!k͵%R%D>sE!bsB!ek>WU8!'d>WU!k͓1U8!f>WU8*qk#>WU8*qk >WU ASEG MONITR EQU 0F000H DSKBUF EQU 0F800H RAM EQU 0FF00H ; TRUE EQU 1 FALSE EQU 0 ; AUTOBOOT EQU true ;USED IF WE WANT2 ; FROM COMMAND LINE BY 'PARAMS' PARAM3: DEFS 2 PARAM4: DEFS 2 PARAM5: DEFS 2 BREAK: DEFS 1 ;KEYBOARD BREAK FLAG FOR COMM ;* both tables for a 15.75 Khz * ;* monitor. * ;* * ;* Deleted ZAPCSR: and references * l. 074-913022 * ;* Holland. * ;* * ;* include: default presets for 5 or 8 inch * ;* disc drives. for mixed bi $ .DEPHASE ; ; ; ; RAMCOPY EQU $ .PHASE RAM RAMSTRT EQU $ INCLUDE MEMORY.MAC ;INITIALIZED VARIABLES RAMLEN E title modified rom monitor page 64 .z80 ;******************************************************** ;* * ;* Monito TO BOOT AUTOMATIC DSTEP EQU true ;USED FOR 80 TRACK DRIVES BIGRAM EQU TRUE ;USED FOR 256K RAM MAPPING ; ORG 0000H ;PUT ANDS LAST: DEFS 2 ;LAST ADDRESS USED BY 'DUMP' LENGTH: DEFS 2 ;SECTOR LENGTH FOR DISK COMMAND LINBUF: DEFS 64 ;LINE INPUT ;* Added graphics correction SATTR2 * ;* Keyboard conversion in KEYSRV: * ;* 3 QU $-RAMSTRT .DEPHASE ; ROMLEN EQU $ IF ROMLEN GE 4096+1 .PRINTX /MONITOR TOO BIG FOR A SINGLE 2732 EPROM/ ENDIF  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 CONTROLALL SETCSR ;MARK NEXT CURSOR POSITION RET ; DISP2: LD HL,CRTFLG BIT AUTONL,(HL) RET Z ;EXIT IF AUTO NEWLINE DISABLED V1^#V"El4+*El^#VMX!cx͹T 14+*El^#VMXc>GʹU4*El^#VMX^#V*h"h4+++*El^#VMXQU $-CTLTAB ; ; ; ; ; DISPLAY: LD HL,(CURSOR) LD DE,CHRMEM ADD HL,DE ;GET POINTER TO CHARACTER IN DISPLAY EX DE,H; ; ; .PHASE MONEND INCLUDE SCRATCH.MAC TAIL EQU $ ;END OF RESERVED MEMORY IN MON .DEPHASE ; ; ; ; END 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 XOR A LD (COL),A ;RESET COLUMN NUMBER AND DO LINEFEED CALL DNLINE RET ; ; ; ; ; BELL: LD A,BUZZER+ON OUT (PORT;******************************************************** ;* * ;* CRT DRIVER FOR 6845 CRT CONTROLLER AND SMC * ;* 8002L LD HL,4096 ADD HL,DE ;GET POINTER TO MATCHING ATTRIBUTE EX DE,HL LD A,(ATTRIB) LD (HL),C ;OUTPUT CHARACTER AND ATTbhx͹T9/R-/D>sE! csB!ph>WU8 ^!9lX/!;l͂0*5l#"5l.RT/D>sE ^/^#V"=lR/D!csB!h>WU84.. 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 (HL0),A LD BC,200 BELL2: DJNZ BELL2 ;DELAY ABOUT 1 MILLISECOND DEC C JR NZ,BELL2 ;REPEAT 200 TIMES LD A,BUZZER+OFF OUT  CHARACTER GENERATOR/ATTRIBUTES CHIP * ;* * ;******************************************************** ; ; ; OUTPUT CHRIBUTE LD (DE),A LD A,(COL) INC A ;INCREMENT COLUMN NUMBER CP 80 JR NC,DISP2 ;CHECK FOR AUTO NEWLINE IF AT END LD*=l^#VMX"?l!'d>WU!?l͓1U84*=l^#VMX>WU8!f>WU84*=l^#VMX>WU8 ^<0^#V"Al* ;CTL-L ... CURSOR RIGHT DEFW UPLINE ;CTL-K ... INVERSE LINEFEED/CURSOR UP DEFW DNLINE ;CTL-J ... LINEFEED/CURSOR DOWN D) ; ; 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 (PORT0),A RET ; ; ; ; ; ; ESCAPE: LD HL,ESCSEQ ;PROCESS SECOND CHARACTER OF ESCAPE LD (ESCVEC),HL ; SEQUENCE NEXT TIMATACTER PASSED IN C TO VIDEO DISPLAY ; CRTOUT: LD HL,(ESCVEC) LD A,H OR L ;TEST IF IN AN ESCAPE SEQUENCE JR NZ,CRT2  (COL),A ;ELSE STORE UPDATED COLUMN# LD HL,(CURSOR) INC HL RES 3,H ;BUMP CURSOR POINTER MODULO 2048 LD (CURSOR),HL CAl^#V*hY|/0R$0D>sE ^*Al6#6;0*Al^#V#r+s0^#V"Cl*Cl^#V+|r0*h*Cls#rRo0D>sE ^~0*Cl^#V+r+sEFW HTAB ;CTL-I ... HORIZONTAL TAB DEFW LEFT ;CTL-H ... BACKSPACE/CURSOR LEFT DEFW BELL ;CTL-G ... AUDIBLE BELL CTLSIZ E4 E RET ; ; STUFF: LD HL,DISPLAY LD (ESCVEC),HL ;SET LEAD-IN SEQUENCE STATE RET ; FOR CONTROL CHAR OUTPUT MODE ; ; ; LD BC,0 JR LFEED ; ; DNLINE: LD A,(ROW) CP 23 JR NZ,DOWN ;DO CURSOR-DOWN IF NOT ON BOTTOM ROW LD DE,80 ;ELSE SCR ;TEST IF NEW-CURSOR FLAG HAS BEEN SET RET NZ ;EXIT NOW IF SO LD A,11010111B ;ELSE ENABLE VSYNC INTERRUPT FROM CTC OUT L INC DE LDIR ;FILL CHARACTER LINE WITH SPACES POP BC POP HL ;RESTORE POINTER AND BYTECOUNT LD D,H LD E,L INC DL,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 VSYNC INTERRUPT SERVICED RET ; ; ; ; RETURN: LD HL,(RC) LD H,0 CALL GOTOXY ;RESET COLUMN# TO ZERO RET ; ; ; C 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 OLL SCREEN UP LD BC,23*80 LFEED: LD HL,CRTFLG BIT NOSCRL,(HL) RET NZ ;EXIT IF SCROLL IS DISABLED LD (NEWLIN),BC ;STO(CTCA3),A LD A,1 OUT (CTCA3),A LD (MOVECS),A ;SET FLAG FOR INTERRUPT ROUTINE RET ; ; ; MULT80: ADD HL,HL ADD HL,E LDIR ;FILL ATTRIBUTE LINE WITH ATTRIB BYTE RET ; ; ; CLREOS: LD A,23 LD HL,ROW SUB (HL) ;COMPUTE NUMBER OF ROWS ;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# LRLINE: LD DE,CHRMEM ADD HL,DE EX DE,HL LD HL,4096 ADD HL,DE EX DE,HL LD A,(BLANK) LD (HL),A ;STORE A BLANK AT ;ADVANCE COLUMN# AND CURSOR TO NEXT TAB ; LEFT: LD DE,0FF00H ;DECREMENT COLUMN# JR CSRMOV ; RIGHT: LD DE,0100H ;INCREMENT RE RELATIVE ADDRESS OF NEW LINE LD HL,(START) ADD HL,DE ;ADD +80/-80 TO 6845 START ADDRESS REG LD A,H AND 00000111B ;DOHL ADD HL,HL ADD HL,HL LD D,H LD E,L ;DE=ROW*16 ADD HL,HL ADD HL,HL ;HL=ROW*64 ADD HL,DE ;HL=(ROW*64)+(ROW*16)  TO SCREEN-END LD H,0 LD L,A CALL MULT80 ;MULTIPLY BY 80 GIVING RESULT IN HL EX DE,HL JR CLR2 ; CLREOL: LD DE,0 CLBY 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 ;MASTART OF CHAR LINE LD A,(ATTRIB) LD (DE),A ;STORE ATTRIBUTE AT START OF ATTR LINE DEC BC LD A,B OR C ;DECREMENT BYTECOLUMN# JR CSRMOV ; UP: LD DE,00FFH ;DECREMENT ROW# JR CSRMOV ; DOWN: LD DE,0001H ;INCREMENT ROW# CSRMOV: LD HL,(RC) ; MODULO 2048 ROLL-AROUND LD H,A LD (START),HL ;STORE NEW STARTING ADDRESS LD A,1 LD (SCROLL),A ;SET SCROLL-FLAG FOR INTE RET ; ; ; UPLINE: LD A,(ROW) OR A JR NZ,UP ;DO CURSOR-UP IF NOT ON TOP LINE LD DE,-80 ;ELSE SCROLL SCREEN DOWN R2: LD A,80 LD HL,COL SUB (HL) ;COMPUTE NUMBER OF COLUMNS TO LINE-END LD H,0 LD L,A ADD HL,DE ;SUM IS TOTAL CHARACTESK OFF FOR MODULO 2048 ROLL-AROUND LD H,A LD (CURSOR),HL ;STORE NEW RELATIVE CURSOR POINTER SETCSR: LD A,(MOVECS) OR A COUNT AND TEST IF=0 RET Z ;EXIT IF DONE ALERADY PUSH DE ;ELSE SAVE LINE POINTER AND BYTECOUNT PUSH BC LD D,H LD E,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 RRUPT LD HL,(RC) CALL GOTOXY ;COMPUTE NEW CURSOR AND ARM INTERRUPT LFEED2: LD A,(SCROLL) OR A JR NZ,LFEED2 ;LOOP UNTIL5 RS TO ERASE LD B,H LD C,L LD HL,(CURSOR) CALL CLRLINE ;GO FILL DISPLAY WITH SPACES/ATTRIBUTES CALL SETCSR ;PUT CURSO; ; INSLINE: CALL RETURN ;DO CARRIAGE RETURN LD A,23 LD HL,ROW SUB (HL) ;COMPUTE # OF ROWS TO END OF SCREEN JP Z,CL RETURN ;DO CARRIAGE RETURN LD A,23 LD HL,ROW SUB (HL) ;COMPUTE # OF ROWS TO END OF SCREEN JP Z,CLREOL LD H,0 LHL,(CURSOR) LD BC,1 CALL CLRLINE ;PUT A BLANK AT CURSOR LOCATION CALL SETCSR ;REPLACE CURSOR RET ; ; ; ESCSEQ: LD CONTENTS OF CHARACTER MEMORY POP HL POP DE LD BC,ATTMEM ADD HL,BC EX DE,HL ADD HL,BC EX DE,HL POP BC LDIR ;C LD E,L INC HL ;HL POINTS ONE BYTE AHEAD OF THAT CALL COMPRESS POP BC LD HL,(CURSOR) ADD HL,BC LD BC,1 CALL CLRR BACK IN ORIGINAL SPOT RET ; ; ; CLRALL: LD HL,CHRMEM LD DE,CHRMEM+1 LD BC,2047 LD A,(BLANK) LD (HL),A LDIR ;LREOL LD H,0 LD L,A CALL MULT80 ;MULTIPLY BY 80 LD B,H LD C,L ;RESULT IS BYTECOUNT FOR BLOCK MOVE LD HL,(CURSOR)D L,A CALL MULT80 ;MULTIPLY BY 80 LD B,H LD C,L ;RESULT IS BYTECOUNT FOR BLOCK MOVE LD DE,(CURSOR) LD HL,80 ADD HLA,C ;PUT LEAD-IN CHARACTER IN ACC LD HL,ESCTAB LD BC,ESCSIZ/3 CALL SEARCH ;SEARCH FOR SECOND CHAR OF ESCAPE SEQ RET NZOMPRESS CONTENTS OF ATTRIBUTE MEMORY RET ; ; ; ; EXPAND: PUSH BC PUSH DE PUSH HL PUSH BC LD BC,CHRMEM ADD HL,LINE ;PUT BLANK AT END OF LINE CALL SETCSR ;REPLACE DESTROYED CURSOR RET ; ; ; ; INSCHAR: LD HL,COL LD A,79 SUBFILL CHARACTER MEMORY WITH SPACES LD HL,ATTMEM LD DE,ATTMEM+1 LD BC,2047 LD A,(ATTRIB) LD (HL),A LDIR ;FILL ATTRIB ADD HL,BC DEC HL EX DE,HL LD HL,80 ADD HL,DE EX DE,HL CALL EXPAND ;EXPAND SCREEN TO MAKE NEW LINE CALL CLREOL ,DE CALL COMPRESS ;COMPRESS SCREEN TO DELETE LINE LD HL,(START) LD DE,23*80 ADD HL,DE ;GET RELATIVE START OF LAST LINE  ; IN TABLE AND EXIT IF NO MATCH JP (HL) ;GO TO LEAD-IN ROUTINE ; ; ESCTAB: DEFB '=' ;CURSOR ADDRESSING DEFB 'Q' ;IBC EX DE,HL ADD HL,BC EX DE,HL POP BC LDDR ;EXPAND CONTENTS OF CHARACTER MEMORY POP HL POP DE LD BC,ATTMEM A (HL) ;COMPUTE NUMBER OF COLUMNS LEFT IN LINE JP Z,CLREOL LD B,0 LD C,A ;USE RESULT FOR LDDR BYTECOUNT LD HL,(CURSORUTE MEMORY WITH NULL BYTES HOMEUP: LD HL,0 CALL GOTOXY ;RESET ROW/COLUMN NUMBERS TO ZERO RET ; ; ; ; ; COMPRESS:  ;CLEAR NEW LINE RET ; ; ; DELCHAR: LD HL,COL LD A,79 SUB (HL) ;COMPUTE NUMBER OF COLUMNS LEFT IN LINE JP Z,CLREO LD A,H AND 00000111B LD H,A LD BC,80 CALL CLRLINE ;CLEAR BOTTOM LINE CALL SETCSR ;RE-DISPLAY THE CURSOR RET ; NSERT CHARACTER DEFB 'W' ;DELETE CHARACTER DEFB 'E' ;INSERT LINE DEFB 'R' ;DELETE LINE DEFB '*' ;CLEAR SCREEN DEFBDD HL,BC EX DE,HL ADD HL,BC EX DE,HL POP BC LDDR ;EXPAND CONTENTS OF ATTRIBUTE MEMORY RET ; ; ; DELLINE: CAL) ADD HL,BC LD D,H ;DE POINTS TO CHAR AT END OF LINE LD E,L DEC HL ;HL POINTS ONE BYTE BEFORE THAT CALL EXPAND LD  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 LDIR ;COMPRESS L LD B,0 LD C,A ;USE RESULT FOR LDIR BYTECOUNT PUSH BC LD HL,(CURSOR) LD D,H ;DE POINTS TO CHAR AT CURSOR LOCATION6  ':' ;CLEAR SCREEN DEFB 'T' ;CLEAR TO END OF LINE DEFB 't' ;CLEAR TO END OF LINE DEFB 'Y' ;CLEAR TO END OF SCREEN DE (ESCVEC),DE ;directly to display SATTR3: LD HL,BITTAB RES 3,C ADD HL,BC ;INDEX INTO BIT TABLE FOR ATTRIBUTES OR (HL SETATTR: LD HL,SATTR2 LD (ESCVEC),HL RET ; ; ; SATTR2: LD A,C CALL ASCHEX ;CONVERT THIRD CHAR IN SEQUENCE TO HEX&``8`  Insufficient Memory$ Invalid I/O List End of Execution$M` 8 8 8 SETR2: SUB 24 JR NC,SETR2 ;MAKE SURE ROW# IS BETWEEN 0 AND 23 ADD A,24 LD (ROWTMP),A ;SAVE TEMPORARY ROW# LD HL,SETCOLLL ASCHEX RET C LD C,A AND 00000111B INC A ;TRANSFORM CODE TO NUMBER IN RANGE 1..8 LD B,A XOR A SCF SPARM3: RLFB 'y' ;CLEAR TO END OF SCREEN DEFB 'G' ;SET ATTRIBUTE DEFB 'M' ;SET GRAPHICS MODE DEFB '.' ;SET PARAMETER BYTE DE) ;MERGE MODE AND ATTRIBUTE BITS LD (ATTRIB),A ;STORE NEW ATTRIBUTE BYTE RET ; ; ; BITTAB: DEFB 0 DEFB UNDLINE DEFB RET C ;EXIT IF OUT OF RANGE LD B,0 LD C,A LD HL,BLANK LD (HL),' ' ;USE ASCII SPACE FOR BLANKS LD A,00000011B ;USSYSIN LD (ESCVEC),HL ;GO TO 'SETCOL' ON NEXT CHARACTER RET ; ; ; SETCOL: LD A,C ;ARRIVE HERE ON FOURTH CHARACTER SUB ' ' A DJNZ SPARM3 ;DERRIVE BIT POSITION FROM CODE BYTE LD HL,CRTFLG BIT 3,C ;TEST IF PARAM BIT IS TO BE SET/RESET JR Z,SPAFW SETPARM DEFW SETMODE DEFW SETATTR DEFW CLREOS DEFW CLREOS DEFW CLREOL DEFW CLREOL DEFW CLRALL DEFW CLRALL D BLINK DEFB BLINK+UNDLINE DEFB REVERSE DEFB REVERSE+UNDLINE DEFB REVERSE+BLINK DEFB REVERSE+BLINK+UNDLINE ; ; ; ; E ALPHANUMERIC ATTRIBUTE MODE BIT 3,C ;TEST IF ALPHA OR GRAPHICS MODE JR Z,SATTR3 LD (HL),0 ;SWITCH TO ZEROS FOR BLANKS ;******************************************************** ;* * ;* COLD START INITIALIZATION ROUTINE FOR * ;* CONFIGURI; OF ESC,'=',ROW,COL SEQUENCE RET C SETC2: SUB 80 JR NC,SETC2 ;MAKE SURE COL# IS BETWEEN 0 AND 79 ADD A,80 LD H,A ;PUTRM4 OR (HL) ;SET PARAMETER BIT @HL LD (HL),A RET ; SPARM4: CPL AND (HL) ;RESET PARAMETER BIT @HL LD (HL),A RETEFW DELLINE DEFW INSLINE DEFW DELCHAR DEFW INSCHAR DEFW SETRC ESCSIZ EQU $-ESCTAB ; ; ; ; SETRC: LD HL,SETROW LD SETMODE: LD HL,SMODE2 LD (ESCVEC),HL RET ; ; ; SMODE2: LD A,C AND 00000011B LD (GRMODE),A ;STORE BITS FOR GRAPHAND LOAD LD A,(GRMODE) ; A WITH SELECTED GRAPHICS MODE BITS LD DE,DISPLAY ;in graphic mode LD NG THE SYSTEM AFTER A POWER-ON * ;* OR PUSHBUTTON RESET. * ;* * ;************************************************** COLUMN# INTO H LD A,(ROWTMP) LD L,A ;PUT ROW# INTO L CALL GOTOXY ;GO COMPUTE RELATIVE CURSOR POINTER RET ; ; ; ;  ; ; ;  (ESCVEC),HL RET ; ; ; SETROW: LD A,C ;ARRIVE HERE ON THIRD CHARACTER SUB ' ' ; OF CURSOR POSITIONING SEQUENCE RET CICS MODE FIELD RET ; OF ATTRIBUTE BYTE ; ; ; SETPARM: LD HL,SPARM2 LD (ESCVEC),HL RET ; ; SPARM2: LD A,C CA7 ****** ; ; ; INIT: DI ; ; PERFORM READ/WRITE TEST OF MONITOR AND GLOBAL VARIABLES RAM ; RAMTST: LD HL,MONITR LD DE,RAMR TABLE END MARKER JR Z,INIT3 ;LOOP AGAIN IF NOT AT END ; ; ; FIRE-UP CRT DISPLAY ; LD HL,M1TAB IN A,(SENSE) ;TEST SE ; ,, ,, 2 = ,, ,, 2 * ; ,, ,, 3 = ,, ,, F * ;--------------------------------------------- JR NZ,PARALL ;JUMP IF INPUT IF FROM KEYBOARD ; ; AUTOMATIC BAUD RATE SETTING ROUTINE FOR SIO ; BAUD: AND 00000011B LD C,A,RTST1 ;DO 8 PASSES OVER MEMORY BLOCKS ; ; LD SP,STACK ;LOAD STACK POINTER NOW THAT IT IS SAFE ; ; ; MOVE COPY OF RAM-RES 1/4 INCH OUT (0D9H),A SKIP2: CALL FLIPDENS ;SET SMC DATA SEPRARATOR INITAL VALUE ; ; INITIALIZE THE Z-80 FOR INTERRUPT MOD LD 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 NSE SWITCHES FOR 5*7 OR 7*9 BIT 4,A ; FONT AND PROGRAM 6845 ACCORDINGLY JR Z,SKIP1 LD HL,M2TAB SKIP1: CALL INITCRT ;PRO--- LD HL,0FFFFH ;MAP ADDRESS XOR A LD (HL),A LD A,11H LD (HL),A LD A,22H LD (HL),A LD A,3FH LD (HL),A E ;GET MASK BIT FOR SIO CHANNEL A/B LD B,0 BAUD1: IN A,(SENSE) ;READ SENSE INPUT PORT AND C ;TEST SIO RECEIVE INPUT BIT IDENT ROUTINES TO HIGH MEMORY ; LD HL,MONCOPY LD DE,MONITR LD BC,MONLEN LDIR ; ; MOVE COPY OF INITIALIZED GLOBAL VARIE #2 LD HL,RAM LD A,H LD I,A ;LOAD I REG WITH MSB OF VECTOR TABLE IM 2 ; AND SELECT INTERRUPT MODE 2 ; ; CALL BE INC 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 RTSTGRAM 6845 CONFIGURATION REGISTERS CALL CLRALL ;CLEAR VIDEO DISPLAY MEMORY ; ; SET DISK PARAMETERS FOR 5 OR 8 INCH DRIVES ;NDIF ; ; INITIALIZE Z80 FAMILY PROGRAMMABLE I/O DEVICES ; LD HL,IOTAB ;POINT TO I/O INIT TABLE INIT3: LD B,(HL) ;B=INIT LJR Z,BAUD1 ;LOOP UNTIL IT CHANGES STATE BAUD2: EX (SP),HL ;DELAY A BIT EX (SP),HL INC B IN A,(SENSE) ;LOOP TO MEASURE TABLES TO HIGH MEMORY ; LD HL,RAMCOPY LD DE,RAM LD BC,RAMLEN LDIR ; IF BIGRAM ;-----------------------------------LL ;BEEP THE BUZZER TO SAY WE ARE ALIVE IN A,(SENSE) AND 00001011B LD C,A ;SAVE STATE OF SENSE INPUT PORT DECIDE: IN A,3: DEC HL DEC E RRCA CP (HL) ;VERIFY THAT TEST PATTERN IS WRITTEN JR NZ,$ ;STICK FOREVER IF MONITOR RAM FAILURE EX D IN A,(SENSE) BIT 5,A ;TEST DISK-TYPE SENSE SWITCH INPUT JR Z,SKIP2 ; AND JUMP IF 8 INCH DRIVES INDICATED LD A,0000001OOP BYTECOUNT INC HL LD C,(HL) ;C=DEVICE CONTROL PORT# INC HL OTIR ;SEND DATA @ HL TO PORT @ C BIT 7,(HL) ;TEST FOHE START BIT TIME AND C JR NZ,BAUD2 LD DE,RATES-1 BAUD3: INC DE ;INDEX INTO BAUD RATE TABLE RL B ; USING COUNT DERRIV------------- ; INITIALIZE 256K RAM BOARD TO * ; LOGICAL BLOCK 0 = PHYSICAL BLOCK 0 * ; ,, ,, 1 = ,, ,, 1 *(SENSE) AND 00001011B ;TEST FOR ARRIVAL OF A START BIT OR XOR C ; A CHANGE IN THE KEYBOARD STROBE JR Z,DECIDE BIT 3,A E,HL CP (HL) EX DE,HL JR NZ,$ ;STICK FOREVER IF GLOBAL RAM FAILURE DJNZ RTST3 DEC C JR NZ,RTST3 ADD A,A JR NZ1B LD (DSKTYP),A ;SET DISK TYPE FOR MINI-FLOPPIES XOR A LD (TYPEFLAG),A ;INCH TYPE, FOR MIXED BIOS LD A,8 ;SET MUX TO 58 ED IN B JR NC,BAUD3 LD HL,SIOATAB ;POINT TO SIO CHANNEL A INIT STUFF BIT 0,C ;TEST IF USING SIO CHANNEL A OR B JR NZ, JR NZ,PARALL ;WAIT UNTIL STROBE GOES AWAY PARL3: LD A,11000111B ;PROGRAM CTCA0 FOR KBD INTERRUPT BIT 3,C JR NZ,PARL4 ;DE ; 1200 BAUD DEFB 16 ; 2400 BAUD DEFB 8 ; 4800 BAUD DEFB 4 ; 9600 BAUD DEFB 2 ; 19200 BAUD DEFB 2 ; 19200 BAUMISC CONTROL BITS 74LS259 SELMUX EQU 0CCH ;DRIVE SELECT/DMA MUX 74LS273 KBD EQU 0D0H ;KEYBOARD INPUTS 74LS373 WD179X EQU 0DBLED FIRST CHARACTER JR Z,BAUD5 LD C,D IN A,(C) ;THEN READ AND DISCARD THE CHARACTER LD C,E LD A,1 OUT (C),A ;RE-P: LD A,C OUT (CRTADD),A ;OUTPUT REGISTER NUMBER TO CRTC LD A,(HL) INC HL OUT (CRTDAT),A ;OUTPUT DATA TO SELECTED REGISTEBAUD4 ;JUMP IF USING CHANNEL A LD HL,SIOBTAB ;ELSE POINT TO OTHER INIT DATA TABLE BAUD4: LD C,(HL) ;GET BAUDRATE CTC PORT# FTERMINE SENSE OF KBD STROBE SET 4,A PARL4: OUT (CTCA0),A LD A,1 OUT (CTCA0),A ;COUNT STROBES MODULO 1 SIGNON: EI IFE AD ; ; SIOATAB: DEFB CTCB1 ;SIO CHANNEL A BAUDRATE CTC DEFB SIOCPA ; CONTROL PORT DEFB SIODPA ; DATA PORT DEFB 1 ;4H ;WESTERN DIGITAL DISK CONTROLLER GENPIO EQU 0D8H ;GENERAL PURPOSE PARALLEL PORTS PORT1 EQU 0D9H ;CONTROLS 5"/8" MUX CRTROGRAM SIO CHANNEL TO GENERATE LD A,00011100B ; INTERRUPTS ON RECIEVED DATA, OUT (C),A ; PARITY DOES NOT AFFECT VECTOR LDR INC C DJNZ INCRT1 RET ; ; ; ; PAGE ; ; ; ... INPUT/OUTPUT PORT EQUATES AND INITIALIZATION TABLES ... ; ; SIOROM TABLE INC HL LD A,01000111B OUT (C),A ;PUT BAUDRATE CTC IN COUNTER MODE LD A,(DE) OUT (C),A ;SET DIVIDE RATIO FOUTOBOOT CALL PNEXT DEFB CR,LF,LF DEFB '..Bigboard ][ Monitor 11-11-1983..' DEFB CR,LF,LF DEFB EOT ENDIF IF AUTOBO CONSOLE# ; SIOBTAB: DEFB CTCB0 ;SIO CHANNEL B BAUDRATE CTC DEFB SIOCPB ; CONTROL PORT DEFB SIODPB ; DATA PORT DEFBC EQU 0DCH ;6845 CRT CONTROLLER ; ; SIODPA EQU SIO+0 ;SIO DATA PORT A SIOCPA EQU SIO+1 ;SIO CONTROL/STATUS PORT A SIODPB A,(HL) LD (CONNUM),A ;STORE NUMBER OF CONSOLE DEVICE LD HL,SIOOUT LD (CONOUT+1),HL ;RE-DIRECT CONSOLE OUTPUT TO SIO JR  EQU 80H ;DUAL SERIAL I/O CTCA EQU 84H ;CTC FOR KEYBOARD/FDC/SIO INTERRUPTS CTCB EQU 88H ;CTC FOR BAUDRATES AND TIMERS DMAR SELECTED RATE LD E,(HL) ;LOAD E WITH SIO A/B CONTROL PORT# INC HL LD D,(HL) ;LOAD D WITH SIO A/B DATA PORT# INC HL OT CALL PNEXT DEFB 'Booting..' DEFB CR,LF DEFB EOT LD HL,PROMPT ;IN CASE OF ERROR PUSH HL ;RETURN TO PROMT ENTRY  2 ; CONSOLE# ; ; ; ; DETERMINE KEYBOARD STROBE POLARITY AND PROGRAM INTERRUPTS ; PARALL: IN A,(SENSE) XOR C BIT 3,A  EQU SIO+2 ;SIO DATA PORT B SIOCPB EQU SIO+3 ;SIO CONTROL/STATUS PORT B ; ; CTCA0 EQU CTCA ;CTC A CHANNEL 0 (KEYBOARD STRSIGNON ; ; DIVIDE RATIO TABLE FOR CTC-DERRIVED BAUD RATES ; RATES: DEFB 128 ; 300 BAUD DEFB 64 ; 600 BAUD DEFB 32  EQU 8CH ;Z80 DMA CONTROLLER PORT3 EQU 0C0H ;MEMORY CONTROL 74LS259 SENSE EQU 0C4H ;SENSE INPUTS 74LS244 PORT0 EQU 0C8H ; LD (SIOADR),DE ;SAVE SIO CONTROL/DATA PORT NUMBERS LD C,E BAUD5: IN A,(C) ;LOOP UNTIL SIO CHANNEL RECEIVES BIT 0,A ; GARJP BOOT ELSE JP PROMPT ;GO ENTER MONITOR ENDIF ; ; INITCRT: LD B,16 ;WRITE TO 16 REGISTERS IN 6845 LD C,0 INCRT19 OBE) CTCA1 EQU CTCA+1 ;CTC A CHANNEL 1 (INDEX PULSE COUNT) CTCA2 EQU CTCA+2 ;CTC A CHANNEL 2 (SIO A SYNC INTERRUPT) CTCA3 ETCBV ;BASE INTERRUPT VECTOR FOR CTC B DEFB 2,CTCB0 DEFB 01000111B ;PUT CTC0 IN COUNTER MODE DEFB 32 ;DIVIDE BY 32 GIVE DEFB 1,SELMUX DEFB 00001010B ;ALL DRIVES OFF, /TEST=1, DRQ->RDY ; ; ; DO SOFTWARE RESET OF DMA AS RECOMENDED BY ZILOG ; TER DEFB 5 ;SELECT REGISTER #5 DEFB 10101010B ;7 BITS/TX CHARACTER ; ; DEFB -1 ;END-OF-TABLE ; ; ; PAGE ; ; ; QU 7 ;ATTRIBUTE ENABLE PIN FDCRST EQU 6 ;DISK CONTROLLER RESET STDBB EQU 5 ;STD/BETTERBOARD BANK SELECT VPP EQU 4 ;PROM V CLOCK, 1 STOP BIT DEFB 1 ;SELECT REGISTER #1 DEFB 00000100B ;STATUS AFFECTS VECTOR DEFB 3 ;SELECT REGISTER #3 DEFB 01QU CTCA+3 ;CTC A CHANNEL 3 (VSYNC INTERRUPT) ; ; CTCB0 EQU CTCB ;CTC B CHANNEL 0 (SIO A BAUDRATE) CTCB1 EQU CTCB+1 ;CTC BS 1200 BAUD FOR SIO B DEFB 2,CTCB1 DEFB 01000111B ;PUT CTC1 IN COUNTER MODE DEFB 32 ;DIVIDE BY 32 GIVES 1200 BAUD FOR S DEFB 6,DMA DEFB 11000011B DEFB 11000011B DEFB 11000011B DEFB 11000011B DEFB 11000011B DEFB 11000011B ; ; ; PROGR... EQUATES AND INITIALIZATION TABLES FOR 6845 CRTC ... ; ; CHRMEM EQU 6000H ;2K BYTE CHARACTER MEMORY ATTMEM EQU 7000H ;2PP ENABLE PGM EQU 3 ;PROM PGM ENABLE OEVPP EQU 2 ;PROM OE/VPP SWITCH DECODE EQU 1 ;BYTEWIDE MEMORY DECODE CONTROL OUTEN E000001B ;7 BITS/RX CHARACTER DEFB 5 ;SELECT REGISTER #5 DEFB 10101010B ;7 BITS/TX CHARACTER DEFB 2 ;SELECT REGISTER #2  CHANNEL 1 (SIO B BAUDRATE) CTCB2 EQU CTCB+2 ;CTC B CHANNEL 2 (1 MILLISECOND TIMER) CTCB3 EQU CTCB+3 ;CTC B CHANNEL 3 (CLOCKIO A DEFB 2,CTCB2 DEFB 00000111B ;PUT CTC2 IN TIMER MODE DEFB 250 ;PULSE EVERY 250*4 MICROSECONDS DEFB 2,CTCB3 DEAM CTC A AND B FOR VARIOUS INTERRUPT ; AND TIMING FUNCTIONS ; DEFB 1,CTCA0 DEFB CTCAV ;BASE INTERRUPT VECTOR FOR CTC A K BYTE ATTRIBUTE MEMORY ; CRTADD EQU CRTC ;6845 ADDRESS REGISTER CRTDAT EQU CRTC+1 ;6845 DATA REGISTER BLINK EQU 0100000QU 0 ;BYTEWIDE MEMORY /OE CONTROL ; SEL5 EQU 0 ;5 INCH SELECT BIT ; ; ; IOTAB EQU $ ;I/O INITIALIZATION TABLE ; ; INI DEFB SIOVEC ;BASE SIO INTERRUPT VECTOR DEFB 8,SIOCPA DEFB 4 ;SELECT REGISTER #4 DEFB 01000101B ;16X CLOCK, 1 STOP BIT INTERRUPT) ; ; ; ON EQU 00001000B OFF EQU 00000000B ; ; BIT ASSIGNMENTS FOR LATCH 'U14' ; BUZZER EQU 7 MOTOR EQU 6 HFB 11000111B ;PUT CTC3 IN COUNTER MODE DEFB 250 ;INTERRUPT EVERY 250 MILLISECONDS ; ; ; INITIALIZE SIO CHANNEL A AND B FOR DEFB 2,CTCA1 DEFB 01000111B ;PUT CTC1 IN COUNTER MODE DEFB 0 ;COUNT INDEX PULSES MODULO-256 ; ; DEFB 1,CTCB0 DEFB C0B ;BLINK ATTRIBUTE BIT REVERSE EQU 00010000B ;REVERSE VIDEO UNDLINE EQU 00001000B ;UNDERLINE STRIKE EQU 00000100B ;STRIKETHRTIALIZATION FOR TTL BIT LATCHES ; DEFB 2,PORT3 DEFB ATTEN+ON ;ATTRIBUTE ENABLE ON DEFB FDCRST+ON ;179X RESET PIN HIGH  DEFB 1 ;SELECT REGISTER #1 DEFB 00000000B ;INTERRUPTS OFF DEFB 3 ;SELECT REGISTER #3 DEFB 01000001B ;7 BITS/RX CHARACLDTIM EQU 5 DDEN EQU 4 SMC2 EQU 3 SMC1 EQU 2 SIDSEL EQU 1 DYSTAT EQU 0 ; ; ; BIT ASSIGNMENTS FOR LATCH 'U41' ; ATTEN E ASYNCHRONOUS SERIAL ; INTERFACE TO PRINTER OR TERMINAL ; DEFB 10,SIOCPB DEFB 4 ;SELECT REGISTER #4 DEFB 01000101B ;16X: U ; ; INITIALIZATION FOR 80*24 DISPLAY USING 16 MHZ CLOCK ; AND 9 DOT BY 12 RASTER CHARACTER CELL SIZE ; AND A HORIZONTAL SCADDR) ENDIF LD C,2 LD E,A CALL 5 ENDM ; ; . . . . . ; ; CHARSTAT MACRO, CHECK CONSOLE STATUS. ; ; RETURN TRUE (F ;CURSOR END RASTER DEFB 0 ;START ADDRESS MSB DEFB 0 ;START ADDRESS LSB DEFB 0 ;CURSOR ADDRESS MSB DEFB 0 ;CURSOR AD %/i9 %h =crystal frequency=  = MHz  =actual h freq.= ' = KHz  =actual vLSB ; ; ; INITIALIZATION FOR 80*24 DISPLAY USING 15 Mhz CLOCK ; AND 9 DOT BY 12 RASTER CHARACTER CELL SIZE ; AND A HORIZONTtor scan frequency in KHz  ii =0what is your local power line frequency, in Hz?  i?i 7   AN RATE OF 15.75 KHZ ; M1TAB: DEFB 112 ;HORIZ TOTAL-1 DEFB 80 ;HORIZ DISPLAYED DEFB 91 ;HORIZ SYNC POSITION-1 DEFB 5AF) IF CHAR READY ; FALSE (0) IF NOT. ; CHARSTAT MACRO LOCAL EXIT LD C,11 CALL 5 OR A JR Z,EXIT LD A,0FFH EXIT: DRESS LSB ; ; ; ;  freq.= / = Hz  =number of characters=  7j =vertical total=  =j =vertical correction=  ;AL SCAN RATE OF 15.75 KHZ ; M2TAB: DEFB 105 ;HORIZ TOTAL-1 DEFB 80 ;HORIZ DISPLAYED DEFB 87 ;HORIZ SYNC POSITION-1 DE7dR7dh =6Warning! Cannot achieve desired horizontal scan rate. i =1Proceeding on 100 character basis. (80 dH ;VERT/HORIZ SYNC WIDTH DEFB 25 ;VERT TOTAL-1 DEFB 8 ;VERT TOTAL ADJUST DEFB 24 ;VERT DISPLAYED DEFB 25 ;VERT SYNC ENDM ; ; . . . . . ; ; INPUT MACRO ; INPUT CHAR STRING FROM CONSOLE. ; ; INPUT ADDR,BUFLEN ; ; ADDR START OF TEXT BUF[ADDR] ; CHARIN MACRO ADDR LD C,1 ;CONSOLE INPUT CALL 5 IFNB LD (ADDR),A ENDIF ENDM ; ; . . . . . ; ; Cj h =R0= 7ij=  _7ijXw =H =! ; number of characters/line-1 i =R1= 80 iFB 28H ;VERT/HORIZ SYNC WIDTH DEFB 25 ;VERT TOTAL-1 DEFB 02 ;VERT TOTAL ADJUST DEFB 24 ;VERT DISPLAYED DEFB 24 ;VERisplayed) i $; %7 %9i? ;9 =9 =Rth =4Warning! Cannot achie POSITION-1 DEFB 00000000B ;INTERLACE AND SKEW DEFB 11 ;MAX RASTER ADDRESS DEFB 11 ;CURSOR START RASTER DEFB 11 ;CURSMCALCBYTE0200HAROUT MACRO CONSOLE OUTPUT ; FROM A OR (ADDR) IF SPECIFIED. ; ; CHAROUT [ADDR] ; CHAROUT MACRO ADDR IFNB LD A,(= 50H i=# ; number of displayed char/line i =R2=  P7Pjj=  _P7PjjXw =H T SYNC POSITION-1 DEFB 00000000B ;INTERLACE AND SKEW DEFB 11 ;MAX RASTER ADDRESS DEFB 11 ;CURSOR START RASTER DEFB 11 ve desired vertical scan rate. i =1Proceeding on 25 line total basis. (24 displayed) i =9 ;h'iOR END RASTER DEFB 0 ;START ADDRESS MSB DEFB 0 ;START ADDRESS LSB DEFB 0 ;CURSOR ADDRESS MSB DEFB 0 ;CURSOR ADDRESS P-P_ ju= uiix}jjx}YP7_=$enter your crystal frequency in MHz  ii =)enter your moni; =4 ; horizontal sync position (varies with monitor) i =R3= 28H 28H i=( ; V sync length (2)/H sync width (8OPEN FAILED++ !" !" * | ʹ) \!~2 #" Ý: ) > T : ) @ ++FILE READ E › **}|!"*{z*~]*"Ü  DISK FULL: CRCFILE$!"*~asis. (80 displayed)') end; character_time:=9.0e-06/xtal_frequency; line_time:=number_of_characters*character_t ; no cursor i =R11 thru R15 =0 i Y_AhX7h ='Do you want to try other values? (y/n)  ii i h 0=nency in MHz '); readln (xtal_frequency); write ('enter your monitor scan frequency in KHz '); readln (monitor_frequency) i =R4=  =ij=  _=ijXw =H = ; character lines total-1 i =R5=  ;j= program calcbytes; var answer : char; xtal_frequency, monitor_frequency, character_time, line_time, actual_h_freq,*#"ɯ2i2}! "!"]]2 s : ~# ++FILE NOT FOUND++$:ime; number_of_lines:= round((1/power_line_frequency)/line_time); vertical_correction:= number_of_lines mod 12; verticaR0Y5 u23); write ('what is your local power line frequency, in Hz? '); readln (power_line_frequency); number_of_characters:=rou  _;jXw =H =* ; added scan lines to trim V frequency i =R6= 24 18H i=) ; number of chara actual_v_freq : real; number_of_characters, number_of_lines, vertical_correction, vertical_total, power_line_frequency  F*}’">͇†]<  CANNOT CLOSE CRCFILE$CRCKLISTCRCSK FULL: CRCFILE$  wl_total:= number_of_lines div 12; if vertical_total < 25 then begin writeln; writeln ('Warning!›͸›* =: =͔="  ʳ ª~#.  ¿~  #~  .+~#0nd(1000*xtal_frequency/(9*monitor_frequency)); if number_of_characters < 100 then begin number_of_characters:=1cter lines displayed i =R7= 24 18H i=2 ; vertical sync position (varies with monitor) i = R8= 0 0 i=: integer; function hexint (x:integer) : string [2]; var a: string[4]; begin a:=hex$(x); hexint:=' # !]͐ DONE$!e S!]Q !eZ @ --> FILE: XXXXXXXX.XXX CRC = oS) \<‘@ ++ Cannot achieve desired vertical scan rate.'); writeln ('Proceeding on 25 line total basis. (24 displayed)'); v:0~#!A.O.Gy~#0M0 K MMɷ:m2 FSÄCRCKLIST$$$››tK›,00; writeln; writeln ('Warning! Cannot achieve desired horizontal scan rate.'); writeln ('Proceeding on 100 character b ; no interlace and no skew i =R9= 11 0BH i=$ ; number of raster lines/char -1 i =R10= 20H 20H i= '; hexint[1]:=a[1]; hexint[2]:=a[2] end; procedure do_the_work; begin write ('enter your crystal frequ< ertical_total:=25; number_of_lines:=12*25; vertical_correction:=0 end; actual_h_freq:= 1/(1000*lin/char -1'); write ('R10= 20H 20H'); writeln (' ; no cursor'); writeln ('R11 thru R15 =0') end; begin {the repe ; character lines total-1'); write ('R5= ',vertical_correction:3); write (' ',hexint(vertical_correction),'H'); wTSREG EQU WD179X+0 ;STATUS REGISTER CMDREG EQU WD179X+0 ;COMMAND REGISTER TRKREG EQU WD179X+1 ;TRACK REGISTER SECREG EQU WD17n (' ; number of characters/line-1'); write ('R1= 80'); write (' 50H'); writeln (' ; number of displayed char6#6*#n 6*#n^#V}ͳQ}2'n*#n^#V}=H!'n44*#n^#V}SH>2'n*#n^#V}~H*%n~#~H*%n6#6*#e_time); actual_v_freq:= 1/(number_of_lines*line_time); writeln; writeln ('crystal frequency=',xtal_frequency,' MHz'); tetive part} repeat do_the_work; writeln; write ('Do you want to try other values? (y/n) '); readln (anriteln (' ; added scan lines to trim V frequency'); write ('R6= 24 18H'); writeln (' ; number of character lines9X+2 ;SECTOR REGISTER DATREG EQU WD179X+3 ;DATA REGISTER ; ; RDCMD EQU 10001000B ;READ COMMAND RIDCMD EQU 11000000B ;READ I/line'); write ('R2= ',80+((number_of_characters-80)div 2)); write (' ',hexint(80+((number_of_characters-80)div 2)),'H'n"@n*%n"n!6nL*#n^#V|»H*#n"Jn!"Ln!BnͿZ^#V^#Vt^:`H!HͿZ2`O!`H6H +~#w!` s#r!`4,^I writeln('actual h freq.=',actual_h_freq,' KHz'); writeln('actual v freq.=',actual_v_freq,' Hz'); writeln('number of chaswer); writeln; until answer='n' end.  displayed'); write ('R7= 24 18H'); writeln (' ; vertical sync position (varies with monitor)'); write ('R8= 0D COMMAND WRTCMD EQU 10101000B ;WRITE COMMAND SKCMD EQU 00011100B ;SEEK COMMAND RSTCMD EQU 00001000B ;RESTORE COMMAND FINCMD); writeln (' ; horizontal sync position (varies with monitor)'); write ('R3= 28H 28H'); writeln (' ; V sync l;******************************************************** ;* * ;* DISK I/O DRIVER FOR BETTERBOARD 24-JUNE-82 * ;* racters= ',number_of_characters); writeln('vertical total= ',vertical_total); writeln('vertical correction= ',vertical_cor"n!nG! 9^#n~# G*#n^#V|1G*#n*%n qT*%n nbfG*%n !(n>ͰUÀG!n>WU*#nU!(njU 0'); writeln (' ; no interlace and no skew'); write ('R9= 11 0BH'); writeln (' ; number of raster lines EQU 11010000B ;FORCE INTERRUPT COMMAND STEPOUT EQU 01100000B ;STEP OUT COMMAND STEPIN EQU 01000000B ;STEP IN COMMAND WTRCMD ength (2)/H sync width (8)'); write ('R4= ',vertical_total-1); write (' ',hexint(vertical_total-1),'H'); writeln ('  * ;******************************************************** ; ; ; EQUATES FOR DISK CONTROLLER PORTS AND COMMAND CODES ; Srection); writeln; write ('R0=',number_of_characters-1:4); write (' ',hexint(number_of_characters-1),'H'); writel*#n~#¬G*#n^#V)))|G*#n6P#6*#n~#G*#n^#V))|G*#n6#6G*#n6<#6*#n6#6*#n6#6*#n= EQU 11110000B ;WRITE TRACK COMMAND ; ; ; ; SELECT: LD A,C ;GET UNIT# PASSED IN C AND CP 4 ; CHECK FOR MAXIMUM VALID# X TO 8 OR 5 INCH LD A,SIDSEL+OFF ;MAKE SURE SIDE 0 OUT (PORT0),A ;IS SELECTED FIRST LD A,B LD (DSKTYP),A CALL SETDENS DRIVE TURN-OFF TIMER RET ; ; ; ; DSEL: LD HL,SELTAB ;POINT TO DRIVE SELECT BITS TABLE AND 00000011B LD D,0 LD E,ARN-OFF TIMER RET ;RETURN WITH COMPLETION STATUS IN ACC ; ; ; ; FINDTRK: LD A,7 LD (FNDTRY),A ;SET RETRY COUNT FOR HB LD (HL),A ;REMEMBER CURRENT DENSITY CONTROL BIT LD HL,TRKTAB LD E,C ;INDEX INTO TABLE TO GET LAST KNOWN ADD HL,DE P 255 ;TEST IF HEAD POSITION IS JR NZ,SEEK2 ; KNOWN GOOD AND JUMP IF SO LD A,RSTCMD+3 CALL DISKOP ;EXECUTE RESTORE AT  RET NC ;ERROR IF UNIT# > 3 CALL DSEL ;DERRIVE NEW DRIVE SELECT BIT PATTERN CALL READY ;EMIT NEW SELECT BITS AND TEST  POP BC RET D5SEL: SET 1,A ;SET TYPE TO 5 INCH LD B,A LD A,SEL5+ON JR D8SELA SELTAB: DEFB 10001010B ;BITS FOR  ADD HL,DE ;ADD UNIT# TO HL TO INDEX INTO TABLE LD A,(HL) LD (SELCPY),A ;STORE NEW STATE OF SELECT/MUX PORT CKTYPE: EAD POSITIONING FTRK2: PUSH BC CALL STEP ;HAVE A GO AT STEPPING TO TRACK IN C POP BC JR NZ,FTRK4 ;JUMP IF READY/NOT FOUN ; HEAD POSITION OF NEW DRIVE LD A,(HL) OUT (TRKREG),A ;OUTPUT THE DRIVE'S CURRENT HEAD LD (TRACK),A ; POSITION TO THE 179SLOWEST STEP SPEED XOR 00000100B ;COMPLIMENT TRK0 STATUS BIT AND 10000101B JR NZ,SEEKX ;EXIT IF RESTORE CANNOT BE DONE READY JR NZ,SELX ;JUMP IF DRIVE NOT READY LD HL,UNIT LD D,0 LD E,(HL) ;LOAD DE WITH LAST SELECTED DRIVE UNIT# LD (UNIT #0 DEFB 01001010B ;BITS FOR UNIT #1 DEFB 00101010B ;BITS FOR UNIT #2 DEFB 00011010B ;BITS FOR UNIT #3 ; ; ; ; ; PUSH BC LD A,C ;GET UNIT INC A LD B,A LD A,(TYPEFLAG) CKTLP: SRL A DJNZ CKTLP ;FLAG IN CARRY LD A,(DSKTYP) JRD/CRC/BUSY ERROR IN A,(SECREG) LD B,A ;PUT ACTUAL CURRENT TRACK# INTO B SUB C ;COMPARE IF WE GOT THERE THIS TIME RETX AND SAVE LD E,4 ADD HL,DE ;INEDX TO NEW DRIVE'S DENSITY SETTING LD A,(DSKTYP) AND 11111110B ;MERGE IN NEW DENSITY CONSEEK2: LD B,A ;PUT STARTING TRACK# INTO B CALL FINDTRK ;GO LOOKING FOR TRACK# IN C PUSH AF LD A,C LD (TRACK),A ;STORE HL),C ;THEN STORE NEW UNIT# PASSED IN C LD HL,TRKTAB ADD HL,DE ;INDEX INTO HEAD POSITION TABLE LD A,(TRACK) LD (HL), HOME: LD C,0 ;TREAT HOME AS SEEK TO TRACK ZERO SEEK: CALL READY JR NZ,SEEKX ;EXIT IF DRIVE NOT READY LD A,(TRACK)  NC,D5SEL ;SELECT 5 INCH D8SEL: RES 1,A ;SELECT 8 INCH LD B,A ;SAVE TYPE LD A,SEL5+OFF D8SELA: OUT (PORT1),A ;SET MU Z ;EXIT WITH ACC=0 IF TRACK# VERIFIED LD A,(FNDTRY) CP 7 JR Z,FTRK3 ;JUMP IF ON FIRST OR SECOND RETRY LD HL,SPEED TROL BIT OR (HL) CALL SETDENS ;SET DENSITY CONTROLS XOR A ;INDICATE SELECT WAS SUCCESSFUL SELX: CALL SETTIMER ;RESET FINAL TRACK# (C=255 IF ERROR) OUT (TRKREG),A ;ALSO PUT IN 179X TRACK REGISTER POP AF SEEKX: CALL SETTIMER ;RESET DRIVE TUA ;STORE PREVIOUS DRIVE'S TRACK NUMBER LD E,4 ADD HL,DE ;NOW INDEX TO DENSITY BYTE FOR UNIT LD A,(DSKTYP) AND 00000001 SUB C ;TEST IF ALREADY AT DESIRED TRACK JR Z,SEEKX ;EXIT WITH ACC=0 IF SO LD A,(TRACK) ;GET CURRENT TRACK# INTO ACC C>  INC (HL) ;ELSE REDUCE STEP SPEED BY 1 MILLISEC FTRK3: DEC A LD (FNDTRY),A ;DECREMENT SEEK RETRY COUNT AND KEEP JR NZ,FTRKEN SEEK FUNCTION .... ; DOSTEP: LD HL,STPDLY DEC (HL) ;DECREMENT STEP SPEED DELAY COUNT RET NZ ;EXIT IF NOT TIME TO ISOSTEP ;START STEPPER FINITE STATE MACHINE LD (STPVEC),HL LD A,(SELCPY) RES 3,A ;MAKE 179X TEST INPUT LOW TO DISABLE OUTAVE STATUS OF READ-ID CALL FORCE ;CLEAR OVERRUN AND DRQ BITS IN 179X POP AF RET Z ;EXIT IF AN ID MARK WAS FOUND PUSHO VERIFY IF NO STEPS NEEDED LD (STPCNT),A ;ELSE STORE STEP COUNT AND STEP IN/OUT IF DSTEP PUSH BC LD A,(UNIT) ;GET C TIME DELAY COUNT RET NZ XOR A LD (STPCNT),A ;SET STEP COUNT TO ZERO WHEN FINISHED LD HL,SEEKX LD (STPVEC),HL ;PUT S2 ; TRYING OVER (POSSIBLY AT SLOWER RATE) LD A,00010000B ;INDICATE PERMANENT SEEK ERROR OR A FTRK4: LD C,255 ;SET C=255 SUE STEP CMD LD A,(STPCMD) OUT (CMDREG),A ;OUTPUT STEP IN/OUT COMMAND TO 179X LD A,(STPCNT) DEC A ;DECREMENT STEP COU (SELMUX),A ; INTERNAL OPERATION TIME DELAYS LD A,10000001B OUT (CTCB2),A ;START CTC 1 MILLISECOND INTERRUPT STEP3: LD A,(S AF CALL FLIPDENS ;ELSE GO BACK TO ORIGINAL DENSITY POP AF RET ;RETURN WITH ERROR INDICATED ; ; ; ; FLIPDENS: LD URRENT UNIT # INC A LD B,A ;SAVE IN (B) LD A,(TYPEFLAG) ;GET TYPE OF DRIVE STEPLP: ADD A,A ;SHIFT LEFT DJNZ STEPLP EEK FSM TO SLEEP LD A,00000001B OUT (CTCB2),A ;STOP 1 MILLISECOND INTERRUPT RET ; ; ; ; VERIFY: LD A,RIDCMD CALL AS BAD TRACK INDICATOR RET ;RETURN WITH SEEK ERROR STATUS IN A ; ; ; ; ; ; ; STEP FROM TRACK# IN B TOWARDS TRACK# IN NT JR Z,DOSTP2 ;JUMP IF LAST STEP TO BE DONE LD (STPCNT),A ;ELSE STORE DECREMENTED COUNT LD A,(SPEED) LD (HL),A ;STORTPCNT) OR A JR NZ,STEP3 ;LOOP UNTIL STEP COUNTER REACHES ZERO LD A,(SELCPY) SET 3,A ;TAKE 179X TEST PIN BACK HIGH OUTA,(DSKTYP) XOR 00000001B ;COMPLIMENT DENSITY BIT OF DRIVE TYPE SETDENS: LD (DSKTYP),A AND 00000011B LD B,0 LD C,A L ;AND GET FLAG IN CARRY POP BC JR NC,SSTEP ;SINGLE STEP IN NO CARRY LD A,(STPCNT) ;DOUBLE STEP COUNT ADD A,A ;NOW CARRYDISKOP ;READ NEXT ID-MARK TO VERIFY SEEK AND 10011001B JR Z,VERFY2 ;JUMP IF ID MARK READ SUCCESSFULLY CALL FLIPDENS ;ELC ; STEP: LD D,STEPOUT ;D WILL CARRY STEP OUT/IN COMMAND LD A,B SUB C ;GET DIFFERENCE BETWEEN TRACK NUMS JR NC,STEP2 E STEP SPEED FOR NEXT OPERATION RET ; DOSTP2: LD A,(SETTLE) LD (HL),A ;STORE HEAD SETTLING TIME PARAMETER LD HL,DOSETTL (SELMUX),A STEP4: CALL VERIFY ;ELSE READ AN ID-MARK TO VERIFY SEEK STEPX: RET ; ; ; ; .... ROUTINES FOR INTERRUPT DRIVD HL,SMCTAB ADD HL,BC ;INDEX INTO SMC DATA SEPARATOR CONTROL ADD HL,BC ; BYTE TABLE FOR NEW DENSITY SETTING ADD HL,BC  IS SET LD (STPCNT),A SSTEP: ENDIF LD A,D ; COMMAND BYTE CARRIED IN D LD (STPCMD),A LD A,1 LD (STPDLY),A LD HL,DSE SWITCH DISK DENSITY CONFIGURATION LD A,RIDCMD CALL DISKOP ;TRY AGAIN IN NEW DENSITY AND 10011001B VERFY2: PUSH AF ;S;JUMP IF SEEK TOWARDS OUTER TRACKS LD D,STEPIN LD A,C SUB B ;ELSE SWAP DIRECTION AND DIFFERENCE STEP2: JR Z,STEP4 ;GO DE LD (STPVEC),HL ;DO SETTLING DELAY ON NEXT INTERRUPT RET ; ; ; DOSETTLE: LD HL,STPDLY DEC (HL) ;DECREMENT SETTLING? LD B,3 LD C,PORT0 OTIR ;OUTPUT 3 BYTES TO SET DISK DENSITY RET SMCTAB: DEFB SMC1+ON ;8 INCH SINGLE DENSITY DEFB SMION LD B,8 LD C,DMA OTIR ;FIRST 6 BYTES ARE DMA RESETS LD DE,(BLKSIZ) OUT (C),E ;NEXT TWO BYTES ARE MAX DMA BLOCKCO; ; ; ; READ: CALL READY ;CLEAR DISK CONTROLLER JR NZ,READX ;EXIT IF DRIVE NOT READY LD B,RDCMD CALL RDWRT REAP RETRY IF IRRECOVERABLE ERROR LD HL,RWTRY DEC (HL) JR NZ,RW1 ;ELSE DECREMENT RETRY COUNT TILL=0 RW3: LD A,(ERRTYP) OR,(DSKTYP) LD (HL),A ;STORE DISK TYPE BYTE THERE XOR A RDIDX: CALL SETTIMER ;RESET DRIVE TURN-OFF TIMER RET ; ; WRITA,(MOVECS) ;TEST VSYNC INTERRUPT PENDIG FLAG OR A ;FOR ACTIVE JR NZ,RW2A C2+OFF DEFB DDEN+ON DEFB SMC1+OFF ;8 INCH DOUBLE DENSITY DEFB SMC2+OFF DEFB DDEN+OFF DEFB SMC1+OFF ;5 INCH SINGLE DENSUNT OUT (C),D LD B,3 OTIR ;NEXT 3 BYTES ARE CONSTANTS LD DE,(IOPTR) OUT (C),E ;NEXT 2 BYTES ARE TRANSFER ADDRESS DX: JR RDIDX ; ; ; RDWRT: LD (IOPTR),HL ;STORE DISK I/O DATA POINTER LD A,C LD (SECTOR),A ;STORE SECTOR# FOR READ/WR A RET ;RETURN ORIGINAL ERROR CONDITION IN ACC ; ; ; ; RECOVER: LD B,A AND 10000111B ;ISOLATE READY/OVERRUN/DRQ/BUSE: CALL READY ;CLEAR THE DISK CONTROLLER JR NZ,WRITEX ;EXIT IF DRIVE NOT READY LD B,WRTCMD JR WRITES WTRAK: CALL R;WAIT FOR VSYNC INTERRUPT POP AF CALL DISKOP ;DO 179X COMMAND AND LOOP TILL INTRQ LD B,4 OTIR ;DISABLE DMAITY DEFB SMC2+ON DEFB DDEN+ON DEFB SMC1+ON ;5 INCH DOUBLE DENSITY DEFB SMC2+OFF DEFB DDEN+OFF ; ; ; ; ; READID:OUT (C),D OUTI ;NEXT BYTE SETS READY/WAIT/RESTART LD B,4 LD A,(CMDTYP) ;GET READ OR WRITE COMMAND BYTE CP WRTCMD JR ITE LD A,B LD (CMDTYP),A ;STORE READ/WRITE/READID COMMAND BYTE LD A,(MAXRWT) LD (RWTRY),A ;SET DISK OPERATION RE-TRY COUY ERRORS JR Z,RECOV1 ; AND JUMP IF NONE OF THOSE IS SET CALL FORCE ;CLEAR ERROR FLAGS IN 179X STATUS REG LD A,B OR A EADY ;CLEAR DISK CONTROLLER LD (BLKSIZ),DE ;STORE SIZE LD B,WTRCMD WRITES: BIT 6,A JR NZ,WRITEX ;EXIT IF DISK IS WRI AND INITIATE READ SEQUENCE IN L,(C) IN H,(C) ;READ BYTECOUNT INTO HL AND 10011111B ;MASK READY/RNF/CRC/OVERRUN/DRQ/BUSY  CALL READY ;CLEAR DISK CONTROLLER JR NZ,RDIDX ;EXIT IF DRIVE NOT READY LD B,RIDCMD CALL RDWRT ;READ ID RECORD INTO Z,RW2 ;JUMP IF DISK OPERATION IS A WRITE CP WTRCMD JR Z,RW2 INC HL INC HL ;ELSE SKIP NEXT TWO BYTES IN DMA PGM LD B,NT RW1: LD A,(SECTOR) ;OUTPUT SECTOR NUMBER FOR READ/WRITE OUT (SECREG),A LD HL,DMAPGM ;PREPARE TO OUTPUT DMA INITIALIZAT ;RETURN ERROR STATUS IN ACC RET ; ; ARRIVE HERE IF CRC OR RECORD-NOT-FOUND ERROR ; RECOV1: BIT 4,B JR NZ,RECOV3 ;JUMP ITE-PROTECTED CALL RDWRT WRITEX: LD DE,1024 ;RESTORE BLOCK SIZE LD (BLKSIZ),DE ;IN CASE OF A WRITE TRACK JR RDIDX  RET Z ;RETURN IF NO DISK I/O ERRORS LD (ERRTYP),A CALL RECOVER ;DO READ/WRITE ERROR RECOVERY ROUTINE JR NZ,RW3 ;SKIBUFFER (HL) JR NZ,RDIDX ;EXIT IF DISK ERROR LD HL,(IOPTR) LD DE,6 ADD HL,DE ;POINT TO 7TH BYTE AFTER ID RECORD LD A2 RW2: OTIR ;OUTPUT LAST OF DMA PROGRAM BYTES PUSH AF ;SAVE COMMAND BYTE RW2A: LD @ F SECTOR ID RECORD NOT FOUND ; ; ERROR IS DUE TO BAD CRC IN DATA OR ID FIELD ; RECOV2: LD A,(RWTRY) LD HL,MAXRWT SUB (HLND EXIT WITH RNF ERROR IF NOT XOR A ;CLEAR ACC TO INDICATE RETRY SHOULD RET ; BE DONE NOW THAT DENSITY IS SET RIGHT ; RS TRK# IN SECTOR REG) LD C,A CP B JR Z,RECOV4 ;JUMP IF HEAD IS ON CORRECT TRACK CP 255 ;ERROR IF TRKREG SET TO 255 PRBUSY STATUS BIT RET Z ;EXIT IF BUSY BIT GOES AWAY LD A,(RDYCNT) ;ELSE TEST IF NOT-READY COUNTER HAS OR A ; BEEN BUMPEDORIGINAL TRACK RET ; ; ARRIVE HERE IF RECORD-NOT-FOUND ERROR ; RECOV3: LD A,(DSKTYP) ;SAVE DENSITY CONTROL BYTE BEFORE PUXED, NO RESTART DEFB 11001111B ;LOAD DESTINATION ADDRESS DEFB 00000001B ;XFER B->A, NOTHING FOLLOWS DEFB 11001111B ;LOA) ;TEST IF THIS IS FIRST CRC ERROR RETRY RET Z ;IF SO EXIT AND ALLOW RETRY TO BE DONE IN A,(TRKREG) ;ELSE PREPARE TO WIGECOV5: LD A,00010000B OR A ;INDICATE ERROR DUE TO NON-EXISTENT RET ; SECTOR OR INDETERMINATE TRACK# ; ; ; ; DMAPGM: EVIOUSLY JR Z,RECOV5 CALL FINDTRK ;ELSE GO TO TRACK=C FROM TRACK=B PUSH AF LD A,C ;PUT FINAL TRACK# IN 179X TRACK OU BY BACKGROUND SCAN JR Z,DSKOP2 ;KEEP LOOKING IF STILL READY CALL FORCE ;ELSE ABORT DISK COMMAND LD A,00000001B OR A USH AF ; CALLING TRACK VERIFY ROUTINE CALL VERIFY ;DO A READ-ID COMMAND TO SEE IF ANY POP DE ; SECTOR ON THIS TRACK CAN BD SOURCE ADDRESS DEFB 10000111B ;ENABLE DMA DEFB 10000011B ;DISABLE DMA DEFB 10111011B ;READ MASK FOLLOWS DEFB 0000011GLE BACK AND FORTH LD B,A ; TO AN ADJACENT TRACK TO RE-CALIBRATE OR A ; AND REMOVE POSSIBLE MEDIA CONTAMINANT JR NZ,RCOVDEFB 11000011B ;DMA RESET COMMAND DEFB 11000011B DEFB 11000011B DEFB 11000011B DEFB 11000011B DEFB 11000011B DEFB 01T (TRKREG),A ; REGISTER (C=255 IF SEEK ERROR) POP AF RET ;RETURN COMPLETION STATUS IN ACC ; ; ERROR IS DUE TO NON-EXISTE ;RETURN WITH 179X BUSY ERROR INDICATED RET ; ; ; ; CMDOUT: OUT (CMDREG),A ;OUTPUT DISK CONTROLLER COMMAND BYTE LD A,E READ RET NZ ;ERROR IF NO ID MARK FOUND LD A,(CMDTYP) CP RIDCMD ;BYPASS TRACK# CHECK IF DOING READ-ID JR Z,RECOV4 0B ;MASK FOR BYTECOUNT HIGH/LOW DEFB 10100111B ;INITIATE READ SEQUENCE ; ; ; ; ; DISKOP: CALL CMDOUT XOR A ;RESET S2A LD C, 1 ;STEP TO TRACK#1 IF ON TRACK# 0 JR RCOV2B ; RCOV2A: DEC A ;STEP TO NEXT OUTER TRACK LD C,A RCOV2B: PUSH BC101101B ;XFER A->B, PORT A AND BYTCNT FOLLOWS DEFB DATREG DEFB 00101100B ;PORT A IS I/O, FIXED ADDRESS DEFB 00010000B ;PNT SECTOR# OR BEING IN WRONG DENSITY ; RECOV4: LD A,(DSKTYP) CP D ;SEE IF DENSITY WAS CHANGED BY 'VERIFY' JR Z,RECOV5 ; A12 COUT2: DEC A JR NZ,COUT2 ;DELAY 50 MICROSECONDS RET ; ; ; ; FORCE: LD A,FINCMD ;LOAD FORCE-INTERRUPT-IMMEDIATE CM IN A,(SECREG) ;TEST IF CONTENTS OF TRACK REGISTER LD B,A ; MATCHES TRACK# FROM ID MARK JUST IN A,(TRKREG) ; READ (179X PUTECONDS-NOT-READY COUNT FOR LD (RDYCNT),A ; FOR USE AS LOOP EXIT TIMER DSKOP2: IN A,(STSREG) BIT 0,A ;TEST DISK CONTROLLER  CALL STEP ;STEP HEAD TO ADJACENT TRACK POP DE LD B,E ;EXCHANGE CONTENTS OF B AND C LD C,D CALL STEP ;STEP BACK TO ORT B IS MEMORY, INCREMENTING ADDRESS DEFB 10001101B ;SINGLE BYTE MODE, PORT B FOLLOWS DEFB 10001010B ;HIGH=RDY, /CE NOT MA D CALL CMDOUT ;CLEAR 179X AND LATCH READY/HLD/TK0 ETC IN A,(STSREG) ;READ STATUS REGISTER CONTENTS RET ; ; ; ; ; RE JR SPIN5 ;EXIT WITH DRIVE READY INDICATED ; SPIN4: LD A,10000000B ;INDICATE DRIVE-NOT-READY ERROR SPIN5: POP BC OR A ;READY PARAM INTO B XOR A LD (RDYCNT),A ;CLEAR SECONDS-NOT-READY COUNTER CALL FORCE ;RESET 179X SO READY CAN BE TESTED SP (INUSE),A ; THIS POINT UNTIL NEXT DISK OPERATION XOR A LD (DSKCNT),A ;CLEAR COUNTER TO INDICATE DRIVES-OFF LD A,MOTOR+OFF AND RETURN TYPE 1 STATUS IN ACC ; ; ; ; SETTIMER: PUSH AF ;SAVE COMPLETION STATUS CARRIED IN ACC LD A,(NSTOP) LD (D DISK IS STILL ROTATING LD HL,RDYCNT INC (HL) ;BUMP SECONDS-NOT-READY COUNT RET ; ; ; ARRIVE HERE IF NO DISK OPERATIADY: LD A,1 LD (INUSE),A ;SET DISKS-ACTIVE FLAG FOR BACKGROUND LD A,(SELCPY) OUT (SELMUX),A ;OUTPUT CURRENT DRIVE SELECTRETURN DRIVE READY STATUS IN A RET ; ; ; ; .... BACKGROUND DISK ACTIVITY MONITOR .... ; DISKTEST: LD HL,OLDCTC ;POINT IN2: LD A,(RDYCNT) CP 4 ;TEST IF DRIVES HAVE BEEN NOT-READY JR NC,SPIN4 ; FOR MORE THAT 4 SECONDS IN A,(STSREG) BIT 7,A OUT (PORT0),A ;TURN OFF THE MOTOR CONTROL LINE LD A,HLDTIM+OFF OUT (PORT0),A ;DEACTIVATE THE HEAD LOAD LINE LD A,(SELCPSKCNT),A ;SET INDEX COUNTER FOR DISK TIMEOUT XOR A LD (INUSE),A ;CLEAR DISKS-ACTIVE FLAG FOR BACKGROUND POP AF RET ; ;ONS ARE GOING ON ; DTST2: LD A,C SUB (HL) ;COMPUTE PULSES SINCE LAST INTERRUPT JR Z,DTST3 ;TURN DRIVES OFF IF NO INDEX P/MUX BITS LD A,(DSKCNT) OR A ;TEST IF BACKGROUND TIMER EQUALS ZERO JR Z,READY2 ;JUMP IF DRIVES HAVE BEEN STOPPED CALLTO LAST INDEX COUNTER VALUE IN A,(CTCA1) ;READ INDEX PULSE COUNT FROM CTC LD C,(HL) LD (HL),A ;LOAD C WITH LAST COUNT AND JR NZ,SPIN2 ;STAY IN INNER LOOP TILL DRIVE READY IN A,(CTCA1) ;READ INDEX PULSE COUNT FROM CTC SUB C ;COMPUTE CHANGE IY) ;GET CURRENT DATA AT SELECT/MUX PORT, AND 00001111B ; MASK ALL DRIVE SELECT BITS TO ZEROS OUT (SELMUX),A ;AND RE-OUTPUT T ; ; SPINUP: PUSH BC LD A,MOTOR+ON OUT (PORT0),A ;TURN ON THE MOTOR CONTROL LINE LD A,HLDTIM+ON OUT (PORT0),A ;ACTIULSES LD B,A LD A,(DSKCNT) SUB B ;SUBTRACT COUNT DIFFERENCE FROM TIMER JR C,DTST3 ;JUMP IF DISK TIMEOUT JR Z,DTST3 FORCE ;CLEAR CONTROLLER AND TEST DRIVE READY BIT 7,A RET Z ;EXIT IF READY READY2: CALL SPINUP ;ELSE START THE DRIVES  STORE NEW LD A,(INUSE) ;TEST STATE OF DISK ACTIVITY FLAG OR A JR Z,DTST2 ;DO DRIVE TURN-OFF STUFF IF NOT IN-USE ; ; ;N INDEX COUNTER CTC NEG ;RESULT IS NEGATIVE, SO SWITCH IT CP B JR C,SPIN2 ;LOOP UNTIL SPECIFIED NUMBER OF REVS XOR A O DESELECT DRIVES RET ; ; ; ; ; VATE THE HEAD LOAD SOLENOIDS IN A,(CTCA1) LD C,A ;PUT CURRENT INDEX PULSE COUNT IN C LD A,(NREVS) LD B,A ;PUT REVS-TO- LD (DSKCNT),A ;ELSE STORE UPDATED VALUE FOR NEXT TIME RET ; DTST3: LD A,1 ;SET FLAG TO STOP ANY FURTHER ACCESS TO LDAND CHECK READY RET NZ ;EXIT IF NOT RUNNING UP TO SPEED CALL FORCE BIT 7,A ;ELSE TEST THE DRIVE READY STATUS RET ; ARRIVE HERE IF DISK I/O IS CURRENTLY BEING DONE ; LD A,(HL) CP C ;TEST IF ANY INDEX PULSES IN LAST SEC RET NZ ;EXIT IFB #CRC.COM 5.0 6/18/82CRCKFILE???!9" 1 M @ CRC Ver 5.0 CTL-S pauses, CTL-C aborts :] O@ ++Searching for CRCKLIST F*}’">͇†]<  CANNOT CLOSE CRCFILE$CRCKLISTCRCSK FULL: CRCFILE$  w›͸›* =: =͔="  ʳ ª~#.  ¿~  #~  .+~#0MACRO ADDR LOCAL IN1,IN2,OVERSUB JR OVERSUB @HEXIN: LD HL,0 ; ZERO NUMBER IN1: LD A,(DE) ; GET A CHAR OR A ; CHECK FO<2 P6: .6@ Can not parse string ! ~ʽT #ñM ! > 6 #6^#6! ~T #! 4M #x]h2|2   ~$#~# x  : F} *}= ">͇1 ] FILE: XXXXXXXX.XXX CRC = oS) \<‘@ ++:0~#!A.O.Gy~#0M0 K MMɷ:m2 FSÄCRCKLIST$$$››tK›,R END RET Z SUB '0' RET C ADD A,'0'-'G' RET C ADD A,6 JP P,IN2 ADD A,7 RET C IN2: ADD A,10 OR A LD C,A  #e w~ T #>2 @ - s M@ File not found ! 4 >2 o: G: „: G: „@ *Match* 2 ! ++ABORTED++$ : ~ 2 M @ Quantity of file CRC that matched - : ̓ :  M @ Quantity of file CRC that did not͔0CRCKLIST???CRCKFILE???!9" M à*,*.}|ډ!".*,{z{** u*.".G*.",OPEN FAILED++ !" !" * | ʹ) \!~2 #" Ý: ) > T : ) @ ++FILE READ E › **}|!"*{z*~]*"Ü  DISK FULL: CRCFILE$!"*~ Please read the .DOC files first. The hardware modification is described in the file MIXED.DOC. You will ha 4@ <-- is, was --> : ) > T : ) M 2 ! 4<2 ~# @ Not a space between CRC values<2 G-CATALOG??? match - : ̓ : J M @ Quantity of lines failed parse test - : ̓ : ~ M @ Quantity of file(s) not found - : ̓ *!".***,}>*.#".ɯ22)! ",". <  NO FILECRC FILE$!   >. @ Checking wiRROR++ <* |): o% |g}o" 2  ; 0T ~T #~A > T > _h : F{͇2h2*#"ɯ2i2}! "!"]]2 s : ~# ++FILE NOT FOUND++$:ve to change the monitor file INIT.MAC with a new 6845 table of your own choice. The tables included are for@ ++ Now searching for "-CATALOG" file++ !  ) .) ! ”>.”#””͡”››tK› d͔  ͔ 0T  Җ Wyʩ 0T 0ztiilth file - ! ~T #M M 2 2 2 2 ! >2 3o: : @ ***No CRC Files found***$> ʉ ʉw#: |: ʲ !\   :\2 ! \  \ ! \  \! \  \<7=Ɓo&   ]  2C  50 Hz. and 16 or 15 Mhz. crystals, both for 15750 Hz. hor. scan frequency. If you have JRT Pascal you canLE EQU TRUE ;SINGLE/DOUBLE SIDED DRIVE ENABLE FIVE EQU FALSE ;SELECT 5 INCH FLOPPYS EIGHT EQU FALSE ;SELECT 8 INCH FLOPPYS  ENDM ; ; . . . . . ; ; INPUT MACRO ; INPUT CHAR STRING FROM CONSOLE. ; ; INPUT ADDR,BUFLEN ; ; ADDR START OF TEXT BUF ;* Nederland. * ;* * ;* To include mixed drive combination * ;* of 8 and 5 1/4 inch. * ;* * ;* * calculate the values for your own using the the program CALCBYTE that is also on the disk. The version of .Z80 PAGE 66 ;******************************************************** ;* * ;* -- CUSTOM BIOS FOR CP/M VERSION 2. MIXED EQU TRUE ;TRUE FOR MIXED 8 & 5 INCH DRIVES IOBYTACT EQU TRUE ;TRUE IF WE USE THE IO BYTE OPTION PERTEC EQU FALSE ;USFER. ; BUFLEN LENGTH OF BUFFER (DEFAULT 127). ; INPUT MACRO ADDR,BUFLEN LD C,10 IFNB LD DE,ADDR ;SET BUFFER ADD ;* Last edit date: 14-MRT-1983 * ;* * ;* * ;******************************************************** ; A the monitor rom MROM. (Note M.... denotes a modified file.) contains the neccesary changes and a few more c2 -- * ;* * ;* DOUBLE DENSITY CBIOS FOR BIGBOARD-II * ;* * ;* COPYRIGHT (C) 1982 BY RUSSELL SMITH * ;* ED FOR SLOW STEPPING DRIVES (=>20 msec.) SERIAL EQU FALSE ;DISABLE SIO/CRT CONSOLE COMBINATION ; ; MSIZE EQU 59 ;MEMORY SIRESS ENDIF IFNB LD (DE),A ELSE LD A,127 LD (DE),A ENDIF CALL 5 ENDM ; .LIST SEG .SFCOND ;DON'T LIST FALSE CONDITIONALS .Z80 ;USE ZILOG MNEMONICS ; TRUE EQU 1 FALSE EQU 0 ; ; ...DEFINE THE SYSonveniencies like a autoboot facility. Regards, Andy Bakkers  818 WEST HICKORY * ;* DENTON, TEXAS 76201 * ;* * ;* LAST EDIT DATE: 21-AUGUST-82 * ;* * ;* ZE IN KBYTES (RANGE 20..60) BASE EQU (MSIZE-20)*1024 CCP EQU 3400H+BASE ;CONSOLE COMMAND PROCESSOR BDOS EQU 3C06H+BASE ;OPERATEM VARIABLES... ; IOBYTE EQU 0003H ;INTEL CONFIGURATION BYTE USRDRV EQU 00H ;USER/DRIVE TO LOG ON AFTER COLDSTART ; DOUBF) IF CHAR READY ; FALSE (0) IF NOT. ; CHARSTAT MACRO LOCAL EXIT LD C,11 CALL 5 OR A JR Z,EXIT LD A,0FFH EXIT:  * ;* Edit by L.Koopman 20-Jan--1983 * ;* Waarbekenplein 13 * ;* 7553 KK Hengelo (o) * ;* phone 074-913022 * D TING SYSTEM ENTRY POINT DBBUG EQU 46D2H+BASE ;DEBLOCK BUG LOCATION IN BDOS CBIOS EQU 4A00H+BASE ;BASE OF CUSTOM BIOS CPMSIZE 5LLMAX EQU ((5*N5TRAKS*2)/B5LS)/8 D5IRSIZ EQU 128 ELSE A5LLMAX EQU ((5*N5TRAKS)/B5LS)/8 D5IRSIZ EQU 128 ENDIF ; N8SECNUMBER OF TRACKS PER SURFACE RESERV EQU 2 ;NUMBER OF RESERVED TRACKS BLS EQU 2 ;DOUBLE DENSITY BLOCKSIZE IN KBYTES IF DOUBD AND TBE BITS ARE TRUE ; ; ; PAGE ORG CBIOS-256 .PHASE 0080H INCLUDE ONESECT.MAC ;ONE SECTOR LOADER .DEPHASE ; ; ; ; ... DEFINE TRACK/SECTOR PARAMS FOR STANDARD FLOPPYS ... ; IF FIVE NSECTS EQU 18 ;SINGLE DENSITY SECTORS PER TRACK NT# LSTCTL EQU 81H ;SIO CHANNEL A CONTROL PORT# TTYDAT EQU 82H ;SIO CHANNEL B DATA PORT# TTYCTL EQU 83H ;SIO CHANNEL B CONTREQU (CBIOS-CCP)/128 ;NUMBER OF RECORDS NEEDED FOR CCP+BDOS MONITR EQU 0F000H ;BASE OF SYSTEM MONITOR SYSRAM EQU 0FF00H ;BTS EQU 26 ;SINGLE DENSITY SECTORS PER TRACK N8TRAKS EQU 77 ;NUMBER OF TRACKS PER SURFACE R8ESERV EQU 2 ;NUMBER OF RESERVED LE ALLMAX EQU ((9*NTRAKS*2)/BLS)/8 DIRSIZ EQU 128 ELSE ALLMAX EQU ((9*NTRAKS)/BLS)/8 DIRSIZ EQU 128 ENDIF ENDIF IF PAGE ORG CBIOS-128 ; ; ; ... CREATE SIGNON MESSAGE FOR SELECTED MEMORY SIZE CPM ... ; M1 EQU (MSIZE / 10) OR '0' ;TENSRAKS EQU 40 ;NUMBER OF TRACKS PER SURFACE RESERV EQU 3 ;NUMBER OF RESERVED TRACKS BLS EQU 2 ;DOUBLE DENSITY BLOCKSIZE IN KBOL PORT# TTYBAUD EQU 88H ;SIO CHANNEL B BAUDRATE CTC PORT# LSTBAUD EQU 89H ;SIO CHANNEL A BAUDRATE CTC PORT# XONXOFF EQU ASE OF SYSTEM VARIABLES SCRATCH EQU 0F780H ;RAM AREA FOR BIOS/CPM BUFFERS ; ; ... DEFINE HOW MANY DRIVES IN SYSTEM ... ; WTRACKS B8LS EQU 2 ;DOUBLE DENSITY BLOCKSIZE IN KBYTES IF DOUBLE A8LLMAX EQU ((9*N8TRAKS*2)/B8LS)/8 D8IRSIZ EQU 128 ELSE  MIXED N5SECTS EQU 18 ;SINGLE DENSITY SECTORS PER TRACK N5TRAKS EQU 80 ;NUMBER OF TRACKS PER SURFACE R5ESERV EQU 3 ;NUMBER DIGIT OF MSIZE IN ASCII M2 EQU (MSIZE MOD 10) OR '0' ;ONES DIGIT ; DEFB CR,LF DEFB '.. Cal-Tex Computers ',M1,M2,'K CP/M YTES MBLK EQU (((NTRAKS-RESERV)*NSECTS)/8)-1 IF DOUBLE ALLMAX EQU ((5*NTRAKS*2)/BLS)/8 DIRSIZ EQU 64 ELSE ALLMAX EQU ((5FALSE ;ENABLE XON-XOFF HANDSHAKE CTS EQU 00100000B ;CLEAR-TO-SEND BIT POSITION IN SIO RR0 SYNC EQU 00010000B ;SYNC/HUNT BITINCH EQU 0 ;NUMBER OF WINCHESTERS (0..1) IN SYSTEM NFLOPPY EQU 4 ;NUMBER OF FLOPPYS (1..4) IN SYSTEM ; ; IF FIVE TITLE  A8LLMAX EQU ((9*N8TRAKS)/B8LS)/8 D8IRSIZ EQU 128 ENDIF ENDIF ; ; ; .XLIST INCLUDE MACROS.MAC ;ASSEMBLE WITH MACRO D OF RESERVED TRACKS B5LS EQU 2 ;DOUBLE DENSITY BLOCKSIZE IN KBYTES M5BLK EQU (((N5TRAKS-R5ESERV)*N5SECTS)/8)-1 IF DOUBLE Aversion 2.2 ..' DEFB CR,LF DEFB '...... release date 15-September-82 ......' DEFB CR,LF IF MIXED DEFB '..Mixed version*NTRAKS)/BLS)/8 DIRSIZ EQU 64 ENDIF ENDIF ; IF EIGHT NSECTS EQU 26 ;SINGLE DENSITY SECTORS PER TRACK NTRAKS EQU 77 ; DCD EQU 00001000B ;DATA-CARRIER-DETECT BIT TBE EQU 00000100B ;TRANSMIT-BUFFER-EMPTY BIT TXMASK EQU DCD+TBE ;LOOP UNTIL DC5 1/4 INCH BB ][ CBIOS. ENDIF IF EIGHT TITLE 8 INCH BB ][ CBIOS. ENDIF IF MIXED TITLE MIXED BB ][ CBIOS. ENDIF ; EFINITIONS .LIST ; ; ; ... EQUATES FOR PRINTER DRIVER PORTS/HANDSHAKE MODE ... ; LSTDAT EQU 80H ;SIO CHANNEL A DATA PORTE  of 19-05-83..' ENDIF IF FIVE DEFB '.....5 1/4 inch version.....' ENDIF IF EIGHT DEFB '.......8 inch version.......'1010B ;TX 7 BIT CHARACTERS / DTR AND RTS HIGH DEFB 01000111B ;PROGRAM CTC AND LOAD TIME CONST DEFB 4 ;DIVIDE BY 4 GIVES 9T 40 BYTES OF MEMORY IN ANY DEFB 0,0,0,0 ; CASE TO MAKE ROOM FOR THE BIOS DEFB 0,0,0,0 ; SELECT/READ/WRITE LOCAL STACK ARE CCP+BDOS FROM DOUBLE DENSITY POP BC INC B DEC B CALL NZ,RTRACK ;CONDITIONAL READ FROM TRACK #2 GOCPM: LD HL,MEMTAB ;ES ... ; SELENTRY: LD (SPSAVE),SP LD SP,BIOSTK PUSH IX CALL SELDISK POP IX LD SP,(SPSAVE) RET ; ; ; RDENTRY:AL SECTORS-PER-TRACK PARAM LD A,(HL) IF MIXED CP N8SECTS+1 ;WE BOOT FROM DOUBLE DENSITY ELSE CP NSECTS+1 ENDIF JR  ENDIF DEFB NULL ; PAGE ; ; ; ... BIOS CODE STARTS HERE WITH JUMP VECTORS ... ; ORG CBIOS ; JP BOOT JP WBOOT 600 BAUD BIOSTK EQU $ ;BIOS STACK OVERLAYS COLDSTART CODE ; SPSAVE: DEFS 2 ;USER SP SAVE FOR COMPLEX BIOS ENTRYS ; ; ;A LD HL,LSTINT ;INITIALIZE PORT B AS LIST LD B,6 LD C,TTYCTL ;PORTB CONTROL OTIR LD B,2 LD C,TTYBAUD OTIR IF IPREPARE TO STORE VECTORS & BDOS PATCH LD B,0 GOCPM2: LD C,(HL) ;BC=BYTECOUNT INC HL LD E,(HL) INC HL LD D,(HL) ;DE= LD (SPSAVE),SP LD SP,BIOSTK PUSH IX CALL READDB POP IX LD SP,(SPSAVE) RET ; ; ; WRTENTRY: LD (SPSAVE),SP C,BOMB ;ERROR IF TRACK IS SINGLE DENSITY CP CPMSIZE JR NC,WBOOT3 ;JUMP IF CCP+BDOS FITS ON ONE TRACK LD B,(HL) ;LOAD B JP CONST IVEC: JP CONIN OVEC: JP CONOUT JP LIST JP CONOUT ;PUNCH VECTOR SAME AS CONOUT JP CONIN ;READER VECTOR SAME A ; ; ... WARM BOOT ROUTINE ... ; WBOOT: LD SP,0080H CALL FLUSH ;FINISH ANY DEFERRED DISK I/O WBOOT2: LD HL,DPHTAB ;SETOBYTACT LD A,81H ;SET I/O BYTE TO (CRT,LPT) LD (IOBYTE),A ENDIF JR WBOOT2 LSTINT: ;SERIAL PRINTER INIT CONSTANTS DESTINATION POINTER INC HL LDIR ;COPY POOP INTO MEMORY LD A,(HL) OR A ;TEST FOR END OF TABLE JR NZ,GOCPM2 LD A,LD SP,BIOSTK PUSH IX CALL WRITEDB POP IX LD SP,(SPSAVE) RET ; ; ; ; ; ... COLD BOOT ROUTINE ... ; BOOT: DEFB  WITH # OF SECTORS ON TRACK #1 LD A,CPMSIZE SUB B ;COMPUTE # OF EXTRA SECTORS FROM TRACK #2 JR WBOOT4 ; WBOOT3: LD B,CPS CONIN JP HOME JP SELENTRY ;'SELDISK' WITH LOCAL STACK JP SETTRACK JP SETSECT JP SETDMA JP RDENTRY ;'READDB' WITH  PARAM POINTER FOR DRIVE ZERO LD (DPHPTR),HL ; FORMAT DESCRIPTOR STUFF XOR A LD (DISK),A LD (LINECNT),A INC A LD (TRDEFB 4 DEFB 01000101B ;16X CLOCK / 1 STOP BIT / ODD PARITY DEFB 3 DEFB 01000001B ;RX 7 BIT CHARACTERS DEFB 5 DEFB 1010(IOBYTE+1) ;DO AUTO LOG-ON THING THAT PEOPLE LIKE AND 00001111B CP NFLOPPY+WINCH LD A,(IOBYTE+1) ;RESTORE USER CODE JR C0,0,0,0 ;PUT EXTRA COLDSTART INITIALIZATION DEFB 0,0,0,0 ; CODE HERE IF NEEDED. BE SURE TO TAKE DEFB 0,0,0,0 ; UP AT LEASMSIZE ;GET ALL OF CP/M FROM TRACK #1 XOR A ;READ ZERO SECTORS FROM TRACK #2 WBOOT4: LD HL,CCP PUSH AF CALL RTRACK ;READLOCAL STACK JP WRTENTRY ;'WRITEDB' WITH LOCAL STACK JP LISTST JP SECTRAN ; ; ; ... ENTRY POINTS FOR COMPLEX DISK ROUTINACK),A CALL PARAMS ;SELECT A: AND FIND TRACK #1 FORMAT JR NZ,BOMB ;EXIT IF PERMANENT ERROR LD HL,DPHTAB+SPT ;GET LOGICF ,GOCPM3 XOR A ;LOG-ON A: IF DRIVE# IS ILLEGALY LARGE GOCPM3: LD C,A LD HL,CCP LD A,(HL) ;PEEK AT FIRST OPCODE IN CCP T CMD IN A,(LSTCTL) AND TXMASK ;DISCARD BITS NOT BEING TESTED CP TXMASK CONSTA: LD A,255 RET Z ;RETURN WITH A=255 ID OF TABLE ; ; PAGE ; ; ... CHARACTER I/O ROUTINES FOR BIOS ... ; ; CONST: JP MONITR+6 ;MONITOR CONSOLE STATUS ENTRY POATUS OR A JR Z,TTYLST LD A,C OUT (TTYDAT),A ;PORTB RET UL1LST: CALL LISTST ;CHECK STATUS OR A JR Z,UL1LST  IS READ LD (TRACK),A RET ; ; BOMB: LD HL,DEAD CALL PMSG JP MONITR+3 ; DEAD: DEFB ' cannot boot' DEFB NULL ; ; ;LOOP TILL SIO CAN SEND A CHARACTER LD A,C OUT (LSTDAT),A ;OUTPUT ASCII TO SIO IF XONXOFF IN A,(LSTCTL) BIT 0,A CP 0C3H JR NZ,BOMB ;ABORT IF NOT A JUMP INSTRUCTION JP (HL) ;ELSE JUMP INTO CCP TO START CPM ; ; ; ; RTRACK: LD C,1F PRINTER READY XOR A RET ;ELSE RETURN WITH A=0 ; IF IOBYTACT TTYST: LD A,00010000B OUT (TTYCTL),A IN A,(TTYCTINT ; ; CONIN: JP MONITR+9 ;MONITOR CONSOLE INPUT ENTRY POINT ; ; CONOUT: LD A,C JP MONITR+12 ;MONITOR CONS LD A,C OUT (LSTDAT),A CP 0CH ;FORM FEED ? JR NZ,UL1OTA PUSH BC LD C,7FH ;FILL CHAR LD B,30 ;FILL COUNT JR FIL ; ... ASSORTED CONSTANTS AND WHERE TO PLUG THEM IN ... ; MEMTAB: DEFB 3 ;WARMSTART VECTOR DEFW 0000H JP CBIOS+3 D;TEST RIO RX DATA AVAILABLE RET Z ;EXIT IF NO INPUT FROM PRINTER IN A,(LSTDAT) ;ELSE GET CHARACTER AND TEST FOR RES 7,A ;READ TRACK FROM LOGICAL SECTOR #1 RTRK2: PUSH HL PUSH BC LD (POINTR),HL LD A,C LD (SECTOR),A ;SET LOGICAL SECTOR NUML) ;PORT B STATUS AND TXMASK CP TXMASK LD A,255 RET Z XOR A RET ENDIF ; ; LIST: IF IOBYTACT LD A,(IOBYTE)OLE OUTPUT ENTRY POINT ; ; ; LISTST: IF IOBYTACT LD A,(IOBYTE) AND 0C0H JR Z,TTYST RLCA RLCA DEC A JR Z,CONSLER UL1OTA: CP CR ;CR FOUND ? RET NZ PUSH BC LD C,7FH ;FILL CHAR LD B,14 FILLER: CALL LISTST OR A JR Z,FILLEEFB 3 ;BDOS VECTOR DEFW 0005H JP BDOS DEFB 3 ;BREAKPOINT VECTOR DEFW 0038H JP MONITR+3 DEFB 5 ;CP/M 2.2 PATCH ; 'XOFF' CHARACTER (CONTROL-S) CP 'S'-64 RET NZ LIST2: IN A,(LSTCTL) BIT 0,A JR Z,LIST2 ;LOOP TILL NEXT HANDSHAKE BER FOR READ CALL READDB ;LOAD NEXT 128 BYTES OF CP/M POP BC POP HL JR NZ,BOMB ;EXIT IF PERMANENT ERROR LD DE,128  AND 0C0H ;GET LST BITS JR Z,TTYLST ;PORTB LIST RLCA RLCA DEC A JR Z,CONOUT ;CRTLIST DEC A JR Z,LPTLST ;LPT LISTA DEC A JR Z,LPTSTA JR UL1STA LPTSTA: UL1STA: ENDIF LD A,00010000B OUT (LSTCTL),A ;DO SIO CLEAR STATUS/INTERRUPR LD A,C OUT (LSTDAT),A DJNZ FILLER POP BC RET ; ENDIF ; ; IF MIXED INCLUDE MDEBLOCK.MAC ;DEBLOCKING DISK DRI 01 3/31/81 DEFW DBBUG NOP NOP LD HL,0 DEFB 2 ;DEFAULT DISK I/O POINTER DEFW POINTR DEFW 0080H DEFB 0 ;ENCHARACTER IN A,(LSTDAT) ;INPUT AND DISCADR 'XON' CHARACTER ENDIF RET IF IOBYTACT TTYLST: CALL LISTST ;CHECK STADD HL,DE INC C DJNZ RTRK2 ;BUMP SECTOR# AND LOAD ADDRESS TILL B=0 LD A,(TRACK) INC A ;BUMP TRACK# AFTER LAST SECTORT, NO DELAYS ;AND {OPTIONAL} XON/XOFF JR UL1LST ;LPT LIST + DELAYS ENDIF LPTLST: CALL LISTST OR A JR Z,LPTLSTG VERS ELSE INCLUDE DEBLOCK.MAC ENDIF ; IF WINCH INCLUDE XEBEC.MAC ;DISK DRIVERS FOR XEBEC CONTROLLER ENDIF ; ; IINTER ; ; HOST EQU $ HSTSEC: DEFS 1 ;HOST SECTOR NUMBER HSTTRK: DEFS 2 ;HOST TRACK NUMBER HSTDSK: DEFS 1 ;HOST DISK NUMX ;ALLOCATION VECTOR ENDM ; DPHTAB EQU $ REPT NFLOPPY ;CREATE FLOPPY DISK DATA AREAS DPH8 ;WITH ROOM FOR 5 OR 8 INCHISK READ ERROR RET ; ; ; WRITEHST: LD HL,BIGBUF LD (HSTPTR),HL XOR A LD (WRTACT),A CALL DOIT ;WRITE SECTOR TO D;DISK PARAMETER HEADER DEFS 15 ;DISK PARAMETER BLOCK DEFS 4 ;DEBLOCK PARAMETERS DEFS 1 ;DEBLOCK FLAGS DEFS DIRSIZ/4 ; PRMPTR: DEFS 2 ;POINTER TO DISK PARAMS IDBUFF: DEFS 8 ;BUFFER FOR ID RECORDS ON SIDE #0 IDTOP: DEFS 8 ;BUFFER FOR ID RECOF $ GE MONITR .PRINTX /OVERLAYING SYSTEM MONITOR/ ENDIF ; BIOSLEN EQU (($ AND -128)+128)-CBIOS ;LENGTH OF CBIOS MOD 128 BER HSTPTR: DEFS 2 ; HSTDPH: DEFS 2 ;HOST DISK PARAMETER POINTER ; NEXT EQU $ NXTSEC: DEFS 1 ;NEXT SECTOR NUMBER NXTTRK ENDM DPHSIZ EQU ($-DPHTAB)/NFLOPPY ENDIF ; IF WINCH DEFS 16 ;DISK PARAMETER HEADER DEFS 15 ;DISK PARAMETER BLOCISK RET ; ; ; RW128: LD HL,NEW LD DE,HOST LD BC,6 LDIR ;FALL THROUGH INTO 'DOIT' ; ; ... MASTER DISK READ/WRITCHECK VECTOR DEFS ALLMAX ;ALLOCATION VECTOR ENDM ; DPHTAB EQU $ REPT NFLOPPY ;CREATE FLOPPY DISK DATA AREAS DPH ENRDS ON SIDE #1 SCRLEN EQU $-SCRATCH ; ; IF $ GE SYSRAM .PRINTX /BIOS OVERLAYING SYSTEM VARIABLES/ ENDIF ; ; .XLIS ; PAGE ;******************************************************** ;* * ;* DISK I/O BUFFERS FOR BDOS FILE HANDLER * : DEFS 2 ;NEXT TRACK NUMBER ; RCOUNT: DEFS 1 ;UNALLOCATED RECORD COUNT SECTMP: DEFS 1 ;HOST EQUIVALENT OF SECTOR# RDACT: K DEFS 4 ;DEBLOCK PARAMETERS DEFS 1 ;DEBLOCK FLAGS DEFS MAXBLK/8 ;ALLOCATION VECTOR ENDIF ; ; ; NEW EQU $ SECTOE ROUTINE ... ; ; CALL WITH IX POINTING TO DISK PARAMETER TABLES ; AND ACC CONTAINING R/W OPERATION INDICATOR. ; ; DOIT: DM DPHSIZ EQU ($-DPHTAB)/NFLOPPY ENDIF ; IF MIXED ; DPH8 MACRO LOCAL BASE BASE: DEFS 16 ;DISK PARAMETER HEADER DET ;TURN OFF LISTING .PHASE SYSRAM INCLUDE MEMDEF.MAC ;ASSEMBLE SYSTEM VARIABLES IN CASE THEY .DEPHASE ; ARE REFERENCED ;* * ;******************************************************** ; ; ; ORG SCRATCH DIRBUF: DEFS 128 ;SCRATCH DIRECDEFS 1 ;READ BUFFER ACTIVE FLAG WRTACT: DEFS 1 ;WRITE BUFFER ACTIVE FLAG DIR: DEFS 1 ;DIR FOR DEFERRED RD/WRT (1=READ) RWFR: DEFS 1 ;BIOS SECTOR NUMBER TRACK: DEFS 2 ;BIOS TRACK NUMBER DISK: DEFS 1 ;BIOS DISK NUMBER POINTR: DEFS 2 ;BIOS DMA PO LD (RWFLAG),A ;STORE RWFLAG 1=READ 0=WRITE IF WINCH LD A,(HSTDSK) CP NFLOPPY JP NC,DOWINCH ;DO SASI DISK ROUTINE IF FS 15 ;DISK PARAMETER BLOCK DEFS 4 ;DEBLOCK PARAMETERS DEFS 1 ;DEBLOCK FLAGS DEFS D8IRSIZ/4 ;CHECK VECTOR DEFS A8LLMAANYWHERE IN CBIOS ; ; END TORY BUFFER BIGBUF: DEFS 1024 ;HOST SECTOR BUFFER FOR DEBLOCKING ; ; ; IFE MIXED DPH MACRO LOCAL BASE BASE: DEFS 16 LAG: DEFS 1 ;DIR FOR HOST RD/WRT (1=READ) LINECNT:DEFS 1 ;LINE COUNT FOR ETX/ACK ; ; DPHPTR: DEFS 2 ;POINTER TO DPH ENTRYH ON HARD DISK ENDIF DOFLOP: LD A,(HSTDSK) LD C,A CALL MONITR+27 ;SELECT SPECIFIED DRIVE JR Z,DOFLP2 CALL REPORT ;REPO BYTE IF CTL-C ABORT INC A RET ;RETURN PERMANENT BIOS ERROR ; ; ; ; CHARACTER STRING OUTPUT ROUTINE. PRINTS ASCII DATAAN LD A,E REP2: RLA JR C,REP3 PUSH AF XOR A CPIR ;SCAN MEMORY LOOKING FOR NULL POP AF DJNZ REP2 REP3: CALL PMS DEFB ' ?','H'-64,NULL ; ; ; ; ; R IF INDICATED ; DOFLP4: LD HL,(HSTPTR) LD A,(HSTSEC) LD C,A LD A,(RWFLAG) OR A ;TEST DIRECTION 1=READ 0=WRITE J,C OR A CALL NZ,PNUM ;PRINT NUMERIC CHARACTER IF NON-ZERO POP AF RET ; ; ; ; ; ; NULL EQU 00H ;NULL (END-OF-STRT SELECT ERROR TO CONSOLE JR Z,DOFLOP RET ;RETURN PERMANENT ERROR IF NOT ZERO ; DOFLP2: LD B,SIDSEL+OFF ;DEFAULT TO SEL ; POINTED TO BY HL UNTIL A DOLLAR SIGN IS ENCOUNTERED ; PMSG: LD A,(HL) ;HL POINTS TO ASCII STRING INC HL OR A ;TEST FG ;PRINT ERROR TYPE STRING LD A,E AND 11000000B ;MASK TO NOT-READY AND WRITE-PROTECT JR NZ,REP5 LD HL,TSMSG CALL PMR Z,DOFLP5 CALL MONITR+36 JR DOFLP6 ; DOFLP5: CALL MONITR+39 DOFLP6: RET Z ;RETURN IF READ/WRITE SUCCESSFUL CALL REPORRING INDICATOR) LF EQU 0AH ;LINE FEED CR EQU 0DH ;CARRIAGE RETURN DSKMSG: DEFB CR,LF DEFB 'BIOS error on A: ',NULL ECT DISK SIDE ZERO LD A,(HSTTRK) CP NTRAKS ;TEST IF TRACK# IS ON OTHER SIDE JR C,DOFLP3 LD B,SIDSEL+ON ;SELECT OPPOSITEOR BYTE EQUAL ZERO RET Z LD C,A ;PRINT CHARACTER IF NOT DOLLAR SIGN CALL OVEC JR PMSG ; ; ; ; PRINT CONTENTS OF A ISG LD A,(HSTTRK) CALL PUTDEC CALL PMSG LD A,(HSTSEC) CALL PUTDEC LD A,1 OR A RET ; REP5: LD HL,PROMPT CALL PT JR Z,DOFLP4 ;TRY AGAIN IF INDICATED RET ; ; ; ; REPORT: LD E,A ;SAVE PERTINENT ERROR BITS IN E LD A,(HSTDSK) ADD DEFB 'not ready',NULL DEFB 'wrt protect',NULL DEFB 'wrt fault',NULL DEFB 'not found',NULL DEFB 'bad crc',NULL DEFB ' SIDE SUB NTRAKS ;CONVERT TRACK# TO REAL VALUE DOFLP3: LD C,A LD A,B OUT (PORT0),A ;OUTPUT SIDE SELECT BIT CALL MONITRN DECIMAL (RANGE 0..255) ; PUTDEC: LD B,100 CALL PDIGIT ;PRINT HUNDREDS DIGIT LD B,10 CALL PDIGIT ;PRINT TENS DIGIT MSG CALL IVEC ;LOOP FOR CONSOLE INPUT CP 'C'-64 JR Z,REP6 XOR A RET ; REP6: XOR A LD (IOBYTE+1),A ;CLEAR AUTO-LOG A,'A' LD (DSKMSG+16),A LD HL,DSKMSG CALL PMSG ;PRINT OUT START OF MESSAGE LD BC,08FFH ;B=LOOPCOUNT C=255 FOR CPIR SCoverrun',NULL DEFB 'drq',NULL DEFB 'busy',NULL DEFB NULL TSMSG: DEFB ' track ',NULL DEFB ' sector ',NULL PROMPT:+33 ;SEEK SELECTED TRACK JR Z,DOFLP4 CALL REPORT ;REPORT SEEK ERROR TO CONSOLE JR Z,DOFLP2 RET ;RETURN PERMANENT ERRO PNUM: OR '0' LD C,A CALL OVEC RET ; ; PDIGIT: LD C,-1 PDIG1: INC C SUB B JR NC,PDIG1 ADD A,B PUSH AF LD AI  HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD BC,BIGBUF ADD HL,BC ;HL = HOST BUFFER ADDRESS LD DE,(POINTR) ;DE = DMA ADDR ;RETURN WITH A=0 (NO ERRORS) ; ; ; TRANSLATE SECTOR# TO HOST DISK EQUIVALENT ; PHYSECT: LD B,A ;LOAD B WITH SHIFT COU******************************* ;* * ;* HOST DISK SELECT/SEEK/READ/WRITE ROUTINE * ;* * ;***********************) ;ELSE COPY NEW DISK/TRACK/SECTOR LD (HSTSEC),A ; TO HOST DISK PARAMETERS LD HL,(TRACK) LD (HSTTRK),HL LD A,(DISK) LDRTACT) OR A RET Z PUSH IX ;SAVE CURRENT DPH POINTER IN IX LD IX,(HSTDPH) ;LOAD RIGHT POINTER FOR STUFF IN BUFFER CAESS FROM BDOS LD A,(DIR) OR A JR NZ,DEBLK2 ;SKIP IF READ LD A,1 LD (WRTACT),A ;INDICATE BUFFERED WRITE IS ACTIVE EX NT (RANGE 1..3) LD A,(SECTOR) DEC A ;REMOVE +1 BIAS FROM SECTOR NUMBERS PHSEC2: SRL A DJNZ PHSEC2 INC A ;REINSTATE +1********************************* ; ; ; ; ; READHST: LD HL,BIGBUF LD (HSTPTR),HL LD A,1 LD (RDACT),A CALL DOIT  (HSTDSK),A LD (HSTDPH),IX ;STORE DPH POINTER FOR CALLS TO 'FLUSH' UNAL4: CALL DEBLOCK ;MOVE 128 BYTES INTO BUFFER LD HL,NLL WRITEHST ;WRITE BUFFER ONTO HOST DISK POP IX ;RESTORE DPH POINTER BEFORE GOING BACK RET IF MIXED ;CHECK TYPE OF DR COMPUTATION OF LD (NXTTRK),HL ; SUCCESSIVE SECTOR NUMBERS IN BLOCK JR UNAL3 ; ; ARRIVE HERE ON SUCCESSIVE WRITES TO UNALDE,HL ;SOURCE/DEST SWAP DEBLK2: LD BC,128 LDIR RET ; ; PAGE ; ; HOSTCMP: LD A,(SECTMP) LD HL,HSTSEC CP (HL) BIAS TO SECTOR# LD (SECTMP),A ;SAVE FOR BUFFER RANGE TEST RET ; ; ; DEBLOCK: LD A,(SECTOR) DEC A ;REMOVE SECTOR NU;READ SECTOR FROM DISK RET Z LD HL,RDACT LD (HL),0 ;CLEAR FLAG IF DISK READ ERROR RET ; ; ; WRITEHST: LD HL,BIGBUXTSEC INC (HL) ;ADD 1 TO CURRENT DISK ADDRESS TO LD A,(HL) ; GET NEXT SECTOR/TRACK NUMBER IN BLOCK CP (IX+SPT) JR C,UNISK TO SELECT, 5 1/4 OR 8 INCH. CKTYPE: PUSH BC LD A,(DISK) INC A ;RANGE 1-4 LD B,A LD A,(TYPEFLAG) ;GET TYPE FROMLOCATED BLOCK ; UNAL2: DEC (HL) ;RCOUNT = RCOUNT-1 CALL HOSTCMP ;TEST IF STILL IN SAME HOST SECTOR JR Z,UNAL4 ;PUT RECO RET NZ LD HL,(TRACK) LD DE,(HSTTRK) OR A SBC HL,DE RET NZ LD A,(DISK) LD HL,HSTDSK CP (HL) RET ; ; ;MBER +1 BIAS AND (IX+SECMSK) ;MASK SECTOR# OFF TO GET BUFFER INDEX LD H,0 LD L,A ADD HL,HL ADD HL,HL ADD HL,HL ADDF LD (HSTPTR),HL XOR A LD (WRTACT),A CALL DOIT ;WRITE SECTOR TO DISK RET ; ; ; RW128: LD HL,NEW LD DE,HOST AL5 JR Z,UNAL5 LD (HL),1 ;RESET TO SECTOR# 1 AND BUMP TRACK# LD HL,(NXTTRK) INC HL LD (NXTTRK),HL UNAL5: XOR A RET MONITOR RAM SKTLP: SRL A ;PUT DISK FLAG IN CARRY DJNZ SKTLP POP BC RET ENDIF PAGE ;*************************RD INTO BUFFER IF NOT FULL CALL WRITEHST ;WRITE HOST SECTOR FROM BUFFER RET NZ ;EXIT IF DISK ERROR UNAL3: LD A,(SECTMP ; FLUSH: XOR A LD (RDACT),A ;FLAG BUFFERED READ AS INACTIVE LD (RCOUNT),A ;TERMINATE ANY WRITE TO UNALLOCATED LD A,(WJ LD BC,6 LDIR ;FALL THROUGH INTO 'DOIT' ; ; ... MASTER DISK READ/WRITE ROUTINE ... ; ; CALL WITH IX POINTING TO DISK PARAMSG CALL PMSG ;PRINT OUT START OF MESSAGE LD BC,08FFH ;B=LOOPCOUNT C=255 FOR CPIR SCAN LD A,E REP2: RLA JR C,REP3 4 CALL REPORT ;REPORT SEEK ERROR TO CONSOLE JR Z,DOFLP2 RET ;RETURN PERMANENT ERROR IF INDICATED ; DOFLP4: LD HL,(HSTRET ; ; PDIGIT: LD C,-1 PDIG1: INC C SUB B JR NC,PDIG1 ADD A,B PUSH AF LD A,C OR A CALL NZ,PNUM ;PRINT NUMEC,A CALL CKTYPE LD A,C JR NC,DFLP2A CP N8TRAKS JR DFLP2B DFLP2A: CP N5TRAKS DFLP2B: ELSE CP NTRAKS ;TEST;RETURN PERMANENT BIOS ERROR ; ; ; ; CHARACTER STRING OUTPUT ROUTINE. PRINTS ASCII DATA ; POINTED TO BY HL UNTIL A DOLLAR SMETER TABLES ; AND ACC CONTAINING R/W OPERATION INDICATOR. ; ; DOIT: LD (RWFLAG),A ;STORE RWFLAG 1=READ 0=WRITE IF WIPUSH AF XOR A CPIR ;SCAN MEMORY LOOKING FOR NULL POP AF DJNZ REP2 REP3: CALL PMSG ;PRINT ERROR TYPE STRING LD A,E PTR) LD A,(HSTSEC) LD C,A LD A,(RWFLAG) OR A ;TEST DIRECTION 1=READ 0=WRITE JR Z,DOFLP5 CALL MONITR+36 JR DOFLRIC CHARACTER IF NON-ZERO POP AF RET ; ; ; ; ; ; NULL EQU 00H ;NULL (END-OF-STRING INDICATOR) LF EQU 0AH ;LINE FE IF TRACK# IS ON OTHER SIDE ENDIF JR C,DOFLP3 LD B,SIDSEL+ON ;SELECT OPPOSITE SIDE ; IF MIXED LD C,A CALL CKTYPE IGN IS ENCOUNTERED ; PMSG: LD A,(HL) ;HL POINTS TO ASCII STRING INC HL OR A ;TEST FOR BYTE EQUAL ZERO RET Z LD C,A NCH LD A,(HSTDSK) CP NFLOPPY JP NC,DOWINCH ;DO SASI DISK ROUTINE IF ON HARD DISK ENDIF DOFLOP: LD A,(HSTDSK) LD C,A  AND 11000000B ;MASK TO NOT-READY AND WRITE-PROTECT JR NZ,REP5 LD HL,TSMSG CALL PMSG LD A,(HSTTRK) CALL PUTDEC CAP6 ; DOFLP5: CALL MONITR+39 DOFLP6: RET Z ;RETURN IF READ/WRITE SUCCESSFUL CALL REPORT JR Z,DOFLP4 ;TRY AGAIN IF INDICATED CR EQU 0DH ;CARRIAGE RETURN DSKMSG: DEFB CR,LF DEFB 'BIOS error on A: ',NULL DEFB 'not ready',NULL DEFB 'wrt pLD A,C JR NC,DFLP2C SUB N8TRAKS JR DFLP2D DFLP2C: SUB N5TRAKS DFLP2D: ELSE SUB NTRAKS ;CONVERT TRACK# TO REAL VAL;PRINT CHARACTER IF NOT DOLLAR SIGN CALL OVEC JR PMSG ; ; ; ; PRINT CONTENTS OF A IN DECIMAL (RANGE 0..255) ; PUTDEC:  CALL MONITR+27 ;SELECT SPECIFIED DRIVE JR Z,DOFLP2 CALL REPORT ;REPORT SELECT ERROR TO CONSOLE JR Z,DOFLOP RET ;RETULL PMSG LD A,(HSTSEC) CALL PUTDEC LD A,1 OR A RET ; REP5: LD HL,PROMPT CALL PMSG CALL IVEC ;LOOP FOR CONSOLE INED RET ; ; ; ; REPORT: LD E,A ;SAVE PERTINENT ERROR BITS IN E LD A,(HSTDSK) ADD A,'A' LD (DSKMSG+16),A LD HL,DSKrotect',NULL DEFB 'wrt fault',NULL DEFB 'not found',NULL DEFB 'bad crc',NULL DEFB 'overrun',NULL DEFB 'drq',NULL DEFUE ENDIF DOFLP3: LD C,A LD A,B OUT (PORT0),A ;OUTPUT SIDE SELECT BIT CALL MONITR+33 ;SEEK SELECTED TRACK JR Z,DOFLP LD B,100 CALL PDIGIT ;PRINT HUNDREDS DIGIT LD B,10 CALL PDIGIT ;PRINT TENS DIGIT PNUM: OR '0' LD C,A CALL OVEC RN PERMANENT ERROR IF NOT ZERO ; DOFLP2: LD B,SIDSEL+OFF ;DEFAULT TO SELECT DISK SIDE ZERO LD A,(HSTTRK) ; IF MIXED LD PUT CP 'C'-64 JR Z,REP6 XOR A RET ; REP6: XOR A LD (IOBYTE+1),A ;CLEAR AUTO-LOG BYTE IF CTL-C ABORT INC A RET K B 'busy',NULL DEFB NULL TSMSG: DEFB ' track ',NULL DEFB ' sector ',NULL PROMPT: DEFB ' ?','H'-64,NULL ; ; ; ; ;of tagged files = k (k) Total of tagged files = ( hhh hhhhchQhhhehame?(Y/N)YO.K. to rename Renaming ====> . ? Old name: New name: is R/O. Delete anyway?(Y/N) Deleted. Delete? (Y/N):ErasRm]m^m`mbmdm Stream/Record Sequen/Direkk kk k k!kh0k3k+k:k+k+k+kfkwkfk}k ih i i02ie+hh<h> O 9i  d@iHi ./Xi-&')*+(%128dxie tagged or untagged files? (T/U) : Do you wish to be prompted? (Y/N) : NType A at prompt to abort.Erase ?(Y/N/A)Erasing $isct Input/Output Keyed Access P< $conmmw`mfmtmmmmmmm mmmmm m Erase all tagged/untagged files.L: Login new disk and user and reset system.M: Mass copy of tagged files with optional verifykfkkkkfkkkkkfkkkikkkkkkkkkkkkokkiiiihiGfi R/O. File not copied. is R/O. File not copied. Out of directory spaceCopying =====> with verification CRC check failed. Ernmm nmmn.dat'n(n@n!n"nJnLnSnNn.R: Rename file(s).S: Space remaining on disk.T: Tag file for transfer.U: Untag a file.V: View a file at console.X: Exit tl lkc'lh#l%l5l5lYlclYlKlYl|llj j!j j*j-j`j/jyjror. Disk full. Warning: source = target. Re-log drive for an accurate directory. drive0123456789#****Aborted.Tagging Total o CP/M.?: Redisplay menu.sp or cr: Next file.Drive New name or * : Cannot rename. already exists.File is R/O. Okay to renll`llll`ll Invalid Format Item/jDj\j\jjfPj\jjL ,o