CP/M MACRO ASSEM 2.0 #001 BIOS FOR VERSAFLOPPY TITLE 'BIOS FOR VERSAFLOPPY' ; LAST REV 25 MAY 85 RHP ; ; CP/M BASIC INPUT/OUTPUT OPERATING SYSTEM (BIOS) ; FOR VERSAFLOPPY II DISK BOARD ; THIS VERSION BOOTS IN SINGLE DENSITY AND CALLS ; DISKS A,B SINGLE AND C,D DOUBLE DENSITY 0038 = MSIZE EQU 56 ;MEMORY SIZE IN KBYTES. 0003 = CONSTAT EQU 3 ;CONSOLE STATUS PORT. 0002 = CONDATA EQU 2 ;CONSOLE DATA PORT. 0002 = KBRBIT EQU 2 ;KEYBOARD READY BIT. ; 9000 = CBASE EQU (MSIZE-20)*1024 ;BIAS FOR CPM LARGER THAN 17K. C400 = CPMB EQU CBASE+3400H ;START OF CPM. CC06 = BDOS EQU CPMB+806H ;START OF BDOS DA00 = BIOS EQU CPMB+1600H 002C = NSECTS EQU 44 ; ; EXTRN ?STRKE,?SSECE,?SDMAE,?RDE,?WRE ; EXTRN ?TADDR,?UNIT,?LDE,?NREC ; ; F000 = ROMORG EQU 0F000H F01E = ?STRKE EQU ROMORG+01EH F021 = ?SSECE EQU ROMORG+021H F024 = ?SDMAE EQU ROMORG+024H F027 = ?RDE EQU ROMORG+027H F02A = ?WRE EQU ROMORG+02AH F02D = ?LDE EQU ROMORG+02DH ; 0040 = ?TADDR EQU 0040H 0042 = ?UNIT EQU 0042H 0045 = ?NREC EQU 0045H ; E021 = DJTSTAT EQU 0E021H ;DISK JOCKY SERIAL STATUS E003 = DJCIN EQU 0E003H ;DISK JOCKY SERIAL IN E006 = DJCOUT EQU 0E006H ;DISK JOCKY SERIAL OUT ; MACLIB DISKDEF ; DA00 ORG BIOS ;START OF BIOS. ; DA00 C333DA JMP BOOT ;FROM COLD START LOADER. DA03 C392DA WBOOTE: JMP WBOOT ;FROM WARM BOOT. DA06 C3C4DA JMP CONST ;CHECK CONSOLE KB STATUS. DA09 C303E0 JMP DJCIN ;READ CONSOLE CHARACTER. DA0C C306E0 CCONOT: JMP DJCOUT ;WRITE CONSOLE CHARACTER. DA0F C327DB JMP LIST ;WRITE LISTING CHAR. DA12 C32ADB JMP PUNCH ;WRITE PUNCH CHAR. DA15 C32BDB JMP READER ;READ READER CHAR. DA18 C38DDA JMP HOME1 ;MOVE DISK TO TRACK ZERO. DA1B C36EDA JMP TEMPSELDSK ;SELECT DISK DRIVE. DA1E C31EF0 SETTRK: JMP ?STRKE ;SEEK TO TRACK IN REG A. DA21 C321F0 SETSEC: JMP ?SSECE ;SET SECTOR NUMBER. CP/M MACRO ASSEM 2.0 #002 BIOS FOR VERSAFLOPPY DA24 C324F0 SETDMA: JMP ?SDMAE ;SET DISK STARTING ADR. DA27 C327F0 READ: JMP ?RDE ;READ SELECTED SECTOR. DA2A C32AF0 WRITE: JMP ?WRE ;WRITE SELECTED SECTOR. DA2D C328DB JMP PRSTAT ;LIST STATUS CHECK DA30 C32CDB JMP SECTRAN ;SECTOR TRANSLATE ROUTINE ; ; BOOT ; THIS SECTION IS EXECUTED WHENEVER RESET AND RUN ; IS PUSHED, AFTER THE COLDSTART LOADER READS IN ; THE CPM SYSTEM. ; DA33 318000 BOOT: LXI SP,80H ;SET STACK POINTER. ; ;BOOTUP WILL ALWAYS BE IN DOUBLE BY THIS TECHNIQUE ; ;PUT YOUR REQUIRED INITIALIZATION BYTES HERE- IF ANY DA36 AF XRA A DA37 D305 OUT 5 ; DA39 AF XRA A DA3A 320400 STA 4 ;CDISK DA3D 320300 STA 3 ;IOBYTE ; ORI 40H ;MASK FOR DOUBLE DEN ;(NOT NEEDED WHEN STARTING SINGLE) DA40 324200 STA ?UNIT DA43 CD53DA CALL SETUP ;SET UP JUMPS. DA46 21D7DA LXI H,SMSG ;PRINT OPENING MESSAGE. DA49 CDCCDA CALL PMSG DA4C 3A0400 GOCPM: LDA 4 ;GET DISK NUMBER TO DA4F 4F MOV C,A ;PASS TO CCP IN C. DA50 C300C4 JMP CPMB ;JUMP TO CCP. ; ; SET UP JUMPS TO CP/M ; DA53 3EC3 SETUP: MVI A,0C3H ;PUT JMP TO WBOOT DA55 320000 STA 0 ;ADR AT ZERO. DA58 2103DA LXI H,WBOOTE DA5B 220100 SHLD 1 DA5E 320500 STA 5 DA61 2106CC LXI H,BDOS ;PUT JUMP TO BDOS DA64 220600 SHLD 6 ;AT ADR 5,6,7. DA67 218000 LXI H,80H ;SET DEFAULT DMA ADR. DA6A 224000 SHLD ?TADDR ;DMA ADDR POINTER DA6D C9 RET ;RETURN FROM SETUP. ; ;THE FOLLOWING IS THE ROUTINE THAT CONVERTS CPM'S DISK NUMBERS TO SD NUMBERS ;CPM CALLS THE A DRIVE 0,B=1,C=2,D=3; ;SD CALLS THE A DRIVE01 AND THE B DRIVE 02 IF THEY ARE IN SINGLE DENSITY ;BUT THEY ARE CALLED 41H AND 42H IF THEY ARE IN DOUBLE DENSITY (8 INCH) ; TEMPSELDSK: DA6E 210000 LXI H,0 DA71 79 MOV A,C DA72 FE04 CPI 4 DA74 D0 RNC DA75 FE02 CPI 2 ;FIND IF DD OR SD 0,1 ARE S, 2,3 ARE D CP/M MACRO ASSEM 2.0 #003 BIOS FOR VERSAFLOPPY DA77 DA7CDA JC NOTDOUB ;SINGLE DOESN'T NEED THE 40H MASK DA7A F640 ORI 40H ;DOUBLE DEN MASK DA7C E6FD NOTDOUB ANI 0FDH ;GET RID OF CPM'S NUMBER 2 AND MAKE 2=0, AND 3=1 ;FOR 2 DRIVES THIS IS FINE, BUT FOR 4 A LITTLE CHANGE ;WOULD BE NEEDED HERE DA7E 324200 STA ?UNIT DA81 69 MOV L,C DA82 2600 MVI H,0 DA84 1133DB LXI D,DPBASE DA87 29 DAD H DA88 29 DAD H DA89 29 DAD H DA8A 29 DAD H DA8B 19 DAD D DA8C C9 RET DA8D 0E00 HOME1 MVI C,0 DA8F C31EDA JMP SETTRK ; ; WARM-BOOT: READ ALL OF CPM BACK IN ; EXCEPT BIOS, THEN JUMP TO CCP. ; DA92 318000 WBOOT: LXI SP,80H ;SET STACK POINTER. DA95 3A4200 LDA ?UNIT ;SAVE DISK NUMBER. DA98 3232DB STA TEMP DA9B 3E00 MVI A,0 ;0 FOR SINGLE AND 40 FOR DOUBLE DA9D 324200 STA ?UNIT DAA0 0E00 MVI C,0 DAA2 CD1EDA CALL SETTRK DAA5 3E2C MVI A,NSECTS ;GET # SECTORS FOR CPM READ. DAA7 324500 STA ?NREC DAAA 0E02 MVI C,2 DAAC CD21DA CALL SETSEC DAAF 2100C4 LXI H,CPMB ;GET STARTING ADDRESS. DAB2 224000 SHLD ?TADDR DAB5 CD2DF0 CALL ?LDE ;LOAD 'N' SECTORS DAB8 3A32DB LDA TEMP DABB 324200 STA ?UNIT DABE CD53DA CALL SETUP ;SET UP JUMPS. DAC1 C34CDA JMP GOCPM ;GO BACK TO CPM. ; ; CHECK CONSOLE INPUT STATUS. ; ; ;CONST: IN CONSTAT ;READ CONSOLE STATUS. ; ANI KBRBIT ;LOOK AT KB READY BIT. ; MVI A,0 ;SET A=0 FOR RETURN. ; RZ ;NOT READY WHEN NOT 0. ; CMA ;IF READY A=FF. ; RET ;RETURN FROM CONST. ; DAC4 CD21E0 CONST: CALL DJTSTAT DAC7 3E00 MVI A,0 DAC9 C0 RNZ DACA 3D DCR A DACB C9 RET CP/M MACRO ASSEM 2.0 #004 BIOS FOR VERSAFLOPPY ; ; READ A CHARACTER FROM CONSOLE. ; ;CONIN: IN CONSTAT ;READ CONSOLE STATUS. ; ANI KBRBIT ;IF NOT READY, ; JZ CONIN ;LOOP UNTIL LOW. ; IN CONDATA ; ANI 7FH ;MAKE MOST SIG. BIT = 0. ; RET ; ; WRITE A CHARACTER TO THE CONSOLE DEVICE. ; ;CONOT: MOV A,C ; CALL 0F803H ; RET ; ; PRINT THE MESSAGE AT H&L UNTIL A ZERO. ; DACC 7E PMSG: MOV A,M ;GET A CHARACTER. DACD B7 ORA A ;IF IT'S ZERO, DACE C8 RZ ;RETURN. DACF 4F MOV C,A ;OTHERWISE, DAD0 CD0CDA CALL CCONOT ;PRINT IT. DAD3 23 INX H ;INCREMENT H&L, DAD4 C3CCDA JMP PMSG ;AND GET ANOTHER. ; ; CBIOS MESSAGES ; DAD7 0D0A20534BSMSG: DB 0DH,0AH,' SKEW=31:DOUBLE DENSITY=C&D, SINGLE DENSITY=A&B: ' DB0B 0D0A3536 DB 0DH,0AH, MSIZE/10+'0',MSIZE MOD 10 + '0' DB0F 4B2056322E DB 'K V2.0 of 27 MAR 85 RHP',0 ; ; WRITE A CHARACTER ON LIST DEVICE. ; INSERT YOUR ROUTINE HERE ; DB27 C9 LIST: RET ; DB28 AF PRSTAT XRA A DB29 C9 RET ;RETURN ALWAYS NOT READY ; ; PUNCH PAPER TAPE. ; PUNCH: DB2A C9 RET ;RETURN FROM PUNCH. ; ; NORMALLY USED TO READ PAPER TAPE. ; READER: DB2B C9 RET ;RETURN FROM READER. ; ;SECTOR TRANSLATION ROUTINE FOLLOWS ; DB2C EB SECTRAN XCHG DB2D 09 DAD B DB2E 6E MOV L,M DB2F 2600 MVI H,0 CP/M MACRO ASSEM 2.0 #005 BIOS FOR VERSAFLOPPY DB31 C9 RET ; DB32 TEMP DS 1 ; ;MACRO 1 FOLLOWS ;********************************************************* DISKS 4 DB33+= DPBASE EQU $ ;BASE OF DISK PARAMETER BLOCKS DB33+82DB0000 DPE0: DW XLT0,0000H ;TRANSLATE TABLE DB37+00000000 DW 0000H,0000H ;SCRATCH AREA DB3B+DDDB73DB DW DIRBUF,DPB0 ;DIR BUFF,PARM BLOCK DB3F+7CDC5DDC DW CSV0,ALV0 ;CHECK, ALLOC VECTORS DB43+82DB0000 DPE1: DW XLT1,0000H ;TRANSLATE TABLE DB47+00000000 DW 0000H,0000H ;SCRATCH AREA DB4B+DDDB73DB DW DIRBUF,DPB1 ;DIR BUFF,PARM BLOCK DB4F+ABDC8CDC DW CSV1,ALV1 ;CHECK, ALLOC VECTORS DB53+ABDB0000 DPE2: DW XLT2,0000H ;TRANSLATE TABLE DB57+00000000 DW 0000H,0000H ;SCRATCH AREA DB5B+DDDB9CDB DW DIRBUF,DPB2 ;DIR BUFF,PARM BLOCK DB5F+D9DCBBDC DW CSV2,ALV2 ;CHECK, ALLOC VECTORS DB63+ABDB0000 DPE3: DW XLT3,0000H ;TRANSLATE TABLE DB67+00000000 DW 0000H,0000H ;SCRATCH AREA DB6B+DDDB9CDB DW DIRBUF,DPB3 ;DIR BUFF,PARM BLOCK DB6F+07DDE9DC DW CSV3,ALV3 ;CHECK, ALLOC VECTORS DISKDEF 0,1,26,6,1024,243,64,64,2 DB73+= DPB0 EQU $ ;DISK PARM BLOCK DB73+1A00 DW 26 ;SEC PER TRACK DB75+03 DB 3 ;BLOCK SHIFT DB76+07 DB 7 ;BLOCK MASK DB77+00 DB 0 ;EXTNT MASK DB78+F200 DW 242 ;DISK SIZE-1 DB7A+3F00 DW 63 ;DIRECTORY MAX DB7C+C0 DB 192 ;ALLOC0 DB7D+00 DB 0 ;ALLOC1 DB7E+1000 DW 16 ;CHECK SIZE DB80+0200 DW 2 ;OFFSET DB82+= XLT0 EQU $ ;TRANSLATE TABLE DB82+01 DB 1 DB83+07 DB 7 DB84+0D DB 13 DB85+13 DB 19 DB86+19 DB 25 DB87+05 DB 5 DB88+0B DB 11 DB89+11 DB 17 DB8A+17 DB 23 DB8B+03 DB 3 DB8C+09 DB 9 DB8D+0F DB 15 DB8E+15 DB 21 DB8F+02 DB 2 DB90+08 DB 8 DB91+0E DB 14 DB92+14 DB 20 DB93+1A DB 26 CP/M MACRO ASSEM 2.0 #006 BIOS FOR VERSAFLOPPY DB94+06 DB 6 DB95+0C DB 12 DB96+12 DB 18 DB97+18 DB 24 DB98+04 DB 4 DB99+0A DB 10 DB9A+10 DB 16 DB9B+16 DB 22 DISKDEF 1,0 DB73+= DPB1 EQU DPB0 ;EQUIVALENT PARAMETERS 001F+= ALS1 EQU ALS0 ;SAME ALLOCATION VECTOR SIZE 0010+= CSS1 EQU CSS0 ;SAME CHECKSUM VECTOR SIZE DB82+= XLT1 EQU XLT0 ;SAME TRANSLATE TABLE DISKDEF 2,1,50,31,2048,234,64,64,2 DB9C+= DPB2 EQU $ ;DISK PARM BLOCK DB9C+3200 DW 50 ;SEC PER TRACK DB9E+04 DB 4 ;BLOCK SHIFT DB9F+0F DB 15 ;BLOCK MASK DBA0+01 DB 1 ;EXTNT MASK DBA1+E900 DW 233 ;DISK SIZE-1 DBA3+3F00 DW 63 ;DIRECTORY MAX DBA5+80 DB 128 ;ALLOC0 DBA6+00 DB 0 ;ALLOC1 DBA7+1000 DW 16 ;CHECK SIZE DBA9+0200 DW 2 ;OFFSET DBAB+= XLT2 EQU $ ;TRANSLATE TABLE DBAB+01 DB 1 DBAC+20 DB 32 DBAD+0D DB 13 DBAE+2C DB 44 DBAF+19 DB 25 DBB0+06 DB 6 DBB1+25 DB 37 DBB2+12 DB 18 DBB3+31 DB 49 DBB4+1E DB 30 DBB5+0B DB 11 DBB6+2A DB 42 DBB7+17 DB 23 DBB8+04 DB 4 DBB9+23 DB 35 DBBA+10 DB 16 DBBB+2F DB 47 DBBC+1C DB 28 DBBD+09 DB 9 DBBE+28 DB 40 DBBF+15 DB 21 DBC0+02 DB 2 DBC1+21 DB 33 DBC2+0E DB 14 DBC3+2D DB 45 DBC4+1A DB 26 DBC5+07 DB 7 DBC6+26 DB 38 DBC7+13 DB 19 DBC8+32 DB 50 CP/M MACRO ASSEM 2.0 #007 BIOS FOR VERSAFLOPPY DBC9+1F DB 31 DBCA+0C DB 12 DBCB+2B DB 43 DBCC+18 DB 24 DBCD+05 DB 5 DBCE+24 DB 36 DBCF+11 DB 17 DBD0+30 DB 48 DBD1+1D DB 29 DBD2+0A DB 10 DBD3+29 DB 41 DBD4+16 DB 22 DBD5+03 DB 3 DBD6+22 DB 34 DBD7+0F DB 15 DBD8+2E DB 46 DBD9+1B DB 27 DBDA+08 DB 8 DBDB+27 DB 39 DBDC+14 DB 20 DISKDEF 3,2 DB9C+= DPB3 EQU DPB2 ;EQUIVALENT PARAMETERS 001E+= ALS3 EQU ALS2 ;SAME ALLOCATION VECTOR SIZE 0010+= CSS3 EQU CSS2 ;SAME CHECKSUM VECTOR SIZE DBAB+= XLT3 EQU XLT2 ;SAME TRANSLATE TABLE ;********************************************************* ; ;MACRO 2 FOLLOWS ;****************************************************** ENDEF DBDD+= BEGDAT EQU $ DBDD+ DIRBUF: DS 128 ;DIRECTORY ACCESS BUFFER DC5D+ ALV0: DS 31 DC7C+ CSV0: DS 16 DC8C+ ALV1: DS 31 DCAB+ CSV1: DS 16 DCBB+ ALV2: DS 30 DCD9+ CSV2: DS 16 DCE9+ ALV3: DS 30 DD07+ CSV3: DS 16 DD17+= ENDDAT EQU $ 013A+= DATSIZ EQU $-BEGDAT ;****************************************************** ; DD17 END