CP/M MACRO ASSEM 2.0 #001 *** Cbios For CP/M Ver. 2.2 *** ***************************************************************** * * * CBIOS FOR CP/M VER 2.2 FOR DISK JOCKEY 2D CONTROLLER (ALL * * REVS). HANDLES DISKETTES WITH SECTOR SIZES OF 128 BYTES * * SINGLE DENSITY, 256, 512, 1024 BYTES DOUBLE DENSITY. * * * * WRITTEN BY BOBBY DALE GIFFORD. * * 9/1/79 * * * * DISK MAP OF SECTORS USED BY COLD BOOT, WARM BOOT, FIRMWARE, * * AND CP/M: * * * * TRK 0 SEC 1 = FIRST SECTOR OF COLD BOOT. E700H * * 0 2 = COLD BOOT 256. 80H * * 0 3 = COLD BOOT 512. 80H * * 0 4 = COLD BOOT 1024. 80H * * 0 5 = WARM BOOT 256. 80H * * 0 6 = WARM BOOT 512. 80H * * 0 7 = WARM BOOT 1024. 80H * * 0 8 = COLD/WARM BOOT. 3200H * * 0 9 = FIRMWARE. E400H * * 0 10 = FIRMWARE+80H. E480H * * 0 11 = FIRMWARE+100H E500H * * 0 12 = FIRMWARE+180H. E580H * * 0 13 = FIRMWARE+200H. E600H * * 0 14 = FIRMWARE+280H. E680H * * 0 15 = FIRMWARE+300H. E700H * * 0 16 = FIRMWARE+380H. E780H * * 0 17 = CCP. 2D00H * * 0 10 = CCP+80H. 2D80H * * 0 12 = CCP+100H. 2E00H * * 0 14 = CCP+180H. 2E80H * * 0 16 = CCP+200H. 2F00H * * 0 18 = CCP+280H. 2F80H * * 0 20 = CCP+300H. 3000H * * 0 22 = CCP+380H. 3080H * * 0 24 = CCP+400H. 3100H * * 0 26 = CCP+480H. 3180H * * 1 = REST OF CP/M. 3200H-4FFFH * * * ***************************************************************** TITLE '*** Cbios For CP/M Ver. 2.2 ***' ***************************************************************** * * * THE FOLLOWING REVISION NUMBER IS IN REFERENCE TO THE CP/M * * 2.0 CBIOS. * * * ***************************************************************** 001F = REVNUM EQU 31 ;CBIOS REVISION NUMBER 0016 = CPMREV EQU 22 ;CP/M REVISION NUMBER ***************************************************************** * * CP/M MACRO ASSEM 2.0 #002 *** Cbios For CP/M Ver. 2.2 *** * THE FOLLOWING EQUATES RELATE THE THINKER TOYS 2D CONTROLLER. * * IF THE CONTROLLER IS NON STANDARD (0E000H) ONLY THE ORIGIN * * EQUATE NEED BE CHANGED. THIS VERSION OF THE CBIOS WILL WORK * * WITH 2D CONTROLLER BOARDS REV 0, 1, 3, 3.1, 4. * * * ***************************************************************** E000 = ORIGIN EQU 0E000H E400 = DJRAM EQU ORIGIN+400H ;DISK JOCKEY 2D RAM ADDRESS E403 = DJCIN EQU DJRAM+3H ;DISK JOCKEY 2D CHARACTER INPUT ROUTINE E406 = DJCOUT EQU DJRAM+6H ;DISK JOCKEY 2D CHARACTER OUTPUT ROUTINE E409 = DJHOME EQU DJRAM+9H ;DISK JOCKEY 2D TRACK ZERO SEEK E40C = DJTRK EQU DJRAM+0CH ;DISK JOCKEY 2D TRACK SEEK ROUTINE E40F = DJSEC EQU DJRAM+0FH ;DISK JOCKEY 2D SET SECTOR ROUTINE E412 = DJDMA EQU DJRAM+012H ;DISK JOCKEY 2D SET DMA ADDRESS E415 = DJREAD EQU DJRAM+15H ;DISK JOCKEY 2D READ ROUTINE E418 = DJWRITE EQU DJRAM+18H ;DISK JOCKEY 2D WRITE ROUTINE E41B = DJSEL EQU DJRAM+1BH ;DISK JOCKEY 2D SELECT DRIVE ROUTINE E421 = DJTSTAT EQU DJRAM+21H ;DISK JOCKEY 2D TERMINAL STATUS ROUTINE E427 = DJSTAT EQU DJRAM+27H ;DISK JOCKEY 2D STATUS ROUTINE E42A = DJERR EQU DJRAM+2AH ;DISK JOCKEY 2D ERROR, FLASH LED E42D = DJDEN EQU DJRAM+2DH ;DISK JOCKEY 2D SET DENSITY ROUTINE E430 = DJSIDE EQU DJRAM+30H ;DISK JOCKEY 2D SET SIDE ROUTINE ***************************************************************** * * * CP/M SYSTEM EQUATES. IF RECONFIGURATION OF THE CP/M SYSTEM * * IS BEING DONE, THE CHANGES CAN BE MADE TO THE FOLLOWING * * EQUATES. * * * ***************************************************************** 0018 = MSIZE EQU 24 ;MEMORY SIZE OF TARGET CP/M 1000 = BIAS EQU (MSIZE-20)*1024 ;MEMORY OFFSET FROM 20K SYSTEM 3D00 = CCP EQU 2D00H+BIAS ;CONSOLE COMMAND PROCESSOR 4500 = BDOS EQU CCP+800H ;BDOS ADDRESS 5300 = BIOS EQU CCP+1600H ;CBIOS ADDRESS 0004 = CDISK EQU 4 ;ADDRESS OF LAST LOGGED DISK 0080 = BUFF EQU 80H ;DEFAULT BUFFER ADDRESS 0100 = TPA EQU 100H ;TRANSIENT MEMORY 0000 = INTIOBY EQU 0 ;INITIAL IOBYTE 0003 = IOBYTE EQU 3 ;IOBYTE LOCATION 0000 = WBOT EQU 0 ;WARM BOOT JUMP ADDRESS 0005 = ENTRY EQU 5 ;BDOS ENTRY JUMP ADDRESS ***************************************************************** * * * THE FOLLOWING ARE INTERNAL CBIOS EQUATES. MOST ARE MISC. * * CONSTANTS. * * * ***************************************************************** 000A = RETRIES EQU 10 ;MAX RETRIES ON DISK I/O BEFORE ERROR 000D = ACR EQU 0DH ;A CARRIAGE RETURN 000A = ALF EQU 0AH ;A LINE FEED 0003 = AETX EQU 3 ;A ETX CHAR CP/M MACRO ASSEM 2.0 #003 *** Cbios For CP/M Ver. 2.2 *** 0006 = AACK EQU 6 ;A ACK CHAR 001A = CLEAR EQU 1AH ;CLEAR SCREEN CHAR ON ADM3 TERMINAL 0004 = MAXDISK EQU 4 ;MAXIMUM # OF DISK DRIVES 0008 = DBLSID EQU 8 ;SIDE BIT FROM CONTROLLER ***************************************************************** * * * THE JUMP TABLE BELOW MUST REMAIN IN THE SAME ORDER, THE * * ROUTINES MAY BE CHANGED, BUT THE FUNCTION EXECUTED MUST BE * * THE SAME. * * * ***************************************************************** 5300 ORG BIOS ;CBIOS STARTING ADDRESS 5300 C3A053 JMP CBOOT ;COLD BOOT ENTRY POINT 5303 C3FC53 WBOOTE JMP WBOOT ;WARM BOOT ENTRY POINT 5306 C34056 JMP CONST ;CONSOLE STATUS ROUTINE 5309 C34C56 JMP CONIN ;CONSOLE INPUT 530C C36156 COUT JMP CONOUT ;CONSOLE OUTPUT 530F C38156 JMP LIST ;LIST DEVICE OUTPUT 5312 C37656 JMP PUNCH ;PUNCH DEVICE OUTPUT 5315 C36C56 JMP READER ;READER DEVICE INPUT 5318 C39054 JMP HOME ;HOME DRIVE 531B C3C654 JMP SETDRV ;SELECT DISK 531E C39254 JMP SETTRK ;SET TRACK 5321 C38554 JMP SETSEC ;SET SECTOR 5324 C38A54 JMP SETDMA ;SET DMA ADDRESS 5327 C36955 JMP READ ;READ THE DISK 532A C36255 JMP WRITE ;WRITE THE DISK 532D C38C56 JMP LISTST ;LIST DEVICE STATUS 5330 C39754 JMP SECTRAN ;SECTOR TRANSLATION 5333 C31BE4 DJDRV JMP DJSEL ;HOOK FOR SINGLE.COM PROGRAM ***************************************************************** * * * SIGNON MESSAGE OUTPUT DURING COLD BOOT. * * * ***************************************************************** 5336 0D0A0A PROMPT DB ACR,ALF,ALF 5339 32 DB '0'+MSIZE/10 ;CP/M MEMORY SIZE 533A 34 DB '0'+(MSIZE MOD 10) 533B 4B2043502F DB 'K CP/M Vers. ' ;CP/M VERSION NUMBER 5348 32 DB CPMREV/10+'0' 5349 2E DB '.' 534A 32 DB (CPMREV MOD 10)+'0' 534B 2C20436269 DB ', Cbios rev ' 5357 332E DB REVNUM/10+'0','.' ;CBIOS REVISION NUMBER 5359 31 DB REVNUM MOD 10+'0' 535A 0D0A DB ACR,ALF 535C 466F722054 DB 'For Thinker Toys Disk Jockey 2D Controller ' 5387 402030 DB '@ 0' IF ORIGIN/4096 > 10 ;CONTROLLER ORIGIN (HEX) 538A 45 DB ORIGIN/4096+'A'-10 CP/M MACRO ASSEM 2.0 #004 *** Cbios For CP/M Ver. 2.2 *** ELSE DB ORIGIN/4096+'0' ENDIF IF (ORIGIN/256 AND 0FH) > 10 DB (ORIGIN/256 AND 0FH)+'A'-10 ELSE 538B 30 DB (ORIGIN/256 AND 0FH)+'0' ENDIF 538C 3030482E DB '00H.' 5390 0D0A00 DB ACR,ALF,0 ***************************************************************** * * * UTILITY ROUTINE TO OUTPUT THE MESSAGE POINTED AT BY H&L, * * TERMINATED WITH A NULL. * * * ***************************************************************** 5393 7E MESSAGE MOV A,M ;GET A CHARACTER OF THE MESSAGE 5394 23 INX H ;BUMP TEXT POINTER 5395 A7 ANA A ;TEST FOR END 5396 C8 RZ ;RETURN IF DONE 5397 E5 PUSH H ;SAVE POINTER TO TEXT 5398 4F MOV C,A ;OUTPUT CHARACTER IN C 5399 CD0C53 CALL COUT ;OUTPUT THE CHARACTER 539C E1 POP H ;RESTORE THE POINTER 539D C39353 JMP MESSAGE ;CONTINUE UNTIL NULL REACHED ***************************************************************** * * * CBOOT IS THE COLD BOOT LOADER. ALL OF CP/M HAS BEEN LOADED IN * * WHEN CONTROL IS PASSED HERE. * * * ***************************************************************** 53A0 310001 CBOOT LXI SP,TPA ;SET UP STACK 53A3 CD2157 CALL TINIT ;INITIALIZE THE TERMINAL 53A6 213653 LXI H,PROMPT ;PREP FOR SENDING SIGNON MESSAGE 53A9 CD9353 CALL MESSAGE ;SEND THE PROMPT 53AC AF XRA A ;SELECT DISK A 53AD 32BA58 STA CPMDRV 53B0 320400 STA CDISK ***************************************************************** * * * GOCPM IS THE ENTRY POINT FROM COLD BOOTS, AND WARM BOOTS. IT * * INITIALIZES SOME OF THE LOCATIONS IN PAGE 0, AND SETS UP THE * * INITIAL DMA ADDRESS (80H). * * * ***************************************************************** 53B3 218000 GOCPM LXI H,BUFF ;SET UP INITIAL DMA ADDRESS 53B6 CD8A54 CALL SETDMA 53B9 3EC3 MVI A,(JMP) ;INITIALIZE JUMP TO WARM BOOT 53BB 320000 STA WBOT CP/M MACRO ASSEM 2.0 #005 *** Cbios For CP/M Ver. 2.2 *** 53BE 320500 STA ENTRY ;INITIALIZE JUMP TO BDOS 53C1 210353 LXI H,WBOOTE ;ADDRESS IN WARM BOOT JUMP 53C4 220100 SHLD WBOT+1 53C7 210645 LXI H,BDOS+6 ;ADDRESS IN BDOS JUMP 53CA 220600 SHLD ENTRY+1 53CD AF XRA A ;A <- 0 53CE 32BF58 STA BUFSEC ;DISK JOCKEY BUFFER EMPTY 53D1 32D555 STA BUFWRTN ;SET BUFFER NOT DIRTY FLAG 53D4 3A0400 LDA CDISK ;JUMP TO CP/M WITH CURRENTLY SELECTED DISK IN C 53D7 4F MOV C,A 53D8 11FB53 LXI D,CMNDBEG ;BEGINNING OF INITIAL COMMAND 53DB 21083D LXI H,CCP+8 ;COMMAND BUFFER 53DE 3E01 MVI A,CMNDEND-CMNDBEG+1 ;LENGTH OF COMMAND 53E0 32073D STA CCP+7 53E3 47 MOV B,A 53E4 CD3756 CALL MOVLOP 53E7 3AF953 LDA CWFLG 53EA A7 ANA A 53EB 3AFA53 LDA AUTOFLG 53EE CAF253 JZ CLDBOT 53F1 1F RAR 53F2 1F CLDBOT RAR 53F3 DA003D JC CCP 53F6 C3033D JMP CCP+3 ;ENTER CP/M 53F9 00 CWFLG DB 0 ;COLD/WARM BOOT FLAG ***************************************************************** * * * THE FOLLOWING BYTE DETERMINES IF AN INITIAL COMMAND IS TO BE * * GIVEN TO CP/M ON WARM OR COLD BOOTS. THE VALUE OF THE BYTE IS * * USED TO GIVE THE COMMAND TO CP/M: * * * * 0 = NEVER GIVE COMMAND. * * 1 = GIVE COMMAND ON COLD BOOTS ONLY. * * 2 = GIVE THE COMMAND ON WARM BOOTS ONLY. * * 3 = GIVE THE COMMAND ON WARM AND COLD BOOTS. * * * ***************************************************************** 53FA 01 AUTOFLG DB 1 ;AUTO COMMAND FEATURE ***************************************************************** * * * IF THERE IS A COMMAND INSERTED HERE, IT WILL BE GIVEN IF THE * * AUTO FEATURE IS ENABLED. * * FOR EXAMPLE: * * * * CMNDBEG DB 'MBASIC MYPROG' * * CMNDEND DB 0 * * * * WILL EXECUTE MICROSOFT BASIC, AND MBASIC WILL EXECUTE THE * * "MYPROG" BASIC PROGRAM. * * * ***************************************************************** CP/M MACRO ASSEM 2.0 #006 *** Cbios For CP/M Ver. 2.2 *** CMNDBEG DB '' ;INITIAL COMMAND GOES HERE 53FB 00 CMNDEND DB 0 ***************************************************************** * * * WBOOT LOADS IN ALL OF CP/M EXCEPT THE CBIOS, THEN INITIALIZES * * SYSTEM PARAMETERS AS IN COLD BOOT. SEE THE COLD BOOT LOADER * * LISTING FOR EXACTLY WHAT HAPPENS DURING WARM AND COLD BOOTS. * * * ***************************************************************** 53FC 310001 WBOOT LXI SP,TPA ;SET UP STACK POINTER 53FF 3E01 MVI A,1 5400 = WFLG EQU $-1 ;TEST IF BEGINNING OR 5401 A7 ANA A ; ENDING A WARM BOOT 5402 3E01 MVI A,1 5404 320054 STA WFLG 5407 32F953 STA CWFLG ;SET COLD/WARM BOOT FLAG 540A CAB353 JZ GOCPM 540D AF XRA A 540E 320054 STA WFLG 5411 4F MOV C,A 5412 CD3353 CALL DJDRV ;SELECT DRIVE A 5415 0E00 MVI C,0 ;SELECT SINGLE DENSITY 5417 CD2DE4 CALL DJDEN 541A 0E00 MVI C,0 ;SELECT SIDE 0 541C CD30E4 CALL DJSIDE 541F 3E0F MVI A,15 ;INITIALIZE THE SECTOR TO READ 5421 323F54 STA NEWSEC 5424 21003C LXI H,CCP-100H ;AND THE DMA ADDRESS 5427 225E54 SHLD NEWDMA 542A CD3E54 CALL WARMLOD ;READ IN CP/M 542D 010042 LXI B,CCP+500H ;LOAD ADDRESS FOR REST OF WARM BOOT 5430 CD12E4 CALL DJDMA 5433 0E08 MVI C,8 5435 CD0FE4 CALL DJSEC 5438 CD7254 CALL WARMRD 543B C30342 JMP CCP+503H 543E 3E0F WARMLOD MVI A,15 ;PREVIOUS SECTOR 543F = NEWSEC EQU $-1 5440 3C INR A ;UPDATE THE PREVIOUS SECTOR 5441 3C INR A 5442 FE1B CPI 27 ;WAS IT THE LAST ? 5444 DA5654 JC NOWRAP 5447 D609 SUI 9 ;YES 5449 FE13 CPI 19 544B C8 RZ 544C 2A5E54 LHLD NEWDMA 544F 1180FB LXI D,-480H 5452 19 DAD D 5453 225E54 SHLD NEWDMA 5456 323F54 NOWRAP STA NEWSEC ;SAVE THE NEW SECTOR TO READ 5459 4F MOV C,A 545A CD0FE4 CALL DJSEC 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 *** 545E = NEWDMA EQU $-2 5460 110001 LXI D,100H ;UPDATE THE DMA ADDRESS 5463 19 DAD D 5464 225E54 SHLD NEWDMA ;SAVE THE DMA ADDRESS 5467 44 MOV B,H 5468 4D MOV C,L 5469 CD12E4 CALL DJDMA ;SET THE DMA ADDRESS 546C CD7254 CALL WARMRD 546F C33E54 JMP WARMLOD 5472 01000A WARMRD LXI B,RETRIES*100H+0;MAXIMUM # OF ERRORS 5475 C5 WRMREAD PUSH B 5476 CD0CE4 CALL DJTRK ;SET THE TRACK 5479 CD15E4 CALL DJREAD ;READ THE SECTOR 547C C1 POP B 547D D0 RNC ;CONTINUE IF SUCCESSFUL 547E 05 DCR B 547F C27554 JNZ WRMREAD ;KEEP TRYING 5482 C32AE4 JMP DJERR ***************************************************************** * * * SETSEC JUST SAVES THE DESIRED SECTOR TO SEEK TO UNTIL AN * * ACTUAL READ OR WRITE IS ATTEMPTED. * * * ***************************************************************** 5485 79 SETSEC MOV A,C ;SAVE THE SECTOR NUMBER 5486 32B958 STA CPMSEC ;CP/M SECTOR # 5489 C9 RET ***************************************************************** * * * SETDMA SAVES THE DMA ADDRESS FOR THE DATA TRANSFER. * * * ***************************************************************** 548A 60 SETDMA MOV H,B ;HL <- BC 548B 69 MOV L,C 548C 22B555 SHLD CPMDMA ;CP/M DMA ADDRESS 548F C9 RET ***************************************************************** * * * HOME IS TRANSLATED INTO A SEEK TO TRACK ZERO. * * * ***************************************************************** 5490 0E00 HOME MVI C,0 ;TRACK TO SEEK TO ***************************************************************** * * * SETTRK SAVES THE TRACK # TO SEEK TO. NOTHING IS DONE AT THIS * * POINT, EVERYTHING IS DEFFERED UNTIL A READ OR WRITE. * * * ***************************************************************** CP/M MACRO ASSEM 2.0 #008 *** Cbios For CP/M Ver. 2.2 *** 5492 79 SETTRK MOV A,C ;A <- TRACK # 5493 32BB58 STA CPMTRK ;CP/M TRACK # 5496 C9 RET ***************************************************************** * * * SECTRAN TRANSLATES A LOGICAL SECTOR # INTO A PHYSICAL SECTOR * * #. * * * ***************************************************************** 5497 03 SECTRAN INX B 5498 D5 PUSH D ;SAVE TABLE ADDRESS 5499 C5 PUSH B ;SAVE SECTOR # 549A CD4155 CALL GETDPB ;GET DPB ADDRESS INTO HL 549D 7E MOV A,M ;GET # OF CP/M SECTORS/TRACK 549E B7 ORA A ;CLEAR CARY 549F 1F RAR ;DIVIDE BY TWO 54A0 91 SUB C 54A1 F5 PUSH PSW ;SAVE ADJUSTED SECTOR 54A2 FAAE54 JM SIDETWO 54A5 F1 SIDEA POP PSW ;DISCARD ADJUSTED SECTOR 54A6 C1 POP B ;RESTORE SECTOR REQUESTED 54A7 D1 POP D ;RESTOR ADDRESS OF XLT TABLE 54A8 EB SIDEONE XCHG ;HL <- &(TRANSLATION TABLE) 54A9 09 DAD B ;BC = OFFSET INTO TABLE 54AA 6E MOV L,M ;HL <- PHYSICAL SECTOR 54AB 2600 MVI H,0 54AD C9 RET 54AE 010F00 SIDETWO LXI B,15 ;OFFSET TO SIDE BIT 54B1 09 DAD B 54B2 7E MOV A,M 54B3 E608 ANI 8 ;TEST FOR DOUBLE SIDED 54B5 CAA554 JZ SIDEA ;MEDIA IS ONLY SINGLE SIDED 54B8 F1 POP PSW ;RETRIEVE ADJUSTED SECTOR 54B9 C1 POP B 54BA 2F CMA ;MAKE SECTOR REQUEST POSITIVE 54BB 3C INR A 54BC 4F MOV C,A ;MAKE NEW SECTOR THE REQUESTED SECTOR 54BD D1 POP D 54BE CDA854 CALL SIDEONE 54C1 3E80 MVI A,80H ;SIDE TWO BIT 54C3 B5 ORA L ; AND SECTOR 54C4 6F MOV L,A 54C5 C9 RET ***************************************************************** * * * SETDRV SELECTS THE NEXT DRIVE TO BE USED IN READ/WRITE * * OPERATIONS. IF THE DRIVE HAS NEVER BEEN SELECTED BEFORE, A * * PARAMETER TABLE IS CREATED WHICH CORRECTLY DESCRIBES THE * * DISKETTE CURRENTLY IN THE DRIVE. DISKETTES CAN BE OF FOUR * * DIFFERENT SECTOR SIZES: * * 1) 128 BYTES SINGLE DENSITY. * CP/M MACRO ASSEM 2.0 #009 *** Cbios For CP/M Ver. 2.2 *** * 2) 256 BYTES DOUBLE DENSITY. * * 3) 512 BYTES DOUBLE DENSITY. * * 4) 1024 BYTES DOUBLE DENSITY. * * * ***************************************************************** 54C6 79 SETDRV MOV A,C ;SAVE THE DRIVE # 54C7 32BA58 STA CPMDRV 54CA FE04 CPI MAXDISK ;CHECK FOR A VALID DRIVE # 54CC D23D55 JNC ZRET ;ILLEGAL DRIVE # 54CF 7B MOV A,E ;TEST IF DRIVE EVER LOGGED IN BEFORE 54D0 E601 ANI 1 54D2 C22455 JNZ SETDRV1 ;BIT 0 OF E = 0 -> NEVER SELECTED BEFORE 54D5 3E01 MVI A,1 ;SELECT SECTOR 1 OF TRACK 1 54D7 32BC58 STA TRUESEC 54DA 32BB58 STA CPMTRK 54DD CD2056 CALL FILL ;FLUSH BUFFER AND REFILL 54E0 DA3D55 JC ZRET ;TEST FOR ERROR RETURN 54E3 CD27E4 CALL DJSTAT ;GET STATUS ON CURRENT DRIVE 54E6 E60C ANI 0CH ;STRIP OFF UNWANTED BITS 54E8 F5 PUSH PSW ;USED TO SELECT A DPB 54E9 1F RAR 54EA 215A55 LXI H,XLTS ;TABLE OF XLT ADDRESSES 54ED 5F MOV E,A 54EE 1600 MVI D,0 54F0 19 DAD D 54F1 E5 PUSH H ;SAVE POINTER TO PROPER XLT 54F2 CD4155 CALL GETDPB ;GET DPH POINTER INTO DE 54F5 EB XCHG ; 54F6 D1 POP D 54F7 0602 MVI B,2 ;NUMBER OF BYTES TO MOVE 54F9 CD3756 CALL MOVLOP ;MOVE THE ADDRESS OF XLT 54FC 110800 LXI D,8 ;OFFSET TO DPB POINTER 54FF 19 DAD D ;HL <- &DPH.DPB 5500 E5 PUSH H 5501 2A07E0 LHLD ORIGIN+7 ;GET ADDRESS OF DJ TERMINAL OUT ROUTINE 5504 23 INX H ;BUMP TO LOOK AT ADDRESS OF ; UART STATUS LOCATION 5505 7E MOV A,M 5506 EE03 XRI 3 ;ADJUST FOR PROPER REV DJ 5508 6F MOV L,A 5509 26E3 MVI H,(ORIGIN+300H)/100H 550B 7E MOV A,M 550C E608 ANI DBLSID ;CHECK DOUBLE SIDED BIT 550E 11F957 LXI D,DPB128S ;BASE FOR SINGLE SIDED DPB'S 5511 C21755 JNZ SIDEOK 5514 113958 LXI D,DPB128D ;BASE OF DOUBLE SIDED DPB'S 5517 EB SIDEOK XCHG ;HL <- DBP BASE, DE <- &DPH.DPB 5518 D1 POP D ;RESTORE DE (POINTER INTO DPH) 5519 F1 POP PSW ;OFFSET TO CORRECT DPB 551A 17 RAL 551B 17 RAL 551C 4F MOV C,A 551D 0600 MVI B,0 551F 09 DAD B 5520 EB XCHG ;PUT DPB ADDRESS IN DPH CP/M MACRO ASSEM 2.0 #010 *** Cbios For CP/M Ver. 2.2 *** 5521 73 MOV M,E 5522 23 INX H 5523 72 MOV M,D 5524 CD4155 SETDRV1 CALL GETDPB ;GET ADDRESS OF DPB IN HL 5527 010F00 LXI B,15 ;OFFSET TO SECTOR SIZE 552A 09 DAD B 552B 7E MOV A,M ;GET SECTOR SIZE 552C E607 ANI 7H 552E 326E55 STA SECSIZ 5531 7E MOV A,M 5532 1F RAR 5533 1F RAR 5534 1F RAR 5535 1F RAR 5536 E60F ANI 0FH 5538 32A455 STA SECPSEC 553B EB XCHG ;HL <- DPH 553C C9 RET 553D 210000 ZRET LXI H,0 ;SELDRV ERROR EXIT 5540 C9 RET ***************************************************************** * * * GETDPB RETURNS HL POINTING TO THE DPB OF THE CURRENTLY * * SELECTED DRIVE, DE POINTING TO DPH. * * * ***************************************************************** 5541 3ABA58 GETDPB LDA CPMDRV ;GET DRIVE # 5544 6F MOV L,A ;FORM OFFSET 5545 2600 MVI H,0 5547 29 DAD H 5548 29 DAD H 5549 29 DAD H 554A 29 DAD H 554B 117958 LXI D,DPZERO ;BASE OF DPH'S 554E 19 DAD D 554F E5 PUSH H ;SAVE ADDRESS OF DPH 5550 110A00 LXI D,10 ;OFFSET TO DPB 5553 19 DAD D 5554 7E MOV A,M ;GET LOW BYTE OF DPB ADDRESS 5555 23 INX H 5556 66 MOV H,M ;GET LOW BYTE OF DPB 5557 6F MOV L,A 5558 D1 POP D 5559 C9 RET ***************************************************************** * * * XLTS IS A TABLE OF ADDRESS THAT POINT TO EACH OF THE XLT * * TABLES FOR EACH SECTOR SIZE. * * * ***************************************************************** 555A 2B57 XLTS DW XLT128 ;XLT FOR 128 BYTE SECTORS CP/M MACRO ASSEM 2.0 #011 *** Cbios For CP/M Ver. 2.2 *** 555C 4657 DW XLT256 ;XLT FOR 256 BYTE SECTORS 555E 7B57 DW XLT512 ;XLT FOR 512 BYTE SECTORS 5560 B857 DW XLT124 ;XLT FOR 1024 BYTE SECTORS ***************************************************************** * * * WRITE ROUTINE MOVES DATA FROM MEMORY INTO THE BUFFER. IF THE * * DESIRED CP/M SECTOR IS NOT CONTAINED IN THE DISK BUFFER, THE * * BUFFER IS FIRST FLUSHED TO THE DISK IF IT HAS EVER BEEN * * WRITTEN INTO, THEN A READ IS PERFORMED INTO THE BUFFER TO GET * * THE DESIRED SECTOR. ONCE THE CORRECT SECTOR IS IN MEMORY, THE * * BUFFER WRITTEN INDICATOR IS SET, SO THE BUFFER WILL BE * * FLUSHED, THEN THE DATA IS TRANSFERRED INTO THE BUFFER. * * * ***************************************************************** 5562 79 WRITE MOV A,C ;SAVE WRITE COMMAND TYPE 5563 32CC55 STA WRITTYP 5566 3E01 MVI A,1 ;SET WRITE COMMAND 5568 06 DB (MVI) OR (B*8) ;THIS "MVI B" INSTRUCTION CAUSES ; THE FOLLOWING "XRA A" TO ; BE SKIPPED OVER. ***************************************************************** * * * READ ROUTINE TO BUFFER DATA FROM THE DISK. IF THE SECTOR * * REQUESTED FROM CP/M IS IN THE BUFFER, THEN THE DATA IS SIMPLY * * TRANSFERRED FROM THE BUFFER TO THE DESIRED DMA ADDRESS. IF * * THE BUFFER DOES NOT CONTAIN THE DESIRED SECTOR, THE BUFFER IS * * FLUSHED TO THE DISK IF IT HAS EVER BEEN WRITTEN INTO, THEN * * FILLED WITH THE SECTOR FROM THE DISK THAT CONTAINS THE * * DESIRED CP/M SECTOR. * * * ***************************************************************** 5569 AF READ XRA A ;SET THE COMMAND TYPE TO READ 556A 32B855 STA RDWR ;SAVE COMMAND TYPE ***************************************************************** * * * REDWRT CALCULATES THE PHYSICAL SECTOR ON THE DISK THAT * * CONTAINS THE DESIRED CP/M SECTOR, THEN CHECKS IF IT IS THE * * SECTOR CURRENTLY IN THE BUFFER. IF NO MATCH IS MADE, THE * * BUFFER IS FLUSHED IF NECESSARY AND THE CORRECT SECTOR READ * * FROM THE DISK. * * * ***************************************************************** 556D 0600 REDWRT MVI B,0 ;THE 0 IS MODIFIED TO CONTAIN THE LOG2 556E = SECSIZ EQU $-1 ; OF THE PHYSICAL SECTOR SIZE/128 ; ON THE CURRENTLY SELECTED DISK. 556F 3AB958 LDA CPMSEC ;GET THE DESIRED CP/M SECTOR # 5572 F5 PUSH PSW ;TEMPORARY SAVE 5573 E680 ANI 80H ;SAVE ONLY THE SIDE BIT 5575 4F MOV C,A ;REMEMBER THE SIDE 5576 F1 POP PSW ;GET THE SECTOR BACK CP/M MACRO ASSEM 2.0 #012 *** Cbios For CP/M Ver. 2.2 *** 5577 E67F ANI 7FH ;FORGET THE SIDE BIT 5579 3D DCR A ;TEMPORARY ADJUSTMENT 557A 05 DIVLOOP DCR B ;UPDATE REPEAT COUNT 557B CA8355 JZ DIVDONE 557E B7 ORA A ;CLEAR THE CARY FLAG 557F 1F RAR ;DIVIDE THE CP/M SECTOR # BY THE SIZE ; OF THE PHYSICAL SECTORS 5580 C37A55 JMP DIVLOOP ; 5583 3C DIVDONE INR A 5584 B1 ORA C ;RESTORE THE SIDE BIT 5585 32BC58 STA TRUESEC ;SAVE THE PHYSICAL SECTOR NUMBER 5588 21BA58 LXI H,CPMDRV ;POINTER TO DESIRED DRIVE,TRACK, AND SECTOR 558B 11BD58 LXI D,BUFDRV ;POINTER TO BUFFER DRIVE,TRACK, AND SECTOR 558E 0604 MVI B,4 ;COUNT LOOP 5590 05 DTSLOP DCR B ;TEST IF DONE WITH COMPARE 5591 CA9F55 JZ MOVE ;YES, MATCH. GO MOVE THE DATA 5594 1A LDAX D ;GET A BYTE TO COMPARE 5595 BE CMP M ;TEST FOR MATCH 5596 23 INX H ;BUMP POINTERS TO NEXT DATA ITEM 5597 13 INX D 5598 CA9055 JZ DTSLOP ;MATCH, CONTINUE TESTING ***************************************************************** * * * DRIVE, TRACK, AND SECTOR DON'T MATCH, FLUSH THE BUFFER IF * * NECESSARY AND THEN REFILL. * * * ***************************************************************** 559B CD2056 CALL FILL ;FILL THE BUFFER WITH CORRECT PHYSICAL SECTOR 559E D8 RC ;NO GOOD, RETURN WITH ERROR INDICATION ***************************************************************** * * * MOVE HAS BEEN MODIFIED TO CAUSE EITHER A TRANSFER INTO OR OUT * * THE BUFFER. * * * ***************************************************************** 559F 3AB958 MOVE LDA CPMSEC ;GET THE CP/M SECTOR TO TRANSFER 55A2 3D DCR A ;ADJUST TO PROPER SECTOR IN BUFFER 55A3 E600 ANI 0 ;STRIP OFF HIGH ORDERED BITS 55A4 = SECPSEC EQU $-1 ;THE 0 IS MODIFIED TO REPRESENT THE # OF ; CP/M SECTORS PER PHYSICAL SECTORS 55A5 6F MOV L,A ;PUT INTO HL 55A6 2600 MVI H,0 55A8 29 DAD H ;FORM OFFSET INTO BUFFER 55A9 29 DAD H 55AA 29 DAD H 55AB 29 DAD H 55AC 29 DAD H 55AD 29 DAD H 55AE 29 DAD H 55AF 11C058 LXI D,BUFFER ;BEGINNING ADDRESS OF BUFFER 55B2 19 DAD D ;FORM BEGINNING ADDRESS OF SECTOR TO TRANSFER 55B3 EB XCHG ;DE = ADDRESS IN BUFFER CP/M MACRO ASSEM 2.0 #013 *** Cbios For CP/M Ver. 2.2 *** 55B4 210000 LXI H,0 ;GET DMA ADDRESS, THE 0 IS MODIFIED TO ; CONTAIN THE DMA ADDRESS 55B5 = CPMDMA EQU $-2 55B7 3E00 MVI A,0 ;THE ZERO GETS MODIFIED TO CONTAIN ; A ZERO IF A READ, OR A 1 IF WRITE 55B8 = RDWR EQU $-1 55B9 A7 ANA A ;TEST WHICH KIND OF OPERATION 55BA C2C255 JNZ INTO ;TRANSFER DATA INTO THE BUFFER 55BD CD3556 OUTOF CALL MOVER 55C0 AF XRA A 55C1 C9 RET 55C2 EB INTO XCHG ; 55C3 CD3556 CALL MOVER ;MOVE THE DATA, HL = DESTINATION ; DE = SOURCE 55C6 3E01 MVI A,1 55C8 32D555 STA BUFWRTN ;SET BUFFER WRITTEN INTO FLAG 55CB 3E00 MVI A,0 ;CHECK FOR DIRECTORY WRITE 55CC = WRITTYP EQU $-1 55CD 3D DCR A 55CE 3E00 MVI A,0 55D0 32CC55 STA WRITTYP ;SET NO DIRECTORY WRITE 55D3 C0 RNZ ;NO ERROR EXIT ***************************************************************** * * * FLUSH WRITES THE CONTENTS OF THE BUFFER OUT TO THE DISK IF * * IT HAS EVER BEEN WRITTEN INTO. * * * ***************************************************************** 55D4 3E00 FLUSH MVI A,0 ;THE 0 IS MODIFIED TO REFLECT IF ; THE BUFFER HAS BEEN WRITTEN INTO 55D5 = BUFWRTN EQU $-1 55D6 A7 ANA A ;TEST IF WRITTEN INTO 55D7 C8 RZ ;NOT WRITTEN, ALL DONE 55D8 2118E4 LXI H,DJWRITE ;WRITE OPERATION ***************************************************************** * * * PREP PREPARES TO READ/WRITE THE DISK. RETRIES ARE ATTEMPTED. * * UPON ENTRY, H&L MUST CONTAIN THE READ OR WRITE OPERATION * * ADDRESS. * * * ***************************************************************** 55DB AF PREP XRA A ;RESET BUFFER WRITTEN FLAG 55DC 32D555 STA BUFWRTN 55DF 221256 SHLD RETRYOP ;SET UP THE READ/WRITE OPERATION 55E2 060A MVI B,RETRIES ;MAXIMUM NUMBER OF RETRIES TO ATTEMPT 55E4 C5 RETRYLP PUSH B ;SAVE THE RETRY COUNT 55E5 3ABD58 LDA BUFDRV ;GET DRIVE NUMBER INVOLVED IN THE OPERATION 55E8 4F MOV C,A 55E9 CD3353 CALL DJDRV ;SELECT THE DRIVE 55EC 3ABE58 LDA BUFTRK 55EF A7 ANA A ;TEST FOR TRACK ZERO CP/M MACRO ASSEM 2.0 #014 *** Cbios For CP/M Ver. 2.2 *** 55F0 4F MOV C,A 55F1 C5 PUSH B 55F2 CC09E4 CZ DJHOME ;HOME THE DRIVE IF TRACK 0 55F5 C1 POP B ;RESTORE TRACK # 55F6 CD0CE4 CALL DJTRK ;SEEK TO PROPER TRACK 55F9 3ABF58 LDA BUFSEC ;GET SECTOR INVOLVED IN OPERATION 55FC F5 PUSH PSW ;SAVE THE SECTOR # 55FD 07 RLC ;BIT 0 OF A EQUALS SIDE # 55FE E601 ANI 1 ;STRIP OFF UNNECESSARY BITS 5600 4F MOV C,A ;C <- SIDE # 5601 CD30E4 CALL DJSIDE ;SELECT THE SIDE 5604 F1 POP PSW ;A <- SECTOR # 5605 E67F ANI 7FH ;STRIP OFF SIDE BIT 5607 4F MOV C,A ;C <- SECTOR # 5608 CD0FE4 CALL DJSEC ;SET THE SECTOR TO TRANSFER 560B 01C058 LXI B,BUFFER ;SET THE DMA ADDRESS 560E CD12E4 CALL DJDMA 5611 CD15E4 CALL DJREAD ;THE READ OPERATION IS MODIFIED TO WRITE 5612 = RETRYOP EQU $-2 5614 C1 POP B ;RESTORE THE RETRY COUNTER 5615 3E00 MVI A,0 ;NO ERROR EXIT STATUS 5617 D0 RNC ;RETURN NO ERROR 5618 05 DCR B ;UPDATE THE RETRY COUNTER 5619 37 STC ;ASSUME RETRY COUNT EXPIRED 561A 3EFF MVI A,0FFH ;ERROR RETURN 561C C8 RZ 561D C3E455 JMP RETRYLP ;TRY AGAIN ***************************************************************** * * * FILL FILLS THE BUFFER WITH A NEW SECTOR FROM THE DISK. * * * ***************************************************************** 5620 CDD455 FILL CALL FLUSH ;FLUSH BUFFER FIRST 5623 D8 RC ;CHECK FOR ERROR 5624 11BA58 LXI D,CPMDRV ;UPDATE THE DRIVE, TRACK, AND SECTOR 5627 21BD58 LXI H,BUFDRV 562A 0603 MVI B,3 ;NUMBER OF BYTES TO MOVE 562C CD3756 CALL MOVLOP ;COPY THE DATA 562F 2115E4 LXI H,DJREAD 5632 C3DB55 JMP PREP ;SELECT DRIVE, TRACK, AND SECTOR. ; THEN READ THE BUFFER ***************************************************************** * * * MOVER MOVES 128 BYTES OF DATA. SOURCE POINTER IN DE, DEST * * POINTER IN HL. * * * ***************************************************************** 5635 0680 MOVER MVI B,128 ;LENGTH OF TRANSFER 5637 1A MOVLOP LDAX D ;GET A BTE OF SOURCE 5638 77 MOV M,A ;MOVE IT 5639 13 INX D ;BUMP POINTERS 563A 23 INX H CP/M MACRO ASSEM 2.0 #015 *** Cbios For CP/M Ver. 2.2 *** 563B 05 DCR B ;UPDATE COUNTER 563C C23756 JNZ MOVLOP ;CONTINUE MOVING UNTIL DONE 563F C9 RET ***************************************************************** * * * TERMINAL DRIVER ROUTINES. IOBYTE IS INITIALIZED BY THE COLD * * BOOT ROUTINE, TO MODIFY, CHANGE THE "INTIOBY" EQUATE. THE * * I/O ROUTINES THAT FOLLOW ALL WORK EXACTLY THE SAME WAY. USING * * IOBYTE, THEY OBTAIN THE ADDRESS TO JUMP TO IN ORDER TO EXECUTE* * THE DESIRED FUNCTION. THERE IS A TABLE WITH FOUR ENTRIES FOR * * EACH OF THE POSSIBLE ASSIGNMENTS FOR EACH DEVICE. TO MODIFY * * THE I/O ROUTINES FOR A DIFFERENT I/O CONFIGURATION, JUST * * CHANGE THE ENTRIES IN THE TABLES. * * * ***************************************************************** E403 = CITTY EQU DJCIN ;INPUT FROM THE DISK JOCKEY 2D E406 = COTTY EQU DJCOUT ;OUTPUT TO THE DISK JOCKEY 2D ***************************************************************** * * * CONST: GET THE STATUS FOR THE CURRENTLY ASSIGNED CONSOLE * * DEVICE. THE CONSOLE DEVICE CAN BE GOTTEN FROM IOBYTE, * * THEN A JUMP TO THE CORRECT CONSOLE STATUS ROUTINE IS * * PERFORMED. * * * ***************************************************************** 5640 21BA56 CONST LXI H,CSTBLE ;BEGINNING OF JUMP TABLE 5643 C35256 JMP CONIN1 ;SELECT CORRECT JUMP ***************************************************************** * * * CSREADER: IF THE CONSOLE IS ASSIGNED TO THE READER THEN A * * JUMP WILL BE MADE HERE, WHERE ANOTHER JUMP WILL * * OCCUR TO THE CORRECT READER STATUS. * * * ***************************************************************** 5646 21C256 CSREADR LXI H,CSRTBLE ;BEGINNING OF READER STATUS TABLE 5649 C36F56 JMP READERA ***************************************************************** * * * CONIN: TAKE THE CORRECT JUMP FOR THE CONSOLE INPUT ROUTINE. * * THE JUMP IS BASED ON THE TWO LEAST SIGNIFICANT BITS OF * * IOBYTE. * * * ***************************************************************** 564C CDD455 CONIN CALL FLUSH ;FLUSH THE DISK BUFFER 564F 219256 LXI H,CITBLE ;BEGINNING OF CHARACTER INPUT TABLE * * ENTRY AT CONIN1 WILL DECODE THE TWO LEAST SIGNIFICANT BITS CP/M MACRO ASSEM 2.0 #016 *** Cbios For CP/M Ver. 2.2 *** * OF IOBYTE. THIS IS USED BY CONIN,CONOUT, AND CONST. * 5652 3A0300 CONIN1 LDA IOBYTE 5655 17 RAL * * ENTRY AT SELDEV WILL FORM AN OFFSET INTO THE TABLE POINTED * TO BY H&L AND THEN PICK UP THE ADDRESS AND JUMP THERE. * 5656 E606 SELDEV ANI 6H ;STRIP OFF UNWANTED BITS 5658 1600 MVI D,0 ;FORM OFFSET 565A 5F MOV E,A 565B 19 DAD D ;ADD OFFSET 565C 7E MOV A,M ;PICK UP HIGH BYTE 565D 23 INX H 565E 66 MOV H,M ;PICK UP LOW BYTE 565F 6F MOV L,A ;FORM ADDRESS 5660 E9 PCHL ;GO THERE ! ***************************************************************** * * * CONOUT: TAKE THE PROPER BRANCH ADDRESS BASED ON THE TWO LEAST * * SIGNIFICANT BITS OF IOBYTE. * * * ***************************************************************** 5661 C5 CONOUT PUSH B ;SAVE THE CHARACTER 5662 CDD455 CALL FLUSH ;FLUSH THE DISK BUFFER 5665 C1 POP B ;RESTORE THE CHARACTER 5666 219A56 LXI H,COTBLE ;BEGINNING OF THE CHARACTER OUT TABLE 5669 C35256 JMP CONIN1 ;DO THE DECODE ***************************************************************** * * * READER: SELECT THE CORRECT READER DEVICE FOR INPUT. THE * * READER IS SELECTED FROM BITS 2 AND 3 OF IOBYTE. * * * ***************************************************************** 566C 21B256 READER LXI H,RTBLE ;BEGINNING OF READER INPUT TABLE * * ENTRY AT READERA WILL DECODE BITS 2 & 3 OF IOBYTE, USED * BY CSREADER. * 566F 3A0300 READERA LDA IOBYTE * * ENTRY AT READER1 WILL SHIFT THE BITS INTO POSITION, USED * BY LIST AND PUNCH. * 5672 1F READR1 RAR CP/M MACRO ASSEM 2.0 #017 *** Cbios For CP/M Ver. 2.2 *** 5673 C35656 JMP SELDEV ***************************************************************** * * * PUNCH: SELECT THE CORRECT PUNCH DEVICE. THE SELECTION COMES * * FROM BITS 4&5 OF IOBYTE. * * * ***************************************************************** 5676 21AA56 PUNCH LXI H,PTBLE ;BEGINNING OF PUNCH TABLE 5679 3A0300 LDA IOBYTE * * ENTRY AT PNCH1 ROTATES BITS A LITTLE MORE IN PREP FOR * SELDEV, USED BY LIST. * 567C 1F PNCH1 RAR 567D 1F RAR 567E C37256 JMP READR1 ***************************************************************** * * * LIST: SELECT A LIST DEVICE BASED ON BITS 6&7 OF IOBYTE * * * ***************************************************************** 5681 21A256 LIST LXI H,LTBLE ;BEGINNING OF THE LIST DEVICE ROUTINES 5684 3A0300 LIST1 LDA IOBYTE 5687 1F RAR 5688 1F RAR 5689 C37C56 JMP PNCH1 ***************************************************************** * * * LISTST: GET THE STATUS OF THE CURRENTLY ASSIGNED LIST DEVICE * * * ***************************************************************** 568C 21CA56 LISTST LXI H,LSTBLE ;BEGINNING OF THE LIST DEVICE STATUS 568F C38456 JMP LIST1 ***************************************************************** * * * IF CUSTOMIZING I/O ROUTINES IS BEING PERFORMED, THE TABLE * * BELOW SHOULD BE MODIFIED TO REFLECT THE CHANGES. ALL I/O * * DEVICES ARE DECODED OUT OF IOBYTE AND THE JUMP IS TAKEN FROM * * THE FOLLOWING TABLES. * * * ***************************************************************** * * CONSOLE INPUT TABLE * 5692 03E4 CITBLE DW CITTY ;INPUT FROM TTY (CURRENTLY ASSIGNED CP/M MACRO ASSEM 2.0 #018 *** Cbios For CP/M Ver. 2.2 *** ; BY INTIOBY,INPUT FROM 2D) 5694 FC56 DW CICRT ;INPUT FROM CRT (CURRENTLY SWITCHBOARD ; SERIAL PORT 1) 5696 6C56 DW READER ;INPUT FROM READER (DEPENDS ON READER ; SELECTION) 5698 FC56 DW CIUC1 ;INPUT FROM USER CONSOLE 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * CONSOLE OUTPUT TABLE * 569A 06E4 COTBLE DW COTTY ;OUTPUT TO TTY (CURRENTLY ASSIGNED ; BY INTIOBY,OUTPUT TO 2D) 569C D256 DW COCRT ;OUTPUT TO CRT (CURRENTLY SWITCHBOARD ; SERIAL PORT 1) 569E 8156 DW LIST ;OUTPUT TO LIST DEVICE (DEPENDS ON ; BITS 6&7 OF IOBYTE) 56A0 D256 DW COUC1 ;OUTPUT TO USER CONSOLE 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * LIST DEVICE TABLE * 56A2 06E4 LTBLE DW COTTY ;OUTPUT TO TTY (CURRENTLY ASSIGNED ; BY INTIOBY,OUTPUT TO 2D) 56A4 D256 DW COCRT ;OUTPUT TO CRT (CURRENTLY SWITCHBOARD ; SERIAL PORT 1) 56A6 D256 DW COLPT ;OUTPUT TO LINE PRINTER (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) 56A8 DD56 DW COUL1 ;OUTPUT TO USER LINE PRINTER 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * PUNCH DEVICE TABLE * 56AA 06E4 PTBLE DW COTTY ;OUTPUT TO THE TTY (CURRENTLY ASSIGNED ; BY INTIOBY,OUTPUT TO 2D) 56AC D256 DW COPTP ;OUTPUT TO PAPER TAPE PUNCH (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) 56AE D256 DW COUP1 ;OUTPUT TO USER PUNCH 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) 56B0 D256 DW COUP2 ;OUTPUT TO USER PUNCH 2 (CURRNTLLY ; SWITCHBOARD SERIAL PORT 1) * * READER DEVICE INPUT TABLE * 56B2 03E4 RTBLE DW CITTY ;INPUT FROM TTY (CURRENTLY ASSIGNED ; BY INTIOBY, INPUT FROM 2D) 56B4 FC56 DW CIPTR ;INPUT FROM PAPER TAPE READER (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) 56B6 FC56 DW CIUR1 ;INPUT FROM USER READER 1 (CURRENTLY CP/M MACRO ASSEM 2.0 #019 *** Cbios For CP/M Ver. 2.2 *** ; SWITCHBOARD SERIAL PORT 1) 56B8 FC56 DW CIUR2 ;INPUT FROM USER READER 2 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * CONSOLE STATUS TABLE * 56BA 0857 CSTBLE DW CSTTY ;STATUS OF TTY (CURRENTLY ASSIGNED ; BY INTIOBY, STSTUS FROM 2D) 56BC 1057 DW CSCRT ;STATUS FROM CRT (CURRENTLY SWITCHBOARD ; SERIAL PORT 1) 56BE 4656 DW CSREADR ;STATUS FROM READER (DEPENDS ON READER DEVICE ) 56C0 1057 DW CSUC1 ;STATUS FROM USER CONSOLE 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * STATUS FROM READER DEVICE * 56C2 0857 CSRTBLE DW CSTTY ;STATUS FROM TTY (CURRENTLY ASSIGNED ; BY INTIOBY, STATUS OF 2D) 56C4 1057 DW CSPTR ;STATUS FROM PAPER TAPE READER (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) 56C6 1057 DW CSUR1 ;STATUS FROM USER READER 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) 56C8 1057 DW CSUR2 ;STATUS OF USER READER 2 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * STATUS FROM LIST DEVICE * 56CA 1E57 LSTBLE DW READY ;CONSOLE ALWAYS READY 56CC 1E57 DW READY ;GET LIST STATUS 56CE 1957 DW LSLPT 56D0 1957 DW LSLPT ***************************************************************** * * * THE FOLLOWING EQUATES SET OUTPUT DEVICE TO OUTPUT TO THE * * SWITCHBOARD SERIAL PORT 1. * * * ***************************************************************** 56D2 = COCRT EQU $ ;OUTPUT FROM CRT 56D2 = COUC1 EQU $ ;OUTPUT FROM USER CONSOLE 1 56D2 = COPTP EQU $ ;OUTPUT FROM PAPER TAPE PUNCH 56D2 = COUP1 EQU $ ;OUTPUT FROM USER PUNCH 1 56D2 = COUP2 EQU $ ;OUTPUT FROM USER PUNCH 2 56D2 DB02 COLPT IN 2 ;OUTPUT FROM LINE PRINTER,GET STATUS 56D4 E680 ANI 80H ;WAIT UNTIL OK TO SEND 56D6 CAD256 JZ COLPT 56D9 79 MOV A,C ;OUTPUT THE CHARACTER 56DA D301 OUT 1 56DC C9 RET CP/M MACRO ASSEM 2.0 #020 *** Cbios For CP/M Ver. 2.2 *** ***************************************************************** * * * CUSTOM I/O PRINTER DRIVER FOR DIABLO PRINTER WITH 1200 BAUD * * ETX/ACK HANDSHAKE. * * * ***************************************************************** 56DD CDD256 COUL1 CALL COLPT ;OUTPUT THE CHARACTER 56E0 3AFB56 LDA COUNT 56E3 3D DCR A 56E4 32FB56 STA COUNT 56E7 C0 RNZ 56E8 3E32 MVI A,50 56EA 32FB56 STA COUNT 56ED 0E03 MVI C,AETX 56EF CDD256 CALL COLPT 56F2 CDFC56 PWAIT CALL CIPTR 56F5 FE06 CPI AACK 56F7 C2F256 JNZ PWAIT 56FA C9 RET 56FB 32 COUNT DB 50 ***************************************************************** * * * THE FOLLOWING EQUATES SET THE INPUT FROM THE DEVICES TO COME * * FROM THE SWITCHBOARD SERIAL PORT 1. * * * ***************************************************************** 56FC = CIUC1 EQU $ ;INPUT FROM USER CONSOLE 1 56FC = CICRT EQU $ ;INPUT FROM CRT 56FC = CIUR1 EQU $ ;INPUT FROM USER READER 1 56FC = CIUR2 EQU $ ;INPUT FROM USER READER 2 56FC DB02 CIPTR IN 2 ;INPUT FROM PAPER TAPE READER, GET STATUS 56FE E640 ANI 40H ;WAIT FOR CHARACTER 5700 CAFC56 JZ CIPTR 5703 DB01 IN 1 5705 E67F ANI 7FH ;STRIP OFF THE PARITY 5707 C9 RET ***************************************************************** * * * CONSOLE STATUS ROUTINES, TEST IF A CHARACTER HAS ARRIVED. * * * ***************************************************************** 5708 CD21E4 CSTTY CALL DJTSTAT ;STATUS FROM DISK JOCKEY 2D 570B 3E00 STAT MVI A,0 ;PREP FOR ZERO RETURN 570D C0 RNZ ;NOTHING FOUND 570E 3D DCR A ;RETURN WITH 0FFH 570F C9 RET ***************************************************************** * * CP/M MACRO ASSEM 2.0 #021 *** Cbios For CP/M Ver. 2.2 *** * THE FOLLOWING EQUATES CAUSE THE DEVICES TO GET STATUS FROM * * THE SWITCHBOARD SERIAL PORT 1. * * * ***************************************************************** 5710 = CSUR1 EQU $ ;STATUS OF USER READER 1 5710 = CSUR2 EQU $ ;STATUS OF USER READER 2 5710 = CSPTR EQU $ ;STATUS OF PAPER TAPE READER 5710 = CSUC1 EQU $ ;STATUS OF USER CONSOLE 1 5710 DB02 CSCRT IN 2 ;STATUS FROM CRT, GET STATUS 5712 E640 ANI 40H ;STRIP OF DATA READY BIT 5714 EE40 XRI 40H ;MAKE CORRECT POLARITY 5716 C30B57 JMP STAT ;RETURN PROPER INDICATION ***************************************************************** * * * LIST DEVICE STATUS ROUTINES. * * * ***************************************************************** 5719 DB02 LSLPT IN 2 ;ALL OTHER DEVICES WAIT 571B E680 ANI 80H 571D C8 RZ 571E 3EFF READY MVI A,0FFH 5720 C9 RET ***************************************************************** * * * TINIT CAN BE MODIFIED FOR DIFFERENT I/O SETUPS. * * * ***************************************************************** 5721 0E1A TINIT MVI C,CLEAR ;INITIALIZE THE TERMINAL ROUTINE 5723 3E00 MVI A,INTIOBY ;INITIALIZE IOBYTE 5725 320300 STA IOBYTE 5728 C30C53 JMP COUT ***************************************************************** * * * XLT TABLES (SECTOR SKEW TABLES) FOR CP/M 2.0. THESE TABLES * * DEFINE THE SECTOR TRANSLATION THAT OCCURS WHEN MAPPING CP/M * * SECTORS TO PHYSICAL SECTORS ON THE DISK. THERE IS ONE SKEW * * TABLE FOR EACH OF THE POSSIBLE SECTOR SIZES. CURRENTLY THE * * TABLES ARE LOCATED ON TRACK 0 SECTORS 6 AND 8. THEY ARE * * LOADED INTO MEMORY IN THE CBIOS RAM BY THE COLD BOOT ROUTINE. * * * ***************************************************************** 572B 00 XLT128 DB 0 572C 01070D1319 DB 1,7,13,19,25 5731 050B1117 DB 5,11,17,23 5735 03090F15 DB 3,9,15,21 5739 02080E141A DB 2,8,14,20,26 573E 060C1218 DB 6,12,18,24 5742 040A1016 DB 4,10,16,22 CP/M MACRO ASSEM 2.0 #022 *** Cbios For CP/M Ver. 2.2 *** 5746 00 XLT256 DB 0 5747 0102131425 DB 1,2,19,20,37,38 574D 0304151627 DB 3,4,21,22,39,40 5753 0506171829 DB 5,6,23,24,41,42 5759 0708191A2B DB 7,8,25,26,43,44 575F 090A1B1C2D DB 9,10,27,28,45,46 5765 0B0C1D1E2F DB 11,12,29,30,47,48 576B 0D0E1F2031 DB 13,14,31,32,49,50 5771 0F10212233 DB 15,16,33,34,51,52 5777 11122324 DB 17,18,35,36 577B 00 XLT512 DB 0 577C 0102030411 DB 1,2,3,4,17,18,19,20 5784 2122232431 DB 33,34,35,36,49,50,51,52 578C 0506070815 DB 5,6,7,8,21,22,23,24 5794 2526272835 DB 37,38,39,40,53,54,55,56 579C 090A0B0C19 DB 9,10,11,12,25,26,27,28 57A4 292A2B2C39 DB 41,42,43,44,57,58,59,60 57AC 0D0E0F101D DB 13,14,15,16,29,30,31,32 57B4 2D2E2F30 DB 45,46,47,48 57B8 00 XLT124 DB 0 57B9 0102030405 DB 1,2,3,4,5,6,7,8 57C1 191A1B1C1D DB 25,26,27,28,29,30,31,32 57C9 3132333435 DB 49,50,51,52,53,54,55,56 57D1 090A0B0C0D DB 9,10,11,12,13,14,15,16 57D9 2122232425 DB 33,34,35,36,37,38,39,40 57E1 393A3B3C3D DB 57,58,59,60,61,62,63,64 57E9 1112131415 DB 17,18,19,20,21,22,23,24 57F1 292A2B2C2D DB 41,42,43,44,45,46,47,48 ***************************************************************** * * * EACH OF THE FOLLOWING TABLES DESCRIBES A DISKETTE WITH THE * * SPECIFIED CHARACTERISTICS. THE TABLES ARE CURRENTLY STORED * * ON TRACK 0 SECTOR 13. THEY ARE READ INTO MEMORY BY THE GOCPM * * ROUTINE IN THE CBIOS FOR CP/M VER 2.0. * * * ***************************************************************** ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE FOR 128 BYTE SECTORS, * * SINGLE DENSITY, AND SINGLE SIDED. * * * ***************************************************************** 57F9 1A00 DPB128S DW 26 ;CP/M SECTORS/TRACK 57FB 03 DB 3 ;BSH 57FC 07 DB 7 ;BLM 57FD 00 DB 0 ;EXM 57FE F200 DW 242 ;DSM 5800 3F00 DW 63 ;DRM 5802 C0 DB 0C0H ;AL0 5803 00 DB 0 ;AL1 CP/M MACRO ASSEM 2.0 #023 *** Cbios For CP/M Ver. 2.2 *** 5804 1000 DW 16 ;CKS 5806 0200 DW 2 ;OFF 5808 01 DB 1H ;16*((#CPM SECTORS/PHYSICAL SECTOR) -1) + ;LOG2(#BYTES PER SECTOR/128) + 1 + ;8 IF DOUBLE SIDED. ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE FOR 256 BYTE SECTORS, * * DOUBLE DENSITY, AND SINGLE SIDED. * * * ***************************************************************** 5809 3400 DPB256S DW 52 ;CP/M SECTORS/TRACK 580B 04 DB 4 ;BSH 580C 0F DB 15 ;BLM 580D 00 DB 0 ;EXM 580E F200 DW 242 ;DSM 5810 7F00 DW 127 ;DRM 5812 C0 DB 0C0H ;AL0 5813 00 DB 0 ;AL1 5814 2000 DW 32 ;CKS 5816 0200 DW 2 ;OFF 5818 12 DB 12H ;16*((#CPM SECTORS/PHYSICAL SECTOR) -1) + ;LOG2(#BYTES PER SECTOR/128) + 1 + ;8 IF DOUBLE SIDED. ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 512 BYTE SECTORS, * * DOUBLE DENSITY, AND SINGLE SIDED. * * * ***************************************************************** 5819 3C00 DPB512S DW 60 ;CP/M SECTORS/TRACK 581B 04 DB 4 ;BSH 581C 0F DB 15 ;BLM 581D 00 DB 0 ;EXM 581E 1801 DW 280 ;DSM 5820 7F00 DW 127 ;DRM 5822 C0 DB 0C0H ;AL0 5823 00 DB 0 ;AL1 5824 2000 DW 32 ;CKS 5826 0200 DW 2 ;OFF 5828 33 DB 33H ;16*((#CPM SECTORS/PHYSICAL SECTOR) -1) + ;LOG2(#BYTES PER SECTOR/128) + 1 + ;8 IF DOUBLE SIDED. ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 1024 BYTE SECTORS, * * DOUBLE DENSITY, AND SINGLE SIDED. * * * ***************************************************************** 5829 4000 DP1024S DW 64 ;CP/M SECTORS/TRACK CP/M MACRO ASSEM 2.0 #024 *** Cbios For CP/M Ver. 2.2 *** 582B 04 DB 4 ;BSH 582C 0F DB 15 ;BLM 582D 00 DB 0 ;EXM 582E 2B01 DW 299 ;DSM 5830 7F00 DW 127 ;DRM 5832 C0 DB 0C0H ;AL0 5833 00 DB 0 ;AL1 5834 2000 DW 32 ;CKS 5836 0200 DW 2 ;OFF 5838 74 DB 74H ;16*((#CPM SECTORS/PHYSICAL SECTOR) -1) + ;LOG2(#BYTES PER SECTOR/128) + 1 + ;8 IF DOUBLE SIDED. ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE FOR 128 BYTE SECTORS, * * SINGLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** 5839 3400 DPB128D DW 52 ;CP/M SECTORS/TRACK 583B 04 DB 4 ;BSH 583C 0F DB 15 ;BLM 583D 01 DB 1 ;EXM 583E F200 DW 242 ;DSM 5840 7F00 DW 127 ;DRM 5842 C0 DB 0C0H ;AL0 5843 00 DB 0 ;AL1 5844 2000 DW 32 ;CKS 5846 0200 DW 2 ;OFF 5848 09 DB 9H ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 256 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** 5849 6800 DPB256D DW 104 ;CP/M SECTORS/TRACK 584B 04 DB 4 ;BSH 584C 0F DB 15 ;BLM 584D 00 DB 0 ;EXM 584E E601 DW 486 ;DSM 5850 FF00 DW 255 ;DRM 5852 F0 DB 0F0H ;AL0 5853 00 DB 0 ;AL1 5854 4000 DW 64 ;CKS 5856 0200 DW 2 ;OFF 5858 1A DB 1AH ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 512 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * CP/M MACRO ASSEM 2.0 #025 *** Cbios For CP/M Ver. 2.2 *** ***************************************************************** 5859 7800 DPB512D DW 120 ;CP/M SECTORS/TRACK 585B 04 DB 4 ;BSH 585C 0F DB 15 ;BLM 585D 00 DB 0 ;EXM 585E 3102 DW 561 ;DSM 5860 FF00 DW 255 ;DRM 5862 F0 DB 0F0H ;AL0 5863 00 DB 0 ;AL1 5864 4000 DW 64 ;CKS 5866 0200 DW 2 ;OFF 5868 3B DB 3BH ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 1024 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** 5869 8000 DP1024D DW 128 ;CP/M SECTORS/TRACK 586B 04 DB 4 ;BSH 586C 0F DB 15 ;BLM 586D 00 DB 0 ;EXM 586E 5702 DW 599 ;DSM 5870 FF00 DW 255 ;DRM 5872 F0 DB 0F0H ;AL0 5873 00 DB 0 ;AL1 5874 4000 DW 64 ;CKS 5876 0200 DW 2 ;OFF 5878 7C DB 7CH ***************************************************************** * * * CP/M DISK PARAMETER HEADERS, UNITIALIZED. * * * ***************************************************************** 5879 0000 DPZERO DW 0 ;ADDRESS OF TRANSLATION TABLE (FILLED ; IN BY SETDRV) 587B 0000000000 DW 0,0,0 ;USED BY BDOS 5881 EC5E DW DIRBUF ;ADDRESS OF DIRECTORY BUFFER 5883 0000 DW 0 ;ADDRESS OF DPB (FILLED IN BY SETDRV) 5885 EC5D DW CSV0 ;DIRECTORY CHECK VECTOR 5887 C05C DW ALV0 ;ALLOCATION VECTOR 5889 0000 DPONE DW 0 588B 0000000000 DW 0,0,0 5891 EC5E DW DIRBUF 5893 0000 DW 0 5895 2C5E DW CSV1 5897 0B5D DW ALV1 5899 0000 DPTWO DW 0 589B 0000000000 DW 0,0,0 CP/M MACRO ASSEM 2.0 #026 *** Cbios For CP/M Ver. 2.2 *** 58A1 EC5E DW DIRBUF 58A3 0000 DW 0 58A5 6C5E DW CSV2 58A7 565D DW ALV2 58A9 0000 DPTHRE DW 0 58AB 0000000000 DW 0,0,0 58B1 EC5E DW DIRBUF 58B3 0000 DW 0 58B5 AC5E DW CSV3 58B7 A15D DW ALV3 ***************************************************************** * * * CBIOS RAM LOCATIONS THAT DON'T NEED INITIALIZATION. * * * ***************************************************************** 58B9 00 CPMSEC DB 0 ;CP/M SECTOR # 58BA 00 CPMDRV DB 0 ;CP/M DRIVE # 58BB 00 CPMTRK DB 0 ;CP/M TRACK # 58BC 00 TRUESEC DB 0 ;DISK JOCKEY SECTOR THAT CONTAINS CP/M SECTOR 58BD 00 BUFDRV DB 0 ;DRIVE THAT BUFFER BELONGS TO 58BE 00 BUFTRK DB 0 ;TRACK THAT BUFFER BELONGS TO 58BF 00 BUFSEC DB 0 ;SECTOR THAT BUFFER BELONGS TO 58C0 BUFFER DS 1024 ;MAXIMUM SIZE BUFFER FOR 1K SECTORS 5CC0 ALV0 DS 75 ;ALLOCATION VECTOR FOR DRIVE A 5D0B ALV1 DS 75 ;ALLOCATION VECTOR FOR DRIVE B 5D56 ALV2 DS 75 ;ALLOCATION VECTOR FOR DRIVE C 5DA1 ALV3 DS 75 ;ALLOCATION VECTOR FOR DRIVE D 5DEC CSV0 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE A 5E2C CSV1 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE B 5E6C CSV2 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE C 5EAC CSV3 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE D 5EEC DIRBUF DS 128 ;DIRECTORY BUFFER 5F6C END