CP/M MACRO ASSEM 2.0 #001 Cbios 63k System (WAD) Oct.29, 1981 TITLE 'Cbios 63k System (WAD) Oct.29, 1981' PAGE 59 ;****************************************************** ; * ; PROGRAM ID: DOUBLE D BIOS (DDBIOS) * ; * ;****************************************************** ; * ; VERSION: CP/M 2.2 8" RELEASE 2A * ; * ;****************************************************** ; * ; PRESENTED BY: JADE COMPUTER PRODUCTS * ; 4901 W. ROSECRANS BLVD. * ; HAWTHORNE, CALIFORNIA * ; 90250, U.S.A. * ; * ;*********************************************** SK *** ;****************************************************** ; DECLARE CP/M 2.2 SYSTEM SIZE * ;****************************************************** 003F = CPM$NK EQU 63 ;SYSTEM SIZE K BYTES. ;****************************************************** ; DOUBLE D HARDWARE PARAMETER - SYSTEM PORT ADDRESS * ;****************************************************** 0043 = D$PORT EQU 043H ;DOUBLE D PORT ADDRESS. ;****************************************************** ; SELECT NUMBER OF DISK DRIVES USED * ;****************************************************** 0002 = N$DRVS EQU 2 ;SELECT 1 TO 4 DRIVES. ;****************************************************** ; DISK OPERATING SYSTEM ADDRESSES. * ;****************************************************** 0400 = K$B EQU 1024 ;1K BYTE SIZE. FC00 = CPM$SZ EQU CPM$NK * K$B ;TOP SYSTEM ADDRESS. AC00 = CPM$BS EQU CPM$SZ-(20*K$B) ;CP/M BIAS VALUE. 0100 = TPA EQU 0100H ;ADDRESS OF TPA. E000 = CCP EQU CPM$BS+3400H ;ADDRESS OF CCP. E800 = BDOS EQU CPM$BS+3C00H ;ADDRESS OF BDOS. F600 = BIOS EQU CPM$BS+4A00H ;ADDRESS OF BIOS 1A00 = BIOS$R EQU 1000H-BIOS ;DDT OFFSET 1000H LOAD. A000 = BOOT EQU 0A000H ;BOOT PROM JUMP TABLE. 0003 = IO$LOC EQU 0003H ;I/O BYTE LOCATION. 0004 = DF$LOC EQU 0004H ;DRIVE ASSIGN LOCATION. ;****************************************************** ; DOUBLE D SYSTEM PARAMETERS * ;****************************************************** 0000 = IOBYTE EQU 00000000B ;INITIAL IOBYTE VALUE. CP/M MACRO ASSEM 2.0 #002 Cbios 63k System (WAD) Oct.29, 1981 0000 = DF$DRV EQU 0 ;INITIAL DEFAULT DRV. 0080 = SEC$SZ EQU 0080H ;BYTES PER SECTOR. 0100 = FMT$SZ EQU 0100H ;FORMAT BUFF SIZE. ;****************************************************** ; DOUBLE D HARDWARE COMMANDS * ;****************************************************** 0001 = DC$SIN EQU 00000001B ;SWITCH DD BANK 0 INTO SYSTEM. 0001 = DC$MB0 EQU 00000001B ;SELECT DOUBLE D BANK 0. 0003 = DC$MB1 EQU 00000011B ;SELECT DOUBLE D BANK 1. 0000 = DC$SOT EQU 00000000B ;SWITCH DD MEM OUT OF SYSTEM. 0002 = DC$INT EQU 00000010B ;ISSUE DD Z80A INTERRUPT. ;****************************************************** ; DISK CONTROLLER MODULE LINKAGE (DCM - VER 2.2) * ;****************************************************** ;*******( DCM ADDRESSES DEFINED )********************* 0370 = DD$CBT EQU 0370H ;COMMAND BLOCK (BANK 0). 0380 = DD$BUF EQU 0380H ;SECTOR BUFFER (BANK 0). 0300 = DD$FBF EQU 0300H ;FORMAT BUFFER (BANK 1). 03A0 = DD$DPB EQU 03A0H ;ID SEC DPB (BANK 0). 03B1 = DD$DDF EQU 03B1H ;ID SEC FLAGS (BANK 0). ;*******( DCM COMMANDS )******************************* 0000 = DC$LOG EQU 000H ;LOG ON DISKETTE. 0001 = DC$RDS EQU 001H ;READ SECTOR. 0002 = DC$WRS EQU 002H ;WRITE SECTOR. 0003 = DC$FMT EQU 003H ;FORMAT TRACK. 0005 = DC$LST EQU 005H ;LIST CHARACTER. 0006 = DC$LCK EQU 006H ;LIST STATUS. ;**********( I/O PORT DEFINATIONS FOR CONSOLE AND PRINTER )********* 00CA = PRT EQU 0CAH ;PRINTER OUTPUT PORT 00C9 = STROB EQU 0C9H ;STROBE PORT FOR PRINTER 00CA = STATUS EQU 0CAH ;STATUS PORT FOR PRINTER 0001 = PREDY EQU 001H ;PRINTER READY BIT 0001 = CNISP EQU 001H ;CONSOLE INPUT STATUS PORT 0002 = CNISB EQU 002H ;CONSOLE INPUT STATUS BIT 0000 = CNIDP EQU 000H ;CONSOLE INPUT DATA PORT 0001 = CNOSP EQU 001H ;CONSOLE OUTPUT STATUS PORT 0001 = CNOSB EQU 001H ;CONSOLE OUTPUT STATUS BIT 0000 = CNODP EQU 000H ;CONSOLE OUTPUT DATA PORT ;****************************************************** ; ASSEMBLER DIRECTIVES * ;****************************************************** F600 ORG BIOS ;****************************************************** ; BIOS JUMP VECTOR TABLE * ;****************************************************** CP/M MACRO ASSEM 2.0 #003 Cbios 63k System (WAD) Oct.29, 1981 F600 C336F6 JMP INIT ;COLD START ENTRY F603 C34AF6 JMP WARM ;RELOAD CCP/BDOS F606 C3B8F6 JMP CNSCK ;GET CONSOLE STATUS F609 C3C0F6 JMP CNSIN ;CONSOLE INPUT F60C C3CBF6 JMP CNSOT ;CONSOLE OUTPUT F60F C3D6F6 JMP LIST ;PRINTER OUTPUT F612 C3B7F6 JMP PUNCH ;PUNCH OUTPUT F615 C3B4F6 JMP READER ;READER INPUT F618 C3F6F6 JMP HOME ;HOME SELECTED DRIVE F61B C3FBF6 JMP SELDSK ;SELECT DISK DRIVE F61E C31AF7 JMP SETTRK ;SET TRACK NUMBER F621 C31FF7 JMP SETSEC ;SET SECTOR NUMBER F624 C324F7 JMP SETDMA ;SET TRANSFER ADDRESS F627 C32AF7 JMP DISKRD ;PERFORM DISK READ F62A C34AF7 JMP DISKWR ;PERFORM DISK WRITE F62D C3E6F6 JMP LISTST ;RETURN LIST STAT F630 C377F7 JMP SECTRN ;TRANSLATE SECTOR F633 C387F7 JMP FORMAT ;FORMAT A TRACK ;****************************************************** ; COLD START ENTRY - ISSUE SIGN ON MESSAGE * ;****************************************************** F636 318000 INIT: LXI SP,0080H ;SET UP STACK AREA. F639 00 NOP ;FILLER F63A 00 NOP ; F63B 00 NOP ; F63C 00 NOP ; F63D 3E01 MVI A,01H ;PAGE 1 F63F D3FD OUT 0FDH ;PHANTOM OUT PROM FROM PAGE 0 F641 21BCF8 LXI H,MSG$SO ;SIGN ON MSG ADDR. F644 CD72F8 CALL MSG$OT ;ISSUE MESSAGE. F647 C35FF6 JMP CPM$LD ;LOAD CCP/BDOS. ;****************************************************** ; WARM BOOT ENTRY - LOADS CCP/BDOS - INITIALIZES * ;****************************************************** ;*******( SET UP FOR CCP/BDOS LOAD )******************* F64A 3A0300 WARM: LDA IO$LOC ;GET I/O BYTE VALUE. F64D 32B7F8 STA IO$IMG ;STORE I/O VALUE. F650 3A0400 LDA DF$LOC ;GET DEFAULT DRIVE. F653 FE02 CPI N$DRVS ;CHECK LEGAL DRIVE. F655 DA59F6 JC WRM$OK ;IF LEGAL, GO OK. F658 AF XRA A ;SET DRIVE TO A. F659 32B8F8 WRM$OK: STA DF$IMG ;STORE IN IMAGE. F65C 318000 LXI SP,0080H ;SET UP STACK. F65F 3E00 CPM$LD: MVI A,DF$DRV ;INIT DEFAULT DRIVE. F661 327FF8 STA BT$DRV ;SELECT DISK. F664 0100E0 LXI B,CCP ;CP/M CCP ADDRESS. F667 CD24F7 CALL SETDMA ;SET DMA ADDR. F66A 0E02 MVI C,2 ;CCP 1ST SECTOR. F66C CD1FF7 CALL SETSEC ;SET SECTOR NMBR. F66F 0E01 MVI C,1 ;CCP/BDOS TRACK. F671 CD1AF7 CALL SETTRK ;SET TRACK NUMBER. ;*******( LOAD CCP/BDOS )****************************** CP/M MACRO ASSEM 2.0 #004 Cbios 63k System (WAD) Oct.29, 1981 F674 CD2AF7 W$READ: CALL DISKRD ;READ ONE SECTOR. F677 A7 ANA A ;SET FLAGS. F678 C294F6 JNZ W$EROR ;EXIT IF ERROR. F67B 3A81F8 LDA BT$SEC ;GET SECTOR NMBR. F67E FE2D CPI 45 ;LAST SECTOR CHECK. F680 CA9BF6 JZ W$ZRPG ;GOTO ZERO PAGE SET. F683 3C INR A ;INCREMENT SECTOR. F684 3281F8 STA BT$SEC ;STORE NEXT SECTOR. F687 118000 LXI D,SEC$SZ ;GET SECTOR SIZE. F68A 2A86F8 LHLD BT$DMA ;GET TRANSFER ADDR. F68D 19 DAD D ;CALCULATE NEW ADDR. F68E 2286F8 SHLD BT$DMA ;SET NEW ADDRESS. F691 C374F6 JMP W$READ ;DO ANOTHER WARM READ. ;*******( READ ERROR DETECTED )************************ F694 21F4F8 W$EROR: LXI H,MSG$LE ;GET ERROR MESAAGE. F697 CD72F8 CALL MSG$OT ;ISSUE MESSAGE. F69A 76 HLT ;OR GOTO MONITOR ;*******( INITIALIZE SYSTEM PARAMETERS )*************** F69B 010800 W$ZRPG: LXI B,8 ;BASE IMAGE SIZE. F69E 110000 LXI D,0 ;BASE ADDRESS SET. F6A1 21B4F8 LXI H,BS$IMG ;BASE IMAGE ADDR. F6A4 CD67F8 CALL BLOCK ;BLOCK MOVE ROUTINE. F6A7 218000 LXI H,0080H ;DEFAULT SECTOR BUFF. F6AA 2286F8 SHLD BT$DMA ;SET TRANSFER ADDRESS. ;*******( JUMP TO CCP )******************************** F6AD 3A0400 LDA DF$LOC ;GET CURRENT DSK NMBR. F6B0 4F MOV C,A ;SEND TO THE CCP. F6B1 C300E0 JMP CCP ;JUMP INTO CCP CP/M. ;****************************************************** ; READER AND PUNCH DRIVERS - USER SHOULD DEFINED * ;****************************************************** F6B4 3E1AC9 READER: MVI A,CNTL$Z!RET ;RETURN END OF FILE. F6B7 C9 PUNCH: RET ;NOT IMPLEMENTED. ;********************************************************* ; CONSOLE INPUT STATUS CHECK ;******************************************************** CNSCK: F6B8 DB01 IN CNISP ;INPUT STATUS PORT F6BA E602 ANI CNISB ;TEST READY BIT F6BC C8 RZ ;RET WITH ZERO, NOT READY F6BD 3EFF MVI A,0FFH ;SET CONSOLE READY F6BF C9 RET ;FF MEANS READY ;********************************************************* ; CONSOLE INPUT DATA ;********************************************************* CNSIN: F6C0 CDB8F6 CALL CNSCK ;TEST INPUT READY CP/M MACRO ASSEM 2.0 #005 Cbios 63k System (WAD) Oct.29, 1981 F6C3 CAC0F6 JZ CNSIN ;REPEAT TEST FOR READY F6C6 DB00 IN CNIDP ;INPUT CONSOLE DATA F6C8 E67F ANI 7FH ;MASK PARITY F6CA C9 RET ;RETURN WITH DATA ;********************************************************* ; CONSOLE DATA OUTPUT ;********************************************************* CNSOT: F6CB DB01 IN CNOSP ;GET OUTPUT STATUS F6CD E601 ANI CNOSB ;TEST READY F6CF CACBF6 JZ CNSOT ;TEST AGAIN FOR READY F6D2 79 MOV A,C ;LOAD CHAR F6D3 D300 OUT CNODP ;SEND TO CONSOLE F6D5 C9 RET ;DONE ;****************************************************** ; PRINTER DRIVER AREA ;****************************************************** LIST: F6D6 79 MOV A,C ;LIST CHAR TO ACUM. F6D7 3283F8 STA BT$CHR ;STORE LIST CHARACTER F6DA 3E01 MVI A,DC$SIN ;LOAD SWITCH MEM COMAND F6DC D343 OUT D$PORT ;ISSUE HARDWARE COMMAND F6DE 3E05 MVI A,DC$LST ;DCM LIST COMMAND F6E0 CDB0F7 CALL DSK$EX ;CALL DISK EXECUTE F6E3 C36AF7 JMP DSK$OK ;RETURN TO CALLER LISTST: F6E6 3E01 MVI A,DC$SIN ;LOAD SWITCH MEM COMMAND F6E8 D343 OUT D$PORT ;ISSUE HARDWARE COMMAND F6EA 3E06 MVI A,DC$LCK ;DCM LIST STAT COMMAND F6EC CDB0F7 CALL DSK$EX ;CALL DISK EXECUTE F6EF CD6AF7 CALL DSK$OK ;SWITCH DD MEM OUT F6F2 3A85F8 LDA BT$STS ;LOAD RETURN STATUS F6F5 C9 RET ;****************************************************** ; HOME - SET TRACK TO ZERO * ;****************************************************** F6F6 0E00 HOME: MVI C,0 ;C REGISTER TO ZERO. F6F8 C31AF7 JMP SETTRK ;PERFORM SET TRACK. ;****************************************************** ; SELECT DISK DRIVE - CHECK FOR LOGON * ;****************************************************** F6FB 210000 SELDSK: LXI H,0 ;ERROR RETURN CODE. F6FE 79 MOV A,C ;PUT DRIVE NMBR IN A. F6FF FE02 CPI N$DRVS ;CHECK IF LEGAL DRIVE. F701 D0 RNC ;NO CARRY IF ILLEGAL. F702 327FF8 STA BT$DRV ;STORE DRIVE NUMBER. F705 7B MOV A,E ;CHECK IF LOG-ON REQ. F706 328AF8 STA LOG$RQ ;STORE LOGON REGISTER. F709 3A7FF8 RETDSK: LDA BT$DRV ;GET DRIVE NUMBER. F70C 6F MOV L,A ;L SET DISK NUMBER. CP/M MACRO ASSEM 2.0 #006 Cbios 63k System (WAD) Oct.29, 1981 F70D 2600 MVI H,0 ;ZERO H REGISTER. F70F 29 DAD H ;*2. F710 29 DAD H ;*4. F711 29 DAD H ;*8. F712 29 DAD H ;*16 (SIZE OF HEADER). F713 1112F9 LXI D,D0$DPH ;DRIVE 0 D$P$H. F716 19 DAD D ;HLSET DRIVE N DPH. F717 C3DBF7 JMP LOG$ON ;GO CHECK LOG-ON. ;****************************************************** ; SET TRACK NUMBER * ;****************************************************** F71A 79 SETTRK: MOV A,C ;MOVE TRACK NUMBER. F71B 3280F8 STA BT$TRK ;SAVE TRACK NUMBER. F71E C9 RET ;RETURN TO CALLER. ;****************************************************** ; SET SECTOR NUMBER * ;****************************************************** F71F 79 SETSEC: MOV A,C ;MOVE SECTOR NUMBER. F720 3281F8 STA BT$SEC ;SAVE SECTOR NUMBER. F723 C9 RET ;RETURN TO CALLER. ;****************************************************** ; SET MEMORY ADDRESS FOR DISK TRANSFER * ;****************************************************** F724 60 SETDMA: MOV H,B ;HIGH ORDER MOVE. F725 69 MOV L,C ;LOW ORDER MOVE. F726 2286F8 SHLD BT$DMA ;SAVE TRANSFER ADDRESS. F729 C9 RET ;RETURN TO CALLER. ;****************************************************** ; READ A DISK SECTOR ROUTINE * ;****************************************************** F72A 3E01 DISKRD: MVI A,DC$SIN ;SWITCH DD INTO SYSTEM. F72C D343 OUT D$PORT ;ISSUE DD COMMAND. F72E 3E01 MVI A,DC$RDS ;READ SECTOR COMMAND. F730 CDB0F7 CALL DSK$EX ;PERFORM OPERATION. F733 C270F7 JNZ DSK$ER ;ERROR EXIT. F736 2A86F8 LHLD BT$DMA ;LOAD USER BUF ADDRESS F739 EB XCHG ;MOVE HL TO DE. F73A 018003 LXI B,DD$BUF ;LOAD BUFFER OFFSET. F73D 2A4000 LHLD D$ADDR ;LOAD DD WINDOW ADDR. F740 09 DAD B ;HL NOW SECTOR BUFFER. F741 018000 LXI B,SEC$SZ ;LOAD SECTOR SIZE. F744 CD67F8 CALL BLOCK ;BLOCK MOVE ROUTINE. F747 C36AF7 JMP DSK$OK ;NORMAL RETURN. ;****************************************************** ; WRITE A DISK SECTOR ROUTINE * ;****************************************************** F74A 3E01 DISKWR: MVI A,DC$SIN ;SWITCH DD INTO SYSTEM. F74C D343 OUT D$PORT ;ISSUE HARDWARE CMND. F74E 018000 LXI B,SEC$SZ ;LOAD SECTOR SIZE. CP/M MACRO ASSEM 2.0 #007 Cbios 63k System (WAD) Oct.29, 1981 F751 2A4000 LHLD D$ADDR ;DD SYSTEM ADDRESS. F754 118003 LXI D,DD$BUF ;DD BUFFER OFFSET. F757 19 DAD D ;HL NOW DD BUF ADDR. F758 EB XCHG ;DE NOW DD BUF ADDR. F759 2A86F8 LHLD BT$DMA ;HL NOW USER BUF ADDR. F75C CD67F8 CALL BLOCK ;BLOCK MOVE ROUTINE. F75F 3E02 MVI A,DC$WRS ;LOAD WRITE SEC CMND. F761 CDB0F7 CALL DSK$EX ;CALL DISK EXECUTIVE. F764 CA6AF7 JZ DSK$OK ;JUMP IF WRITE OK. F767 C370F7 JMP DSK$ER ;ERROR EXIT. ;****************************************************** ; DISK READ/WRITE EXITS * ;****************************************************** F76A 3E00 DSK$OK: MVI A,DC$SOT ;SWITCH DD OUT OF SYS. F76C D343 OUT D$PORT ;ISSSUE HARDWARE CMND. F76E AF XRA A ;ZERO A REGISTER. F76F C9 RET ;NORMAL EXIT. F770 3E00 DSK$ER: MVI A,DC$SOT ;SWITCH DD OUT OF SYS. F772 D343 OUT D$PORT ;ISSSUE HARDWARE CMND. F774 3EFF MVI A,0FFH ;LOAD ERROR FLAGS. F776 C9 RET ;ERROR EXIT. ;****************************************************** ; TRANSLATE SECTOR NUMBER * ;****************************************************** F777 7A SECTRN: MOV A,D ;TESTING TBL ADDR. F778 B3 ORA E ;ADDR IN REG DE. F779 CA82F7 JZ NOTRAN ;IF ZERO, NO TRANS. F77C EB XCHG ;(HL) NOW TRANS TBL. F77D 09 DAD B ;(HL) NOW TRANS SECTOR. F77E 6E MOV L,M ;L IS TRANSLATED SEC. F77F 2600 MVI H,0 ;HIGH ORDER BYTE ZERO. F781 C9 RET ;RETURN TO CALLER. F782 210100 NOTRAN: LXI H,1 ;SET HL TO ONE. F785 09 DAD B ;ADD SEC NMBR TO HL. F786 C9 RET ;RETURN TO CALLER. ;****************************************************** ; FORMAT A DISK TRACK ROUTINE * ;****************************************************** F787 3E01 FORMAT: MVI A,DC$SIN ;SWITCH DD INTO SYSTEM. F789 D343 OUT D$PORT ;ISSUE HARDWARE CMND. F78B 3E03 MVI A,DC$MB1 ;SELECT DD BANK 1. F78D D343 OUT D$PORT ;ISSUE HARDWARE CMND. F78F 010001 LXI B,FMT$SZ ;FORMAT PROG SIZE. F792 2A4000 LHLD D$ADDR ;DD SYSTEM ADDRESS. F795 110003 LXI D,DD$FBF ;DD FORMAT BUF OFFSET. F798 19 DAD D ;HL NOW DD FBUF ADDR. F799 EB XCHG ;DE NOW DD FBUF ADDR. F79A 2A86F8 LHLD BT$DMA ;FORMAT PROGRAM ADDR. F79D CD67F8 CALL BLOCK ;BLOCK MOVE ROUTINE. F7A0 3E01 MVI A,DC$MB0 ;RESELECT DD BANK 0. F7A2 D343 OUT D$PORT ;ISSUE TO DD HARDWARE. F7A4 3E03 MVI A,DC$FMT ;LOAD FORMAT TRK CMND. CP/M MACRO ASSEM 2.0 #008 Cbios 63k System (WAD) Oct.29, 1981 F7A6 CDB0F7 CALL DSK$EX ;CALL DISK EXECUTIVE. F7A9 CD6AF7 CALL DSK$OK ;SWITCH DD MEM OUT. F7AC 3A85F8 LDA BT$STS ;LOAD FORMAT STATUS. F7AF C9 RET ;FORMAT EXIT. ;****************************************************** ; DOUBLE D EXECUTION SUBROUTINE * ;****************************************************** ;*******( COMMAND BLOCK TO DOUBLE D AND EXEC )********* F7B0 327EF8 DSK$EX: STA BT$CMD ;STORE DCM COMMAND. F7B3 010700 LXI B,7 ;NMBR BYTE TO MOVE. F7B6 117003 LXI D,DD$CBT ;COMMAND BYTE OFFSET. F7B9 2A4000 LHLD D$ADDR ;DD SYS ADDRESS. F7BC 19 DAD D ;HL NOW PTS CMND BLK. F7BD EB XCHG ;NOW ADDR IN DE. F7BE 217EF8 LXI H,BT$CMD ;BIOS CMND BLOCK. F7C1 CD67F8 CALL BLOCK ;PERFORM BLOCK MOVE. F7C4 3E02 MVI A,DC$INT ;LOAD DD INTERRUPT. F7C6 D343 OUT D$PORT ;ISSUE DD INTERRUPT. ;*******( WAIT FOR DOUBLE D HALT )********************* F7C8 3A4200 LDA D$HALT ;LOAD HALT BIT MASK. F7CB 47 MOV B,A ;MASK IN B REGISTER. F7CC DB43 DSK$WT: IN D$PORT ;READ DD STATUS. F7CE A0 ANA B ;TEST HALT* FLAG. F7CF C2CCF7 JNZ DSK$WT ;TEST UNTIL HALTED. ;*******( GET DOUBLE D STATUS )************************ F7D2 3E01 MVI A,DC$SIN ;SWITCH DD INTO SYS. F7D4 D343 OUT D$PORT ;ISSUE HARDWARE CMND. F7D6 EB XCHG ;EXCHANGE SRC/DSTN. F7D7 7E MOV A,M ;STATUS INTO A REG. F7D8 12 STAX D ;STORE STATUS BYTE. F7D9 A7 ANA A ;TEST FOR ERRORS. F7DA C9 RET ;RETURN TO CALLER. ;****************************************************** ; LOG-ON - SET DISK PARAMETER BLOCK * ;****************************************************** ;*******( CHECK IF LOG-ON REQUESTED )****************** F7DB 3A8AF8 LOG$ON: LDA LOG$RQ ;CHECK LOG REQUEST. F7DE E601 ANI 001H ;LOG ON BIT TEST. F7E0 C26AF7 JNZ DSK$OK ;RETURN, NO LOG-ON. ;*******( READ IDENTITY SECTOR )*********************** F7E3 2288F8 SHLD DT$PTR ;STORE DRV TBL PNTR. F7E6 3E01 MVI A,DC$SIN ;SWITCH DD INTO SYS. F7E8 D343 OUT D$PORT ;ISSUE HARDWARE CMND. F7EA 3E00 MVI A,DC$LOG ;LOAD DCM LOG-ON CMND. F7EC CDB0F7 CALL DSK$EX ;PERFORM DISK OP. F7EF CAF8F7 JZ LOG$CK ;GO TO LOGON ERROR. F7F2 210000 LXI H,0 ;ERROR, BAD LOG ON. CP/M MACRO ASSEM 2.0 #009 Cbios 63k System (WAD) Oct.29, 1981 F7F5 C370F7 JMP DSK$ER ;BIOS EXIT. ; ;*******( CHECK FOR JADE ID )************************** F7F8 118003 LOG$CK: LXI D,DD$BUF ;DD BUFFER OFFSET. F7FB 2A4000 LHLD D$ADDR ;DD SYS ADDRESS. F7FE 19 DAD D ;HL NOW PNTS BUFFER. F7FF 110AF9 LXI D,JADEID ;DE PNTS BIOS ID. F802 0608 MVI B,ID$SZE ;SET LABEL SIZE. F804 1A13 LOG$ID: LDAX D! INX D ;GET LABEL CHARACTER. F806 BE23 CMP M! INX H ;DOES ID SECTOR MATCH. F808 C235F8 JNZ LG3740 ;ASSUME DISKETTE 3740. F80B 05 DCR B ;DECREMENT COUNT. F80C C204F8 JNZ LOG$ID ;CHECK IF ANOTHER CHR. ;*******( DISKETTE CONTAINS ID )*********************** F80F CD54F8 CALL TRNONE ;ASSUME DDENS. F812 CD5CF8 CALL DPB$AD ;GET DPB ADDR IN DE. F815 01A003 LXI B,DD$DPB ;DPB ADDR OFFSET. F818 2A4000 LHLD D$ADDR ;DD SYSTEM ADDRESS. F81B 09 DAD B ;HL NOW AT ID DPB. F81C 010F00 LXI B,DPB$SZ ;DPB SIZE IN BYTES. F81F CD67F8 CALL BLOCK ;MOVE INTO DPB. F822 11B103 LXI D,DD$DDF ;ID DTA DNS OFFSET. F825 2A4000 LHLD D$ADDR ;DD SYSTEM ADDR. F828 19 DAD D ;HL POINTS FLAGS. F829 7E MOV A,M ;LOAD FLAGS. F82A E604 ANI 04H ;TEST DATA DENSITY. F82C CC4AF8 CZ TR3740 ;IF 0 USE 3740 TRN. F82F 2A88F8 LHLD DT$PTR ;RELOAD POINTER. F832 C36AF7 JMP DSK$OK ;EXIT BIOS JUMP. ;*******( ASSUME 3740 DISKETTE )*********************** F835 CD4AF8 LG3740: CALL TR3740 ;SET SECTOR TRANSLATE. F838 CD5CF8 CALL DPB$AD ;SET REGISTER DE. F83B 010F00 LXI B,DPB$SZ ;DPB SIZE IN BYTES. F83E 21A5F8 LXI H,SD$PBK ;ADDRESS OF BLK IMAGE. F841 CD67F8 CALL BLOCK ;MOVE INTO DPB. F844 2A88F8 LHLD DT$PTR ;RELOAD POINTER. F847 C36AF7 JMP DSK$OK ;EXIT BIOS JUMP. ;*******( SET 3740 SECTOR TRANSLATION )**************** F84A 118BF8 TR3740: LXI D,SDTRAN ;SECTOR TRAN TBL ADDR. F84D 2A88F8 LHLD DT$PTR ;ADDR DISK PARA HDER. F850 73 MOV M,E ;LOW ORDER ADDR. F851 23 INX H ;POINT NEXT BYTE. F852 72 MOV M,D ;HIGH ORDER ADDR. F853 C9 RET ;RETURN TO LOG USER. ;*******( SET NO SECTOR TRANSLATION )****************** F854 AF TRNONE: XRA A ;ZERO A REGISTER. F855 2A88F8 LHLD DT$PTR ;ADDR OF PARA HDER. F858 77 MOV M,A ;ZERO LOW ORDER ADDR. F859 23 INX H ;NEXT BYTE. F85A 77 MOV M,A ;ZERO HIGH BYTE. CP/M MACRO ASSEM 2.0 #010 Cbios 63k System (WAD) Oct.29, 1981 F85B C9 RET ;RETURN TO LOG USER. ;*******( GET DRIVE PARA BLK ADDR )******************** F85C 2A88F8 DPB$AD: LHLD DT$PTR ;ADDR DISK PARA HDER. F85F 110A00 LXI D,10 ;DPB TBL PNTR OFFSET. F862 19 DAD D ;NOW AT DPB PNTR. F863 5E MOV E,M ;LOW ORDER ADDR. F864 23 INX H ;NEXT BYTE. F865 56 MOV D,M ;HIGH ORDER ADDR. F866 C9 RET ;RETURN TO LOG USER. ;****************************************************** ; BLOCK MOVE SUBROUTINE - Z80 LDIR WILL FUNCTION HERE * ;****************************************************** F867 7E23 BLOCK: MOV A,M! INX H ;GET EACH BYTE. F869 1213 STAX D! INX D ;STORE EACH BYTE. F86B 0B78B1 DCX B! MOV A,B! ORA C ;DEC LENGTH (MAX 64K). F86E C267F8C9 JNZ BLOCK! RET ;FINISH BLOCK AND RET. ;****************************************************** ; MESSAGE DISPLAY ROUTINE - HL REG POINTS TO STRING * ;****************************************************** F872 7E MSG$OT: MOV A,M ;LOAD CHARACTER/BYTE. F873 FE24C8 CPI EOM! RZ ;EXIT IF TERMINATOR. F876 4FCDCBF6 MOV C,A! CALL CNS$OT ;DISPLAY CHARACTER. F87A 23C372F8 INX H! JMP MSG$OT ;REPEAT FOR NEXT BYTE. ;****************************************************** ; DOUBLE D - DCM COMMAND BLOCK BUFFER * ;****************************************************** F87E 00 BT$CMD: DB 0 ;DCM COMMAND. F87F 00 BT$DRV: DB 0 ;DRIVE NUMBER. F880 00 BT$TRK: DB 0 ;TRACK NUMBER. F881 00 BT$SEC: DB 0 ;SECTOR NUMBER. F882 00 BT$SP0: DB 0 ;SPARE BYTE 0. F883 00 BT$CHR: DB 0 ;LIST CHARACTER. F884 00 BT$MOD: DB 00000000B ;MODE CONTROLS. F885 00 BT$STS: DB 0 ;COMMAND STATUS. ;****************************************************** ; BIOS VARIABLE STORAGE * ;****************************************************** F886 0000 BT$DMA: DW 0 ;SYSTEM TRANSFER ADDR. F888 0000 DT$PTR: DW 0 ;DRIVE TABLE POINTER. F88A 00 LOG$RQ: DB 0 ;LOG ON REQUEST REG. ;****************************************************** ; DOUBLE D - MEMORY ASSIGNMENTS (40-4F HEX) * ;****************************************************** 0040 = D$ADDR EQU 0040H ;DD SYSTEM WINDOW ADDR POINTER. 0042 = D$HALT EQU 0042H ;DD HALT STATUS MASK LOCATION. ;****************************************************** CP/M MACRO ASSEM 2.0 #011 Cbios 63k System (WAD) Oct.29, 1981 ; 3740 FORMAT PARAMETERS ******** CP/M SINGLE DENSITY * ;****************************************************** ;*******( SINGLE DENSITY CP/M SECTORING )************** F88B 01070D1319SDTRAN: DB 01H,07H,0DH,13H,19H,05H,0BH,11H,17H,03H F895 090F150208 DB 09H,0FH,15H,02H,08H,0EH,14H,1AH,06H,0CH F89F 1218040A10 DB 12H,18H,04H,0AH,10H,16H ;*******( DEFAULT DISK PARAMETER BLOCK )*************** F8A5 1A00 SD$PBK: DW 26 ;SECTORS PER TRACK. F8A7 03 DB 3 ;BLOCK SHIFT FACTOR. F8A8 07 DB 7 ;BLOCK MASK. F8A9 00 DB 0 ;NULL MASK. F8AA F200 DW 242 ;DISK SIZE - 1. F8AC 3F00 DW 63 ;DIRECTORY MAX. F8AE C0 DB 11000000B ;ALLOC 0. F8AF 00 DB 0 ;ALLOC 1. F8B0 1000 DW 16 ;CHECK SIZE. F8B2 0200 DW 2 ;TRACK OFFSET. ;****************************************************** ; ZERO PAGE IMAGE - BLOCK MOVED TO BASE PAGE * ;****************************************************** F8B4 C303F6 BS$IMG: JMP BIOS+03H ;WARM BOOT VECTOR. F8B7 00 IO$IMG: DB IOBYTE ;I/O BYTE IMAGE. F8B8 00 DF$IMG: DB DF$DRV ;DEFAULT DRIVE IMG. F8B9 C306E8 JMP BDOS+06H ;BDOS CALL VECTOR. ;****************************************************** ; MESSAGES * ;****************************************************** F8BC 0D0A0D0A MSG$SO: DB CR,LF,CR,LF F8C0 574F524B4C DB 'WORKLOAD ASSESSMENT DEVICE',CR,LF F8DC 3633 DB '0' + CPM$NK / 10,'0' + CPM$NK MOD 10 F8DE 4B2043502F DB 'K CP/M 2.2 (WAD) ',CR,LF,CR,LF,EOM F8F4 0D0A434350MSG$LE: DB CR,LF,'CCP/BDOS LOAD ERROR',EOM 000A = LF EQU 00AH ;ASCII LINE FEED. 000D = CR EQU 00DH ;CARRAIGE RETURN. 0024 = EOM EQU '$' ;END OF STRING. 001A = CNTL$Z EQU 01AH ;CONTROL-Z (EOF). ;****************************************************** ; ID LABEL DEINITIONS * ;****************************************************** F90A 4A61646520JADEID: DB 'Jade DD ' ;ID LABEL. 0008 = ID$SZE EQU $-JADEID ;LABEL SIZE. ;****************************************************** ; DRIVE PARAMETER HEADER AREA * ;****************************************************** F912 0000 D0$DPH: DW 0 ;SECTOR TRAN TBL. CP/M MACRO ASSEM 2.0 #012 Cbios 63k System (WAD) Oct.29, 1981 F914 0000 DW 0 ;SCRATCH AREA. F916 0000 DW 0 ;SCRATCH AREA. F918 0000 DW 0 ;SCRATCH AREA. F91A 00FA DW DIR$BF ;DIRECTORY BUFFER. F91C 80FA DW D0$DPB ;DRIVE PARAM BLK. F91E B0FA DW D0$CHK ;DRIVE CHANGE BLK. F920 8FFA DW D0$ALL ;DRIVE ALLOCATION. IF (1-N$DRVS) SHR 15 ;TEST SIGN BIT. F922 0000000000D1$DPH: DW 0,0,0,0 F92A 00FAD0FA DW DIR$BF,D1$DPB F92E 00FBDFFA DW D1$CHK,D1$ALL ENDIF IF (2-N$DRVS) SHR 15 D2$DPH: DW 0,0,0,0 DW DIR$BF,D2$DPB DW D2$CHK,D2$ALL ENDIF IF (3-N$DRVS) SHR 15 D3$DPH: DW 0,0,0,0 DW DIR$BF,D3$DPB DW D3$CHK,D3$ALL ENDIF ;****************************************************** ; BIOS PROGRAM AREA REMAINING * ;****************************************************** FA00 = BIOS$U EQU BIOS + K$B ;BEGIN SCRATCH AREA. 00CE = BIOS$F EQU BIOS$U - $ ;NUMBER OF BYTES FREE. IF BIOS$F SHR 15 ;TEST PROG OVERFLOW. ERROR EQU 1/0 ;GENERATE ERROR. ENDIF F932 F$AREA: DS BIOS$F ;USE UP PROG AREA. ;****************************************************** ; DIRECTORY BUFFER AREA - BEGINNING OF SCRATCH AREA * ;****************************************************** FA00 DIR$BF: DS SEC$SZ ;****************************************************** ; DRIVE TABLE ENTRY - SIZES * ;****************************************************** 000F = DPB$SZ EQU 15 ;PARAMETER BLOCK SIZE. 0021 = ALL$SZ EQU 33 ;ALLOCATION INFO SIZE. 0020 = CHK$SZ EQU 32 ;CHANGED DISK SCRATCH. ;****************************************************** ; DRIVE TABLES - SCRATCH AREAS * ;****************************************************** FA80 D0$DPB: DS DPB$SZ ;DISK PARAMETER BLOCK. FA8F D0$ALL: DS ALL$SZ ;DISK ALLOCATION INFO. CP/M MACRO ASSEM 2.0 #013 Cbios 63k System (WAD) Oct.29, 1981 FAB0 D0$CHK: DS CHK$SZ ;DISK CHANGED SCRATCH. IF (1-N$DRVS) SHR 15 FAD0 D1$DPB: DS DPB$SZ ;DISK PARAMETER BLOCK. FADF D1$ALL: DS ALL$SZ ;DISK ALLOCATION INFO. FB00 D1$CHK: DS CHK$SZ ;DISK CHANGED SCRATCH. ENDIF IF (2-N$DRVS) SHR 15 D2$DPB: DS DPB$SZ ;DISK PARAMETER BLOCK. D2$ALL: DS ALL$SZ ;DISK ALLOCATION INFO. D2$CHK: DS CHK$SZ ;DISK CHANGED SCRATCH. ENDIF IF (3-N$DRVS) SHR 15 D3$DPB: DS DPB$SZ ;DISK PARAMETER BLOCK. D3$ALL: DS ALL$SZ ;DISK ALLOCATION INFO. D3$CHK: DS CHK$SZ ;DISK CHANGED SCRATCH. ENDIF ;****************************************************** FB20 END