CP/M MACRO ASSEM 2.0 #001 *** Cbios For CP/M Ver. 2.2 *** 1 ***************************************************************** 2 * * 3 * CBIOS FOR CP/M VER 2.2 FOR DISK JOCKEY 2D CONTROLLER (ALL * 4 * REVS). HANDLES DISKETTES WITH SECTOR SIZES OF 128 BYTES * 5 * SINGLE DENSITY, 256, 512, 1024 BYTES DOUBLE DENSITY. * 6 * * 7 * WRITTEN BY BOBBY DALE GIFFORD. * 8 * 9/1/79 * 9 * * 10 * DISK MAP OF SECTORS USED BY COLD BOOT, WARM BOOT, FIRMWARE, * 11 * AND CP/M: * 12 * * 13 * TRK 0 SEC 1 = FIRST SECTOR OF COLD BOOT. E700H * 14 * 0 2 = COLD BOOT 256. 80H * 15 * 0 3 = COLD BOOT 512. 80H * 16 * 0 4 = COLD BOOT 1024. 80H * 17 * 0 5 = WARM BOOT 256. 80H * 18 * 0 6 = WARM BOOT 512. 80H * 19 * 0 7 = WARM BOOT 1024. 80H * 20 * 0 8 = COLD/WARM BOOT. 3200H * 21 * 0 9 = FIRMWARE. E400H * 22 * 0 10 = FIRMWARE+80H. E480H * 23 * 0 11 = FIRMWARE+100H E500H * 24 * 0 12 = FIRMWARE+180H. E580H * 25 * 0 13 = FIRMWARE+200H. E600H * 26 * 0 14 = FIRMWARE+280H. E680H * 27 * 0 15 = FIRMWARE+300H. E700H * 28 * 0 16 = FIRMWARE+380H. E780H * 29 * 0 17 = CCP. 2D00H * 30 * 0 10 = CCP+80H. 2D80H * 31 * 0 12 = CCP+100H. 2E00H * 32 * 0 14 = CCP+180H. 2E80H * 33 * 0 16 = CCP+200H. 2F00H * 34 * 0 18 = CCP+280H. 2F80H * 35 * 0 20 = CCP+300H. 3000H * 36 * 0 22 = CCP+380H. 3080H * 37 * 0 24 = CCP+400H. 3100H * 38 * 0 26 = CCP+480H. 3180H * 39 * 1 = REST OF CP/M. 3200H-4FFFH * 40 * * 41 ***************************************************************** 42 43 TITLE '*** Cbios For CP/M Ver. 2.2 ***' 44 45 ***************************************************************** 46 * * 47 * THE FOLLOWING REVISION NUMBER IS IN REFERENCE TO THE CP/M * 48 * 2.0 CBIOS. * 49 * * 50 ***************************************************************** 51 52 001F = REVNUM EQU 31 ;CBIOS REVISION NUMBER 53 0016 = CPMREV EQU 22 ;CP/M REVISION NUMBER 54 55 ***************************************************************** 56 * * CP/M MACRO ASSEM 2.0 #002 *** Cbios For CP/M Ver. 2.2 *** 57 * THE FOLLOWING EQUATES RELATE THE THINKER TOYS 2D CONTROLLER. * 58 * IF THE CONTROLLER IS NON STANDARD (0E000H) ONLY THE ORIGIN * 59 * EQUATE NEED BE CHANGED. THIS VERSION OF THE CBIOS WILL WORK * 60 * WITH 2D CONTROLLER BOARDS REV 0, 1, 3, 3.1, 4. * 61 * * 62 ***************************************************************** 63 64 E000 = ORIGIN EQU 0E000H 65 E400 = DJRAM EQU ORIGIN+400H ;DISK JOCKEY 2D RAM ADDRESS 66 E403 = DJCIN EQU DJRAM+3H ;DISK JOCKEY 2D CHARACTER INPUT ROUTINE 67 E406 = DJCOUT EQU DJRAM+6H ;DISK JOCKEY 2D CHARACTER OUTPUT ROUTINE 68 E409 = DJHOME EQU DJRAM+9H ;DISK JOCKEY 2D TRACK ZERO SEEK 69 E40C = DJTRK EQU DJRAM+0CH ;DISK JOCKEY 2D TRACK SEEK ROUTINE 70 E40F = DJSEC EQU DJRAM+0FH ;DISK JOCKEY 2D SET SECTOR ROUTINE 71 E412 = DJDMA EQU DJRAM+012H ;DISK JOCKEY 2D SET DMA ADDRESS 72 E415 = DJREAD EQU DJRAM+15H ;DISK JOCKEY 2D READ ROUTINE 73 E418 = DJWRITE EQU DJRAM+18H ;DISK JOCKEY 2D WRITE ROUTINE 74 E41B = DJSEL EQU DJRAM+1BH ;DISK JOCKEY 2D SELECT DRIVE ROUTINE 75 E421 = DJTSTAT EQU DJRAM+21H ;DISK JOCKEY 2D TERMINAL STATUS ROUTINE 76 E427 = DJSTAT EQU DJRAM+27H ;DISK JOCKEY 2D STATUS ROUTINE 77 E42A = DJERR EQU DJRAM+2AH ;DISK JOCKEY 2D ERROR, FLASH LED 78 E42D = DJDEN EQU DJRAM+2DH ;DISK JOCKEY 2D SET DENSITY ROUTINE 79 E430 = DJSIDE EQU DJRAM+30H ;DISK JOCKEY 2D SET SIDE ROUTINE 80 81 ***************************************************************** 82 * * 83 * CP/M SYSTEM EQUATES. IF RECONFIGURATION OF THE CP/M SYSTEM * 84 * IS BEING DONE, THE CHANGES CAN BE MADE TO THE FOLLOWING * 85 * EQUATES. * 86 * * 87 ***************************************************************** 88 89 0018 = MSIZE EQU 24 ;MEMORY SIZE OF TARGET CP/M 90 1000 = BIAS EQU (MSIZE-20)*1024 ;MEMORY OFFSET FROM 20K SYSTEM 91 3D00 = CCP EQU 2D00H+BIAS ;CONSOLE COMMAND PROCESSOR 92 4500 = BDOS EQU CCP+800H ;BDOS ADDRESS 93 5300 = BIOS EQU CCP+1600H ;CBIOS ADDRESS 94 0004 = CDISK EQU 4 ;ADDRESS OF LAST LOGGED DISK 95 0080 = BUFF EQU 80H ;DEFAULT BUFFER ADDRESS 96 0100 = TPA EQU 100H ;TRANSIENT MEMORY 97 0000 = INTIOBY EQU 0 ;INITIAL IOBYTE 98 0003 = IOBYTE EQU 3 ;IOBYTE LOCATION 99 0000 = WBOT EQU 0 ;WARM BOOT JUMP ADDRESS 100 0005 = ENTRY EQU 5 ;BDOS ENTRY JUMP ADDRESS 101 102 ***************************************************************** 103 * * 104 * THE FOLLOWING ARE INTERNAL CBIOS EQUATES. MOST ARE MISC. * 105 * CONSTANTS. * 106 * * 107 ***************************************************************** 108 109 000A = RETRIES EQU 10 ;MAX RETRIES ON DISK I/O BEFORE ERROR 110 000D = ACR EQU 0DH ;A CARRIAGE RETURN 111 000A = ALF EQU 0AH ;A LINE FEED 112 0003 = AETX EQU 3 ;A ETX CHAR CP/M MACRO ASSEM 2.0 #003 *** Cbios For CP/M Ver. 2.2 *** 113 0006 = AACK EQU 6 ;A ACK CHAR 114 001A = CLEAR EQU 1AH ;CLEAR SCREEN CHAR ON ADM3 TERMINAL 115 0004 = MAXDISK EQU 4 ;MAXIMUM # OF DISK DRIVES 116 0008 = DBLSID EQU 8 ;SIDE BIT FROM CONTROLLER 117 118 ***************************************************************** 119 * * 120 * THE JUMP TABLE BELOW MUST REMAIN IN THE SAME ORDER, THE * 121 * ROUTINES MAY BE CHANGED, BUT THE FUNCTION EXECUTED MUST BE * 122 * THE SAME. * 123 * * 124 ***************************************************************** 125 126 5300 ORG BIOS ;CBIOS STARTING ADDRESS 127 128 5300 C3A053 JMP CBOOT ;COLD BOOT ENTRY POINT 129 5303 C3FC53 WBOOTE JMP WBOOT ;WARM BOOT ENTRY POINT 130 5306 C34056 JMP CONST ;CONSOLE STATUS ROUTINE 131 5309 C34C56 JMP CONIN ;CONSOLE INPUT 132 530C C36156 COUT JMP CONOUT ;CONSOLE OUTPUT 133 530F C38156 JMP LIST ;LIST DEVICE OUTPUT 134 5312 C37656 JMP PUNCH ;PUNCH DEVICE OUTPUT 135 5315 C36C56 JMP READER ;READER DEVICE INPUT 136 5318 C39054 JMP HOME ;HOME DRIVE 137 531B C3C654 JMP SETDRV ;SELECT DISK 138 531E C39254 JMP SETTRK ;SET TRACK 139 5321 C38554 JMP SETSEC ;SET SECTOR 140 5324 C38A54 JMP SETDMA ;SET DMA ADDRESS 141 5327 C36955 JMP READ ;READ THE DISK 142 532A C36255 JMP WRITE ;WRITE THE DISK 143 532D C38C56 JMP LISTST ;LIST DEVICE STATUS 144 5330 C39754 JMP SECTRAN ;SECTOR TRANSLATION 145 5333 C31BE4 DJDRV JMP DJSEL ;HOOK FOR SINGLE.COM PROGRAM 146 147 ***************************************************************** 148 * * 149 * SIGNON MESSAGE OUTPUT DURING COLD BOOT. * 150 * * 151 ***************************************************************** 152 153 5336 0D0A0A PROMPT DB ACR,ALF,ALF 154 5339 32 DB '0'+MSIZE/10 ;CP/M MEMORY SIZE 155 533A 34 DB '0'+(MSIZE MOD 10) 156 533B 4B2043502F DB 'K CP/M Vers. ' ;CP/M VERSION NUMBER 157 5348 32 DB CPMREV/10+'0' 158 5349 2E DB '.' 159 534A 32 DB (CPMREV MOD 10)+'0' 160 534B 2C20436269 DB ', Cbios rev ' 161 5357 332E DB REVNUM/10+'0','.' ;CBIOS REVISION NUMBER 162 5359 31 DB REVNUM MOD 10+'0' 163 535A 0D0A DB ACR,ALF 164 535C 466F722054 DB 'For Thinker Toys Disk Jockey 2D Controller ' 165 5387 402030 DB '@ 0' 166 167 IF ORIGIN/4096 > 10 ;CONTROLLER ORIGIN (HEX) 168 538A 45 DB ORIGIN/4096+'A'-10 CP/M MACRO ASSEM 2.0 #004 *** Cbios For CP/M Ver. 2.2 *** 169 ELSE 170 DB ORIGIN/4096+'0' 171 ENDIF 172 173 IF (ORIGIN/256 AND 0FH) > 10 174 DB (ORIGIN/256 AND 0FH)+'A'-10 175 ELSE 176 538B 30 DB (ORIGIN/256 AND 0FH)+'0' 177 ENDIF 178 538C 3030482E DB '00H.' 179 5390 0D0A00 DB ACR,ALF,0 180 181 ***************************************************************** 182 * * 183 * UTILITY ROUTINE TO OUTPUT THE MESSAGE POINTED AT BY H&L, * 184 * TERMINATED WITH A NULL. * 185 * * 186 ***************************************************************** 187 188 5393 7E MESSAGE MOV A,M ;GET A CHARACTER OF THE MESSAGE 189 5394 23 INX H ;BUMP TEXT POINTER 190 5395 A7 ANA A ;TEST FOR END 191 5396 C8 RZ ;RETURN IF DONE 192 5397 E5 PUSH H ;SAVE POINTER TO TEXT 193 5398 4F MOV C,A ;OUTPUT CHARACTER IN C 194 5399 CD0C53 CALL COUT ;OUTPUT THE CHARACTER 195 539C E1 POP H ;RESTORE THE POINTER 196 539D C39353 JMP MESSAGE ;CONTINUE UNTIL NULL REACHED 197 198 ***************************************************************** 199 * * 200 * CBOOT IS THE COLD BOOT LOADER. ALL OF CP/M HAS BEEN LOADED IN * 201 * WHEN CONTROL IS PASSED HERE. * 202 * * 203 ***************************************************************** 204 205 53A0 310001 CBOOT LXI SP,TPA ;SET UP STACK 206 53A3 CD2157 CALL TINIT ;INITIALIZE THE TERMINAL 207 53A6 213653 LXI H,PROMPT ;PREP FOR SENDING SIGNON MESSAGE 208 53A9 CD9353 CALL MESSAGE ;SEND THE PROMPT 209 53AC AF XRA A ;SELECT DISK A 210 53AD 32BA58 STA CPMDRV 211 53B0 320400 STA CDISK 212 213 ***************************************************************** 214 * * 215 * GOCPM IS THE ENTRY POINT FROM COLD BOOTS, AND WARM BOOTS. IT * 216 * INITIALIZES SOME OF THE LOCATIONS IN PAGE 0, AND SETS UP THE * 217 * INITIAL DMA ADDRESS (80H). * 218 * * 219 ***************************************************************** 220 221 53B3 218000 GOCPM LXI H,BUFF ;SET UP INITIAL DMA ADDRESS 222 53B6 CD8A54 CALL SETDMA 223 53B9 3EC3 MVI A,(JMP) ;INITIALIZE JUMP TO WARM BOOT 224 53BB 320000 STA WBOT CP/M MACRO ASSEM 2.0 #005 *** Cbios For CP/M Ver. 2.2 *** 225 53BE 320500 STA ENTRY ;INITIALIZE JUMP TO BDOS 226 53C1 210353 LXI H,WBOOTE ;ADDRESS IN WARM BOOT JUMP 227 53C4 220100 SHLD WBOT+1 228 53C7 210645 LXI H,BDOS+6 ;ADDRESS IN BDOS JUMP 229 53CA 220600 SHLD ENTRY+1 230 53CD AF XRA A ;A <- 0 231 53CE 32BF58 STA BUFSEC ;DISK JOCKEY BUFFER EMPTY 232 53D1 32D555 STA BUFWRTN ;SET BUFFER NOT DIRTY FLAG 233 53D4 3A0400 LDA CDISK ;JUMP TO CP/M WITH CURRENTLY SELECTED DISK IN C 234 53D7 4F MOV C,A 235 53D8 11FB53 LXI D,CMNDBEG ;BEGINNING OF INITIAL COMMAND 236 53DB 21083D LXI H,CCP+8 ;COMMAND BUFFER 237 53DE 3E01 MVI A,CMNDEND-CMNDBEG+1 ;LENGTH OF COMMAND 238 53E0 32073D STA CCP+7 239 53E3 47 MOV B,A 240 53E4 CD3756 CALL MOVLOP 241 53E7 3AF953 LDA CWFLG 242 53EA A7 ANA A 243 53EB 3AFA53 LDA AUTOFLG 244 53EE CAF253 JZ CLDBOT 245 53F1 1F RAR 246 53F2 1F CLDBOT RAR 247 53F3 DA003D JC CCP 248 53F6 C3033D JMP CCP+3 ;ENTER CP/M 249 250 53F9 00 CWFLG DB 0 ;COLD/WARM BOOT FLAG 251 252 ***************************************************************** 253 * * 254 * THE FOLLOWING BYTE DETERMINES IF AN INITIAL COMMAND IS TO BE * 255 * GIVEN TO CP/M ON WARM OR COLD BOOTS. THE VALUE OF THE BYTE IS * 256 * USED TO GIVE THE COMMAND TO CP/M: * 257 * * 258 * 0 = NEVER GIVE COMMAND. * 259 * 1 = GIVE COMMAND ON COLD BOOTS ONLY. * 260 * 2 = GIVE THE COMMAND ON WARM BOOTS ONLY. * 261 * 3 = GIVE THE COMMAND ON WARM AND COLD BOOTS. * 262 * * 263 ***************************************************************** 264 265 53FA 01 AUTOFLG DB 1 ;AUTO COMMAND FEATURE 266 267 ***************************************************************** 268 * * 269 * IF THERE IS A COMMAND INSERTED HERE, IT WILL BE GIVEN IF THE * 270 * AUTO FEATURE IS ENABLED. * 271 * FOR EXAMPLE: * 272 * * 273 * CMNDBEG DB 'MBASIC MYPROG' * 274 * CMNDEND DB 0 * 275 * * 276 * WILL EXECUTE MICROSOFT BASIC, AND MBASIC WILL EXECUTE THE * 277 * "MYPROG" BASIC PROGRAM. * 278 * * 279 ***************************************************************** 280 CP/M MACRO ASSEM 2.0 #006 *** Cbios For CP/M Ver. 2.2 *** 281 CMNDBEG DB '' ;INITIAL COMMAND GOES HERE 282 53FB 00 CMNDEND DB 0 283 284 ***************************************************************** 285 * * 286 * WBOOT LOADS IN ALL OF CP/M EXCEPT THE CBIOS, THEN INITIALIZES * 287 * SYSTEM PARAMETERS AS IN COLD BOOT. SEE THE COLD BOOT LOADER * 288 * LISTING FOR EXACTLY WHAT HAPPENS DURING WARM AND COLD BOOTS. * 289 * * 290 ***************************************************************** 291 292 53FC 310001 WBOOT LXI SP,TPA ;SET UP STACK POINTER 293 53FF 3E01 MVI A,1 294 5400 = WFLG EQU $-1 ;TEST IF BEGINNING OR 295 5401 A7 ANA A ; ENDING A WARM BOOT 296 5402 3E01 MVI A,1 297 5404 320054 STA WFLG 298 5407 32F953 STA CWFLG ;SET COLD/WARM BOOT FLAG 299 540A CAB353 JZ GOCPM 300 540D AF XRA A 301 540E 320054 STA WFLG 302 5411 4F MOV C,A 303 5412 CD3353 CALL DJDRV ;SELECT DRIVE A 304 5415 0E00 MVI C,0 ;SELECT SINGLE DENSITY 305 5417 CD2DE4 CALL DJDEN 306 541A 0E00 MVI C,0 ;SELECT SIDE 0 307 541C CD30E4 CALL DJSIDE 308 541F 3E0F MVI A,15 ;INITIALIZE THE SECTOR TO READ 309 5421 323F54 STA NEWSEC 310 5424 21003C LXI H,CCP-100H ;AND THE DMA ADDRESS 311 5427 225E54 SHLD NEWDMA 312 542A CD3E54 CALL WARMLOD ;READ IN CP/M 313 542D 010042 LXI B,CCP+500H ;LOAD ADDRESS FOR REST OF WARM BOOT 314 5430 CD12E4 CALL DJDMA 315 5433 0E08 MVI C,8 316 5435 CD0FE4 CALL DJSEC 317 5438 CD7254 CALL WARMRD 318 543B C30342 JMP CCP+503H 319 320 543E 3E0F WARMLOD MVI A,15 ;PREVIOUS SECTOR 321 543F = NEWSEC EQU $-1 322 5440 3C INR A ;UPDATE THE PREVIOUS SECTOR 323 5441 3C INR A 324 5442 FE1B CPI 27 ;WAS IT THE LAST ? 325 5444 DA5654 JC NOWRAP 326 5447 D609 SUI 9 ;YES 327 5449 FE13 CPI 19 328 544B C8 RZ 329 544C 2A5E54 LHLD NEWDMA 330 544F 1180FB LXI D,-480H 331 5452 19 DAD D 332 5453 225E54 SHLD NEWDMA 333 5456 323F54 NOWRAP STA NEWSEC ;SAVE THE NEW SECTOR TO READ 334 5459 4F MOV C,A 335 545A CD0FE4 CALL DJSEC 336 545D 21003C LXI H,CCP-100H ;GET THE PREVIOUS DMA ADDRESS CP/M MACRO ASSEM 2.0 #007 *** Cbios For CP/M Ver. 2.2 *** 337 545E = NEWDMA EQU $-2 338 5460 110001 LXI D,100H ;UPDATE THE DMA ADDRESS 339 5463 19 DAD D 340 5464 225E54 SHLD NEWDMA ;SAVE THE DMA ADDRESS 341 5467 44 MOV B,H 342 5468 4D MOV C,L 343 5469 CD12E4 CALL DJDMA ;SET THE DMA ADDRESS 344 546C CD7254 CALL WARMRD 345 546F C33E54 JMP WARMLOD 346 347 5472 01000A WARMRD LXI B,RETRIES*100H+0;MAXIMUM # OF ERRORS 348 5475 C5 WRMREAD PUSH B 349 5476 CD0CE4 CALL DJTRK ;SET THE TRACK 350 5479 CD15E4 CALL DJREAD ;READ THE SECTOR 351 547C C1 POP B 352 547D D0 RNC ;CONTINUE IF SUCCESSFUL 353 547E 05 DCR B 354 547F C27554 JNZ WRMREAD ;KEEP TRYING 355 5482 C32AE4 JMP DJERR 356 357 ***************************************************************** 358 * * 359 * SETSEC JUST SAVES THE DESIRED SECTOR TO SEEK TO UNTIL AN * 360 * ACTUAL READ OR WRITE IS ATTEMPTED. * 361 * * 362 ***************************************************************** 363 364 5485 79 SETSEC MOV A,C ;SAVE THE SECTOR NUMBER 365 5486 32B958 STA CPMSEC ;CP/M SECTOR # 366 5489 C9 RET 367 368 ***************************************************************** 369 * * 370 * SETDMA SAVES THE DMA ADDRESS FOR THE DATA TRANSFER. * 371 * * 372 ***************************************************************** 373 374 548A 60 SETDMA MOV H,B ;HL <- BC 375 548B 69 MOV L,C 376 548C 22B555 SHLD CPMDMA ;CP/M DMA ADDRESS 377 548F C9 RET 378 379 ***************************************************************** 380 * * 381 * HOME IS TRANSLATED INTO A SEEK TO TRACK ZERO. * 382 * * 383 ***************************************************************** 384 385 5490 0E00 HOME MVI C,0 ;TRACK TO SEEK TO 386 387 ***************************************************************** 388 * * 389 * SETTRK SAVES THE TRACK # TO SEEK TO. NOTHING IS DONE AT THIS * 390 * POINT, EVERYTHING IS DEFFERED UNTIL A READ OR WRITE. * 391 * * 392 ***************************************************************** CP/M MACRO ASSEM 2.0 #008 *** Cbios For CP/M Ver. 2.2 *** 393 394 5492 79 SETTRK MOV A,C ;A <- TRACK # 395 5493 32BB58 STA CPMTRK ;CP/M TRACK # 396 5496 C9 RET 397 398 ***************************************************************** 399 * * 400 * SECTRAN TRANSLATES A LOGICAL SECTOR # INTO A PHYSICAL SECTOR * 401 * #. * 402 * * 403 ***************************************************************** 404 405 5497 03 SECTRAN INX B 406 5498 D5 PUSH D ;SAVE TABLE ADDRESS 407 5499 C5 PUSH B ;SAVE SECTOR # 408 549A CD4155 CALL GETDPB ;GET DPB ADDRESS INTO HL 409 549D 7E MOV A,M ;GET # OF CP/M SECTORS/TRACK 410 549E B7 ORA A ;CLEAR CARY 411 549F 1F RAR ;DIVIDE BY TWO 412 54A0 91 SUB C 413 54A1 F5 PUSH PSW ;SAVE ADJUSTED SECTOR 414 54A2 FAAE54 JM SIDETWO 415 54A5 F1 SIDEA POP PSW ;DISCARD ADJUSTED SECTOR 416 54A6 C1 POP B ;RESTORE SECTOR REQUESTED 417 54A7 D1 POP D ;RESTOR ADDRESS OF XLT TABLE 418 54A8 EB SIDEONE XCHG ;HL <- &(TRANSLATION TABLE) 419 54A9 09 DAD B ;BC = OFFSET INTO TABLE 420 54AA 6E MOV L,M ;HL <- PHYSICAL SECTOR 421 54AB 2600 MVI H,0 422 54AD C9 RET 423 424 54AE 010F00 SIDETWO LXI B,15 ;OFFSET TO SIDE BIT 425 54B1 09 DAD B 426 54B2 7E MOV A,M 427 54B3 E608 ANI 8 ;TEST FOR DOUBLE SIDED 428 54B5 CAA554 JZ SIDEA ;MEDIA IS ONLY SINGLE SIDED 429 54B8 F1 POP PSW ;RETRIEVE ADJUSTED SECTOR 430 54B9 C1 POP B 431 54BA 2F CMA ;MAKE SECTOR REQUEST POSITIVE 432 54BB 3C INR A 433 54BC 4F MOV C,A ;MAKE NEW SECTOR THE REQUESTED SECTOR 434 54BD D1 POP D 435 54BE CDA854 CALL SIDEONE 436 54C1 3E80 MVI A,80H ;SIDE TWO BIT 437 54C3 B5 ORA L ; AND SECTOR 438 54C4 6F MOV L,A 439 54C5 C9 RET 440 441 ***************************************************************** 442 * * 443 * SETDRV SELECTS THE NEXT DRIVE TO BE USED IN READ/WRITE * 444 * OPERATIONS. IF THE DRIVE HAS NEVER BEEN SELECTED BEFORE, A * 445 * PARAMETER TABLE IS CREATED WHICH CORRECTLY DESCRIBES THE * 446 * DISKETTE CURRENTLY IN THE DRIVE. DISKETTES CAN BE OF FOUR * 447 * DIFFERENT SECTOR SIZES: * 448 * 1) 128 BYTES SINGLE DENSITY. * CP/M MACRO ASSEM 2.0 #009 *** Cbios For CP/M Ver. 2.2 *** 449 * 2) 256 BYTES DOUBLE DENSITY. * 450 * 3) 512 BYTES DOUBLE DENSITY. * 451 * 4) 1024 BYTES DOUBLE DENSITY. * 452 * * 453 ***************************************************************** 454 455 54C6 79 SETDRV MOV A,C ;SAVE THE DRIVE # 456 54C7 32BA58 STA CPMDRV 457 54CA FE04 CPI MAXDISK ;CHECK FOR A VALID DRIVE # 458 54CC D23D55 JNC ZRET ;ILLEGAL DRIVE # 459 54CF 7B MOV A,E ;TEST IF DRIVE EVER LOGGED IN BEFORE 460 54D0 E601 ANI 1 461 54D2 C22455 JNZ SETDRV1 ;BIT 0 OF E = 0 -> NEVER SELECTED BEFORE 462 54D5 3E01 MVI A,1 ;SELECT SECTOR 1 OF TRACK 1 463 54D7 32BC58 STA TRUESEC 464 54DA 32BB58 STA CPMTRK 465 54DD CD2056 CALL FILL ;FLUSH BUFFER AND REFILL 466 54E0 DA3D55 JC ZRET ;TEST FOR ERROR RETURN 467 54E3 CD27E4 CALL DJSTAT ;GET STATUS ON CURRENT DRIVE 468 54E6 E60C ANI 0CH ;STRIP OFF UNWANTED BITS 469 54E8 F5 PUSH PSW ;USED TO SELECT A DPB 470 54E9 1F RAR 471 54EA 215A55 LXI H,XLTS ;TABLE OF XLT ADDRESSES 472 54ED 5F MOV E,A 473 54EE 1600 MVI D,0 474 54F0 19 DAD D 475 54F1 E5 PUSH H ;SAVE POINTER TO PROPER XLT 476 54F2 CD4155 CALL GETDPB ;GET DPH POINTER INTO DE 477 54F5 EB XCHG ; 478 54F6 D1 POP D 479 54F7 0602 MVI B,2 ;NUMBER OF BYTES TO MOVE 480 54F9 CD3756 CALL MOVLOP ;MOVE THE ADDRESS OF XLT 481 54FC 110800 LXI D,8 ;OFFSET TO DPB POINTER 482 54FF 19 DAD D ;HL <- &DPH.DPB 483 5500 E5 PUSH H 484 5501 2A07E0 LHLD ORIGIN+7 ;GET ADDRESS OF DJ TERMINAL OUT ROUTINE 485 5504 23 INX H ;BUMP TO LOOK AT ADDRESS OF 486 ; UART STATUS LOCATION 487 5505 7E MOV A,M 488 5506 EE03 XRI 3 ;ADJUST FOR PROPER REV DJ 489 5508 6F MOV L,A 490 5509 26E3 MVI H,(ORIGIN+300H)/100H 491 550B 7E MOV A,M 492 550C E608 ANI DBLSID ;CHECK DOUBLE SIDED BIT 493 550E 11F957 LXI D,DPB128S ;BASE FOR SINGLE SIDED DPB'S 494 5511 C21755 JNZ SIDEOK 495 5514 113958 LXI D,DPB128D ;BASE OF DOUBLE SIDED DPB'S 496 5517 EB SIDEOK XCHG ;HL <- DBP BASE, DE <- &DPH.DPB 497 5518 D1 POP D ;RESTORE DE (POINTER INTO DPH) 498 5519 F1 POP PSW ;OFFSET TO CORRECT DPB 499 551A 17 RAL 500 551B 17 RAL 501 551C 4F MOV C,A 502 551D 0600 MVI B,0 503 551F 09 DAD B 504 5520 EB XCHG ;PUT DPB ADDRESS IN DPH CP/M MACRO ASSEM 2.0 #010 *** Cbios For CP/M Ver. 2.2 *** 505 5521 73 MOV M,E 506 5522 23 INX H 507 5523 72 MOV M,D 508 5524 CD4155 SETDRV1 CALL GETDPB ;GET ADDRESS OF DPB IN HL 509 5527 010F00 LXI B,15 ;OFFSET TO SECTOR SIZE 510 552A 09 DAD B 511 552B 7E MOV A,M ;GET SECTOR SIZE 512 552C E607 ANI 7H 513 552E 326E55 STA SECSIZ 514 5531 7E MOV A,M 515 5532 1F RAR 516 5533 1F RAR 517 5534 1F RAR 518 5535 1F RAR 519 5536 E60F ANI 0FH 520 5538 32A455 STA SECPSEC 521 553B EB XCHG ;HL <- DPH 522 553C C9 RET 523 524 553D 210000 ZRET LXI H,0 ;SELDRV ERROR EXIT 525 5540 C9 RET 526 527 ***************************************************************** 528 * * 529 * GETDPB RETURNS HL POINTING TO THE DPB OF THE CURRENTLY * 530 * SELECTED DRIVE, DE POINTING TO DPH. * 531 * * 532 ***************************************************************** 533 534 5541 3ABA58 GETDPB LDA CPMDRV ;GET DRIVE # 535 5544 6F MOV L,A ;FORM OFFSET 536 5545 2600 MVI H,0 537 5547 29 DAD H 538 5548 29 DAD H 539 5549 29 DAD H 540 554A 29 DAD H 541 554B 117958 LXI D,DPZERO ;BASE OF DPH'S 542 554E 19 DAD D 543 554F E5 PUSH H ;SAVE ADDRESS OF DPH 544 5550 110A00 LXI D,10 ;OFFSET TO DPB 545 5553 19 DAD D 546 5554 7E MOV A,M ;GET LOW BYTE OF DPB ADDRESS 547 5555 23 INX H 548 5556 66 MOV H,M ;GET LOW BYTE OF DPB 549 5557 6F MOV L,A 550 5558 D1 POP D 551 5559 C9 RET 552 553 ***************************************************************** 554 * * 555 * XLTS IS A TABLE OF ADDRESS THAT POINT TO EACH OF THE XLT * 556 * TABLES FOR EACH SECTOR SIZE. * 557 * * 558 ***************************************************************** 559 560 555A 2B57 XLTS DW XLT128 ;XLT FOR 128 BYTE SECTORS CP/M MACRO ASSEM 2.0 #011 *** Cbios For CP/M Ver. 2.2 *** 561 555C 4657 DW XLT256 ;XLT FOR 256 BYTE SECTORS 562 555E 7B57 DW XLT512 ;XLT FOR 512 BYTE SECTORS 563 5560 B857 DW XLT124 ;XLT FOR 1024 BYTE SECTORS 564 565 ***************************************************************** 566 * * 567 * WRITE ROUTINE MOVES DATA FROM MEMORY INTO THE BUFFER. IF THE * 568 * DESIRED CP/M SECTOR IS NOT CONTAINED IN THE DISK BUFFER, THE * 569 * BUFFER IS FIRST FLUSHED TO THE DISK IF IT HAS EVER BEEN * 570 * WRITTEN INTO, THEN A READ IS PERFORMED INTO THE BUFFER TO GET * 571 * THE DESIRED SECTOR. ONCE THE CORRECT SECTOR IS IN MEMORY, THE * 572 * BUFFER WRITTEN INDICATOR IS SET, SO THE BUFFER WILL BE * 573 * FLUSHED, THEN THE DATA IS TRANSFERRED INTO THE BUFFER. * 574 * * 575 ***************************************************************** 576 577 5562 79 WRITE MOV A,C ;SAVE WRITE COMMAND TYPE 578 5563 32CC55 STA WRITTYP 579 5566 3E01 MVI A,1 ;SET WRITE COMMAND 580 5568 06 DB (MVI) OR (B*8) ;THIS "MVI B" INSTRUCTION CAUSES 581 ; THE FOLLOWING "XRA A" TO 582 ; BE SKIPPED OVER. 583 584 ***************************************************************** 585 * * 586 * READ ROUTINE TO BUFFER DATA FROM THE DISK. IF THE SECTOR * 587 * REQUESTED FROM CP/M IS IN THE BUFFER, THEN THE DATA IS SIMPLY * 588 * TRANSFERRED FROM THE BUFFER TO THE DESIRED DMA ADDRESS. IF * 589 * THE BUFFER DOES NOT CONTAIN THE DESIRED SECTOR, THE BUFFER IS * 590 * FLUSHED TO THE DISK IF IT HAS EVER BEEN WRITTEN INTO, THEN * 591 * FILLED WITH THE SECTOR FROM THE DISK THAT CONTAINS THE * 592 * DESIRED CP/M SECTOR. * 593 * * 594 ***************************************************************** 595 596 5569 AF READ XRA A ;SET THE COMMAND TYPE TO READ 597 556A 32B855 STA RDWR ;SAVE COMMAND TYPE 598 599 ***************************************************************** 600 * * 601 * REDWRT CALCULATES THE PHYSICAL SECTOR ON THE DISK THAT * 602 * CONTAINS THE DESIRED CP/M SECTOR, THEN CHECKS IF IT IS THE * 603 * SECTOR CURRENTLY IN THE BUFFER. IF NO MATCH IS MADE, THE * 604 * BUFFER IS FLUSHED IF NECESSARY AND THE CORRECT SECTOR READ * 605 * FROM THE DISK. * 606 * * 607 ***************************************************************** 608 609 556D 0600 REDWRT MVI B,0 ;THE 0 IS MODIFIED TO CONTAIN THE LOG2 610 556E = SECSIZ EQU $-1 ; OF THE PHYSICAL SECTOR SIZE/128 611 ; ON THE CURRENTLY SELECTED DISK. 612 556F 3AB958 LDA CPMSEC ;GET THE DESIRED CP/M SECTOR # 613 5572 F5 PUSH PSW ;TEMPORARY SAVE 614 5573 E680 ANI 80H ;SAVE ONLY THE SIDE BIT 615 5575 4F MOV C,A ;REMEMBER THE SIDE 616 5576 F1 POP PSW ;GET THE SECTOR BACK CP/M MACRO ASSEM 2.0 #012 *** Cbios For CP/M Ver. 2.2 *** 617 5577 E67F ANI 7FH ;FORGET THE SIDE BIT 618 5579 3D DCR A ;TEMPORARY ADJUSTMENT 619 557A 05 DIVLOOP DCR B ;UPDATE REPEAT COUNT 620 557B CA8355 JZ DIVDONE 621 557E B7 ORA A ;CLEAR THE CARY FLAG 622 557F 1F RAR ;DIVIDE THE CP/M SECTOR # BY THE SIZE 623 ; OF THE PHYSICAL SECTORS 624 5580 C37A55 JMP DIVLOOP ; 625 5583 3C DIVDONE INR A 626 5584 B1 ORA C ;RESTORE THE SIDE BIT 627 5585 32BC58 STA TRUESEC ;SAVE THE PHYSICAL SECTOR NUMBER 628 5588 21BA58 LXI H,CPMDRV ;POINTER TO DESIRED DRIVE,TRACK, AND SECTOR 629 558B 11BD58 LXI D,BUFDRV ;POINTER TO BUFFER DRIVE,TRACK, AND SECTOR 630 558E 0604 MVI B,4 ;COUNT LOOP 631 5590 05 DTSLOP DCR B ;TEST IF DONE WITH COMPARE 632 5591 CA9F55 JZ MOVE ;YES, MATCH. GO MOVE THE DATA 633 5594 1A LDAX D ;GET A BYTE TO COMPARE 634 5595 BE CMP M ;TEST FOR MATCH 635 5596 23 INX H ;BUMP POINTERS TO NEXT DATA ITEM 636 5597 13 INX D 637 5598 CA9055 JZ DTSLOP ;MATCH, CONTINUE TESTING 638 639 ***************************************************************** 640 * * 641 * DRIVE, TRACK, AND SECTOR DON'T MATCH, FLUSH THE BUFFER IF * 642 * NECESSARY AND THEN REFILL. * 643 * * 644 ***************************************************************** 645 646 559B CD2056 CALL FILL ;FILL THE BUFFER WITH CORRECT PHYSICAL SECTOR 647 559E D8 RC ;NO GOOD, RETURN WITH ERROR INDICATION 648 649 ***************************************************************** 650 * * 651 * MOVE HAS BEEN MODIFIED TO CAUSE EITHER A TRANSFER INTO OR OUT * 652 * THE BUFFER. * 653 * * 654 ***************************************************************** 655 656 559F 3AB958 MOVE LDA CPMSEC ;GET THE CP/M SECTOR TO TRANSFER 657 55A2 3D DCR A ;ADJUST TO PROPER SECTOR IN BUFFER 658 55A3 E600 ANI 0 ;STRIP OFF HIGH ORDERED BITS 659 55A4 = SECPSEC EQU $-1 ;THE 0 IS MODIFIED TO REPRESENT THE # OF 660 ; CP/M SECTORS PER PHYSICAL SECTORS 661 55A5 6F MOV L,A ;PUT INTO HL 662 55A6 2600 MVI H,0 663 55A8 29 DAD H ;FORM OFFSET INTO BUFFER 664 55A9 29 DAD H 665 55AA 29 DAD H 666 55AB 29 DAD H 667 55AC 29 DAD H 668 55AD 29 DAD H 669 55AE 29 DAD H 670 55AF 11C058 LXI D,BUFFER ;BEGINNING ADDRESS OF BUFFER 671 55B2 19 DAD D ;FORM BEGINNING ADDRESS OF SECTOR TO TRANSFER 672 55B3 EB XCHG ;DE = ADDRESS IN BUFFER CP/M MACRO ASSEM 2.0 #013 *** Cbios For CP/M Ver. 2.2 *** 673 55B4 210000 LXI H,0 ;GET DMA ADDRESS, THE 0 IS MODIFIED TO 674 ; CONTAIN THE DMA ADDRESS 675 55B5 = CPMDMA EQU $-2 676 55B7 3E00 MVI A,0 ;THE ZERO GETS MODIFIED TO CONTAIN 677 ; A ZERO IF A READ, OR A 1 IF WRITE 678 55B8 = RDWR EQU $-1 679 55B9 A7 ANA A ;TEST WHICH KIND OF OPERATION 680 55BA C2C255 JNZ INTO ;TRANSFER DATA INTO THE BUFFER 681 55BD CD3556 OUTOF CALL MOVER 682 55C0 AF XRA A 683 55C1 C9 RET 684 685 55C2 EB INTO XCHG ; 686 55C3 CD3556 CALL MOVER ;MOVE THE DATA, HL = DESTINATION 687 ; DE = SOURCE 688 55C6 3E01 MVI A,1 689 55C8 32D555 STA BUFWRTN ;SET BUFFER WRITTEN INTO FLAG 690 55CB 3E00 MVI A,0 ;CHECK FOR DIRECTORY WRITE 691 55CC = WRITTYP EQU $-1 692 55CD 3D DCR A 693 55CE 3E00 MVI A,0 694 55D0 32CC55 STA WRITTYP ;SET NO DIRECTORY WRITE 695 55D3 C0 RNZ ;NO ERROR EXIT 696 697 ***************************************************************** 698 * * 699 * FLUSH WRITES THE CONTENTS OF THE BUFFER OUT TO THE DISK IF * 700 * IT HAS EVER BEEN WRITTEN INTO. * 701 * * 702 ***************************************************************** 703 704 55D4 3E00 FLUSH MVI A,0 ;THE 0 IS MODIFIED TO REFLECT IF 705 ; THE BUFFER HAS BEEN WRITTEN INTO 706 55D5 = BUFWRTN EQU $-1 707 55D6 A7 ANA A ;TEST IF WRITTEN INTO 708 55D7 C8 RZ ;NOT WRITTEN, ALL DONE 709 55D8 2118E4 LXI H,DJWRITE ;WRITE OPERATION 710 711 ***************************************************************** 712 * * 713 * PREP PREPARES TO READ/WRITE THE DISK. RETRIES ARE ATTEMPTED. * 714 * UPON ENTRY, H&L MUST CONTAIN THE READ OR WRITE OPERATION * 715 * ADDRESS. * 716 * * 717 ***************************************************************** 718 719 55DB AF PREP XRA A ;RESET BUFFER WRITTEN FLAG 720 55DC 32D555 STA BUFWRTN 721 55DF 221256 SHLD RETRYOP ;SET UP THE READ/WRITE OPERATION 722 55E2 060A MVI B,RETRIES ;MAXIMUM NUMBER OF RETRIES TO ATTEMPT 723 55E4 C5 RETRYLP PUSH B ;SAVE THE RETRY COUNT 724 55E5 3ABD58 LDA BUFDRV ;GET DRIVE NUMBER INVOLVED IN THE OPERATION 725 55E8 4F MOV C,A 726 55E9 CD3353 CALL DJDRV ;SELECT THE DRIVE 727 55EC 3ABE58 LDA BUFTRK 728 55EF A7 ANA A ;TEST FOR TRACK ZERO CP/M MACRO ASSEM 2.0 #014 *** Cbios For CP/M Ver. 2.2 *** 729 55F0 4F MOV C,A 730 55F1 C5 PUSH B 731 55F2 CC09E4 CZ DJHOME ;HOME THE DRIVE IF TRACK 0 732 55F5 C1 POP B ;RESTORE TRACK # 733 55F6 CD0CE4 CALL DJTRK ;SEEK TO PROPER TRACK 734 55F9 3ABF58 LDA BUFSEC ;GET SECTOR INVOLVED IN OPERATION 735 55FC F5 PUSH PSW ;SAVE THE SECTOR # 736 55FD 07 RLC ;BIT 0 OF A EQUALS SIDE # 737 55FE E601 ANI 1 ;STRIP OFF UNNECESSARY BITS 738 5600 4F MOV C,A ;C <- SIDE # 739 5601 CD30E4 CALL DJSIDE ;SELECT THE SIDE 740 5604 F1 POP PSW ;A <- SECTOR # 741 5605 E67F ANI 7FH ;STRIP OFF SIDE BIT 742 5607 4F MOV C,A ;C <- SECTOR # 743 5608 CD0FE4 CALL DJSEC ;SET THE SECTOR TO TRANSFER 744 560B 01C058 LXI B,BUFFER ;SET THE DMA ADDRESS 745 560E CD12E4 CALL DJDMA 746 5611 CD15E4 CALL DJREAD ;THE READ OPERATION IS MODIFIED TO WRITE 747 5612 = RETRYOP EQU $-2 748 5614 C1 POP B ;RESTORE THE RETRY COUNTER 749 5615 3E00 MVI A,0 ;NO ERROR EXIT STATUS 750 5617 D0 RNC ;RETURN NO ERROR 751 5618 05 DCR B ;UPDATE THE RETRY COUNTER 752 5619 37 STC ;ASSUME RETRY COUNT EXPIRED 753 561A 3EFF MVI A,0FFH ;ERROR RETURN 754 561C C8 RZ 755 561D C3E455 JMP RETRYLP ;TRY AGAIN 756 757 ***************************************************************** 758 * * 759 * FILL FILLS THE BUFFER WITH A NEW SECTOR FROM THE DISK. * 760 * * 761 ***************************************************************** 762 763 5620 CDD455 FILL CALL FLUSH ;FLUSH BUFFER FIRST 764 5623 D8 RC ;CHECK FOR ERROR 765 5624 11BA58 LXI D,CPMDRV ;UPDATE THE DRIVE, TRACK, AND SECTOR 766 5627 21BD58 LXI H,BUFDRV 767 562A 0603 MVI B,3 ;NUMBER OF BYTES TO MOVE 768 562C CD3756 CALL MOVLOP ;COPY THE DATA 769 562F 2115E4 LXI H,DJREAD 770 5632 C3DB55 JMP PREP ;SELECT DRIVE, TRACK, AND SECTOR. 771 ; THEN READ THE BUFFER 772 773 ***************************************************************** 774 * * 775 * MOVER MOVES 128 BYTES OF DATA. SOURCE POINTER IN DE, DEST * 776 * POINTER IN HL. * 777 * * 778 ***************************************************************** 779 780 5635 0680 MOVER MVI B,128 ;LENGTH OF TRANSFER 781 5637 1A MOVLOP LDAX D ;GET A BTE OF SOURCE 782 5638 77 MOV M,A ;MOVE IT 783 5639 13 INX D ;BUMP POINTERS 784 563A 23 INX H CP/M MACRO ASSEM 2.0 #015 *** Cbios For CP/M Ver. 2.2 *** 785 563B 05 DCR B ;UPDATE COUNTER 786 563C C23756 JNZ MOVLOP ;CONTINUE MOVING UNTIL DONE 787 563F C9 RET 788 789 ***************************************************************** 790 * * 791 * TERMINAL DRIVER ROUTINES. IOBYTE IS INITIALIZED BY THE COLD * 792 * BOOT ROUTINE, TO MODIFY, CHANGE THE "INTIOBY" EQUATE. THE * 793 * I/O ROUTINES THAT FOLLOW ALL WORK EXACTLY THE SAME WAY. USING * 794 * IOBYTE, THEY OBTAIN THE ADDRESS TO JUMP TO IN ORDER TO EXECUTE* 795 * THE DESIRED FUNCTION. THERE IS A TABLE WITH FOUR ENTRIES FOR * 796 * EACH OF THE POSSIBLE ASSIGNMENTS FOR EACH DEVICE. TO MODIFY * 797 * THE I/O ROUTINES FOR A DIFFERENT I/O CONFIGURATION, JUST * 798 * CHANGE THE ENTRIES IN THE TABLES. * 799 * * 800 ***************************************************************** 801 802 E403 = CITTY EQU DJCIN ;INPUT FROM THE DISK JOCKEY 2D 803 E406 = COTTY EQU DJCOUT ;OUTPUT TO THE DISK JOCKEY 2D 804 805 ***************************************************************** 806 * * 807 * CONST: GET THE STATUS FOR THE CURRENTLY ASSIGNED CONSOLE * 808 * DEVICE. THE CONSOLE DEVICE CAN BE GOTTEN FROM IOBYTE, * 809 * THEN A JUMP TO THE CORRECT CONSOLE STATUS ROUTINE IS * 810 * PERFORMED. * 811 * * 812 ***************************************************************** 813 814 5640 21BA56 CONST LXI H,CSTBLE ;BEGINNING OF JUMP TABLE 815 5643 C35256 JMP CONIN1 ;SELECT CORRECT JUMP 816 817 ***************************************************************** 818 * * 819 * CSREADER: IF THE CONSOLE IS ASSIGNED TO THE READER THEN A * 820 * JUMP WILL BE MADE HERE, WHERE ANOTHER JUMP WILL * 821 * OCCUR TO THE CORRECT READER STATUS. * 822 * * 823 ***************************************************************** 824 825 5646 21C256 CSREADR LXI H,CSRTBLE ;BEGINNING OF READER STATUS TABLE 826 5649 C36F56 JMP READERA 827 828 ***************************************************************** 829 * * 830 * CONIN: TAKE THE CORRECT JUMP FOR THE CONSOLE INPUT ROUTINE. * 831 * THE JUMP IS BASED ON THE TWO LEAST SIGNIFICANT BITS OF * 832 * IOBYTE. * 833 * * 834 ***************************************************************** 835 836 564C CDD455 CONIN CALL FLUSH ;FLUSH THE DISK BUFFER 837 564F 219256 LXI H,CITBLE ;BEGINNING OF CHARACTER INPUT TABLE 838 839 * 840 * ENTRY AT CONIN1 WILL DECODE THE TWO LEAST SIGNIFICANT BITS CP/M MACRO ASSEM 2.0 #016 *** Cbios For CP/M Ver. 2.2 *** 841 * OF IOBYTE. THIS IS USED BY CONIN,CONOUT, AND CONST. 842 * 843 844 5652 3A0300 CONIN1 LDA IOBYTE 845 5655 17 RAL 846 847 * 848 * ENTRY AT SELDEV WILL FORM AN OFFSET INTO THE TABLE POINTED 849 * TO BY H&L AND THEN PICK UP THE ADDRESS AND JUMP THERE. 850 * 851 852 5656 E606 SELDEV ANI 6H ;STRIP OFF UNWANTED BITS 853 5658 1600 MVI D,0 ;FORM OFFSET 854 565A 5F MOV E,A 855 565B 19 DAD D ;ADD OFFSET 856 565C 7E MOV A,M ;PICK UP HIGH BYTE 857 565D 23 INX H 858 565E 66 MOV H,M ;PICK UP LOW BYTE 859 565F 6F MOV L,A ;FORM ADDRESS 860 5660 E9 PCHL ;GO THERE ! 861 862 ***************************************************************** 863 * * 864 * CONOUT: TAKE THE PROPER BRANCH ADDRESS BASED ON THE TWO LEAST * 865 * SIGNIFICANT BITS OF IOBYTE. * 866 * * 867 ***************************************************************** 868 869 5661 C5 CONOUT PUSH B ;SAVE THE CHARACTER 870 5662 CDD455 CALL FLUSH ;FLUSH THE DISK BUFFER 871 5665 C1 POP B ;RESTORE THE CHARACTER 872 5666 219A56 LXI H,COTBLE ;BEGINNING OF THE CHARACTER OUT TABLE 873 5669 C35256 JMP CONIN1 ;DO THE DECODE 874 875 ***************************************************************** 876 * * 877 * READER: SELECT THE CORRECT READER DEVICE FOR INPUT. THE * 878 * READER IS SELECTED FROM BITS 2 AND 3 OF IOBYTE. * 879 * * 880 ***************************************************************** 881 882 566C 21B256 READER LXI H,RTBLE ;BEGINNING OF READER INPUT TABLE 883 884 * 885 * ENTRY AT READERA WILL DECODE BITS 2 & 3 OF IOBYTE, USED 886 * BY CSREADER. 887 * 888 889 566F 3A0300 READERA LDA IOBYTE 890 891 * 892 * ENTRY AT READER1 WILL SHIFT THE BITS INTO POSITION, USED 893 * BY LIST AND PUNCH. 894 * 895 896 5672 1F READR1 RAR CP/M MACRO ASSEM 2.0 #017 *** Cbios For CP/M Ver. 2.2 *** 897 5673 C35656 JMP SELDEV 898 899 ***************************************************************** 900 * * 901 * PUNCH: SELECT THE CORRECT PUNCH DEVICE. THE SELECTION COMES * 902 * FROM BITS 4&5 OF IOBYTE. * 903 * * 904 ***************************************************************** 905 906 5676 21AA56 PUNCH LXI H,PTBLE ;BEGINNING OF PUNCH TABLE 907 5679 3A0300 LDA IOBYTE 908 909 * 910 * ENTRY AT PNCH1 ROTATES BITS A LITTLE MORE IN PREP FOR 911 * SELDEV, USED BY LIST. 912 * 913 914 567C 1F PNCH1 RAR 915 567D 1F RAR 916 567E C37256 JMP READR1 917 918 ***************************************************************** 919 * * 920 * LIST: SELECT A LIST DEVICE BASED ON BITS 6&7 OF IOBYTE * 921 * * 922 ***************************************************************** 923 924 5681 21A256 LIST LXI H,LTBLE ;BEGINNING OF THE LIST DEVICE ROUTINES 925 5684 3A0300 LIST1 LDA IOBYTE 926 5687 1F RAR 927 5688 1F RAR 928 5689 C37C56 JMP PNCH1 929 930 ***************************************************************** 931 * * 932 * LISTST: GET THE STATUS OF THE CURRENTLY ASSIGNED LIST DEVICE * 933 * * 934 ***************************************************************** 935 936 568C 21CA56 LISTST LXI H,LSTBLE ;BEGINNING OF THE LIST DEVICE STATUS 937 568F C38456 JMP LIST1 938 939 ***************************************************************** 940 * * 941 * IF CUSTOMIZING I/O ROUTINES IS BEING PERFORMED, THE TABLE * 942 * BELOW SHOULD BE MODIFIED TO REFLECT THE CHANGES. ALL I/O * 943 * DEVICES ARE DECODED OUT OF IOBYTE AND THE JUMP IS TAKEN FROM * 944 * THE FOLLOWING TABLES. * 945 * * 946 ***************************************************************** 947 948 * 949 * CONSOLE INPUT TABLE 950 * 951 952 5692 03E4 CITBLE DW CITTY ;INPUT FROM TTY (CURRENTLY ASSIGNED CP/M MACRO ASSEM 2.0 #018 *** Cbios For CP/M Ver. 2.2 *** 953 ; BY INTIOBY,INPUT FROM 2D) 954 5694 FC56 DW CICRT ;INPUT FROM CRT (CURRENTLY SWITCHBOARD 955 ; SERIAL PORT 1) 956 5696 6C56 DW READER ;INPUT FROM READER (DEPENDS ON READER 957 ; SELECTION) 958 5698 FC56 DW CIUC1 ;INPUT FROM USER CONSOLE 1 (CURRENTLY 959 ; SWITCHBOARD SERIAL PORT 1) 960 961 * 962 * CONSOLE OUTPUT TABLE 963 * 964 965 569A 06E4 COTBLE DW COTTY ;OUTPUT TO TTY (CURRENTLY ASSIGNED 966 ; BY INTIOBY,OUTPUT TO 2D) 967 569C D256 DW COCRT ;OUTPUT TO CRT (CURRENTLY SWITCHBOARD 968 ; SERIAL PORT 1) 969 569E 8156 DW LIST ;OUTPUT TO LIST DEVICE (DEPENDS ON 970 ; BITS 6&7 OF IOBYTE) 971 56A0 D256 DW COUC1 ;OUTPUT TO USER CONSOLE 1 (CURRENTLY 972 ; SWITCHBOARD SERIAL PORT 1) 973 974 * 975 * LIST DEVICE TABLE 976 * 977 978 56A2 06E4 LTBLE DW COTTY ;OUTPUT TO TTY (CURRENTLY ASSIGNED 979 ; BY INTIOBY,OUTPUT TO 2D) 980 56A4 D256 DW COCRT ;OUTPUT TO CRT (CURRENTLY SWITCHBOARD 981 ; SERIAL PORT 1) 982 56A6 D256 DW COLPT ;OUTPUT TO LINE PRINTER (CURRENTLY 983 ; SWITCHBOARD SERIAL PORT 1) 984 56A8 DD56 DW COUL1 ;OUTPUT TO USER LINE PRINTER 1 (CURRENTLY 985 ; SWITCHBOARD SERIAL PORT 1) 986 987 * 988 * PUNCH DEVICE TABLE 989 * 990 991 56AA 06E4 PTBLE DW COTTY ;OUTPUT TO THE TTY (CURRENTLY ASSIGNED 992 ; BY INTIOBY,OUTPUT TO 2D) 993 56AC D256 DW COPTP ;OUTPUT TO PAPER TAPE PUNCH (CURRENTLY 994 ; SWITCHBOARD SERIAL PORT 1) 995 56AE D256 DW COUP1 ;OUTPUT TO USER PUNCH 1 (CURRENTLY 996 ; SWITCHBOARD SERIAL PORT 1) 997 56B0 D256 DW COUP2 ;OUTPUT TO USER PUNCH 2 (CURRNTLLY 998 ; SWITCHBOARD SERIAL PORT 1) 999 1000 * 1001 * READER DEVICE INPUT TABLE 1002 * 1003 1004 56B2 03E4 RTBLE DW CITTY ;INPUT FROM TTY (CURRENTLY ASSIGNED 1005 ; BY INTIOBY, INPUT FROM 2D) 1006 56B4 FC56 DW CIPTR ;INPUT FROM PAPER TAPE READER (CURRENTLY 1007 ; SWITCHBOARD SERIAL PORT 1) 1008 56B6 FC56 DW CIUR1 ;INPUT FROM USER READER 1 (CURRENTLY CP/M MACRO ASSEM 2.0 #019 *** Cbios For CP/M Ver. 2.2 *** 1009 ; SWITCHBOARD SERIAL PORT 1) 1010 56B8 FC56 DW CIUR2 ;INPUT FROM USER READER 2 (CURRENTLY 1011 ; SWITCHBOARD SERIAL PORT 1) 1012 1013 * 1014 * CONSOLE STATUS TABLE 1015 * 1016 1017 56BA 0857 CSTBLE DW CSTTY ;STATUS OF TTY (CURRENTLY ASSIGNED 1018 ; BY INTIOBY, STSTUS FROM 2D) 1019 56BC 1057 DW CSCRT ;STATUS FROM CRT (CURRENTLY SWITCHBOARD 1020 ; SERIAL PORT 1) 1021 56BE 4656 DW CSREADR ;STATUS FROM READER (DEPENDS ON READER DEVICE ) 1022 56C0 1057 DW CSUC1 ;STATUS FROM USER CONSOLE 1 (CURRENTLY 1023 ; SWITCHBOARD SERIAL PORT 1) 1024 1025 * 1026 * STATUS FROM READER DEVICE 1027 * 1028 1029 56C2 0857 CSRTBLE DW CSTTY ;STATUS FROM TTY (CURRENTLY ASSIGNED 1030 ; BY INTIOBY, STATUS OF 2D) 1031 56C4 1057 DW CSPTR ;STATUS FROM PAPER TAPE READER (CURRENTLY 1032 ; SWITCHBOARD SERIAL PORT 1) 1033 56C6 1057 DW CSUR1 ;STATUS FROM USER READER 1 (CURRENTLY 1034 ; SWITCHBOARD SERIAL PORT 1) 1035 56C8 1057 DW CSUR2 ;STATUS OF USER READER 2 (CURRENTLY 1036 ; SWITCHBOARD SERIAL PORT 1) 1037 1038 * 1039 * STATUS FROM LIST DEVICE 1040 * 1041 1042 56CA 1E57 LSTBLE DW READY ;CONSOLE ALWAYS READY 1043 56CC 1E57 DW READY ;GET LIST STATUS 1044 56CE 1957 DW LSLPT 1045 56D0 1957 DW LSLPT 1046 1047 ***************************************************************** 1048 * * 1049 * THE FOLLOWING EQUATES SET OUTPUT DEVICE TO OUTPUT TO THE * 1050 * SWITCHBOARD SERIAL PORT 1. * 1051 * * 1052 ***************************************************************** 1053 1054 56D2 = COCRT EQU $ ;OUTPUT FROM CRT 1055 56D2 = COUC1 EQU $ ;OUTPUT FROM USER CONSOLE 1 1056 56D2 = COPTP EQU $ ;OUTPUT FROM PAPER TAPE PUNCH 1057 56D2 = COUP1 EQU $ ;OUTPUT FROM USER PUNCH 1 1058 56D2 = COUP2 EQU $ ;OUTPUT FROM USER PUNCH 2 1059 56D2 DB02 COLPT IN 2 ;OUTPUT FROM LINE PRINTER,GET STATUS 1060 56D4 E680 ANI 80H ;WAIT UNTIL OK TO SEND 1061 56D6 CAD256 JZ COLPT 1062 56D9 79 MOV A,C ;OUTPUT THE CHARACTER 1063 56DA D301 OUT 1 1064 56DC C9 RET CP/M MACRO ASSEM 2.0 #020 *** Cbios For CP/M Ver. 2.2 *** 1065 1066 ***************************************************************** 1067 * * 1068 * CUSTOM I/O PRINTER DRIVER FOR DIABLO PRINTER WITH 1200 BAUD * 1069 * ETX/ACK HANDSHAKE. * 1070 * * 1071 ***************************************************************** 1072 1073 56DD CDD256 COUL1 CALL COLPT ;OUTPUT THE CHARACTER 1074 56E0 3AFB56 LDA COUNT 1075 56E3 3D DCR A 1076 56E4 32FB56 STA COUNT 1077 56E7 C0 RNZ 1078 56E8 3E32 MVI A,50 1079 56EA 32FB56 STA COUNT 1080 56ED 0E03 MVI C,AETX 1081 56EF CDD256 CALL COLPT 1082 56F2 CDFC56 PWAIT CALL CIPTR 1083 56F5 FE06 CPI AACK 1084 56F7 C2F256 JNZ PWAIT 1085 56FA C9 RET 1086 1087 56FB 32 COUNT DB 50 1088 1089 ***************************************************************** 1090 * * 1091 * THE FOLLOWING EQUATES SET THE INPUT FROM THE DEVICES TO COME * 1092 * FROM THE SWITCHBOARD SERIAL PORT 1. * 1093 * * 1094 ***************************************************************** 1095 1096 56FC = CIUC1 EQU $ ;INPUT FROM USER CONSOLE 1 1097 56FC = CICRT EQU $ ;INPUT FROM CRT 1098 56FC = CIUR1 EQU $ ;INPUT FROM USER READER 1 1099 56FC = CIUR2 EQU $ ;INPUT FROM USER READER 2 1100 56FC DB02 CIPTR IN 2 ;INPUT FROM PAPER TAPE READER, GET STATUS 1101 56FE E640 ANI 40H ;WAIT FOR CHARACTER 1102 5700 CAFC56 JZ CIPTR 1103 5703 DB01 IN 1 1104 5705 E67F ANI 7FH ;STRIP OFF THE PARITY 1105 5707 C9 RET 1106 1107 ***************************************************************** 1108 * * 1109 * CONSOLE STATUS ROUTINES, TEST IF A CHARACTER HAS ARRIVED. * 1110 * * 1111 ***************************************************************** 1112 1113 5708 CD21E4 CSTTY CALL DJTSTAT ;STATUS FROM DISK JOCKEY 2D 1114 570B 3E00 STAT MVI A,0 ;PREP FOR ZERO RETURN 1115 570D C0 RNZ ;NOTHING FOUND 1116 570E 3D DCR A ;RETURN WITH 0FFH 1117 570F C9 RET 1118 1119 ***************************************************************** 1120 * * CP/M MACRO ASSEM 2.0 #021 *** Cbios For CP/M Ver. 2.2 *** 1121 * THE FOLLOWING EQUATES CAUSE THE DEVICES TO GET STATUS FROM * 1122 * THE SWITCHBOARD SERIAL PORT 1. * 1123 * * 1124 ***************************************************************** 1125 1126 5710 = CSUR1 EQU $ ;STATUS OF USER READER 1 1127 5710 = CSUR2 EQU $ ;STATUS OF USER READER 2 1128 5710 = CSPTR EQU $ ;STATUS OF PAPER TAPE READER 1129 5710 = CSUC1 EQU $ ;STATUS OF USER CONSOLE 1 1130 5710 DB02 CSCRT IN 2 ;STATUS FROM CRT, GET STATUS 1131 5712 E640 ANI 40H ;STRIP OF DATA READY BIT 1132 5714 EE40 XRI 40H ;MAKE CORRECT POLARITY 1133 5716 C30B57 JMP STAT ;RETURN PROPER INDICATION 1134 1135 ***************************************************************** 1136 * * 1137 * LIST DEVICE STATUS ROUTINES. * 1138 * * 1139 ***************************************************************** 1140 1141 5719 DB02 LSLPT IN 2 ;ALL OTHER DEVICES WAIT 1142 571B E680 ANI 80H 1143 571D C8 RZ 1144 571E 3EFF READY MVI A,0FFH 1145 5720 C9 RET 1146 1147 ***************************************************************** 1148 * * 1149 * TINIT CAN BE MODIFIED FOR DIFFERENT I/O SETUPS. * 1150 * * 1151 ***************************************************************** 1152 1153 5721 0E1A TINIT MVI C,CLEAR ;INITIALIZE THE TERMINAL ROUTINE 1154 5723 3E00 MVI A,INTIOBY ;INITIALIZE IOBYTE 1155 5725 320300 STA IOBYTE 1156 5728 C30C53 JMP COUT 1157 1158 ***************************************************************** 1159 * * 1160 * XLT TABLES (SECTOR SKEW TABLES) FOR CP/M 2.0. THESE TABLES * 1161 * DEFINE THE SECTOR TRANSLATION THAT OCCURS WHEN MAPPING CP/M * 1162 * SECTORS TO PHYSICAL SECTORS ON THE DISK. THERE IS ONE SKEW * 1163 * TABLE FOR EACH OF THE POSSIBLE SECTOR SIZES. CURRENTLY THE * 1164 * TABLES ARE LOCATED ON TRACK 0 SECTORS 6 AND 8. THEY ARE * 1165 * LOADED INTO MEMORY IN THE CBIOS RAM BY THE COLD BOOT ROUTINE. * 1166 * * 1167 ***************************************************************** 1168 1169 572B 00 XLT128 DB 0 1170 572C 01070D1319 DB 1,7,13,19,25 1171 5731 050B1117 DB 5,11,17,23 1172 5735 03090F15 DB 3,9,15,21 1173 5739 02080E141A DB 2,8,14,20,26 1174 573E 060C1218 DB 6,12,18,24 1175 5742 040A1016 DB 4,10,16,22 1176 CP/M MACRO ASSEM 2.0 #022 *** Cbios For CP/M Ver. 2.2 *** 1177 5746 00 XLT256 DB 0 1178 5747 0102131425 DB 1,2,19,20,37,38 1179 574D 0304151627 DB 3,4,21,22,39,40 1180 5753 0506171829 DB 5,6,23,24,41,42 1181 5759 0708191A2B DB 7,8,25,26,43,44 1182 575F 090A1B1C2D DB 9,10,27,28,45,46 1183 5765 0B0C1D1E2F DB 11,12,29,30,47,48 1184 576B 0D0E1F2031 DB 13,14,31,32,49,50 1185 5771 0F10212233 DB 15,16,33,34,51,52 1186 5777 11122324 DB 17,18,35,36 1187 1188 577B 00 XLT512 DB 0 1189 577C 0102030411 DB 1,2,3,4,17,18,19,20 1190 5784 2122232431 DB 33,34,35,36,49,50,51,52 1191 578C 0506070815 DB 5,6,7,8,21,22,23,24 1192 5794 2526272835 DB 37,38,39,40,53,54,55,56 1193 579C 090A0B0C19 DB 9,10,11,12,25,26,27,28 1194 57A4 292A2B2C39 DB 41,42,43,44,57,58,59,60 1195 57AC 0D0E0F101D DB 13,14,15,16,29,30,31,32 1196 57B4 2D2E2F30 DB 45,46,47,48 1197 1198 57B8 00 XLT124 DB 0 1199 57B9 0102030405 DB 1,2,3,4,5,6,7,8 1200 57C1 191A1B1C1D DB 25,26,27,28,29,30,31,32 1201 57C9 3132333435 DB 49,50,51,52,53,54,55,56 1202 57D1 090A0B0C0D DB 9,10,11,12,13,14,15,16 1203 57D9 2122232425 DB 33,34,35,36,37,38,39,40 1204 57E1 393A3B3C3D DB 57,58,59,60,61,62,63,64 1205 57E9 1112131415 DB 17,18,19,20,21,22,23,24 1206 57F1 292A2B2C2D DB 41,42,43,44,45,46,47,48 1207 1208 ***************************************************************** 1209 * * 1210 * EACH OF THE FOLLOWING TABLES DESCRIBES A DISKETTE WITH THE * 1211 * SPECIFIED CHARACTERISTICS. THE TABLES ARE CURRENTLY STORED * 1212 * ON TRACK 0 SECTOR 13. THEY ARE READ INTO MEMORY BY THE GOCPM * 1213 * ROUTINE IN THE CBIOS FOR CP/M VER 2.0. * 1214 * * 1215 ***************************************************************** 1216 1217 1218 ***************************************************************** 1219 * * 1220 * THE FOLLOWING DPB DEFINES A DISKETTE FOR 128 BYTE SECTORS, * 1221 * SINGLE DENSITY, AND SINGLE SIDED. * 1222 * * 1223 ***************************************************************** 1224 1225 57F9 1A00 DPB128S DW 26 ;CP/M SECTORS/TRACK 1226 57FB 03 DB 3 ;BSH 1227 57FC 07 DB 7 ;BLM 1228 57FD 00 DB 0 ;EXM 1229 57FE F200 DW 242 ;DSM 1230 5800 3F00 DW 63 ;DRM 1231 5802 C0 DB 0C0H ;AL0 1232 5803 00 DB 0 ;AL1 CP/M MACRO ASSEM 2.0 #023 *** Cbios For CP/M Ver. 2.2 *** 1233 5804 1000 DW 16 ;CKS 1234 5806 0200 DW 2 ;OFF 1235 5808 01 DB 1H ;16*((#CPM SECTORS/PHYSICAL SECTOR) -1) + 1236 ;LOG2(#BYTES PER SECTOR/128) + 1 + 1237 ;8 IF DOUBLE SIDED. 1238 1239 ***************************************************************** 1240 * * 1241 * THE FOLLOWING DPB DEFINES A DISKETTE FOR 256 BYTE SECTORS, * 1242 * DOUBLE DENSITY, AND SINGLE SIDED. * 1243 * * 1244 ***************************************************************** 1245 1246 5809 3400 DPB256S DW 52 ;CP/M SECTORS/TRACK 1247 580B 04 DB 4 ;BSH 1248 580C 0F DB 15 ;BLM 1249 580D 00 DB 0 ;EXM 1250 580E F200 DW 242 ;DSM 1251 5810 7F00 DW 127 ;DRM 1252 5812 C0 DB 0C0H ;AL0 1253 5813 00 DB 0 ;AL1 1254 5814 2000 DW 32 ;CKS 1255 5816 0200 DW 2 ;OFF 1256 5818 12 DB 12H ;16*((#CPM SECTORS/PHYSICAL SECTOR) -1) + 1257 ;LOG2(#BYTES PER SECTOR/128) + 1 + 1258 ;8 IF DOUBLE SIDED. 1259 1260 ***************************************************************** 1261 * * 1262 * THE FOLLOWING DPB DEFINES A DISKETTE AS 512 BYTE SECTORS, * 1263 * DOUBLE DENSITY, AND SINGLE SIDED. * 1264 * * 1265 ***************************************************************** 1266 1267 5819 3C00 DPB512S DW 60 ;CP/M SECTORS/TRACK 1268 581B 04 DB 4 ;BSH 1269 581C 0F DB 15 ;BLM 1270 581D 00 DB 0 ;EXM 1271 581E 1801 DW 280 ;DSM 1272 5820 7F00 DW 127 ;DRM 1273 5822 C0 DB 0C0H ;AL0 1274 5823 00 DB 0 ;AL1 1275 5824 2000 DW 32 ;CKS 1276 5826 0200 DW 2 ;OFF 1277 5828 33 DB 33H ;16*((#CPM SECTORS/PHYSICAL SECTOR) -1) + 1278 ;LOG2(#BYTES PER SECTOR/128) + 1 + 1279 ;8 IF DOUBLE SIDED. 1280 1281 ***************************************************************** 1282 * * 1283 * THE FOLLOWING DPB DEFINES A DISKETTE AS 1024 BYTE SECTORS, * 1284 * DOUBLE DENSITY, AND SINGLE SIDED. * 1285 * * 1286 ***************************************************************** 1287 1288 5829 4000 DP1024S DW 64 ;CP/M SECTORS/TRACK CP/M MACRO ASSEM 2.0 #024 *** Cbios For CP/M Ver. 2.2 *** 1289 582B 04 DB 4 ;BSH 1290 582C 0F DB 15 ;BLM 1291 582D 00 DB 0 ;EXM 1292 582E 2B01 DW 299 ;DSM 1293 5830 7F00 DW 127 ;DRM 1294 5832 C0 DB 0C0H ;AL0 1295 5833 00 DB 0 ;AL1 1296 5834 2000 DW 32 ;CKS 1297 5836 0200 DW 2 ;OFF 1298 5838 74 DB 74H ;16*((#CPM SECTORS/PHYSICAL SECTOR) -1) + 1299 ;LOG2(#BYTES PER SECTOR/128) + 1 + 1300 ;8 IF DOUBLE SIDED. 1301 1302 ***************************************************************** 1303 * * 1304 * THE FOLLOWING DPB DEFINES A DISKETTE FOR 128 BYTE SECTORS, * 1305 * SINGLE DENSITY, AND DOUBLE SIDED. * 1306 * * 1307 ***************************************************************** 1308 1309 5839 3400 DPB128D DW 52 ;CP/M SECTORS/TRACK 1310 583B 04 DB 4 ;BSH 1311 583C 0F DB 15 ;BLM 1312 583D 01 DB 1 ;EXM 1313 583E F200 DW 242 ;DSM 1314 5840 7F00 DW 127 ;DRM 1315 5842 C0 DB 0C0H ;AL0 1316 5843 00 DB 0 ;AL1 1317 5844 2000 DW 32 ;CKS 1318 5846 0200 DW 2 ;OFF 1319 5848 09 DB 9H 1320 1321 ***************************************************************** 1322 * * 1323 * THE FOLLOWING DPB DEFINES A DISKETTE AS 256 BYTE SECTORS, * 1324 * DOUBLE DENSITY, AND DOUBLE SIDED. * 1325 * * 1326 ***************************************************************** 1327 1328 5849 6800 DPB256D DW 104 ;CP/M SECTORS/TRACK 1329 584B 04 DB 4 ;BSH 1330 584C 0F DB 15 ;BLM 1331 584D 00 DB 0 ;EXM 1332 584E E601 DW 486 ;DSM 1333 5850 FF00 DW 255 ;DRM 1334 5852 F0 DB 0F0H ;AL0 1335 5853 00 DB 0 ;AL1 1336 5854 4000 DW 64 ;CKS 1337 5856 0200 DW 2 ;OFF 1338 5858 1A DB 1AH 1339 1340 ***************************************************************** 1341 * * 1342 * THE FOLLOWING DPB DEFINES A DISKETTE AS 512 BYTE SECTORS, * 1343 * DOUBLE DENSITY, AND DOUBLE SIDED. * 1344 * * CP/M MACRO ASSEM 2.0 #025 *** Cbios For CP/M Ver. 2.2 *** 1345 ***************************************************************** 1346 1347 5859 7800 DPB512D DW 120 ;CP/M SECTORS/TRACK 1348 585B 04 DB 4 ;BSH 1349 585C 0F DB 15 ;BLM 1350 585D 00 DB 0 ;EXM 1351 585E 3102 DW 561 ;DSM 1352 5860 FF00 DW 255 ;DRM 1353 5862 F0 DB 0F0H ;AL0 1354 5863 00 DB 0 ;AL1 1355 5864 4000 DW 64 ;CKS 1356 5866 0200 DW 2 ;OFF 1357 5868 3B DB 3BH 1358 1359 ***************************************************************** 1360 * * 1361 * THE FOLLOWING DPB DEFINES A DISKETTE AS 1024 BYTE SECTORS, * 1362 * DOUBLE DENSITY, AND DOUBLE SIDED. * 1363 * * 1364 ***************************************************************** 1365 1366 5869 8000 DP1024D DW 128 ;CP/M SECTORS/TRACK 1367 586B 04 DB 4 ;BSH 1368 586C 0F DB 15 ;BLM 1369 586D 00 DB 0 ;EXM 1370 586E 5702 DW 599 ;DSM 1371 5870 FF00 DW 255 ;DRM 1372 5872 F0 DB 0F0H ;AL0 1373 5873 00 DB 0 ;AL1 1374 5874 4000 DW 64 ;CKS 1375 5876 0200 DW 2 ;OFF 1376 5878 7C DB 7CH 1377 1378 ***************************************************************** 1379 * * 1380 * CP/M DISK PARAMETER HEADERS, UNITIALIZED. * 1381 * * 1382 ***************************************************************** 1383 1384 5879 0000 DPZERO DW 0 ;ADDRESS OF TRANSLATION TABLE (FILLED 1385 ; IN BY SETDRV) 1386 587B 0000000000 DW 0,0,0 ;USED BY BDOS 1387 5881 EC5E DW DIRBUF ;ADDRESS OF DIRECTORY BUFFER 1388 5883 0000 DW 0 ;ADDRESS OF DPB (FILLED IN BY SETDRV) 1389 5885 EC5D DW CSV0 ;DIRECTORY CHECK VECTOR 1390 5887 C05C DW ALV0 ;ALLOCATION VECTOR 1391 1392 5889 0000 DPONE DW 0 1393 588B 0000000000 DW 0,0,0 1394 5891 EC5E DW DIRBUF 1395 5893 0000 DW 0 1396 5895 2C5E DW CSV1 1397 5897 0B5D DW ALV1 1398 1399 5899 0000 DPTWO DW 0 1400 589B 0000000000 DW 0,0,0 CP/M MACRO ASSEM 2.0 #026 *** Cbios For CP/M Ver. 2.2 *** 1401 58A1 EC5E DW DIRBUF 1402 58A3 0000 DW 0 1403 58A5 6C5E DW CSV2 1404 58A7 565D DW ALV2 1405 1406 58A9 0000 DPTHRE DW 0 1407 58AB 0000000000 DW 0,0,0 1408 58B1 EC5E DW DIRBUF 1409 58B3 0000 DW 0 1410 58B5 AC5E DW CSV3 1411 58B7 A15D DW ALV3 1412 1413 ***************************************************************** 1414 * * 1415 * CBIOS RAM LOCATIONS THAT DON'T NEED INITIALIZATION. * 1416 * * 1417 ***************************************************************** 1418 1419 58B9 00 CPMSEC DB 0 ;CP/M SECTOR # 1420 58BA 00 CPMDRV DB 0 ;CP/M DRIVE # 1421 58BB 00 CPMTRK DB 0 ;CP/M TRACK # 1422 58BC 00 TRUESEC DB 0 ;DISK JOCKEY SECTOR THAT CONTAINS CP/M SECTOR 1423 58BD 00 BUFDRV DB 0 ;DRIVE THAT BUFFER BELONGS TO 1424 58BE 00 BUFTRK DB 0 ;TRACK THAT BUFFER BELONGS TO 1425 58BF 00 BUFSEC DB 0 ;SECTOR THAT BUFFER BELONGS TO 1426 58C0 BUFFER DS 1024 ;MAXIMUM SIZE BUFFER FOR 1K SECTORS 1427 1428 5CC0 ALV0 DS 75 ;ALLOCATION VECTOR FOR DRIVE A 1429 5D0B ALV1 DS 75 ;ALLOCATION VECTOR FOR DRIVE B 1430 5D56 ALV2 DS 75 ;ALLOCATION VECTOR FOR DRIVE C 1431 5DA1 ALV3 DS 75 ;ALLOCATION VECTOR FOR DRIVE D 1432 5DEC CSV0 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE A 1433 5E2C CSV1 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE B 1434 5E6C CSV2 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE C 1435 5EAC CSV3 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE D 1436 5EEC DIRBUF DS 128 ;DIRECTORY BUFFER 1437 1438 5F6C END CP/M MACRO ASSEM 2.0 #027 *** Cbios For CP/M Ver. 2.2 *** AACK 0006 113# 1083 ACR 000D 110# 153 163 179 AETX 0003 112# 1080 ALF 000A 111# 153 153 163 179 ALV0 5CC0 1390 1428# ALV1 5D0B 1397 1429# ALV2 5D56 1404 1430# ALV3 5DA1 1411 1431# AUTOFLG 53FA 243 265# BDOS 4500 92# 228 BIAS 1000 90# 91 BIOS 5300 93# 126 BUFDRV 58BD 629 724 766 1423# BUFF 0080 95# 221 BUFFER 58C0 567 568 569# 570 572# 572 573 586 587 588 589 589 603 604# 652 670 699 744 759 1426# BUFSEC 58BF 231 734 1425# BUFTRK 58BE 727 1424# BUFWRTN 55D5 232 689 706# 720 CBOOT 53A0 128 200# 205# CCP 3D00 29# 30# 31# 32# 33# 34# 35# 36# 37# 38# 91# 92 93 236 238 247 248 310 313 318 336 CDISK 0004 94# 211 233 CICRT 56FC 954 1097# CIPTR 56FC 1006 1082 1100# 1102 CITBLE 5692 837 952# CITTY E403 802# 952 1004 CIUC1 56FC 958 1096# CIUR1 56FC 1008 1098# CIUR2 56FC 1010 1099# CLDBOT 53F2 244 246# CLEAR 001A 114# 1153 CMNDBEG 53FB 235 237 273# 281# CMNDEND 53FB 237 274# 282# COCRT 56D2 967 980 1054# COLPT 56D2 982 1059# 1061 1073 1081 CONIN 564C 131 830# 836# 841 CONIN1 5652 815 840 844# 873 CONOUT 5661 132 841 864# 869# CONST 5640 130 807# 814# 841 COPTP 56D2 993 1056# COTBLE 569A 872 965# COTTY E406 803# 965 978 991 COUC1 56D2 971 1055# COUL1 56DD 984 1073# COUNT 56FB 1074 1076 1079 1087# COUP1 56D2 995 1057# COUP2 56D2 997 1058# COUT 530C 132# 194 1156 CPMDMA 55B5 376 675# CPMDRV 58BA 210 456 534 628 765 1420# CPMREV 0016 53# 157 159 CPMSEC 58B9 365 612 656 1419# CPMTRK 58BB 395 464 1421# CSCRT 5710 1019 1130# CP/M MACRO ASSEM 2.0 #028 *** Cbios For CP/M Ver. 2.2 *** CSPTR 5710 1031 1128# CSREADR 5646 825# 1021 CSRTBLE 56C2 825 1029# CSTBLE 56BA 814 1017# CSTTY 5708 1017 1029 1113# CSUC1 5710 1022 1129# CSUR1 5710 1033 1126# CSUR2 5710 1035 1127# CSV0 5DEC 1389 1432# CSV1 5E2C 1396 1433# CSV2 5E6C 1403 1434# CSV3 5EAC 1410 1435# CWFLG 53F9 241 250# 298 DBLSID 0008 116# 492 DIRBUF 5EEC 1387 1394 1401 1408 1436# DIVDONE 5583 620 625# DIVLOOP 557A 619# 624 DJCIN E403 66# 802 DJCOUT E406 67# 803 DJDEN E42D 78# 305 DJDMA E412 71# 314 343 745 DJDRV 5333 145# 303 726 DJERR E42A 77# 355 DJHOME E409 68# 731 DJRAM E400 65# 66 67 68 69 70 71 72 73 74 75 76 77 78 79 DJREAD E415 72# 350 746 769 DJSEC E40F 70# 316 335 743 DJSEL E41B 74# 145 DJSIDE E430 79# 307 739 DJSTAT E427 76# 467 DJTRK E40C 69# 349 733 DJTSTAT E421 75# 1113 DJWRITE E418 73# 709 DP1024D 5869 1366# DP1024S 5829 1288# DPB128D 5839 495 1309# DPB128S 57F9 493 1225# DPB256D 5849 1328# DPB256S 5809 1246# DPB512D 5859 1347# DPB512S 5819 1267# DPONE 5889 1392# DPTHRE 58A9 1406# DPTWO 5899 1399# DPZERO 5879 541 1384# DTSLOP 5590 631# 637 ENTRY 0005 100# 215 225 229 714 840# 848# 885# 892# 910# FILL 5620 465 646 759# 763# FLUSH 55D4 699# 704# 763 836 870 GETDPB 5541 408 476 508 529# 534# GOCPM 53B3 215# 221# 299 1212 HOME 5490 136 381# 385# INTIOBY 0000 97# 792 1154 INTO 55C2 381 400 567 570 570 573 590 651 680 685# 700 848 892 1165 1212 CP/M MACRO ASSEM 2.0 #029 *** Cbios For CP/M Ver. 2.2 *** IOBYTE 0003 98# 791 794# 808 832# 841 844 865 878 885 889 902 907 920 925 943 1155 LIST 5681 133 893 911 920# 920 924# 932 969 975# 1039 1137# LIST1 5684 925# 937 LISTST 568C 143 932# 936# LSLPT 5719 1044 1045 1141# LSTBLE 56CA 936 1042# LTBLE 56A2 924 978# MAXDISK 0004 115# 457 MESSAGE 5393 149 183 188# 196 208 MOVE 559F 632 651# 656# MOVER 5635 681 686 775# 780# MOVLOP 5637 240 480 768 781# 786 MSIZE 0018 89# 90 154 155 NEWDMA 545E 311 329 332 337# 340 NEWSEC 543F 309 321# 333 NOWRAP 5456 325 333# ORIGIN E000 58 64# 65 167 168 170 173 174 176 484 490 OUTOF 55BD 681# PNCH1 567C 910 914# 928 PREP 55DB 713# 719# 770 910 PROMPT 5336 153# 207 PTBLE 56AA 906 991# PUNCH 5676 134 893 901# 901 906# 988# PWAIT 56F2 1082# 1084 RDWR 55B8 597 678# READ 5569 141 360 390 443 570 586# 596# 604 713 714 1212 READER 566C 135 819 821 877# 877 878# 882# 956 1001# 1026 READERA 566F 826 885 889# READR1 5672 896# 916 READY 571E 1042 1043 1144# REDWRT 556D 601# 609# RETRIES 000A 109# 347 713 722 RETRYLP 55E4 723# 755 RETRYOP 5612 721 747# REVNUM 001F 52# 161 162 RTBLE 56B2 882 1004# SECPSEC 55A4 520 659# SECSIZ 556E 513 610# SECTRAN 5497 144 400# 405# SELDEV 5656 848 852# 897 911# SETDMA 548A 140 222 370# 374# SETDRV 54C6 137 443# 455# SETDRV1 5524 461 508# SETSEC 5485 139 359# 364# SETTRK 5492 138 389# 394# SIDEA 54A5 415# 428 SIDEOK 5517 494 496# SIDEONE 54A8 418# 435 SIDETWO 54AE 414 424# STAT 570B 1114# 1133 TINIT 5721 206 1149# 1153# TPA 0100 96# 205 292 CP/M MACRO ASSEM 2.0 #030 *** Cbios For CP/M Ver. 2.2 *** TRUESEC 58BC 463 627 1422# WARMLOD 543E 312 320# 345 WARMRD 5472 317 344 347# WBOOT 53FC 129 286# 292# WBOOTE 5303 129# 226 WBOT 0000 99# 224 227 WFLG 5400 294# 297 301 WRITE 5562 142 360 390 443 567# 577# 713 714 WRITTYP 55CC 578 691# 694 WRMREAD 5475 348# 354 XLT124 57B8 563 1198# XLT128 572B 560 1169# XLT256 5746 561 1177# XLT512 577B 562 1188# XLTS 555A 471 555# 560# ZRET 553D 458 466 524#