:-------------------------------------------------------- : : PROGRAM ID: GBIOS3.ASM : GENERIC LOADER AND BIOS FOR CP/M PLUS : FOR CP/M-80 V2.2 SYSTEMS : UNBANKED : NO HASHING : BIOS PERFORMS BLOCKING/DEBLOCKING : :-------------------------------------------------------- : : ORGANIZATIONAL COMMENTARY : :-------------------------------------------------------- : THIS BIOS IS DESIGNED TO BE THE USER'S FIRST STEP :IN MAKING AN UPGRADE FROM CP/M-80 V2.2 TO CP/M PLUS V3.0. :THIS BIOS WILL FUNCTION PROPERLY IN MOST CP/M-2 SYSTEMS, :EVEN THOSE WITH THE BIOS IN PROM. : :FUNCTION: : THIS PROGRAM IMPLEMENTS AN UNBANKED, NON-HASHED, :UNBUFFERED BIOS FOR CP/M PLUS VERSION 3.0. : :METHOD: : CP/M PLUS ALLOWS MANY LEVELS OF SOPHISTOCATION IN :THE IMPLEMENTATION OF THE BIOS. AT THE HIGHEST LEVELS, :THE BIOS ALLOWS CP/M PLUS TO MANAGE A POTENTIALLY LARGE :MEMORY POOL WHICH ACTS LIKE AN INSTANT ACCESS DISK DRIVE: :A SUBSTANTIAL PERFORMENCE ENHANCEMENT. AT THE LOWEST LEVEL, :THE PERFORMANCE OF CP/M PLUS IS THE SAME AS THAT OF CP/M-80 :VERSION 2.2. THIS INTERFACE PROGRAM IS A SIMPLE IMPLEMENTATION :OF A CP/M PLUS BIOS WHICH OPERATES AS A PARASITE TO THE USER'S :EXISTING BIOS FOR CP/M-80 VERSION 2.2. : :PURPOSE: : THIS BIOS ALLOWS THE CP/M-80 V2.2 USER TO EASILY :UPGRADE TO CP/M PLUS V3.0 AND ENJOY ITS LOGICAL ENHANCEMENTS :AT THE SAME LEVEL OF PERFORMANCE HE HAS ENJOYED WITH V2.2. :THIS BIOS CAN BE AN END-POINT SINCE SYSTEM PERFORMANCE :WILL BE SATISFACTORY. FOR USERS WHO OWN THE HARDWARE :REQUIRED TO IMPLEMENT HASHING AND BUFFERING, THIS BIOS :WILL SERVE AS A WELCOME STARTING POINT FOR FURTHER ENHANCEMENT. : :ORGANIZATION: : THIS BIOS IS ORGANIZED AS FOLLOWS: : : CONSTANTS : CONFIGURATION CONSTANTS AND CONDITIONS *** : EXTERNAL REFERENCES : PUBLIC DECLARATIONS : RAM DEFINITIONS : CP/M 2.2 LINKAGE EQUATES : : CP/M PLUS JUMP TABLE : INITIALIZATION PROCESSES : LOCAL AND NULL PROCESSES : SIMPLE INDEXED PROCESSES : COMPLEX INDEXED PROCESSES : LOCAL SUBROUTINES : INITIALIZED STORAGE : UNINITIALIZED STORAGE : END : : *** EDIT THESE :-------------------------------------------------------- : : OPERATIONAL COMMENTARY : :-------------------------------------------------------- : : DIGITAL RESEARCH OWES MUCH OF ITS SUCCESS TO THE :FORESIGHT OF ITS OPERATING SYSTEM DESIGNERS WHO HAVE SEEN :FIT TO MAKE THEIR PRODUCTS UPWARD COMPATIBLE WITH ONE :ANOTHER. CP/M PLUS IS NO EXCEPTION, AND SO IT IS NO :SURPRISE THAT THE CP/M PLUS BIOS SHARES MANY CONSTRUCTS :WITH THE EARLIER CP/M-80 V2.2. : : THE CP/M PLUS BIOS IMPLEMENTS 32 ENTRY POINTS IN :ITS JUMP TABLE. OF THESE, THE FIRST 17 CORRESPOND TO THE :17 ENTRIES IN THE CP/M-80 V2.2 JUMP TABLE. 14 OF THESE :ARE TREATED AS IDENTICAL TO THOSE IN 2.2. THESE INDEX :DIRECTLY INTO THE 2.2 JUMP TABLE. THE REMAINING THREE IN THE :2.2 SET ARE BOOT, WHICH IS NULL, WBOOT, WHICH LOADS CCP.COM, :AND SELDSK WHICH CREATES ALL OF THE NECESSARY DISK DATA :STRUCTURES REQUIRED BY CP/M PLUS BASED ON THOSE IN THE 2.2 BIOS. :THE REMAINING 15 ENTRIES IN THE CP/M PLUS BIOS, WITH THE :SINGLE EXCEPTION OF MOVE, ARE IMPLEMENTED IN ONE OF :THE FOLLOWING WAYS: : : 1.> NULL, SIMPLY RETURN. : 2.> NEARLY NULL, DO SOMETHING REALLY SIMPLE. : 3.> TELL A WHITE LIE. : :-------------------------------------------------------- : : CONSTANTS : :-------------------------------------------------------- FFFF = TRUE EQU -1 0000 = FALSE EQU NOT TRUE 00C3 = JMPOP EQU 0C3H 0001 = GETCH EQU 1 0009 = PRINT EQU 9 000F = OPEN EQU 15 0014 = READSEQ EQU 20 001A = DMA EQU 26 :-------------------------------------------------------- : : CONFIGURATION CONSTANTS AND CONDITIONS : :-------------------------------------------------------- 0010 = DRIVES EQU 16 :NUMBER OF DRIVES SUPPORTED E600 = BIOS EQU 0E600H :ADDRESS OF YOUR BIOS :LDRBIOS EQU TRUE 0000 = LDRBIOS EQU FALSE :-------------------------------------------------------- : : EXTERNAL REFERENCES : :-------------------------------------------------------- EXTRN @CIVEC, @COVEC, @AOVEC, @LOVEC, @BNKBF EXTRN @CRDMA EXTRN @CRDSK, @FX, @RESEL, @VINFO, @USRCD, @ERMDE EXTRN @DATE, @HOUR, @MIN, @SEC, @MXTPA :-------------------------------------------------------- : : PUBLIC DECLARATIONS : :-------------------------------------------------------- : :CURRENTLY NULL : :-------------------------------------------------------- : : RAM DEFINITIONS : :-------------------------------------------------------- 0003 = IOBYTE EQU 3 0100 = TPA EQU 100H 005C = DFFCB EQU 5CH 0100 = STACK80 EQU 100H 0000 = BOOTRAM EQU 0 0005 = BDOS EQU 5 0100 = CCP EQU TPA :-------------------------------------------------------- : : CP/M V2.2 LINKAGE EQUATES : :-------------------------------------------------------- 0000 = BOOT80 EQU 0 0003 = WARM80 EQU 3 0006 = CNST80 EQU 6 0009 = CNIN80 EQU 9 000C = CNOT80 EQU 12 000F = LIST80 EQU 15 0012 = PUNC80 EQU 18 0015 = REDR80 EQU 21 0018 = HOME80 EQU 24 001B = SLDS80 EQU 27 001E = STRK80 EQU 30 0021 = SSEC80 EQU 33 0024 = SDMA80 EQU 36 0027 = READ80 EQU 39 002A = WRIT80 EQU 42 002D = LSTA80 EQU 45 0030 = SCTR80 EQU 48 :-------------------------------------------------------- : : CP/M PLUS VERSION 3.0 JUMP TABLE : :-------------------------------------------------------- CSEG : ORG > AND 0FF00H : 0000 C36000 JMP BOOT :ARRIVE HERE FROM COLD START LOAD WARMPT: 0003 C36000 JMP WBOOT :ARRIVE HERE FOR WARM START 0006 C306E6 JMP CONST :RETURN CONSOLE INPUT STATUS 0009 C309E6 JMP CONIN :READ CONSOLE CHARACTER 000C C30CE6 JMP CONOUT :WRITE CONLOLE CHARACTER 000F C30FE6 JMP LIST :WRITE LIST CHARACTER 0012 C312E6 JMP AUXOUT :WRITE AUX CHARACTER 0015 C315E6 JMP AUXIN :READ AUX CHARACTER 0018 C318E6 JMP HOME :MOVE TO TRACK ZERO ON SELECTED DRIVE 001B C3EE00 JMP SELDSK :SELECT DISK DRIVE 001E C31EE6 JMP SETTRK :SET TRACK NUMBER 0021 C321E6 JMP SETSEC :SET SECTOR NUMBER 0024 C324E6 JMP SETDMA :SET DMA ADDRESS 0027 C327E6 JMP READ :READ SELECTED SECTOR 002A C32AE6 JMP WRITE :WRITE SELECTED SECTOR 002D C32DE6 JMP LISTST :RETURN LIST DEVICE STATUS 0030 C330E6 JMP SECTRN :TRANSLATE LOGICAL TO PHYSICAL SECTOR NUMBER 0033 C3D600 JMP CONOST :RETURN CONSOLE OUTPUT STATUS 0036 C3D600 JMP AUXIST :RETURN AUX DEVICE INPUT STATUS 0039 C3D600 JMP AUXOST :RETURN AUX DEVICE OUTPUT STATUS 003C C3DB00 JMP DEVTBL :RETURN ADDRESS OF CHARACTER I/O TABLE 003F C3D800 JMP DEVINI :INIT CHARACTER I/O DEVICES 0042 C3DF00 JMP DRVTBL :RETURN ADDRESS OF DISK DRIVE TABLE 0045 C3D800 JMP MULTIO :SET NUMBER OF CONSEC. SEC. TO READ/WRITE 0048 C3D900 JMP FLUSH :FLUSH USER BLOCKING BUFFERS 004B C3E300 JMP MOVE :COPY MEMORY TO MEMORY 004E C3D800 JMP XMOVE :SET BANKS FOR NEXT MOVE 0051 C3D800 JMP SELMEM :SELECT MEMORY BANK 0054 C3D800 JMP SETBNK :SET BANK FOR NEXT DMA 0057 C3D800 JMP USERF :RESERVED FOR ME. 005A C36000 JMP WBOOT 005D C36000 JMP WBOOT :RESERVED FOR DRI : : :-------------------------------------------------------- : : INITIALIZATION PROCESSES : :-------------------------------------------------------- BOOT: IF LDRBIOS RET ENDIF :BOOT IS NULL, FALLS THRU TO WBOOT WBOOT: 0060 310001 LXI SP,STACK80 : : INITIALIZE LOW MEMORY JUMPS : 0063 210300 LXI H,WARMPT 0066 220100 SHLD BOOTRAM+1 0069 2A0000 LHLD @MXTPA 006C 220600 SHLD BDOS+1 006F 3EC3 MVI A,JMPOP 0071 320000 STA BOOTRAM 0074 320500 STA BDOS : : LOAD CCP.COM INTO TPA : 0077 0624 MVI B,36 0079 215C00 LXI H,DFFCB 007C CD8301 CALL CLEAR :CLEAR FCB AREA IN LOW RAM 007F 215C00 LXI H,DFFCB 0082 3601 MVI M,1 :DRIVE A: 0084 23 INX H 0085 118B01 LXI D,CCPSTG :'CCP COM' 0088 010B00 LXI B,11 :LENGTH OF A FILE NAME 008B CDE300 CALL MOVE :MOVE FILENAME TO FCB 008E 115C00 LXI D,DFFCB 0091 0E0F MVI C,OPEN 0093 CD0500 CALL BDOS :OPEN CCP.COM 0096 B7 ORA A 0097 C2C000 JNZ OPERR :IF NO ERROR < 009A 110001 LXI D,TPA :LOAD INTO TPA : : THE LOAD LOOP : LDLOOP: 009D D5 PUSH D :THE CURRENT DMA ADDRESS 009E 0E1A MVI C,DMA 00A0 CD0500 CALL BDOS :SET DMA FOR NEXT 128 BYTE READ 00A3 115C00 LXI D,DFFCB 00A6 0E14 MVI C,READSEQ 00A8 CD0500 CALL BDOS :READ FILE DATA TO TPA RAM 00AB B7 ORA A :TEST FOR COMPLETE 00AC D1 POP D :RESTORE DMA ADDRESS 00AD C2B800 JNZ GOCPM :EXIT WHEN PAST FILE END 00B0 218000 LXI H,128 :ADVANCE DMA ADDRESS 128 BYTES 00B3 19 DAD D 00B4 EB XCHG 00B5 C39D00 JMP LDLOOP :LOOP : : GOCPM: 00B8 FE01 CPI 1 :ONLY LEGAL EXIT = PAST END OF FILE 00BA C2C600 JNZ RDERR 00BD C30001 JMP CCP :NOW TURN IT LOOSE : : OPERR: 00C0 119601 LXI D,OPNMSG :"BIOS CAN'T OPEN CCP.COM" 00C3 C3C900 JMP ERRS RDERR: 00C6 11B101 LXI D,ERRMSG :"BIOS HAS BAD SECTOR IN CCP.COM" ERRS: 00C9 0E09 MVI C,PRINT 00CB CD0500 CALL BDOS :PRINT THE COMPLAINT 00CE 0E01 MVI C,GETCH 00D0 CD0500 CALL BDOS :WAIT FOR ANY KEY 00D3 C36000 JMP WBOOT :TRY AGAIN AND AGAIN :-------------------------------------------------------- : : LOCAL AND NULL PROCESSES : :-------------------------------------------------------- CONOST: AUXIST: AUXOST: 00D6 3EFF MVI A,TRUE :THE WHITE LIES DEVINI: MULTIO: XMOVE: SELMEM: SETBNK: USERF: 00D8 C9 RET :THE NULL ROUTINES FLUSH: 00D9 AF XRA A :NOT IMPLEMENTED 00DA C9 RET DEVTBL: 00DB 21FFFF LXI H,-1 :NOT IMPLEMENTED 00DE C9 RET DRVTBL: 00DF 21FEFF LXI H,-2 :NO TABLE, NO HASHING 00E2 C9 RET MOVE: : Z80 USERS MAY CODE AS: : XCHG : DB 0EDH,0B0H :LDIR : XCHG : RET : 00E3 1A LDAX D 00E4 77 MOV M,A 00E5 23 INX H 00E6 13 INX D 00E7 0B DCX B 00E8 78 MOV A,B 00E9 B1 ORA C 00EA C2E300 JNZ MOVE 00ED C9 RET :-------------------------------------------------------- : : SIMPLE INDEXED PROCESSES : :-------------------------------------------------------- E606 = CONST EQU BIOS+CNST80 E609 = CONIN EQU BIOS+CNIN80 E60C = CONOUT EQU BIOS+CNOT80 E60F = LIST EQU BIOS+LIST80 E612 = AUXOUT EQU BIOS+PUNC80 E615 = AUXIN EQU BIOS+REDR80 E618 = HOME EQU BIOS+HOME80 E61E = SETTRK EQU BIOS+STRK80 E621 = SETSEC EQU BIOS+SSEC80 E624 = SETDMA EQU BIOS+SDMA80 E627 = READ EQU BIOS+READ80 E62A = WRITE EQU BIOS+WRIT80 E62D = LISTST EQU BIOS+LSTA80 E630 = SECTRN EQU BIOS+SCTR80 :-------------------------------------------------------- : : COMPLEX INDEXED FUNCTIONS : :-------------------------------------------------------- :THIS ROUTINE FUNCTIONS AS FOLLOWS: : 1.> THE REQUESTED DRIVE IS SAVED FOR USE AS INDEX LATER : 2.> SELDSK IN BIOS 2.2 IS CALLED TO SET-UP DISK TABLES : 3.> THE RETURNED BIOS 2.2 DPH ADDRESS IS SAVED : 4.> THE SAVED DRIVE NUMBER IS USED TO INDEX INTO A BLOCK : OF LENGTH . THE 64-BYTE AREA : RESERVED FOR THIS DRIVE IS INITIALLY CLEARED . : 5.> USING DATA TAKEN FROM DPH 2.2 RETURNED BY SELDSK 2.2, : A NEW DPH FOR 3.0 IS CONSTRUCTED, WITH DPB AND DIRBCB. : : LIKE THIS: : : DPH: 25 BYTES : NULL 7 BYTES : DPB: 17 BYTES : DIRBCB: 15 BYTES : : THE DPH REFERENCES DPB AND DIRBCB. DIRBCB REFERENCES : THE DIRBUF FROM DPH 2.2. XLT, CSV, ALV ARE FROM DPH2 : DPB3 IS COPIED DIRECTLY FROM THE DPB IN YOUR BIOS : SELDSK: 00EE 210000 LXI H,0 :BAD DRIVE 00F1 79 MOV A,C :DRIVE REQUEST 00F2 FE10 CPI DRIVES 00F4 D0 RNC :EXIT IF NO SPACE ALLOC FOR DRIVE 00F5 43 MOV B,E :PREV. SELECTED BIT 00F6 C5 PUSH B :SAVE DRIVE REQUEST 00F7 CD1BE6 CALL BIOS+SLDS80 :RUN SELDSK 2.2 00FA C1 POP B :RESTORE DRIVE REQUEST 00FB 7D MOV A,L 00FC B4 ORA H :TEST FOR ILLEGAL DRIVE 00FD C8 RZ :IF LEGAL_DRIVE < 00FE 220000 SHLD DPH2 :SAVE ADDRESS OF DPH 2.2 0101 69 MOV L,C :DRIVE NUMBER 0102 2600 MVI H,0 0104 29 DAD H :*2 0105 29 DAD H :*4 0106 29 DAD H :*8 0107 29 DAD H :*16 0108 29 DAD H :*32 0109 29 DAD H :*64...64 BYTES PER ENTRY 010A 110400 LXI D,TABLES :BASE OF TABLE SPACE 010D 19 DAD D :ADDRESS OF BASE BLOCK THIS DRIVE 010E 78 MOV A,B :SELECTED BIT 010F E601 ANI 1 :LSB = 1 IF PREVIOUSLY SELECTED 0111 C0 RNZ :DON'T REINIT IF PREV. SEL. 0112 220200 SHLD DPH3 :SAVE ADDRESS OF NEW DPH 3.0 0115 0640 MVI B,64 :BYTES TO CLEAR 0117 CD8301 CALL CLEAR :INITIALIZE SPACE 011A 2A0000 LHLD DPH2 011D EB XCHG 011E 2A0200 LHLD DPH3 0121 010200 LXI B,2 0124 CDE300 CALL MOVE :DPH3.XLT 0127 010C00 LXI B,12 :OFFSET TO DPH3.CSV 012A 09 DAD B 012B EB XCHG 012C 010A00 LXI B,10 :OFFSET TO DPH2.CSV 012F 09 DAD B 0130 EB XCHG 0131 010400 LXI B,4 :2 WORDS 0134 CDE300 CALL MOVE :DPH3.CSV, ALV 0137 EB XCHG :SAVING POINTER TO DPH3.DIRBCB 0138 013100 LXI B,32+17 :OFFSET TO BCB AREA 013B 2A0200 LHLD DPH3 :BASE 013E 09 DAD B 013F E5 PUSH H :SAVING POINTER TO DIRBCB 0140 EB XCHG :RESTORE POINTER TO DPH3.DIRBCB 0141 3EFF MVI A,-1 :DIRBCB IS UNUSED 0143 12 STAX D :SET DIRBCB.DRV TO UNUSED STATUS 0144 73 MOV M,E : 0145 23 INX H 0146 72 MOV M,D :DPH3.DIRBCB <- DIRBCB 0147 23 INX H 0148 36FF MVI M,-1 : 014A 23 INX H 014B 36FF MVI M,-1 :DPH3.DTABCB <- EMPTY 014D 2A0000 LHLD DPH2 0150 010800 LXI B,8 :OFFSET TO DIRBUF ENTRY 0153 09 DAD B 0154 EB XCHG : IS SOURCE 0155 E1 POP H :RESTORE POINTER TO DIRBCB 0156 010A00 LXI B,10 :OFFSET TO BUFADR ENTRY 0159 09 DAD B 015A 010200 LXI B,2 :1 WORD 015D CDE300 CALL MOVE :DIRBCB.BUFADR <- DIRBUF2.2 0160 EB XCHG : POINTS TO DPH2.DPB 0161 5E MOV E,M : 0162 23 INX H 0163 56 MOV D,M :READ ADDRESS OF DPB2 0164 2A0200 LHLD DPH3 0167 010C00 LXI B,12 :OFFSET TO DPB WITHIN DPH3 016A 09 DAD B 016B E5 PUSH H :POINTS TO DPB WITHIN DPH3 016C 2A0200 LHLD DPH3 016F 012000 LXI B,32 :OFFSET TO DPB3 0172 09 DAD B 0173 C1 POP B :RESTORE POINTER TO DPH3.DPB 0174 7D MOV A,L 0175 02 STAX B : 0176 03 INX B 0177 7C MOV A,H 0178 02 STAX B :DPH3.DPB <- DPB3 0179 010F00 LXI B,15 :BYTES IN DPB2 017C CDE300 CALL MOVE :FILL-IN DPB3 FROM DPB2 IF LDRBIOS LXI H,TABLES+64 :EMPTY SPACE IN DPH3 FOR DRIVE B: MVI B,15 :LENGTH OF BCB CALL CLEAR LXI H,TABLES+64+15 :EMPTY SPACE PAST DTABCB SHLD TABLES+64+10 :DTABCB.BUFADR LXI H,TABLES+64 :DTABCB ADDRESS SHLD TABLES+20 :DPH3.DTABCB MVI M,-1 :SET DTABCB.DRV TO UNUSED ENDIF 017F 2A0200 LHLD DPH3 :THE BIG LIE 0182 C9 RET : > :-------------------------------------------------------- : : LOCAL SUBROUTINES : :-------------------------------------------------------- CLEAR: 0183 3600 MVI M,0 0185 23 INX H 0186 05 DCR B 0187 C28301 JNZ CLEAR 018A C9 RET :-------------------------------------------------------- : : INITIALIZED STORAGE : :-------------------------------------------------------- CCPSTG: 018B 4343502020 DB 'CCP COM' OPNMSG: 0196 0D0A42494F DB 0DH,0AH,'BIOS CAN''T OPEN CCP.COM =' ERRMSG: 01B1 0D0A42494F DB 0DH,0AH,'BIOS HAS BAD SECTOR IN CCP.COM =' :-------------------------------------------------------- : : UNINITIALIZED STORAGE : :-------------------------------------------------------- DSEG 0000 DPH2: DS 2 0002 DPH3: DS 2 0004 TABLES: DS 64*DRIVES 0404 END