CP/M MACRO ASSEM 2.0 #001 *** Cbios For CP/M Ver. 2.2 *** ***************************************************************** * * * FIRMWARE FOR DISK JOCKEY MODEL B. * * * ***************************************************************** TITLE '*** Disk Jockey Model B Firmware ***' E000 = ORIGIN EQU 0E000H E000 ORG ORIGIN E400 = RAM EQU ORIGIN+400H E3F8 = IO EQU ORIGIN+3F8H E3F8 = UDATA EQU IO E3F9 = DREG EQU IO+1 E3F9 = USTAT EQU IO+1 E3FA = DCMD EQU IO+2 E3FA = DSTAT EQU IO+2 E3FB = CSTALL EQU IO+3 E3FC = CMDREG EQU IO+4 E3FC = CSTAT EQU IO+4 E3FD = TRKREG EQU IO+5 E3FE = SECREG EQU IO+6 E3FF = DATREG EQU IO+7 0001 = LIGHT EQU 1 0001 = HEAD EQU 1 0001 = DENSITY EQU 1 0004 = INTRQ EQU 4 0004 = ISTAT EQU 4 0004 = TZERO EQU 4 0004 = LOAD EQU 4 0006 = ULOAD EQU 6 0008 = OSTAT EQU 10Q 0008 = DSIDE EQU 10Q 0009 = NOLITE EQU 11Q 0009 = DCRINT EQU 11Q 0009 = HCMD EQU 11Q 0010 = INDEX EQU 20Q 0012 = WINDXD EQU 22Q 0018 = SKCMD EQU 30Q 001A = RINDXD EQU 32Q 001D = SVCMD EQU 35Q 0040 = WPROT EQU 100Q 0040 = ACCESS EQU 100Q 0080 = RSTBIT EQU 200Q 0080 = JREADY EQU 200Q 0080 = RDCMD EQU 200Q 00A0 = WRCMD EQU 240Q 00C0 = STBITS EQU 300Q 00C4 = RACMD EQU 304Q 00D0 = CLRCMD EQU 320Q E000 C369E0 DBOOT JMP BOOT E003 C3E9E0 TERMIN JMP CIN CP/M MACRO ASSEM 2.0 #002 *** Cbios For CP/M Ver. 2.2 *** E006 C3DAE0 TRMOUT JMP JCOUT E009 C35AE1 TKZERO JMP JHOME E00C C38BE1 TRKSET JMP SEEK E00F C381E1 JSECT JMP SECSET E012 C343E1 JDMA JMP DMA E015 C3DDE1 DREAD JMP JREAD E018 C3BCE1 DWRITE JMP JWRITE E01B C33CE1 SELDRV JMP DRIVE E01E C3F8E0 TPANIC JMP CPAN E021 C303E1 TSTAT JMP TMSTAT E024 C334E1 DMAST JMP DMSTAT E027 C309E1 STATUS JMP DISKST E02A C3C5E0 DSKERR JMP LERROR E02D C3B3E3 SETDEN JMP DENFIX E030 C3E5E3 SETSID JMP SIDEFX E033 DS 66Q E069 31FAE7 BOOT LXI SP,TRACK+1 ;INITIALIZE SP E06C CDD2E3 CALL TIMOUT ;POC/RESET TIMEOUT E06F 210100 LXI H,1 E072 E5 PUSH H ;TRACK 0, SECTOR 1 E073 2E09 MVI L,DCRINT ;SET UP THE E075 E5 PUSH H ; SIDE SELECT E076 26FF MVI H,377Q ; AND INITIAL E078 E5 PUSH H ; DRIVE E079 E5 PUSH H ; PARAMETERS E07A E5 PUSH H E07B E5 PUSH H E07C 210800 LXI H,10Q ;INITIALIZE E07F E5 PUSH H ; TZFLAG & CDISK E080 2E7E MVI L,176Q ;INITIALIZE E082 E5 PUSH H ; DISK & DRVSEL E083 2E08 MVI L,10Q ;INITIALIZE E085 E5 PUSH H ; HDFLAG & DSFLAG E086 2618 MVI H,30Q ;INITIALIZE E088 E5 PUSH H ; TIMER CONSTANT E089 3E7F MVI A,177Q ;START 1791 E08B 32F9E3 STA DREG E08E 3ED0 MVI A,CLRCMD ;1791 RESET E090 32FCE3 STA CMDREG LDHEAD E093 AF XRA A ;LOAD THE HEAD E094 CD1BE3 CALL HDCHK ; AND TEST FOR E097 D2A5E0 JNC DOOROK ; DRIVE READY E09A 3E01 MVI A,LIGHT ;TURN ON THE E09C 32F6E7 STA DCREG ; ERROR LED E09F CDD2E3 CALL TIMOUT ;TIMEOUT TO E0A2 C393E0 JMP LDHEAD ; CLOSE DRIVE DOOR DOOROK E0A5 3E09 MVI A,NOLITE ;TURN OFF THE E0A7 32F6E7 STA DCREG ; ERROR LED E0AA CD96E3 CALL MEASUR ;HEAD LOAD TIME E0AD C1 POP B ;ADJUST THE STACK E0AE 0100E7 LXI B,RAM+300H ;DMA ADDR CP/M MACRO ASSEM 2.0 #003 *** Cbios For CP/M Ver. 2.2 *** E0B1 C5 PUSH B ;INITIALIZE E0B2 D5 PUSH D ; DMAADR & TIMER E0B3 210000 LXI H,0 ;INITIALIZE E0B6 E5 PUSH H ; INTRFG & RAMINS E0B7 00 NOP ;DEBUG INSTRUCTION E0B8 C5 PUSH B ;BOOT ADDRESS E0B9 060C MVI B,12 ;NUMBER OF RETRYS LDLOOP E0BB C5 PUSH B ;SAVE THE RETRY NO. E0BC CDDDE1 CALL JREAD ;READ BOOT SECTOR E0BF C1 POP B ;RESTOR RETRY NO. E0C0 D0 RNC ;SUCCESSFUL READ? E0C1 05 DCR B ;NO - COUNT DOWN E0C2 C2BBE0 JNZ LDLOOP ; AND TRY AGAIN LERROR E0C5 0E09 MVI C,11Q E0C7 11C3A2 LXI D,0A2C3H LELOOP E0CA 1B DCX D E0CB 7A MOV A,D E0CC B3 ORA E E0CD C2CAE0 JNZ LELOOP E0D0 3E08 MVI A,10Q ;BLINK E0D2 A9 XRA C ; THE LED AT E0D3 4F MOV C,A ; TOP OF THE E0D4 32FAE3 STA DCMD ; CIRCUIT BOARD E0D7 C3C7E0 JMP LERROR+2 JCOUT E0DA 3AF9E3 LDA USTAT ;GET UART STATUS E0DD E608 ANI OSTAT ;OUTPUT READY MASK E0DF C2DAE0 JNZ JCOUT ;TEST BUFFER EMPTY E0E2 79 MOV A,C ;CHARACTER DATA E0E3 2F CMA ;NEGATIVE LOGIC BUS E0E4 32F8E3 STA UDATA ;SEND DATA TO UART E0E7 2F CMA ;MAKE POSITIVE E0E8 C9 RET CIN E0E9 3AF9E3 LDA USTAT ;GET UART STATUS E0EC E604 ANI ISTAT ;INPUT READY MASK E0EE C2E9E0 JNZ CIN ;WAIT FOR INPUT E0F1 3AF8E3 LDA UDATA ;GET THE CHARACTER E0F4 2F CMA ;ADJUST FOR NEGATIVE BUS E0F5 E67F ANI 177Q ;TRIM TO 7 BITS E0F7 C9 RET CPAN E0F8 3AF9E3 LDA USTAT ;GET UART STATUS E0FB E604 ANI ISTAT ;INPUT READY MASK E0FD C0 RNZ ;TEST FOR DATA E0FE CDE9E0 CALL CIN ;GET CHARACTER E101 B9 CMP C ;TEST FOR PANIC CHTR E102 C9 RET TMSTAT E103 3AF9E3 LDA USTAT ;GET UART STATUS CP/M MACRO ASSEM 2.0 #004 *** Cbios For CP/M Ver. 2.2 *** E106 E604 ANI ISTAT ;INPUT READY MASK E108 C9 RET DISKST E109 21FDE3 LXI H,TRKREG ;MOST RECENT E10C 4E MOV C,M ; TRACK TO C E10D 23 INX H ;MOST RECENT E10E 46 MOV B,M ; SECTOR TO B E10F 3AF6E7 LDA DCREG ;GET CURRENT E112 2F CMA ; DENSITY IN E113 E601 ANI 1 ; THE MSB E115 0F RRC ; POSITION E116 57 MOV D,A ;SAVE IN D E117 3AF7E7 LDA SIDE ;PUT THE E11A 07 RLC ; MOST RECENT E11B 07 RLC ; SIDE SELECT E11C 07 RLC ; IN BIT POSITIN E11D B2 ORA D ; 6 AND MERGE E11E 57 MOV D,A ;SAVE IN D E11F 3AE8E7 LDA DSFLAG ;GET THE E122 EE08 XRI DSIDE ; MOST RECENT E124 17 RAL ; DOUBLE SIDED E125 17 RAL ; STATUS AND PLACE E126 82 ADD D ; IN BIT POSITION E127 57 MOV D,A ; 5 AND MERGE E128 3AFDE7 LDA SECLEN ;GET THE E12B 17 RAL ; SECTOR LENGTH E12C 17 RAL ; CODE BITS IN E12D B2 ORA D ; POSITIONS 2 & 3 E12E 57 MOV D,A ; AND MERGE E12F 3AECE7 LDA JCDISK ;GET THE CURRENT E132 82 ADD D ; DISK NO. IN BIT E133 C9 RET ; POSITIONS 0 & 1 DMSTAT E134 E5 PUSH H ;SAVE THE HL PAIR E135 2AE6E7 LHLD DMAADR ;MOVE THE E138 44 MOV B,H ; DMA ADDRESS TO E139 4D MOV C,L ; THE BC PAIR E13A E1 POP H ;RECOVER HL E13B C9 RET DRIVE E13C 79 MOV A,C ;DRIVE SELECT E13D E603 ANI 3 ; VALUES MUST BE E13F 32EBE7 STA DISK ; BETWEEN ZERO E142 C9 RET ; AND THREE DMA E143 21001C LXI H,-RAM ;TEST THE E146 09 DAD B ; DMA ADDRESS E147 DA54E1 JC DMASET ; FOR CONFLICT E14A 210820 LXI H,8-ORIGIN E14D 09 DAD B ; WITH THE I/O E14E D254E1 JNC DMASET ; ON THE DJ/2D E151 3E10 MVI A,20Q ; CONTROLLER CP/M MACRO ASSEM 2.0 #005 *** Cbios For CP/M Ver. 2.2 *** E153 C9 RET DMASET E154 60 MOV H,B ;STORE THE E155 69 MOV L,C ; BC PAIR E156 22E6E7 SHLD DMAADR E159 C9 RET JHOME E15A CDE3E2 CALL HDLOAD ;LOAD THE HEAD E15D D8 RC ;NOT READY ERROR E15E CD70E1 CALL HENTRY ;MOVE THE HEAD E161 F5 PUSH PSW ;SAVE STATUS E162 9F SBB A ;UPDATE THE E163 32F9E7 STA TRACK ; TRACK E166 32FDE3 STA TRKREG ; REGISTERS E169 AF XRA A ;SET THE NOT E16A 32EDE7 STA TZFLAG ; VERIFIED FLAG E16D C323E2 JMP LEAVE+1 ;UNLOAD THE HEAD HENTRY E170 AF XRA A ;SET THE FORCE E171 32E9E7 STA HDFLAG ; VERIFY FLAG E174 210000 LXI H,0 ;TIMEOUT CONSTANT E177 3E09 MVI A,HCMD ;MOVE THE HEAD E179 CD62E3 CALL CENTRY ;TO TRACK 0 E17C E604 ANI TZERO ;TRACK ZERO BIT E17E C0 RNZ E17F 37 STC ;ERROR FLAG E180 C9 RET SECSET E181 AF XRA A ;TEST FOR E182 B1 ORA C ; ZERO VALUE E183 37 STC ;ERROR FLAG E184 C8 RZ ;ERROR RETURN E185 E61F ANI 37Q ;TRIM & CLEAR CRY E187 32F8E7 STA SECTOR E18A C9 RET SEEK E18B 79 MOV A,C ;TEST FOR E18C FE4D CPI 77 ; TRACK E18E 3F CMC ; TOO LARGE E18F D8 RC E190 32F9E7 STA TRACK E193 C9 RET E194 32E3E7 ISSUE STA ECOUNT+1 ;UPDATE COUNT E197 CD96E3 CALL MEASUR ;FIND INDEX E19A 0E01 MVI C,1 ;START WITH SECTOR 1 ISLOOP E19C 79 MOV A,C ;INITILIZE THE E19D 32FEE3 STA SECREG ; SECTOR REGISTER E1A0 3AF8E7 LDA SECTOR ;TEST FOR E1A3 B9 CMP C ; TARGET SECTOR E1A4 C8 RZ E1A5 3E80 MVI A,RDCMD ;DO A FAKE CP/M MACRO ASSEM 2.0 #006 *** Cbios For CP/M Ver. 2.2 *** E1A7 CD5DE3 CALL COMAND ; READ COMMAND E1AA DA20E2 JC PLEAVE ;ABORT ON ERROR E1AD 0C INR C ;INCREMENT SECTOR NUMBER E1AE C39CE1 JMP ISLOOP E1B1 32FCE3 COMNDP STA CMDREG ;START OPERATION E1B4 48 MOV C,B ;INITILIZE BLOCK COUNT E1B5 11FFE3 LXI D,DATREG ;DATA REGISTER E1B8 2AE6E7 LHLD DMAADR ;TRANSFER ADDRESS E1BB C9 RET JWRITE E1BC CD33E2 CALL JPREP ;PREPARE FOR WRITE E1BF DA22E2 JC LEAVE ;ABORT OPERATION WRENTRY E1C2 3EA0 MVI A,WRCMD ;WRITE SECTOR CMD E1C4 CDB1E1 CALL COMNDP WRLOOP E1C7 7E MOV A,M ;LOAD 1ST BYTE OF DATA E1C8 23 INX H E1C9 12 STAX D ;WRITE 1ST BYTE OF DATA E1CA 7E MOV A,M ;LOAD 2ND BYTE OF DATA E1CB 23 INX H E1CC 12 STAX D ;WRITE 2ND BYTE OF DATA E1CD 7E MOV A,M ;LOAD 3RD BYTE OF DATA E1CE 23 INX H E1CF 12 STAX D ;WRITE 3RD BYTE OF DATA E1D0 0D DCR C ;REDUCE BLOCK COUNT E1D1 7E MOV A,M E1D2 23 INX H E1D3 12 STAX D E1D4 C2C7E1 JNZ WRLOOP ;WRITE NEXT 4 BYTES E1D7 21C2E1 LXI H,WRENTRY E1DA C3FBE1 JMP CBUSY JREAD E1DD CD33E2 CALL JPREP ;PREPARE FOR READ E1E0 DA22E2 JC LEAVE ;ABORT OPERATION RDENTRY E1E3 3E80 MVI A,RDCMD E1E5 CDB1E1 CALL COMNDP RDLOOP E1E8 1A LDAX D ;READ 1ST BYTE E1E9 77 MOV M,A ;STORE 1ST BYTE E1EA 23 INX H E1EB 1A LDAX D ;READ 2ND BYTE E1EC 77 MOV M,A ;STORE 2ND BYTE E1ED 23 INX H E1EE 1A LDAX D ;READ 3RD BYTE E1EF 77 MOV M,A ;STORE 3RD BYTE E1F0 23 INX H E1F1 0D DCR C ;REDUCE BLOCK COUNT E1F2 1A LDAX D ;READ 4TH BYTE E1F3 77 MOV M,A ;STORE 4TH BYTE E1F4 23 INX H E1F5 C2E8E1 JNZ RDLOOP ;READ NEXT 4 BYTES CP/M MACRO ASSEM 2.0 #007 *** Cbios For CP/M Ver. 2.2 *** E1F8 21E3E1 LXI H,RDENTRY CBUSY E1FB E5 PUSH H ;SAVE RETURN E1FC 21FCE3 LXI H,CSTAT ;WAIT FOR 1791 E1FF CD6CE3 CALL BUSY ; TO FINISH COMMAND E202 E65F ANI 137Q ;ERROR MASK E204 CA21E2 JZ LEAVE-1 ;NO ERROR E207 FE10 CPI 20Q ;PREMATURE INTERUPT E209 C220E2 JNZ PLEAVE ;OTHER TYPE OF ERROR E20C 3AE2E7 LDA ECOUNT ;DECREMENT ERROR COUNT E20F 3D DCR A ; BY ONE E210 FA17E2 JM STEST ;HARD INTERUPT ERROR E213 32E2E7 STA ECOUNT ;UPDATE COUNT E216 C9 RET STEST E217 3AE3E7 LDA ECOUNT+1 ;DECREMENT ERROR E21A 3D DCR A E21B F294E1 JP ISSUE E21E 3E10 MVI A,20Q PLEAVE E220 37 STC ;ERROR FLAG E221 E1 POP H LEAVE E222 F5 PUSH PSW ;SAVE THE STATUS E223 3AF6E7 LDA DCREG ;CONTROL BITS E226 EE04 XRI LOAD ;TOGGLE THE E228 32FAE3 STA DCMD ; HEAD LOAD BIT E22B 3AEAE7 LDA DRVSEL ;ENABLE ACCESS TO E22E 32F9E3 STA DREG ; THE DATA REGISTER E231 F1 POP PSW ;RECOVER THE STATUS E232 C9 RET JPREP E233 CDE3E2 CALL HDLOAD ;LOAD THE HEAD E236 D8 RC ;TEST FOR DRIVE READY E237 3AFDE3 LDA TRKREG ;GET OLD TRACK E23A 3C INR A ;TEST FOR HEAD E23B CC70E1 CZ HENTRY ; NOT CALIBRATED E23E D8 RC ;SEEK ERROR? E23F 21FDE3 LXI H,TRKREG ;OLD TRACK E242 3AF9E7 LDA TRACK ;NEW TRACK E245 BE CMP M ;TEST FOR HEAD MOTION E246 23 INX H ;ADVANCE TO THE E247 23 INX H ; DATA REGISTER E248 77 MOV M,A ;SAVE NEW TRACK E249 79 MOV A,C ;TURN OFF DATA REG E24A 32F9E3 STA DREG ; ACCESS CONTROL BIT E24D CA6AE2 JZ TVERFY ;TEST FOR SEEK E250 AF XRA A ;FORCE A READ E251 32E9E7 STA HDFLAG ; HEADER OPERATION E254 3AFAE3 LDA DSTAT ;GET THE DOUBLE E257 E608 ANI DSIDE ; SIDED FLAG E259 32E8E7 STA DSFLAG ;SAVE FOR STATUS E25C 1F RAR ;SHIFT FOR CP/M MACRO ASSEM 2.0 #008 *** Cbios For CP/M Ver. 2.2 *** E25D 1F RAR ; 3/6 MS STEP E25E 1F RAR ; RATE CONSTANT E25F C618 ADI SKCMD ;DO A E261 210000 LXI H,0 ; SEEK E264 CD62E3 CALL CENTRY ; OPERATION E267 DA8EE2 JC SERROR ;SEEK ERROR? TVERFY E26A 3AE9E7 LDA HDFLAG ;GET THE FORCE E26D B7 ORA A ; VERIFY HDR FLAG E26E C2B9E2 JNZ CHKSEC ;NO SEEK & HEAD OK E271 0602 MVI B,2 ;VERIFY RETRY COUNT SLOOP E273 3E1D MVI A,SVCMD ;DO A VERIFY E275 CD5DE3 CALL COMAND ; COMMAND E278 E699 ANI 231Q ;ERROR BIT MASK E27A 57 MOV D,A ;SAVE E27B CA95E2 JZ RDHDR ;NO ERROR E27E 3AF6E7 LDA DCREG ;DENISTY CONTROL E281 EE01 XRI DENSITY ;FLIP THE DENSITY E283 32F6E7 STA DCREG ;UPDATE AND E286 32FAE3 STA DCMD ; CHANGE DENSITY E289 05 DCR B ;DECREMENT RETRY E28A C273E2 JNZ SLOOP ; COUNT & TEST E28D 7A MOV A,D SERROR E28E 37 STC E28F F5 PUSH PSW E290 CD70E1 CALL HENTRY E293 F1 POP PSW E294 C9 RET RDHDR E295 060A MVI B,12Q ;NUMBER OF RETRYS RHLOOP E297 11FFE3 LXI D,DATREG ;DATA REGISTER E29A 21FAE7 LXI H,TRACK+1 ;DATA POINTER E29D 3EC4 MVI A,RACMD ;START READ HEADER COMMAND E29F 32FCE3 STA CMDREG RHL1 E2A2 1A LDAX D ;GET DISK DATA 0 E2A3 77 MOV M,A ;STORE IN MEM E2A4 2C INR L ;ADVANCE POINTER E2A5 C2A2E2 JNZ RHL1 ;TEST END OF PAGE E2A8 21FCE3 LXI H,CSTAT ;WAIT FOR 1791 E2AB CD6CE3 CALL BUSY ; TO FINISH CMD E2AE B7 ORA A ;TEST FOR ERRORS E2AF CAB9E2 JZ CHKSEC ;TRANSFER OK? E2B2 05 DCR B ;NO - TEST FOR E2B3 C297E2 JNZ RHLOOP ; HARD ERROR E2B6 C38EE2 JMP SERROR ;RECALIBRATE CHKSEC E2B9 3AFDE7 LDA SECLEN ;GET THE SECTOR E2BC 4F MOV C,A ; SIZE AND SETUP E2BD 0600 MVI B,0 ; THE TABLE OFFSET E2BF 21DFE2 LXI H,STABLE ;SECTOR TABLE E2C2 09 DAD B ;SECTOR SIZE PNTR E2C3 3AF8E7 LDA SECTOR ;GET THE SECTOR CP/M MACRO ASSEM 2.0 #009 *** Cbios For CP/M Ver. 2.2 *** E2C6 47 MOV B,A ; AND SAVE IN B E2C7 86 ADD M ;COMPARE W/TABLE E2C8 3E10 MVI A,20Q ;ERROR FLAG E2CA D8 RC ;ERROR RETURN E2CB 78 MOV A,B ;INITIALIZE 1791 E2CC 32FEE3 STA SECREG ; SECTOR REGISTER E2CF 3E20 MVI A,40Q ;128 BYTE SECTOR E2D1 210505 LXI H,505H E2D4 22E2E7 SHLD ECOUNT SZLOOP E2D7 0D DCR C ;REDUCE SIZE COUNT E2D8 47 MOV B,A ;SECTOR SIZE TO B E2D9 F8 RM ;RETURN ON MINUS E2DA 17 RAL ;DOUBLE THE COUNT E2DB B7 ORA A ;CLEAR THE CARRY E2DC C3D7E2 JMP SZLOOP STABLE E2DF E5 DB 345Q ;26 SECTOR DISKETTES E2E0 E5 DB 345Q ;26 SECTOR DISKETTES E2E1 F0 DB 360Q ;15 SECTOR DISKETTES E2E2 F7 DB 367Q ;8 SECTOR DISKETTES HDLOAD E2E3 21EBE7 LXI H,DISK ;NEW DRV PTR E2E6 4E MOV C,M ;SAVE NEW DRV IN C E2E7 23 INX H ;CURRENT DRV PTR E2E8 5E MOV E,M ;SAVE OLD DRV IN E E2E9 71 MOV M,C ;UPDATE CURRENT DRV E2EA 23 INX H ;HOME CMD FLAG E2EB 7B MOV A,E ;TEST FOR E2EC B9 CMP C ; DRIVE CHANGE E2ED 7E MOV A,M ;HEAD LOAD MASK E2EE 3601 MVI M,HEAD ;UPDATE THE MASK E2F0 CA1BE3 JZ HDCHK ;NO DRIVE CHANGE? E2F3 23 INX H ;ADDR OF DRIVE TABLE E2F4 E5 PUSH H ;SAVE TABLE ADDR E2F5 1600 MVI D,0 ;SET UP THE E2F7 42 MOV B,D ; OFFSET ADDRESS E2F8 19 DAD D ;CALCULATE THE E2F9 19 DAD D ; PARAMETER ADDR E2FA 3AF6E7 LDA DCREG ;SAVE THE E2FD 77 MOV M,A ;DENSITY STATUS E2FE 23 INX H ;TRACK POINTER E2FF 11FDE3 LXI D,TRKREG ;1791 TRK REG E302 1A LDAX D ;GET CURRENT TRACK E303 77 MOV M,A ;SAVE IN THE TABLE E304 E1 POP H ;BEGINNING OF TABLE E305 09 DAD B ;NEW DRIVE E306 09 DAD B ; TABLE POINTER E307 7E MOV A,M ;GET DENSITY STATUS E308 32F6E7 STA DCREG ;UPDATE DCREG E30B 23 INX H ;GET THE OLD E30C 7E MOV A,M ; TRACK NUMBER E30D 12 STAX D ; AND UPDATE 1791 E30E 3E7F MVI A,177Q ;DRIVE SELECT BITS DSROT CP/M MACRO ASSEM 2.0 #010 *** Cbios For CP/M Ver. 2.2 *** E310 07 RLC ;ROTATE TO E311 0D DCR C ; SELECT THE E312 F210E3 JP DSROT ; PROPER DRIVE E315 E67F ANI 177Q ;SET THE RUN BIT E317 32EAE7 STA DRVSEL ;SAVE IN DRV REG E31A AF XRA A ;FORCE A HEAD LOAD HDCHK E31B 21FAE3 LXI H,DSTAT ;TEST FOR E31E A6 ANA M ; HEAD LOADED E31F 32E9E7 STA HDFLAG ;SAVE THE HEAD E322 F5 PUSH PSW ; LOADED STATUS E323 3AEAE7 LDA DRVSEL ;GET CURRENT DRIVE E326 4F MOV C,A ;SAVE E327 3AF7E7 LDA SIDE ;GET CURRENT SIDE E32A 2F CMA ; AND MERGE E32B A1 ANA C ; WITH DRIVE SELECT E32C 32F9E3 STA DREG ;SELECT DRIVE & SIDE E32F EE40 XRI ACCESS ;TOGGLE ACCESS BIT E331 4F MOV C,A ;SAVE FOR PREP ROUTINE E332 3AF6E7 LDA DCREG ;DEN & HEAD CNTL BITS E335 47 MOV B,A ;SAVE E336 3AF9E7 LDA TRACK ;GET THE NEW TRACK E339 D601 SUI 1 ;FORCE SINGLE E33B 9F SBB A ; DENSITY E33C 3D DCR A ; IF TRACK = 0 E33D 2F CMA ;COMPLIMENT E33E B0 ORA B ;MERGE W/CONTROL BITS E33F 77 MOV M,A ;LOAD HEAD & SET DENSITY E340 F1 POP PSW ;HEAD LOAD STATUS E341 C24FE3 JNZ RDYCHK ;CONDITIONALLY E344 E5 PUSH H ; WAIT FOR HEAD E345 2AE4E7 LHLD TIMER ; LOAD TIME OUT TLOOP E348 2B DCX H ;COUNT DOWN E349 7C MOV A,H ; 40 MS FOR E34A B5 ORA L ; HEAD LOAD E34B C248E3 JNZ TLOOP ; TIME OUT E34E E1 POP H RDYCHK E34F 7E MOV A,M ;TEST FOR E350 E680 ANI JREADY ; DRIVE READY E352 C0 RNZ UNLOAD E353 3AF6E7 LDA DCREG ;FORCE A E356 F606 ORI ULOAD ; HEAD E358 77 MOV M,A ; UNLOAD E359 3E80 MVI A,JREADY ;SET DRIVE E35B 37 STC ; NOT READY E35C C9 RET ; ERROR FLAG COMAND E35D 2AE4E7 LHLD TIMER ;GET INDEX COUNT E360 29 DAD H ; AND MULTIPLY E361 29 DAD H ; BY FOUR CENTRY E362 EB XCHG ;SAVE IN D-E PAIR CP/M MACRO ASSEM 2.0 #011 *** Cbios For CP/M Ver. 2.2 *** E363 21FCE3 LXI H,CSTAT ;ISSUE COMMAND E366 77 MOV M,A ; TO THE 1791 NBUSY E367 7E MOV A,M ;WAIT E368 1F RAR ; FOR THE E369 D267E3 JNC NBUSY ; BUSY FLAG BUSY E36C 7E MOV A,M ;TEST FOR E36D 1F RAR ; DEVICE BUSY E36E 7E MOV A,M ;RESTORE STATUS E36F D0 RNC ;RETURN IF NOT BUSY E370 C376E3 JMP PATCH+3 ;JUMP AROUND PATCH PATCH E373 C3E3E2 JMP HDLOAD ;PATCH FOR OLD ATE E376 1B DCX D ;TEST FOR E377 7A MOV A,D ; TWO DISK E378 B3 ORA E ; REVOLUTIONS E379 C26CE3 JNZ BUSY ;47 MACHINE CYCLES E37C 5E MOV E,M ;GET ERROR CODE E37D E5 PUSH H ;SAVE CMD ADDRESS E37E 23 INX H ;TRACK REGISTER E37F 56 MOV D,M ;SAVE PRESENT TRACK E380 3AEAE7 LDA DRVSEL ;CONTROL BITS E383 EE80 XRI RSTBIT ;RESET THE 1791 E385 32F9E3 STA DREG ; CONTROLLER TO E388 EEC0 XRI STBITS ; CLEAR THE E38A E3 XTHL ; COMMAND BUSY E38B 32F9E3 STA DREG ; FAULT CONDITION E38E 36D0 MVI M,CLRCMD ;FORCE INTERRUPT E390 E3 XTHL ;RESTORE THE E391 72 MOV M,D ; THE TRACK REG E392 E1 POP H ;RESTORE THE STACK E393 7B MOV A,E ;ERROR CODE TO A E394 37 STC ; ERROR FLAG E395 C9 RET MEASUR E396 110000 LXI D,0 ;INITIALIZE COUNT E399 21FAE3 LXI H,DSTAT ;STATUS PORT E39C 0E10 MVI C,INDEX ;INDEX BIT FLAG INDXLO E39E 7E MOV A,M ;WAIT FOR E39F A1 ANA C ; INDEX E3A0 CA9EE3 JZ INDXLO ; PULSE HIGH INDXHI E3A3 7E MOV A,M ;WAIT FOR E3A4 A1 ANA C ; INDEX E3A5 C2A3E3 JNZ INDXHI ; PULSE LOW INDXCT E3A8 13 INX D ;ADVANCE COUNT E3A9 E3 XTHL ;FOUR DUMMY E3AA E3 XTHL ; INSTRUCTIONS E3AB E3 XTHL ; TO LENGTHEN E3AC E3 XTHL ; THE DELAY E3AD 7E MOV A,M ;WAIT FOR CP/M MACRO ASSEM 2.0 #012 *** Cbios For CP/M Ver. 2.2 *** E3AE A1 ANA C ; THE INDEX E3AF CAA8E3 JZ INDXCT ; TO GO HIGH E3B2 C9 RET ;98 MACHINE CYCLES DENFIX E3B3 79 MOV A,C ;TRIM THE E3B4 E601 ANI 1 ; EXCESS BITS E3B6 2F CMA ;COMPLIMENT AND E3B7 47 MOV B,A ; SAVE IN B E3B8 21EBE7 LXI H,DISK ;NEW DISK PTR E3BB 5E MOV E,M ;GET DISK NO. E3BC 1600 MVI D,0 ;OFFSET ADDR E3BE 23 INX H ;CURRENT DISK PTR E3BF 7E MOV A,M ;MOVE TO ACC E3C0 AB XRA E ;CMPR OLD W/NEW E3C1 F5 PUSH PSW ;SAVE STATUS E3C2 23 INX H ;DISK TABLE E3C3 23 INX H ; ADDRESS E3C4 19 DAD D ;ADD THE E3C5 19 DAD D ; OFFSET E3C6 7E MOV A,M ;GET PARAMETERS E3C7 F601 ORI 1 ;MASK OFF DENSITY E3C9 A0 ANA B ;SET NEW DENSITY E3CA 77 MOV M,A ;UPDATE PARAMETERS E3CB F1 POP PSW ;TEST NEW=OLD? E3CC C0 RNZ E3CD 7E MOV A,M ;UPDATA CDISK E3CE 32F6E7 STA DCREG ; ALSO E3D1 C9 RET TIMOUT E3D2 210000 LXI H,0 ;TIME-OUT DELAY TILOOP E3D5 2B DCX H ;DECREMENT COUNT E3D6 7C MOV A,H ;TEST FOR DELAY E3D7 B5 ORA L ; COUNT EQUAL ZERO E3D8 E3 XTHL ;LONG NOP E3D9 E3 XTHL ; INSTRUCTION E3DA C2D5E3 JNZ TILOOP E3DD C9 RET E3DE E5 SBEGIN PUSH H E3DF 21E2E3 LXI H,DSTALL E3E2 E9 DSTALL PCHL E3E3 E1 POP H E3E4 C9 RET SIDEFX E3E5 79 MOV A,C ;GET THE SIDE BIT E3E6 E601 ANI 1 ;TRIM THE EXCESS E3E8 17 RAL ;MOVE THE BIT E3E9 17 RAL ; TO THE SIDE E3EA 17 RAL ; SELECT BIT E3EB 17 RAL ; POSITION E3EC 32F7E7 STA SIDE ;SAVE SIDE BIT E3EF C9 RET CP/M MACRO ASSEM 2.0 #013 *** Cbios For CP/M Ver. 2.2 *** PWRJMP E3F0 00 NOP ;POWER-ON E3F1 00 NOP ; JUMP E3F2 00 NOP ; SEQUENCE E3F3 00 NOP ; WITH NOP E3F4 00 NOP ; PADDING E3F5 C300E0 JMP DBOOT E3F8 DS 10Q ;I/O LOCATIONS E7C9 ORG RAM+3C9H E7C9 STACK DS 31Q E7E2 0000 ECOUNT DW 0 E7E4 0018 TIMER DW 1800H ;HEAD LOAD TIME OUT E7E6 00E7 DMAADR DW RAM+300H ;DMA ADDRESS E7E8 08 DSFLAG DB 10Q E7E9 00 HDFLAG DB 0 ;READ HEADER FLAG E7EA 7E DRVSEL DB 176Q ;DRIVE SELECT CONSTANT E7EB 00 DISK DB 0 ;NEW DRIVE E7EC 08 JCDISK DB 10Q ;CURRENT DISK E7ED 00 TZFLAG DB 0 ;HOME CMD INDICATOR E7EE 09 DOPRAM DB 11Q ;DRIVE 0 PARAMETERS E7EF FF DOTRK DB 377Q ;DRIVE 0 TRACK NO E7F0 09 D1PRAM DB 11Q ;DRIVE 1 PARAMETERS E7F1 FF D1TRK DB 377Q ;DRIVE 1 TRACK NO E7F2 09 D2PRAM DB 11Q ;DRIVE 2 PARAMETERS E7F3 FF D2TRK DB 377Q ;DRIVE 2 TRACK NO E7F4 09 D3PRAM DB 11Q ;DRIVE 3 PARAMETERS E7F5 FF D3TRK DB 377Q ;DRIVE 3 TRACK NO E7F6 09 DCREG DB 11Q ;CURRENT PARAMETERS E7F7 00 SIDE DB 0 ;NEW SIDE E7F8 01 SECTOR DB 1 ;NEW SECTOR E7F9 00 TRACK DB 0 ;NEW TRACK E7FA 00 TRKNO DB 0 ;DISK E7FB 00 SIDENO DB 0 ; SECTOR E7FC 00 SECTNO DB 0 ; HEADER E7FD 00 SECLEN DB 0 ; DATA E7FE 00 CRCLO DB 0 ; BUFFER E7FF 00 CRCHI DB 0 ***************************************************************** * * * CBIOS FOR CP/M VER 2.2 FOR DISK JOCKEY 2D CONTROLLER (ALL * * REVS). HANDLES DISKETTES WITH SECTOR SIZES OF 128 BYTES * * SINGLE DENSITY, 256, 512, 1024 BYTES DOUBLE DENSITY. * * * * WRITTEN BY BOBBY DALE GIFFORD. * * 9/1/79 * * * * DISK MAP OF SECTORS USED BY COLD BOOT, WARM BOOT, FIRMWARE, * * AND CP/M: * * * * TRK 0 SEC 1 = FIRST SECTOR OF COLD BOOT. E700H * CP/M MACRO ASSEM 2.0 #014 *** Cbios For CP/M Ver. 2.2 *** * 0 2 = COLD BOOT 256. 80H * * 0 3 = COLD BOOT 512. 80H * * 0 4 = COLD BOOT 1024. 80H * * 0 5 = WARM BOOT 256. 80H * * 0 6 = WARM BOOT 512. 80H * * 0 7 = WARM BOOT 1024. 80H * * 0 8 = COLD/WARM BOOT. 3200H * * 0 9 = FIRMWARE. E400H * * 0 10 = FIRMWARE+80H. E480H * * 0 11 = FIRMWARE+100H E500H * * 0 12 = FIRMWARE+180H. E580H * * 0 13 = FIRMWARE+200H. E600H * * 0 14 = FIRMWARE+280H. E680H * * 0 15 = FIRMWARE+300H. E700H * * 0 16 = FIRMWARE+380H. E780H * * 0 17 = CCP. 2D00H * * 0 10 = CCP+80H. 2D80H * * 0 12 = CCP+100H. 2E00H * * 0 14 = CCP+180H. 2E80H * * 0 16 = CCP+200H. 2F00H * * 0 18 = CCP+280H. 2F80H * * 0 20 = CCP+300H. 3000H * * 0 22 = CCP+380H. 3080H * * 0 24 = CCP+400H. 3100H * * 0 26 = CCP+480H. 3180H * * 1 = REST OF CP/M. 3200H-4FFFH * * * ***************************************************************** TITLE '*** Cbios For CP/M Ver. 2.2 ***' ***************************************************************** * * * THE FOLLOWING REVISION NUMBER IS IN REFERENCE TO THE CP/M * * 2.0 CBIOS. * * * ***************************************************************** 001F = REVNUM EQU 31 ;CBIOS REVISION NUMBER 0016 = CPMREV EQU 22 ;CP/M REVISION NUMBER ***************************************************************** * * * THE FOLLOWING EQUATES RELATE THE THINKER TOYS 2D CONTROLLER. * * IF THE CONTROLLER IS NON STANDARD (0E000H) ONLY THE ORIGIN * * EQUATE NEED BE CHANGED. THIS VERSION OF THE CBIOS WILL WORK * * WITH 2D CONTROLLER BOARDS REV 0, 1, 3, 3.1, 4. * * * ***************************************************************** E400 = DJRAM EQU RAM ;DISK JOCKEY 2D RAM ADDRESS E003 = DJCIN EQU TERMIN ;DISK JOCKEY 2D CHARACTER INPUT ROUTINE E006 = DJCOUT EQU TRMOUT ;DISK JOCKEY 2D CHARACTER OUTPUT ROUTINE E009 = DJHOME EQU TKZERO ;DISK JOCKEY 2D TRACK ZERO SEEK E00F = DJTRK EQU JSECT ;DISK JOCKEY 2D TRACK SEEK ROUTINE E00F = DJSEC EQU JSECT ;DISK JOCKEY 2D SET SECTOR ROUTINE CP/M MACRO ASSEM 2.0 #015 *** Cbios For CP/M Ver. 2.2 *** E012 = DJDMA EQU JDMA ;DISK JOCKEY 2D SET DMA ADDRESS E015 = DJREAD EQU DREAD ;DISK JOCKEY 2D READ ROUTINE E018 = DJWRITE EQU DWRITE ;DISK JOCKEY 2D WRITE ROUTINE E01B = DJSEL EQU SELDRV ;DISK JOCKEY 2D SELECT DRIVE ROUTINE E021 = DJTSTAT EQU TSTAT ;DISK JOCKEY 2D TERMINAL STATUS ROUTINE E027 = DJSTAT EQU STATUS ;DISK JOCKEY 2D STATUS ROUTINE E02A = DJERR EQU DSKERR ;DISK JOCKEY 2D ERROR, FLASH LED E02D = DJDEN EQU SETDEN ;DISK JOCKEY 2D SET DENSITY ROUTINE E030 = DJSIDE EQU SETSID ;DISK JOCKEY 2D SET SIDE ROUTINE ***************************************************************** * * * CP/M SYSTEM EQUATES. IF RECONFIGURATION OF THE CP/M SYSTEM * * IS BEING DONE, THE CHANGES CAN BE MADE TO THE FOLLOWING * * EQUATES. * * * ***************************************************************** 0018 = MSIZE EQU 24 ;MEMORY SIZE OF TARGET CP/M 1000 = BIAS EQU (MSIZE-20)*1024 ;MEMORY OFFSET FROM 20K SYSTEM 3D00 = CCP EQU 2D00H+BIAS ;CONSOLE COMMAND PROCESSOR 4500 = BDOS EQU CCP+800H ;BDOS ADDRESS 5300 = BIOS EQU CCP+1600H ;CBIOS ADDRESS 0004 = CDISK EQU 4 ;ADDRESS OF LAST LOGGED DISK 0080 = BUFF EQU 80H ;DEFAULT BUFFER ADDRESS 0100 = TPA EQU 100H ;TRANSIENT MEMORY 0000 = INTIOBY EQU 0 ;INITIAL IOBYTE 0003 = IOBYTE EQU 3 ;IOBYTE LOCATION 0000 = WBOT EQU 0 ;WARM BOOT JUMP ADDRESS 0005 = ENTRY EQU 5 ;BDOS ENTRY JUMP ADDRESS ***************************************************************** * * * THE FOLLOWING ARE INTERNAL CBIOS EQUATES. MOST ARE MISC. * * CONSTANTS. * * * ***************************************************************** 000A = RETRIES EQU 10 ;MAX RETRIES ON DISK I/O BEFORE ERROR 000D = ACR EQU 0DH ;A CARRIAGE RETURN 000A = ALF EQU 0AH ;A LINE FEED 0003 = AETX EQU 3 ;A ETX CHAR 0006 = AACK EQU 6 ;A ACK CHAR 001A = CLEAR EQU 1AH ;CLEAR SCREEN CHAR ON ADM3 TERMINAL 0004 = MAXDISK EQU 4 ;MAXIMUM # OF DISK DRIVES 0008 = DBLSID EQU 8 ;SIDE BIT FROM CONTROLLER ***************************************************************** * * * THE JUMP TABLE BELOW MUST REMAIN IN THE SAME ORDER, THE * * ROUTINES MAY BE CHANGED, BUT THE FUNCTION EXECUTED MUST BE * * THE SAME. * * * ***************************************************************** 5300 ORG BIOS ;CBIOS STARTING ADDRESS CP/M MACRO ASSEM 2.0 #016 *** Cbios For CP/M Ver. 2.2 *** 5300 C3A053 JMP CBOOT ;COLD BOOT ENTRY POINT 5303 C3FC53 WBOOTE JMP WBOOT ;WARM BOOT ENTRY POINT 5306 C34056 JMP CONST ;CONSOLE STATUS ROUTINE 5309 C34C56 JMP CONIN ;CONSOLE INPUT 530C C36156 COUT JMP CONOUT ;CONSOLE OUTPUT 530F C38156 JMP LIST ;LIST DEVICE OUTPUT 5312 C37656 JMP PUNCH ;PUNCH DEVICE OUTPUT 5315 C36C56 JMP READER ;READER DEVICE INPUT 5318 C39054 JMP HOME ;HOME DRIVE 531B C3C654 JMP SETDRV ;SELECT DISK 531E C39254 JMP SETTRK ;SET TRACK 5321 C38554 JMP SETSEC ;SET SECTOR 5324 C38A54 JMP SETDMA ;SET DMA ADDRESS 5327 C36955 JMP READ ;READ THE DISK 532A C36255 JMP WRITE ;WRITE THE DISK 532D C38C56 JMP LISTST ;LIST DEVICE STATUS 5330 C39754 JMP SECTRAN ;SECTOR TRANSLATION 5333 C31BE0 DJDRV JMP DJSEL ;HOOK FOR SINGLE.COM PROGRAM ***************************************************************** * * * SIGNON MESSAGE OUTPUT DURING COLD BOOT. * * * ***************************************************************** 5336 0D0A0A PROMPT DB ACR,ALF,ALF 5339 32 DB '0'+MSIZE/10 ;CP/M MEMORY SIZE 533A 34 DB '0'+(MSIZE MOD 10) 533B 4B2043502F DB 'K CP/M Vers. ' ;CP/M VERSION NUMBER 5348 32 DB CPMREV/10+'0' 5349 2E DB '.' 534A 32 DB (CPMREV MOD 10)+'0' 534B 2C20436269 DB ', Cbios rev ' 5357 332E DB REVNUM/10+'0','.' ;CBIOS REVISION NUMBER 5359 31 DB REVNUM MOD 10+'0' 535A 0D0A DB ACR,ALF 535C 466F722054 DB 'For Thinker Toys Disk Jockey 2D Controller ' 5387 402030 DB '@ 0' IF ORIGIN/4096 > 10 ;CONTROLLER ORIGIN (HEX) 538A 45 DB ORIGIN/4096+'A'-10 ELSE DB ORIGIN/4096+'0' ENDIF IF (ORIGIN/256 AND 0FH) > 10 DB (ORIGIN/256 AND 0FH)+'A'-10 ELSE 538B 30 DB (ORIGIN/256 AND 0FH)+'0' ENDIF 538C 3030482E DB '00H.' 5390 0D0A00 DB ACR,ALF,0 ***************************************************************** * * CP/M MACRO ASSEM 2.0 #017 *** Cbios For CP/M Ver. 2.2 *** * UTILITY ROUTINE TO OUTPUT THE MESSAGE POINTED AT BY H&L, * * TERMINATED WITH A NULL. * * * ***************************************************************** 5393 7E MESSAGE MOV A,M ;GET A CHARACTER OF THE MESSAGE 5394 23 INX H ;BUMP TEXT POINTER 5395 A7 ANA A ;TEST FOR END 5396 C8 RZ ;RETURN IF DONE 5397 E5 PUSH H ;SAVE POINTER TO TEXT 5398 4F MOV C,A ;OUTPUT CHARACTER IN C 5399 CD0C53 CALL COUT ;OUTPUT THE CHARACTER 539C E1 POP H ;RESTORE THE POINTER 539D C39353 JMP MESSAGE ;CONTINUE UNTIL NULL REACHED ***************************************************************** * * * CBOOT IS THE COLD BOOT LOADER. ALL OF CP/M HAS BEEN LOADED IN * * WHEN CONTROL IS PASSED HERE. * * * ***************************************************************** 53A0 310001 CBOOT LXI SP,TPA ;SET UP STACK 53A3 CD2157 CALL TINIT ;INITIALIZE THE TERMINAL 53A6 213653 LXI H,PROMPT ;PREP FOR SENDING SIGNON MESSAGE 53A9 CD9353 CALL MESSAGE ;SEND THE PROMPT 53AC AF XRA A ;SELECT DISK A 53AD 32BA58 STA CPMDRV 53B0 320400 STA CDISK ***************************************************************** * * * GOCPM IS THE ENTRY POINT FROM COLD BOOTS, AND WARM BOOTS. IT * * INITIALIZES SOME OF THE LOCATIONS IN PAGE 0, AND SETS UP THE * * INITIAL DMA ADDRESS (80H). * * * ***************************************************************** 53B3 218000 GOCPM LXI H,BUFF ;SET UP INITIAL DMA ADDRESS 53B6 CD8A54 CALL SETDMA 53B9 3EC3 MVI A,(JMP) ;INITIALIZE JUMP TO WARM BOOT 53BB 320000 STA WBOT 53BE 320500 STA ENTRY ;INITIALIZE JUMP TO BDOS 53C1 210353 LXI H,WBOOTE ;ADDRESS IN WARM BOOT JUMP 53C4 220100 SHLD WBOT+1 53C7 210645 LXI H,BDOS+6 ;ADDRESS IN BDOS JUMP 53CA 220600 SHLD ENTRY+1 53CD AF XRA A ;A <- 0 53CE 32BF58 STA BUFSEC ;DISK JOCKEY BUFFER EMPTY 53D1 32D555 STA BUFWRTN ;SET BUFFER NOT DIRTY FLAG 53D4 3A0400 LDA CDISK ;JUMP TO CP/M WITH CURRENTLY SELECTED DISK IN C 53D7 4F MOV C,A 53D8 11FB53 LXI D,CMNDBEG ;BEGINNING OF INITIAL COMMAND 53DB 21083D LXI H,CCP+8 ;COMMAND BUFFER 53DE 3E01 MVI A,CMNDEND-CMNDBEG+1 ;LENGTH OF COMMAND 53E0 32073D STA CCP+7 CP/M MACRO ASSEM 2.0 #018 *** Cbios For CP/M Ver. 2.2 *** 53E3 47 MOV B,A 53E4 CD3756 CALL MOVLOP 53E7 3AF953 LDA CWFLG 53EA A7 ANA A 53EB 3AFA53 LDA AUTOFLG 53EE CAF253 JZ CLDBOT 53F1 1F RAR 53F2 1F CLDBOT RAR 53F3 DA003D JC CCP 53F6 C3033D JMP CCP+3 ;ENTER CP/M 53F9 00 CWFLG DB 0 ;COLD/WARM BOOT FLAG ***************************************************************** * * * THE FOLLOWING BYTE DETERMINES IF AN INITIAL COMMAND IS TO BE * * GIVEN TO CP/M ON WARM OR COLD BOOTS. THE VALUE OF THE BYTE IS * * USED TO GIVE THE COMMAND TO CP/M: * * * * 0 = NEVER GIVE COMMAND. * * 1 = GIVE COMMAND ON COLD BOOTS ONLY. * * 2 = GIVE THE COMMAND ON WARM BOOTS ONLY. * * 3 = GIVE THE COMMAND ON WARM AND COLD BOOTS. * * * ***************************************************************** 53FA 01 AUTOFLG DB 1 ;AUTO COMMAND FEATURE ***************************************************************** * * * IF THERE IS A COMMAND INSERTED HERE, IT WILL BE GIVEN IF THE * * AUTO FEATURE IS ENABLED. * * FOR EXAMPLE: * * * * CMNDBEG DB 'MBASIC MYPROG' * * CMNDEND DB 0 * * * * WILL EXECUTE MICROSOFT BASIC, AND MBASIC WILL EXECUTE THE * * "MYPROG" BASIC PROGRAM. * * * ***************************************************************** CMNDBEG DB '' ;INITIAL COMMAND GOES HERE 53FB 00 CMNDEND DB 0 ***************************************************************** * * * WBOOT LOADS IN ALL OF CP/M EXCEPT THE CBIOS, THEN INITIALIZES * * SYSTEM PARAMETERS AS IN COLD BOOT. SEE THE COLD BOOT LOADER * * LISTING FOR EXACTLY WHAT HAPPENS DURING WARM AND COLD BOOTS. * * * ***************************************************************** 53FC 310001 WBOOT LXI SP,TPA ;SET UP STACK POINTER 53FF 3E01 MVI A,1 5400 = WFLG EQU $-1 ;TEST IF BEGINNING OR CP/M MACRO ASSEM 2.0 #019 *** Cbios For CP/M Ver. 2.2 *** 5401 A7 ANA A ; ENDING A WARM BOOT 5402 3E01 MVI A,1 5404 320054 STA WFLG 5407 32F953 STA CWFLG ;SET COLD/WARM BOOT FLAG 540A CAB353 JZ GOCPM 540D AF XRA A 540E 320054 STA WFLG 5411 4F MOV C,A 5412 CD3353 CALL DJDRV ;SELECT DRIVE A 5415 0E00 MVI C,0 ;SELECT SINGLE DENSITY 5417 CD2DE0 CALL DJDEN 541A 0E00 MVI C,0 ;SELECT SIDE 0 541C CD30E0 CALL DJSIDE 541F 3E0F MVI A,15 ;INITIALIZE THE SECTOR TO READ 5421 323F54 STA NEWSEC 5424 21003C LXI H,CCP-100H ;AND THE DMA ADDRESS 5427 225E54 SHLD NEWDMA 542A CD3E54 CALL WARMLOD ;READ IN CP/M 542D 010042 LXI B,CCP+500H ;LOAD ADDRESS FOR REST OF WARM BOOT 5430 CD12E0 CALL DJDMA 5433 0E08 MVI C,8 5435 CD0FE0 CALL DJSEC 5438 CD7254 CALL WARMRD 543B C30342 JMP CCP+503H 543E 3E0F WARMLOD MVI A,15 ;PREVIOUS SECTOR 543F = NEWSEC EQU $-1 5440 3C INR A ;UPDATE THE PREVIOUS SECTOR 5441 3C INR A 5442 FE1B CPI 27 ;WAS IT THE LAST ? 5444 DA5654 JC NOWRAP 5447 D609 SUI 9 ;YES 5449 FE13 CPI 19 544B C8 RZ 544C 2A5E54 LHLD NEWDMA 544F 1180FB LXI D,-480H 5452 19 DAD D 5453 225E54 SHLD NEWDMA 5456 323F54 NOWRAP STA NEWSEC ;SAVE THE NEW SECTOR TO READ 5459 4F MOV C,A 545A CD0FE0 CALL DJSEC 545D 21003C LXI H,CCP-100H ;GET THE PREVIOUS DMA ADDRESS 545E = NEWDMA EQU $-2 5460 110001 LXI D,100H ;UPDATE THE DMA ADDRESS 5463 19 DAD D 5464 225E54 SHLD NEWDMA ;SAVE THE DMA ADDRESS 5467 44 MOV B,H 5468 4D MOV C,L 5469 CD12E0 CALL DJDMA ;SET THE DMA ADDRESS 546C CD7254 CALL WARMRD 546F C33E54 JMP WARMLOD 5472 01000A WARMRD LXI B,RETRIES*100H+0;MAXIMUM # OF ERRORS 5475 C5 WRMREAD PUSH B 5476 CD0FE0 CALL DJTRK ;SET THE TRACK 5479 CD15E0 CALL DJREAD ;READ THE SECTOR CP/M MACRO ASSEM 2.0 #020 *** Cbios For CP/M Ver. 2.2 *** 547C C1 POP B 547D D0 RNC ;CONTINUE IF SUCCESSFUL 547E 05 DCR B 547F C27554 JNZ WRMREAD ;KEEP TRYING 5482 C32AE0 JMP DJERR ***************************************************************** * * * SETSEC JUST SAVES THE DESIRED SECTOR TO SEEK TO UNTIL AN * * ACTUAL READ OR WRITE IS ATTEMPTED. * * * ***************************************************************** 5485 79 SETSEC MOV A,C ;SAVE THE SECTOR NUMBER 5486 32B958 STA CPMSEC ;CP/M SECTOR # 5489 C9 RET ***************************************************************** * * * SETDMA SAVES THE DMA ADDRESS FOR THE DATA TRANSFER. * * * ***************************************************************** 548A 60 SETDMA MOV H,B ;HL <- BC 548B 69 MOV L,C 548C 22B555 SHLD CPMDMA ;CP/M DMA ADDRESS 548F C9 RET ***************************************************************** * * * HOME IS TRANSLATED INTO A SEEK TO TRACK ZERO. * * * ***************************************************************** 5490 0E00 HOME MVI C,0 ;TRACK TO SEEK TO ***************************************************************** * * * SETTRK SAVES THE TRACK # TO SEEK TO. NOTHING IS DONE AT THIS * * POINT, EVERYTHING IS DEFFERED UNTIL A READ OR WRITE. * * * ***************************************************************** 5492 79 SETTRK MOV A,C ;A <- TRACK # 5493 32BB58 STA CPMTRK ;CP/M TRACK # 5496 C9 RET ***************************************************************** * * * SECTRAN TRANSLATES A LOGICAL SECTOR # INTO A PHYSICAL SECTOR * * #. * * * ***************************************************************** 5497 03 SECTRAN INX B 5498 D5 PUSH D ;SAVE TABLE ADDRESS CP/M MACRO ASSEM 2.0 #021 *** Cbios For CP/M Ver. 2.2 *** 5499 C5 PUSH B ;SAVE SECTOR # 549A CD4155 CALL GETDPB ;GET DPB ADDRESS INTO HL 549D 7E MOV A,M ;GET # OF CP/M SECTORS/TRACK 549E B7 ORA A ;CLEAR CARY 549F 1F RAR ;DIVIDE BY TWO 54A0 91 SUB C 54A1 F5 PUSH PSW ;SAVE ADJUSTED SECTOR 54A2 FAAE54 JM SIDETWO 54A5 F1 SIDEA POP PSW ;DISCARD ADJUSTED SECTOR 54A6 C1 POP B ;RESTORE SECTOR REQUESTED 54A7 D1 POP D ;RESTOR ADDRESS OF XLT TABLE 54A8 EB SIDEONE XCHG ;HL <- &(TRANSLATION TABLE) 54A9 09 DAD B ;BC = OFFSET INTO TABLE 54AA 6E MOV L,M ;HL <- PHYSICAL SECTOR 54AB 2600 MVI H,0 54AD C9 RET 54AE 010F00 SIDETWO LXI B,15 ;OFFSET TO SIDE BIT 54B1 09 DAD B 54B2 7E MOV A,M 54B3 E608 ANI 8 ;TEST FOR DOUBLE SIDED 54B5 CAA554 JZ SIDEA ;MEDIA IS ONLY SINGLE SIDED 54B8 F1 POP PSW ;RETRIEVE ADJUSTED SECTOR 54B9 C1 POP B 54BA 2F CMA ;MAKE SECTOR REQUEST POSITIVE 54BB 3C INR A 54BC 4F MOV C,A ;MAKE NEW SECTOR THE REQUESTED SECTOR 54BD D1 POP D 54BE CDA854 CALL SIDEONE 54C1 3E80 MVI A,80H ;SIDE TWO BIT 54C3 B5 ORA L ; AND SECTOR 54C4 6F MOV L,A 54C5 C9 RET ***************************************************************** * * * SETDRV SELECTS THE NEXT DRIVE TO BE USED IN READ/WRITE * * OPERATIONS. IF THE DRIVE HAS NEVER BEEN SELECTED BEFORE, A * * PARAMETER TABLE IS CREATED WHICH CORRECTLY DESCRIBES THE * * DISKETTE CURRENTLY IN THE DRIVE. DISKETTES CAN BE OF FOUR * * DIFFERENT SECTOR SIZES: * * 1) 128 BYTES SINGLE DENSITY. * * 2) 256 BYTES DOUBLE DENSITY. * * 3) 512 BYTES DOUBLE DENSITY. * * 4) 1024 BYTES DOUBLE DENSITY. * * * ***************************************************************** 54C6 79 SETDRV MOV A,C ;SAVE THE DRIVE # 54C7 32BA58 STA CPMDRV 54CA FE04 CPI MAXDISK ;CHECK FOR A VALID DRIVE # 54CC D23D55 JNC ZRET ;ILLEGAL DRIVE # 54CF 7B MOV A,E ;TEST IF DRIVE EVER LOGGED IN BEFORE 54D0 E601 ANI 1 54D2 C22455 JNZ SETDRV1 ;BIT 0 OF E = 0 -> NEVER SELECTED BEFORE 54D5 3E01 MVI A,1 ;SELECT SECTOR 1 OF TRACK 1 CP/M MACRO ASSEM 2.0 #022 *** Cbios For CP/M Ver. 2.2 *** 54D7 32BC58 STA TRUESEC 54DA 32BB58 STA CPMTRK 54DD CD2056 CALL FILL ;FLUSH BUFFER AND REFILL 54E0 DA3D55 JC ZRET ;TEST FOR ERROR RETURN 54E3 CD27E0 CALL DJSTAT ;GET STATUS ON CURRENT DRIVE 54E6 E60C ANI 0CH ;STRIP OFF UNWANTED BITS 54E8 F5 PUSH PSW ;USED TO SELECT A DPB 54E9 1F RAR 54EA 215A55 LXI H,XLTS ;TABLE OF XLT ADDRESSES 54ED 5F MOV E,A 54EE 1600 MVI D,0 54F0 19 DAD D 54F1 E5 PUSH H ;SAVE POINTER TO PROPER XLT 54F2 CD4155 CALL GETDPB ;GET DPH POINTER INTO DE 54F5 EB XCHG ; 54F6 D1 POP D 54F7 0602 MVI B,2 ;NUMBER OF BYTES TO MOVE 54F9 CD3756 CALL MOVLOP ;MOVE THE ADDRESS OF XLT 54FC 110800 LXI D,8 ;OFFSET TO DPB POINTER 54FF 19 DAD D ;HL <- &DPH.DPB 5500 E5 PUSH H 5501 2A07E0 LHLD ORIGIN+7 ;GET ADDRESS OF DJ TERMINAL OUT ROUTINE 5504 23 INX H ;BUMP TO LOOK AT ADDRESS OF ; UART STATUS LOCATION 5505 7E MOV A,M 5506 EE03 XRI 3 ;ADJUST FOR PROPER REV DJ 5508 6F MOV L,A 5509 26E3 MVI H,(ORIGIN+300H)/100H 550B 7E MOV A,M 550C E608 ANI DBLSID ;CHECK DOUBLE SIDED BIT 550E 11F957 LXI D,DPB128S ;BASE FOR SINGLE SIDED DPB'S 5511 C21755 JNZ SIDEOK 5514 113958 LXI D,DPB128D ;BASE OF DOUBLE SIDED DPB'S 5517 EB SIDEOK XCHG ;HL <- DBP BASE, DE <- &DPH.DPB 5518 D1 POP D ;RESTORE DE (POINTER INTO DPH) 5519 F1 POP PSW ;OFFSET TO CORRECT DPB 551A 17 RAL 551B 17 RAL 551C 4F MOV C,A 551D 0600 MVI B,0 551F 09 DAD B 5520 EB XCHG ;PUT DPB ADDRESS IN DPH 5521 73 MOV M,E 5522 23 INX H 5523 72 MOV M,D 5524 CD4155 SETDRV1 CALL GETDPB ;GET ADDRESS OF DPB IN HL 5527 010F00 LXI B,15 ;OFFSET TO SECTOR SIZE 552A 09 DAD B 552B 7E MOV A,M ;GET SECTOR SIZE 552C E607 ANI 7H 552E 326E55 STA SECSIZ 5531 7E MOV A,M 5532 1F RAR 5533 1F RAR 5534 1F RAR 5535 1F RAR CP/M MACRO ASSEM 2.0 #023 *** Cbios For CP/M Ver. 2.2 *** 5536 E60F ANI 0FH 5538 32A455 STA SECPSEC 553B EB XCHG ;HL <- DPH 553C C9 RET 553D 210000 ZRET LXI H,0 ;SELDRV ERROR EXIT 5540 C9 RET ***************************************************************** * * * GETDPB RETURNS HL POINTING TO THE DPB OF THE CURRENTLY * * SELECTED DRIVE, DE POINTING TO DPH. * * * ***************************************************************** 5541 3ABA58 GETDPB LDA CPMDRV ;GET DRIVE # 5544 6F MOV L,A ;FORM OFFSET 5545 2600 MVI H,0 5547 29 DAD H 5548 29 DAD H 5549 29 DAD H 554A 29 DAD H 554B 117958 LXI D,DPZERO ;BASE OF DPH'S 554E 19 DAD D 554F E5 PUSH H ;SAVE ADDRESS OF DPH 5550 110A00 LXI D,10 ;OFFSET TO DPB 5553 19 DAD D 5554 7E MOV A,M ;GET LOW BYTE OF DPB ADDRESS 5555 23 INX H 5556 66 MOV H,M ;GET LOW BYTE OF DPB 5557 6F MOV L,A 5558 D1 POP D 5559 C9 RET ***************************************************************** * * * XLTS IS A TABLE OF ADDRESS THAT POINT TO EACH OF THE XLT * * TABLES FOR EACH SECTOR SIZE. * * * ***************************************************************** 555A 2B57 XLTS DW XLT128 ;XLT FOR 128 BYTE SECTORS 555C 4657 DW XLT256 ;XLT FOR 256 BYTE SECTORS 555E 7B57 DW XLT512 ;XLT FOR 512 BYTE SECTORS 5560 B857 DW XLT124 ;XLT FOR 1024 BYTE SECTORS ***************************************************************** * * * WRITE ROUTINE MOVES DATA FROM MEMORY INTO THE BUFFER. IF THE * * DESIRED CP/M SECTOR IS NOT CONTAINED IN THE DISK BUFFER, THE * * BUFFER IS FIRST FLUSHED TO THE DISK IF IT HAS EVER BEEN * * WRITTEN INTO, THEN A READ IS PERFORMED INTO THE BUFFER TO GET * * THE DESIRED SECTOR. ONCE THE CORRECT SECTOR IS IN MEMORY, THE * * BUFFER WRITTEN INDICATOR IS SET, SO THE BUFFER WILL BE * * FLUSHED, THEN THE DATA IS TRANSFERRED INTO THE BUFFER. * * * CP/M MACRO ASSEM 2.0 #024 *** Cbios For CP/M Ver. 2.2 *** ***************************************************************** 5562 79 WRITE MOV A,C ;SAVE WRITE COMMAND TYPE 5563 32CC55 STA WRITTYP 5566 3E01 MVI A,1 ;SET WRITE COMMAND 5568 06 DB (MVI) OR (B*8) ;THIS "MVI B" INSTRUCTION CAUSES ; THE FOLLOWING "XRA A" TO ; BE SKIPPED OVER. ***************************************************************** * * * READ ROUTINE TO BUFFER DATA FROM THE DISK. IF THE SECTOR * * REQUESTED FROM CP/M IS IN THE BUFFER, THEN THE DATA IS SIMPLY * * TRANSFERRED FROM THE BUFFER TO THE DESIRED DMA ADDRESS. IF * * THE BUFFER DOES NOT CONTAIN THE DESIRED SECTOR, THE BUFFER IS * * FLUSHED TO THE DISK IF IT HAS EVER BEEN WRITTEN INTO, THEN * * FILLED WITH THE SECTOR FROM THE DISK THAT CONTAINS THE * * DESIRED CP/M SECTOR. * * * ***************************************************************** 5569 AF READ XRA A ;SET THE COMMAND TYPE TO READ 556A 32B855 STA RDWR ;SAVE COMMAND TYPE ***************************************************************** * * * REDWRT CALCULATES THE PHYSICAL SECTOR ON THE DISK THAT * * CONTAINS THE DESIRED CP/M SECTOR, THEN CHECKS IF IT IS THE * * SECTOR CURRENTLY IN THE BUFFER. IF NO MATCH IS MADE, THE * * BUFFER IS FLUSHED IF NECESSARY AND THE CORRECT SECTOR READ * * FROM THE DISK. * * * ***************************************************************** 556D 0600 REDWRT MVI B,0 ;THE 0 IS MODIFIED TO CONTAIN THE LOG2 556E = SECSIZ EQU $-1 ; OF THE PHYSICAL SECTOR SIZE/128 ; ON THE CURRENTLY SELECTED DISK. 556F 3AB958 LDA CPMSEC ;GET THE DESIRED CP/M SECTOR # 5572 F5 PUSH PSW ;TEMPORARY SAVE 5573 E680 ANI 80H ;SAVE ONLY THE SIDE BIT 5575 4F MOV C,A ;REMEMBER THE SIDE 5576 F1 POP PSW ;GET THE SECTOR BACK 5577 E67F ANI 7FH ;FORGET THE SIDE BIT 5579 3D DCR A ;TEMPORARY ADJUSTMENT 557A 05 DIVLOOP DCR B ;UPDATE REPEAT COUNT 557B CA8355 JZ DIVDONE 557E B7 ORA A ;CLEAR THE CARY FLAG 557F 1F RAR ;DIVIDE THE CP/M SECTOR # BY THE SIZE ; OF THE PHYSICAL SECTORS 5580 C37A55 JMP DIVLOOP ; 5583 3C DIVDONE INR A 5584 B1 ORA C ;RESTORE THE SIDE BIT 5585 32BC58 STA TRUESEC ;SAVE THE PHYSICAL SECTOR NUMBER 5588 21BA58 LXI H,CPMDRV ;POINTER TO DESIRED DRIVE,TRACK, AND SECTOR 558B 11BD58 LXI D,BUFDRV ;POINTER TO BUFFER DRIVE,TRACK, AND SECTOR 558E 0604 MVI B,4 ;COUNT LOOP CP/M MACRO ASSEM 2.0 #025 *** Cbios For CP/M Ver. 2.2 *** 5590 05 DTSLOP DCR B ;TEST IF DONE WITH COMPARE 5591 CA9F55 JZ MOVE ;YES, MATCH. GO MOVE THE DATA 5594 1A LDAX D ;GET A BYTE TO COMPARE 5595 BE CMP M ;TEST FOR MATCH 5596 23 INX H ;BUMP POINTERS TO NEXT DATA ITEM 5597 13 INX D 5598 CA9055 JZ DTSLOP ;MATCH, CONTINUE TESTING ***************************************************************** * * * DRIVE, TRACK, AND SECTOR DON'T MATCH, FLUSH THE BUFFER IF * * NECESSARY AND THEN REFILL. * * * ***************************************************************** 559B CD2056 CALL FILL ;FILL THE BUFFER WITH CORRECT PHYSICAL SECTOR 559E D8 RC ;NO GOOD, RETURN WITH ERROR INDICATION ***************************************************************** * * * MOVE HAS BEEN MODIFIED TO CAUSE EITHER A TRANSFER INTO OR OUT * * THE BUFFER. * * * ***************************************************************** 559F 3AB958 MOVE LDA CPMSEC ;GET THE CP/M SECTOR TO TRANSFER 55A2 3D DCR A ;ADJUST TO PROPER SECTOR IN BUFFER 55A3 E600 ANI 0 ;STRIP OFF HIGH ORDERED BITS 55A4 = SECPSEC EQU $-1 ;THE 0 IS MODIFIED TO REPRESENT THE # OF ; CP/M SECTORS PER PHYSICAL SECTORS 55A5 6F MOV L,A ;PUT INTO HL 55A6 2600 MVI H,0 55A8 29 DAD H ;FORM OFFSET INTO BUFFER 55A9 29 DAD H 55AA 29 DAD H 55AB 29 DAD H 55AC 29 DAD H 55AD 29 DAD H 55AE 29 DAD H 55AF 11C058 LXI D,BUFFER ;BEGINNING ADDRESS OF BUFFER 55B2 19 DAD D ;FORM BEGINNING ADDRESS OF SECTOR TO TRANSFER 55B3 EB XCHG ;DE = ADDRESS IN BUFFER 55B4 210000 LXI H,0 ;GET DMA ADDRESS, THE 0 IS MODIFIED TO ; CONTAIN THE DMA ADDRESS 55B5 = CPMDMA EQU $-2 55B7 3E00 MVI A,0 ;THE ZERO GETS MODIFIED TO CONTAIN ; A ZERO IF A READ, OR A 1 IF WRITE 55B8 = RDWR EQU $-1 55B9 A7 ANA A ;TEST WHICH KIND OF OPERATION 55BA C2C255 JNZ INTO ;TRANSFER DATA INTO THE BUFFER 55BD CD3556 OUTOF CALL MOVER 55C0 AF XRA A 55C1 C9 RET 55C2 EB INTO XCHG ; 55C3 CD3556 CALL MOVER ;MOVE THE DATA, HL = DESTINATION CP/M MACRO ASSEM 2.0 #026 *** Cbios For CP/M Ver. 2.2 *** ; DE = SOURCE 55C6 3E01 MVI A,1 55C8 32D555 STA BUFWRTN ;SET BUFFER WRITTEN INTO FLAG 55CB 3E00 MVI A,0 ;CHECK FOR DIRECTORY WRITE 55CC = WRITTYP EQU $-1 55CD 3D DCR A 55CE 3E00 MVI A,0 55D0 32CC55 STA WRITTYP ;SET NO DIRECTORY WRITE 55D3 C0 RNZ ;NO ERROR EXIT ***************************************************************** * * * FLUSH WRITES THE CONTENTS OF THE BUFFER OUT TO THE DISK IF * * IT HAS EVER BEEN WRITTEN INTO. * * * ***************************************************************** 55D4 3E00 FLUSH MVI A,0 ;THE 0 IS MODIFIED TO REFLECT IF ; THE BUFFER HAS BEEN WRITTEN INTO 55D5 = BUFWRTN EQU $-1 55D6 A7 ANA A ;TEST IF WRITTEN INTO 55D7 C8 RZ ;NOT WRITTEN, ALL DONE 55D8 2118E0 LXI H,DJWRITE ;WRITE OPERATION ***************************************************************** * * * PREP PREPARES TO READ/WRITE THE DISK. RETRIES ARE ATTEMPTED. * * UPON ENTRY, H&L MUST CONTAIN THE READ OR WRITE OPERATION * * ADDRESS. * * * ***************************************************************** 55DB AF PREP XRA A ;RESET BUFFER WRITTEN FLAG 55DC 32D555 STA BUFWRTN 55DF 221256 SHLD RETRYOP ;SET UP THE READ/WRITE OPERATION 55E2 060A MVI B,RETRIES ;MAXIMUM NUMBER OF RETRIES TO ATTEMPT 55E4 C5 RETRYLP PUSH B ;SAVE THE RETRY COUNT 55E5 3ABD58 LDA BUFDRV ;GET DRIVE NUMBER INVOLVED IN THE OPERATION 55E8 4F MOV C,A 55E9 CD3353 CALL DJDRV ;SELECT THE DRIVE 55EC 3ABE58 LDA BUFTRK 55EF A7 ANA A ;TEST FOR TRACK ZERO 55F0 4F MOV C,A 55F1 C5 PUSH B 55F2 CC09E0 CZ DJHOME ;HOME THE DRIVE IF TRACK 0 55F5 C1 POP B ;RESTORE TRACK # 55F6 CD0FE0 CALL DJTRK ;SEEK TO PROPER TRACK 55F9 3ABF58 LDA BUFSEC ;GET SECTOR INVOLVED IN OPERATION 55FC F5 PUSH PSW ;SAVE THE SECTOR # 55FD 07 RLC ;BIT 0 OF A EQUALS SIDE # 55FE E601 ANI 1 ;STRIP OFF UNNECESSARY BITS 5600 4F MOV C,A ;C <- SIDE # 5601 CD30E0 CALL DJSIDE ;SELECT THE SIDE 5604 F1 POP PSW ;A <- SECTOR # 5605 E67F ANI 7FH ;STRIP OFF SIDE BIT 5607 4F MOV C,A ;C <- SECTOR # CP/M MACRO ASSEM 2.0 #027 *** Cbios For CP/M Ver. 2.2 *** 5608 CD0FE0 CALL DJSEC ;SET THE SECTOR TO TRANSFER 560B 01C058 LXI B,BUFFER ;SET THE DMA ADDRESS 560E CD12E0 CALL DJDMA 5611 CD15E0 CALL DJREAD ;THE READ OPERATION IS MODIFIED TO WRITE 5612 = RETRYOP EQU $-2 5614 C1 POP B ;RESTORE THE RETRY COUNTER 5615 3E00 MVI A,0 ;NO ERROR EXIT STATUS 5617 D0 RNC ;RETURN NO ERROR 5618 05 DCR B ;UPDATE THE RETRY COUNTER 5619 37 STC ;ASSUME RETRY COUNT EXPIRED 561A 3EFF MVI A,0FFH ;ERROR RETURN 561C C8 RZ 561D C3E455 JMP RETRYLP ;TRY AGAIN ***************************************************************** * * * FILL FILLS THE BUFFER WITH A NEW SECTOR FROM THE DISK. * * * ***************************************************************** 5620 CDD455 FILL CALL FLUSH ;FLUSH BUFFER FIRST 5623 D8 RC ;CHECK FOR ERROR 5624 11BA58 LXI D,CPMDRV ;UPDATE THE DRIVE, TRACK, AND SECTOR 5627 21BD58 LXI H,BUFDRV 562A 0603 MVI B,3 ;NUMBER OF BYTES TO MOVE 562C CD3756 CALL MOVLOP ;COPY THE DATA 562F 2115E0 LXI H,DJREAD 5632 C3DB55 JMP PREP ;SELECT DRIVE, TRACK, AND SECTOR. ; THEN READ THE BUFFER ***************************************************************** * * * MOVER MOVES 128 BYTES OF DATA. SOURCE POINTER IN DE, DEST * * POINTER IN HL. * * * ***************************************************************** 5635 0680 MOVER MVI B,128 ;LENGTH OF TRANSFER 5637 1A MOVLOP LDAX D ;GET A BTE OF SOURCE 5638 77 MOV M,A ;MOVE IT 5639 13 INX D ;BUMP POINTERS 563A 23 INX H 563B 05 DCR B ;UPDATE COUNTER 563C C23756 JNZ MOVLOP ;CONTINUE MOVING UNTIL DONE 563F C9 RET ***************************************************************** * * * TERMINAL DRIVER ROUTINES. IOBYTE IS INITIALIZED BY THE COLD * * BOOT ROUTINE, TO MODIFY, CHANGE THE "INTIOBY" EQUATE. THE * * I/O ROUTINES THAT FOLLOW ALL WORK EXACTLY THE SAME WAY. USING * * IOBYTE, THEY OBTAIN THE ADDRESS TO JUMP TO IN ORDER TO EXECUTE* * THE DESIRED FUNCTION. THERE IS A TABLE WITH FOUR ENTRIES FOR * * EACH OF THE POSSIBLE ASSIGNMENTS FOR EACH DEVICE. TO MODIFY * * THE I/O ROUTINES FOR A DIFFERENT I/O CONFIGURATION, JUST * * CHANGE THE ENTRIES IN THE TABLES. * CP/M MACRO ASSEM 2.0 #028 *** Cbios For CP/M Ver. 2.2 *** * * ***************************************************************** E003 = CITTY EQU DJCIN ;INPUT FROM THE DISK JOCKEY 2D E006 = COTTY EQU DJCOUT ;OUTPUT TO THE DISK JOCKEY 2D ***************************************************************** * * * CONST: GET THE STATUS FOR THE CURRENTLY ASSIGNED CONSOLE * * DEVICE. THE CONSOLE DEVICE CAN BE GOTTEN FROM IOBYTE, * * THEN A JUMP TO THE CORRECT CONSOLE STATUS ROUTINE IS * * PERFORMED. * * * ***************************************************************** 5640 21BA56 CONST LXI H,CSTBLE ;BEGINNING OF JUMP TABLE 5643 C35256 JMP CONIN1 ;SELECT CORRECT JUMP ***************************************************************** * * * CSREADER: IF THE CONSOLE IS ASSIGNED TO THE READER THEN A * * JUMP WILL BE MADE HERE, WHERE ANOTHER JUMP WILL * * OCCUR TO THE CORRECT READER STATUS. * * * ***************************************************************** 5646 21C256 CSREADR LXI H,CSRTBLE ;BEGINNING OF READER STATUS TABLE 5649 C36F56 JMP READERA ***************************************************************** * * * CONIN: TAKE THE CORRECT JUMP FOR THE CONSOLE INPUT ROUTINE. * * THE JUMP IS BASED ON THE TWO LEAST SIGNIFICANT BITS OF * * IOBYTE. * * * ***************************************************************** 564C CDD455 CONIN CALL FLUSH ;FLUSH THE DISK BUFFER 564F 219256 LXI H,CITBLE ;BEGINNING OF CHARACTER INPUT TABLE * * ENTRY AT CONIN1 WILL DECODE THE TWO LEAST SIGNIFICANT BITS * OF IOBYTE. THIS IS USED BY CONIN,CONOUT, AND CONST. * 5652 3A0300 CONIN1 LDA IOBYTE 5655 17 RAL * * ENTRY AT SELDEV WILL FORM AN OFFSET INTO THE TABLE POINTED * TO BY H&L AND THEN PICK UP THE ADDRESS AND JUMP THERE. * 5656 E606 SELDEV ANI 6H ;STRIP OFF UNWANTED BITS 5658 1600 MVI D,0 ;FORM OFFSET 565A 5F MOV E,A CP/M MACRO ASSEM 2.0 #029 *** Cbios For CP/M Ver. 2.2 *** 565B 19 DAD D ;ADD OFFSET 565C 7E MOV A,M ;PICK UP HIGH BYTE 565D 23 INX H 565E 66 MOV H,M ;PICK UP LOW BYTE 565F 6F MOV L,A ;FORM ADDRESS 5660 E9 PCHL ;GO THERE ! ***************************************************************** * * * CONOUT: TAKE THE PROPER BRANCH ADDRESS BASED ON THE TWO LEAST * * SIGNIFICANT BITS OF IOBYTE. * * * ***************************************************************** 5661 C5 CONOUT PUSH B ;SAVE THE CHARACTER 5662 CDD455 CALL FLUSH ;FLUSH THE DISK BUFFER 5665 C1 POP B ;RESTORE THE CHARACTER 5666 219A56 LXI H,COTBLE ;BEGINNING OF THE CHARACTER OUT TABLE 5669 C35256 JMP CONIN1 ;DO THE DECODE ***************************************************************** * * * READER: SELECT THE CORRECT READER DEVICE FOR INPUT. THE * * READER IS SELECTED FROM BITS 2 AND 3 OF IOBYTE. * * * ***************************************************************** 566C 21B256 READER LXI H,RTBLE ;BEGINNING OF READER INPUT TABLE * * ENTRY AT READERA WILL DECODE BITS 2 & 3 OF IOBYTE, USED * BY CSREADER. * 566F 3A0300 READERA LDA IOBYTE * * ENTRY AT READER1 WILL SHIFT THE BITS INTO POSITION, USED * BY LIST AND PUNCH. * 5672 1F READR1 RAR 5673 C35656 JMP SELDEV ***************************************************************** * * * PUNCH: SELECT THE CORRECT PUNCH DEVICE. THE SELECTION COMES * * FROM BITS 4&5 OF IOBYTE. * * * ***************************************************************** 5676 21AA56 PUNCH LXI H,PTBLE ;BEGINNING OF PUNCH TABLE 5679 3A0300 LDA IOBYTE * * ENTRY AT PNCH1 ROTATES BITS A LITTLE MORE IN PREP FOR CP/M MACRO ASSEM 2.0 #030 *** Cbios For CP/M Ver. 2.2 *** * SELDEV, USED BY LIST. * 567C 1F PNCH1 RAR 567D 1F RAR 567E C37256 JMP READR1 ***************************************************************** * * * LIST: SELECT A LIST DEVICE BASED ON BITS 6&7 OF IOBYTE * * * ***************************************************************** 5681 21A256 LIST LXI H,LTBLE ;BEGINNING OF THE LIST DEVICE ROUTINES 5684 3A0300 LIST1 LDA IOBYTE 5687 1F RAR 5688 1F RAR 5689 C37C56 JMP PNCH1 ***************************************************************** * * * LISTST: GET THE STATUS OF THE CURRENTLY ASSIGNED LIST DEVICE * * * ***************************************************************** 568C 21CA56 LISTST LXI H,LSTBLE ;BEGINNING OF THE LIST DEVICE STATUS 568F C38456 JMP LIST1 ***************************************************************** * * * IF CUSTOMIZING I/O ROUTINES IS BEING PERFORMED, THE TABLE * * BELOW SHOULD BE MODIFIED TO REFLECT THE CHANGES. ALL I/O * * DEVICES ARE DECODED OUT OF IOBYTE AND THE JUMP IS TAKEN FROM * * THE FOLLOWING TABLES. * * * ***************************************************************** * * CONSOLE INPUT TABLE * 5692 03E0 CITBLE DW CITTY ;INPUT FROM TTY (CURRENTLY ASSIGNED ; BY INTIOBY,INPUT FROM 2D) 5694 FC56 DW CICRT ;INPUT FROM CRT (CURRENTLY SWITCHBOARD ; SERIAL PORT 1) 5696 6C56 DW READER ;INPUT FROM READER (DEPENDS ON READER ; SELECTION) 5698 FC56 DW CIUC1 ;INPUT FROM USER CONSOLE 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * CONSOLE OUTPUT TABLE * 569A 06E0 COTBLE DW COTTY ;OUTPUT TO TTY (CURRENTLY ASSIGNED ; BY INTIOBY,OUTPUT TO 2D) CP/M MACRO ASSEM 2.0 #031 *** Cbios For CP/M Ver. 2.2 *** 569C D256 DW COCRT ;OUTPUT TO CRT (CURRENTLY SWITCHBOARD ; SERIAL PORT 1) 569E 8156 DW LIST ;OUTPUT TO LIST DEVICE (DEPENDS ON ; BITS 6&7 OF IOBYTE) 56A0 D256 DW COUC1 ;OUTPUT TO USER CONSOLE 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * LIST DEVICE TABLE * 56A2 06E0 LTBLE DW COTTY ;OUTPUT TO TTY (CURRENTLY ASSIGNED ; BY INTIOBY,OUTPUT TO 2D) 56A4 D256 DW COCRT ;OUTPUT TO CRT (CURRENTLY SWITCHBOARD ; SERIAL PORT 1) 56A6 D256 DW COLPT ;OUTPUT TO LINE PRINTER (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) 56A8 DD56 DW COUL1 ;OUTPUT TO USER LINE PRINTER 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * PUNCH DEVICE TABLE * 56AA 06E0 PTBLE DW COTTY ;OUTPUT TO THE TTY (CURRENTLY ASSIGNED ; BY INTIOBY,OUTPUT TO 2D) 56AC D256 DW COPTP ;OUTPUT TO PAPER TAPE PUNCH (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) 56AE D256 DW COUP1 ;OUTPUT TO USER PUNCH 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) 56B0 D256 DW COUP2 ;OUTPUT TO USER PUNCH 2 (CURRNTLLY ; SWITCHBOARD SERIAL PORT 1) * * READER DEVICE INPUT TABLE * 56B2 03E0 RTBLE DW CITTY ;INPUT FROM TTY (CURRENTLY ASSIGNED ; BY INTIOBY, INPUT FROM 2D) 56B4 FC56 DW CIPTR ;INPUT FROM PAPER TAPE READER (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) 56B6 FC56 DW CIUR1 ;INPUT FROM USER READER 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) 56B8 FC56 DW CIUR2 ;INPUT FROM USER READER 2 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * CONSOLE STATUS TABLE * 56BA 0857 CSTBLE DW CSTTY ;STATUS OF TTY (CURRENTLY ASSIGNED ; BY INTIOBY, STSTUS FROM 2D) 56BC 1057 DW CSCRT ;STATUS FROM CRT (CURRENTLY SWITCHBOARD ; SERIAL PORT 1) 56BE 4656 DW CSREADR ;STATUS FROM READER (DEPENDS ON READER DEVICE ) 56C0 1057 DW CSUC1 ;STATUS FROM USER CONSOLE 1 (CURRENTLY CP/M MACRO ASSEM 2.0 #032 *** Cbios For CP/M Ver. 2.2 *** ; SWITCHBOARD SERIAL PORT 1) * * STATUS FROM READER DEVICE * 56C2 0857 CSRTBLE DW CSTTY ;STATUS FROM TTY (CURRENTLY ASSIGNED ; BY INTIOBY, STATUS OF 2D) 56C4 1057 DW CSPTR ;STATUS FROM PAPER TAPE READER (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) 56C6 1057 DW CSUR1 ;STATUS FROM USER READER 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) 56C8 1057 DW CSUR2 ;STATUS OF USER READER 2 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * STATUS FROM LIST DEVICE * 56CA 1E57 LSTBLE DW READY ;CONSOLE ALWAYS READY 56CC 1E57 DW READY ;GET LIST STATUS 56CE 1957 DW LSLPT 56D0 1957 DW LSLPT ***************************************************************** * * * THE FOLLOWING EQUATES SET OUTPUT DEVICE TO OUTPUT TO THE * * SWITCHBOARD SERIAL PORT 1. * * * ***************************************************************** 56D2 = COCRT EQU $ ;OUTPUT FROM CRT 56D2 = COUC1 EQU $ ;OUTPUT FROM USER CONSOLE 1 56D2 = COPTP EQU $ ;OUTPUT FROM PAPER TAPE PUNCH 56D2 = COUP1 EQU $ ;OUTPUT FROM USER PUNCH 1 56D2 = COUP2 EQU $ ;OUTPUT FROM USER PUNCH 2 56D2 DB02 COLPT IN 2 ;OUTPUT FROM LINE PRINTER,GET STATUS 56D4 E680 ANI 80H ;WAIT UNTIL OK TO SEND 56D6 CAD256 JZ COLPT 56D9 79 MOV A,C ;OUTPUT THE CHARACTER 56DA D301 OUT 1 56DC C9 RET ***************************************************************** * * * CUSTOM I/O PRINTER DRIVER FOR DIABLO PRINTER WITH 1200 BAUD * * ETX/ACK HANDSHAKE. * * * ***************************************************************** 56DD CDD256 COUL1 CALL COLPT ;OUTPUT THE CHARACTER 56E0 3AFB56 LDA COUNT 56E3 3D DCR A 56E4 32FB56 STA COUNT 56E7 C0 RNZ 56E8 3E32 MVI A,50 CP/M MACRO ASSEM 2.0 #033 *** Cbios For CP/M Ver. 2.2 *** 56EA 32FB56 STA COUNT 56ED 0E03 MVI C,AETX 56EF CDD256 CALL COLPT 56F2 CDFC56 PWAIT CALL CIPTR 56F5 FE06 CPI AACK 56F7 C2F256 JNZ PWAIT 56FA C9 RET 56FB 32 COUNT DB 50 ***************************************************************** * * * THE FOLLOWING EQUATES SET THE INPUT FROM THE DEVICES TO COME * * FROM THE SWITCHBOARD SERIAL PORT 1. * * * ***************************************************************** 56FC = CIUC1 EQU $ ;INPUT FROM USER CONSOLE 1 56FC = CICRT EQU $ ;INPUT FROM CRT 56FC = CIUR1 EQU $ ;INPUT FROM USER READER 1 56FC = CIUR2 EQU $ ;INPUT FROM USER READER 2 56FC DB02 CIPTR IN 2 ;INPUT FROM PAPER TAPE READER, GET STATUS 56FE E640 ANI 40H ;WAIT FOR CHARACTER 5700 CAFC56 JZ CIPTR 5703 DB01 IN 1 5705 E67F ANI 7FH ;STRIP OFF THE PARITY 5707 C9 RET ***************************************************************** * * * CONSOLE STATUS ROUTINES, TEST IF A CHARACTER HAS ARRIVED. * * * ***************************************************************** 5708 CD21E0 CSTTY CALL DJTSTAT ;STATUS FROM DISK JOCKEY 2D 570B 3E00 STAT MVI A,0 ;PREP FOR ZERO RETURN 570D C0 RNZ ;NOTHING FOUND 570E 3D DCR A ;RETURN WITH 0FFH 570F C9 RET ***************************************************************** * * * THE FOLLOWING EQUATES CAUSE THE DEVICES TO GET STATUS FROM * * THE SWITCHBOARD SERIAL PORT 1. * * * ***************************************************************** 5710 = CSUR1 EQU $ ;STATUS OF USER READER 1 5710 = CSUR2 EQU $ ;STATUS OF USER READER 2 5710 = CSPTR EQU $ ;STATUS OF PAPER TAPE READER 5710 = CSUC1 EQU $ ;STATUS OF USER CONSOLE 1 5710 DB02 CSCRT IN 2 ;STATUS FROM CRT, GET STATUS 5712 E640 ANI 40H ;STRIP OF DATA READY BIT 5714 EE40 XRI 40H ;MAKE CORRECT POLARITY 5716 C30B57 JMP STAT ;RETURN PROPER INDICATION CP/M MACRO ASSEM 2.0 #034 *** Cbios For CP/M Ver. 2.2 *** ***************************************************************** * * * LIST DEVICE STATUS ROUTINES. * * * ***************************************************************** 5719 DB02 LSLPT IN 2 ;ALL OTHER DEVICES WAIT 571B E680 ANI 80H 571D C8 RZ 571E 3EFF READY MVI A,0FFH 5720 C9 RET ***************************************************************** * * * TINIT CAN BE MODIFIED FOR DIFFERENT I/O SETUPS. * * * ***************************************************************** 5721 0E1A TINIT MVI C,CLEAR ;INITIALIZE THE TERMINAL ROUTINE 5723 3E00 MVI A,INTIOBY ;INITIALIZE IOBYTE 5725 320300 STA IOBYTE 5728 C30C53 JMP COUT ***************************************************************** * * * XLT TABLES (SECTOR SKEW TABLES) FOR CP/M 2.0. THESE TABLES * * DEFINE THE SECTOR TRANSLATION THAT OCCURS WHEN MAPPING CP/M * * SECTORS TO PHYSICAL SECTORS ON THE DISK. THERE IS ONE SKEW * * TABLE FOR EACH OF THE POSSIBLE SECTOR SIZES. CURRENTLY THE * * TABLES ARE LOCATED ON TRACK 0 SECTORS 6 AND 8. THEY ARE * * LOADED INTO MEMORY IN THE CBIOS RAM BY THE COLD BOOT ROUTINE. * * * ***************************************************************** 572B 00 XLT128 DB 0 572C 01070D1319 DB 1,7,13,19,25 5731 050B1117 DB 5,11,17,23 5735 03090F15 DB 3,9,15,21 5739 02080E141A DB 2,8,14,20,26 573E 060C1218 DB 6,12,18,24 5742 040A1016 DB 4,10,16,22 5746 00 XLT256 DB 0 5747 0102131425 DB 1,2,19,20,37,38 574D 0304151627 DB 3,4,21,22,39,40 5753 0506171829 DB 5,6,23,24,41,42 5759 0708191A2B DB 7,8,25,26,43,44 575F 090A1B1C2D DB 9,10,27,28,45,46 5765 0B0C1D1E2F DB 11,12,29,30,47,48 576B 0D0E1F2031 DB 13,14,31,32,49,50 5771 0F10212233 DB 15,16,33,34,51,52 5777 11122324 DB 17,18,35,36 577B 00 XLT512 DB 0 577C 0102030411 DB 1,2,3,4,17,18,19,20 5784 2122232431 DB 33,34,35,36,49,50,51,52 CP/M MACRO ASSEM 2.0 #035 *** Cbios For CP/M Ver. 2.2 *** 578C 0506070815 DB 5,6,7,8,21,22,23,24 5794 2526272835 DB 37,38,39,40,53,54,55,56 579C 090A0B0C19 DB 9,10,11,12,25,26,27,28 57A4 292A2B2C39 DB 41,42,43,44,57,58,59,60 57AC 0D0E0F101D DB 13,14,15,16,29,30,31,32 57B4 2D2E2F30 DB 45,46,47,48 57B8 00 XLT124 DB 0 57B9 0102030405 DB 1,2,3,4,5,6,7,8 57C1 191A1B1C1D DB 25,26,27,28,29,30,31,32 57C9 3132333435 DB 49,50,51,52,53,54,55,56 57D1 090A0B0C0D DB 9,10,11,12,13,14,15,16 57D9 2122232425 DB 33,34,35,36,37,38,39,40 57E1 393A3B3C3D DB 57,58,59,60,61,62,63,64 57E9 1112131415 DB 17,18,19,20,21,22,23,24 57F1 292A2B2C2D DB 41,42,43,44,45,46,47,48 ***************************************************************** * * * EACH OF THE FOLLOWING TABLES DESCRIBES A DISKETTE WITH THE * * SPECIFIED CHARACTERISTICS. THE TABLES ARE CURRENTLY STORED * * ON TRACK 0 SECTOR 13. THEY ARE READ INTO MEMORY BY THE GOCPM * * ROUTINE IN THE CBIOS FOR CP/M VER 2.0. * * * ***************************************************************** ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE FOR 128 BYTE SECTORS, * * SINGLE DENSITY, AND SINGLE SIDED. * * * ***************************************************************** 57F9 1A00 DPB128S DW 26 ;CP/M SECTORS/TRACK 57FB 03 DB 3 ;BSH 57FC 07 DB 7 ;BLM 57FD 00 DB 0 ;EXM 57FE F200 DW 242 ;DSM 5800 3F00 DW 63 ;DRM 5802 C0 DB 0C0H ;AL0 5803 00 DB 0 ;AL1 5804 1000 DW 16 ;CKS 5806 0200 DW 2 ;OFF 5808 01 DB 1H ;16*((#CPM SECTORS/PHYSICAL SECTOR) -1) + ;LOG2(#BYTES PER SECTOR/128) + 1 + ;8 IF DOUBLE SIDED. ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE FOR 256 BYTE SECTORS, * * DOUBLE DENSITY, AND SINGLE SIDED. * * * ***************************************************************** 5809 3400 DPB256S DW 52 ;CP/M SECTORS/TRACK CP/M MACRO ASSEM 2.0 #036 *** Cbios For CP/M Ver. 2.2 *** 580B 04 DB 4 ;BSH 580C 0F DB 15 ;BLM 580D 00 DB 0 ;EXM 580E F200 DW 242 ;DSM 5810 7F00 DW 127 ;DRM 5812 C0 DB 0C0H ;AL0 5813 00 DB 0 ;AL1 5814 2000 DW 32 ;CKS 5816 0200 DW 2 ;OFF 5818 12 DB 12H ;16*((#CPM SECTORS/PHYSICAL SECTOR) -1) + ;LOG2(#BYTES PER SECTOR/128) + 1 + ;8 IF DOUBLE SIDED. ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 512 BYTE SECTORS, * * DOUBLE DENSITY, AND SINGLE SIDED. * * * ***************************************************************** 5819 3C00 DPB512S DW 60 ;CP/M SECTORS/TRACK 581B 04 DB 4 ;BSH 581C 0F DB 15 ;BLM 581D 00 DB 0 ;EXM 581E 1801 DW 280 ;DSM 5820 7F00 DW 127 ;DRM 5822 C0 DB 0C0H ;AL0 5823 00 DB 0 ;AL1 5824 2000 DW 32 ;CKS 5826 0200 DW 2 ;OFF 5828 33 DB 33H ;16*((#CPM SECTORS/PHYSICAL SECTOR) -1) + ;LOG2(#BYTES PER SECTOR/128) + 1 + ;8 IF DOUBLE SIDED. ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 1024 BYTE SECTORS, * * DOUBLE DENSITY, AND SINGLE SIDED. * * * ***************************************************************** 5829 4000 DP1024S DW 64 ;CP/M SECTORS/TRACK 582B 04 DB 4 ;BSH 582C 0F DB 15 ;BLM 582D 00 DB 0 ;EXM 582E 2B01 DW 299 ;DSM 5830 7F00 DW 127 ;DRM 5832 C0 DB 0C0H ;AL0 5833 00 DB 0 ;AL1 5834 2000 DW 32 ;CKS 5836 0200 DW 2 ;OFF 5838 74 DB 74H ;16*((#CPM SECTORS/PHYSICAL SECTOR) -1) + ;LOG2(#BYTES PER SECTOR/128) + 1 + ;8 IF DOUBLE SIDED. ***************************************************************** CP/M MACRO ASSEM 2.0 #037 *** Cbios For CP/M Ver. 2.2 *** * * * THE FOLLOWING DPB DEFINES A DISKETTE FOR 128 BYTE SECTORS, * * SINGLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** 5839 3400 DPB128D DW 52 ;CP/M SECTORS/TRACK 583B 04 DB 4 ;BSH 583C 0F DB 15 ;BLM 583D 01 DB 1 ;EXM 583E F200 DW 242 ;DSM 5840 7F00 DW 127 ;DRM 5842 C0 DB 0C0H ;AL0 5843 00 DB 0 ;AL1 5844 2000 DW 32 ;CKS 5846 0200 DW 2 ;OFF 5848 09 DB 9H ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 256 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** 5849 6800 DPB256D DW 104 ;CP/M SECTORS/TRACK 584B 04 DB 4 ;BSH 584C 0F DB 15 ;BLM 584D 00 DB 0 ;EXM 584E E601 DW 486 ;DSM 5850 FF00 DW 255 ;DRM 5852 F0 DB 0F0H ;AL0 5853 00 DB 0 ;AL1 5854 4000 DW 64 ;CKS 5856 0200 DW 2 ;OFF 5858 1A DB 1AH ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 512 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** 5859 7800 DPB512D DW 120 ;CP/M SECTORS/TRACK 585B 04 DB 4 ;BSH 585C 0F DB 15 ;BLM 585D 00 DB 0 ;EXM 585E 3102 DW 561 ;DSM 5860 FF00 DW 255 ;DRM 5862 F0 DB 0F0H ;AL0 5863 00 DB 0 ;AL1 5864 4000 DW 64 ;CKS 5866 0200 DW 2 ;OFF 5868 3B DB 3BH CP/M MACRO ASSEM 2.0 #038 *** Cbios For CP/M Ver. 2.2 *** ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 1024 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** 5869 8000 DP1024D DW 128 ;CP/M SECTORS/TRACK 586B 04 DB 4 ;BSH 586C 0F DB 15 ;BLM 586D 00 DB 0 ;EXM 586E 5702 DW 599 ;DSM 5870 FF00 DW 255 ;DRM 5872 F0 DB 0F0H ;AL0 5873 00 DB 0 ;AL1 5874 4000 DW 64 ;CKS 5876 0200 DW 2 ;OFF 5878 7C DB 7CH ***************************************************************** * * * CP/M DISK PARAMETER HEADERS, UNITIALIZED. * * * ***************************************************************** 5879 0000 DPZERO DW 0 ;ADDRESS OF TRANSLATION TABLE (FILLED ; IN BY SETDRV) 587B 0000000000 DW 0,0,0 ;USED BY BDOS 5881 EC5E DW DIRBUF ;ADDRESS OF DIRECTORY BUFFER 5883 0000 DW 0 ;ADDRESS OF DPB (FILLED IN BY SETDRV) 5885 EC5D DW CSV0 ;DIRECTORY CHECK VECTOR 5887 C05C DW ALV0 ;ALLOCATION VECTOR 5889 0000 DPONE DW 0 588B 0000000000 DW 0,0,0 5891 EC5E DW DIRBUF 5893 0000 DW 0 5895 2C5E DW CSV1 5897 0B5D DW ALV1 5899 0000 DPTWO DW 0 589B 0000000000 DW 0,0,0 58A1 EC5E DW DIRBUF 58A3 0000 DW 0 58A5 6C5E DW CSV2 58A7 565D DW ALV2 58A9 0000 DPTHRE DW 0 58AB 0000000000 DW 0,0,0 58B1 EC5E DW DIRBUF 58B3 0000 DW 0 58B5 AC5E DW CSV3 58B7 A15D DW ALV3 ***************************************************************** * * CP/M MACRO ASSEM 2.0 #039 *** Cbios For CP/M Ver. 2.2 *** * CBIOS RAM LOCATIONS THAT DON'T NEED INITIALIZATION. * * * ***************************************************************** 58B9 00 CPMSEC DB 0 ;CP/M SECTOR # 58BA 00 CPMDRV DB 0 ;CP/M DRIVE # 58BB 00 CPMTRK DB 0 ;CP/M TRACK # 58BC 00 TRUESEC DB 0 ;DISK JOCKEY SECTOR THAT CONTAINS CP/M SECTOR 58BD 00 BUFDRV DB 0 ;DRIVE THAT BUFFER BELONGS TO 58BE 00 BUFTRK DB 0 ;TRACK THAT BUFFER BELONGS TO 58BF 00 BUFSEC DB 0 ;SECTOR THAT BUFFER BELONGS TO 58C0 BUFFER DS 1024 ;MAXIMUM SIZE BUFFER FOR 1K SECTORS 5CC0 ALV0 DS 75 ;ALLOCATION VECTOR FOR DRIVE A 5D0B ALV1 DS 75 ;ALLOCATION VECTOR FOR DRIVE B 5D56 ALV2 DS 75 ;ALLOCATION VECTOR FOR DRIVE C 5DA1 ALV3 DS 75 ;ALLOCATION VECTOR FOR DRIVE D 5DEC CSV0 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE A 5E2C CSV1 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE B 5E6C CSV2 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE C 5EAC CSV3 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE D 5EEC DIRBUF DS 128 ;DIRECTORY BUFFER 5F6C END************************************