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 MSIZE EQU 56 ;MEMORY SIZE IN KBYTES. CONSTAT EQU 3 ;CONSOLE STATUS PORT. CONDATA EQU 2 ;CONSOLE DATA PORT. KBRBIT EQU 2 ;KEYBOARD READY BIT. ; CBASE EQU (MSIZE-20)*1024 ;BIAS FOR CPM LARGER THAN 17K. CPMB EQU CBASE+3400H ;START OF CPM. BDOS EQU CPMB+806H ;START OF BDOS BIOS EQU CPMB+1600H NSECTS EQU 44 ; ; EXTRN ?STRKE,?SSECE,?SDMAE,?RDE,?WRE ; EXTRN ?TADDR,?UNIT,?LDE,?NREC ; ; ROMORG EQU 0F000H ?STRKE EQU ROMORG+01EH ?SSECE EQU ROMORG+021H ?SDMAE EQU ROMORG+024H ?RDE EQU ROMORG+027H ?WRE EQU ROMORG+02AH ?LDE EQU ROMORG+02DH ; ?TADDR EQU 0040H ?UNIT EQU 0042H ?NREC EQU 0045H ; DJTSTAT EQU 0E021H ;DISK JOCKY SERIAL STATUS DJCIN EQU 0E003H ;DISK JOCKY SERIAL IN DJCOUT EQU 0E006H ;DISK JOCKY SERIAL OUT ; MACLIB DISKDEF ; ORG BIOS ;START OF BIOS. ; JMP BOOT ;FROM COLD START LOADER. WBOOTE: JMP WBOOT ;FROM WARM BOOT. JMP CONST ;CHECK CONSOLE KB STATUS. JMP DJCIN ;READ CONSOLE CHARACTER. CCONOT: JMP DJCOUT ;WRITE CONSOLE CHARACTER. JMP LIST ;WRITE LISTING CHAR. JMP PUNCH ;WRITE PUNCH CHAR. JMP READER ;READ READER CHAR. JMP HOME1 ;MOVE DISK TO TRACK ZERO. JMP TEMPSELDSK ;SELECT DISK DRIVE. SETTRK: JMP ?STRKE ;SEEK TO TRACK IN REG A. SETSEC: JMP ?SSECE ;SET SECTOR NUMBER. SETDMA: JMP ?SDMAE ;SET DISK STARTING ADR. READ: JMP ?RDE ;READ SELECTED SECTOR. WRITE: JMP ?WRE ;WRITE SELECTED SECTOR. JMP PRSTAT ;LIST STATUS CHECK 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. ; BOOT: LXI SP,80H ;SET STACK POINTER. ; ;BOOTUP WILL ALWAYS BE IN DOUBLE BY THIS TECHNIQUE ; ;PUT YOUR REQUIRED INITIALIZATION BYTES HERE- IF ANY XRA A OUT 5 ; XRA A STA 4 ;CDISK STA 3 ;IOBYTE ; ORI 40H ;MASK FOR DOUBLE DEN ;(not needed when starting single) STA ?UNIT CALL SETUP ;SET UP JUMPS. LXI H,SMSG ;PRINT OPENING MESSAGE. CALL PMSG GOCPM: LDA 4 ;GET DISK NUMBER TO MOV C,A ;PASS TO CCP IN C. JMP CPMB ;JUMP TO CCP. ; ; SET UP JUMPS TO CP/M ; SETUP: MVI A,0C3H ;PUT JMP TO WBOOT STA 0 ;ADR AT ZERO. LXI H,WBOOTE SHLD 1 STA 5 LXI H,BDOS ;PUT JUMP TO BDOS SHLD 6 ;AT ADR 5,6,7. LXI H,80H ;SET DEFAULT DMA ADR. SHLD ?TADDR ;DMA ADDR POINTER 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: LXI H,0 MOV A,C CPI 4 RNC CPI 2 ;FIND IF DD OR SD 0,1 ARE S, 2,3 ARE D JC NOTDOUB ;SINGLE DOESN'T NEED THE 40H MASK ORI 40H ;DOUBLE DEN MASK 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 STA ?UNIT MOV L,C MVI H,0 LXI D,DPBASE DAD H DAD H DAD H DAD H DAD D RET HOME1 MVI C,0 JMP SETTRK ; ; WARM-BOOT: READ ALL OF CPM BACK IN ; EXCEPT BIOS, THEN JUMP TO CCP. ; WBOOT: LXI SP,80H ;SET STACK POINTER. LDA ?UNIT ;SAVE DISK NUMBER. STA TEMP MVI A,0 ;0 for single and 40 for double STA ?UNIT MVI C,0 CALL SETTRK MVI A,NSECTS ;GET # SECTORS FOR CPM READ. STA ?NREC MVI C,2 CALL SETSEC LXI H,CPMB ;GET STARTING ADDRESS. SHLD ?TADDR CALL ?LDE ;LOAD 'N' SECTORS LDA TEMP STA ?UNIT CALL SETUP ;SET UP JUMPS. 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. ; CONST: CALL DJTSTAT MVI A,0 RNZ DCR A RET ; ; 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. ; PMSG: MOV A,M ;GET A CHARACTER. ORA A ;IF IT'S ZERO, RZ ;RETURN. MOV C,A ;OTHERWISE, CALL CCONOT ;PRINT IT. INX H ;INCREMENT H&L, JMP PMSG ;AND GET ANOTHER. ; ; CBIOS MESSAGES ; SMSG: DB 0DH,0AH,' SKEW=31:DOUBLE DENSITY=C&D, SINGLE DENSITY=A&B: ' DB 0DH,0AH, MSIZE/10+'0',MSIZE MOD 10 + '0' DB 'K V2.0 of 27 MAR 85 RHP',0 ; ; WRITE A CHARACTER ON LIST DEVICE. ; INSERT YOUR ROUTINE HERE ; LIST: RET ; PRSTAT XRA A RET ;RETURN ALWAYS NOT READY ; ; PUNCH PAPER TAPE. ; PUNCH: RET ;RETURN FROM PUNCH. ; ; NORMALLY USED TO READ PAPER TAPE. ; READER: RET ;RETURN FROM READER. ; ;SECTOR TRANSLATION ROUTINE FOLLOWS ; SECTRAN XCHG DAD B MOV L,M MVI H,0 RET ; TEMP DS 1 ; ;MACRO 1 FOLLOWS ;********************************************************* DISKS 4 DISKDEF 0,1,26,6,1024,243,64,64,2 DISKDEF 1,0 DISKDEF 2,1,50,31,2048,234,64,64,2 DISKDEF 3,2 ;********************************************************* ; ;MACRO 2 FOLLOWS ;****************************************************** ENDEF ;****************************************************** ; END