CP/M MACRO ASSEM 2.0 #001 *** Cbios For CP/M Ver. 2.2 *** 1 ***************************************************************** 2 * * 3 * FIRMWARE FOR DISK JOCKEY MODEL B. * 4 * * 5 ***************************************************************** 6 7 TITLE '*** Disk Jockey Model B Firmware ***' 8 9 E000 = ORIGIN EQU 0E000H 10 11 E000 ORG ORIGIN 12 13 E400 = RAM EQU ORIGIN+400H 14 E3F8 = IO EQU ORIGIN+3F8H 15 E3F8 = UDATA EQU IO 16 E3F9 = DREG EQU IO+1 17 E3F9 = USTAT EQU IO+1 18 E3FA = DCMD EQU IO+2 19 E3FA = DSTAT EQU IO+2 20 E3FB = CSTALL EQU IO+3 21 E3FC = CMDREG EQU IO+4 22 E3FC = CSTAT EQU IO+4 23 E3FD = TRKREG EQU IO+5 24 E3FE = SECREG EQU IO+6 25 E3FF = DATREG EQU IO+7 26 27 0001 = LIGHT EQU 1 28 0001 = HEAD EQU 1 29 0001 = DENSITY EQU 1 30 0004 = INTRQ EQU 4 31 0004 = ISTAT EQU 4 32 0004 = TZERO EQU 4 33 0004 = LOAD EQU 4 34 0006 = ULOAD EQU 6 35 0008 = OSTAT EQU 10Q 36 0008 = DSIDE EQU 10Q 37 0009 = NOLITE EQU 11Q 38 0009 = DCRINT EQU 11Q 39 0009 = HCMD EQU 11Q 40 0010 = INDEX EQU 20Q 41 0012 = WINDXD EQU 22Q 42 0018 = SKCMD EQU 30Q 43 001A = RINDXD EQU 32Q 44 001D = SVCMD EQU 35Q 45 0040 = WPROT EQU 100Q 46 0040 = ACCESS EQU 100Q 47 0080 = RSTBIT EQU 200Q 48 0080 = JREADY EQU 200Q 49 0080 = RDCMD EQU 200Q 50 00A0 = WRCMD EQU 240Q 51 00C0 = STBITS EQU 300Q 52 00C4 = RACMD EQU 304Q 53 00D0 = CLRCMD EQU 320Q 54 55 E000 C369E0 DBOOT JMP BOOT 56 E003 C3E9E0 TERMIN JMP CIN CP/M MACRO ASSEM 2.0 #002 *** Cbios For CP/M Ver. 2.2 *** 57 E006 C3DAE0 TRMOUT JMP JCOUT 58 E009 C35AE1 TKZERO JMP JHOME 59 E00C C38BE1 TRKSET JMP SEEK 60 E00F C381E1 JSECT JMP SECSET 61 E012 C343E1 JDMA JMP DMA 62 E015 C3DDE1 DREAD JMP JREAD 63 E018 C3BCE1 DWRITE JMP JWRITE 64 E01B C33CE1 SELDRV JMP DRIVE 65 E01E C3F8E0 TPANIC JMP CPAN 66 E021 C303E1 TSTAT JMP TMSTAT 67 E024 C334E1 DMAST JMP DMSTAT 68 E027 C309E1 STATUS JMP DISKST 69 E02A C3C5E0 DSKERR JMP LERROR 70 E02D C3B3E3 SETDEN JMP DENFIX 71 E030 C3E5E3 SETSID JMP SIDEFX 72 73 74 E033 DS 66Q 75 76 E069 31FAE7 BOOT LXI SP,TRACK+1 ;INITIALIZE SP 77 E06C CDD2E3 CALL TIMOUT ;POC/RESET TIMEOUT 78 E06F 210100 LXI H,1 79 E072 E5 PUSH H ;TRACK 0, SECTOR 1 80 E073 2E09 MVI L,DCRINT ;SET UP THE 81 E075 E5 PUSH H ; SIDE SELECT 82 E076 26FF MVI H,377Q ; AND INITIAL 83 E078 E5 PUSH H ; DRIVE 84 E079 E5 PUSH H ; PARAMETERS 85 E07A E5 PUSH H 86 E07B E5 PUSH H 87 E07C 210800 LXI H,10Q ;INITIALIZE 88 E07F E5 PUSH H ; TZFLAG & CDISK 89 E080 2E7E MVI L,176Q ;INITIALIZE 90 E082 E5 PUSH H ; DISK & DRVSEL 91 E083 2E08 MVI L,10Q ;INITIALIZE 92 E085 E5 PUSH H ; HDFLAG & DSFLAG 93 E086 2618 MVI H,30Q ;INITIALIZE 94 E088 E5 PUSH H ; TIMER CONSTANT 95 E089 3E7F MVI A,177Q ;START 1791 96 E08B 32F9E3 STA DREG 97 E08E 3ED0 MVI A,CLRCMD ;1791 RESET 98 E090 32FCE3 STA CMDREG 99 LDHEAD 100 E093 AF XRA A ;LOAD THE HEAD 101 E094 CD1BE3 CALL HDCHK ; AND TEST FOR 102 E097 D2A5E0 JNC DOOROK ; DRIVE READY 103 E09A 3E01 MVI A,LIGHT ;TURN ON THE 104 E09C 32F6E7 STA DCREG ; ERROR LED 105 E09F CDD2E3 CALL TIMOUT ;TIMEOUT TO 106 E0A2 C393E0 JMP LDHEAD ; CLOSE DRIVE DOOR 107 DOOROK 108 E0A5 3E09 MVI A,NOLITE ;TURN OFF THE 109 E0A7 32F6E7 STA DCREG ; ERROR LED 110 E0AA CD96E3 CALL MEASUR ;HEAD LOAD TIME 111 E0AD C1 POP B ;ADJUST THE STACK 112 E0AE 0100E7 LXI B,RAM+300H ;DMA ADDR CP/M MACRO ASSEM 2.0 #003 *** Cbios For CP/M Ver. 2.2 *** 113 E0B1 C5 PUSH B ;INITIALIZE 114 E0B2 D5 PUSH D ; DMAADR & TIMER 115 E0B3 210000 LXI H,0 ;INITIALIZE 116 E0B6 E5 PUSH H ; INTRFG & RAMINS 117 E0B7 00 NOP ;DEBUG INSTRUCTION 118 E0B8 C5 PUSH B ;BOOT ADDRESS 119 E0B9 060C MVI B,12 ;NUMBER OF RETRYS 120 LDLOOP 121 E0BB C5 PUSH B ;SAVE THE RETRY NO. 122 E0BC CDDDE1 CALL JREAD ;READ BOOT SECTOR 123 E0BF C1 POP B ;RESTOR RETRY NO. 124 E0C0 D0 RNC ;SUCCESSFUL READ? 125 E0C1 05 DCR B ;NO - COUNT DOWN 126 E0C2 C2BBE0 JNZ LDLOOP ; AND TRY AGAIN 127 LERROR 128 E0C5 0E09 MVI C,11Q 129 E0C7 11C3A2 LXI D,0A2C3H 130 LELOOP 131 E0CA 1B DCX D 132 E0CB 7A MOV A,D 133 E0CC B3 ORA E 134 E0CD C2CAE0 JNZ LELOOP 135 E0D0 3E08 MVI A,10Q ;BLINK 136 E0D2 A9 XRA C ; THE LED AT 137 E0D3 4F MOV C,A ; TOP OF THE 138 E0D4 32FAE3 STA DCMD ; CIRCUIT BOARD 139 E0D7 C3C7E0 JMP LERROR+2 140 141 JCOUT 142 E0DA 3AF9E3 LDA USTAT ;GET UART STATUS 143 E0DD E608 ANI OSTAT ;OUTPUT READY MASK 144 E0DF C2DAE0 JNZ JCOUT ;TEST BUFFER EMPTY 145 E0E2 79 MOV A,C ;CHARACTER DATA 146 E0E3 2F CMA ;NEGATIVE LOGIC BUS 147 E0E4 32F8E3 STA UDATA ;SEND DATA TO UART 148 E0E7 2F CMA ;MAKE POSITIVE 149 E0E8 C9 RET 150 151 CIN 152 E0E9 3AF9E3 LDA USTAT ;GET UART STATUS 153 E0EC E604 ANI ISTAT ;INPUT READY MASK 154 E0EE C2E9E0 JNZ CIN ;WAIT FOR INPUT 155 E0F1 3AF8E3 LDA UDATA ;GET THE CHARACTER 156 E0F4 2F CMA ;ADJUST FOR NEGATIVE BUS 157 E0F5 E67F ANI 177Q ;TRIM TO 7 BITS 158 E0F7 C9 RET 159 160 CPAN 161 E0F8 3AF9E3 LDA USTAT ;GET UART STATUS 162 E0FB E604 ANI ISTAT ;INPUT READY MASK 163 E0FD C0 RNZ ;TEST FOR DATA 164 E0FE CDE9E0 CALL CIN ;GET CHARACTER 165 E101 B9 CMP C ;TEST FOR PANIC CHTR 166 E102 C9 RET 167 TMSTAT 168 E103 3AF9E3 LDA USTAT ;GET UART STATUS CP/M MACRO ASSEM 2.0 #004 *** Cbios For CP/M Ver. 2.2 *** 169 E106 E604 ANI ISTAT ;INPUT READY MASK 170 E108 C9 RET 171 172 DISKST 173 E109 21FDE3 LXI H,TRKREG ;MOST RECENT 174 E10C 4E MOV C,M ; TRACK TO C 175 E10D 23 INX H ;MOST RECENT 176 E10E 46 MOV B,M ; SECTOR TO B 177 E10F 3AF6E7 LDA DCREG ;GET CURRENT 178 E112 2F CMA ; DENSITY IN 179 E113 E601 ANI 1 ; THE MSB 180 E115 0F RRC ; POSITION 181 E116 57 MOV D,A ;SAVE IN D 182 E117 3AF7E7 LDA SIDE ;PUT THE 183 E11A 07 RLC ; MOST RECENT 184 E11B 07 RLC ; SIDE SELECT 185 E11C 07 RLC ; IN BIT POSITIN 186 E11D B2 ORA D ; 6 AND MERGE 187 E11E 57 MOV D,A ;SAVE IN D 188 E11F 3AE8E7 LDA DSFLAG ;GET THE 189 E122 EE08 XRI DSIDE ; MOST RECENT 190 E124 17 RAL ; DOUBLE SIDED 191 E125 17 RAL ; STATUS AND PLACE 192 E126 82 ADD D ; IN BIT POSITION 193 E127 57 MOV D,A ; 5 AND MERGE 194 E128 3AFDE7 LDA SECLEN ;GET THE 195 E12B 17 RAL ; SECTOR LENGTH 196 E12C 17 RAL ; CODE BITS IN 197 E12D B2 ORA D ; POSITIONS 2 & 3 198 E12E 57 MOV D,A ; AND MERGE 199 E12F 3AECE7 LDA JCDISK ;GET THE CURRENT 200 E132 82 ADD D ; DISK NO. IN BIT 201 E133 C9 RET ; POSITIONS 0 & 1 202 203 DMSTAT 204 E134 E5 PUSH H ;SAVE THE HL PAIR 205 E135 2AE6E7 LHLD DMAADR ;MOVE THE 206 E138 44 MOV B,H ; DMA ADDRESS TO 207 E139 4D MOV C,L ; THE BC PAIR 208 E13A E1 POP H ;RECOVER HL 209 E13B C9 RET 210 211 DRIVE 212 E13C 79 MOV A,C ;DRIVE SELECT 213 E13D E603 ANI 3 ; VALUES MUST BE 214 E13F 32EBE7 STA DISK ; BETWEEN ZERO 215 E142 C9 RET ; AND THREE 216 217 DMA 218 E143 21001C LXI H,-RAM ;TEST THE 219 E146 09 DAD B ; DMA ADDRESS 220 E147 DA54E1 JC DMASET ; FOR CONFLICT 221 E14A 210820 LXI H,8-ORIGIN 222 E14D 09 DAD B ; WITH THE I/O 223 E14E D254E1 JNC DMASET ; ON THE DJ/2D 224 E151 3E10 MVI A,20Q ; CONTROLLER CP/M MACRO ASSEM 2.0 #005 *** Cbios For CP/M Ver. 2.2 *** 225 E153 C9 RET 226 DMASET 227 E154 60 MOV H,B ;STORE THE 228 E155 69 MOV L,C ; BC PAIR 229 E156 22E6E7 SHLD DMAADR 230 E159 C9 RET 231 232 JHOME 233 E15A CDE3E2 CALL HDLOAD ;LOAD THE HEAD 234 E15D D8 RC ;NOT READY ERROR 235 E15E CD70E1 CALL HENTRY ;MOVE THE HEAD 236 E161 F5 PUSH PSW ;SAVE STATUS 237 E162 9F SBB A ;UPDATE THE 238 E163 32F9E7 STA TRACK ; TRACK 239 E166 32FDE3 STA TRKREG ; REGISTERS 240 E169 AF XRA A ;SET THE NOT 241 E16A 32EDE7 STA TZFLAG ; VERIFIED FLAG 242 E16D C323E2 JMP LEAVE+1 ;UNLOAD THE HEAD 243 HENTRY 244 E170 AF XRA A ;SET THE FORCE 245 E171 32E9E7 STA HDFLAG ; VERIFY FLAG 246 E174 210000 LXI H,0 ;TIMEOUT CONSTANT 247 E177 3E09 MVI A,HCMD ;MOVE THE HEAD 248 E179 CD62E3 CALL CENTRY ;TO TRACK 0 249 E17C E604 ANI TZERO ;TRACK ZERO BIT 250 E17E C0 RNZ 251 E17F 37 STC ;ERROR FLAG 252 E180 C9 RET 253 254 SECSET 255 E181 AF XRA A ;TEST FOR 256 E182 B1 ORA C ; ZERO VALUE 257 E183 37 STC ;ERROR FLAG 258 E184 C8 RZ ;ERROR RETURN 259 E185 E61F ANI 37Q ;TRIM & CLEAR CRY 260 E187 32F8E7 STA SECTOR 261 E18A C9 RET 262 263 SEEK 264 E18B 79 MOV A,C ;TEST FOR 265 E18C FE4D CPI 77 ; TRACK 266 E18E 3F CMC ; TOO LARGE 267 E18F D8 RC 268 E190 32F9E7 STA TRACK 269 E193 C9 RET 270 271 E194 32E3E7 ISSUE STA ECOUNT+1 ;UPDATE COUNT 272 E197 CD96E3 CALL MEASUR ;FIND INDEX 273 E19A 0E01 MVI C,1 ;START WITH SECTOR 1 274 ISLOOP 275 E19C 79 MOV A,C ;INITILIZE THE 276 E19D 32FEE3 STA SECREG ; SECTOR REGISTER 277 E1A0 3AF8E7 LDA SECTOR ;TEST FOR 278 E1A3 B9 CMP C ; TARGET SECTOR 279 E1A4 C8 RZ 280 E1A5 3E80 MVI A,RDCMD ;DO A FAKE CP/M MACRO ASSEM 2.0 #006 *** Cbios For CP/M Ver. 2.2 *** 281 E1A7 CD5DE3 CALL COMAND ; READ COMMAND 282 E1AA DA20E2 JC PLEAVE ;ABORT ON ERROR 283 E1AD 0C INR C ;INCREMENT SECTOR NUMBER 284 E1AE C39CE1 JMP ISLOOP 285 286 E1B1 32FCE3 COMNDP STA CMDREG ;START OPERATION 287 E1B4 48 MOV C,B ;INITILIZE BLOCK COUNT 288 E1B5 11FFE3 LXI D,DATREG ;DATA REGISTER 289 E1B8 2AE6E7 LHLD DMAADR ;TRANSFER ADDRESS 290 E1BB C9 RET 291 292 JWRITE 293 E1BC CD33E2 CALL JPREP ;PREPARE FOR WRITE 294 E1BF DA22E2 JC LEAVE ;ABORT OPERATION 295 WRENTRY 296 E1C2 3EA0 MVI A,WRCMD ;WRITE SECTOR CMD 297 E1C4 CDB1E1 CALL COMNDP 298 WRLOOP 299 E1C7 7E MOV A,M ;LOAD 1ST BYTE OF DATA 300 E1C8 23 INX H 301 E1C9 12 STAX D ;WRITE 1ST BYTE OF DATA 302 E1CA 7E MOV A,M ;LOAD 2ND BYTE OF DATA 303 E1CB 23 INX H 304 E1CC 12 STAX D ;WRITE 2ND BYTE OF DATA 305 E1CD 7E MOV A,M ;LOAD 3RD BYTE OF DATA 306 E1CE 23 INX H 307 E1CF 12 STAX D ;WRITE 3RD BYTE OF DATA 308 E1D0 0D DCR C ;REDUCE BLOCK COUNT 309 E1D1 7E MOV A,M 310 E1D2 23 INX H 311 E1D3 12 STAX D 312 E1D4 C2C7E1 JNZ WRLOOP ;WRITE NEXT 4 BYTES 313 E1D7 21C2E1 LXI H,WRENTRY 314 E1DA C3FBE1 JMP CBUSY 315 316 JREAD 317 E1DD CD33E2 CALL JPREP ;PREPARE FOR READ 318 E1E0 DA22E2 JC LEAVE ;ABORT OPERATION 319 RDENTRY 320 E1E3 3E80 MVI A,RDCMD 321 E1E5 CDB1E1 CALL COMNDP 322 RDLOOP 323 E1E8 1A LDAX D ;READ 1ST BYTE 324 E1E9 77 MOV M,A ;STORE 1ST BYTE 325 E1EA 23 INX H 326 E1EB 1A LDAX D ;READ 2ND BYTE 327 E1EC 77 MOV M,A ;STORE 2ND BYTE 328 E1ED 23 INX H 329 E1EE 1A LDAX D ;READ 3RD BYTE 330 E1EF 77 MOV M,A ;STORE 3RD BYTE 331 E1F0 23 INX H 332 E1F1 0D DCR C ;REDUCE BLOCK COUNT 333 E1F2 1A LDAX D ;READ 4TH BYTE 334 E1F3 77 MOV M,A ;STORE 4TH BYTE 335 E1F4 23 INX H 336 E1F5 C2E8E1 JNZ RDLOOP ;READ NEXT 4 BYTES CP/M MACRO ASSEM 2.0 #007 *** Cbios For CP/M Ver. 2.2 *** 337 E1F8 21E3E1 LXI H,RDENTRY 338 339 CBUSY 340 E1FB E5 PUSH H ;SAVE RETURN 341 E1FC 21FCE3 LXI H,CSTAT ;WAIT FOR 1791 342 E1FF CD6CE3 CALL BUSY ; TO FINISH COMMAND 343 E202 E65F ANI 137Q ;ERROR MASK 344 E204 CA21E2 JZ LEAVE-1 ;NO ERROR 345 E207 FE10 CPI 20Q ;PREMATURE INTERUPT 346 E209 C220E2 JNZ PLEAVE ;OTHER TYPE OF ERROR 347 E20C 3AE2E7 LDA ECOUNT ;DECREMENT ERROR COUNT 348 E20F 3D DCR A ; BY ONE 349 E210 FA17E2 JM STEST ;HARD INTERUPT ERROR 350 E213 32E2E7 STA ECOUNT ;UPDATE COUNT 351 E216 C9 RET 352 STEST 353 E217 3AE3E7 LDA ECOUNT+1 ;DECREMENT ERROR 354 E21A 3D DCR A 355 E21B F294E1 JP ISSUE 356 E21E 3E10 MVI A,20Q 357 PLEAVE 358 E220 37 STC ;ERROR FLAG 359 E221 E1 POP H 360 361 LEAVE 362 E222 F5 PUSH PSW ;SAVE THE STATUS 363 E223 3AF6E7 LDA DCREG ;CONTROL BITS 364 E226 EE04 XRI LOAD ;TOGGLE THE 365 E228 32FAE3 STA DCMD ; HEAD LOAD BIT 366 E22B 3AEAE7 LDA DRVSEL ;ENABLE ACCESS TO 367 E22E 32F9E3 STA DREG ; THE DATA REGISTER 368 E231 F1 POP PSW ;RECOVER THE STATUS 369 E232 C9 RET 370 371 JPREP 372 E233 CDE3E2 CALL HDLOAD ;LOAD THE HEAD 373 E236 D8 RC ;TEST FOR DRIVE READY 374 E237 3AFDE3 LDA TRKREG ;GET OLD TRACK 375 E23A 3C INR A ;TEST FOR HEAD 376 E23B CC70E1 CZ HENTRY ; NOT CALIBRATED 377 E23E D8 RC ;SEEK ERROR? 378 E23F 21FDE3 LXI H,TRKREG ;OLD TRACK 379 E242 3AF9E7 LDA TRACK ;NEW TRACK 380 E245 BE CMP M ;TEST FOR HEAD MOTION 381 E246 23 INX H ;ADVANCE TO THE 382 E247 23 INX H ; DATA REGISTER 383 E248 77 MOV M,A ;SAVE NEW TRACK 384 E249 79 MOV A,C ;TURN OFF DATA REG 385 E24A 32F9E3 STA DREG ; ACCESS CONTROL BIT 386 E24D CA6AE2 JZ TVERFY ;TEST FOR SEEK 387 E250 AF XRA A ;FORCE A READ 388 E251 32E9E7 STA HDFLAG ; HEADER OPERATION 389 E254 3AFAE3 LDA DSTAT ;GET THE DOUBLE 390 E257 E608 ANI DSIDE ; SIDED FLAG 391 E259 32E8E7 STA DSFLAG ;SAVE FOR STATUS 392 E25C 1F RAR ;SHIFT FOR CP/M MACRO ASSEM 2.0 #008 *** Cbios For CP/M Ver. 2.2 *** 393 E25D 1F RAR ; 3/6 MS STEP 394 E25E 1F RAR ; RATE CONSTANT 395 E25F C618 ADI SKCMD ;DO A 396 E261 210000 LXI H,0 ; SEEK 397 E264 CD62E3 CALL CENTRY ; OPERATION 398 E267 DA8EE2 JC SERROR ;SEEK ERROR? 399 TVERFY 400 E26A 3AE9E7 LDA HDFLAG ;GET THE FORCE 401 E26D B7 ORA A ; VERIFY HDR FLAG 402 E26E C2B9E2 JNZ CHKSEC ;NO SEEK & HEAD OK 403 E271 0602 MVI B,2 ;VERIFY RETRY COUNT 404 SLOOP 405 E273 3E1D MVI A,SVCMD ;DO A VERIFY 406 E275 CD5DE3 CALL COMAND ; COMMAND 407 E278 E699 ANI 231Q ;ERROR BIT MASK 408 E27A 57 MOV D,A ;SAVE 409 E27B CA95E2 JZ RDHDR ;NO ERROR 410 E27E 3AF6E7 LDA DCREG ;DENISTY CONTROL 411 E281 EE01 XRI DENSITY ;FLIP THE DENSITY 412 E283 32F6E7 STA DCREG ;UPDATE AND 413 E286 32FAE3 STA DCMD ; CHANGE DENSITY 414 E289 05 DCR B ;DECREMENT RETRY 415 E28A C273E2 JNZ SLOOP ; COUNT & TEST 416 E28D 7A MOV A,D 417 SERROR 418 E28E 37 STC 419 E28F F5 PUSH PSW 420 E290 CD70E1 CALL HENTRY 421 E293 F1 POP PSW 422 E294 C9 RET 423 RDHDR 424 E295 060A MVI B,12Q ;NUMBER OF RETRYS 425 RHLOOP 426 E297 11FFE3 LXI D,DATREG ;DATA REGISTER 427 E29A 21FAE7 LXI H,TRACK+1 ;DATA POINTER 428 E29D 3EC4 MVI A,RACMD ;START READ HEADER COMMAND 429 E29F 32FCE3 STA CMDREG 430 RHL1 431 E2A2 1A LDAX D ;GET DISK DATA 0 432 E2A3 77 MOV M,A ;STORE IN MEM 433 E2A4 2C INR L ;ADVANCE POINTER 434 E2A5 C2A2E2 JNZ RHL1 ;TEST END OF PAGE 435 E2A8 21FCE3 LXI H,CSTAT ;WAIT FOR 1791 436 E2AB CD6CE3 CALL BUSY ; TO FINISH CMD 437 E2AE B7 ORA A ;TEST FOR ERRORS 438 E2AF CAB9E2 JZ CHKSEC ;TRANSFER OK? 439 E2B2 05 DCR B ;NO - TEST FOR 440 E2B3 C297E2 JNZ RHLOOP ; HARD ERROR 441 E2B6 C38EE2 JMP SERROR ;RECALIBRATE 442 CHKSEC 443 E2B9 3AFDE7 LDA SECLEN ;GET THE SECTOR 444 E2BC 4F MOV C,A ; SIZE AND SETUP 445 E2BD 0600 MVI B,0 ; THE TABLE OFFSET 446 E2BF 21DFE2 LXI H,STABLE ;SECTOR TABLE 447 E2C2 09 DAD B ;SECTOR SIZE PNTR 448 E2C3 3AF8E7 LDA SECTOR ;GET THE SECTOR CP/M MACRO ASSEM 2.0 #009 *** Cbios For CP/M Ver. 2.2 *** 449 E2C6 47 MOV B,A ; AND SAVE IN B 450 E2C7 86 ADD M ;COMPARE W/TABLE 451 E2C8 3E10 MVI A,20Q ;ERROR FLAG 452 E2CA D8 RC ;ERROR RETURN 453 E2CB 78 MOV A,B ;INITIALIZE 1791 454 E2CC 32FEE3 STA SECREG ; SECTOR REGISTER 455 E2CF 3E20 MVI A,40Q ;128 BYTE SECTOR 456 E2D1 210505 LXI H,505H 457 E2D4 22E2E7 SHLD ECOUNT 458 SZLOOP 459 E2D7 0D DCR C ;REDUCE SIZE COUNT 460 E2D8 47 MOV B,A ;SECTOR SIZE TO B 461 E2D9 F8 RM ;RETURN ON MINUS 462 E2DA 17 RAL ;DOUBLE THE COUNT 463 E2DB B7 ORA A ;CLEAR THE CARRY 464 E2DC C3D7E2 JMP SZLOOP 465 466 STABLE 467 E2DF E5 DB 345Q ;26 SECTOR DISKETTES 468 E2E0 E5 DB 345Q ;26 SECTOR DISKETTES 469 E2E1 F0 DB 360Q ;15 SECTOR DISKETTES 470 E2E2 F7 DB 367Q ;8 SECTOR DISKETTES 471 HDLOAD 472 E2E3 21EBE7 LXI H,DISK ;NEW DRV PTR 473 E2E6 4E MOV C,M ;SAVE NEW DRV IN C 474 E2E7 23 INX H ;CURRENT DRV PTR 475 E2E8 5E MOV E,M ;SAVE OLD DRV IN E 476 E2E9 71 MOV M,C ;UPDATE CURRENT DRV 477 E2EA 23 INX H ;HOME CMD FLAG 478 E2EB 7B MOV A,E ;TEST FOR 479 E2EC B9 CMP C ; DRIVE CHANGE 480 E2ED 7E MOV A,M ;HEAD LOAD MASK 481 E2EE 3601 MVI M,HEAD ;UPDATE THE MASK 482 E2F0 CA1BE3 JZ HDCHK ;NO DRIVE CHANGE? 483 E2F3 23 INX H ;ADDR OF DRIVE TABLE 484 E2F4 E5 PUSH H ;SAVE TABLE ADDR 485 E2F5 1600 MVI D,0 ;SET UP THE 486 E2F7 42 MOV B,D ; OFFSET ADDRESS 487 E2F8 19 DAD D ;CALCULATE THE 488 E2F9 19 DAD D ; PARAMETER ADDR 489 E2FA 3AF6E7 LDA DCREG ;SAVE THE 490 E2FD 77 MOV M,A ;DENSITY STATUS 491 E2FE 23 INX H ;TRACK POINTER 492 E2FF 11FDE3 LXI D,TRKREG ;1791 TRK REG 493 E302 1A LDAX D ;GET CURRENT TRACK 494 E303 77 MOV M,A ;SAVE IN THE TABLE 495 E304 E1 POP H ;BEGINNING OF TABLE 496 E305 09 DAD B ;NEW DRIVE 497 E306 09 DAD B ; TABLE POINTER 498 E307 7E MOV A,M ;GET DENSITY STATUS 499 E308 32F6E7 STA DCREG ;UPDATE DCREG 500 E30B 23 INX H ;GET THE OLD 501 E30C 7E MOV A,M ; TRACK NUMBER 502 E30D 12 STAX D ; AND UPDATE 1791 503 E30E 3E7F MVI A,177Q ;DRIVE SELECT BITS 504 DSROT CP/M MACRO ASSEM 2.0 #010 *** Cbios For CP/M Ver. 2.2 *** 505 E310 07 RLC ;ROTATE TO 506 E311 0D DCR C ; SELECT THE 507 E312 F210E3 JP DSROT ; PROPER DRIVE 508 E315 E67F ANI 177Q ;SET THE RUN BIT 509 E317 32EAE7 STA DRVSEL ;SAVE IN DRV REG 510 E31A AF XRA A ;FORCE A HEAD LOAD 511 HDCHK 512 E31B 21FAE3 LXI H,DSTAT ;TEST FOR 513 E31E A6 ANA M ; HEAD LOADED 514 E31F 32E9E7 STA HDFLAG ;SAVE THE HEAD 515 E322 F5 PUSH PSW ; LOADED STATUS 516 E323 3AEAE7 LDA DRVSEL ;GET CURRENT DRIVE 517 E326 4F MOV C,A ;SAVE 518 E327 3AF7E7 LDA SIDE ;GET CURRENT SIDE 519 E32A 2F CMA ; AND MERGE 520 E32B A1 ANA C ; WITH DRIVE SELECT 521 E32C 32F9E3 STA DREG ;SELECT DRIVE & SIDE 522 E32F EE40 XRI ACCESS ;TOGGLE ACCESS BIT 523 E331 4F MOV C,A ;SAVE FOR PREP ROUTINE 524 E332 3AF6E7 LDA DCREG ;DEN & HEAD CNTL BITS 525 E335 47 MOV B,A ;SAVE 526 E336 3AF9E7 LDA TRACK ;GET THE NEW TRACK 527 E339 D601 SUI 1 ;FORCE SINGLE 528 E33B 9F SBB A ; DENSITY 529 E33C 3D DCR A ; IF TRACK = 0 530 E33D 2F CMA ;COMPLIMENT 531 E33E B0 ORA B ;MERGE W/CONTROL BITS 532 E33F 77 MOV M,A ;LOAD HEAD & SET DENSITY 533 E340 F1 POP PSW ;HEAD LOAD STATUS 534 E341 C24FE3 JNZ RDYCHK ;CONDITIONALLY 535 E344 E5 PUSH H ; WAIT FOR HEAD 536 E345 2AE4E7 LHLD TIMER ; LOAD TIME OUT 537 TLOOP 538 E348 2B DCX H ;COUNT DOWN 539 E349 7C MOV A,H ; 40 MS FOR 540 E34A B5 ORA L ; HEAD LOAD 541 E34B C248E3 JNZ TLOOP ; TIME OUT 542 E34E E1 POP H 543 RDYCHK 544 E34F 7E MOV A,M ;TEST FOR 545 E350 E680 ANI JREADY ; DRIVE READY 546 E352 C0 RNZ 547 UNLOAD 548 E353 3AF6E7 LDA DCREG ;FORCE A 549 E356 F606 ORI ULOAD ; HEAD 550 E358 77 MOV M,A ; UNLOAD 551 E359 3E80 MVI A,JREADY ;SET DRIVE 552 E35B 37 STC ; NOT READY 553 E35C C9 RET ; ERROR FLAG 554 555 COMAND 556 E35D 2AE4E7 LHLD TIMER ;GET INDEX COUNT 557 E360 29 DAD H ; AND MULTIPLY 558 E361 29 DAD H ; BY FOUR 559 CENTRY 560 E362 EB XCHG ;SAVE IN D-E PAIR CP/M MACRO ASSEM 2.0 #011 *** Cbios For CP/M Ver. 2.2 *** 561 E363 21FCE3 LXI H,CSTAT ;ISSUE COMMAND 562 E366 77 MOV M,A ; TO THE 1791 563 NBUSY 564 E367 7E MOV A,M ;WAIT 565 E368 1F RAR ; FOR THE 566 E369 D267E3 JNC NBUSY ; BUSY FLAG 567 BUSY 568 E36C 7E MOV A,M ;TEST FOR 569 E36D 1F RAR ; DEVICE BUSY 570 E36E 7E MOV A,M ;RESTORE STATUS 571 E36F D0 RNC ;RETURN IF NOT BUSY 572 E370 C376E3 JMP PATCH+3 ;JUMP AROUND PATCH 573 PATCH 574 E373 C3E3E2 JMP HDLOAD ;PATCH FOR OLD ATE 575 576 E376 1B DCX D ;TEST FOR 577 E377 7A MOV A,D ; TWO DISK 578 E378 B3 ORA E ; REVOLUTIONS 579 E379 C26CE3 JNZ BUSY ;47 MACHINE CYCLES 580 E37C 5E MOV E,M ;GET ERROR CODE 581 E37D E5 PUSH H ;SAVE CMD ADDRESS 582 E37E 23 INX H ;TRACK REGISTER 583 E37F 56 MOV D,M ;SAVE PRESENT TRACK 584 E380 3AEAE7 LDA DRVSEL ;CONTROL BITS 585 E383 EE80 XRI RSTBIT ;RESET THE 1791 586 E385 32F9E3 STA DREG ; CONTROLLER TO 587 E388 EEC0 XRI STBITS ; CLEAR THE 588 E38A E3 XTHL ; COMMAND BUSY 589 E38B 32F9E3 STA DREG ; FAULT CONDITION 590 E38E 36D0 MVI M,CLRCMD ;FORCE INTERRUPT 591 E390 E3 XTHL ;RESTORE THE 592 E391 72 MOV M,D ; THE TRACK REG 593 E392 E1 POP H ;RESTORE THE STACK 594 E393 7B MOV A,E ;ERROR CODE TO A 595 E394 37 STC ; ERROR FLAG 596 E395 C9 RET 597 598 MEASUR 599 E396 110000 LXI D,0 ;INITIALIZE COUNT 600 E399 21FAE3 LXI H,DSTAT ;STATUS PORT 601 E39C 0E10 MVI C,INDEX ;INDEX BIT FLAG 602 INDXLO 603 E39E 7E MOV A,M ;WAIT FOR 604 E39F A1 ANA C ; INDEX 605 E3A0 CA9EE3 JZ INDXLO ; PULSE HIGH 606 INDXHI 607 E3A3 7E MOV A,M ;WAIT FOR 608 E3A4 A1 ANA C ; INDEX 609 E3A5 C2A3E3 JNZ INDXHI ; PULSE LOW 610 INDXCT 611 E3A8 13 INX D ;ADVANCE COUNT 612 E3A9 E3 XTHL ;FOUR DUMMY 613 E3AA E3 XTHL ; INSTRUCTIONS 614 E3AB E3 XTHL ; TO LENGTHEN 615 E3AC E3 XTHL ; THE DELAY 616 E3AD 7E MOV A,M ;WAIT FOR CP/M MACRO ASSEM 2.0 #012 *** Cbios For CP/M Ver. 2.2 *** 617 E3AE A1 ANA C ; THE INDEX 618 E3AF CAA8E3 JZ INDXCT ; TO GO HIGH 619 E3B2 C9 RET ;98 MACHINE CYCLES 620 DENFIX 621 E3B3 79 MOV A,C ;TRIM THE 622 E3B4 E601 ANI 1 ; EXCESS BITS 623 E3B6 2F CMA ;COMPLIMENT AND 624 E3B7 47 MOV B,A ; SAVE IN B 625 E3B8 21EBE7 LXI H,DISK ;NEW DISK PTR 626 E3BB 5E MOV E,M ;GET DISK NO. 627 E3BC 1600 MVI D,0 ;OFFSET ADDR 628 E3BE 23 INX H ;CURRENT DISK PTR 629 E3BF 7E MOV A,M ;MOVE TO ACC 630 E3C0 AB XRA E ;CMPR OLD W/NEW 631 E3C1 F5 PUSH PSW ;SAVE STATUS 632 E3C2 23 INX H ;DISK TABLE 633 E3C3 23 INX H ; ADDRESS 634 E3C4 19 DAD D ;ADD THE 635 E3C5 19 DAD D ; OFFSET 636 E3C6 7E MOV A,M ;GET PARAMETERS 637 E3C7 F601 ORI 1 ;MASK OFF DENSITY 638 E3C9 A0 ANA B ;SET NEW DENSITY 639 E3CA 77 MOV M,A ;UPDATE PARAMETERS 640 E3CB F1 POP PSW ;TEST NEW=OLD? 641 E3CC C0 RNZ 642 E3CD 7E MOV A,M ;UPDATA CDISK 643 E3CE 32F6E7 STA DCREG ; ALSO 644 E3D1 C9 RET 645 646 TIMOUT 647 E3D2 210000 LXI H,0 ;TIME-OUT DELAY 648 TILOOP 649 E3D5 2B DCX H ;DECREMENT COUNT 650 E3D6 7C MOV A,H ;TEST FOR DELAY 651 E3D7 B5 ORA L ; COUNT EQUAL ZERO 652 E3D8 E3 XTHL ;LONG NOP 653 E3D9 E3 XTHL ; INSTRUCTION 654 E3DA C2D5E3 JNZ TILOOP 655 E3DD C9 RET 656 657 E3DE E5 SBEGIN PUSH H 658 E3DF 21E2E3 LXI H,DSTALL 659 E3E2 E9 DSTALL PCHL 660 E3E3 E1 POP H 661 E3E4 C9 RET 662 663 SIDEFX 664 E3E5 79 MOV A,C ;GET THE SIDE BIT 665 E3E6 E601 ANI 1 ;TRIM THE EXCESS 666 E3E8 17 RAL ;MOVE THE BIT 667 E3E9 17 RAL ; TO THE SIDE 668 E3EA 17 RAL ; SELECT BIT 669 E3EB 17 RAL ; POSITION 670 E3EC 32F7E7 STA SIDE ;SAVE SIDE BIT 671 E3EF C9 RET 672 CP/M MACRO ASSEM 2.0 #013 *** Cbios For CP/M Ver. 2.2 *** 673 PWRJMP 674 E3F0 00 NOP ;POWER-ON 675 E3F1 00 NOP ; JUMP 676 E3F2 00 NOP ; SEQUENCE 677 E3F3 00 NOP ; WITH NOP 678 E3F4 00 NOP ; PADDING 679 E3F5 C300E0 JMP DBOOT 680 681 E3F8 DS 10Q ;I/O LOCATIONS 682 683 E7C9 ORG RAM+3C9H 684 685 E7C9 STACK DS 31Q 686 687 E7E2 0000 ECOUNT DW 0 688 E7E4 0018 TIMER DW 1800H ;HEAD LOAD TIME OUT 689 E7E6 00E7 DMAADR DW RAM+300H ;DMA ADDRESS 690 E7E8 08 DSFLAG DB 10Q 691 E7E9 00 HDFLAG DB 0 ;READ HEADER FLAG 692 E7EA 7E DRVSEL DB 176Q ;DRIVE SELECT CONSTANT 693 E7EB 00 DISK DB 0 ;NEW DRIVE 694 E7EC 08 JCDISK DB 10Q ;CURRENT DISK 695 E7ED 00 TZFLAG DB 0 ;HOME CMD INDICATOR 696 E7EE 09 DOPRAM DB 11Q ;DRIVE 0 PARAMETERS 697 E7EF FF DOTRK DB 377Q ;DRIVE 0 TRACK NO 698 E7F0 09 D1PRAM DB 11Q ;DRIVE 1 PARAMETERS 699 E7F1 FF D1TRK DB 377Q ;DRIVE 1 TRACK NO 700 E7F2 09 D2PRAM DB 11Q ;DRIVE 2 PARAMETERS 701 E7F3 FF D2TRK DB 377Q ;DRIVE 2 TRACK NO 702 E7F4 09 D3PRAM DB 11Q ;DRIVE 3 PARAMETERS 703 E7F5 FF D3TRK DB 377Q ;DRIVE 3 TRACK NO 704 E7F6 09 DCREG DB 11Q ;CURRENT PARAMETERS 705 E7F7 00 SIDE DB 0 ;NEW SIDE 706 E7F8 01 SECTOR DB 1 ;NEW SECTOR 707 E7F9 00 TRACK DB 0 ;NEW TRACK 708 E7FA 00 TRKNO DB 0 ;DISK 709 E7FB 00 SIDENO DB 0 ; SECTOR 710 E7FC 00 SECTNO DB 0 ; HEADER 711 E7FD 00 SECLEN DB 0 ; DATA 712 E7FE 00 CRCLO DB 0 ; BUFFER 713 E7FF 00 CRCHI DB 0 714 715 716 ***************************************************************** 717 * * 718 * CBIOS FOR CP/M VER 2.2 FOR DISK JOCKEY 2D CONTROLLER (ALL * 719 * REVS). HANDLES DISKETTES WITH SECTOR SIZES OF 128 BYTES * 720 * SINGLE DENSITY, 256, 512, 1024 BYTES DOUBLE DENSITY. * 721 * * 722 * WRITTEN BY BOBBY DALE GIFFORD. * 723 * 9/1/79 * 724 * * 725 * DISK MAP OF SECTORS USED BY COLD BOOT, WARM BOOT, FIRMWARE, * 726 * AND CP/M: * 727 * * 728 * TRK 0 SEC 1 = FIRST SECTOR OF COLD BOOT. E700H * CP/M MACRO ASSEM 2.0 #014 *** Cbios For CP/M Ver. 2.2 *** 729 * 0 2 = COLD BOOT 256. 80H * 730 * 0 3 = COLD BOOT 512. 80H * 731 * 0 4 = COLD BOOT 1024. 80H * 732 * 0 5 = WARM BOOT 256. 80H * 733 * 0 6 = WARM BOOT 512. 80H * 734 * 0 7 = WARM BOOT 1024. 80H * 735 * 0 8 = COLD/WARM BOOT. 3200H * 736 * 0 9 = FIRMWARE. E400H * 737 * 0 10 = FIRMWARE+80H. E480H * 738 * 0 11 = FIRMWARE+100H E500H * 739 * 0 12 = FIRMWARE+180H. E580H * 740 * 0 13 = FIRMWARE+200H. E600H * 741 * 0 14 = FIRMWARE+280H. E680H * 742 * 0 15 = FIRMWARE+300H. E700H * 743 * 0 16 = FIRMWARE+380H. E780H * 744 * 0 17 = CCP. 2D00H * 745 * 0 10 = CCP+80H. 2D80H * 746 * 0 12 = CCP+100H. 2E00H * 747 * 0 14 = CCP+180H. 2E80H * 748 * 0 16 = CCP+200H. 2F00H * 749 * 0 18 = CCP+280H. 2F80H * 750 * 0 20 = CCP+300H. 3000H * 751 * 0 22 = CCP+380H. 3080H * 752 * 0 24 = CCP+400H. 3100H * 753 * 0 26 = CCP+480H. 3180H * 754 * 1 = REST OF CP/M. 3200H-4FFFH * 755 * * 756 ***************************************************************** 757 758 TITLE '*** Cbios For CP/M Ver. 2.2 ***' 759 760 ***************************************************************** 761 * * 762 * THE FOLLOWING REVISION NUMBER IS IN REFERENCE TO THE CP/M * 763 * 2.0 CBIOS. * 764 * * 765 ***************************************************************** 766 767 001F = REVNUM EQU 31 ;CBIOS REVISION NUMBER 768 0016 = CPMREV EQU 22 ;CP/M REVISION NUMBER 769 770 ***************************************************************** 771 * * 772 * THE FOLLOWING EQUATES RELATE THE THINKER TOYS 2D CONTROLLER. * 773 * IF THE CONTROLLER IS NON STANDARD (0E000H) ONLY THE ORIGIN * 774 * EQUATE NEED BE CHANGED. THIS VERSION OF THE CBIOS WILL WORK * 775 * WITH 2D CONTROLLER BOARDS REV 0, 1, 3, 3.1, 4. * 776 * * 777 ***************************************************************** 778 779 E400 = DJRAM EQU RAM ;DISK JOCKEY 2D RAM ADDRESS 780 E003 = DJCIN EQU TERMIN ;DISK JOCKEY 2D CHARACTER INPUT ROUTINE 781 E006 = DJCOUT EQU TRMOUT ;DISK JOCKEY 2D CHARACTER OUTPUT ROUTINE 782 E009 = DJHOME EQU TKZERO ;DISK JOCKEY 2D TRACK ZERO SEEK 783 E00F = DJTRK EQU JSECT ;DISK JOCKEY 2D TRACK SEEK ROUTINE 784 E00F = DJSEC EQU JSECT ;DISK JOCKEY 2D SET SECTOR ROUTINE CP/M MACRO ASSEM 2.0 #015 *** Cbios For CP/M Ver. 2.2 *** 785 E012 = DJDMA EQU JDMA ;DISK JOCKEY 2D SET DMA ADDRESS 786 E015 = DJREAD EQU DREAD ;DISK JOCKEY 2D READ ROUTINE 787 E018 = DJWRITE EQU DWRITE ;DISK JOCKEY 2D WRITE ROUTINE 788 E01B = DJSEL EQU SELDRV ;DISK JOCKEY 2D SELECT DRIVE ROUTINE 789 E021 = DJTSTAT EQU TSTAT ;DISK JOCKEY 2D TERMINAL STATUS ROUTINE 790 E027 = DJSTAT EQU STATUS ;DISK JOCKEY 2D STATUS ROUTINE 791 E02A = DJERR EQU DSKERR ;DISK JOCKEY 2D ERROR, FLASH LED 792 E02D = DJDEN EQU SETDEN ;DISK JOCKEY 2D SET DENSITY ROUTINE 793 E030 = DJSIDE EQU SETSID ;DISK JOCKEY 2D SET SIDE ROUTINE 794 795 ***************************************************************** 796 * * 797 * CP/M SYSTEM EQUATES. IF RECONFIGURATION OF THE CP/M SYSTEM * 798 * IS BEING DONE, THE CHANGES CAN BE MADE TO THE FOLLOWING * 799 * EQUATES. * 800 * * 801 ***************************************************************** 802 803 0018 = MSIZE EQU 24 ;MEMORY SIZE OF TARGET CP/M 804 1000 = BIAS EQU (MSIZE-20)*1024 ;MEMORY OFFSET FROM 20K SYSTEM 805 3D00 = CCP EQU 2D00H+BIAS ;CONSOLE COMMAND PROCESSOR 806 4500 = BDOS EQU CCP+800H ;BDOS ADDRESS 807 5300 = BIOS EQU CCP+1600H ;CBIOS ADDRESS 808 0004 = CDISK EQU 4 ;ADDRESS OF LAST LOGGED DISK 809 0080 = BUFF EQU 80H ;DEFAULT BUFFER ADDRESS 810 0100 = TPA EQU 100H ;TRANSIENT MEMORY 811 0000 = INTIOBY EQU 0 ;INITIAL IOBYTE 812 0003 = IOBYTE EQU 3 ;IOBYTE LOCATION 813 0000 = WBOT EQU 0 ;WARM BOOT JUMP ADDRESS 814 0005 = ENTRY EQU 5 ;BDOS ENTRY JUMP ADDRESS 815 816 ***************************************************************** 817 * * 818 * THE FOLLOWING ARE INTERNAL CBIOS EQUATES. MOST ARE MISC. * 819 * CONSTANTS. * 820 * * 821 ***************************************************************** 822 823 000A = RETRIES EQU 10 ;MAX RETRIES ON DISK I/O BEFORE ERROR 824 000D = ACR EQU 0DH ;A CARRIAGE RETURN 825 000A = ALF EQU 0AH ;A LINE FEED 826 0003 = AETX EQU 3 ;A ETX CHAR 827 0006 = AACK EQU 6 ;A ACK CHAR 828 001A = CLEAR EQU 1AH ;CLEAR SCREEN CHAR ON ADM3 TERMINAL 829 0004 = MAXDISK EQU 4 ;MAXIMUM # OF DISK DRIVES 830 0008 = DBLSID EQU 8 ;SIDE BIT FROM CONTROLLER 831 832 ***************************************************************** 833 * * 834 * THE JUMP TABLE BELOW MUST REMAIN IN THE SAME ORDER, THE * 835 * ROUTINES MAY BE CHANGED, BUT THE FUNCTION EXECUTED MUST BE * 836 * THE SAME. * 837 * * 838 ***************************************************************** 839 840 5300 ORG BIOS ;CBIOS STARTING ADDRESS CP/M MACRO ASSEM 2.0 #016 *** Cbios For CP/M Ver. 2.2 *** 841 842 5300 C3A053 JMP CBOOT ;COLD BOOT ENTRY POINT 843 5303 C3FC53 WBOOTE JMP WBOOT ;WARM BOOT ENTRY POINT 844 5306 C34056 JMP CONST ;CONSOLE STATUS ROUTINE 845 5309 C34C56 JMP CONIN ;CONSOLE INPUT 846 530C C36156 COUT JMP CONOUT ;CONSOLE OUTPUT 847 530F C38156 JMP LIST ;LIST DEVICE OUTPUT 848 5312 C37656 JMP PUNCH ;PUNCH DEVICE OUTPUT 849 5315 C36C56 JMP READER ;READER DEVICE INPUT 850 5318 C39054 JMP HOME ;HOME DRIVE 851 531B C3C654 JMP SETDRV ;SELECT DISK 852 531E C39254 JMP SETTRK ;SET TRACK 853 5321 C38554 JMP SETSEC ;SET SECTOR 854 5324 C38A54 JMP SETDMA ;SET DMA ADDRESS 855 5327 C36955 JMP READ ;READ THE DISK 856 532A C36255 JMP WRITE ;WRITE THE DISK 857 532D C38C56 JMP LISTST ;LIST DEVICE STATUS 858 5330 C39754 JMP SECTRAN ;SECTOR TRANSLATION 859 5333 C31BE0 DJDRV JMP DJSEL ;HOOK FOR SINGLE.COM PROGRAM 860 861 ***************************************************************** 862 * * 863 * SIGNON MESSAGE OUTPUT DURING COLD BOOT. * 864 * * 865 ***************************************************************** 866 867 5336 0D0A0A PROMPT DB ACR,ALF,ALF 868 5339 32 DB '0'+MSIZE/10 ;CP/M MEMORY SIZE 869 533A 34 DB '0'+(MSIZE MOD 10) 870 533B 4B2043502F DB 'K CP/M Vers. ' ;CP/M VERSION NUMBER 871 5348 32 DB CPMREV/10+'0' 872 5349 2E DB '.' 873 534A 32 DB (CPMREV MOD 10)+'0' 874 534B 2C20436269 DB ', Cbios rev ' 875 5357 332E DB REVNUM/10+'0','.' ;CBIOS REVISION NUMBER 876 5359 31 DB REVNUM MOD 10+'0' 877 535A 0D0A DB ACR,ALF 878 535C 466F722054 DB 'For Thinker Toys Disk Jockey 2D Controller ' 879 5387 402030 DB '@ 0' 880 881 IF ORIGIN/4096 > 10 ;CONTROLLER ORIGIN (HEX) 882 538A 45 DB ORIGIN/4096+'A'-10 883 ELSE 884 DB ORIGIN/4096+'0' 885 ENDIF 886 887 IF (ORIGIN/256 AND 0FH) > 10 888 DB (ORIGIN/256 AND 0FH)+'A'-10 889 ELSE 890 538B 30 DB (ORIGIN/256 AND 0FH)+'0' 891 ENDIF 892 538C 3030482E DB '00H.' 893 5390 0D0A00 DB ACR,ALF,0 894 895 ***************************************************************** 896 * * CP/M MACRO ASSEM 2.0 #017 *** Cbios For CP/M Ver. 2.2 *** 897 * UTILITY ROUTINE TO OUTPUT THE MESSAGE POINTED AT BY H&L, * 898 * TERMINATED WITH A NULL. * 899 * * 900 ***************************************************************** 901 902 5393 7E MESSAGE MOV A,M ;GET A CHARACTER OF THE MESSAGE 903 5394 23 INX H ;BUMP TEXT POINTER 904 5395 A7 ANA A ;TEST FOR END 905 5396 C8 RZ ;RETURN IF DONE 906 5397 E5 PUSH H ;SAVE POINTER TO TEXT 907 5398 4F MOV C,A ;OUTPUT CHARACTER IN C 908 5399 CD0C53 CALL COUT ;OUTPUT THE CHARACTER 909 539C E1 POP H ;RESTORE THE POINTER 910 539D C39353 JMP MESSAGE ;CONTINUE UNTIL NULL REACHED 911 912 ***************************************************************** 913 * * 914 * CBOOT IS THE COLD BOOT LOADER. ALL OF CP/M HAS BEEN LOADED IN * 915 * WHEN CONTROL IS PASSED HERE. * 916 * * 917 ***************************************************************** 918 919 53A0 310001 CBOOT LXI SP,TPA ;SET UP STACK 920 53A3 CD2157 CALL TINIT ;INITIALIZE THE TERMINAL 921 53A6 213653 LXI H,PROMPT ;PREP FOR SENDING SIGNON MESSAGE 922 53A9 CD9353 CALL MESSAGE ;SEND THE PROMPT 923 53AC AF XRA A ;SELECT DISK A 924 53AD 32BA58 STA CPMDRV 925 53B0 320400 STA CDISK 926 927 ***************************************************************** 928 * * 929 * GOCPM IS THE ENTRY POINT FROM COLD BOOTS, AND WARM BOOTS. IT * 930 * INITIALIZES SOME OF THE LOCATIONS IN PAGE 0, AND SETS UP THE * 931 * INITIAL DMA ADDRESS (80H). * 932 * * 933 ***************************************************************** 934 935 53B3 218000 GOCPM LXI H,BUFF ;SET UP INITIAL DMA ADDRESS 936 53B6 CD8A54 CALL SETDMA 937 53B9 3EC3 MVI A,(JMP) ;INITIALIZE JUMP TO WARM BOOT 938 53BB 320000 STA WBOT 939 53BE 320500 STA ENTRY ;INITIALIZE JUMP TO BDOS 940 53C1 210353 LXI H,WBOOTE ;ADDRESS IN WARM BOOT JUMP 941 53C4 220100 SHLD WBOT+1 942 53C7 210645 LXI H,BDOS+6 ;ADDRESS IN BDOS JUMP 943 53CA 220600 SHLD ENTRY+1 944 53CD AF XRA A ;A <- 0 945 53CE 32BF58 STA BUFSEC ;DISK JOCKEY BUFFER EMPTY 946 53D1 32D555 STA BUFWRTN ;SET BUFFER NOT DIRTY FLAG 947 53D4 3A0400 LDA CDISK ;JUMP TO CP/M WITH CURRENTLY SELECTED DISK IN C 948 53D7 4F MOV C,A 949 53D8 11FB53 LXI D,CMNDBEG ;BEGINNING OF INITIAL COMMAND 950 53DB 21083D LXI H,CCP+8 ;COMMAND BUFFER 951 53DE 3E01 MVI A,CMNDEND-CMNDBEG+1 ;LENGTH OF COMMAND 952 53E0 32073D STA CCP+7 CP/M MACRO ASSEM 2.0 #018 *** Cbios For CP/M Ver. 2.2 *** 953 53E3 47 MOV B,A 954 53E4 CD3756 CALL MOVLOP 955 53E7 3AF953 LDA CWFLG 956 53EA A7 ANA A 957 53EB 3AFA53 LDA AUTOFLG 958 53EE CAF253 JZ CLDBOT 959 53F1 1F RAR 960 53F2 1F CLDBOT RAR 961 53F3 DA003D JC CCP 962 53F6 C3033D JMP CCP+3 ;ENTER CP/M 963 964 53F9 00 CWFLG DB 0 ;COLD/WARM BOOT FLAG 965 966 ***************************************************************** 967 * * 968 * THE FOLLOWING BYTE DETERMINES IF AN INITIAL COMMAND IS TO BE * 969 * GIVEN TO CP/M ON WARM OR COLD BOOTS. THE VALUE OF THE BYTE IS * 970 * USED TO GIVE THE COMMAND TO CP/M: * 971 * * 972 * 0 = NEVER GIVE COMMAND. * 973 * 1 = GIVE COMMAND ON COLD BOOTS ONLY. * 974 * 2 = GIVE THE COMMAND ON WARM BOOTS ONLY. * 975 * 3 = GIVE THE COMMAND ON WARM AND COLD BOOTS. * 976 * * 977 ***************************************************************** 978 979 53FA 01 AUTOFLG DB 1 ;AUTO COMMAND FEATURE 980 981 ***************************************************************** 982 * * 983 * IF THERE IS A COMMAND INSERTED HERE, IT WILL BE GIVEN IF THE * 984 * AUTO FEATURE IS ENABLED. * 985 * FOR EXAMPLE: * 986 * * 987 * CMNDBEG DB 'MBASIC MYPROG' * 988 * CMNDEND DB 0 * 989 * * 990 * WILL EXECUTE MICROSOFT BASIC, AND MBASIC WILL EXECUTE THE * 991 * "MYPROG" BASIC PROGRAM. * 992 * * 993 ***************************************************************** 994 995 CMNDBEG DB '' ;INITIAL COMMAND GOES HERE 996 53FB 00 CMNDEND DB 0 997 998 ***************************************************************** 999 * * 1000 * WBOOT LOADS IN ALL OF CP/M EXCEPT THE CBIOS, THEN INITIALIZES * 1001 * SYSTEM PARAMETERS AS IN COLD BOOT. SEE THE COLD BOOT LOADER * 1002 * LISTING FOR EXACTLY WHAT HAPPENS DURING WARM AND COLD BOOTS. * 1003 * * 1004 ***************************************************************** 1005 1006 53FC 310001 WBOOT LXI SP,TPA ;SET UP STACK POINTER 1007 53FF 3E01 MVI A,1 1008 5400 = WFLG EQU $-1 ;TEST IF BEGINNING OR CP/M MACRO ASSEM 2.0 #019 *** Cbios For CP/M Ver. 2.2 *** 1009 5401 A7 ANA A ; ENDING A WARM BOOT 1010 5402 3E01 MVI A,1 1011 5404 320054 STA WFLG 1012 5407 32F953 STA CWFLG ;SET COLD/WARM BOOT FLAG 1013 540A CAB353 JZ GOCPM 1014 540D AF XRA A 1015 540E 320054 STA WFLG 1016 5411 4F MOV C,A 1017 5412 CD3353 CALL DJDRV ;SELECT DRIVE A 1018 5415 0E00 MVI C,0 ;SELECT SINGLE DENSITY 1019 5417 CD2DE0 CALL DJDEN 1020 541A 0E00 MVI C,0 ;SELECT SIDE 0 1021 541C CD30E0 CALL DJSIDE 1022 541F 3E0F MVI A,15 ;INITIALIZE THE SECTOR TO READ 1023 5421 323F54 STA NEWSEC 1024 5424 21003C LXI H,CCP-100H ;AND THE DMA ADDRESS 1025 5427 225E54 SHLD NEWDMA 1026 542A CD3E54 CALL WARMLOD ;READ IN CP/M 1027 542D 010042 LXI B,CCP+500H ;LOAD ADDRESS FOR REST OF WARM BOOT 1028 5430 CD12E0 CALL DJDMA 1029 5433 0E08 MVI C,8 1030 5435 CD0FE0 CALL DJSEC 1031 5438 CD7254 CALL WARMRD 1032 543B C30342 JMP CCP+503H 1033 1034 543E 3E0F WARMLOD MVI A,15 ;PREVIOUS SECTOR 1035 543F = NEWSEC EQU $-1 1036 5440 3C INR A ;UPDATE THE PREVIOUS SECTOR 1037 5441 3C INR A 1038 5442 FE1B CPI 27 ;WAS IT THE LAST ? 1039 5444 DA5654 JC NOWRAP 1040 5447 D609 SUI 9 ;YES 1041 5449 FE13 CPI 19 1042 544B C8 RZ 1043 544C 2A5E54 LHLD NEWDMA 1044 544F 1180FB LXI D,-480H 1045 5452 19 DAD D 1046 5453 225E54 SHLD NEWDMA 1047 5456 323F54 NOWRAP STA NEWSEC ;SAVE THE NEW SECTOR TO READ 1048 5459 4F MOV C,A 1049 545A CD0FE0 CALL DJSEC 1050 545D 21003C LXI H,CCP-100H ;GET THE PREVIOUS DMA ADDRESS 1051 545E = NEWDMA EQU $-2 1052 5460 110001 LXI D,100H ;UPDATE THE DMA ADDRESS 1053 5463 19 DAD D 1054 5464 225E54 SHLD NEWDMA ;SAVE THE DMA ADDRESS 1055 5467 44 MOV B,H 1056 5468 4D MOV C,L 1057 5469 CD12E0 CALL DJDMA ;SET THE DMA ADDRESS 1058 546C CD7254 CALL WARMRD 1059 546F C33E54 JMP WARMLOD 1060 1061 5472 01000A WARMRD LXI B,RETRIES*100H+0;MAXIMUM # OF ERRORS 1062 5475 C5 WRMREAD PUSH B 1063 5476 CD0FE0 CALL DJTRK ;SET THE TRACK 1064 5479 CD15E0 CALL DJREAD ;READ THE SECTOR CP/M MACRO ASSEM 2.0 #020 *** Cbios For CP/M Ver. 2.2 *** 1065 547C C1 POP B 1066 547D D0 RNC ;CONTINUE IF SUCCESSFUL 1067 547E 05 DCR B 1068 547F C27554 JNZ WRMREAD ;KEEP TRYING 1069 5482 C32AE0 JMP DJERR 1070 1071 ***************************************************************** 1072 * * 1073 * SETSEC JUST SAVES THE DESIRED SECTOR TO SEEK TO UNTIL AN * 1074 * ACTUAL READ OR WRITE IS ATTEMPTED. * 1075 * * 1076 ***************************************************************** 1077 1078 5485 79 SETSEC MOV A,C ;SAVE THE SECTOR NUMBER 1079 5486 32B958 STA CPMSEC ;CP/M SECTOR # 1080 5489 C9 RET 1081 1082 ***************************************************************** 1083 * * 1084 * SETDMA SAVES THE DMA ADDRESS FOR THE DATA TRANSFER. * 1085 * * 1086 ***************************************************************** 1087 1088 548A 60 SETDMA MOV H,B ;HL <- BC 1089 548B 69 MOV L,C 1090 548C 22B555 SHLD CPMDMA ;CP/M DMA ADDRESS 1091 548F C9 RET 1092 1093 ***************************************************************** 1094 * * 1095 * HOME IS TRANSLATED INTO A SEEK TO TRACK ZERO. * 1096 * * 1097 ***************************************************************** 1098 1099 5490 0E00 HOME MVI C,0 ;TRACK TO SEEK TO 1100 1101 ***************************************************************** 1102 * * 1103 * SETTRK SAVES THE TRACK # TO SEEK TO. NOTHING IS DONE AT THIS * 1104 * POINT, EVERYTHING IS DEFFERED UNTIL A READ OR WRITE. * 1105 * * 1106 ***************************************************************** 1107 1108 5492 79 SETTRK MOV A,C ;A <- TRACK # 1109 5493 32BB58 STA CPMTRK ;CP/M TRACK # 1110 5496 C9 RET 1111 1112 ***************************************************************** 1113 * * 1114 * SECTRAN TRANSLATES A LOGICAL SECTOR # INTO A PHYSICAL SECTOR * 1115 * #. * 1116 * * 1117 ***************************************************************** 1118 1119 5497 03 SECTRAN INX B 1120 5498 D5 PUSH D ;SAVE TABLE ADDRESS CP/M MACRO ASSEM 2.0 #021 *** Cbios For CP/M Ver. 2.2 *** 1121 5499 C5 PUSH B ;SAVE SECTOR # 1122 549A CD4155 CALL GETDPB ;GET DPB ADDRESS INTO HL 1123 549D 7E MOV A,M ;GET # OF CP/M SECTORS/TRACK 1124 549E B7 ORA A ;CLEAR CARY 1125 549F 1F RAR ;DIVIDE BY TWO 1126 54A0 91 SUB C 1127 54A1 F5 PUSH PSW ;SAVE ADJUSTED SECTOR 1128 54A2 FAAE54 JM SIDETWO 1129 54A5 F1 SIDEA POP PSW ;DISCARD ADJUSTED SECTOR 1130 54A6 C1 POP B ;RESTORE SECTOR REQUESTED 1131 54A7 D1 POP D ;RESTOR ADDRESS OF XLT TABLE 1132 54A8 EB SIDEONE XCHG ;HL <- &(TRANSLATION TABLE) 1133 54A9 09 DAD B ;BC = OFFSET INTO TABLE 1134 54AA 6E MOV L,M ;HL <- PHYSICAL SECTOR 1135 54AB 2600 MVI H,0 1136 54AD C9 RET 1137 1138 54AE 010F00 SIDETWO LXI B,15 ;OFFSET TO SIDE BIT 1139 54B1 09 DAD B 1140 54B2 7E MOV A,M 1141 54B3 E608 ANI 8 ;TEST FOR DOUBLE SIDED 1142 54B5 CAA554 JZ SIDEA ;MEDIA IS ONLY SINGLE SIDED 1143 54B8 F1 POP PSW ;RETRIEVE ADJUSTED SECTOR 1144 54B9 C1 POP B 1145 54BA 2F CMA ;MAKE SECTOR REQUEST POSITIVE 1146 54BB 3C INR A 1147 54BC 4F MOV C,A ;MAKE NEW SECTOR THE REQUESTED SECTOR 1148 54BD D1 POP D 1149 54BE CDA854 CALL SIDEONE 1150 54C1 3E80 MVI A,80H ;SIDE TWO BIT 1151 54C3 B5 ORA L ; AND SECTOR 1152 54C4 6F MOV L,A 1153 54C5 C9 RET 1154 1155 ***************************************************************** 1156 * * 1157 * SETDRV SELECTS THE NEXT DRIVE TO BE USED IN READ/WRITE * 1158 * OPERATIONS. IF THE DRIVE HAS NEVER BEEN SELECTED BEFORE, A * 1159 * PARAMETER TABLE IS CREATED WHICH CORRECTLY DESCRIBES THE * 1160 * DISKETTE CURRENTLY IN THE DRIVE. DISKETTES CAN BE OF FOUR * 1161 * DIFFERENT SECTOR SIZES: * 1162 * 1) 128 BYTES SINGLE DENSITY. * 1163 * 2) 256 BYTES DOUBLE DENSITY. * 1164 * 3) 512 BYTES DOUBLE DENSITY. * 1165 * 4) 1024 BYTES DOUBLE DENSITY. * 1166 * * 1167 ***************************************************************** 1168 1169 54C6 79 SETDRV MOV A,C ;SAVE THE DRIVE # 1170 54C7 32BA58 STA CPMDRV 1171 54CA FE04 CPI MAXDISK ;CHECK FOR A VALID DRIVE # 1172 54CC D23D55 JNC ZRET ;ILLEGAL DRIVE # 1173 54CF 7B MOV A,E ;TEST IF DRIVE EVER LOGGED IN BEFORE 1174 54D0 E601 ANI 1 1175 54D2 C22455 JNZ SETDRV1 ;BIT 0 OF E = 0 -> NEVER SELECTED BEFORE 1176 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 *** 1177 54D7 32BC58 STA TRUESEC 1178 54DA 32BB58 STA CPMTRK 1179 54DD CD2056 CALL FILL ;FLUSH BUFFER AND REFILL 1180 54E0 DA3D55 JC ZRET ;TEST FOR ERROR RETURN 1181 54E3 CD27E0 CALL DJSTAT ;GET STATUS ON CURRENT DRIVE 1182 54E6 E60C ANI 0CH ;STRIP OFF UNWANTED BITS 1183 54E8 F5 PUSH PSW ;USED TO SELECT A DPB 1184 54E9 1F RAR 1185 54EA 215A55 LXI H,XLTS ;TABLE OF XLT ADDRESSES 1186 54ED 5F MOV E,A 1187 54EE 1600 MVI D,0 1188 54F0 19 DAD D 1189 54F1 E5 PUSH H ;SAVE POINTER TO PROPER XLT 1190 54F2 CD4155 CALL GETDPB ;GET DPH POINTER INTO DE 1191 54F5 EB XCHG ; 1192 54F6 D1 POP D 1193 54F7 0602 MVI B,2 ;NUMBER OF BYTES TO MOVE 1194 54F9 CD3756 CALL MOVLOP ;MOVE THE ADDRESS OF XLT 1195 54FC 110800 LXI D,8 ;OFFSET TO DPB POINTER 1196 54FF 19 DAD D ;HL <- &DPH.DPB 1197 5500 E5 PUSH H 1198 5501 2A07E0 LHLD ORIGIN+7 ;GET ADDRESS OF DJ TERMINAL OUT ROUTINE 1199 5504 23 INX H ;BUMP TO LOOK AT ADDRESS OF 1200 ; UART STATUS LOCATION 1201 5505 7E MOV A,M 1202 5506 EE03 XRI 3 ;ADJUST FOR PROPER REV DJ 1203 5508 6F MOV L,A 1204 5509 26E3 MVI H,(ORIGIN+300H)/100H 1205 550B 7E MOV A,M 1206 550C E608 ANI DBLSID ;CHECK DOUBLE SIDED BIT 1207 550E 11F957 LXI D,DPB128S ;BASE FOR SINGLE SIDED DPB'S 1208 5511 C21755 JNZ SIDEOK 1209 5514 113958 LXI D,DPB128D ;BASE OF DOUBLE SIDED DPB'S 1210 5517 EB SIDEOK XCHG ;HL <- DBP BASE, DE <- &DPH.DPB 1211 5518 D1 POP D ;RESTORE DE (POINTER INTO DPH) 1212 5519 F1 POP PSW ;OFFSET TO CORRECT DPB 1213 551A 17 RAL 1214 551B 17 RAL 1215 551C 4F MOV C,A 1216 551D 0600 MVI B,0 1217 551F 09 DAD B 1218 5520 EB XCHG ;PUT DPB ADDRESS IN DPH 1219 5521 73 MOV M,E 1220 5522 23 INX H 1221 5523 72 MOV M,D 1222 5524 CD4155 SETDRV1 CALL GETDPB ;GET ADDRESS OF DPB IN HL 1223 5527 010F00 LXI B,15 ;OFFSET TO SECTOR SIZE 1224 552A 09 DAD B 1225 552B 7E MOV A,M ;GET SECTOR SIZE 1226 552C E607 ANI 7H 1227 552E 326E55 STA SECSIZ 1228 5531 7E MOV A,M 1229 5532 1F RAR 1230 5533 1F RAR 1231 5534 1F RAR 1232 5535 1F RAR CP/M MACRO ASSEM 2.0 #023 *** Cbios For CP/M Ver. 2.2 *** 1233 5536 E60F ANI 0FH 1234 5538 32A455 STA SECPSEC 1235 553B EB XCHG ;HL <- DPH 1236 553C C9 RET 1237 1238 553D 210000 ZRET LXI H,0 ;SELDRV ERROR EXIT 1239 5540 C9 RET 1240 1241 ***************************************************************** 1242 * * 1243 * GETDPB RETURNS HL POINTING TO THE DPB OF THE CURRENTLY * 1244 * SELECTED DRIVE, DE POINTING TO DPH. * 1245 * * 1246 ***************************************************************** 1247 1248 5541 3ABA58 GETDPB LDA CPMDRV ;GET DRIVE # 1249 5544 6F MOV L,A ;FORM OFFSET 1250 5545 2600 MVI H,0 1251 5547 29 DAD H 1252 5548 29 DAD H 1253 5549 29 DAD H 1254 554A 29 DAD H 1255 554B 117958 LXI D,DPZERO ;BASE OF DPH'S 1256 554E 19 DAD D 1257 554F E5 PUSH H ;SAVE ADDRESS OF DPH 1258 5550 110A00 LXI D,10 ;OFFSET TO DPB 1259 5553 19 DAD D 1260 5554 7E MOV A,M ;GET LOW BYTE OF DPB ADDRESS 1261 5555 23 INX H 1262 5556 66 MOV H,M ;GET LOW BYTE OF DPB 1263 5557 6F MOV L,A 1264 5558 D1 POP D 1265 5559 C9 RET 1266 1267 ***************************************************************** 1268 * * 1269 * XLTS IS A TABLE OF ADDRESS THAT POINT TO EACH OF THE XLT * 1270 * TABLES FOR EACH SECTOR SIZE. * 1271 * * 1272 ***************************************************************** 1273 1274 555A 2B57 XLTS DW XLT128 ;XLT FOR 128 BYTE SECTORS 1275 555C 4657 DW XLT256 ;XLT FOR 256 BYTE SECTORS 1276 555E 7B57 DW XLT512 ;XLT FOR 512 BYTE SECTORS 1277 5560 B857 DW XLT124 ;XLT FOR 1024 BYTE SECTORS 1278 1279 ***************************************************************** 1280 * * 1281 * WRITE ROUTINE MOVES DATA FROM MEMORY INTO THE BUFFER. IF THE * 1282 * DESIRED CP/M SECTOR IS NOT CONTAINED IN THE DISK BUFFER, THE * 1283 * BUFFER IS FIRST FLUSHED TO THE DISK IF IT HAS EVER BEEN * 1284 * WRITTEN INTO, THEN A READ IS PERFORMED INTO THE BUFFER TO GET * 1285 * THE DESIRED SECTOR. ONCE THE CORRECT SECTOR IS IN MEMORY, THE * 1286 * BUFFER WRITTEN INDICATOR IS SET, SO THE BUFFER WILL BE * 1287 * FLUSHED, THEN THE DATA IS TRANSFERRED INTO THE BUFFER. * 1288 * * CP/M MACRO ASSEM 2.0 #024 *** Cbios For CP/M Ver. 2.2 *** 1289 ***************************************************************** 1290 1291 5562 79 WRITE MOV A,C ;SAVE WRITE COMMAND TYPE 1292 5563 32CC55 STA WRITTYP 1293 5566 3E01 MVI A,1 ;SET WRITE COMMAND 1294 5568 06 DB (MVI) OR (B*8) ;THIS "MVI B" INSTRUCTION CAUSES 1295 ; THE FOLLOWING "XRA A" TO 1296 ; BE SKIPPED OVER. 1297 1298 ***************************************************************** 1299 * * 1300 * READ ROUTINE TO BUFFER DATA FROM THE DISK. IF THE SECTOR * 1301 * REQUESTED FROM CP/M IS IN THE BUFFER, THEN THE DATA IS SIMPLY * 1302 * TRANSFERRED FROM THE BUFFER TO THE DESIRED DMA ADDRESS. IF * 1303 * THE BUFFER DOES NOT CONTAIN THE DESIRED SECTOR, THE BUFFER IS * 1304 * FLUSHED TO THE DISK IF IT HAS EVER BEEN WRITTEN INTO, THEN * 1305 * FILLED WITH THE SECTOR FROM THE DISK THAT CONTAINS THE * 1306 * DESIRED CP/M SECTOR. * 1307 * * 1308 ***************************************************************** 1309 1310 5569 AF READ XRA A ;SET THE COMMAND TYPE TO READ 1311 556A 32B855 STA RDWR ;SAVE COMMAND TYPE 1312 1313 ***************************************************************** 1314 * * 1315 * REDWRT CALCULATES THE PHYSICAL SECTOR ON THE DISK THAT * 1316 * CONTAINS THE DESIRED CP/M SECTOR, THEN CHECKS IF IT IS THE * 1317 * SECTOR CURRENTLY IN THE BUFFER. IF NO MATCH IS MADE, THE * 1318 * BUFFER IS FLUSHED IF NECESSARY AND THE CORRECT SECTOR READ * 1319 * FROM THE DISK. * 1320 * * 1321 ***************************************************************** 1322 1323 556D 0600 REDWRT MVI B,0 ;THE 0 IS MODIFIED TO CONTAIN THE LOG2 1324 556E = SECSIZ EQU $-1 ; OF THE PHYSICAL SECTOR SIZE/128 1325 ; ON THE CURRENTLY SELECTED DISK. 1326 556F 3AB958 LDA CPMSEC ;GET THE DESIRED CP/M SECTOR # 1327 5572 F5 PUSH PSW ;TEMPORARY SAVE 1328 5573 E680 ANI 80H ;SAVE ONLY THE SIDE BIT 1329 5575 4F MOV C,A ;REMEMBER THE SIDE 1330 5576 F1 POP PSW ;GET THE SECTOR BACK 1331 5577 E67F ANI 7FH ;FORGET THE SIDE BIT 1332 5579 3D DCR A ;TEMPORARY ADJUSTMENT 1333 557A 05 DIVLOOP DCR B ;UPDATE REPEAT COUNT 1334 557B CA8355 JZ DIVDONE 1335 557E B7 ORA A ;CLEAR THE CARY FLAG 1336 557F 1F RAR ;DIVIDE THE CP/M SECTOR # BY THE SIZE 1337 ; OF THE PHYSICAL SECTORS 1338 5580 C37A55 JMP DIVLOOP ; 1339 5583 3C DIVDONE INR A 1340 5584 B1 ORA C ;RESTORE THE SIDE BIT 1341 5585 32BC58 STA TRUESEC ;SAVE THE PHYSICAL SECTOR NUMBER 1342 5588 21BA58 LXI H,CPMDRV ;POINTER TO DESIRED DRIVE,TRACK, AND SECTOR 1343 558B 11BD58 LXI D,BUFDRV ;POINTER TO BUFFER DRIVE,TRACK, AND SECTOR 1344 558E 0604 MVI B,4 ;COUNT LOOP CP/M MACRO ASSEM 2.0 #025 *** Cbios For CP/M Ver. 2.2 *** 1345 5590 05 DTSLOP DCR B ;TEST IF DONE WITH COMPARE 1346 5591 CA9F55 JZ MOVE ;YES, MATCH. GO MOVE THE DATA 1347 5594 1A LDAX D ;GET A BYTE TO COMPARE 1348 5595 BE CMP M ;TEST FOR MATCH 1349 5596 23 INX H ;BUMP POINTERS TO NEXT DATA ITEM 1350 5597 13 INX D 1351 5598 CA9055 JZ DTSLOP ;MATCH, CONTINUE TESTING 1352 1353 ***************************************************************** 1354 * * 1355 * DRIVE, TRACK, AND SECTOR DON'T MATCH, FLUSH THE BUFFER IF * 1356 * NECESSARY AND THEN REFILL. * 1357 * * 1358 ***************************************************************** 1359 1360 559B CD2056 CALL FILL ;FILL THE BUFFER WITH CORRECT PHYSICAL SECTOR 1361 559E D8 RC ;NO GOOD, RETURN WITH ERROR INDICATION 1362 1363 ***************************************************************** 1364 * * 1365 * MOVE HAS BEEN MODIFIED TO CAUSE EITHER A TRANSFER INTO OR OUT * 1366 * THE BUFFER. * 1367 * * 1368 ***************************************************************** 1369 1370 559F 3AB958 MOVE LDA CPMSEC ;GET THE CP/M SECTOR TO TRANSFER 1371 55A2 3D DCR A ;ADJUST TO PROPER SECTOR IN BUFFER 1372 55A3 E600 ANI 0 ;STRIP OFF HIGH ORDERED BITS 1373 55A4 = SECPSEC EQU $-1 ;THE 0 IS MODIFIED TO REPRESENT THE # OF 1374 ; CP/M SECTORS PER PHYSICAL SECTORS 1375 55A5 6F MOV L,A ;PUT INTO HL 1376 55A6 2600 MVI H,0 1377 55A8 29 DAD H ;FORM OFFSET INTO BUFFER 1378 55A9 29 DAD H 1379 55AA 29 DAD H 1380 55AB 29 DAD H 1381 55AC 29 DAD H 1382 55AD 29 DAD H 1383 55AE 29 DAD H 1384 55AF 11C058 LXI D,BUFFER ;BEGINNING ADDRESS OF BUFFER 1385 55B2 19 DAD D ;FORM BEGINNING ADDRESS OF SECTOR TO TRANSFER 1386 55B3 EB XCHG ;DE = ADDRESS IN BUFFER 1387 55B4 210000 LXI H,0 ;GET DMA ADDRESS, THE 0 IS MODIFIED TO 1388 ; CONTAIN THE DMA ADDRESS 1389 55B5 = CPMDMA EQU $-2 1390 55B7 3E00 MVI A,0 ;THE ZERO GETS MODIFIED TO CONTAIN 1391 ; A ZERO IF A READ, OR A 1 IF WRITE 1392 55B8 = RDWR EQU $-1 1393 55B9 A7 ANA A ;TEST WHICH KIND OF OPERATION 1394 55BA C2C255 JNZ INTO ;TRANSFER DATA INTO THE BUFFER 1395 55BD CD3556 OUTOF CALL MOVER 1396 55C0 AF XRA A 1397 55C1 C9 RET 1398 1399 55C2 EB INTO XCHG ; 1400 55C3 CD3556 CALL MOVER ;MOVE THE DATA, HL = DESTINATION CP/M MACRO ASSEM 2.0 #026 *** Cbios For CP/M Ver. 2.2 *** 1401 ; DE = SOURCE 1402 55C6 3E01 MVI A,1 1403 55C8 32D555 STA BUFWRTN ;SET BUFFER WRITTEN INTO FLAG 1404 55CB 3E00 MVI A,0 ;CHECK FOR DIRECTORY WRITE 1405 55CC = WRITTYP EQU $-1 1406 55CD 3D DCR A 1407 55CE 3E00 MVI A,0 1408 55D0 32CC55 STA WRITTYP ;SET NO DIRECTORY WRITE 1409 55D3 C0 RNZ ;NO ERROR EXIT 1410 1411 ***************************************************************** 1412 * * 1413 * FLUSH WRITES THE CONTENTS OF THE BUFFER OUT TO THE DISK IF * 1414 * IT HAS EVER BEEN WRITTEN INTO. * 1415 * * 1416 ***************************************************************** 1417 1418 55D4 3E00 FLUSH MVI A,0 ;THE 0 IS MODIFIED TO REFLECT IF 1419 ; THE BUFFER HAS BEEN WRITTEN INTO 1420 55D5 = BUFWRTN EQU $-1 1421 55D6 A7 ANA A ;TEST IF WRITTEN INTO 1422 55D7 C8 RZ ;NOT WRITTEN, ALL DONE 1423 55D8 2118E0 LXI H,DJWRITE ;WRITE OPERATION 1424 1425 ***************************************************************** 1426 * * 1427 * PREP PREPARES TO READ/WRITE THE DISK. RETRIES ARE ATTEMPTED. * 1428 * UPON ENTRY, H&L MUST CONTAIN THE READ OR WRITE OPERATION * 1429 * ADDRESS. * 1430 * * 1431 ***************************************************************** 1432 1433 55DB AF PREP XRA A ;RESET BUFFER WRITTEN FLAG 1434 55DC 32D555 STA BUFWRTN 1435 55DF 221256 SHLD RETRYOP ;SET UP THE READ/WRITE OPERATION 1436 55E2 060A MVI B,RETRIES ;MAXIMUM NUMBER OF RETRIES TO ATTEMPT 1437 55E4 C5 RETRYLP PUSH B ;SAVE THE RETRY COUNT 1438 55E5 3ABD58 LDA BUFDRV ;GET DRIVE NUMBER INVOLVED IN THE OPERATION 1439 55E8 4F MOV C,A 1440 55E9 CD3353 CALL DJDRV ;SELECT THE DRIVE 1441 55EC 3ABE58 LDA BUFTRK 1442 55EF A7 ANA A ;TEST FOR TRACK ZERO 1443 55F0 4F MOV C,A 1444 55F1 C5 PUSH B 1445 55F2 CC09E0 CZ DJHOME ;HOME THE DRIVE IF TRACK 0 1446 55F5 C1 POP B ;RESTORE TRACK # 1447 55F6 CD0FE0 CALL DJTRK ;SEEK TO PROPER TRACK 1448 55F9 3ABF58 LDA BUFSEC ;GET SECTOR INVOLVED IN OPERATION 1449 55FC F5 PUSH PSW ;SAVE THE SECTOR # 1450 55FD 07 RLC ;BIT 0 OF A EQUALS SIDE # 1451 55FE E601 ANI 1 ;STRIP OFF UNNECESSARY BITS 1452 5600 4F MOV C,A ;C <- SIDE # 1453 5601 CD30E0 CALL DJSIDE ;SELECT THE SIDE 1454 5604 F1 POP PSW ;A <- SECTOR # 1455 5605 E67F ANI 7FH ;STRIP OFF SIDE BIT 1456 5607 4F MOV C,A ;C <- SECTOR # CP/M MACRO ASSEM 2.0 #027 *** Cbios For CP/M Ver. 2.2 *** 1457 5608 CD0FE0 CALL DJSEC ;SET THE SECTOR TO TRANSFER 1458 560B 01C058 LXI B,BUFFER ;SET THE DMA ADDRESS 1459 560E CD12E0 CALL DJDMA 1460 5611 CD15E0 CALL DJREAD ;THE READ OPERATION IS MODIFIED TO WRITE 1461 5612 = RETRYOP EQU $-2 1462 5614 C1 POP B ;RESTORE THE RETRY COUNTER 1463 5615 3E00 MVI A,0 ;NO ERROR EXIT STATUS 1464 5617 D0 RNC ;RETURN NO ERROR 1465 5618 05 DCR B ;UPDATE THE RETRY COUNTER 1466 5619 37 STC ;ASSUME RETRY COUNT EXPIRED 1467 561A 3EFF MVI A,0FFH ;ERROR RETURN 1468 561C C8 RZ 1469 561D C3E455 JMP RETRYLP ;TRY AGAIN 1470 1471 ***************************************************************** 1472 * * 1473 * FILL FILLS THE BUFFER WITH A NEW SECTOR FROM THE DISK. * 1474 * * 1475 ***************************************************************** 1476 1477 5620 CDD455 FILL CALL FLUSH ;FLUSH BUFFER FIRST 1478 5623 D8 RC ;CHECK FOR ERROR 1479 5624 11BA58 LXI D,CPMDRV ;UPDATE THE DRIVE, TRACK, AND SECTOR 1480 5627 21BD58 LXI H,BUFDRV 1481 562A 0603 MVI B,3 ;NUMBER OF BYTES TO MOVE 1482 562C CD3756 CALL MOVLOP ;COPY THE DATA 1483 562F 2115E0 LXI H,DJREAD 1484 5632 C3DB55 JMP PREP ;SELECT DRIVE, TRACK, AND SECTOR. 1485 ; THEN READ THE BUFFER 1486 1487 ***************************************************************** 1488 * * 1489 * MOVER MOVES 128 BYTES OF DATA. SOURCE POINTER IN DE, DEST * 1490 * POINTER IN HL. * 1491 * * 1492 ***************************************************************** 1493 1494 5635 0680 MOVER MVI B,128 ;LENGTH OF TRANSFER 1495 5637 1A MOVLOP LDAX D ;GET A BTE OF SOURCE 1496 5638 77 MOV M,A ;MOVE IT 1497 5639 13 INX D ;BUMP POINTERS 1498 563A 23 INX H 1499 563B 05 DCR B ;UPDATE COUNTER 1500 563C C23756 JNZ MOVLOP ;CONTINUE MOVING UNTIL DONE 1501 563F C9 RET 1502 1503 ***************************************************************** 1504 * * 1505 * TERMINAL DRIVER ROUTINES. IOBYTE IS INITIALIZED BY THE COLD * 1506 * BOOT ROUTINE, TO MODIFY, CHANGE THE "INTIOBY" EQUATE. THE * 1507 * I/O ROUTINES THAT FOLLOW ALL WORK EXACTLY THE SAME WAY. USING * 1508 * IOBYTE, THEY OBTAIN THE ADDRESS TO JUMP TO IN ORDER TO EXECUTE* 1509 * THE DESIRED FUNCTION. THERE IS A TABLE WITH FOUR ENTRIES FOR * 1510 * EACH OF THE POSSIBLE ASSIGNMENTS FOR EACH DEVICE. TO MODIFY * 1511 * THE I/O ROUTINES FOR A DIFFERENT I/O CONFIGURATION, JUST * 1512 * CHANGE THE ENTRIES IN THE TABLES. * CP/M MACRO ASSEM 2.0 #028 *** Cbios For CP/M Ver. 2.2 *** 1513 * * 1514 ***************************************************************** 1515 1516 E003 = CITTY EQU DJCIN ;INPUT FROM THE DISK JOCKEY 2D 1517 E006 = COTTY EQU DJCOUT ;OUTPUT TO THE DISK JOCKEY 2D 1518 1519 ***************************************************************** 1520 * * 1521 * CONST: GET THE STATUS FOR THE CURRENTLY ASSIGNED CONSOLE * 1522 * DEVICE. THE CONSOLE DEVICE CAN BE GOTTEN FROM IOBYTE, * 1523 * THEN A JUMP TO THE CORRECT CONSOLE STATUS ROUTINE IS * 1524 * PERFORMED. * 1525 * * 1526 ***************************************************************** 1527 1528 5640 21BA56 CONST LXI H,CSTBLE ;BEGINNING OF JUMP TABLE 1529 5643 C35256 JMP CONIN1 ;SELECT CORRECT JUMP 1530 1531 ***************************************************************** 1532 * * 1533 * CSREADER: IF THE CONSOLE IS ASSIGNED TO THE READER THEN A * 1534 * JUMP WILL BE MADE HERE, WHERE ANOTHER JUMP WILL * 1535 * OCCUR TO THE CORRECT READER STATUS. * 1536 * * 1537 ***************************************************************** 1538 1539 5646 21C256 CSREADR LXI H,CSRTBLE ;BEGINNING OF READER STATUS TABLE 1540 5649 C36F56 JMP READERA 1541 1542 ***************************************************************** 1543 * * 1544 * CONIN: TAKE THE CORRECT JUMP FOR THE CONSOLE INPUT ROUTINE. * 1545 * THE JUMP IS BASED ON THE TWO LEAST SIGNIFICANT BITS OF * 1546 * IOBYTE. * 1547 * * 1548 ***************************************************************** 1549 1550 564C CDD455 CONIN CALL FLUSH ;FLUSH THE DISK BUFFER 1551 564F 219256 LXI H,CITBLE ;BEGINNING OF CHARACTER INPUT TABLE 1552 1553 * 1554 * ENTRY AT CONIN1 WILL DECODE THE TWO LEAST SIGNIFICANT BITS 1555 * OF IOBYTE. THIS IS USED BY CONIN,CONOUT, AND CONST. 1556 * 1557 1558 5652 3A0300 CONIN1 LDA IOBYTE 1559 5655 17 RAL 1560 1561 * 1562 * ENTRY AT SELDEV WILL FORM AN OFFSET INTO THE TABLE POINTED 1563 * TO BY H&L AND THEN PICK UP THE ADDRESS AND JUMP THERE. 1564 * 1565 1566 5656 E606 SELDEV ANI 6H ;STRIP OFF UNWANTED BITS 1567 5658 1600 MVI D,0 ;FORM OFFSET 1568 565A 5F MOV E,A CP/M MACRO ASSEM 2.0 #029 *** Cbios For CP/M Ver. 2.2 *** 1569 565B 19 DAD D ;ADD OFFSET 1570 565C 7E MOV A,M ;PICK UP HIGH BYTE 1571 565D 23 INX H 1572 565E 66 MOV H,M ;PICK UP LOW BYTE 1573 565F 6F MOV L,A ;FORM ADDRESS 1574 5660 E9 PCHL ;GO THERE ! 1575 1576 ***************************************************************** 1577 * * 1578 * CONOUT: TAKE THE PROPER BRANCH ADDRESS BASED ON THE TWO LEAST * 1579 * SIGNIFICANT BITS OF IOBYTE. * 1580 * * 1581 ***************************************************************** 1582 1583 5661 C5 CONOUT PUSH B ;SAVE THE CHARACTER 1584 5662 CDD455 CALL FLUSH ;FLUSH THE DISK BUFFER 1585 5665 C1 POP B ;RESTORE THE CHARACTER 1586 5666 219A56 LXI H,COTBLE ;BEGINNING OF THE CHARACTER OUT TABLE 1587 5669 C35256 JMP CONIN1 ;DO THE DECODE 1588 1589 ***************************************************************** 1590 * * 1591 * READER: SELECT THE CORRECT READER DEVICE FOR INPUT. THE * 1592 * READER IS SELECTED FROM BITS 2 AND 3 OF IOBYTE. * 1593 * * 1594 ***************************************************************** 1595 1596 566C 21B256 READER LXI H,RTBLE ;BEGINNING OF READER INPUT TABLE 1597 1598 * 1599 * ENTRY AT READERA WILL DECODE BITS 2 & 3 OF IOBYTE, USED 1600 * BY CSREADER. 1601 * 1602 1603 566F 3A0300 READERA LDA IOBYTE 1604 1605 * 1606 * ENTRY AT READER1 WILL SHIFT THE BITS INTO POSITION, USED 1607 * BY LIST AND PUNCH. 1608 * 1609 1610 5672 1F READR1 RAR 1611 5673 C35656 JMP SELDEV 1612 1613 ***************************************************************** 1614 * * 1615 * PUNCH: SELECT THE CORRECT PUNCH DEVICE. THE SELECTION COMES * 1616 * FROM BITS 4&5 OF IOBYTE. * 1617 * * 1618 ***************************************************************** 1619 1620 5676 21AA56 PUNCH LXI H,PTBLE ;BEGINNING OF PUNCH TABLE 1621 5679 3A0300 LDA IOBYTE 1622 1623 * 1624 * 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 *** 1625 * SELDEV, USED BY LIST. 1626 * 1627 1628 567C 1F PNCH1 RAR 1629 567D 1F RAR 1630 567E C37256 JMP READR1 1631 1632 ***************************************************************** 1633 * * 1634 * LIST: SELECT A LIST DEVICE BASED ON BITS 6&7 OF IOBYTE * 1635 * * 1636 ***************************************************************** 1637 1638 5681 21A256 LIST LXI H,LTBLE ;BEGINNING OF THE LIST DEVICE ROUTINES 1639 5684 3A0300 LIST1 LDA IOBYTE 1640 5687 1F RAR 1641 5688 1F RAR 1642 5689 C37C56 JMP PNCH1 1643 1644 ***************************************************************** 1645 * * 1646 * LISTST: GET THE STATUS OF THE CURRENTLY ASSIGNED LIST DEVICE * 1647 * * 1648 ***************************************************************** 1649 1650 568C 21CA56 LISTST LXI H,LSTBLE ;BEGINNING OF THE LIST DEVICE STATUS 1651 568F C38456 JMP LIST1 1652 1653 ***************************************************************** 1654 * * 1655 * IF CUSTOMIZING I/O ROUTINES IS BEING PERFORMED, THE TABLE * 1656 * BELOW SHOULD BE MODIFIED TO REFLECT THE CHANGES. ALL I/O * 1657 * DEVICES ARE DECODED OUT OF IOBYTE AND THE JUMP IS TAKEN FROM * 1658 * THE FOLLOWING TABLES. * 1659 * * 1660 ***************************************************************** 1661 1662 * 1663 * CONSOLE INPUT TABLE 1664 * 1665 1666 5692 03E0 CITBLE DW CITTY ;INPUT FROM TTY (CURRENTLY ASSIGNED 1667 ; BY INTIOBY,INPUT FROM 2D) 1668 5694 FC56 DW CICRT ;INPUT FROM CRT (CURRENTLY SWITCHBOARD 1669 ; SERIAL PORT 1) 1670 5696 6C56 DW READER ;INPUT FROM READER (DEPENDS ON READER 1671 ; SELECTION) 1672 5698 FC56 DW CIUC1 ;INPUT FROM USER CONSOLE 1 (CURRENTLY 1673 ; SWITCHBOARD SERIAL PORT 1) 1674 1675 * 1676 * CONSOLE OUTPUT TABLE 1677 * 1678 1679 569A 06E0 COTBLE DW COTTY ;OUTPUT TO TTY (CURRENTLY ASSIGNED 1680 ; BY INTIOBY,OUTPUT TO 2D) CP/M MACRO ASSEM 2.0 #031 *** Cbios For CP/M Ver. 2.2 *** 1681 569C D256 DW COCRT ;OUTPUT TO CRT (CURRENTLY SWITCHBOARD 1682 ; SERIAL PORT 1) 1683 569E 8156 DW LIST ;OUTPUT TO LIST DEVICE (DEPENDS ON 1684 ; BITS 6&7 OF IOBYTE) 1685 56A0 D256 DW COUC1 ;OUTPUT TO USER CONSOLE 1 (CURRENTLY 1686 ; SWITCHBOARD SERIAL PORT 1) 1687 1688 * 1689 * LIST DEVICE TABLE 1690 * 1691 1692 56A2 06E0 LTBLE DW COTTY ;OUTPUT TO TTY (CURRENTLY ASSIGNED 1693 ; BY INTIOBY,OUTPUT TO 2D) 1694 56A4 D256 DW COCRT ;OUTPUT TO CRT (CURRENTLY SWITCHBOARD 1695 ; SERIAL PORT 1) 1696 56A6 D256 DW COLPT ;OUTPUT TO LINE PRINTER (CURRENTLY 1697 ; SWITCHBOARD SERIAL PORT 1) 1698 56A8 DD56 DW COUL1 ;OUTPUT TO USER LINE PRINTER 1 (CURRENTLY 1699 ; SWITCHBOARD SERIAL PORT 1) 1700 1701 * 1702 * PUNCH DEVICE TABLE 1703 * 1704 1705 56AA 06E0 PTBLE DW COTTY ;OUTPUT TO THE TTY (CURRENTLY ASSIGNED 1706 ; BY INTIOBY,OUTPUT TO 2D) 1707 56AC D256 DW COPTP ;OUTPUT TO PAPER TAPE PUNCH (CURRENTLY 1708 ; SWITCHBOARD SERIAL PORT 1) 1709 56AE D256 DW COUP1 ;OUTPUT TO USER PUNCH 1 (CURRENTLY 1710 ; SWITCHBOARD SERIAL PORT 1) 1711 56B0 D256 DW COUP2 ;OUTPUT TO USER PUNCH 2 (CURRNTLLY 1712 ; SWITCHBOARD SERIAL PORT 1) 1713 1714 * 1715 * READER DEVICE INPUT TABLE 1716 * 1717 1718 56B2 03E0 RTBLE DW CITTY ;INPUT FROM TTY (CURRENTLY ASSIGNED 1719 ; BY INTIOBY, INPUT FROM 2D) 1720 56B4 FC56 DW CIPTR ;INPUT FROM PAPER TAPE READER (CURRENTLY 1721 ; SWITCHBOARD SERIAL PORT 1) 1722 56B6 FC56 DW CIUR1 ;INPUT FROM USER READER 1 (CURRENTLY 1723 ; SWITCHBOARD SERIAL PORT 1) 1724 56B8 FC56 DW CIUR2 ;INPUT FROM USER READER 2 (CURRENTLY 1725 ; SWITCHBOARD SERIAL PORT 1) 1726 1727 * 1728 * CONSOLE STATUS TABLE 1729 * 1730 1731 56BA 0857 CSTBLE DW CSTTY ;STATUS OF TTY (CURRENTLY ASSIGNED 1732 ; BY INTIOBY, STSTUS FROM 2D) 1733 56BC 1057 DW CSCRT ;STATUS FROM CRT (CURRENTLY SWITCHBOARD 1734 ; SERIAL PORT 1) 1735 56BE 4656 DW CSREADR ;STATUS FROM READER (DEPENDS ON READER DEVICE ) 1736 56C0 1057 DW CSUC1 ;STATUS FROM USER CONSOLE 1 (CURRENTLY CP/M MACRO ASSEM 2.0 #032 *** Cbios For CP/M Ver. 2.2 *** 1737 ; SWITCHBOARD SERIAL PORT 1) 1738 1739 * 1740 * STATUS FROM READER DEVICE 1741 * 1742 1743 56C2 0857 CSRTBLE DW CSTTY ;STATUS FROM TTY (CURRENTLY ASSIGNED 1744 ; BY INTIOBY, STATUS OF 2D) 1745 56C4 1057 DW CSPTR ;STATUS FROM PAPER TAPE READER (CURRENTLY 1746 ; SWITCHBOARD SERIAL PORT 1) 1747 56C6 1057 DW CSUR1 ;STATUS FROM USER READER 1 (CURRENTLY 1748 ; SWITCHBOARD SERIAL PORT 1) 1749 56C8 1057 DW CSUR2 ;STATUS OF USER READER 2 (CURRENTLY 1750 ; SWITCHBOARD SERIAL PORT 1) 1751 1752 * 1753 * STATUS FROM LIST DEVICE 1754 * 1755 1756 56CA 1E57 LSTBLE DW READY ;CONSOLE ALWAYS READY 1757 56CC 1E57 DW READY ;GET LIST STATUS 1758 56CE 1957 DW LSLPT 1759 56D0 1957 DW LSLPT 1760 1761 ***************************************************************** 1762 * * 1763 * THE FOLLOWING EQUATES SET OUTPUT DEVICE TO OUTPUT TO THE * 1764 * SWITCHBOARD SERIAL PORT 1. * 1765 * * 1766 ***************************************************************** 1767 1768 56D2 = COCRT EQU $ ;OUTPUT FROM CRT 1769 56D2 = COUC1 EQU $ ;OUTPUT FROM USER CONSOLE 1 1770 56D2 = COPTP EQU $ ;OUTPUT FROM PAPER TAPE PUNCH 1771 56D2 = COUP1 EQU $ ;OUTPUT FROM USER PUNCH 1 1772 56D2 = COUP2 EQU $ ;OUTPUT FROM USER PUNCH 2 1773 56D2 DB02 COLPT IN 2 ;OUTPUT FROM LINE PRINTER,GET STATUS 1774 56D4 E680 ANI 80H ;WAIT UNTIL OK TO SEND 1775 56D6 CAD256 JZ COLPT 1776 56D9 79 MOV A,C ;OUTPUT THE CHARACTER 1777 56DA D301 OUT 1 1778 56DC C9 RET 1779 1780 ***************************************************************** 1781 * * 1782 * CUSTOM I/O PRINTER DRIVER FOR DIABLO PRINTER WITH 1200 BAUD * 1783 * ETX/ACK HANDSHAKE. * 1784 * * 1785 ***************************************************************** 1786 1787 56DD CDD256 COUL1 CALL COLPT ;OUTPUT THE CHARACTER 1788 56E0 3AFB56 LDA COUNT 1789 56E3 3D DCR A 1790 56E4 32FB56 STA COUNT 1791 56E7 C0 RNZ 1792 56E8 3E32 MVI A,50 CP/M MACRO ASSEM 2.0 #033 *** Cbios For CP/M Ver. 2.2 *** 1793 56EA 32FB56 STA COUNT 1794 56ED 0E03 MVI C,AETX 1795 56EF CDD256 CALL COLPT 1796 56F2 CDFC56 PWAIT CALL CIPTR 1797 56F5 FE06 CPI AACK 1798 56F7 C2F256 JNZ PWAIT 1799 56FA C9 RET 1800 1801 56FB 32 COUNT DB 50 1802 1803 ***************************************************************** 1804 * * 1805 * THE FOLLOWING EQUATES SET THE INPUT FROM THE DEVICES TO COME * 1806 * FROM THE SWITCHBOARD SERIAL PORT 1. * 1807 * * 1808 ***************************************************************** 1809 1810 56FC = CIUC1 EQU $ ;INPUT FROM USER CONSOLE 1 1811 56FC = CICRT EQU $ ;INPUT FROM CRT 1812 56FC = CIUR1 EQU $ ;INPUT FROM USER READER 1 1813 56FC = CIUR2 EQU $ ;INPUT FROM USER READER 2 1814 56FC DB02 CIPTR IN 2 ;INPUT FROM PAPER TAPE READER, GET STATUS 1815 56FE E640 ANI 40H ;WAIT FOR CHARACTER 1816 5700 CAFC56 JZ CIPTR 1817 5703 DB01 IN 1 1818 5705 E67F ANI 7FH ;STRIP OFF THE PARITY 1819 5707 C9 RET 1820 1821 ***************************************************************** 1822 * * 1823 * CONSOLE STATUS ROUTINES, TEST IF A CHARACTER HAS ARRIVED. * 1824 * * 1825 ***************************************************************** 1826 1827 5708 CD21E0 CSTTY CALL DJTSTAT ;STATUS FROM DISK JOCKEY 2D 1828 570B 3E00 STAT MVI A,0 ;PREP FOR ZERO RETURN 1829 570D C0 RNZ ;NOTHING FOUND 1830 570E 3D DCR A ;RETURN WITH 0FFH 1831 570F C9 RET 1832 1833 ***************************************************************** 1834 * * 1835 * THE FOLLOWING EQUATES CAUSE THE DEVICES TO GET STATUS FROM * 1836 * THE SWITCHBOARD SERIAL PORT 1. * 1837 * * 1838 ***************************************************************** 1839 1840 5710 = CSUR1 EQU $ ;STATUS OF USER READER 1 1841 5710 = CSUR2 EQU $ ;STATUS OF USER READER 2 1842 5710 = CSPTR EQU $ ;STATUS OF PAPER TAPE READER 1843 5710 = CSUC1 EQU $ ;STATUS OF USER CONSOLE 1 1844 5710 DB02 CSCRT IN 2 ;STATUS FROM CRT, GET STATUS 1845 5712 E640 ANI 40H ;STRIP OF DATA READY BIT 1846 5714 EE40 XRI 40H ;MAKE CORRECT POLARITY 1847 5716 C30B57 JMP STAT ;RETURN PROPER INDICATION 1848 CP/M MACRO ASSEM 2.0 #034 *** Cbios For CP/M Ver. 2.2 *** 1849 ***************************************************************** 1850 * * 1851 * LIST DEVICE STATUS ROUTINES. * 1852 * * 1853 ***************************************************************** 1854 1855 5719 DB02 LSLPT IN 2 ;ALL OTHER DEVICES WAIT 1856 571B E680 ANI 80H 1857 571D C8 RZ 1858 571E 3EFF READY MVI A,0FFH 1859 5720 C9 RET 1860 1861 ***************************************************************** 1862 * * 1863 * TINIT CAN BE MODIFIED FOR DIFFERENT I/O SETUPS. * 1864 * * 1865 ***************************************************************** 1866 1867 5721 0E1A TINIT MVI C,CLEAR ;INITIALIZE THE TERMINAL ROUTINE 1868 5723 3E00 MVI A,INTIOBY ;INITIALIZE IOBYTE 1869 5725 320300 STA IOBYTE 1870 5728 C30C53 JMP COUT 1871 1872 ***************************************************************** 1873 * * 1874 * XLT TABLES (SECTOR SKEW TABLES) FOR CP/M 2.0. THESE TABLES * 1875 * DEFINE THE SECTOR TRANSLATION THAT OCCURS WHEN MAPPING CP/M * 1876 * SECTORS TO PHYSICAL SECTORS ON THE DISK. THERE IS ONE SKEW * 1877 * TABLE FOR EACH OF THE POSSIBLE SECTOR SIZES. CURRENTLY THE * 1878 * TABLES ARE LOCATED ON TRACK 0 SECTORS 6 AND 8. THEY ARE * 1879 * LOADED INTO MEMORY IN THE CBIOS RAM BY THE COLD BOOT ROUTINE. * 1880 * * 1881 ***************************************************************** 1882 1883 572B 00 XLT128 DB 0 1884 572C 01070D1319 DB 1,7,13,19,25 1885 5731 050B1117 DB 5,11,17,23 1886 5735 03090F15 DB 3,9,15,21 1887 5739 02080E141A DB 2,8,14,20,26 1888 573E 060C1218 DB 6,12,18,24 1889 5742 040A1016 DB 4,10,16,22 1890 1891 5746 00 XLT256 DB 0 1892 5747 0102131425 DB 1,2,19,20,37,38 1893 574D 0304151627 DB 3,4,21,22,39,40 1894 5753 0506171829 DB 5,6,23,24,41,42 1895 5759 0708191A2B DB 7,8,25,26,43,44 1896 575F 090A1B1C2D DB 9,10,27,28,45,46 1897 5765 0B0C1D1E2F DB 11,12,29,30,47,48 1898 576B 0D0E1F2031 DB 13,14,31,32,49,50 1899 5771 0F10212233 DB 15,16,33,34,51,52 1900 5777 11122324 DB 17,18,35,36 1901 1902 577B 00 XLT512 DB 0 1903 577C 0102030411 DB 1,2,3,4,17,18,19,20 1904 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 *** 1905 578C 0506070815 DB 5,6,7,8,21,22,23,24 1906 5794 2526272835 DB 37,38,39,40,53,54,55,56 1907 579C 090A0B0C19 DB 9,10,11,12,25,26,27,28 1908 57A4 292A2B2C39 DB 41,42,43,44,57,58,59,60 1909 57AC 0D0E0F101D DB 13,14,15,16,29,30,31,32 1910 57B4 2D2E2F30 DB 45,46,47,48 1911 1912 57B8 00 XLT124 DB 0 1913 57B9 0102030405 DB 1,2,3,4,5,6,7,8 1914 57C1 191A1B1C1D DB 25,26,27,28,29,30,31,32 1915 57C9 3132333435 DB 49,50,51,52,53,54,55,56 1916 57D1 090A0B0C0D DB 9,10,11,12,13,14,15,16 1917 57D9 2122232425 DB 33,34,35,36,37,38,39,40 1918 57E1 393A3B3C3D DB 57,58,59,60,61,62,63,64 1919 57E9 1112131415 DB 17,18,19,20,21,22,23,24 1920 57F1 292A2B2C2D DB 41,42,43,44,45,46,47,48 1921 1922 ***************************************************************** 1923 * * 1924 * EACH OF THE FOLLOWING TABLES DESCRIBES A DISKETTE WITH THE * 1925 * SPECIFIED CHARACTERISTICS. THE TABLES ARE CURRENTLY STORED * 1926 * ON TRACK 0 SECTOR 13. THEY ARE READ INTO MEMORY BY THE GOCPM * 1927 * ROUTINE IN THE CBIOS FOR CP/M VER 2.0. * 1928 * * 1929 ***************************************************************** 1930 1931 1932 ***************************************************************** 1933 * * 1934 * THE FOLLOWING DPB DEFINES A DISKETTE FOR 128 BYTE SECTORS, * 1935 * SINGLE DENSITY, AND SINGLE SIDED. * 1936 * * 1937 ***************************************************************** 1938 1939 57F9 1A00 DPB128S DW 26 ;CP/M SECTORS/TRACK 1940 57FB 03 DB 3 ;BSH 1941 57FC 07 DB 7 ;BLM 1942 57FD 00 DB 0 ;EXM 1943 57FE F200 DW 242 ;DSM 1944 5800 3F00 DW 63 ;DRM 1945 5802 C0 DB 0C0H ;AL0 1946 5803 00 DB 0 ;AL1 1947 5804 1000 DW 16 ;CKS 1948 5806 0200 DW 2 ;OFF 1949 5808 01 DB 1H ;16*((#CPM SECTORS/PHYSICAL SECTOR) -1) + 1950 ;LOG2(#BYTES PER SECTOR/128) + 1 + 1951 ;8 IF DOUBLE SIDED. 1952 1953 ***************************************************************** 1954 * * 1955 * THE FOLLOWING DPB DEFINES A DISKETTE FOR 256 BYTE SECTORS, * 1956 * DOUBLE DENSITY, AND SINGLE SIDED. * 1957 * * 1958 ***************************************************************** 1959 1960 5809 3400 DPB256S DW 52 ;CP/M SECTORS/TRACK CP/M MACRO ASSEM 2.0 #036 *** Cbios For CP/M Ver. 2.2 *** 1961 580B 04 DB 4 ;BSH 1962 580C 0F DB 15 ;BLM 1963 580D 00 DB 0 ;EXM 1964 580E F200 DW 242 ;DSM 1965 5810 7F00 DW 127 ;DRM 1966 5812 C0 DB 0C0H ;AL0 1967 5813 00 DB 0 ;AL1 1968 5814 2000 DW 32 ;CKS 1969 5816 0200 DW 2 ;OFF 1970 5818 12 DB 12H ;16*((#CPM SECTORS/PHYSICAL SECTOR) -1) + 1971 ;LOG2(#BYTES PER SECTOR/128) + 1 + 1972 ;8 IF DOUBLE SIDED. 1973 1974 ***************************************************************** 1975 * * 1976 * THE FOLLOWING DPB DEFINES A DISKETTE AS 512 BYTE SECTORS, * 1977 * DOUBLE DENSITY, AND SINGLE SIDED. * 1978 * * 1979 ***************************************************************** 1980 1981 5819 3C00 DPB512S DW 60 ;CP/M SECTORS/TRACK 1982 581B 04 DB 4 ;BSH 1983 581C 0F DB 15 ;BLM 1984 581D 00 DB 0 ;EXM 1985 581E 1801 DW 280 ;DSM 1986 5820 7F00 DW 127 ;DRM 1987 5822 C0 DB 0C0H ;AL0 1988 5823 00 DB 0 ;AL1 1989 5824 2000 DW 32 ;CKS 1990 5826 0200 DW 2 ;OFF 1991 5828 33 DB 33H ;16*((#CPM SECTORS/PHYSICAL SECTOR) -1) + 1992 ;LOG2(#BYTES PER SECTOR/128) + 1 + 1993 ;8 IF DOUBLE SIDED. 1994 1995 ***************************************************************** 1996 * * 1997 * THE FOLLOWING DPB DEFINES A DISKETTE AS 1024 BYTE SECTORS, * 1998 * DOUBLE DENSITY, AND SINGLE SIDED. * 1999 * * 2000 ***************************************************************** 2001 2002 5829 4000 DP1024S DW 64 ;CP/M SECTORS/TRACK 2003 582B 04 DB 4 ;BSH 2004 582C 0F DB 15 ;BLM 2005 582D 00 DB 0 ;EXM 2006 582E 2B01 DW 299 ;DSM 2007 5830 7F00 DW 127 ;DRM 2008 5832 C0 DB 0C0H ;AL0 2009 5833 00 DB 0 ;AL1 2010 5834 2000 DW 32 ;CKS 2011 5836 0200 DW 2 ;OFF 2012 5838 74 DB 74H ;16*((#CPM SECTORS/PHYSICAL SECTOR) -1) + 2013 ;LOG2(#BYTES PER SECTOR/128) + 1 + 2014 ;8 IF DOUBLE SIDED. 2015 2016 ***************************************************************** CP/M MACRO ASSEM 2.0 #037 *** Cbios For CP/M Ver. 2.2 *** 2017 * * 2018 * THE FOLLOWING DPB DEFINES A DISKETTE FOR 128 BYTE SECTORS, * 2019 * SINGLE DENSITY, AND DOUBLE SIDED. * 2020 * * 2021 ***************************************************************** 2022 2023 5839 3400 DPB128D DW 52 ;CP/M SECTORS/TRACK 2024 583B 04 DB 4 ;BSH 2025 583C 0F DB 15 ;BLM 2026 583D 01 DB 1 ;EXM 2027 583E F200 DW 242 ;DSM 2028 5840 7F00 DW 127 ;DRM 2029 5842 C0 DB 0C0H ;AL0 2030 5843 00 DB 0 ;AL1 2031 5844 2000 DW 32 ;CKS 2032 5846 0200 DW 2 ;OFF 2033 5848 09 DB 9H 2034 2035 ***************************************************************** 2036 * * 2037 * THE FOLLOWING DPB DEFINES A DISKETTE AS 256 BYTE SECTORS, * 2038 * DOUBLE DENSITY, AND DOUBLE SIDED. * 2039 * * 2040 ***************************************************************** 2041 2042 5849 6800 DPB256D DW 104 ;CP/M SECTORS/TRACK 2043 584B 04 DB 4 ;BSH 2044 584C 0F DB 15 ;BLM 2045 584D 00 DB 0 ;EXM 2046 584E E601 DW 486 ;DSM 2047 5850 FF00 DW 255 ;DRM 2048 5852 F0 DB 0F0H ;AL0 2049 5853 00 DB 0 ;AL1 2050 5854 4000 DW 64 ;CKS 2051 5856 0200 DW 2 ;OFF 2052 5858 1A DB 1AH 2053 2054 ***************************************************************** 2055 * * 2056 * THE FOLLOWING DPB DEFINES A DISKETTE AS 512 BYTE SECTORS, * 2057 * DOUBLE DENSITY, AND DOUBLE SIDED. * 2058 * * 2059 ***************************************************************** 2060 2061 5859 7800 DPB512D DW 120 ;CP/M SECTORS/TRACK 2062 585B 04 DB 4 ;BSH 2063 585C 0F DB 15 ;BLM 2064 585D 00 DB 0 ;EXM 2065 585E 3102 DW 561 ;DSM 2066 5860 FF00 DW 255 ;DRM 2067 5862 F0 DB 0F0H ;AL0 2068 5863 00 DB 0 ;AL1 2069 5864 4000 DW 64 ;CKS 2070 5866 0200 DW 2 ;OFF 2071 5868 3B DB 3BH 2072 CP/M MACRO ASSEM 2.0 #038 *** Cbios For CP/M Ver. 2.2 *** 2073 ***************************************************************** 2074 * * 2075 * THE FOLLOWING DPB DEFINES A DISKETTE AS 1024 BYTE SECTORS, * 2076 * DOUBLE DENSITY, AND DOUBLE SIDED. * 2077 * * 2078 ***************************************************************** 2079 2080 5869 8000 DP1024D DW 128 ;CP/M SECTORS/TRACK 2081 586B 04 DB 4 ;BSH 2082 586C 0F DB 15 ;BLM 2083 586D 00 DB 0 ;EXM 2084 586E 5702 DW 599 ;DSM 2085 5870 FF00 DW 255 ;DRM 2086 5872 F0 DB 0F0H ;AL0 2087 5873 00 DB 0 ;AL1 2088 5874 4000 DW 64 ;CKS 2089 5876 0200 DW 2 ;OFF 2090 5878 7C DB 7CH 2091 2092 ***************************************************************** 2093 * * 2094 * CP/M DISK PARAMETER HEADERS, UNITIALIZED. * 2095 * * 2096 ***************************************************************** 2097 2098 5879 0000 DPZERO DW 0 ;ADDRESS OF TRANSLATION TABLE (FILLED 2099 ; IN BY SETDRV) 2100 587B 0000000000 DW 0,0,0 ;USED BY BDOS 2101 5881 EC5E DW DIRBUF ;ADDRESS OF DIRECTORY BUFFER 2102 5883 0000 DW 0 ;ADDRESS OF DPB (FILLED IN BY SETDRV) 2103 5885 EC5D DW CSV0 ;DIRECTORY CHECK VECTOR 2104 5887 C05C DW ALV0 ;ALLOCATION VECTOR 2105 2106 5889 0000 DPONE DW 0 2107 588B 0000000000 DW 0,0,0 2108 5891 EC5E DW DIRBUF 2109 5893 0000 DW 0 2110 5895 2C5E DW CSV1 2111 5897 0B5D DW ALV1 2112 2113 5899 0000 DPTWO DW 0 2114 589B 0000000000 DW 0,0,0 2115 58A1 EC5E DW DIRBUF 2116 58A3 0000 DW 0 2117 58A5 6C5E DW CSV2 2118 58A7 565D DW ALV2 2119 2120 58A9 0000 DPTHRE DW 0 2121 58AB 0000000000 DW 0,0,0 2122 58B1 EC5E DW DIRBUF 2123 58B3 0000 DW 0 2124 58B5 AC5E DW CSV3 2125 58B7 A15D DW ALV3 2126 2127 ***************************************************************** 2128 * * CP/M MACRO ASSEM 2.0 #039 *** Cbios For CP/M Ver. 2.2 *** 2129 * CBIOS RAM LOCATIONS THAT DON'T NEED INITIALIZATION. * 2130 * * 2131 ***************************************************************** 2132 2133 58B9 00 CPMSEC DB 0 ;CP/M SECTOR # 2134 58BA 00 CPMDRV DB 0 ;CP/M DRIVE # 2135 58BB 00 CPMTRK DB 0 ;CP/M TRACK # 2136 58BC 00 TRUESEC DB 0 ;DISK JOCKEY SECTOR THAT CONTAINS CP/M SECTOR 2137 58BD 00 BUFDRV DB 0 ;DRIVE THAT BUFFER BELONGS TO 2138 58BE 00 BUFTRK DB 0 ;TRACK THAT BUFFER BELONGS TO 2139 58BF 00 BUFSEC DB 0 ;SECTOR THAT BUFFER BELONGS TO 2140 58C0 BUFFER DS 1024 ;MAXIMUM SIZE BUFFER FOR 1K SECTORS 2141 2142 5CC0 ALV0 DS 75 ;ALLOCATION VECTOR FOR DRIVE A 2143 5D0B ALV1 DS 75 ;ALLOCATION VECTOR FOR DRIVE B 2144 5D56 ALV2 DS 75 ;ALLOCATION VECTOR FOR DRIVE C 2145 5DA1 ALV3 DS 75 ;ALLOCATION VECTOR FOR DRIVE D 2146 5DEC CSV0 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE A 2147 5E2C CSV1 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE B 2148 5E6C CSV2 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE C 2149 5EAC CSV3 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE D 2150 5EEC DIRBUF DS 128 ;DIRECTORY BUFFER 2151 CP/M MACRO ASSEM 2.0 #040 *** Cbios For CP/M Ver. 2.2 *** AACK 0006 827# 1797 ACR 000D 824# 867 877 893 AETX 0003 826# 1794 ALF 000A 825# 867 867 877 893 ALV0 5CC0 2104 2142# ALV1 5D0B 2111 2143# ALV2 5D56 2118 2144# ALV3 5DA1 2125 2145# AUTOFLG 53FA 957 979# BDOS 4500 806# 942 BIAS 1000 804# 805 BIOS 5300 807# 840 BUFDRV 58BD 1343 1438 1480 2137# BUFF 0080 809# 935 BUFFER 58C0 1281 1282 1283# 1284 1286# 1286 1287 1300 1301 1302 1303 1303 1317 1318# 1366 1384 1413 1458 1473 2140# BUFSEC 58BF 945 1448 2139# BUFTRK 58BE 1441 2138# BUFWRTN 55D5 946 1403 1420# 1434 BUSY E36C 342 436 567# 579 CBOOT 53A0 842 914# 919# CBUSY E1FB 314 339# CCP 3D00 744# 745# 746# 747# 748# 749# 750# 751# 752# 753# 805# 806 807 950 952 961 962 1024 1027 1032 1050 CDISK 0004 808# 925 947 CHKSEC E2B9 402 438 442# CICRT 56FC 1668 1811# CIPTR 56FC 1720 1796 1814# 1816 CITBLE 5692 1551 1666# CITTY E003 1516# 1666 1718 CIUC1 56FC 1672 1810# CIUR1 56FC 1722 1812# CIUR2 56FC 1724 1813# CLDBOT 53F2 958 960# CLEAR 001A 828# 1867 CMNDBEG 53FB 949 951 987# 995# CMNDEND 53FB 951 988# 996# COCRT 56D2 1681 1694 1768# COLPT 56D2 1696 1773# 1775 1787 1795 COMNDP E1B1 286# 297 321 CONIN 564C 845 1544# 1550# 1555 CONIN1 5652 1529 1554 1558# 1587 CONOUT 5661 846 1555 1578# 1583# CONST 5640 844 1521# 1528# 1555 COPTP 56D2 1707 1770# COTBLE 569A 1586 1679# COTTY E006 1517# 1679 1692 1705 COUC1 56D2 1685 1769# COUL1 56DD 1698 1787# COUNT 56FB 1788 1790 1793 1801# COUP1 56D2 1709 1771# COUP2 56D2 1711 1772# COUT 530C 846# 908 1870 CPMDMA 55B5 1090 1389# CPMDRV 58BA 924 1170 1248 1342 1479 2134# CP/M MACRO ASSEM 2.0 #041 *** Cbios For CP/M Ver. 2.2 *** CPMREV 0016 768# 871 873 CPMSEC 58B9 1079 1326 1370 2133# CPMTRK 58BB 1109 1178 2135# CRCHI E7FF 713# CRCLO E7FE 712# CSCRT 5710 1733 1844# CSPTR 5710 1745 1842# CSREADR 5646 1539# 1735 CSRTBLE 56C2 1539 1743# CSTBLE 56BA 1528 1731# CSTTY 5708 1731 1743 1827# CSUC1 5710 1736 1843# CSUR1 5710 1747 1840# CSUR2 5710 1749 1841# CSV0 5DEC 2103 2146# CSV1 5E2C 2110 2147# CSV2 5E6C 2117 2148# CSV3 5EAC 2124 2149# CWFLG 53F9 955 964# 1012 D1PRAM E7F0 698# D1TRK E7F1 699# D2PRAM E7F2 700# D2TRK E7F3 701# D3PRAM E7F4 702# D3TRK E7F5 703# DBLSID 0008 830# 1206 DIRBUF 5EEC 2101 2108 2115 2122 2150# DIVDONE 5583 1334 1339# DIVLOOP 557A 1333# 1338 DJCIN E003 780# 1516 DJCOUT E006 781# 1517 DJDEN E02D 792# 1019 DJDMA E012 785# 1028 1057 1459 DJDRV 5333 859# 1017 1440 DJERR E02A 791# 1069 DJHOME E009 782# 1445 DJRAM E400 779# DJREAD E015 786# 1064 1460 1483 DJSEC E00F 784# 1030 1049 1457 DJSEL E01B 788# 859 DJSIDE E030 793# 1021 1453 DJSTAT E027 790# 1181 DJTRK E00F 783# 1063 1447 DJTSTAT E021 789# 1827 DJWRITE E018 787# 1423 DOPRAM E7EE 696# DOTRK E7EF 697# DP1024D 5869 2080# DP1024S 5829 2002# DPB128D 5839 1209 2023# DPB128S 57F9 1207 1939# DPB256D 5849 2042# DPB256S 5809 1960# DPB512D 5859 2061# DPB512S 5819 1981# DPONE 5889 2106# CP/M MACRO ASSEM 2.0 #042 *** Cbios For CP/M Ver. 2.2 *** DPTHRE 58A9 2120# DPTWO 5899 2113# DPZERO 5879 1255 2098# DRVSEL E7EA 366 509 516 584 692# DSROT E310 504# 507 DSTALL E3E2 658 659# DTSLOP 5590 1345# 1351 ENTRY 0005 814# 929 939 943 1428 1554# 1562# 1599# 1606# 1624# FILL 5620 1179 1360 1473# 1477# FLUSH 55D4 1413# 1418# 1477 1550 1584 GETDPB 5541 1122 1190 1222 1243# 1248# GOCPM 53B3 929# 935# 1013 1926 HOME 5490 850 1095# 1099# INDXCT E3A8 610# 618 INDXHI E3A3 606# 609 INDXLO E39E 602# 605 INTIOBY 0000 811# 1506 1868 INTO 55C2 1095 1114 1281 1284 1284 1287 1304 1365 1394 1399# 1414 1562 1606 1879 1926 IOBYTE 0003 812# 1505 1508# 1522 1546# 1555 1558 1579 1592 1599 1603 1616 1621 1634 1639 1657 1869 JPREP E233 293 317 371# LIST 5681 847 1607 1625 1634# 1634 1638# 1646 1683 1689# 1753 1851# LIST1 5684 1639# 1651 LISTST 568C 857 1646# 1650# LSLPT 5719 1758 1759 1855# LSTBLE 56CA 1650 1756# LTBLE 56A2 1638 1692# MAXDISK 0004 829# 1171 MESSAGE 5393 863 897 902# 910 922 MOVE 559F 1346 1365# 1370# MOVER 5635 1395 1400 1489# 1494# MOVLOP 5637 954 1194 1482 1495# 1500 MSIZE 0018 803# 804 868 869 NBUSY E367 563# 566 NEWDMA 545E 1025 1043 1046 1051# 1054 NEWSEC 543F 1023 1035# 1047 NOWRAP 5456 1039 1047# OUTOF 55BD 1395# PATCH E373 572 573# PNCH1 567C 1624 1628# 1642 PREP 55DB 1427# 1433# 1484 1624 PROMPT 5336 867# 921 PTBLE 56AA 1620 1705# PUNCH 5676 848 1607 1615# 1615 1620# 1702# PWAIT 56F2 1796# 1798 PWRJMP E3F0 673# RDENTRY E1E3 319# 337 RDHDR E295 409 423# RDLOOP E1E8 322# 336 RDWR 55B8 1311 1392# RDYCHK E34F 534 543# READ 5569 855 1074 1104 1157 1284 1300# 1310# 1318 1427 1428 1926 READER 566C 849 1533 1535 1591# 1591 1592# 1596# 1670 1715# 1740 CP/M MACRO ASSEM 2.0 #043 *** Cbios For CP/M Ver. 2.2 *** READERA 566F 1540 1599 1603# READR1 5672 1610# 1630 READY 571E 1756 1757 1858# REDWRT 556D 1315# 1323# RETRIES 000A 823# 1061 1427 1436 RETRYLP 55E4 1437# 1469 RETRYOP 5612 1435 1461# REVNUM 001F 767# 875 876 RHL1 E2A2 430# 434 RHLOOP E297 425# 440 RTBLE 56B2 1596 1718# SBEGIN E3DE 657# SECPSEC 55A4 1234 1373# SECSIZ 556E 1227 1324# SECTNO E7FC 710# SECTRAN 5497 858 1114# 1119# SELDEV 5656 1562 1566# 1611 1625# SERROR E28E 398 417# 441 SETDMA 548A 854 936 1084# 1088# SETDRV 54C6 851 1157# 1169# SETDRV1 5524 1175 1222# SETSEC 5485 853 1073# 1078# SETTRK 5492 852 1103# 1108# SIDEA 54A5 1129# 1142 SIDENO E7FB 709# SIDEOK 5517 1208 1210# SIDEONE 54A8 1132# 1149 SIDETWO 54AE 1128 1138# SLOOP E273 404# 415 STABLE E2DF 446 466# STACK E7C9 685# STAT 570B 1828# 1847 STEST E217 349 352# SZLOOP E2D7 458# 464 TILOOP E3D5 648# 654 TIMER E7E4 536 556 688# TINIT 5721 920 1863# 1867# TLOOP E348 537# 541 TPA 0100 810# 919 1006 TRKNO E7FA 708# TRUESEC 58BC 1177 1341 2136# TVERFY E26A 386 399# UNLOAD E353 547# WARMLOD 543E 1026 1034# 1059 WARMRD 5472 1031 1058 1061# WBOOT 53FC 843 1000# 1006# WBOOTE 5303 843# 940 WBOT 0000 813# 938 941 WFLG 5400 1008# 1011 1015 WRENTRY E1C2 295# 313 WRITE 5562 856 1074 1104 1157 1281# 1291# 1427 1428 WRITTYP 55CC 1292 1405# 1408 WRLOOP E1C7 298# 312 WRMREAD 5475 1062# 1068 XLT124 57B8 1277 1912# XLT128 572B 1274 1883# CP/M MACRO ASSEM 2.0 #044 *** Cbios For CP/M Ver. 2.2 *** XLT256 5746 1275 1891# XLT512 577B 1276 1902# XLTS 555A 1185 1269# 1274# ZRET 553D 1172 1180 1238#