CP/M MACRO ASSEM 2.0 #001 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. ;VERSION OF 6 NOV 94 ***************************************************************** * * * 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 RLEEs SYSTEM: 06 NOV 94.' ***************************************************************** * * * 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 RLEEs SYSTEM: 06 NOV 94. ***************************************************************** * * * 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 CP/M MACRO ASSEM 2.0 #003 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. 000A = ALF EQU 0AH ;A LINE FEED 0003 = AETX EQU 3 ;A ETX CHAR 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 C39DD3 JMP CBOOT ;COLD BOOT ENTRY POINT D303 C30AD4 WBOOTE JMP WBOOT ;WARM BOOT ENTRY POINT D306 C34ED6 JMP CONST ;CONSOLE STATUS ROUTINE D309 C35AD6 JMP CONIN ;CONSOLE INPUT D30C C36FD6 COUT JMP CONOUT ;CONSOLE OUTPUT D30F C38FD6 JMP LIST ;LIST DEVICE OUTPUT D312 C384D6 JMP PUNCH ;PUNCH DEVICE OUTPUT D315 C37AD6 JMP READER ;READER DEVICE INPUT D318 C39ED4 JMP HOME ;HOME DRIVE D31B C3D4D4 JMP SETDRV ;SELECT DISK D31E C3A0D4 JMP SETTRK ;SET TRACK D321 C393D4 JMP SETSEC ;SET SECTOR D324 C398D4 JMP SETDMA ;SET DMA ADDRESS D327 C377D5 JMP READ ;READ THE DISK D32A C370D5 JMP WRITE ;WRITE THE DISK D32D C39AD6 JMP LISTST ;LIST DEVICE STATUS D330 C3A5D4 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 0D0A DB ACR,ALF D33B 4343505A20 DB 'CCPZ V4.1 CP/M V2.2 ' D355 0D0A DB ACR,ALF D357 4E6F727468 DB 'NorthStar/Morrow DJ-2D ' D371 0D0A DB ACR,ALF D373 2020202020 DB ' ' D38D 0D0A00 DB ACR,ALF,0 ***************************************************************** CP/M MACRO ASSEM 2.0 #004 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. * * * UTILITY ROUTINE TO OUTPUT THE MESSAGE POINTED AT BY H&L, * * TERMINATED WITH A NULL. * * * ***************************************************************** D390 7E MESSAGE MOV A,M ;GET A CHARACTER OF THE MESSAGE D391 23 INX H ;BUMP TEXT POINTER D392 A7 ANA A ;TEST FOR END D393 C8 RZ ;RETURN IF DONE D394 E5 PUSH H ;SAVE POINTER TO TEXT D395 4F MOV C,A ;OUTPUT CHARACTER IN C D396 CD0CD3 CALL COUT ;OUTPUT THE CHARACTER D399 E1 POP H ;RESTORE THE POINTER D39A C390D3 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. * * * ***************************************************************** D39D 310001 CBOOT LXI SP,TPA ;SET UP STACK D3A0 CD1ED7 CALL TINIT ;INITIALIZE THE TERMINAL D3A3 2136D3 LXI H,PROMPT ;PREP FOR SENDING SIGNON MESSAGE D3A6 CD90D3 CALL MESSAGE ;SEND THE PROMPT D3A9 AF XRA A ;SELECT DISK A D3AA 32B7D8 STA CPMDRV D3AD 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). * * * ***************************************************************** D3B0 218000 GOCPM LXI H,BUFF ;SET UP INITIAL DMA ADDRESS D3B3 CD98D4 CALL SETDMA D3B6 3EC3 MVI A,(JMP) ;INITIALIZE JUMP TO WARM BOOT D3B8 320000 STA WBOT D3BB 320500 STA ENTRY ;INITIALIZE JUMP TO BDOS D3BE 2103D3 LXI H,WBOOTE ;ADDRESS IN WARM BOOT JUMP D3C1 220100 SHLD WBOT+1 D3C4 2106C5 LXI H,BDOS+6 ;ADDRESS IN BDOS JUMP D3C7 220600 SHLD ENTRY+1 D3CA AF XRA A ;A <- 0 D3CB 32BCD8 STA BUFSEC ;DISK JOCKEY BUFFER EMPTY D3CE 32E3D5 STA BUFWRTN ;SET BUFFER NOT DIRTY FLAG D3D1 3A0400 LDA CDISK ;JUMP TO CP/M WITH CURRENTLY SELECTED DISK IN C D3D4 4F MOV C,A D3D5 11F8D3 LXI D,CMNDBEG ;BEGINNING OF INITIAL COMMAND D3D8 2108BD LXI H,CCP+8 ;COMMAND BUFFER D3DB 3E12 MVI A,CMNDEND-CMNDBEG+1 ;LENGTH OF COMMAND CP/M MACRO ASSEM 2.0 #005 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. D3DD 3207BD STA CCP+7 D3E0 47 MOV B,A D3E1 CD45D6 CALL MOVLOP D3E4 3AF6D3 LDA CWFLG D3E7 A7 ANA A D3E8 3AF7D3 LDA AUTOFLG D3EB CAEFD3 JZ CLDBOT D3EE 1F RAR D3EF 1F CLDBOT RAR D3F0 DA00BD JC CCP D3F3 C303BD JMP CCP+3 ;ENTER CP/M D3F6 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. * * * ***************************************************************** D3F7 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. * * * ***************************************************************** D3F8 44554D4D59CMNDBEG DB 'DUMMYARG ANOTHER1' ;FOR DIRECT REPLACEMENT. D409 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. * * * ***************************************************************** D40A 310001 WBOOT LXI SP,TPA ;SET UP STACK POINTER D40D 3E01 MVI A,1 CP/M MACRO ASSEM 2.0 #006 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. D40E = WFLG EQU $-1 ;TEST IF BEGINNING OR D40F A7 ANA A ; ENDING A WARM BOOT D410 3E01 MVI A,1 D412 320ED4 STA WFLG D415 32F6D3 STA CWFLG ;SET COLD/WARM BOOT FLAG D418 CAB0D3 JZ GOCPM D41B AF XRA A D41C 320ED4 STA WFLG D41F 4F MOV C,A D420 CD33D3 CALL DJDRV ;SELECT DRIVE A D423 0E00 MVI C,0 ;SELECT SINGLE DENSITY D425 CD2DE4 CALL DJDEN D428 0E00 MVI C,0 ;SELECT SIDE 0 D42A CD30E4 CALL DJSIDE D42D 3E0F MVI A,15 ;INITIALIZE THE SECTOR TO READ D42F 324DD4 STA NEWSEC D432 2100BC LXI H,CCP-100H ;AND THE DMA ADDRESS D435 226CD4 SHLD NEWDMA D438 CD4CD4 CALL WARMLOD ;READ IN CP/M D43B 0100C2 LXI B,CCP+500H ;LOAD ADDRESS FOR REST OF WARM BOOT D43E CD12E4 CALL DJDMA D441 0E08 MVI C,8 D443 CD0FE4 CALL DJSEC D446 CD80D4 CALL WARMRD D449 C303C2 JMP CCP+503H D44C 3E0F WARMLOD MVI A,15 ;PREVIOUS SECTOR D44D = NEWSEC EQU $-1 D44E 3C INR A ;UPDATE THE PREVIOUS SECTOR D44F 3C INR A D450 FE1B CPI 27 ;WAS IT THE LAST ? D452 DA64D4 JC NOWRAP D455 D609 SUI 9 ;YES D457 FE13 CPI 19 D459 C8 RZ D45A 2A6CD4 LHLD NEWDMA D45D 1180FB LXI D,-480H D460 19 DAD D D461 226CD4 SHLD NEWDMA D464 324DD4 NOWRAP STA NEWSEC ;SAVE THE NEW SECTOR TO READ D467 4F MOV C,A D468 CD0FE4 CALL DJSEC D46B 2100BC LXI H,CCP-100H ;GET THE PREVIOUS DMA ADDRESS D46C = NEWDMA EQU $-2 D46E 110001 LXI D,100H ;UPDATE THE DMA ADDRESS D471 19 DAD D D472 226CD4 SHLD NEWDMA ;SAVE THE DMA ADDRESS D475 44 MOV B,H D476 4D MOV C,L D477 CD12E4 CALL DJDMA ;SET THE DMA ADDRESS D47A CD80D4 CALL WARMRD D47D C34CD4 JMP WARMLOD D480 01000A WARMRD LXI B,RETRIES*100H+0;MAXIMUM # OF ERRORS D483 C5 WRMREAD PUSH B D484 CD0CE4 CALL DJTRK ;SET THE TRACK CP/M MACRO ASSEM 2.0 #007 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. D487 CD15E4 CALL DJREAD ;READ THE SECTOR D48A C1 POP B D48B D0 RNC ;CONTINUE IF SUCCESSFUL D48C 05 DCR B D48D C283D4 JNZ WRMREAD ;KEEP TRYING D490 C32AE4 JMP DJERR ***************************************************************** * * * SETSEC JUST SAVES THE DESIRED SECTOR TO SEEK TO UNTIL AN * * ACTUAL READ OR WRITE IS ATTEMPTED. * * * ***************************************************************** D493 79 SETSEC MOV A,C ;SAVE THE SECTOR NUMBER D494 32B6D8 STA CPMSEC ;CP/M SECTOR # D497 C9 RET ***************************************************************** * * * SETDMA SAVES THE DMA ADDRESS FOR THE DATA TRANSFER. * * * ***************************************************************** D498 60 SETDMA MOV H,B ;HL <- BC D499 69 MOV L,C D49A 22C3D5 SHLD CPMDMA ;CP/M DMA ADDRESS D49D C9 RET ***************************************************************** * * * HOME IS TRANSLATED INTO A SEEK TO TRACK ZERO. * * * ***************************************************************** D49E 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. * * * ***************************************************************** D4A0 79 SETTRK MOV A,C ;A <- TRACK # D4A1 32B8D8 STA CPMTRK ;CP/M TRACK # D4A4 C9 RET ***************************************************************** * * * SECTRAN TRANSLATES A LOGICAL SECTOR # INTO A PHYSICAL SECTOR * * #. * * * ***************************************************************** D4A5 03 SECTRAN INX B CP/M MACRO ASSEM 2.0 #008 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. D4A6 D5 PUSH D ;SAVE TABLE ADDRESS D4A7 C5 PUSH B ;SAVE SECTOR # D4A8 CD4FD5 CALL GETDPB ;GET DPB ADDRESS INTO HL D4AB 7E MOV A,M ;GET # OF CP/M SECTORS/TRACK D4AC B7 ORA A ;CLEAR CARY D4AD 1F RAR ;DIVIDE BY TWO D4AE 91 SUB C D4AF F5 PUSH PSW ;SAVE ADJUSTED SECTOR D4B0 FABCD4 JM SIDETWO D4B3 F1 SIDEA POP PSW ;DISCARD ADJUSTED SECTOR D4B4 C1 POP B ;RESTORE SECTOR REQUESTED D4B5 D1 POP D ;RESTOR ADDRESS OF XLT TABLE D4B6 EB SIDEONE XCHG ;HL <- &(TRANSLATION TABLE) D4B7 09 DAD B ;BC = OFFSET INTO TABLE D4B8 6E MOV L,M ;HL <- PHYSICAL SECTOR D4B9 2600 MVI H,0 D4BB C9 RET D4BC 010F00 SIDETWO LXI B,15 ;OFFSET TO SIDE BIT D4BF 09 DAD B D4C0 7E MOV A,M D4C1 E608 ANI 8 ;TEST FOR DOUBLE SIDED D4C3 CAB3D4 JZ SIDEA ;MEDIA IS ONLY SINGLE SIDED D4C6 F1 POP PSW ;RETRIEVE ADJUSTED SECTOR D4C7 C1 POP B D4C8 2F CMA ;MAKE SECTOR REQUEST POSITIVE D4C9 3C INR A D4CA 4F MOV C,A ;MAKE NEW SECTOR THE REQUESTED SECTOR D4CB D1 POP D D4CC CDB6D4 CALL SIDEONE D4CF 3E80 MVI A,80H ;SIDE TWO BIT D4D1 B5 ORA L ; AND SECTOR D4D2 6F MOV L,A D4D3 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. * * * ***************************************************************** D4D4 79 SETDRV MOV A,C ;SAVE THE DRIVE # D4D5 32B7D8 STA CPMDRV D4D8 FE04 CPI MAXDISK ;CHECK FOR A VALID DRIVE # D4DA D24BD5 JNC ZRET ;ILLEGAL DRIVE # D4DD 7B MOV A,E ;TEST IF DRIVE EVER LOGGED IN BEFORE D4DE E601 ANI 1 D4E0 C232D5 JNZ SETDRV1 ;BIT 0 OF E = 0 -> NEVER SELECTED BEFORE CP/M MACRO ASSEM 2.0 #009 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. D4E3 3E01 MVI A,1 ;SELECT SECTOR 1 OF TRACK 1 D4E5 32B9D8 STA TRUESEC D4E8 32B8D8 STA CPMTRK D4EB CD2ED6 CALL FILL ;FLUSH BUFFER AND REFILL D4EE DA4BD5 JC ZRET ;TEST FOR ERROR RETURN D4F1 CD27E4 CALL DJSTAT ;GET STATUS ON CURRENT DRIVE D4F4 E60C ANI 0CH ;STRIP OFF UNWANTED BITS D4F6 F5 PUSH PSW ;USED TO SELECT A DPB D4F7 1F RAR D4F8 2168D5 LXI H,XLTS ;TABLE OF XLT ADDRESSES D4FB 5F MOV E,A D4FC 1600 MVI D,0 D4FE 19 DAD D D4FF E5 PUSH H ;SAVE POINTER TO PROPER XLT D500 CD4FD5 CALL GETDPB ;GET DPH POINTER INTO DE D503 EB XCHG ; D504 D1 POP D D505 0602 MVI B,2 ;NUMBER OF BYTES TO MOVE D507 CD45D6 CALL MOVLOP ;MOVE THE ADDRESS OF XLT D50A 110800 LXI D,8 ;OFFSET TO DPB POINTER D50D 19 DAD D ;HL <- &DPH.DPB D50E E5 PUSH H D50F 2A07E0 LHLD ORIGIN+7 ;GET ADDRESS OF DJ TERMINAL OUT ROUTINE D512 23 INX H ;BUMP TO LOOK AT ADDRESS OF ; UART STATUS LOCATION D513 7E MOV A,M D514 EE03 XRI 3 ;ADJUST FOR PROPER REV DJ D516 6F MOV L,A D517 26E3 MVI H,(ORIGIN+300H)/100H D519 7E MOV A,M D51A E608 ANI DBLSID ;CHECK DOUBLE SIDED BIT D51C 11F6D7 LXI D,DPB128S ;BASE FOR SINGLE SIDED DPB'S D51F C225D5 JNZ SIDEOK D522 1136D8 LXI D,DPB128D ;BASE OF DOUBLE SIDED DPB'S D525 EB SIDEOK XCHG ;HL <- DBP BASE, DE <- &DPH.DPB D526 D1 POP D ;RESTORE DE (POINTER INTO DPH) D527 F1 POP PSW ;OFFSET TO CORRECT DPB D528 17 RAL D529 17 RAL D52A 4F MOV C,A D52B 0600 MVI B,0 D52D 09 DAD B D52E EB XCHG ;PUT DPB ADDRESS IN DPH D52F 73 MOV M,E D530 23 INX H D531 72 MOV M,D D532 CD4FD5 SETDRV1 CALL GETDPB ;GET ADDRESS OF DPB IN HL D535 010F00 LXI B,15 ;OFFSET TO SECTOR SIZE D538 09 DAD B D539 7E MOV A,M ;GET SECTOR SIZE D53A E607 ANI 7H D53C 327CD5 STA SECSIZ D53F 7E MOV A,M D540 1F RAR D541 1F RAR D542 1F RAR CP/M MACRO ASSEM 2.0 #010 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. D543 1F RAR D544 E60F ANI 0FH D546 32B2D5 STA SECPSEC D549 EB XCHG ;HL <- DPH D54A C9 RET D54B 210000 ZRET LXI H,0 ;SELDRV ERROR EXIT D54E C9 RET ***************************************************************** * * * GETDPB RETURNS HL POINTING TO THE DPB OF THE CURRENTLY * * SELECTED DRIVE, DE POINTING TO DPH. * * * ***************************************************************** D54F 3AB7D8 GETDPB LDA CPMDRV ;GET DRIVE # D552 6F MOV L,A ;FORM OFFSET D553 2600 MVI H,0 D555 29 DAD H D556 29 DAD H D557 29 DAD H D558 29 DAD H D559 1176D8 LXI D,DPZERO ;BASE OF DPH'S D55C 19 DAD D D55D E5 PUSH H ;SAVE ADDRESS OF DPH D55E 110A00 LXI D,10 ;OFFSET TO DPB D561 19 DAD D D562 7E MOV A,M ;GET LOW BYTE OF DPB ADDRESS D563 23 INX H D564 66 MOV H,M ;GET LOW BYTE OF DPB D565 6F MOV L,A D566 D1 POP D D567 C9 RET ***************************************************************** * * * XLTS IS A TABLE OF ADDRESS THAT POINT TO EACH OF THE XLT * * TABLES FOR EACH SECTOR SIZE. * * * ***************************************************************** D568 28D7 XLTS DW XLT128 ;XLT FOR 128 BYTE SECTORS D56A 43D7 DW XLT256 ;XLT FOR 256 BYTE SECTORS D56C 78D7 DW XLT512 ;XLT FOR 512 BYTE SECTORS D56E B5D7 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 RLEEs SYSTEM: 06 NOV 94. * * ***************************************************************** D570 79 WRITE MOV A,C ;SAVE WRITE COMMAND TYPE D571 32DAD5 STA WRITTYP D574 3E01 MVI A,1 ;SET WRITE COMMAND D576 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. * * * ***************************************************************** D577 AF READ XRA A ;SET THE COMMAND TYPE TO READ D578 32C6D5 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. * * * ***************************************************************** D57B 0600 REDWRT MVI B,0 ;THE 0 IS MODIFIED TO CONTAIN THE LOG2 D57C = SECSIZ EQU $-1 ; OF THE PHYSICAL SECTOR SIZE/128 ; ON THE CURRENTLY SELECTED DISK. D57D 3AB6D8 LDA CPMSEC ;GET THE DESIRED CP/M SECTOR # D580 F5 PUSH PSW ;TEMPORARY SAVE D581 E680 ANI 80H ;SAVE ONLY THE SIDE BIT D583 4F MOV C,A ;REMEMBER THE SIDE D584 F1 POP PSW ;GET THE SECTOR BACK D585 E67F ANI 7FH ;FORGET THE SIDE BIT D587 3D DCR A ;TEMPORARY ADJUSTMENT D588 05 DIVLOOP DCR B ;UPDATE REPEAT COUNT D589 CA91D5 JZ DIVDONE D58C B7 ORA A ;CLEAR THE CARY FLAG D58D 1F RAR ;DIVIDE THE CP/M SECTOR # BY THE SIZE ; OF THE PHYSICAL SECTORS D58E C388D5 JMP DIVLOOP ; D591 3C DIVDONE INR A D592 B1 ORA C ;RESTORE THE SIDE BIT D593 32B9D8 STA TRUESEC ;SAVE THE PHYSICAL SECTOR NUMBER D596 21B7D8 LXI H,CPMDRV ;POINTER TO DESIRED DRIVE,TRACK, AND SECTOR D599 11BAD8 LXI D,BUFDRV ;POINTER TO BUFFER DRIVE,TRACK, AND SECTOR CP/M MACRO ASSEM 2.0 #012 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. D59C 0604 MVI B,4 ;COUNT LOOP D59E 05 DTSLOP DCR B ;TEST IF DONE WITH COMPARE D59F CAADD5 JZ MOVE ;YES, MATCH. GO MOVE THE DATA D5A2 1A LDAX D ;GET A BYTE TO COMPARE D5A3 BE CMP M ;TEST FOR MATCH D5A4 23 INX H ;BUMP POINTERS TO NEXT DATA ITEM D5A5 13 INX D D5A6 CA9ED5 JZ DTSLOP ;MATCH, CONTINUE TESTING ***************************************************************** * * * DRIVE, TRACK, AND SECTOR DON'T MATCH, FLUSH THE BUFFER IF * * NECESSARY AND THEN REFILL. * * * ***************************************************************** D5A9 CD2ED6 CALL FILL ;FILL THE BUFFER WITH CORRECT PHYSICAL SECTOR D5AC D8 RC ;NO GOOD, RETURN WITH ERROR INDICATION ***************************************************************** * * * MOVE HAS BEEN MODIFIED TO CAUSE EITHER A TRANSFER INTO OR OUT * * THE BUFFER. * * * ***************************************************************** D5AD 3AB6D8 MOVE LDA CPMSEC ;GET THE CP/M SECTOR TO TRANSFER D5B0 3D DCR A ;ADJUST TO PROPER SECTOR IN BUFFER D5B1 E600 ANI 0 ;STRIP OFF HIGH ORDERED BITS D5B2 = SECPSEC EQU $-1 ;THE 0 IS MODIFIED TO REPRESENT THE # OF ; CP/M SECTORS PER PHYSICAL SECTORS D5B3 6F MOV L,A ;PUT INTO HL D5B4 2600 MVI H,0 D5B6 29 DAD H ;FORM OFFSET INTO BUFFER D5B7 29 DAD H D5B8 29 DAD H D5B9 29 DAD H D5BA 29 DAD H D5BB 29 DAD H D5BC 29 DAD H D5BD 11BDD8 LXI D,BUFFER ;BEGINNING ADDRESS OF BUFFER D5C0 19 DAD D ;FORM BEGINNING ADDRESS OF SECTOR TO TRANSFER D5C1 EB XCHG ;DE = ADDRESS IN BUFFER D5C2 210000 LXI H,0 ;GET DMA ADDRESS, THE 0 IS MODIFIED TO ; CONTAIN THE DMA ADDRESS D5C3 = CPMDMA EQU $-2 D5C5 3E00 MVI A,0 ;THE ZERO GETS MODIFIED TO CONTAIN ; A ZERO IF A READ, OR A 1 IF WRITE D5C6 = RDWR EQU $-1 D5C7 A7 ANA A ;TEST WHICH KIND OF OPERATION D5C8 C2D0D5 JNZ INTO ;TRANSFER DATA INTO THE BUFFER D5CB CD43D6 OUTOF CALL MOVER D5CE AF XRA A D5CF C9 RET D5D0 EB INTO XCHG ; CP/M MACRO ASSEM 2.0 #013 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. D5D1 CD43D6 CALL MOVER ;MOVE THE DATA, HL = DESTINATION ; DE = SOURCE D5D4 3E01 MVI A,1 D5D6 32E3D5 STA BUFWRTN ;SET BUFFER WRITTEN INTO FLAG D5D9 3E00 MVI A,0 ;CHECK FOR DIRECTORY WRITE D5DA = WRITTYP EQU $-1 D5DB 3D DCR A D5DC 3E00 MVI A,0 D5DE 32DAD5 STA WRITTYP ;SET NO DIRECTORY WRITE D5E1 C0 RNZ ;NO ERROR EXIT ***************************************************************** * * * FLUSH WRITES THE CONTENTS OF THE BUFFER OUT TO THE DISK IF * * IT HAS EVER BEEN WRITTEN INTO. * * * ***************************************************************** D5E2 3E00 FLUSH MVI A,0 ;THE 0 IS MODIFIED TO REFLECT IF ; THE BUFFER HAS BEEN WRITTEN INTO D5E3 = BUFWRTN EQU $-1 D5E4 A7 ANA A ;TEST IF WRITTEN INTO D5E5 C8 RZ ;NOT WRITTEN, ALL DONE D5E6 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. * * * ***************************************************************** D5E9 AF PREP XRA A ;RESET BUFFER WRITTEN FLAG D5EA 32E3D5 STA BUFWRTN D5ED 2220D6 SHLD RETRYOP ;SET UP THE READ/WRITE OPERATION D5F0 060A MVI B,RETRIES ;MAXIMUM NUMBER OF RETRIES TO ATTEMPT D5F2 C5 RETRYLP PUSH B ;SAVE THE RETRY COUNT D5F3 3ABAD8 LDA BUFDRV ;GET DRIVE NUMBER INVOLVED IN THE OPERATION D5F6 4F MOV C,A D5F7 CD33D3 CALL DJDRV ;SELECT THE DRIVE D5FA 3ABBD8 LDA BUFTRK D5FD A7 ANA A ;TEST FOR TRACK ZERO D5FE 4F MOV C,A D5FF C5 PUSH B D600 CC09E4 CZ DJHOME ;HOME THE DRIVE IF TRACK 0 D603 C1 POP B ;RESTORE TRACK # D604 CD0CE4 CALL DJTRK ;SEEK TO PROPER TRACK D607 3ABCD8 LDA BUFSEC ;GET SECTOR INVOLVED IN OPERATION D60A F5 PUSH PSW ;SAVE THE SECTOR # D60B 07 RLC ;BIT 0 OF A EQUALS SIDE # D60C E601 ANI 1 ;STRIP OFF UNNECESSARY BITS D60E 4F MOV C,A ;C <- SIDE # D60F CD30E4 CALL DJSIDE ;SELECT THE SIDE D612 F1 POP PSW ;A <- SECTOR # D613 E67F ANI 7FH ;STRIP OFF SIDE BIT CP/M MACRO ASSEM 2.0 #014 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. D615 4F MOV C,A ;C <- SECTOR # D616 CD0FE4 CALL DJSEC ;SET THE SECTOR TO TRANSFER D619 01BDD8 LXI B,BUFFER ;SET THE DMA ADDRESS D61C CD12E4 CALL DJDMA D61F CD15E4 CALL DJREAD ;THE READ OPERATION IS MODIFIED TO WRITE D620 = RETRYOP EQU $-2 D622 C1 POP B ;RESTORE THE RETRY COUNTER D623 3E00 MVI A,0 ;NO ERROR EXIT STATUS D625 D0 RNC ;RETURN NO ERROR D626 05 DCR B ;UPDATE THE RETRY COUNTER D627 37 STC ;ASSUME RETRY COUNT EXPIRED D628 3EFF MVI A,0FFH ;ERROR RETURN D62A C8 RZ D62B C3F2D5 JMP RETRYLP ;TRY AGAIN ***************************************************************** * * * FILL FILLS THE BUFFER WITH A NEW SECTOR FROM THE DISK. * * * ***************************************************************** D62E CDE2D5 FILL CALL FLUSH ;FLUSH BUFFER FIRST D631 D8 RC ;CHECK FOR ERROR D632 11B7D8 LXI D,CPMDRV ;UPDATE THE DRIVE, TRACK, AND SECTOR D635 21BAD8 LXI H,BUFDRV D638 0603 MVI B,3 ;NUMBER OF BYTES TO MOVE D63A CD45D6 CALL MOVLOP ;COPY THE DATA D63D 2115E4 LXI H,DJREAD D640 C3E9D5 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. * * * ***************************************************************** D643 0680 MOVER MVI B,128 ;LENGTH OF TRANSFER D645 1A MOVLOP LDAX D ;GET A BTE OF SOURCE D646 77 MOV M,A ;MOVE IT D647 13 INX D ;BUMP POINTERS D648 23 INX H D649 05 DCR B ;UPDATE COUNTER D64A C245D6 JNZ MOVLOP ;CONTINUE MOVING UNTIL DONE D64D 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 * CP/M MACRO ASSEM 2.0 #015 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. * 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. * * * ***************************************************************** ***************************************************************** * * * 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. * * * ***************************************************************** D64E 21C8D6 CONST LXI H,CSTBLE ;BEGINNING OF JUMP TABLE D651 C360D6 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. * * * ***************************************************************** D654 21D0D6 CSREADR LXI H,CSRTBLE ;BEGINNING OF READER STATUS TABLE D657 C37DD6 JMP READERA ***************************************************************** * * * CONIN: TAKE THE CORRECT JUMP FOR THE CONSOLE INPUT ROUTINE. * * THE JUMP IS BASED ON THE TWO LEAST SIGNIFICANT BITS OF * * IOBYTE. * * * ***************************************************************** D65A CDE2D5 CONIN CALL FLUSH ;FLUSH THE DISK BUFFER D65D 21A0D6 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. * D660 3A0300 CONIN1 LDA IOBYTE D663 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. * D664 E606 SELDEV ANI 6H ;STRIP OFF UNWANTED BITS D666 1600 MVI D,0 ;FORM OFFSET CP/M MACRO ASSEM 2.0 #016 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. D668 5F MOV E,A D669 19 DAD D ;ADD OFFSET D66A 7E MOV A,M ;PICK UP HIGH BYTE D66B 23 INX H D66C 66 MOV H,M ;PICK UP LOW BYTE D66D 6F MOV L,A ;FORM ADDRESS D66E E9 PCHL ;GO THERE ! ***************************************************************** * * * CONOUT: TAKE THE PROPER BRANCH ADDRESS BASED ON THE TWO LEAST * * SIGNIFICANT BITS OF IOBYTE. * * * ***************************************************************** D66F C5 CONOUT PUSH B ;SAVE THE CHARACTER D670 CDE2D5 CALL FLUSH ;FLUSH THE DISK BUFFER D673 C1 POP B ;RESTORE THE CHARACTER D674 21A8D6 LXI H,COTBLE ;BEGINNING OF THE CHARACTER OUT TABLE D677 C360D6 JMP CONIN1 ;DO THE DECODE ***************************************************************** * * * READER: SELECT THE CORRECT READER DEVICE FOR INPUT. THE * * READER IS SELECTED FROM BITS 2 AND 3 OF IOBYTE. * * * ***************************************************************** D67A 21C0D6 READER LXI H,RTBLE ;BEGINNING OF READER INPUT TABLE * * ENTRY AT READERA WILL DECODE BITS 2 & 3 OF IOBYTE, USED * BY CSREADER. * D67D 3A0300 READERA LDA IOBYTE * * ENTRY AT READER1 WILL SHIFT THE BITS INTO POSITION, USED * BY LIST AND PUNCH. * D680 1F READR1 RAR D681 C364D6 JMP SELDEV ***************************************************************** * * * PUNCH: SELECT THE CORRECT PUNCH DEVICE. THE SELECTION COMES * * FROM BITS 4&5 OF IOBYTE. * * * ***************************************************************** D684 21B8D6 PUNCH LXI H,PTBLE ;BEGINNING OF PUNCH TABLE D687 3A0300 LDA IOBYTE * CP/M MACRO ASSEM 2.0 #017 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. * ENTRY AT PNCH1 ROTATES BITS A LITTLE MORE IN PREP FOR * SELDEV, USED BY LIST. * D68A 1F PNCH1 RAR D68B 1F RAR D68C C380D6 JMP READR1 ***************************************************************** * * * LIST: SELECT A LIST DEVICE BASED ON BITS 6&7 OF IOBYTE * * * ***************************************************************** D68F 21B0D6 LIST LXI H,LTBLE ;BEGINNING OF THE LIST DEVICE ROUTINES D692 3A0300 LIST1 LDA IOBYTE D695 1F RAR D696 1F RAR D697 C38AD6 JMP PNCH1 ***************************************************************** * * * LISTST: GET THE STATUS OF THE CURRENTLY ASSIGNED LIST DEVICE * * * ***************************************************************** D69A 21D8D6 LISTST LXI H,LSTBLE ;BEGINNING OF THE LIST DEVICE STATUS D69D C392D6 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 * D6A0 F8D6 CITBLE DW CIUC1 ;INPUT FROM KEYBOARD (PARALLEL PORT ; 02H, STATUS PORT 03H). D6A2 F8D6 DW CICRT ;SAME PARAMETERS AS THE PREVIOUS ; ENTRY FOR CIUC1. D6A4 7AD6 DW READER ;INPUT FROM READER (DEPENDS ON READER ; SELECTION) D6A6 F8D6 DW CIUC1 ;SAME PARAMETERS AS THE PREVIOUS ; ENTRY> * * CONSOLE OUTPUT TABLE * D6A8 E0D6 COTBLE DW COLPT ;OUTPUT TO THE LEFT SERIAL PORT CP/M MACRO ASSEM 2.0 #018 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. ; D6AA E0D6 DW COLPT ;OUTPUT TO THE LEFT SERIAL PORT ; D6AC 8FD6 DW LIST ;OUTPUT TO LIST DEVICE (DEPENDS ON ; BITS 6&7 OF IOBYTE) D6AE EBD6 DW COUC1 ;OUTPUT TO USER CONSOLE 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * LIST DEVICE TABLE * D6B0 E0D6 LTBLE DW COLPT ;OUTPUT TO THE PRINTER: PRESENTLY ; THE DIABLO. D6B2 EDD6 DW COSEC ;OUTPUT TO THE SECONDAR SERIAL ; PORT. D6B4 EBD6 DW COTRM ;OUTPUT TO THE TERMINET ON THE DJ ; SERIAL PORT. D6B6 E0D6 DW COLPT ;NOT CURRENTLY USED. ; * * PUNCH DEVICE TABLE * D6B8 04D7 PTBLE DW COPTP ;OUTPUT TO THE PUNCH ROUTINE ; USING 02H AND ECHO. D6BA 04D7 DW COPTP ; SAME. ; D6BC EBD6 DW COUP1 ; SAME. ; D6BE EBD6 DW COUP2 ; SAME. ; * * READER DEVICE INPUT TABLE * D6C0 F8D6 RTBLE DW CIPTR ;INPUT FROM TTY (CURRENTLY ASSIGNED ; BY INTIOBY, INPUT FROM 2D) D6C2 F8D6 DW CIPTR ;INPUT FROM PAPER TAPE READER (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) D6C4 F8D6 DW CIUR1 ;INPUT FROM USER READER 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) D6C6 F8D6 DW CIUR2 ;INPUT FROM USER READER 2 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * CONSOLE STATUS TABLE * D6C8 0DD7 CSTBLE DW CSCRT ;STATUS FROM KEYBOARD - ASSIGNED TO ; PORT02H, STATUS 03H. D6CA 0DD7 DW CSCRT ;SAME AS ABOVE. ; D6CC 54D6 DW CSREADR ;STATUS FROM READER (DEPENDS ON READER DEVICE ) CP/M MACRO ASSEM 2.0 #019 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. ; D6CE 0DD7 DW CSUC1 ;STATUS FROM USER CONSOLE 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * STATUS FROM READER DEVICE * D6D0 05D7 CSRTBLE DW CSTTY ;STATUS FROM TTY (CURRENTLY ASSIGNED ; BY INTIOBY, STATUS OF 2D) D6D2 0DD7 DW CSPTR ;STATUS FROM PAPER TAPE READER (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) D6D4 0DD7 DW CSUR1 ;STATUS FROM USER READER 1 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) D6D6 0DD7 DW CSUR2 ;STATUS OF USER READER 2 (CURRENTLY ; SWITCHBOARD SERIAL PORT 1) * * STATUS FROM LIST DEVICE * D6D8 1BD7 LSTBLE DW READY ;CONSOLE ALWAYS READY ; D6DA 1BD7 DW READY ;GET LIST STATUS ; D6DC 16D7 DW LSLPT ; ; D6DE 16D7 DW LSLPT ; ***************************************************************** * * * THE FOLLOWING EQUATES SET OUTPUT DEVICE TO OUTPUT TO THE * * PRINTER FED FROM DJ BOARD SERIAL PORT. * * * ***************************************************************** ;PRINT D6E0 DB03 COLPT IN 03H D6E2 E601 ANI 01H D6E4 C2E0D6 JNZ COLPT D6E7 79 MOV A,C D6E8 D302 OUT 02H D6EA C9 RET D6EB = COUC1 EQU $ ;OUTPUT FROM USER CONSOLE 1 D6EB = COUC2 EQU $ D6EB = COUP1 EQU $ ;OUTPUT FROM USER PUNCH 1 D6EB = COUP2 EQU $ ;OUTPUT FROM USER PUNCH 2 D6EB 79 COTRM MOV A,C ;TERMINET OUTPUT ROUTINE. D6EC C9 RET ***************************************************************** * * * OUTPUT TO THE SECONDARY SERIAL PORT: STATUS PORT 5, * * DATA PORT 4, READY BYTE 01 HIGH. * * * CP/M MACRO ASSEM 2.0 #020 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. ***************************************************************** D6ED DB05 COSEC IN 05H ;READ THE SECOND SERIAL PORT STATUS D6EF E601 ANI 01H ;TEST FOR READY D6F1 C2EDD6 JNZ COSEC ;LOOP IF NOT. D6F4 79 MOV A,C ;GET THE CHARACTER D6F5 D304 OUT 4 ;AND DUMP IT TO SECOND SERIAL OUTPUT. D6F7 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. * * * ***************************************************************** ;INPUT D6F8 = CIUC1 EQU $ ;INPUT FROM USER CONSOLE 1 D6F8 = CICRT EQU $ ;INPUT FROM CRT D6F8 = CIUR1 EQU $ ;INPUT FROM USER READER 1 D6F8 = CIUR2 EQU $ ;INPUT FROM USER READER 2 D6F8 DB03 CIPTR IN 03H D6FA E602 ANI 02H D6FC CAF8D6 JZ CIPTR D6FF DB02 IN 02H D701 E67F ANI 7FH D703 C9 RET ***************************************************************** * * * OUTPUT TO PAPER TAPE PUNCH ROUTINE NOT CURRENTLY SUPPORTED. * * * ***************************************************************** ;PUNCH D704 C9 COPTP RET ***************************************************************** * * * CONSOLE STATUS ROUTINES, TEST IF A CHARACTER HAS ARRIVED. * * * ***************************************************************** ;CONSTAT D705 CD21E4 CSTTY CALL DJTSTAT ;STATUS FROM DISK JOCKEY 2D D708 3E00 STAT MVI A,0 ;PREP FOR ZERO RETURN D70A C0 RNZ ;NOTHING FOUND D70B 3D DCR A ;RETURN WITH 0FFH D70C C9 RET CP/M MACRO ASSEM 2.0 #021 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. ***************************************************************** * * * THE FOLLOWING EQUATES CAUSE THE DEVICES TO GET STATUS FROM * * THE SWITCHBOARD SERIAL PORT 1. * * * ***************************************************************** D70D = CSUR1 EQU $ ;STATUS OF USER READER 1 D70D = CSUR2 EQU $ ;STATUS OF USER READER 2 D70D = CSPTR EQU $ ;STATUS OF PAPER TAPE READER D70D = CSUC1 EQU $ ;STATUS OF USER CONSOLE 1 D70D DB03 CSCRT IN 03H D70F E602 ANI 02H D711 EE02 XRI 02H D713 C308D7 JMP STAT ***************************************************************** * * * LIST DEVICE STATUS ROUTINES. * * * ***************************************************************** D716 DB03 LSLPT IN 03H D718 E601 ANI 01H D71A C8 RZ D71B 3EFF READY MVI A,0FFH D71D C9 RET ***************************************************************** * * * TINIT CAN BE MODIFIED FOR DIFFERENT I/O SETUPS. * * * ***************************************************************** D71E 0E1A TINIT MVI C,CLEAR ;INITIALIZE THE TERMINAL ROUTINE D720 3E00 MVI A,INTIOBY ;INITIALIZE IOBYTE D722 320300 STA IOBYTE D725 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. * * * ***************************************************************** D728 00 XLT128 DB 0 CP/M MACRO ASSEM 2.0 #022 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. D729 01070D1319 DB 1,7,13,19,25 D72E 050B1117 DB 5,11,17,23 D732 03090F15 DB 3,9,15,21 D736 02080E141A DB 2,8,14,20,26 D73B 060C1218 DB 6,12,18,24 D73F 040A1016 DB 4,10,16,22 D743 00 XLT256 DB 0 D744 0102131425 DB 1,2,19,20,37,38 D74A 0304151627 DB 3,4,21,22,39,40 D750 0506171829 DB 5,6,23,24,41,42 D756 0708191A2B DB 7,8,25,26,43,44 D75C 090A1B1C2D DB 9,10,27,28,45,46 D762 0B0C1D1E2F DB 11,12,29,30,47,48 D768 0D0E1F2031 DB 13,14,31,32,49,50 D76E 0F10212233 DB 15,16,33,34,51,52 D774 11122324 DB 17,18,35,36 D778 00 XLT512 DB 0 D779 0102030411 DB 1,2,3,4,17,18,19,20 D781 2122232431 DB 33,34,35,36,49,50,51,52 D789 0506070815 DB 5,6,7,8,21,22,23,24 D791 2526272835 DB 37,38,39,40,53,54,55,56 D799 090A0B0C19 DB 9,10,11,12,25,26,27,28 D7A1 292A2B2C39 DB 41,42,43,44,57,58,59,60 D7A9 0D0E0F101D DB 13,14,15,16,29,30,31,32 D7B1 2D2E2F30 DB 45,46,47,48 D7B5 00 XLT124 DB 0 D7B6 0102030405 DB 1,2,3,4,5,6,7,8 D7BE 191A1B1C1D DB 25,26,27,28,29,30,31,32 D7C6 3132333435 DB 49,50,51,52,53,54,55,56 D7CE 090A0B0C0D DB 9,10,11,12,13,14,15,16 D7D6 2122232425 DB 33,34,35,36,37,38,39,40 D7DE 393A3B3C3D DB 57,58,59,60,61,62,63,64 D7E6 1112131415 DB 17,18,19,20,21,22,23,24 D7EE 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. * * * ***************************************************************** D7F6 1A00 DPB128S DW 26 ;CP/M SECTORS/TRACK CP/M MACRO ASSEM 2.0 #023 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. D7F8 03 DB 3 ;BSH D7F9 07 DB 7 ;BLM D7FA 00 DB 0 ;EXM D7FB F200 DW 242 ;DSM D7FD 3F00 DW 63 ;DRM D7FF C0 DB 0C0H ;AL0 D800 00 DB 0 ;AL1 D801 1000 DW 16 ;CKS D803 0200 DW 2 ;OFF D805 01 DB 1H ;16*((#CPM SECTORS/PHYSICAL SECTOR) -1) + ;LOG2(#BYTES PER SECTOR/128) + 1 + ;8 IF DOUBLE SIDED. ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE FOR 256 BYTE SECTORS, * * DOUBLE DENSITY, AND SINGLE SIDED. * * * ***************************************************************** D806 3400 DPB256S DW 52 ;CP/M SECTORS/TRACK D808 04 DB 4 ;BSH D809 0F DB 15 ;BLM D80A 00 DB 0 ;EXM D80B F200 DW 242 ;DSM D80D 7F00 DW 127 ;DRM D80F C0 DB 0C0H ;AL0 D810 00 DB 0 ;AL1 D811 2000 DW 32 ;CKS D813 0200 DW 2 ;OFF D815 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. * * * ***************************************************************** D816 3C00 DPB512S DW 60 ;CP/M SECTORS/TRACK D818 04 DB 4 ;BSH D819 0F DB 15 ;BLM D81A 00 DB 0 ;EXM D81B 1801 DW 280 ;DSM D81D 7F00 DW 127 ;DRM D81F C0 DB 0C0H ;AL0 D820 00 DB 0 ;AL1 D821 2000 DW 32 ;CKS D823 0200 DW 2 ;OFF D825 33 DB 33H ;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 RLEEs SYSTEM: 06 NOV 94. * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 1024 BYTE SECTORS, * * DOUBLE DENSITY, AND SINGLE SIDED. * * * ***************************************************************** D826 4000 DP1024S DW 64 ;CP/M SECTORS/TRACK D828 04 DB 4 ;BSH D829 0F DB 15 ;BLM D82A 00 DB 0 ;EXM D82B 2B01 DW 299 ;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 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. * * * ***************************************************************** D836 3400 DPB128D DW 52 ;CP/M SECTORS/TRACK D838 04 DB 4 ;BSH D839 0F DB 15 ;BLM D83A 01 DB 1 ;EXM D83B F200 DW 242 ;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 09 DB 9H ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 256 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** D846 6800 DPB256D DW 104 ;CP/M SECTORS/TRACK D848 04 DB 4 ;BSH D849 0F DB 15 ;BLM D84A 00 DB 0 ;EXM D84B E601 DW 486 ;DSM D84D FF00 DW 255 ;DRM D84F F0 DB 0F0H ;AL0 D850 00 DB 0 ;AL1 D851 4000 DW 64 ;CKS D853 0200 DW 2 ;OFF CP/M MACRO ASSEM 2.0 #025 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. D855 1A DB 1AH ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 512 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** D856 7800 DPB512D DW 120 ;CP/M SECTORS/TRACK D858 04 DB 4 ;BSH D859 0F DB 15 ;BLM D85A 00 DB 0 ;EXM D85B 3102 DW 561 ;DSM D85D FF00 DW 255 ;DRM D85F F0 DB 0F0H ;AL0 D860 00 DB 0 ;AL1 D861 4000 DW 64 ;CKS D863 0200 DW 2 ;OFF D865 3B DB 3BH ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 1024 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** D866 8000 DP1024D DW 128 ;CP/M SECTORS/TRACK D868 04 DB 4 ;BSH D869 0F DB 15 ;BLM D86A 00 DB 0 ;EXM D86B 5702 DW 599 ;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 7C DB 7CH ***************************************************************** * * * CP/M DISK PARAMETER HEADERS, UNITIALIZED. * * * ***************************************************************** D876 0000 DPZERO DW 0 ;ADDRESS OF TRANSLATION TABLE (FILLED ; IN BY SETDRV) D878 0000000000 DW 0,0,0 ;USED BY BDOS D87E E9DE DW DIRBUF ;ADDRESS OF DIRECTORY BUFFER D880 0000 DW 0 ;ADDRESS OF DPB (FILLED IN BY SETDRV) D882 E9DD DW CSV0 ;DIRECTORY CHECK VECTOR D884 BDDC DW ALV0 ;ALLOCATION VECTOR D886 0000 DPONE DW 0 D888 0000000000 DW 0,0,0 CP/M MACRO ASSEM 2.0 #026 CBIOS FOR RLEEs SYSTEM: 06 NOV 94. D88E E9DE DW DIRBUF D890 0000 DW 0 D892 29DE DW CSV1 D894 08DD DW ALV1 D896 0000 DPTWO DW 0 D898 0000000000 DW 0,0,0 D89E E9DE DW DIRBUF D8A0 0000 DW 0 D8A2 69DE DW CSV2 D8A4 53DD DW ALV2 D8A6 0000 DPTHRE DW 0 D8A8 0000000000 DW 0,0,0 D8AE E9DE DW DIRBUF D8B0 0000 DW 0 D8B2 A9DE DW CSV3 D8B4 9EDD DW ALV3 ***************************************************************** * * * CBIOS RAM LOCATIONS THAT DON'T NEED INITIALIZATION. * * * ***************************************************************** D8B6 00 CPMSEC DB 0 ;CP/M SECTOR # D8B7 00 CPMDRV DB 0 ;CP/M DRIVE # D8B8 00 CPMTRK DB 0 ;CP/M TRACK # D8B9 00 TRUESEC DB 0 ;DISK JOCKEY SECTOR THAT CONTAINS CP/M SECTOR D8BA 00 BUFDRV DB 0 ;DRIVE THAT BUFFER BELONGS TO D8BB 00 BUFTRK DB 0 ;TRACK THAT BUFFER BELONGS TO D8BC 00 BUFSEC DB 0 ;SECTOR THAT BUFFER BELONGS TO D8BD BUFFER DS 1024 ;MAXIMUM SIZE BUFFER FOR 1K SECTORS DCBD ALV0 DS 75 ;ALLOCATION VECTOR FOR DRIVE A DD08 ALV1 DS 75 ;ALLOCATION VECTOR FOR DRIVE B DD53 ALV2 DS 75 ;ALLOCATION VECTOR FOR DRIVE C DD9E ALV3 DS 75 ;ALLOCATION VECTOR FOR DRIVE D DDE9 CSV0 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE A DE29 CSV1 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE B DE69 CSV2 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE C DEA9 CSV3 DS 64 ;DIRECTORY CHECK VECTOR FOR DRIVE D DEE9 DIRBUF DS 128 ;DIRECTORY BUFFER DF69 END