CP/M MACRO ASSEM 2.0 #001 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ;NEWRLEE.ASM VERSION OF 10 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: 10 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 PAGE CP/M MACRO ASSEM 2.0 #002 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * THE FOLLOWING EQUATES RELATE THE THINKER TOYS 2D CON- * * TROLLER. 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 PAGE CP/M MACRO ASSEM 2.0 #003 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * 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 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 PAGE CP/M MACRO ASSEM 2.0 #004 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * 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 C370D6 JMP CONIST ;CONSOLE STATUS ROUTINE D309 C34ED6 JMP CONIN ;CONSOLE INPUT D30C C35ED6 COUT JMP CONOUT ;CONSOLE OUTPUT D30F C3A4D6 JMP LSTOUT ;LIST DEVICE OUTPUT D312 C397D6 JMP PUNOUT ;PUNCH DEVICE OUTPUT D315 C37DD6 JMP RDRIN ;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 C3B1D6 JMP LSTOST ;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 5665727369 DB 'Version of 8 Nov 94 ' D38D 0D0A00 DB ACR,ALF,0 PAGE CP/M MACRO ASSEM 2.0 #005 CBIOS FOR RLEEs SYSTEM: 10 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 PAGE CP/M MACRO ASSEM 2.0 #006 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * 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 CD5BD7 CALL TINIT ;INITIALIZE THE TERMINAL D3A3 2136D3 LXI H,PROMPT ;PREP FOR SENDING SIGNON MSG D3A6 CD90D3 CALL MESSAGE ;SEND THE PROMPT D3A9 AF XRA A ;SELECT DISK A D3AA 32F4D8 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 32F9D8 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 D3D4 4F MOV C,A ; SELECTED DISK IN C 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 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 PAGE CP/M MACRO ASSEM 2.0 #007 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * 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 PAGE CP/M MACRO ASSEM 2.0 #008 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * WBOOT LOADS IN ALL OF CP/M EXCEPT THE CBIOS, THEN INITIAL-* * IZES 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 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 PAGE CP/M MACRO ASSEM 2.0 #009 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. 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 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 PAGE CP/M MACRO ASSEM 2.0 #010 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * 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 32F3D8 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 32F5D8 STA CPMTRK ;CP/M TRACK # D4A4 C9 RET PAGE CP/M MACRO ASSEM 2.0 #011 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * SECTRAN TRANSLATES A LOGICAL SECTOR # INTO A PHYSICAL * * SECTOR #. * * * ************************************************************* D4A5 03 SECTRAN INX B 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 PAGE CP/M MACRO ASSEM 2.0 #012 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * 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 32F4D8 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 D4E3 3E01 MVI A,1 ;SELECT SECTOR 1 OF TRACK 1 D4E5 32F6D8 STA TRUESEC D4E8 32F5D8 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 CP/M MACRO ASSEM 2.0 #013 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. D51C 1133D8 LXI D,DPB128S ;BASE FOR SINGLE SIDED DPB'S D51F C225D5 JNZ SIDEOK D522 1173D8 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 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 PAGE CP/M MACRO ASSEM 2.0 #014 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * GETDPB RETURNS HL POINTING TO THE DPB OF THE CURRENTLY * * SELECTED DRIVE, DE POINTING TO DPH. * * * ************************************************************* D54F 3AF4D8 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 11B3D8 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 65D7 XLTS DW XLT128 ;XLT FOR 128 BYTE SECTORS D56A 80D7 DW XLT256 ;XLT FOR 256 BYTE SECTORS D56C B5D7 DW XLT512 ;XLT FOR 512 BYTE SECTORS D56E F2D7 DW XLT124 ;XLT FOR 1024 BYTE SECTORS PAGE CP/M MACRO ASSEM 2.0 #015 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * 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. * * * ************************************************************* 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 PAGE CP/M MACRO ASSEM 2.0 #016 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * 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 D57C = SECSIZ EQU $-1 ; THE LOG2 OF THE PHYSICAL ; SECTOR SIZE/128 ON THE ; CURRENTLY SELECTED DISK. D57D 3AF3D8 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 CARRY 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 32F6D8 STA TRUESEC ;SAVE THE PHYSICAL SECTOR ; NUMBER D596 21F4D8 LXI H,CPMDRV ;POINTER TO DESIRED DRIVE, ; AND SECTOR D599 11F7D8 LXI D,BUFDRV ;POINTER TO BUFFER DRIVE, ; TRACK AND SECTOR 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 PAGE CP/M MACRO ASSEM 2.0 #017 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * 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 PAGE CP/M MACRO ASSEM 2.0 #018 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * MOVE HAS BEEN MODIFIED TO CAUSE EITHER A TRANSFER INTO OR * * OUT THE BUFFER. * * * ************************************************************* D5AD 3AF3D8 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 ; SECTOR 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 11FAD8 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 ; 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 CP/M MACRO ASSEM 2.0 #019 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * 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 3AF7D8 LDA BUFDRV ;GET DRIVE NUMBER INVOLVED ; IN THE OPERATION D5F6 4F MOV C,A D5F7 CD33D3 CALL DJDRV ;SELECT THE DRIVE D5FA 3AF8D8 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 3AF9D8 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 D615 4F MOV C,A ;C <- SECTOR # D616 CD0FE4 CALL DJSEC ;SET THE SECTOR TO TRANSFER D619 01FAD8 LXI B,BUFFER ;SET THE DMA ADDRESS D61C CD12E4 CALL DJDMA D61F CD15E4 CALL DJREAD ;THE READ OPERATION IS ; MODIFIED TO WRITE CP/M MACRO ASSEM 2.0 #020 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. 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 PAGE CP/M MACRO ASSEM 2.0 #021 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * 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 11F4D8 LXI D,CPMDRV ;UPDATE THE DRIVE, TRACK, ; AND SECTOR D635 21F7D8 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 ************************************************************* * * * 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 BYTE 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 PAGE CP/M MACRO ASSEM 2.0 #022 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * 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. * * * ************************************************************* ;I/O ROUTINES FOR NORTHSTAR MOTHERBOARD D64E CDE2D5 CONIN: CALL FLUSH ;FLUSH THE DISK BUFFER D651 1E01 MVI E,1 ;CONSOLE INPUT D653 CDBED6 CALL REDIR ; IOBYTE: 76543210 D656 D2D6 DW TTYIN ;CON: = TTY: XXXXXX00 D658 F9D6 DW CRTIN ;CON: = CRT: XXXXXX01 D65A 7DD6 DW RDRIN ;CON: = BAT: XXXXXX10 D65C 20D7 DW UC1IN ;CON: = UC1: XXXXXX11 D65E C5 CONOUT: PUSH B ;SAVE THE CHARACTER D65F CDE2D5 CALL FLUSH ;FLUSH THE DISK BUFFER D662 C1 POP B ;RESTORE THE CHARACTER D663 1E01 MVI E,1 ;CONSOLE OUTPUT D665 CDBED6 CALL REDIR ; IOBYTE: 76543210 D668 DED6 DW TTYOUT ;CON: = TTY: XXXXXX00 D66A 05D7 DW CRTOUT ;CON: = CRT: XXXXXX01 D66C A4D6 DW LSTOUT ;CON: = BAT: XXXXXX10 D66E 32D7 DW UC1OUT ;CON: = UC1: XXXXXX11 D670 1E01 CONIST: MVI E,1 ;CONSOLE INPUT STATUS D672 CDBED6 CALL REDIR ; IOBYTE: 76543210 D675 E9D6 DW TTYIST ;CON: = TTY: XXXXXX00 D677 10D7 DW CRTIST ;CON: = CRT: XXXXXX01 D679 8AD6 DW RDRIST ;CON: = BAT: XXXXXX10 D67B 4BD7 DW UC1IST ;CON: = UC1: XXXXXX11 D67D 1E07 RDRIN: MVI E,7 ;READER INPUT D67F CDBED6 CALL REDIR ; IOBYTE: 76543210 D682 D2D6 DW TTYIN ;RDR: = TTY: XXXX00XX D684 F9D6 DW PTRIN ;RDR: = PTR: XXXX01XX D686 20D7 DW UR1IN ;RDR: = UR1: XXXX10XX D688 20D7 DW UR2IN ;RDR: = UR2: XXXX11XX D68A 1E07 RDRIST: MVI E,7 ;READER INPUT STATUS D68C CDBED6 CALL REDIR ; IOBYTE: 76543210 D68F E9D6 DW TTYIST ;RDR: = TTY: XXXX00XX D691 10D7 DW PTRIST ;RDR: = PTR: XXXX01XX D693 4BD7 DW UR1IST ;RDR: = UR1: XXXX10XX D695 4BD7 DW UR2IST ;RDR: = UR2: XXXX11XX CP/M MACRO ASSEM 2.0 #023 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. D697 1E05 PUNOUT: MVI E,5 ;PUNCH OUTPUT D699 CDBED6 CALL REDIR ; IOBYTE: 76543210 D69C DED6 DW TTYOUT ;PUN: = TTY: XX00XXXX D69E 05D7 DW PTPOUT ;PUN: = PTP: XX01XXXX D6A0 32D7 DW UP1OUT ;PUN: = UP1: XX10XXXX D6A2 32D7 DW UP2OUT ;PUN: = UP2: XX11XXXX D6A4 1E03 LSTOUT: MVI E,3 ;LIST OUTPUT D6A6 CDBED6 CALL REDIR ; IOBYTE: 76543210 D6A9 DED6 DW TTYOUT ;LST: = TTY: 00XXXXXX D6AB 05D7 DW CRTOUT ;LST: = CRT: 01XXXXXX D6AD 32D7 DW LPTOUT ;LST: = LPT: 10XXXXXX D6AF 32D7 DW UL1OUT ;LST: = UL1: 11XXXXXX D6B1 1E03 LSTOST: MVI E,3 ;LIST OUTPUT STATUS D6B3 CDBED6 CALL REDIR ; IOBYTE: 76543210 D6B6 F1D6 DW TTYOST ;LST: = TTY: 00XXXXXX D6B8 18D7 DW CRTOST ;LST: = CRT: 01XXXXXX D6BA 53D7 DW LPTOST ;LST: = LPT: 10XXXXXX D6BC 53D7 DW UL1OST ;LST: = UL1: 11XXXXXX D6BE 3A0300 REDIR: LDA IOBYTE ;GET THE INTEL STANDARD ; IOBYTE D6C1 07 REDIR0: RLC ;SHIFT THE NEXT FIELD IN D6C2 1D DCR E ;BUMP THE SHIFT COUNT D6C3 C2C1D6 JNZ REDIR0 D6C6 E606 REDIR1: ANI 110B ;MASK THE REDIRECTION ; FIELD D6C8 5F MOV E,A ;MAKE THE WORD TABLE ; OFFSET D6C9 1600 MVI D,0 D6CB E1 POP H ;GET THE TABLE BASE D6CC 19 DAD D ;OFFSET INTO OUR TABLE D6CD 7E MOV A,M ;LOAD THE LOW LEVEL I/O ; ROUTINE POINTER D6CE 23 INX H D6CF 66 MOV H,M D6D0 6F MOV L,A D6D1 E9 PCHL ;EXECUTE THE LOW LEVEL ; I/O DRIVER PAGE CP/M MACRO ASSEM 2.0 #024 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * CONYTP: 6 NORTH STAR * * * * THE FOLLOWING CODE IMPLEMENTS THE NORTH STAR CONSOLE I/O * * SYSTEM. THIS SYSTEM IS FOR USERS WHO PURCHASE A MORROW * * DESIGNS DISK SYSTEM TO REPLACE THEIR NORTH STAR DISK * * SYSTEM. THE MAPPING OF THE LOGICAL TO PHYSICAL ENTRY * * POINTS IS PERFORMED AS FOLLOWS: * * * * DEVICE NAME LEFT RIGHT PARALLEL * * SERIAL SERIAL PORT * * * * CONSOLE CON: = TTY: CRT: UC1: * * READER RDR: = TTY: PTR: UR1: * * PUNCH PUN: = TTY: PTP: UP1: * * LIST LST: = TTY: CRT: UL1: * * * * FOR EXAMPLE, TO USE A PRINTER CONNECTED TO THE RIGHT * * SERIAL PORT, USE THE CP/M COMMAND: * * * * STAT LST:=CRT: * * * * LIKEWISE, THE CP/M COMMAND "STAT LST:=UL1:" IS USED IF * * YOU HAVE A PRINTER CONNECTED TO THE PARALLEL PORT. * * * ************************************************************* 0002 = NSLDAT EQU 2 ;LEFT SERIAL PORT DATA PORT 0003 = NSLSTA EQU 3 ;LEFT SERIAL PORT STATUS PORT 0004 = NSRDAT EQU 4 ;RIGHT SERIAL PORT DATA PORT 0005 = NSRSTA EQU 5 ;RIGHT SERIAL PORT STATUS PORT 0001 = NSSTBE EQU 1 ;TRANSMITTER BUFFER EMPTY ; STATUS BIT 0002 = NSSRBR EQU 2 ;RECIEVER BUFFER READY ; STATUS BIT ;SEE THE 8251 DATA SHEETS FOR ; MORE CONFIGURATION ; INFORMATION. PAGE CP/M MACRO ASSEM 2.0 #025 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. 00CE = NSLIN1 EQU 0CEH ;LEFT SERIAL PORT ; INITIALIZATION # 1 00CE = NSRIN1 EQU 0CEH ;RIGHT SERIAL PORT ; INITIALIZATION # 1 ;76543210 BIT DEFINATIONS ;11001110 DEFAULT ; CONFIGURATION ;XXXXXX00 SYNCHRONOUS MODE ;XXXXXX01 1X CLOCK RATE ;XXXXXX10 16X CLOCK RATE ;XXXXXX11 64X CLOCK RATE ;XXXX00XX 5 BIT CHARACTERS ;XXXX01XX 6 BIT CHARACTERS ;XXXX10XX 7 BIT CHARACTERS ;XXXX11XX 8 BIT CHARACTERS ;XXX0XXXX PARITY DISBABLE ;XXX1XXXX PARITY ENABLE ;XX0XXXXX ODD PARITY ; GENERATION/CHECK ;XX1XXXXX EVEN PARITY ; GENERATION/CHECK ;00XXXXXX INVALID ;01XXXXXX 1 STOP BIT ;10XXXXXX 1.5 STOP BITS ;11XXXXXX 2 STOP BITS 0037 = NSLIN2 EQU 37H ;LEFT SERIAL PORT ; INITIALIZATION # 2 0037 = NSRIN2 EQU 37H ;RIGHT SERIAL PORT ; INITIALIZATION # 2 ;76543210 BIT DEFINATIONS ;00110111 DEFAULT ; CONFIGURATION ;XXXXXXX1 ENABLE TRANSMITTER ;XXXXXX1X ASSERT DTR* ;XXXXX1XX ENABLE RECIEVER ;XXXX1XXX SEND BREAK ; CHARACTER, TXD LOW ;XXX1XXXX RESET PE, OE, FE ; ERROR FLAGS ;XX1XXXXX ASSERT RTS* ;X1XXXXXX INTERNAL RESET ;1XXXXXXX ENTER HUNT MODE ; FOR (SYNC) 0000 = NSPDAT EQU 0 ;PARALLEL DATA PORT 0006 = NSPSTA EQU 6 ;PARALLEL STATUS PORT 0001 = NSPRBR EQU 1 ;RECIEVER BUFFER READY ; STATUS BIT 0002 = NSPTBE EQU 2 ;TRANSMITTER BUFFER EMPTY ; STATUS BIT 00C0 = NSRAM EQU 0C0H ;NORTH STAR MEMORY PARITY ; PORT, SET TO 0 FOR NO ; NORTHSTAR RAM PAGE CP/M MACRO ASSEM 2.0 #026 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * LEFT SERIAL PORT ROUTINES. USE TTY: DEVICE. * * * ************************************************************* TTYIN: ;READ A CHARACTER D6D2 DB03 IN NSLSTA D6D4 E602 ANI NSSRBR D6D6 CAD2D6 JZ TTYIN ;WAIT TILL A CHARACTER IS ; READY D6D9 DB02 IN NSLDAT ;GET THE CHARACTER D6DB E67F ANI 7FH ;STRIP PARITY D6DD C9 RET TTYOUT: ;WRITE A CHARACTER D6DE DB03 IN NSLSTA D6E0 E601 ANI NSSTBE D6E2 CADED6 JZ TTYOUT ;WAIT TILL THE BUFFER IS ; EMPTY D6E5 79 MOV A,C ;WRITE THE CHARACTER D6E6 D302 OUT NSLDAT D6E8 C9 RET TTYIST: ;RETURN INPUT BUFFER STATUS D6E9 DB03 IN NSLSTA D6EB E602 ANI NSSRBR D6ED C8 RZ ;RETURN NOT READY D6EE 3EFF MVI A,0FFH D6F0 C9 RET ;THERE IS A CHARACTER READY TTYOST: ;RETURN OUTPUT BUFFER STATUS D6F1 DB03 IN NSLSTA D6F3 E601 ANI NSSTBE D6F5 C8 RZ ;RETURN NOT READY D6F6 3EFF MVI A,0FFH D6F8 C9 RET ;RETURN READY PAGE CP/M MACRO ASSEM 2.0 #027 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * RIGHT SERIAL PORT ROUTINES. USE CRT:, PTR:, * * AND PTP: DEVICES. * * * ************************************************************* CRTIN: ;READ A CHARACTER PTRIN: D6F9 DB05 IN NSRSTA D6FB E602 ANI NSSRBR D6FD CAF9D6 JZ CRTIN ;WAIT TILL A CHARACTER IS ; READY D700 DB04 IN NSRDAT ;GET THE CHARACTER D702 E67F ANI 7FH ;STRIP PARITY D704 C9 RET CRTOUT: ;WRITE A CHARACTER PTPOUT: D705 DB05 IN NSRSTA D707 E601 ANI NSSTBE D709 CA05D7 JZ CRTOUT ;WAIT TILL THE BUFFER IS ; EMPTY D70C 79 MOV A,C ;WRITE THE CHARACTER D70D D304 OUT NSRDAT D70F C9 RET CRTIST: ;RETURN INPUT BUFFER STATUS PTRIST: D710 DB05 IN NSRSTA D712 E602 ANI NSSRBR D714 C8 RZ ;RETURN NOT READY D715 3EFF MVI A,0FFH D717 C9 RET ;THERE IS A CHARACTER READY CRTOST: ;RETURN OUTPUT BUFFER STATUS D718 DB05 IN NSRSTA D71A E601 ANI NSSTBE D71C C8 RZ ;RETURN NOT READY D71D 3EFF MVI A,0FFH D71F C9 RET ;RETURN READY PAGE CP/M MACRO ASSEM 2.0 #028 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * PARALLEL PORT ROUTINES. USE UC1:, UR1:, UR2:, UP1:, * * UP2:, LPT:, AND UL1: DEVICES. * * * ************************************************************* UC1IN: ;READ A CHARACTER UR1IN: UR2IN: D720 DB06 IN NSPSTA D722 E601 ANI NSPRBR D724 CA20D7 JZ UC1IN ;WAIT TILL A CHARACTER IS ; READY D727 DB00 IN NSPDAT ;GET THE CHARACTER D729 F5 PUSH PSW D72A 3E30 MVI A,30H ;RESET THE PARALLEL INPUT ; FLAG D72C D306 OUT NSPSTA D72E F1 POP PSW D72F E67F ANI 7FH ;STRIP PARITY D731 C9 RET UC1OUT: ;WRITE A CHARACTER UP1OUT: UP2OUT: LPTOUT: UL1OUT: D732 DB06 IN NSPSTA D734 E602 ANI NSPTBE D736 CA32D7 JZ UC1OUT ;WAIT TILL THE BUFFER IS ; EMPTY D739 3E20 MVI A,20H ;RESET THE PARALLEL OUTPUT ; FLAG D73B D306 OUT NSPSTA D73D 79 MOV A,C ;WRITE THE CHARACTER, STROBE ; BIT 7 D73E F680 NSPOUT: ORI 80H D740 D300 OUT NSPDAT D742 E67F ANI 7FH D744 D300 OUT NSPDAT D746 F680 ORI 80H D748 D300 OUT NSPDAT D74A C9 RET UC1IST: ;RETURN INPUT BUFFER STATUS UR1IST: UR2IST: D74B DB06 IN NSPSTA D74D E601 ANI NSPRBR D74F C8 RZ ;RETURN NOT READY D750 3EFF MVI A,0FFH D752 C9 RET ;RETURN READY PAGE CP/M MACRO ASSEM 2.0 #029 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. LPTOST: ;RETURN OUTPUT BUFFER STATUS UL1OST: D753 DB06 IN NSPSTA D755 E602 ANI NSPTBE D757 C8 RZ ;RETURN NOT READY D758 3EFF MVI A,0FFH D75A C9 RET ;RETURN READY ************************************************************* * * * TINIT CAN BE MODIFIED FOR DIFFERENT I/O SETUPS. * * * ************************************************************* D75B 0E1A TINIT MVI C,CLEAR ;INITIALIZE THE TERMINAL ; ROUTINE D75D 3E00 MVI A,INTIOBY ;INITIALIZE IOBYTE D75F 320300 STA IOBYTE D762 C30CD3 JMP COUT PAGE CP/M MACRO ASSEM 2.0 #030 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * 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. * * * ************************************************************* D765 00 XLT128 DB 0 D766 01070D1319 DB 1,7,13,19,25 D76B 050B1117 DB 5,11,17,23 D76F 03090F15 DB 3,9,15,21 D773 02080E141A DB 2,8,14,20,26 D778 060C1218 DB 6,12,18,24 D77C 040A1016 DB 4,10,16,22 D780 00 XLT256 DB 0 D781 0102131425 DB 1,2,19,20,37,38 D787 0304151627 DB 3,4,21,22,39,40 D78D 0506171829 DB 5,6,23,24,41,42 D793 0708191A2B DB 7,8,25,26,43,44 D799 090A1B1C2D DB 9,10,27,28,45,46 D79F 0B0C1D1E2F DB 11,12,29,30,47,48 D7A5 0D0E1F2031 DB 13,14,31,32,49,50 D7AB 0F10212233 DB 15,16,33,34,51,52 D7B1 11122324 DB 17,18,35,36 D7B5 00 XLT512 DB 0 D7B6 0102030411 DB 1,2,3,4,17,18,19,20 D7BE 2122232431 DB 33,34,35,36,49,50,51,52 D7C6 0506070815 DB 5,6,7,8,21,22,23,24 D7CE 2526272835 DB 37,38,39,40,53,54,55,56 D7D6 090A0B0C19 DB 9,10,11,12,25,26,27,28 D7DE 292A2B2C39 DB 41,42,43,44,57,58,59,60 D7E6 0D0E0F101D DB 13,14,15,16,29,30,31,32 D7EE 2D2E2F30 DB 45,46,47,48 D7F2 00 XLT124 DB 0 D7F3 0102030405 DB 1,2,3,4,5,6,7,8 D7FB 191A1B1C1D DB 25,26,27,28,29,30,31,32 D803 3132333435 DB 49,50,51,52,53,54,55,56 D80B 090A0B0C0D DB 9,10,11,12,13,14,15,16 D813 2122232425 DB 33,34,35,36,37,38,39,40 D81B 393A3B3C3D DB 57,58,59,60,61,62,63,64 D823 1112131415 DB 17,18,19,20,21,22,23,24 D82B 292A2B2C2D DB 41,42,43,44,45,46,47,48 PAGE CP/M MACRO ASSEM 2.0 #031 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * 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. * * * ************************************************************* D833 1A00 DPB128S DW 26 ;CP/M SECTORS/TRACK D835 03 DB 3 ;BSH D836 07 DB 7 ;BLM D837 00 DB 0 ;EXM D838 F200 DW 242 ;DSM D83A 3F00 DW 63 ;DRM D83C C0 DB 0C0H ;AL0 D83D 00 DB 0 ;AL1 D83E 1000 DW 16 ;CKS D840 0200 DW 2 ;OFF D842 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. * * * ************************************************************* D843 3400 DPB256S DW 52 ;CP/M SECTORS/TRACK D845 04 DB 4 ;BSH D846 0F DB 15 ;BLM D847 00 DB 0 ;EXM D848 F200 DW 242 ;DSM D84A 7F00 DW 127 ;DRM D84C C0 DB 0C0H ;AL0 D84D 00 DB 0 ;AL1 D84E 2000 DW 32 ;CKS D850 0200 DW 2 ;OFF D852 12 DB 12H ;16*((#CPM SECTORS/PHYSICAL ;SECTOR) -1) + LOG2(#BYTES ;PER SECTOR/128) + 1 + 8 ;IF DOUBLE SIDED. PAGE CP/M MACRO ASSEM 2.0 #032 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 512 BYTE SECTORS, * * DOUBLE DENSITY, AND SINGLE SIDED. * * * ************************************************************* D853 3C00 DPB512S DW 60 ;CP/M SECTORS/TRACK D855 04 DB 4 ;BSH D856 0F DB 15 ;BLM D857 00 DB 0 ;EXM D858 1801 DW 280 ;DSM D85A 7F00 DW 127 ;DRM D85C C0 DB 0C0H ;AL0 D85D 00 DB 0 ;AL1 D85E 2000 DW 32 ;CKS D860 0200 DW 2 ;OFF D862 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. * * * ************************************************************* D863 4000 DP1024S DW 64 ;CP/M SECTORS/TRACK D865 04 DB 4 ;BSH D866 0F DB 15 ;BLM D867 00 DB 0 ;EXM D868 2B01 DW 299 ;DSM D86A 7F00 DW 127 ;DRM D86C C0 DB 0C0H ;AL0 D86D 00 DB 0 ;AL1 D86E 2000 DW 32 ;CKS D870 0200 DW 2 ;OFF D872 74 DB 74H ;16*((#CPM SECTORS/PHYSICAL ;SECTOR) -1) + LOG2(#BYTES ;PER SECTOR/128) + 1 + ;8 IF DOUBLE SIDED. PAGE CP/M MACRO ASSEM 2.0 #033 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * THE FOLLOWING DPB DEFINES A DISKETTE FOR 128 BYTE SECTORS,* * SINGLE DENSITY, AND DOUBLE SIDED. * * * ************************************************************* D873 3400 DPB128D DW 52 ;CP/M SECTORS/TRACK D875 04 DB 4 ;BSH D876 0F DB 15 ;BLM D877 01 DB 1 ;EXM D878 F200 DW 242 ;DSM D87A 7F00 DW 127 ;DRM D87C C0 DB 0C0H ;AL0 D87D 00 DB 0 ;AL1 D87E 2000 DW 32 ;CKS D880 0200 DW 2 ;OFF D882 09 DB 9H ************************************************************* * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 256 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ************************************************************* D883 6800 DPB256D DW 104 ;CP/M SECTORS/TRACK D885 04 DB 4 ;BSH D886 0F DB 15 ;BLM D887 00 DB 0 ;EXM D888 E601 DW 486 ;DSM D88A FF00 DW 255 ;DRM D88C F0 DB 0F0H ;AL0 D88D 00 DB 0 ;AL1 D88E 4000 DW 64 ;CKS D890 0200 DW 2 ;OFF D892 1A DB 1AH PAGE CP/M MACRO ASSEM 2.0 #034 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 512 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ************************************************************* D893 7800 DPB512D DW 120 ;CP/M SECTORS/TRACK D895 04 DB 4 ;BSH D896 0F DB 15 ;BLM D897 00 DB 0 ;EXM D898 3102 DW 561 ;DSM D89A FF00 DW 255 ;DRM D89C F0 DB 0F0H ;AL0 D89D 00 DB 0 ;AL1 D89E 4000 DW 64 ;CKS D8A0 0200 DW 2 ;OFF D8A2 3B DB 3BH ************************************************************* * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 1024 BYTE SECTORS,* * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ************************************************************* D8A3 8000 DP1024D DW 128 ;CP/M SECTORS/TRACK D8A5 04 DB 4 ;BSH D8A6 0F DB 15 ;BLM D8A7 00 DB 0 ;EXM D8A8 5702 DW 599 ;DSM D8AA FF00 DW 255 ;DRM D8AC F0 DB 0F0H ;AL0 D8AD 00 DB 0 ;AL1 D8AE 4000 DW 64 ;CKS D8B0 0200 DW 2 ;OFF D8B2 7C DB 7CH PAGE CP/M MACRO ASSEM 2.0 #035 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * CP/M DISK PARAMETER HEADERS, UNITIALIZED. * * * ************************************************************* D8B3 0000 DPZERO DW 0 ;ADDRESS OF TRANSLATION TABLE ; (FILLED IN BY SETDRV) D8B5 0000000000 DW 0,0,0 ;USED BY BDOS D8BB 26DF DW DIRBUF ;ADDRESS OF DIRECTORY BUFFER D8BD 0000 DW 0 ;ADDRESS OF DPB (FILLED IN ; BY SETDRV) D8BF 26DE DW CSV0 ;DIRECTORY CHECK VECTOR D8C1 FADC DW ALV0 ;ALLOCATION VECTOR D8C3 0000 DPONE DW 0 D8C5 0000000000 DW 0,0,0 D8CB 26DF DW DIRBUF D8CD 0000 DW 0 D8CF 66DE DW CSV1 D8D1 45DD DW ALV1 D8D3 0000 DPTWO DW 0 D8D5 0000000000 DW 0,0,0 D8DB 26DF DW DIRBUF D8DD 0000 DW 0 D8DF A6DE DW CSV2 D8E1 90DD DW ALV2 D8E3 0000 DPTHRE DW 0 D8E5 0000000000 DW 0,0,0 D8EB 26DF DW DIRBUF D8ED 0000 DW 0 D8EF E6DE DW CSV3 D8F1 DBDD DW ALV3 PAGE CP/M MACRO ASSEM 2.0 #036 CBIOS FOR RLEEs SYSTEM: 10 NOV 94. ************************************************************* * * * CBIOS RAM LOCATIONS THAT DON'T NEED INITIALIZATION. * * * ************************************************************* D8F3 00 CPMSEC DB 0 ;CP/M SECTOR # D8F4 00 CPMDRV DB 0 ;CP/M DRIVE # D8F5 00 CPMTRK DB 0 ;CP/M TRACK # D8F6 00 TRUESEC DB 0 ;DISK JOCKEY SECTOR THAT ; CONTAINS CP/M SECTOR D8F7 00 BUFDRV DB 0 ;DRIVE THAT BUFFER BELONGS TO D8F8 00 BUFTRK DB 0 ;TRACK THAT BUFFER BELONGS TO D8F9 00 BUFSEC DB 0 ;SECTOR THAT BUFFER BELONGS TO D8FA BUFFER DS 1024 ;MAXIMUM SIZE BUFFER FOR 1K ; SECTOR DCFA ALV0 DS 75 ;ALLOCATION VECTOR FOR DRV A DD45 ALV1 DS 75 ;ALLOCATION VECTOR FOR DRV B DD90 ALV2 DS 75 ;ALLOCATION VECTOR FOR DRV C DDDB ALV3 DS 75 ;ALLOCATION VECTOR FOR DRV D DE26 CSV0 DS 64 ;DIRECTORY CHECK VECTOR ; DRIVE A DE66 CSV1 DS 64 ;DIRECTORY CHECK VECTOR ; DRIVE B DEA6 CSV2 DS 64 ;DIRECTORY CHECK VECTOR ; DRIVE C DEE6 CSV3 DS 64 ;DIRECTORY CHECK VECTOR ; DRIVE D DF26 DIRBUF DS 128 ;DIRECTORY BUFFER DFA6 END