CP/M MACRO ASSEM 2.0 #001 CBIOS FOR MY SYSTEM: 28 APR 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: 28 APR 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: 28 APR 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: 28 APR 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 ***************************************************************** * * * 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 C3B6D3 JMP CBOOT ;COLD BOOT ENTRY POINT D303 C323D4 WBOOTE JMP WBOOT ;WARM BOOT ENTRY POINT D306 C36BD6 JMP CONST ;CONSOLE STATUS ROUTINE D309 C377D6 JMP CONIN ;CONSOLE INPUT D30C C38CD6 COUT JMP CONOUT ;CONSOLE OUTPUT D30F C3ACD6 JMP LIST ;LIST DEVICE OUTPUT D312 C3A1D6 JMP PUNCH ;PUNCH DEVICE OUTPUT D315 C397D6 JMP READER ;READER DEVICE INPUT D318 C3B7D4 JMP HOME ;HOME DRIVE D31B C3EDD4 JMP SETDRV ;SELECT DISK D31E C3B9D4 JMP SETTRK ;SET TRACK D321 C3ACD4 JMP SETSEC ;SET SECTOR D324 C3B1D4 JMP SETDMA ;SET DMA ADDRESS D327 C390D5 JMP READ ;READ THE DISK D32A C389D5 JMP WRITE ;WRITE THE DISK D32D C3B7D6 JMP LISTST ;LIST DEVICE STATUS D330 C3BED4 JMP SECTRAN ;SECTOR TRANSLATION D333 C31BE4 DJDRV JMP DJSEL ;HOOK FOR SINGLE.COM PROGRAM ***************************************************************** * * * SIGNON MESSAGE OUTPUT DURING COLD BOOT. * * * ***************************************************************** D336 0D0A0A PROMPT DB ACR,ALF,ALF D339 2A2A2A2A2A DB '**************************' D353 0D0A DB ACR,ALF D355 2020434350 DB ' CCPZ 56k CP/M V2.2 ' D36F 0D0A DB ACR,ALF D371 4D61737465 DB 'Master Catalog Disc: 001 ' D38A 0D0A DB ACR,ALF D38C 2A2A2A2A2A DB '**************************' D3A6 0D0A00 DB ACR,ALF,0 ***************************************************************** * * * UTILITY ROUTINE TO OUTPUT THE MESSAGE POINTED AT BY H&L, * * TERMINATED WITH A NULL. * * * ***************************************************************** CP/M MACRO ASSEM 2.0 #004 CBIOS FOR MY SYSTEM: 28 APR 82. D3A9 7E MESSAGE MOV A,M ;GET A CHARACTER OF THE MESSAGE D3AA 23 INX H ;BUMP TEXT POINTER D3AB A7 ANA A ;TEST FOR END D3AC C8 RZ ;RETURN IF DONE D3AD E5 PUSH H ;SAVE POINTER TO TEXT D3AE 4F MOV C,A ;OUTPUT CHARACTER IN C D3AF CD0CD3 CALL COUT ;OUTPUT THE CHARACTER D3B2 E1 POP H ;RESTORE THE POINTER D3B3 C3A9D3 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. * * * ***************************************************************** D3B6 310001 CBOOT LXI SP,TPA ;SET UP STACK D3B9 CD3BD7 CALL TINIT ;INITIALIZE THE TERMINAL D3BC 2136D3 LXI H,PROMPT ;PREP FOR SENDING SIGNON MESSAGE D3BF CDA9D3 CALL MESSAGE ;SEND THE PROMPT D3C2 AF XRA A ;SELECT DISK A D3C3 32D7D8 STA CPMDRV D3C6 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). * * * ***************************************************************** D3C9 218000 GOCPM LXI H,BUFF ;SET UP INITIAL DMA ADDRESS D3CC CDB1D4 CALL SETDMA D3CF 3EC3 MVI A,(JMP) ;INITIALIZE JUMP TO WARM BOOT D3D1 320000 STA WBOT D3D4 320500 STA ENTRY ;INITIALIZE JUMP TO BDOS D3D7 2103D3 LXI H,WBOOTE ;ADDRESS IN WARM BOOT JUMP D3DA 220100 SHLD WBOT+1 D3DD 2106C5 LXI H,BDOS+6 ;ADDRESS IN BDOS JUMP D3E0 220600 SHLD ENTRY+1 D3E3 AF XRA A ;A <- 0 D3E4 32DCD8 STA BUFSEC ;DISK JOCKEY BUFFER EMPTY D3E7 32FCD5 STA BUFWRTN ;SET BUFFER NOT DIRTY FLAG D3EA 3A0400 LDA CDISK ;JUMP TO CP/M WITH CURRENTLY SELECTED DISK IN C D3ED 4F MOV C,A D3EE 1111D4 LXI D,CMNDBEG ;BEGINNING OF INITIAL COMMAND D3F1 2108BD LXI H,CCP+8 ;COMMAND BUFFER D3F4 3E12 MVI A,CMNDEND-CMNDBEG+1 ;LENGTH OF COMMAND D3F6 3207BD STA CCP+7 D3F9 47 MOV B,A D3FA CD5ED6 CALL MOVLOP D3FD 3A0FD4 LDA CWFLG D400 A7 ANA A CP/M MACRO ASSEM 2.0 #005 CBIOS FOR MY SYSTEM: 28 APR 82. D401 3A10D4 LDA AUTOFLG D404 CA08D4 JZ CLDBOT D407 1F RAR D408 1F CLDBOT RAR D409 DA00BD JC CCP D40C C303BD JMP CCP+3 ;ENTER CP/M D40F 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. * * * ***************************************************************** D410 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. * * * ***************************************************************** D411 44554D4D59CMNDBEG DB 'DUMMYARG ANOTHER1' ;FOR DIRECT REPLACEMENT. D422 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. * * * ***************************************************************** D423 310001 WBOOT LXI SP,TPA ;SET UP STACK POINTER D426 3E01 MVI A,1 D427 = WFLG EQU $-1 ;TEST IF BEGINNING OR D428 A7 ANA A ; ENDING A WARM BOOT D429 3E01 MVI A,1 D42B 3227D4 STA WFLG D42E 320FD4 STA CWFLG ;SET COLD/WARM BOOT FLAG CP/M MACRO ASSEM 2.0 #006 CBIOS FOR MY SYSTEM: 28 APR 82. D431 CAC9D3 JZ GOCPM D434 AF XRA A D435 3227D4 STA WFLG D438 4F MOV C,A D439 CD33D3 CALL DJDRV ;SELECT DRIVE A D43C 0E00 MVI C,0 ;SELECT SINGLE DENSITY D43E CD2DE4 CALL DJDEN D441 0E00 MVI C,0 ;SELECT SIDE 0 D443 CD30E4 CALL DJSIDE D446 3E0F MVI A,15 ;INITIALIZE THE SECTOR TO READ D448 3266D4 STA NEWSEC D44B 2100BC LXI H,CCP-100H ;AND THE DMA ADDRESS D44E 2285D4 SHLD NEWDMA D451 CD65D4 CALL WARMLOD ;READ IN CP/M D454 0100C2 LXI B,CCP+500H ;LOAD ADDRESS FOR REST OF WARM BOOT D457 CD12E4 CALL DJDMA D45A 0E08 MVI C,8 D45C CD0FE4 CALL DJSEC D45F CD99D4 CALL WARMRD D462 C303C2 JMP CCP+503H D465 3E0F WARMLOD MVI A,15 ;PREVIOUS SECTOR D466 = NEWSEC EQU $-1 D467 3C INR A ;UPDATE THE PREVIOUS SECTOR D468 3C INR A D469 FE1B CPI 27 ;WAS IT THE LAST ? D46B DA7DD4 JC NOWRAP D46E D609 SUI 9 ;YES D470 FE13 CPI 19 D472 C8 RZ D473 2A85D4 LHLD NEWDMA D476 1180FB LXI D,-480H D479 19 DAD D D47A 2285D4 SHLD NEWDMA D47D 3266D4 NOWRAP STA NEWSEC ;SAVE THE NEW SECTOR TO READ D480 4F MOV C,A D481 CD0FE4 CALL DJSEC D484 2100BC LXI H,CCP-100H ;GET THE PREVIOUS DMA ADDRESS D485 = NEWDMA EQU $-2 D487 110001 LXI D,100H ;UPDATE THE DMA ADDRESS D48A 19 DAD D D48B 2285D4 SHLD NEWDMA ;SAVE THE DMA ADDRESS D48E 44 MOV B,H D48F 4D MOV C,L D490 CD12E4 CALL DJDMA ;SET THE DMA ADDRESS D493 CD99D4 CALL WARMRD D496 C365D4 JMP WARMLOD D499 01000A WARMRD LXI B,RETRIES*100H+0;MAXIMUM # OF ERRORS D49C C5 WRMREAD PUSH B D49D CD0CE4 CALL DJTRK ;SET THE TRACK D4A0 CD15E4 CALL DJREAD ;READ THE SECTOR D4A3 C1 POP B D4A4 D0 RNC ;CONTINUE IF SUCCESSFUL D4A5 05 DCR B D4A6 C29CD4 JNZ WRMREAD ;KEEP TRYING CP/M MACRO ASSEM 2.0 #007 CBIOS FOR MY SYSTEM: 28 APR 82. D4A9 C32AE4 JMP DJERR ***************************************************************** * * * SETSEC JUST SAVES THE DESIRED SECTOR TO SEEK TO UNTIL AN * * ACTUAL READ OR WRITE IS ATTEMPTED. * * * ***************************************************************** D4AC 79 SETSEC MOV A,C ;SAVE THE SECTOR NUMBER D4AD 32D6D8 STA CPMSEC ;CP/M SECTOR # D4B0 C9 RET ***************************************************************** * * * SETDMA SAVES THE DMA ADDRESS FOR THE DATA TRANSFER. * * * ***************************************************************** D4B1 60 SETDMA MOV H,B ;HL <- BC D4B2 69 MOV L,C D4B3 22DCD5 SHLD CPMDMA ;CP/M DMA ADDRESS D4B6 C9 RET ***************************************************************** * * * HOME IS TRANSLATED INTO A SEEK TO TRACK ZERO. * * * ***************************************************************** D4B7 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. * * * ***************************************************************** D4B9 79 SETTRK MOV A,C ;A <- TRACK # D4BA 32D8D8 STA CPMTRK ;CP/M TRACK # D4BD C9 RET ***************************************************************** * * * SECTRAN TRANSLATES A LOGICAL SECTOR # INTO A PHYSICAL SECTOR * * #. * * * ***************************************************************** D4BE 03 SECTRAN INX B D4BF D5 PUSH D ;SAVE TABLE ADDRESS D4C0 C5 PUSH B ;SAVE SECTOR # D4C1 CD68D5 CALL GETDPB ;GET DPB ADDRESS INTO HL D4C4 7E MOV A,M ;GET # OF CP/M SECTORS/TRACK D4C5 B7 ORA A ;CLEAR CARY CP/M MACRO ASSEM 2.0 #008 CBIOS FOR MY SYSTEM: 28 APR 82. D4C6 1F RAR ;DIVIDE BY TWO D4C7 91 SUB C D4C8 F5 PUSH PSW ;SAVE ADJUSTED SECTOR D4C9 FAD5D4 JM SIDETWO D4CC F1 SIDEA POP PSW ;DISCARD ADJUSTED SECTOR D4CD C1 POP B ;RESTORE SECTOR REQUESTED D4CE D1 POP D ;RESTOR ADDRESS OF XLT TABLE D4CF EB SIDEONE XCHG ;HL <- &(TRANSLATION TABLE) D4D0 09 DAD B ;BC = OFFSET INTO TABLE D4D1 6E MOV L,M ;HL <- PHYSICAL SECTOR D4D2 2600 MVI H,0 D4D4 C9 RET D4D5 010F00 SIDETWO LXI B,15 ;OFFSET TO SIDE BIT D4D8 09 DAD B D4D9 7E MOV A,M D4DA E608 ANI 8 ;TEST FOR DOUBLE SIDED D4DC CACCD4 JZ SIDEA ;MEDIA IS ONLY SINGLE SIDED D4DF F1 POP PSW ;RETRIEVE ADJUSTED SECTOR D4E0 C1 POP B D4E1 2F CMA ;MAKE SECTOR REQUEST POSITIVE D4E2 3C INR A D4E3 4F MOV C,A ;MAKE NEW SECTOR THE REQUESTED SECTOR D4E4 D1 POP D D4E5 CDCFD4 CALL SIDEONE D4E8 3E80 MVI A,80H ;SIDE TWO BIT D4EA B5 ORA L ; AND SECTOR D4EB 6F MOV L,A D4EC 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. * * * ***************************************************************** D4ED 79 SETDRV MOV A,C ;SAVE THE DRIVE # D4EE 32D7D8 STA CPMDRV D4F1 FE04 CPI MAXDISK ;CHECK FOR A VALID DRIVE # D4F3 D264D5 JNC ZRET ;ILLEGAL DRIVE # D4F6 7B MOV A,E ;TEST IF DRIVE EVER LOGGED IN BEFORE D4F7 E601 ANI 1 D4F9 C24BD5 JNZ SETDRV1 ;BIT 0 OF E = 0 -> NEVER SELECTED BEFORE D4FC 3E01 MVI A,1 ;SELECT SECTOR 1 OF TRACK 1 D4FE 32D9D8 STA TRUESEC D501 32D8D8 STA CPMTRK D504 CD47D6 CALL FILL ;FLUSH BUFFER AND REFILL D507 DA64D5 JC ZRET ;TEST FOR ERROR RETURN CP/M MACRO ASSEM 2.0 #009 CBIOS FOR MY SYSTEM: 28 APR 82. D50A CD27E4 CALL DJSTAT ;GET STATUS ON CURRENT DRIVE D50D E60C ANI 0CH ;STRIP OFF UNWANTED BITS D50F F5 PUSH PSW ;USED TO SELECT A DPB D510 1F RAR D511 2181D5 LXI H,XLTS ;TABLE OF XLT ADDRESSES D514 5F MOV E,A D515 1600 MVI D,0 D517 19 DAD D D518 E5 PUSH H ;SAVE POINTER TO PROPER XLT D519 CD68D5 CALL GETDPB ;GET DPH POINTER INTO DE D51C EB XCHG ; D51D D1 POP D D51E 0602 MVI B,2 ;NUMBER OF BYTES TO MOVE D520 CD5ED6 CALL MOVLOP ;MOVE THE ADDRESS OF XLT D523 110800 LXI D,8 ;OFFSET TO DPB POINTER D526 19 DAD D ;HL <- &DPH.DPB D527 E5 PUSH H D528 2A07E0 LHLD ORIGIN+7 ;GET ADDRESS OF DJ TERMINAL OUT ROUTINE D52B 23 INX H ;BUMP TO LOOK AT ADDRESS OF ; UART STATUS LOCATION D52C 7E MOV A,M D52D EE03 XRI 3 ;ADJUST FOR PROPER REV DJ D52F 6F MOV L,A D530 26E3 MVI H,(ORIGIN+300H)/100H D532 7E MOV A,M D533 E608 ANI DBLSID ;CHECK DOUBLE SIDED BIT D535 1116D8 LXI D,DPB128S ;BASE FOR SINGLE SIDED DPB'S D538 C23ED5 JNZ SIDEOK D53B 1156D8 LXI D,DPB128D ;BASE OF DOUBLE SIDED DPB'S D53E EB SIDEOK XCHG ;HL <- DBP BASE, DE <- &DPH.DPB D53F D1 POP D ;RESTORE DE (POINTER INTO DPH) D540 F1 POP PSW ;OFFSET TO CORRECT DPB D541 17 RAL D542 17 RAL D543 4F MOV C,A D544 0600 MVI B,0 D546 09 DAD B D547 EB XCHG ;PUT DPB ADDRESS IN DPH D548 73 MOV M,E D549 23 INX H D54A 72 MOV M,D D54B CD68D5 SETDRV1 CALL GETDPB ;GET ADDRESS OF DPB IN HL D54E 010F00 LXI B,15 ;OFFSET TO SECTOR SIZE D551 09 DAD B D552 7E MOV A,M ;GET SECTOR SIZE D553 E607 ANI 7H D555 3295D5 STA SECSIZ D558 7E MOV A,M D559 1F RAR D55A 1F RAR D55B 1F RAR D55C 1F RAR D55D E60F ANI 0FH D55F 32CBD5 STA SECPSEC D562 EB XCHG ;HL <- DPH D563 C9 RET CP/M MACRO ASSEM 2.0 #010 CBIOS FOR MY SYSTEM: 28 APR 82. D564 210000 ZRET LXI H,0 ;SELDRV ERROR EXIT D567 C9 RET ***************************************************************** * * * GETDPB RETURNS HL POINTING TO THE DPB OF THE CURRENTLY * * SELECTED DRIVE, DE POINTING TO DPH. * * * ***************************************************************** D568 3AD7D8 GETDPB LDA CPMDRV ;GET DRIVE # D56B 6F MOV L,A ;FORM OFFSET D56C 2600 MVI H,0 D56E 29 DAD H D56F 29 DAD H D570 29 DAD H D571 29 DAD H D572 1196D8 LXI D,DPZERO ;BASE OF DPH'S D575 19 DAD D D576 E5 PUSH H ;SAVE ADDRESS OF DPH D577 110A00 LXI D,10 ;OFFSET TO DPB D57A 19 DAD D D57B 7E MOV A,M ;GET LOW BYTE OF DPB ADDRESS D57C 23 INX H D57D 66 MOV H,M ;GET LOW BYTE OF DPB D57E 6F MOV L,A D57F D1 POP D D580 C9 RET ***************************************************************** * * * XLTS IS A TABLE OF ADDRESS THAT POINT TO EACH OF THE XLT * * TABLES FOR EACH SECTOR SIZE. * * * ***************************************************************** D581 48D7 XLTS DW XLT128 ;XLT FOR 128 BYTE SECTORS D583 63D7 DW XLT256 ;XLT FOR 256 BYTE SECTORS D585 98D7 DW XLT512 ;XLT FOR 512 BYTE SECTORS D587 D5D7 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. * * * ***************************************************************** D589 79 WRITE MOV A,C ;SAVE WRITE COMMAND TYPE D58A 32F3D5 STA WRITTYP CP/M MACRO ASSEM 2.0 #011 CBIOS FOR MY SYSTEM: 28 APR 82. D58D 3E01 MVI A,1 ;SET WRITE COMMAND D58F 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. * * * ***************************************************************** D590 AF READ XRA A ;SET THE COMMAND TYPE TO READ D591 32DFD5 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. * * * ***************************************************************** D594 0600 REDWRT MVI B,0 ;THE 0 IS MODIFIED TO CONTAIN THE LOG2 D595 = SECSIZ EQU $-1 ; OF THE PHYSICAL SECTOR SIZE/128 ; ON THE CURRENTLY SELECTED DISK. D596 3AD6D8 LDA CPMSEC ;GET THE DESIRED CP/M SECTOR # D599 F5 PUSH PSW ;TEMPORARY SAVE D59A E680 ANI 80H ;SAVE ONLY THE SIDE BIT D59C 4F MOV C,A ;REMEMBER THE SIDE D59D F1 POP PSW ;GET THE SECTOR BACK D59E E67F ANI 7FH ;FORGET THE SIDE BIT D5A0 3D DCR A ;TEMPORARY ADJUSTMENT D5A1 05 DIVLOOP DCR B ;UPDATE REPEAT COUNT D5A2 CAAAD5 JZ DIVDONE D5A5 B7 ORA A ;CLEAR THE CARY FLAG D5A6 1F RAR ;DIVIDE THE CP/M SECTOR # BY THE SIZE ; OF THE PHYSICAL SECTORS D5A7 C3A1D5 JMP DIVLOOP ; D5AA 3C DIVDONE INR A D5AB B1 ORA C ;RESTORE THE SIDE BIT D5AC 32D9D8 STA TRUESEC ;SAVE THE PHYSICAL SECTOR NUMBER D5AF 21D7D8 LXI H,CPMDRV ;POINTER TO DESIRED DRIVE,TRACK, AND SECTOR D5B2 11DAD8 LXI D,BUFDRV ;POINTER TO BUFFER DRIVE,TRACK, AND SECTOR D5B5 0604 MVI B,4 ;COUNT LOOP D5B7 05 DTSLOP DCR B ;TEST IF DONE WITH COMPARE D5B8 CAC6D5 JZ MOVE ;YES, MATCH. GO MOVE THE DATA D5BB 1A LDAX D ;GET A BYTE TO COMPARE D5BC BE CMP M ;TEST FOR MATCH CP/M MACRO ASSEM 2.0 #012 CBIOS FOR MY SYSTEM: 28 APR 82. D5BD 23 INX H ;BUMP POINTERS TO NEXT DATA ITEM D5BE 13 INX D D5BF CAB7D5 JZ DTSLOP ;MATCH, CONTINUE TESTING ***************************************************************** * * * DRIVE, TRACK, AND SECTOR DON'T MATCH, FLUSH THE BUFFER IF * * NECESSARY AND THEN REFILL. * * * ***************************************************************** D5C2 CD47D6 CALL FILL ;FILL THE BUFFER WITH CORRECT PHYSICAL SECTOR D5C5 D8 RC ;NO GOOD, RETURN WITH ERROR INDICATION ***************************************************************** * * * MOVE HAS BEEN MODIFIED TO CAUSE EITHER A TRANSFER INTO OR OUT * * THE BUFFER. * * * ***************************************************************** D5C6 3AD6D8 MOVE LDA CPMSEC ;GET THE CP/M SECTOR TO TRANSFER D5C9 3D DCR A ;ADJUST TO PROPER SECTOR IN BUFFER D5CA E600 ANI 0 ;STRIP OFF HIGH ORDERED BITS D5CB = SECPSEC EQU $-1 ;THE 0 IS MODIFIED TO REPRESENT THE # OF ; CP/M SECTORS PER PHYSICAL SECTORS D5CC 6F MOV L,A ;PUT INTO HL D5CD 2600 MVI H,0 D5CF 29 DAD H ;FORM OFFSET INTO BUFFER D5D0 29 DAD H D5D1 29 DAD H D5D2 29 DAD H D5D3 29 DAD H D5D4 29 DAD H D5D5 29 DAD H D5D6 11DDD8 LXI D,BUFFER ;BEGINNING ADDRESS OF BUFFER D5D9 19 DAD D ;FORM BEGINNING ADDRESS OF SECTOR TO TRANSFER D5DA EB XCHG ;DE = ADDRESS IN BUFFER D5DB 210000 LXI H,0 ;GET DMA ADDRESS, THE 0 IS MODIFIED TO ; CONTAIN THE DMA ADDRESS D5DC = CPMDMA EQU $-2 D5DE 3E00 MVI A,0 ;THE ZERO GETS MODIFIED TO CONTAIN ; A ZERO IF A READ, OR A 1 IF WRITE D5DF = RDWR EQU $-1 D5E0 A7 ANA A ;TEST WHICH KIND OF OPERATION D5E1 C2E9D5 JNZ INTO ;TRANSFER DATA INTO THE BUFFER D5E4 CD5CD6 OUTOF CALL MOVER D5E7 AF XRA A D5E8 C9 RET D5E9 EB INTO XCHG ; D5EA CD5CD6 CALL MOVER ;MOVE THE DATA, HL = DESTINATION ; DE = SOURCE D5ED 3E01 MVI A,1 D5EF 32FCD5 STA BUFWRTN ;SET BUFFER WRITTEN INTO FLAG D5F2 3E00 MVI A,0 ;CHECK FOR DIRECTORY WRITE CP/M MACRO ASSEM 2.0 #013 CBIOS FOR MY SYSTEM: 28 APR 82. D5F3 = WRITTYP EQU $-1 D5F4 3D DCR A D5F5 3E00 MVI A,0 D5F7 32F3D5 STA WRITTYP ;SET NO DIRECTORY WRITE D5FA C0 RNZ ;NO ERROR EXIT ***************************************************************** * * * FLUSH WRITES THE CONTENTS OF THE BUFFER OUT TO THE DISK IF * * IT HAS EVER BEEN WRITTEN INTO. * * * ***************************************************************** D5FB 3E00 FLUSH MVI A,0 ;THE 0 IS MODIFIED TO REFLECT IF ; THE BUFFER HAS BEEN WRITTEN INTO D5FC = BUFWRTN EQU $-1 D5FD A7 ANA A ;TEST IF WRITTEN INTO D5FE C8 RZ ;NOT WRITTEN, ALL DONE D5FF 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. * * * ***************************************************************** D602 AF PREP XRA A ;RESET BUFFER WRITTEN FLAG D603 32FCD5 STA BUFWRTN D606 2239D6 SHLD RETRYOP ;SET UP THE READ/WRITE OPERATION D609 060A MVI B,RETRIES ;MAXIMUM NUMBER OF RETRIES TO ATTEMPT D60B C5 RETRYLP PUSH B ;SAVE THE RETRY COUNT D60C 3ADAD8 LDA BUFDRV ;GET DRIVE NUMBER INVOLVED IN THE OPERATION D60F 4F MOV C,A D610 CD33D3 CALL DJDRV ;SELECT THE DRIVE D613 3ADBD8 LDA BUFTRK D616 A7 ANA A ;TEST FOR TRACK ZERO D617 4F MOV C,A D618 C5 PUSH B D619 CC09E4 CZ DJHOME ;HOME THE DRIVE IF TRACK 0 D61C C1 POP B ;RESTORE TRACK # D61D CD0CE4 CALL DJTRK ;SEEK TO PROPER TRACK D620 3ADCD8 LDA BUFSEC ;GET SECTOR INVOLVED IN OPERATION D623 F5 PUSH PSW ;SAVE THE SECTOR # D624 07 RLC ;BIT 0 OF A EQUALS SIDE # D625 E601 ANI 1 ;STRIP OFF UNNECESSARY BITS D627 4F MOV C,A ;C <- SIDE # D628 CD30E4 CALL DJSIDE ;SELECT THE SIDE D62B F1 POP PSW ;A <- SECTOR # D62C E67F ANI 7FH ;STRIP OFF SIDE BIT D62E 4F MOV C,A ;C <- SECTOR # D62F CD0FE4 CALL DJSEC ;SET THE SECTOR TO TRANSFER D632 01DDD8 LXI B,BUFFER ;SET THE DMA ADDRESS D635 CD12E4 CALL DJDMA D638 CD15E4 CALL DJREAD ;THE READ OPERATION IS MODIFIED TO WRITE CP/M MACRO ASSEM 2.0 #014 CBIOS FOR MY SYSTEM: 28 APR 82. D639 = RETRYOP EQU $-2 D63B C1 POP B ;RESTORE THE RETRY COUNTER D63C 3E00 MVI A,0 ;NO ERROR EXIT STATUS D63E D0 RNC ;RETURN NO ERROR D63F 05 DCR B ;UPDATE THE RETRY COUNTER D640 37 STC ;ASSUME RETRY COUNT EXPIRED D641 3EFF MVI A,0FFH ;ERROR RETURN D643 C8 RZ D644 C30BD6 JMP RETRYLP ;TRY AGAIN ***************************************************************** * * * FILL FILLS THE BUFFER WITH A NEW SECTOR FROM THE DISK. * * * ***************************************************************** D647 CDFBD5 FILL CALL FLUSH ;FLUSH BUFFER FIRST D64A D8 RC ;CHECK FOR ERROR D64B 11D7D8 LXI D,CPMDRV ;UPDATE THE DRIVE, TRACK, AND SECTOR D64E 21DAD8 LXI H,BUFDRV D651 0603 MVI B,3 ;NUMBER OF BYTES TO MOVE D653 CD5ED6 CALL MOVLOP ;COPY THE DATA D656 2115E4 LXI H,DJREAD D659 C302D6 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. * * * ***************************************************************** D65C 0680 MOVER MVI B,128 ;LENGTH OF TRANSFER D65E 1A MOVLOP LDAX D ;GET A BTE OF SOURCE D65F 77 MOV M,A ;MOVE IT D660 13 INX D ;BUMP POINTERS D661 23 INX H D662 05 DCR B ;UPDATE COUNTER D663 C25ED6 JNZ MOVLOP ;CONTINUE MOVING UNTIL DONE D666 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. * * * ***************************************************************** CP/M MACRO ASSEM 2.0 #015 CBIOS FOR MY SYSTEM: 28 APR 82. FF2B = CITTY EQU 0FF2BH ;INPUT FROM VIO ROUTINES. FCBE = COTTY EQU 0FCBEH ;OUTPUT FROM VIO ROUTINES> D667 79 VIDEO MOV A,C ;LOAD THE CHARACTER D668 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. * * * ***************************************************************** D66B 21E5D6 CONST LXI H,CSTBLE ;BEGINNING OF JUMP TABLE D66E C37DD6 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. * * * ***************************************************************** D671 21EDD6 CSREADR LXI H,CSRTBLE ;BEGINNING OF READER STATUS TABLE D674 C39AD6 JMP READERA ***************************************************************** * * * CONIN: TAKE THE CORRECT JUMP FOR THE CONSOLE INPUT ROUTINE. * * THE JUMP IS BASED ON THE TWO LEAST SIGNIFICANT BITS OF * * IOBYTE. * * * ***************************************************************** D677 CDFBD5 CONIN CALL FLUSH ;FLUSH THE DISK BUFFER D67A 21BDD6 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. * D67D 3A0300 CONIN1 LDA IOBYTE D680 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. * D681 E606 SELDEV ANI 6H ;STRIP OFF UNWANTED BITS D683 1600 MVI D,0 ;FORM OFFSET D685 5F MOV E,A CP/M MACRO ASSEM 2.0 #016 CBIOS FOR MY SYSTEM: 28 APR 82. D686 19 DAD D ;ADD OFFSET D687 7E MOV A,M ;PICK UP HIGH BYTE D688 23 INX H D689 66 MOV H,M ;PICK UP LOW BYTE D68A 6F MOV L,A ;FORM ADDRESS D68B E9 PCHL ;GO THERE ! ***************************************************************** * * * CONOUT: TAKE THE PROPER BRANCH ADDRESS BASED ON THE TWO LEAST * * SIGNIFICANT BITS OF IOBYTE. * * * ***************************************************************** D68C C5 CONOUT PUSH B ;SAVE THE CHARACTER D68D CDFBD5 CALL FLUSH ;FLUSH THE DISK BUFFER D690 C1 POP B ;RESTORE THE CHARACTER D691 21C5D6 LXI H,COTBLE ;BEGINNING OF THE CHARACTER OUT TABLE D694 C37DD6 JMP CONIN1 ;DO THE DECODE ***************************************************************** * * * READER: SELECT THE CORRECT READER DEVICE FOR INPUT. THE * * READER IS SELECTED FROM BITS 2 AND 3 OF IOBYTE. * * * ***************************************************************** D697 21DDD6 READER LXI H,RTBLE ;BEGINNING OF READER INPUT TABLE * * ENTRY AT READERA WILL DECODE BITS 2 & 3 OF IOBYTE, USED * BY CSREADER. * D69A 3A0300 READERA LDA IOBYTE * * ENTRY AT READER1 WILL SHIFT THE BITS INTO POSITION, USED * BY LIST AND PUNCH. * D69D 1F READR1 RAR D69E C381D6 JMP SELDEV ***************************************************************** * * * PUNCH: SELECT THE CORRECT PUNCH DEVICE. THE SELECTION COMES * * FROM BITS 4&5 OF IOBYTE. * * * ***************************************************************** D6A1 21D5D6 PUNCH LXI H,PTBLE ;BEGINNING OF PUNCH TABLE D6A4 3A0300 LDA IOBYTE * * ENTRY AT PNCH1 ROTATES BITS A LITTLE MORE IN PREP FOR CP/M MACRO ASSEM 2.0 #017 CBIOS FOR MY SYSTEM: 28 APR 82. * SELDEV, USED BY LIST. * D6A7 1F PNCH1 RAR D6A8 1F RAR D6A9 C39DD6 JMP READR1 ***************************************************************** * * * LIST: SELECT A LIST DEVICE BASED ON BITS 6&7 OF IOBYTE * * * ***************************************************************** D6AC 21CDD6 LIST LXI H,LTBLE ;BEGINNING OF THE LIST DEVICE ROUTINES D6AF 3A0300 LIST1 LDA IOBYTE D6B2 1F RAR D6B3 1F RAR D6B4 C3A7D6 JMP PNCH1 ***************************************************************** * * * LISTST: GET THE STATUS OF THE CURRENTLY ASSIGNED LIST DEVICE * * * ***************************************************************** D6B7 21F5D6 LISTST LXI H,LSTBLE ;BEGINNING OF THE LIST DEVICE STATUS D6BA C3AFD6 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 * D6BD 0ED7 CITBLE DW CIUC1 ;INPUT FROM KEYBOARD (PARALLEL PORT ; 02H, STATUS PORT 03H). D6BF 0ED7 DW CICRT ;SAME PARAMETERS AS THE PREVIOUS ; ENTRY FOR CIUC1. D6C1 97D6 DW READER ;INPUT FROM READER (DEPENDS ON READER ; SELECTION) D6C3 0ED7 DW CIUC1 ;SAME PARAMETERS AS THE PREVIOUS ; ENTRY> * * CONSOLE OUTPUT TABLE * D6C5 67D6 COTBLE DW VIDEO ;OUTPUT TO THE DISPLAY SCREEN VIA ; THE VIO ROUTINE. CP/M MACRO ASSEM 2.0 #018 CBIOS FOR MY SYSTEM: 28 APR 82. D6C7 FDD6 DW COCRT ;OUTPUT TO THE PRINTER - PRESENTLY ; THE SELECTRIC. D6C9 ACD6 DW LIST ;OUTPUT TO LIST DEVICE (DEPENDS ON ; BITS 6&7 OF IOBYTE) D6CB FDD6 DW COUC1 ;OUTPUT TO USER CONSOLE 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * LIST DEVICE TABLE * D6CD FDD6 LTBLE DW COLPT ;OUTPUT TO THE PRINTER: PRESENTLY ; THE SELECTRIC. D6CF FDD6 DW COCRT ;OUTPUT TO CRT (CURRENTLY SWITCHBOARD ; SERIAL PORT 1) D6D1 FDD6 DW COLPT ;OUTPUT TO LINE PRINTER (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) D6D3 FDD6 DW COLPT ;OUTPUT TO USER LINE PRINTER 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * PUNCH DEVICE TABLE * D6D5 1AD7 PTBLE DW COPTP ;OUTPUT TO THE PUNCH ROUTINE ; USING 02H AND ECHO. D6D7 1AD7 DW COPTP ; SAME. ; D6D9 FDD6 DW COUP1 ; SAME. ; D6DB FDD6 DW COUP2 ; SAME. ; * * READER DEVICE INPUT TABLE * D6DD 1ED7 RTBLE DW CIDJC ;INPUT FROM TTY (CURRENTLY ASSIGNED ; BY INTIOBY, INPUT FROM 2D) D6DF 0ED7 DW CIPTR ;INPUT FROM PAPER TAPE READER (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) D6E1 0ED7 DW CIUR1 ;INPUT FROM USER READER 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) D6E3 0ED7 DW CIUR2 ;INPUT FROM USER READER 2 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * CONSOLE STATUS TABLE * D6E5 2AD7 CSTBLE DW CSCRT ;STATUS FROM KEYBOARD - ASSIGNED TO ; PORT02H, STATUS 03H. D6E7 2AD7 DW CSCRT ;SAME AS ABOVE. ; D6E9 71D6 DW CSREADR ;STATUS FROM READER (DEPENDS ON READER DEVICE ) D6EB 2AD7 DW CSUC1 ;STATUS FROM USER CONSOLE 1 (CURRENTLY CP/M MACRO ASSEM 2.0 #019 CBIOS FOR MY SYSTEM: 28 APR 82. ; SWITCHBOARD SERIAL PORT 1) * * STATUS FROM READER DEVICE * D6ED 22D7 CSRTBLE DW CSTTY ;STATUS FROM TTY (CURRENTLY ASSIGNED ; BY INTIOBY, STATUS OF 2D) D6EF 2AD7 DW CSPTR ;STATUS FROM PAPER TAPE READER (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) D6F1 2AD7 DW CSUR1 ;STATUS FROM USER READER 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) D6F3 2AD7 DW CSUR2 ;STATUS OF USER READER 2 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * STATUS FROM LIST DEVICE * D6F5 38D7 LSTBLE DW READY ;CONSOLE ALWAYS READY D6F7 38D7 DW READY ;GET LIST STATUS D6F9 33D7 DW LSLPT D6FB 33D7 DW LSLPT ***************************************************************** * * * THE FOLLOWING EQUATES SET OUTPUT DEVICE TO OUTPUT TO THE * * ESCON CONVERSION INTERFACE AT PORT 1. * * * ***************************************************************** ; PRINT D6FD = COCRT EQU $ ;OUTPUT FROM CRT D6FD = COUC1 EQU $ ;OUTPUT FROM USER CONSOLE 1 D6FD = COUC2 EQU $ D6FD = COUP1 EQU $ ;OUTPUT FROM USER PUNCH 1 D6FD = COUP2 EQU $ ;OUTPUT FROM USER PUNCH 2 D6FD DB03 COLPT IN 3 D6FF E608 ANI 8 D701 CAFDD6 JZ COLPT D704 79 MOV A,C D705 D301 OUT 1 D707 D304 OUT 4 D709 3E00 MVI A,00 D70B D301 OUT 1 D70D C9 RET ***************************************************************** * * * THE FOLLOWING EQUATES SET THE INPUT FROM THE DEVICES TO COME * * FROM THE SWITCHBOARD SERIAL PORT 1. * * * ***************************************************************** ;INPUT CP/M MACRO ASSEM 2.0 #020 CBIOS FOR MY SYSTEM: 28 APR 82. D70E = CIUC1 EQU $ ;INPUT FROM USER CONSOLE 1 D70E = CICRT EQU $ ;INPUT FROM CRT D70E = CIUR1 EQU $ ;INPUT FROM USER READER 1 D70E = CIUR2 EQU $ ;INPUT FROM USER READER 2 D70E DB03 CIPTR IN 03H D710 E602 ANI 02H D712 CA0ED7 JZ CIPTR D715 DB02 IN 02H D717 E67F ANI 7FH D719 C9 RET ***************************************************************** * * * OUTPUT TO PAPER TAPE PUNCH ROUTINE * * * ***************************************************************** ; PUNCH D71A CD06E4 COPTP CALL DJCOUT D71D C9 RET ***************************************************************** * * * CONSOLE STATUS ROUTINES, TEST IF A CHARACTER HAS ARRIVED. * * * ***************************************************************** ; READER D71E CD03E4 CIDJC CALL DJCIN D721 C9 RET ; CONSTAT D722 CD21E4 CSTTY CALL DJTSTAT ;STATUS FROM DISK JOCKEY 2D D725 3E00 STAT MVI A,0 ;PREP FOR ZERO RETURN D727 C0 RNZ ;NOTHING FOUND D728 3D DCR A ;RETURN WITH 0FFH D729 C9 RET ***************************************************************** * * * THE FOLLOWING EQUATES CAUSE THE DEVICES TO GET STATUS FROM * * THE SWITCHBOARD SERIAL PORT 1. * * * ***************************************************************** CP/M MACRO ASSEM 2.0 #021 CBIOS FOR MY SYSTEM: 28 APR 82. D72A = CSUR1 EQU $ ;STATUS OF USER READER 1 D72A = CSUR2 EQU $ ;STATUS OF USER READER 2 D72A = CSPTR EQU $ ;STATUS OF PAPER TAPE READER D72A = CSUC1 EQU $ ;STATUS OF USER CONSOLE 1 D72A DB03 CSCRT IN 03H D72C E602 ANI 02H D72E EE02 XRI 02H D730 C325D7 JMP STAT ***************************************************************** * * * LIST DEVICE STATUS ROUTINES. * * * ***************************************************************** D733 DB03 LSLPT IN 03H D735 E601 ANI 01H D737 C8 RZ D738 3EFF READY MVI A,0FFH D73A C9 RET ***************************************************************** * * * TINIT CAN BE MODIFIED FOR DIFFERENT I/O SETUPS. * * * ***************************************************************** D73B 0E1A TINIT MVI C,CLEAR ;INITIALIZE THE TERMINAL ROUTINE D73D 3E00 MVI A,INTIOBY ;INITIALIZE IOBYTE D73F 320300 STA IOBYTE D742 CD00F8 CALL 0F800H ;INITIALIZE THE VIO/C BOARD. D745 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. * * * ***************************************************************** D748 00 XLT128 DB 0 D749 01070D1319 DB 1,7,13,19,25 D74E 050B1117 DB 5,11,17,23 D752 03090F15 DB 3,9,15,21 D756 02080E141A DB 2,8,14,20,26 D75B 060C1218 DB 6,12,18,24 D75F 040A1016 DB 4,10,16,22 D763 00 XLT256 DB 0 D764 0102131425 DB 1,2,19,20,37,38 D76A 0304151627 DB 3,4,21,22,39,40 CP/M MACRO ASSEM 2.0 #022 CBIOS FOR MY SYSTEM: 28 APR 82. D770 0506171829 DB 5,6,23,24,41,42 D776 0708191A2B DB 7,8,25,26,43,44 D77C 090A1B1C2D DB 9,10,27,28,45,46 D782 0B0C1D1E2F DB 11,12,29,30,47,48 D788 0D0E1F2031 DB 13,14,31,32,49,50 D78E 0F10212233 DB 15,16,33,34,51,52 D794 11122324 DB 17,18,35,36 D798 00 XLT512 DB 0 D799 0102030411 DB 1,2,3,4,17,18,19,20 D7A1 2122232431 DB 33,34,35,36,49,50,51,52 D7A9 0506070815 DB 5,6,7,8,21,22,23,24 D7B1 2526272835 DB 37,38,39,40,53,54,55,56 D7B9 090A0B0C19 DB 9,10,11,12,25,26,27,28 D7C1 292A2B2C39 DB 41,42,43,44,57,58,59,60 D7C9 0D0E0F101D DB 13,14,15,16,29,30,31,32 D7D1 2D2E2F30 DB 45,46,47,48 D7D5 00 XLT124 DB 0 D7D6 0102030405 DB 1,2,3,4,5,6,7,8 D7DE 191A1B1C1D DB 25,26,27,28,29,30,31,32 D7E6 3132333435 DB 49,50,51,52,53,54,55,56 D7EE 090A0B0C0D DB 9,10,11,12,13,14,15,16 D7F6 2122232425 DB 33,34,35,36,37,38,39,40 D7FE 393A3B3C3D DB 57,58,59,60,61,62,63,64 D806 1112131415 DB 17,18,19,20,21,22,23,24 D80E 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. * * * ***************************************************************** D816 1A00 DPB128S DW 26 ;CP/M SECTORS/TRACK D818 03 DB 3 ;BSH D819 07 DB 7 ;BLM D81A 00 DB 0 ;EXM D81B F200 DW 242 ;DSM D81D 3F00 DW 63 ;DRM D81F C0 DB 0C0H ;AL0 D820 00 DB 0 ;AL1 D821 1000 DW 16 ;CKS D823 0200 DW 2 ;OFF D825 01 DB 1H ;16*((#CPM SECTORS/PHYSICAL SECTOR) -1) + CP/M MACRO ASSEM 2.0 #023 CBIOS FOR MY SYSTEM: 28 APR 82. ;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. * * * ***************************************************************** D826 3400 DPB256S DW 52 ;CP/M SECTORS/TRACK D828 04 DB 4 ;BSH D829 0F DB 15 ;BLM D82A 00 DB 0 ;EXM D82B F200 DW 242 ;DSM D82D 7F00 DW 127 ;DRM D82F C0 DB 0C0H ;AL0 D830 00 DB 0 ;AL1 D831 2000 DW 32 ;CKS D833 0200 DW 2 ;OFF D835 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. * * * ***************************************************************** D836 3C00 DPB512S DW 60 ;CP/M SECTORS/TRACK D838 04 DB 4 ;BSH D839 0F DB 15 ;BLM D83A 00 DB 0 ;EXM D83B 1801 DW 280 ;DSM D83D 7F00 DW 127 ;DRM D83F C0 DB 0C0H ;AL0 D840 00 DB 0 ;AL1 D841 2000 DW 32 ;CKS D843 0200 DW 2 ;OFF D845 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. * * * ***************************************************************** D846 4000 DP1024S DW 64 ;CP/M SECTORS/TRACK D848 04 DB 4 ;BSH D849 0F DB 15 ;BLM D84A 00 DB 0 ;EXM CP/M MACRO ASSEM 2.0 #024 CBIOS FOR MY SYSTEM: 28 APR 82. D84B 2B01 DW 299 ;DSM D84D 7F00 DW 127 ;DRM D84F C0 DB 0C0H ;AL0 D850 00 DB 0 ;AL1 D851 2000 DW 32 ;CKS D853 0200 DW 2 ;OFF D855 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. * * * ***************************************************************** D856 3400 DPB128D DW 52 ;CP/M SECTORS/TRACK D858 04 DB 4 ;BSH D859 0F DB 15 ;BLM D85A 01 DB 1 ;EXM D85B F200 DW 242 ;DSM D85D 7F00 DW 127 ;DRM D85F C0 DB 0C0H ;AL0 D860 00 DB 0 ;AL1 D861 2000 DW 32 ;CKS D863 0200 DW 2 ;OFF D865 09 DB 9H ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 256 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** D866 6800 DPB256D DW 104 ;CP/M SECTORS/TRACK D868 04 DB 4 ;BSH D869 0F DB 15 ;BLM D86A 00 DB 0 ;EXM D86B E601 DW 486 ;DSM D86D FF00 DW 255 ;DRM D86F F0 DB 0F0H ;AL0 D870 00 DB 0 ;AL1 D871 4000 DW 64 ;CKS D873 0200 DW 2 ;OFF D875 1A DB 1AH ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 512 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** D876 7800 DPB512D DW 120 ;CP/M SECTORS/TRACK CP/M MACRO ASSEM 2.0 #025 CBIOS FOR MY SYSTEM: 28 APR 82. D878 04 DB 4 ;BSH D879 0F DB 15 ;BLM D87A 00 DB 0 ;EXM D87B 3102 DW 561 ;DSM D87D FF00 DW 255 ;DRM D87F F0 DB 0F0H ;AL0 D880 00 DB 0 ;AL1 D881 4000 DW 64 ;CKS D883 0200 DW 2 ;OFF D885 3B DB 3BH ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 1024 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** D886 8000 DP1024D DW 128 ;CP/M SECTORS/TRACK D888 04 DB 4 ;BSH D889 0F DB 15 ;BLM D88A 00 DB 0 ;EXM D88B 5702 DW 599 ;DSM D88D FF00 DW 255 ;DRM D88F F0 DB 0F0H ;AL0 D890 00 DB 0 ;AL1 D891 4000 DW 64 ;CKS D893 0200 DW 2 ;OFF D895 7C DB 7CH ***************************************************************** * * * CP/M DISK PARAMETER HEADERS, UNITIALIZED. * * * ***************************************************************** D896 0000 DPZERO DW 0 ;ADDRESS OF TRANSLATION TABLE (FILLED ; IN BY SETDRV) D898 0000000000 DW 0,0,0 ;USED BY BDOS D89E 09DF DW DIRBUF ;ADDRESS OF DIRECTORY BUFFER D8A0 0000 DW 0 ;ADDRESS OF DPB (FILLED IN BY SETDRV) D8A2 09DE DW CSV0 ;DIRECTORY CHECK VECTOR D8A4 DDDC DW ALV0 ;ALLOCATION VECTOR D8A6 0000 DPONE DW 0 D8A8 0000000000 DW 0,0,0 D8AE 09DF DW DIRBUF D8B0 0000 DW 0 D8B2 49DE DW CSV1 D8B4 28DD DW ALV1 D8B6 0000 DPTWO DW 0 D8B8 0000000000 DW 0,0,0 D8BE 09DF DW DIRBUF D8C0 0000 DW 0 D8C2 89DE DW CSV2 CP/M MACRO ASSEM 2.0 #026 CBIOS FOR MY SYSTEM: 28 APR 82. D8C4 73DD DW ALV2 D8C6 0000 DPTHRE DW 0 D8C8 0000000000 DW 0,0,0 D8CE 09DF DW DIRBUF D8D0 0000 DW 0 D8D2 C9DE DW CSV3 D8D4 BEDD DW ALV3 ***************************************************************** * * * CBIOS RAM LOCATIONS THAT DON'T NEED INITIALIZATION. * * * ***************************************************************** D8D6 00 CPMSEC DB 0 ;CP/M SECTOR # D8D7 00 CPMDRV DB 0 ;CP/M DRIVE # D8D8 00 CPMTRK DB 0 ;CP/M TRACK # D8D9 00 TRUESEC DB 0 ;DISK JOCKEY SECTOR THAT CONTAINS CP/M SECTOR D8DA 00 BUFDRV DB 0 ;DRIVE THAT BUFFER BELONGS TO D8DB 00 BUFTRK DB 0 ;TRACK THAT BUFFER BELONGS TO D8DC 00 BUFSEC DB 0 ;SECTOR THAT BUFFER BELONGS TO D8DD BUFFER DS 1024 ;MAXIMUM SIZE BUFFER FOR 1K SECTORS DCDD ALV0 DS 75 ;ALLOCATION VECTOR FOR DRIVE A DD28 ALV1 DS 75 ;ALLOCATION VECTOR FOR DRIVE B DD73 ALV2 DS 75 ;ALLOCATION VECTOR FOR DRIVE C DDBE ALV3 DS 75 ;ALLOCATION VECTOR FOR DRIVE D DE09 CSV0 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE A DE49 CSV1 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE B DE89 CSV2 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE C DEC9 CSV3 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE D DF09 DIRBUF DS 128 ;DIRECTORY BUFFER DF89 END