CP/M MACRO ASSEM 2.0 #001 CBIOS FOR MY SYSTEM: 1 Oct 82. ***************************************************************** * * * 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 MY SYSTEM: 1 Oct 82.' ***************************************************************** * * * 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 MY SYSTEM: 1 Oct 82. * 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. * * * ***************************************************************** 0038 = MSIZE EQU 56 ;MEMORY SIZE OF TARGET CP/M 9000 = BIAS EQU (MSIZE-20)*1024 ;MEMORY OFFSET FROM 20K SYSTEM BD00 = CCP EQU 2D00H+BIAS ;CONSOLE COMMAND PROCESSOR C500 = BDOS EQU CCP+800H ;BDOS ADDRESS D300 = 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 MY SYSTEM: 1 Oct 82. 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 001B = ESCAPE EQU 1BH ;ESCAPE CHARACTER 0004 = EOT EQU 04H ;END OF TEXT CHARACTER 000C = FORM EQU 0CH ;FORM FEED CHARACTER ***************************************************************** * * * THE JUMP TABLE BELOW MUST REMAIN IN THE SAME ORDER, THE * * ROUTINES MAY BE CHANGED, BUT THE FUNCTION EXECUTED MUST BE * * THE SAME. * * * ***************************************************************** D300 ORG BIOS ;CBIOS STARTING ADDRESS D300 C3A3D3 JMP CBOOT ;COLD BOOT ENTRY POINT D303 C310D4 WBOOTE JMP WBOOT ;WARM BOOT ENTRY POINT D306 C380D6 JMP CONST ;CONSOLE STATUS ROUTINE D309 C38CD6 JMP CONIN ;CONSOLE INPUT D30C C3A1D6 COUT JMP CONOUT ;CONSOLE OUTPUT D30F C3C1D6 JMP LIST ;LIST DEVICE OUTPUT D312 C3B6D6 JMP PUNCH ;PUNCH DEVICE OUTPUT D315 C3ACD6 JMP READER ;READER DEVICE INPUT D318 C3A4D4 JMP HOME ;HOME DRIVE D31B C3DAD4 JMP SETDRV ;SELECT DISK D31E C3A6D4 JMP SETTRK ;SET TRACK D321 C399D4 JMP SETSEC ;SET SECTOR D324 C39ED4 JMP SETDMA ;SET DMA ADDRESS D327 C37DD5 JMP READ ;READ THE DISK D32A C376D5 JMP WRITE ;WRITE THE DISK D32D C3CCD6 JMP LISTST ;LIST DEVICE STATUS D330 C3ABD4 JMP SECTRAN ;SECTOR TRANSLATION D333 C31BE4 DJDRV JMP DJSEL ;HOOK FOR SINGLE.COM PROGRAM D336 C354D6 TERMON JMP MOTORON ;START THE TERMINET 1200 D339 C35BD6 TERMOFF JMP MOTOROF ;TURN OFF THE TERMINET. ***************************************************************** * * * SIGNON MESSAGE OUTPUT DURING COLD BOOT. * * * ***************************************************************** D33C 0D0A0A PROMPT DB ACR,ALF,ALF D33F 0D0A DB ACR,ALF D341 4343505A20 DB 'CCPZ Terminet CP/M V2.2 ' D35B 0D0A DB ACR,ALF D35D 4D61737465 DB 'Master Catalog Disc: 001 ' D377 0D0A DB ACR,ALF D379 2020202020 DB ' ' D393 0D0A00 DB ACR,ALF,0 ***************************************************************** CP/M MACRO ASSEM 2.0 #004 CBIOS FOR MY SYSTEM: 1 Oct 82. * * * UTILITY ROUTINE TO OUTPUT THE MESSAGE POINTED AT BY H&L, * * TERMINATED WITH A NULL. * * * ***************************************************************** D396 7E MESSAGE MOV A,M ;GET A CHARACTER OF THE MESSAGE D397 23 INX H ;BUMP TEXT POINTER D398 A7 ANA A ;TEST FOR END D399 C8 RZ ;RETURN IF DONE D39A E5 PUSH H ;SAVE POINTER TO TEXT D39B 4F MOV C,A ;OUTPUT CHARACTER IN C D39C CD0CD3 CALL COUT ;OUTPUT THE CHARACTER D39F E1 POP H ;RESTORE THE POINTER D3A0 C396D3 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. * * * ***************************************************************** D3A3 310001 CBOOT LXI SP,TPA ;SET UP STACK D3A6 CD84D7 CALL TINIT ;INITIALIZE THE TERMINAL D3A9 213CD3 LXI H,PROMPT ;PREP FOR SENDING SIGNON MESSAGE D3AC CD96D3 CALL MESSAGE ;SEND THE PROMPT D3AF AF XRA A ;SELECT DISK A D3B0 3220D9 STA CPMDRV D3B3 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). * * * ***************************************************************** D3B6 218000 GOCPM LXI H,BUFF ;SET UP INITIAL DMA ADDRESS D3B9 CD9ED4 CALL SETDMA D3BC 3EC3 MVI A,(JMP) ;INITIALIZE JUMP TO WARM BOOT D3BE 320000 STA WBOT D3C1 320500 STA ENTRY ;INITIALIZE JUMP TO BDOS D3C4 2103D3 LXI H,WBOOTE ;ADDRESS IN WARM BOOT JUMP D3C7 220100 SHLD WBOT+1 D3CA 2106C5 LXI H,BDOS+6 ;ADDRESS IN BDOS JUMP D3CD 220600 SHLD ENTRY+1 D3D0 AF XRA A ;A <- 0 D3D1 3225D9 STA BUFSEC ;DISK JOCKEY BUFFER EMPTY D3D4 32E9D5 STA BUFWRTN ;SET BUFFER NOT DIRTY FLAG D3D7 3A0400 LDA CDISK ;JUMP TO CP/M WITH CURRENTLY SELECTED DISK IN C D3DA 4F MOV C,A D3DB 11FED3 LXI D,CMNDBEG ;BEGINNING OF INITIAL COMMAND D3DE 2108BD LXI H,CCP+8 ;COMMAND BUFFER D3E1 3E12 MVI A,CMNDEND-CMNDBEG+1 ;LENGTH OF COMMAND CP/M MACRO ASSEM 2.0 #005 CBIOS FOR MY SYSTEM: 1 Oct 82. D3E3 3207BD STA CCP+7 D3E6 47 MOV B,A D3E7 CD4BD6 CALL MOVLOP D3EA 3AFCD3 LDA CWFLG D3ED A7 ANA A D3EE 3AFDD3 LDA AUTOFLG D3F1 CAF5D3 JZ CLDBOT D3F4 1F RAR D3F5 1F CLDBOT RAR D3F6 DA00BD JC CCP D3F9 C303BD JMP CCP+3 ;ENTER CP/M D3FC 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. * * * ***************************************************************** D3FD 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. * * * ***************************************************************** D3FE 44554D4D59CMNDBEG DB 'DUMMYARG ANOTHER1' ;FOR DIRECT REPLACEMENT. D40F 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. * * * ***************************************************************** D410 310001 WBOOT LXI SP,TPA ;SET UP STACK POINTER D413 3E01 MVI A,1 CP/M MACRO ASSEM 2.0 #006 CBIOS FOR MY SYSTEM: 1 Oct 82. D414 = WFLG EQU $-1 ;TEST IF BEGINNING OR D415 A7 ANA A ; ENDING A WARM BOOT D416 3E01 MVI A,1 D418 3214D4 STA WFLG D41B 32FCD3 STA CWFLG ;SET COLD/WARM BOOT FLAG D41E CAB6D3 JZ GOCPM D421 AF XRA A D422 3214D4 STA WFLG D425 4F MOV C,A D426 CD33D3 CALL DJDRV ;SELECT DRIVE A D429 0E00 MVI C,0 ;SELECT SINGLE DENSITY D42B CD2DE4 CALL DJDEN D42E 0E00 MVI C,0 ;SELECT SIDE 0 D430 CD30E4 CALL DJSIDE D433 3E0F MVI A,15 ;INITIALIZE THE SECTOR TO READ D435 3253D4 STA NEWSEC D438 2100BC LXI H,CCP-100H ;AND THE DMA ADDRESS D43B 2272D4 SHLD NEWDMA D43E CD52D4 CALL WARMLOD ;READ IN CP/M D441 0100C2 LXI B,CCP+500H ;LOAD ADDRESS FOR REST OF WARM BOOT D444 CD12E4 CALL DJDMA D447 0E08 MVI C,8 D449 CD0FE4 CALL DJSEC D44C CD86D4 CALL WARMRD D44F C303C2 JMP CCP+503H D452 3E0F WARMLOD MVI A,15 ;PREVIOUS SECTOR D453 = NEWSEC EQU $-1 D454 3C INR A ;UPDATE THE PREVIOUS SECTOR D455 3C INR A D456 FE1B CPI 27 ;WAS IT THE LAST ? D458 DA6AD4 JC NOWRAP D45B D609 SUI 9 ;YES D45D FE13 CPI 19 D45F C8 RZ D460 2A72D4 LHLD NEWDMA D463 1180FB LXI D,-480H D466 19 DAD D D467 2272D4 SHLD NEWDMA D46A 3253D4 NOWRAP STA NEWSEC ;SAVE THE NEW SECTOR TO READ D46D 4F MOV C,A D46E CD0FE4 CALL DJSEC D471 2100BC LXI H,CCP-100H ;GET THE PREVIOUS DMA ADDRESS D472 = NEWDMA EQU $-2 D474 110001 LXI D,100H ;UPDATE THE DMA ADDRESS D477 19 DAD D D478 2272D4 SHLD NEWDMA ;SAVE THE DMA ADDRESS D47B 44 MOV B,H D47C 4D MOV C,L D47D CD12E4 CALL DJDMA ;SET THE DMA ADDRESS D480 CD86D4 CALL WARMRD D483 C352D4 JMP WARMLOD D486 01000A WARMRD LXI B,RETRIES*100H+0;MAXIMUM # OF ERRORS D489 C5 WRMREAD PUSH B D48A CD0CE4 CALL DJTRK ;SET THE TRACK CP/M MACRO ASSEM 2.0 #007 CBIOS FOR MY SYSTEM: 1 Oct 82. D48D CD15E4 CALL DJREAD ;READ THE SECTOR D490 C1 POP B D491 D0 RNC ;CONTINUE IF SUCCESSFUL D492 05 DCR B D493 C289D4 JNZ WRMREAD ;KEEP TRYING D496 C32AE4 JMP DJERR ***************************************************************** * * * SETSEC JUST SAVES THE DESIRED SECTOR TO SEEK TO UNTIL AN * * ACTUAL READ OR WRITE IS ATTEMPTED. * * * ***************************************************************** D499 79 SETSEC MOV A,C ;SAVE THE SECTOR NUMBER D49A 321FD9 STA CPMSEC ;CP/M SECTOR # D49D C9 RET ***************************************************************** * * * SETDMA SAVES THE DMA ADDRESS FOR THE DATA TRANSFER. * * * ***************************************************************** D49E 60 SETDMA MOV H,B ;HL <- BC D49F 69 MOV L,C D4A0 22C9D5 SHLD CPMDMA ;CP/M DMA ADDRESS D4A3 C9 RET ***************************************************************** * * * HOME IS TRANSLATED INTO A SEEK TO TRACK ZERO. * * * ***************************************************************** D4A4 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. * * * ***************************************************************** D4A6 79 SETTRK MOV A,C ;A <- TRACK # D4A7 3221D9 STA CPMTRK ;CP/M TRACK # D4AA C9 RET ***************************************************************** * * * SECTRAN TRANSLATES A LOGICAL SECTOR # INTO A PHYSICAL SECTOR * * #. * * * ***************************************************************** D4AB 03 SECTRAN INX B CP/M MACRO ASSEM 2.0 #008 CBIOS FOR MY SYSTEM: 1 Oct 82. D4AC D5 PUSH D ;SAVE TABLE ADDRESS D4AD C5 PUSH B ;SAVE SECTOR # D4AE CD55D5 CALL GETDPB ;GET DPB ADDRESS INTO HL D4B1 7E MOV A,M ;GET # OF CP/M SECTORS/TRACK D4B2 B7 ORA A ;CLEAR CARY D4B3 1F RAR ;DIVIDE BY TWO D4B4 91 SUB C D4B5 F5 PUSH PSW ;SAVE ADJUSTED SECTOR D4B6 FAC2D4 JM SIDETWO D4B9 F1 SIDEA POP PSW ;DISCARD ADJUSTED SECTOR D4BA C1 POP B ;RESTORE SECTOR REQUESTED D4BB D1 POP D ;RESTOR ADDRESS OF XLT TABLE D4BC EB SIDEONE XCHG ;HL <- &(TRANSLATION TABLE) D4BD 09 DAD B ;BC = OFFSET INTO TABLE D4BE 6E MOV L,M ;HL <- PHYSICAL SECTOR D4BF 2600 MVI H,0 D4C1 C9 RET D4C2 010F00 SIDETWO LXI B,15 ;OFFSET TO SIDE BIT D4C5 09 DAD B D4C6 7E MOV A,M D4C7 E608 ANI 8 ;TEST FOR DOUBLE SIDED D4C9 CAB9D4 JZ SIDEA ;MEDIA IS ONLY SINGLE SIDED D4CC F1 POP PSW ;RETRIEVE ADJUSTED SECTOR D4CD C1 POP B D4CE 2F CMA ;MAKE SECTOR REQUEST POSITIVE D4CF 3C INR A D4D0 4F MOV C,A ;MAKE NEW SECTOR THE REQUESTED SECTOR D4D1 D1 POP D D4D2 CDBCD4 CALL SIDEONE D4D5 3E80 MVI A,80H ;SIDE TWO BIT D4D7 B5 ORA L ; AND SECTOR D4D8 6F MOV L,A D4D9 C9 RET ***************************************************************** * * * SETDRV SELECTS THE NEXT DRIVE TO BE USED IN READ/WRITE * * OPERATIONS. IF THE DRIVE HAS NEVER BEEN SELECTED BEFORE, A * * PARAMETER TABLE IS CREATED WHICH CORRECTLY DESCRIBES THE * * DISKETTE CURRENTLY IN THE DRIVE. DISKETTES CAN BE OF FOUR * * DIFFERENT SECTOR SIZES: * * 1) 128 BYTES SINGLE DENSITY. * * 2) 256 BYTES DOUBLE DENSITY. * * 3) 512 BYTES DOUBLE DENSITY. * * 4) 1024 BYTES DOUBLE DENSITY. * * * ***************************************************************** D4DA 79 SETDRV MOV A,C ;SAVE THE DRIVE # D4DB 3220D9 STA CPMDRV D4DE FE04 CPI MAXDISK ;CHECK FOR A VALID DRIVE # D4E0 D251D5 JNC ZRET ;ILLEGAL DRIVE # D4E3 7B MOV A,E ;TEST IF DRIVE EVER LOGGED IN BEFORE D4E4 E601 ANI 1 D4E6 C238D5 JNZ SETDRV1 ;BIT 0 OF E = 0 -> NEVER SELECTED BEFORE CP/M MACRO ASSEM 2.0 #009 CBIOS FOR MY SYSTEM: 1 Oct 82. D4E9 3E01 MVI A,1 ;SELECT SECTOR 1 OF TRACK 1 D4EB 3222D9 STA TRUESEC D4EE 3221D9 STA CPMTRK D4F1 CD34D6 CALL FILL ;FLUSH BUFFER AND REFILL D4F4 DA51D5 JC ZRET ;TEST FOR ERROR RETURN D4F7 CD27E4 CALL DJSTAT ;GET STATUS ON CURRENT DRIVE D4FA E60C ANI 0CH ;STRIP OFF UNWANTED BITS D4FC F5 PUSH PSW ;USED TO SELECT A DPB D4FD 1F RAR D4FE 216ED5 LXI H,XLTS ;TABLE OF XLT ADDRESSES D501 5F MOV E,A D502 1600 MVI D,0 D504 19 DAD D D505 E5 PUSH H ;SAVE POINTER TO PROPER XLT D506 CD55D5 CALL GETDPB ;GET DPH POINTER INTO DE D509 EB XCHG ; D50A D1 POP D D50B 0602 MVI B,2 ;NUMBER OF BYTES TO MOVE D50D CD4BD6 CALL MOVLOP ;MOVE THE ADDRESS OF XLT D510 110800 LXI D,8 ;OFFSET TO DPB POINTER D513 19 DAD D ;HL <- &DPH.DPB D514 E5 PUSH H D515 2A07E0 LHLD ORIGIN+7 ;GET ADDRESS OF DJ TERMINAL OUT ROUTINE D518 23 INX H ;BUMP TO LOOK AT ADDRESS OF ; UART STATUS LOCATION D519 7E MOV A,M D51A EE03 XRI 3 ;ADJUST FOR PROPER REV DJ D51C 6F MOV L,A D51D 26E3 MVI H,(ORIGIN+300H)/100H D51F 7E MOV A,M D520 E608 ANI DBLSID ;CHECK DOUBLE SIDED BIT D522 115FD8 LXI D,DPB128S ;BASE FOR SINGLE SIDED DPB'S D525 C22BD5 JNZ SIDEOK D528 119FD8 LXI D,DPB128D ;BASE OF DOUBLE SIDED DPB'S D52B EB SIDEOK XCHG ;HL <- DBP BASE, DE <- &DPH.DPB D52C D1 POP D ;RESTORE DE (POINTER INTO DPH) D52D F1 POP PSW ;OFFSET TO CORRECT DPB D52E 17 RAL D52F 17 RAL D530 4F MOV C,A D531 0600 MVI B,0 D533 09 DAD B D534 EB XCHG ;PUT DPB ADDRESS IN DPH D535 73 MOV M,E D536 23 INX H D537 72 MOV M,D D538 CD55D5 SETDRV1 CALL GETDPB ;GET ADDRESS OF DPB IN HL D53B 010F00 LXI B,15 ;OFFSET TO SECTOR SIZE D53E 09 DAD B D53F 7E MOV A,M ;GET SECTOR SIZE D540 E607 ANI 7H D542 3282D5 STA SECSIZ D545 7E MOV A,M D546 1F RAR D547 1F RAR D548 1F RAR CP/M MACRO ASSEM 2.0 #010 CBIOS FOR MY SYSTEM: 1 Oct 82. D549 1F RAR D54A E60F ANI 0FH D54C 32B8D5 STA SECPSEC D54F EB XCHG ;HL <- DPH D550 C9 RET D551 210000 ZRET LXI H,0 ;SELDRV ERROR EXIT D554 C9 RET ***************************************************************** * * * GETDPB RETURNS HL POINTING TO THE DPB OF THE CURRENTLY * * SELECTED DRIVE, DE POINTING TO DPH. * * * ***************************************************************** D555 3A20D9 GETDPB LDA CPMDRV ;GET DRIVE # D558 6F MOV L,A ;FORM OFFSET D559 2600 MVI H,0 D55B 29 DAD H D55C 29 DAD H D55D 29 DAD H D55E 29 DAD H D55F 11DFD8 LXI D,DPZERO ;BASE OF DPH'S D562 19 DAD D D563 E5 PUSH H ;SAVE ADDRESS OF DPH D564 110A00 LXI D,10 ;OFFSET TO DPB D567 19 DAD D D568 7E MOV A,M ;GET LOW BYTE OF DPB ADDRESS D569 23 INX H D56A 66 MOV H,M ;GET LOW BYTE OF DPB D56B 6F MOV L,A D56C D1 POP D D56D C9 RET ***************************************************************** * * * XLTS IS A TABLE OF ADDRESS THAT POINT TO EACH OF THE XLT * * TABLES FOR EACH SECTOR SIZE. * * * ***************************************************************** D56E 91D7 XLTS DW XLT128 ;XLT FOR 128 BYTE SECTORS D570 ACD7 DW XLT256 ;XLT FOR 256 BYTE SECTORS D572 E1D7 DW XLT512 ;XLT FOR 512 BYTE SECTORS D574 1ED8 DW XLT124 ;XLT FOR 1024 BYTE SECTORS ***************************************************************** * * * WRITE ROUTINE MOVES DATA FROM MEMORY INTO THE BUFFER. IF THE * * DESIRED CP/M SECTOR IS NOT CONTAINED IN THE DISK BUFFER, THE * * BUFFER IS FIRST FLUSHED TO THE DISK IF IT HAS EVER BEEN * * WRITTEN INTO, THEN A READ IS PERFORMED INTO THE BUFFER TO GET * * THE DESIRED SECTOR. ONCE THE CORRECT SECTOR IS IN MEMORY, THE * * BUFFER WRITTEN INDICATOR IS SET, SO THE BUFFER WILL BE * * FLUSHED, THEN THE DATA IS TRANSFERRED INTO THE BUFFER. * CP/M MACRO ASSEM 2.0 #011 CBIOS FOR MY SYSTEM: 1 Oct 82. * * ***************************************************************** D576 79 WRITE MOV A,C ;SAVE WRITE COMMAND TYPE D577 32E0D5 STA WRITTYP D57A 3E01 MVI A,1 ;SET WRITE COMMAND D57C 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. * * * ***************************************************************** D57D AF READ XRA A ;SET THE COMMAND TYPE TO READ D57E 32CCD5 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. * * * ***************************************************************** D581 0600 REDWRT MVI B,0 ;THE 0 IS MODIFIED TO CONTAIN THE LOG2 D582 = SECSIZ EQU $-1 ; OF THE PHYSICAL SECTOR SIZE/128 ; ON THE CURRENTLY SELECTED DISK. D583 3A1FD9 LDA CPMSEC ;GET THE DESIRED CP/M SECTOR # D586 F5 PUSH PSW ;TEMPORARY SAVE D587 E680 ANI 80H ;SAVE ONLY THE SIDE BIT D589 4F MOV C,A ;REMEMBER THE SIDE D58A F1 POP PSW ;GET THE SECTOR BACK D58B E67F ANI 7FH ;FORGET THE SIDE BIT D58D 3D DCR A ;TEMPORARY ADJUSTMENT D58E 05 DIVLOOP DCR B ;UPDATE REPEAT COUNT D58F CA97D5 JZ DIVDONE D592 B7 ORA A ;CLEAR THE CARY FLAG D593 1F RAR ;DIVIDE THE CP/M SECTOR # BY THE SIZE ; OF THE PHYSICAL SECTORS D594 C38ED5 JMP DIVLOOP ; D597 3C DIVDONE INR A D598 B1 ORA C ;RESTORE THE SIDE BIT D599 3222D9 STA TRUESEC ;SAVE THE PHYSICAL SECTOR NUMBER D59C 2120D9 LXI H,CPMDRV ;POINTER TO DESIRED DRIVE,TRACK, AND SECTOR D59F 1123D9 LXI D,BUFDRV ;POINTER TO BUFFER DRIVE,TRACK, AND SECTOR CP/M MACRO ASSEM 2.0 #012 CBIOS FOR MY SYSTEM: 1 Oct 82. D5A2 0604 MVI B,4 ;COUNT LOOP D5A4 05 DTSLOP DCR B ;TEST IF DONE WITH COMPARE D5A5 CAB3D5 JZ MOVE ;YES, MATCH. GO MOVE THE DATA D5A8 1A LDAX D ;GET A BYTE TO COMPARE D5A9 BE CMP M ;TEST FOR MATCH D5AA 23 INX H ;BUMP POINTERS TO NEXT DATA ITEM D5AB 13 INX D D5AC CAA4D5 JZ DTSLOP ;MATCH, CONTINUE TESTING ***************************************************************** * * * DRIVE, TRACK, AND SECTOR DON'T MATCH, FLUSH THE BUFFER IF * * NECESSARY AND THEN REFILL. * * * ***************************************************************** D5AF CD34D6 CALL FILL ;FILL THE BUFFER WITH CORRECT PHYSICAL SECTOR D5B2 D8 RC ;NO GOOD, RETURN WITH ERROR INDICATION ***************************************************************** * * * MOVE HAS BEEN MODIFIED TO CAUSE EITHER A TRANSFER INTO OR OUT * * THE BUFFER. * * * ***************************************************************** D5B3 3A1FD9 MOVE LDA CPMSEC ;GET THE CP/M SECTOR TO TRANSFER D5B6 3D DCR A ;ADJUST TO PROPER SECTOR IN BUFFER D5B7 E600 ANI 0 ;STRIP OFF HIGH ORDERED BITS D5B8 = SECPSEC EQU $-1 ;THE 0 IS MODIFIED TO REPRESENT THE # OF ; CP/M SECTORS PER PHYSICAL SECTORS D5B9 6F MOV L,A ;PUT INTO HL D5BA 2600 MVI H,0 D5BC 29 DAD H ;FORM OFFSET INTO BUFFER D5BD 29 DAD H D5BE 29 DAD H D5BF 29 DAD H D5C0 29 DAD H D5C1 29 DAD H D5C2 29 DAD H D5C3 1126D9 LXI D,BUFFER ;BEGINNING ADDRESS OF BUFFER D5C6 19 DAD D ;FORM BEGINNING ADDRESS OF SECTOR TO TRANSFER D5C7 EB XCHG ;DE = ADDRESS IN BUFFER D5C8 210000 LXI H,0 ;GET DMA ADDRESS, THE 0 IS MODIFIED TO ; CONTAIN THE DMA ADDRESS D5C9 = CPMDMA EQU $-2 D5CB 3E00 MVI A,0 ;THE ZERO GETS MODIFIED TO CONTAIN ; A ZERO IF A READ, OR A 1 IF WRITE D5CC = RDWR EQU $-1 D5CD A7 ANA A ;TEST WHICH KIND OF OPERATION D5CE C2D6D5 JNZ INTO ;TRANSFER DATA INTO THE BUFFER D5D1 CD49D6 OUTOF CALL MOVER D5D4 AF XRA A D5D5 C9 RET D5D6 EB INTO XCHG ; CP/M MACRO ASSEM 2.0 #013 CBIOS FOR MY SYSTEM: 1 Oct 82. D5D7 CD49D6 CALL MOVER ;MOVE THE DATA, HL = DESTINATION ; DE = SOURCE D5DA 3E01 MVI A,1 D5DC 32E9D5 STA BUFWRTN ;SET BUFFER WRITTEN INTO FLAG D5DF 3E00 MVI A,0 ;CHECK FOR DIRECTORY WRITE D5E0 = WRITTYP EQU $-1 D5E1 3D DCR A D5E2 3E00 MVI A,0 D5E4 32E0D5 STA WRITTYP ;SET NO DIRECTORY WRITE D5E7 C0 RNZ ;NO ERROR EXIT ***************************************************************** * * * FLUSH WRITES THE CONTENTS OF THE BUFFER OUT TO THE DISK IF * * IT HAS EVER BEEN WRITTEN INTO. * * * ***************************************************************** D5E8 3E00 FLUSH MVI A,0 ;THE 0 IS MODIFIED TO REFLECT IF ; THE BUFFER HAS BEEN WRITTEN INTO D5E9 = BUFWRTN EQU $-1 D5EA A7 ANA A ;TEST IF WRITTEN INTO D5EB C8 RZ ;NOT WRITTEN, ALL DONE D5EC 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. * * * ***************************************************************** D5EF AF PREP XRA A ;RESET BUFFER WRITTEN FLAG D5F0 32E9D5 STA BUFWRTN D5F3 2226D6 SHLD RETRYOP ;SET UP THE READ/WRITE OPERATION D5F6 060A MVI B,RETRIES ;MAXIMUM NUMBER OF RETRIES TO ATTEMPT D5F8 C5 RETRYLP PUSH B ;SAVE THE RETRY COUNT D5F9 3A23D9 LDA BUFDRV ;GET DRIVE NUMBER INVOLVED IN THE OPERATION D5FC 4F MOV C,A D5FD CD33D3 CALL DJDRV ;SELECT THE DRIVE D600 3A24D9 LDA BUFTRK D603 A7 ANA A ;TEST FOR TRACK ZERO D604 4F MOV C,A D605 C5 PUSH B D606 CC09E4 CZ DJHOME ;HOME THE DRIVE IF TRACK 0 D609 C1 POP B ;RESTORE TRACK # D60A CD0CE4 CALL DJTRK ;SEEK TO PROPER TRACK D60D 3A25D9 LDA BUFSEC ;GET SECTOR INVOLVED IN OPERATION D610 F5 PUSH PSW ;SAVE THE SECTOR # D611 07 RLC ;BIT 0 OF A EQUALS SIDE # D612 E601 ANI 1 ;STRIP OFF UNNECESSARY BITS D614 4F MOV C,A ;C <- SIDE # D615 CD30E4 CALL DJSIDE ;SELECT THE SIDE D618 F1 POP PSW ;A <- SECTOR # D619 E67F ANI 7FH ;STRIP OFF SIDE BIT CP/M MACRO ASSEM 2.0 #014 CBIOS FOR MY SYSTEM: 1 Oct 82. D61B 4F MOV C,A ;C <- SECTOR # D61C CD0FE4 CALL DJSEC ;SET THE SECTOR TO TRANSFER D61F 0126D9 LXI B,BUFFER ;SET THE DMA ADDRESS D622 CD12E4 CALL DJDMA D625 CD15E4 CALL DJREAD ;THE READ OPERATION IS MODIFIED TO WRITE D626 = RETRYOP EQU $-2 D628 C1 POP B ;RESTORE THE RETRY COUNTER D629 3E00 MVI A,0 ;NO ERROR EXIT STATUS D62B D0 RNC ;RETURN NO ERROR D62C 05 DCR B ;UPDATE THE RETRY COUNTER D62D 37 STC ;ASSUME RETRY COUNT EXPIRED D62E 3EFF MVI A,0FFH ;ERROR RETURN D630 C8 RZ D631 C3F8D5 JMP RETRYLP ;TRY AGAIN ***************************************************************** * * * FILL FILLS THE BUFFER WITH A NEW SECTOR FROM THE DISK. * * * ***************************************************************** D634 CDE8D5 FILL CALL FLUSH ;FLUSH BUFFER FIRST D637 D8 RC ;CHECK FOR ERROR D638 1120D9 LXI D,CPMDRV ;UPDATE THE DRIVE, TRACK, AND SECTOR D63B 2123D9 LXI H,BUFDRV D63E 0603 MVI B,3 ;NUMBER OF BYTES TO MOVE D640 CD4BD6 CALL MOVLOP ;COPY THE DATA D643 2115E4 LXI H,DJREAD D646 C3EFD5 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. * * * ***************************************************************** D649 0680 MOVER MVI B,128 ;LENGTH OF TRANSFER D64B 1A MOVLOP LDAX D ;GET A BTE OF SOURCE D64C 77 MOV M,A ;MOVE IT D64D 13 INX D ;BUMP POINTERS D64E 23 INX H D64F 05 DCR B ;UPDATE COUNTER D650 C24BD6 JNZ MOVLOP ;CONTINUE MOVING UNTIL DONE D653 C9 RET D654 CD6BD6 MOTORON CALL MOTORON0 D657 CD65D6 CALL FORMFD D65A C9 RET D65B CD62D6 MOTOROF CALL FORM2FD D65E CD76D6 CALL MOTOROF0 D661 C9 RET D662 CD65D6 FORM2FD CALL FORMFD D665 0E0C FORMFD MVI C,FORM D667 CD12D7 CALL COLPT D66A C9 RET CP/M MACRO ASSEM 2.0 #015 CBIOS FOR MY SYSTEM: 1 Oct 82. D66B 0E1B MOTORON0 MVI C,ESCAPE D66D CD12D7 CALL COLPT D670 0E48 MVI C,'H' D672 CD12D7 CALL COLPT D675 C9 RET D676 0E04 MOTOROF0 MVI C,EOT D678 CD12D7 CALL COLPT D67B C9 RET IOSTART ***************************************************************** * * * 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. * * * ***************************************************************** FF2B = CITTY EQU 0FF2BH ;INPUT FROM VIO ROUTINES. FCBE = COTTY EQU 0FCBEH ;OUTPUT FROM VIO ROUTINES> D67C 79 VIDEO MOV A,C ;LOAD THE CHARACTER D67D C303F8 JMP 0F803H ; AND DISPLAY ON SCREEN. ***************************************************************** * * * 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. * * * ***************************************************************** D680 21FAD6 CONST LXI H,CSTBLE ;BEGINNING OF JUMP TABLE D683 C392D6 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. * * * ***************************************************************** D686 2102D7 CSREADR LXI H,CSRTBLE ;BEGINNING OF READER STATUS TABLE D689 C3AFD6 JMP READERA ***************************************************************** * * * CONIN: TAKE THE CORRECT JUMP FOR THE CONSOLE INPUT ROUTINE. * * THE JUMP IS BASED ON THE TWO LEAST SIGNIFICANT BITS OF * CP/M MACRO ASSEM 2.0 #016 CBIOS FOR MY SYSTEM: 1 Oct 82. * IOBYTE. * * * ***************************************************************** D68C CDE8D5 CONIN CALL FLUSH ;FLUSH THE DISK BUFFER D68F 21D2D6 LXI H,CITBLE ;BEGINNING OF CHARACTER INPUT TABLE * * ENTRY AT CONIN1 WILL DECODE THE TWO LEAST SIGNIFICANT BITS * OF IOBYTE. THIS IS USED BY CONIN,CONOUT, AND CONST. * D692 3A0300 CONIN1 LDA IOBYTE D695 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. * D696 E606 SELDEV ANI 6H ;STRIP OFF UNWANTED BITS D698 1600 MVI D,0 ;FORM OFFSET D69A 5F MOV E,A D69B 19 DAD D ;ADD OFFSET D69C 7E MOV A,M ;PICK UP HIGH BYTE D69D 23 INX H D69E 66 MOV H,M ;PICK UP LOW BYTE D69F 6F MOV L,A ;FORM ADDRESS D6A0 E9 PCHL ;GO THERE ! ***************************************************************** * * * CONOUT: TAKE THE PROPER BRANCH ADDRESS BASED ON THE TWO LEAST * * SIGNIFICANT BITS OF IOBYTE. * * * ***************************************************************** D6A1 C5 CONOUT PUSH B ;SAVE THE CHARACTER D6A2 CDE8D5 CALL FLUSH ;FLUSH THE DISK BUFFER D6A5 C1 POP B ;RESTORE THE CHARACTER D6A6 21DAD6 LXI H,COTBLE ;BEGINNING OF THE CHARACTER OUT TABLE D6A9 C392D6 JMP CONIN1 ;DO THE DECODE ***************************************************************** * * * READER: SELECT THE CORRECT READER DEVICE FOR INPUT. THE * * READER IS SELECTED FROM BITS 2 AND 3 OF IOBYTE. * * * ***************************************************************** D6AC 21F2D6 READER LXI H,RTBLE ;BEGINNING OF READER INPUT TABLE * * ENTRY AT READERA WILL DECODE BITS 2 & 3 OF IOBYTE, USED * BY CSREADER. * CP/M MACRO ASSEM 2.0 #017 CBIOS FOR MY SYSTEM: 1 Oct 82. D6AF 3A0300 READERA LDA IOBYTE * * ENTRY AT READER1 WILL SHIFT THE BITS INTO POSITION, USED * BY LIST AND PUNCH. * D6B2 1F READR1 RAR D6B3 C396D6 JMP SELDEV ***************************************************************** * * * PUNCH: SELECT THE CORRECT PUNCH DEVICE. THE SELECTION COMES * * FROM BITS 4&5 OF IOBYTE. * * * ***************************************************************** D6B6 21EAD6 PUNCH LXI H,PTBLE ;BEGINNING OF PUNCH TABLE D6B9 3A0300 LDA IOBYTE * * ENTRY AT PNCH1 ROTATES BITS A LITTLE MORE IN PREP FOR * SELDEV, USED BY LIST. * D6BC 1F PNCH1 RAR D6BD 1F RAR D6BE C3B2D6 JMP READR1 ***************************************************************** * * * LIST: SELECT A LIST DEVICE BASED ON BITS 6&7 OF IOBYTE * * * ***************************************************************** D6C1 21E2D6 LIST LXI H,LTBLE ;BEGINNING OF THE LIST DEVICE ROUTINES D6C4 3A0300 LIST1 LDA IOBYTE D6C7 1F RAR D6C8 1F RAR D6C9 C3BCD6 JMP PNCH1 ***************************************************************** * * * LISTST: GET THE STATUS OF THE CURRENTLY ASSIGNED LIST DEVICE * * * ***************************************************************** D6CC 210AD7 LISTST LXI H,LSTBLE ;BEGINNING OF THE LIST DEVICE STATUS D6CF C3C4D6 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 * CP/M MACRO ASSEM 2.0 #018 CBIOS FOR MY SYSTEM: 1 Oct 82. * THE FOLLOWING TABLES. * * * ***************************************************************** * * CONSOLE INPUT TABLE * D6D2 5ED7 CITBLE DW CIUC1 ;INPUT FROM KEYBOARD (PARALLEL PORT ; 02H, STATUS PORT 03H). D6D4 5ED7 DW CICRT ;SAME PARAMETERS AS THE PREVIOUS ; ENTRY FOR CIUC1. D6D6 ACD6 DW READER ;INPUT FROM READER (DEPENDS ON READER ; SELECTION) D6D8 5ED7 DW CIUC1 ;SAME PARAMETERS AS THE PREVIOUS ; ENTRY> * * CONSOLE OUTPUT TABLE * D6DA 7CD6 COTBLE DW VIDEO ;OUTPUT TO THE DISPLAY SCREEN VIA ; THE VIO ROUTINE. D6DC 12D7 DW COLPT ;OUTPUT TO THE MAIN PRINTER - ; THE TERMINET1200. D6DE C1D6 DW LIST ;OUTPUT TO LIST DEVICE (DEPENDS ON ; BITS 6&7 OF IOBYTE) D6E0 12D7 DW COUC1 ;OUTPUT TO USER CONSOLE 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * LIST DEVICE TABLE * D6E2 12D7 LTBLE DW COLPT ;OUTPUT TO THE PRINTER: PRESENTLY ; THE TERMINET1200. D6E4 53D7 DW COSEL ;OUTPUT TO THE SECONDARY PRINTER: ; THE SELECTRIC) D6E6 12D7 DW COLPT ; ; D6E8 12D7 DW COLPT ; ; * * PUNCH DEVICE TABLE * D6EA 6AD7 PTBLE DW COPTP ;OUTPUT TO THE PUNCH ROUTINE ; USING 02H AND ECHO. D6EC 6AD7 DW COPTP ; SAME. ; D6EE 12D7 DW COUP1 ; SAME. ; D6F0 12D7 DW COUP2 ; SAME. ; CP/M MACRO ASSEM 2.0 #019 CBIOS FOR MY SYSTEM: 1 Oct 82. * * READER DEVICE INPUT TABLE * D6F2 2BFF RTBLE DW CITTY ;INPUT FROM TTY (CURRENTLY ASSIGNED ; BY INTIOBY, INPUT FROM 2D) D6F4 5ED7 DW CIPTR ;INPUT FROM PAPER TAPE READER (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) D6F6 5ED7 DW CIUR1 ;INPUT FROM USER READER 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) D6F8 5ED7 DW CIUR2 ;INPUT FROM USER READER 2 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * CONSOLE STATUS TABLE * D6FA 73D7 CSTBLE DW CSCRT ;STATUS FROM KEYBOARD - ASSIGNED TO ; PORT02H, STATUS 03H. D6FC 73D7 DW CSCRT ;SAME AS ABOVE. ; D6FE 86D6 DW CSREADR ;STATUS FROM READER (DEPENDS ON READER DEVICE ) D700 73D7 DW CSUC1 ;STATUS FROM USER CONSOLE 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * STATUS FROM READER DEVICE * D702 6BD7 CSRTBLE DW CSTTY ;STATUS FROM TTY (CURRENTLY ASSIGNED ; BY INTIOBY, STATUS OF 2D) D704 73D7 DW CSPTR ;STATUS FROM PAPER TAPE READER (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) D706 73D7 DW CSUR1 ;STATUS FROM USER READER 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) D708 73D7 DW CSUR2 ;STATUS OF USER READER 2 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * STATUS FROM LIST DEVICE * D70A 81D7 LSTBLE DW READY ;CONSOLE ALWAYS READY D70C 81D7 DW READY ;GET LIST STATUS D70E 7CD7 DW LSLPT D710 7CD7 DW LSLPT ***************************************************************** * * * THE FOLLOWING EQUATES SET OUTPUT DEVICE TO OUTPUT TO THE * * TERMINET 1200 FED FROM DJ BOARD SERIAL PORT. * * * ***************************************************************** ;PRINT CP/M MACRO ASSEM 2.0 #020 CBIOS FOR MY SYSTEM: 1 Oct 82. D712 = COUC1 EQU $ ;OUTPUT FROM USER CONSOLE 1 D712 = COUC2 EQU $ D712 = COUP1 EQU $ ;OUTPUT FROM USER PUNCH 1 D712 = COUP2 EQU $ ;OUTPUT FROM USER PUNCH 2 D712 79 COLPT MOV A,C D713 FE0A CPI 0AH D715 CA26D7 JZ LINES D718 FE0C CPI 0CH D71A CA44D7 JZ FORMF D71D FE0D CPI 0DH D71F CA35D7 JZ CARRT D722 CD06E4 CALL DJCOUT D725 C9 RET D726 CD06E4 LINES CALL DJCOUT D729 010080 LXI B,8000H D72C 0D LINE0 DCR C D72D C22CD7 JNZ LINE0 D730 05 DCR B D731 C22CD7 JNZ LINE0 D734 C9 RET D735 CD06E4 CARRT CALL DJCOUT D738 010080 LXI B,8000H D73B 0D CART0 DCR C D73C C23BD7 JNZ CART0 D73F 05 DCR B D740 C23BD7 JNZ CART0 D743 C9 RET D744 CD06E4 FORMF CALL DJCOUT D747 0100F8 LXI B,0F800H D74A 0D FORM0 DCR C D74B C24AD7 JNZ FORM0 D74E 05 DCR B D74F C24AD7 JNZ FORM0 D752 C9 RET ***************************************************************** * * * OUTPUT TO THE SECONDARY PRINTER: THE SELECTRIC AT STATUS * * PORT 3, DATA PORT 1, READY BYTE 60H. * * * ***************************************************************** D753 DB03 COSEL IN 03H D755 E660 ANI 60H D757 C253D7 JNZ COSEL D75A 79 MOV A,C D75B D301 OUT 1 D75D C9 RET ***************************************************************** * * * THE FOLLOWING EQUATES SET THE INPUT FROM THE DEVICES TO COME * * FROM THE KEYBOARD AT STATUS PORT 3, DATA PORT 2, BIT 2 HIGH. * * * ***************************************************************** CP/M MACRO ASSEM 2.0 #021 CBIOS FOR MY SYSTEM: 1 Oct 82. ;INPUT D75E = CIUC1 EQU $ ;INPUT FROM USER CONSOLE 1 D75E = CICRT EQU $ ;INPUT FROM CRT D75E = CIUR1 EQU $ ;INPUT FROM USER READER 1 D75E = CIUR2 EQU $ ;INPUT FROM USER READER 2 D75E DB03 CIPTR IN 03H D760 E602 ANI 02H D762 CA5ED7 JZ CIPTR D765 DB02 IN 02H D767 E67F ANI 7FH D769 C9 RET ***************************************************************** * * * OUTPUT TO PAPER TAPE PUNCH ROUTINE NOT CURRENTLY SUPPORTED. * * * ***************************************************************** ;PUNCH D76A C9 COPTP RET ***************************************************************** * * * CONSOLE STATUS ROUTINES, TEST IF A CHARACTER HAS ARRIVED. * * * ***************************************************************** ;CONSTAT D76B CD21E4 CSTTY CALL DJTSTAT ;STATUS FROM DISK JOCKEY 2D D76E 3E00 STAT MVI A,0 ;PREP FOR ZERO RETURN D770 C0 RNZ ;NOTHING FOUND D771 3D DCR A ;RETURN WITH 0FFH D772 C9 RET ***************************************************************** * * * THE FOLLOWING EQUATES CAUSE THE DEVICES TO GET STATUS FROM * * THE SWITCHBOARD SERIAL PORT 1. * * * ***************************************************************** D773 = CSUR1 EQU $ ;STATUS OF USER READER 1 D773 = CSUR2 EQU $ ;STATUS OF USER READER 2 D773 = CSPTR EQU $ ;STATUS OF PAPER TAPE READER D773 = CSUC1 EQU $ ;STATUS OF USER CONSOLE 1 D773 DB03 CSCRT IN 03H CP/M MACRO ASSEM 2.0 #022 CBIOS FOR MY SYSTEM: 1 Oct 82. D775 E602 ANI 02H D777 EE02 XRI 02H D779 C36ED7 JMP STAT ***************************************************************** * * * LIST DEVICE STATUS ROUTINES. * * * ***************************************************************** D77C DB03 LSLPT IN 03H D77E E601 ANI 01H D780 C8 RZ D781 3EFF READY MVI A,0FFH D783 C9 RET ***************************************************************** * * * TINIT CAN BE MODIFIED FOR DIFFERENT I/O SETUPS. * * * ***************************************************************** D784 0E1A TINIT MVI C,CLEAR ;INITIALIZE THE TERMINAL ROUTINE D786 3E00 MVI A,INTIOBY ;INITIALIZE IOBYTE D788 320300 STA IOBYTE D78B CD00F8 CALL 0F800H ;INITIALIZE THE VIO/C BOARD. D78E C30CD3 JMP COUT ; IOSTOP ***************************************************************** * * * 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. * * * ***************************************************************** D791 00 XLT128 DB 0 D792 01070D1319 DB 1,7,13,19,25 D797 050B1117 DB 5,11,17,23 D79B 03090F15 DB 3,9,15,21 D79F 02080E141A DB 2,8,14,20,26 D7A4 060C1218 DB 6,12,18,24 D7A8 040A1016 DB 4,10,16,22 D7AC 00 XLT256 DB 0 D7AD 0102131425 DB 1,2,19,20,37,38 D7B3 0304151627 DB 3,4,21,22,39,40 D7B9 0506171829 DB 5,6,23,24,41,42 D7BF 0708191A2B DB 7,8,25,26,43,44 D7C5 090A1B1C2D DB 9,10,27,28,45,46 D7CB 0B0C1D1E2F DB 11,12,29,30,47,48 D7D1 0D0E1F2031 DB 13,14,31,32,49,50 CP/M MACRO ASSEM 2.0 #023 CBIOS FOR MY SYSTEM: 1 Oct 82. D7D7 0F10212233 DB 15,16,33,34,51,52 D7DD 11122324 DB 17,18,35,36 D7E1 00 XLT512 DB 0 D7E2 0102030411 DB 1,2,3,4,17,18,19,20 D7EA 2122232431 DB 33,34,35,36,49,50,51,52 D7F2 0506070815 DB 5,6,7,8,21,22,23,24 D7FA 2526272835 DB 37,38,39,40,53,54,55,56 D802 090A0B0C19 DB 9,10,11,12,25,26,27,28 D80A 292A2B2C39 DB 41,42,43,44,57,58,59,60 D812 0D0E0F101D DB 13,14,15,16,29,30,31,32 D81A 2D2E2F30 DB 45,46,47,48 D81E 00 XLT124 DB 0 D81F 0102030405 DB 1,2,3,4,5,6,7,8 D827 191A1B1C1D DB 25,26,27,28,29,30,31,32 D82F 3132333435 DB 49,50,51,52,53,54,55,56 D837 090A0B0C0D DB 9,10,11,12,13,14,15,16 D83F 2122232425 DB 33,34,35,36,37,38,39,40 D847 393A3B3C3D DB 57,58,59,60,61,62,63,64 D84F 1112131415 DB 17,18,19,20,21,22,23,24 D857 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. * * * ***************************************************************** D85F 1A00 DPB128S DW 26 ;CP/M SECTORS/TRACK D861 03 DB 3 ;BSH D862 07 DB 7 ;BLM D863 00 DB 0 ;EXM D864 F200 DW 242 ;DSM D866 3F00 DW 63 ;DRM D868 C0 DB 0C0H ;AL0 D869 00 DB 0 ;AL1 D86A 1000 DW 16 ;CKS D86C 0200 DW 2 ;OFF D86E 01 DB 1H ;16*((#CPM SECTORS/PHYSICAL SECTOR) -1) + ;LOG2(#BYTES PER SECTOR/128) + 1 + ;8 IF DOUBLE SIDED. ***************************************************************** * * CP/M MACRO ASSEM 2.0 #024 CBIOS FOR MY SYSTEM: 1 Oct 82. * THE FOLLOWING DPB DEFINES A DISKETTE FOR 256 BYTE SECTORS, * * DOUBLE DENSITY, AND SINGLE SIDED. * * * ***************************************************************** D86F 3400 DPB256S DW 52 ;CP/M SECTORS/TRACK D871 04 DB 4 ;BSH D872 0F DB 15 ;BLM D873 00 DB 0 ;EXM D874 F200 DW 242 ;DSM D876 7F00 DW 127 ;DRM D878 C0 DB 0C0H ;AL0 D879 00 DB 0 ;AL1 D87A 2000 DW 32 ;CKS D87C 0200 DW 2 ;OFF D87E 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. * * * ***************************************************************** D87F 3C00 DPB512S DW 60 ;CP/M SECTORS/TRACK D881 04 DB 4 ;BSH D882 0F DB 15 ;BLM D883 00 DB 0 ;EXM D884 1801 DW 280 ;DSM D886 7F00 DW 127 ;DRM D888 C0 DB 0C0H ;AL0 D889 00 DB 0 ;AL1 D88A 2000 DW 32 ;CKS D88C 0200 DW 2 ;OFF D88E 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. * * * ***************************************************************** D88F 4000 DP1024S DW 64 ;CP/M SECTORS/TRACK D891 04 DB 4 ;BSH D892 0F DB 15 ;BLM D893 00 DB 0 ;EXM D894 2B01 DW 299 ;DSM D896 7F00 DW 127 ;DRM D898 C0 DB 0C0H ;AL0 D899 00 DB 0 ;AL1 D89A 2000 DW 32 ;CKS CP/M MACRO ASSEM 2.0 #025 CBIOS FOR MY SYSTEM: 1 Oct 82. D89C 0200 DW 2 ;OFF D89E 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. * * * ***************************************************************** D89F 3400 DPB128D DW 52 ;CP/M SECTORS/TRACK D8A1 04 DB 4 ;BSH D8A2 0F DB 15 ;BLM D8A3 01 DB 1 ;EXM D8A4 F200 DW 242 ;DSM D8A6 7F00 DW 127 ;DRM D8A8 C0 DB 0C0H ;AL0 D8A9 00 DB 0 ;AL1 D8AA 2000 DW 32 ;CKS D8AC 0200 DW 2 ;OFF D8AE 09 DB 9H ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 256 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** D8AF 6800 DPB256D DW 104 ;CP/M SECTORS/TRACK D8B1 04 DB 4 ;BSH D8B2 0F DB 15 ;BLM D8B3 00 DB 0 ;EXM D8B4 E601 DW 486 ;DSM D8B6 FF00 DW 255 ;DRM D8B8 F0 DB 0F0H ;AL0 D8B9 00 DB 0 ;AL1 D8BA 4000 DW 64 ;CKS D8BC 0200 DW 2 ;OFF D8BE 1A DB 1AH ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 512 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** D8BF 7800 DPB512D DW 120 ;CP/M SECTORS/TRACK D8C1 04 DB 4 ;BSH D8C2 0F DB 15 ;BLM D8C3 00 DB 0 ;EXM D8C4 3102 DW 561 ;DSM D8C6 FF00 DW 255 ;DRM CP/M MACRO ASSEM 2.0 #026 CBIOS FOR MY SYSTEM: 1 Oct 82. D8C8 F0 DB 0F0H ;AL0 D8C9 00 DB 0 ;AL1 D8CA 4000 DW 64 ;CKS D8CC 0200 DW 2 ;OFF D8CE 3B DB 3BH ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 1024 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** D8CF 8000 DP1024D DW 128 ;CP/M SECTORS/TRACK D8D1 04 DB 4 ;BSH D8D2 0F DB 15 ;BLM D8D3 00 DB 0 ;EXM D8D4 5702 DW 599 ;DSM D8D6 FF00 DW 255 ;DRM D8D8 F0 DB 0F0H ;AL0 D8D9 00 DB 0 ;AL1 D8DA 4000 DW 64 ;CKS D8DC 0200 DW 2 ;OFF D8DE 7C DB 7CH ***************************************************************** * * * CP/M DISK PARAMETER HEADERS, UNITIALIZED. * * * ***************************************************************** D8DF 0000 DPZERO DW 0 ;ADDRESS OF TRANSLATION TABLE (FILLED ; IN BY SETDRV) D8E1 0000000000 DW 0,0,0 ;USED BY BDOS D8E7 52DF DW DIRBUF ;ADDRESS OF DIRECTORY BUFFER D8E9 0000 DW 0 ;ADDRESS OF DPB (FILLED IN BY SETDRV) D8EB 52DE DW CSV0 ;DIRECTORY CHECK VECTOR D8ED 26DD DW ALV0 ;ALLOCATION VECTOR D8EF 0000 DPONE DW 0 D8F1 0000000000 DW 0,0,0 D8F7 52DF DW DIRBUF D8F9 0000 DW 0 D8FB 92DE DW CSV1 D8FD 71DD DW ALV1 D8FF 0000 DPTWO DW 0 D901 0000000000 DW 0,0,0 D907 52DF DW DIRBUF D909 0000 DW 0 D90B D2DE DW CSV2 D90D BCDD DW ALV2 D90F 0000 DPTHRE DW 0 D911 0000000000 DW 0,0,0 D917 52DF DW DIRBUF CP/M MACRO ASSEM 2.0 #027 CBIOS FOR MY SYSTEM: 1 Oct 82. D919 0000 DW 0 D91B 12DF DW CSV3 D91D 07DE DW ALV3 ***************************************************************** * * * CBIOS RAM LOCATIONS THAT DON'T NEED INITIALIZATION. * * * ***************************************************************** D91F 00 CPMSEC DB 0 ;CP/M SECTOR # D920 00 CPMDRV DB 0 ;CP/M DRIVE # D921 00 CPMTRK DB 0 ;CP/M TRACK # D922 00 TRUESEC DB 0 ;DISK JOCKEY SECTOR THAT CONTAINS CP/M SECTOR D923 00 BUFDRV DB 0 ;DRIVE THAT BUFFER BELONGS TO D924 00 BUFTRK DB 0 ;TRACK THAT BUFFER BELONGS TO D925 00 BUFSEC DB 0 ;SECTOR THAT BUFFER BELONGS TO D926 BUFFER DS 1024 ;MAXIMUM SIZE BUFFER FOR 1K SECTORS DD26 ALV0 DS 75 ;ALLOCATION VECTOR FOR DRIVE A DD71 ALV1 DS 75 ;ALLOCATION VECTOR FOR DRIVE B DDBC ALV2 DS 75 ;ALLOCATION VECTOR FOR DRIVE C DE07 ALV3 DS 75 ;ALLOCATION VECTOR FOR DRIVE D DE52 CSV0 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE A DE92 CSV1 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE B DED2 CSV2 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE C DF12 CSV3 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE D DF52 DIRBUF DS 128 ;DIRECTORY BUFFER DFD2 END