Browse Source

Merge pull request #433 from kiwisincebirth/map/cbios-drive-select

cbios changes to use HBIOS for Drive Slice Selection
master
Wayne Warthen 1 year ago
committed by GitHub
parent
commit
ee60c11dec
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 1
      Doc/ChangeLog.txt
  2. 135
      Source/CBIOS/cbios.asm
  3. 6
      Source/HBIOS/hbios.asm
  4. 5
      Source/UBIOS/ubios.inc
  5. 2
      Source/ver.inc
  6. 2
      Source/ver.lib

1
Doc/ChangeLog.txt

@ -41,6 +41,7 @@ Version 3.5
- MAP: Contributed COPYSL utility - MAP: Contributed COPYSL utility
- MAP: Added new HBIOS function SYSGET_DIOMED - MAP: Added new HBIOS function SYSGET_DIOMED
- MAP: ROMLDR now uses SYSGET_DIOMED to get Slice Sector for boot - MAP: ROMLDR now uses SYSGET_DIOMED to get Slice Sector for boot
- MAP: CBIOS now uses SYSGET_DIOMED during drive selection
Version 3.4 Version 3.4
----------- -----------

135
Source/CBIOS/cbios.asm

@ -439,12 +439,12 @@ WBOOT:
LD DE,(BNKBIOS) ; UBIOS_PAGE (SEE PAGES.INC) LD DE,(BNKBIOS) ; UBIOS_PAGE (SEE PAGES.INC)
RST 08 ; DO IT RST 08 ; DO IT
PUSH DE ; SAVE PREVIOUS BANK PUSH DE ; SAVE PREVIOUS BANK
LD HL,(CCPBUF) ; ADDRESS OF CCP BUF IN BIOS MEM LD HL,(CCPBUF) ; ADDRESS OF CCP BUF IN BIOS MEM
LD DE,CCP_LOC ; ADDRESS IN HI MEM OF CCP LD DE,CCP_LOC ; ADDRESS IN HI MEM OF CCP
LD BC,CCP_SIZ ; SIZE OF CCP LD BC,CCP_SIZ ; SIZE OF CCP
LDIR ; DO IT LDIR ; DO IT
LD BC,$01FB ; UNA FUNC = SET BANK LD BC,$01FB ; UNA FUNC = SET BANK
POP DE ; RECOVER OPERATING BANK POP DE ; RECOVER OPERATING BANK
RST 08 ; DO IT RST 08 ; DO IT
@ -804,7 +804,7 @@ WRITE:
LD A,C LD A,C
LD (WRTYPE),A ; SAVE WRITE TYPE LD (WRTYPE),A ; SAVE WRITE TYPE
LD A,DOP_WRITE LD A,DOP_WRITE
JR READWRITE
;JR READWRITE ; OPTIMISATION (FALL THRU TO READWRITE)
; ;
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
READWRITE: READWRITE:
@ -1232,11 +1232,11 @@ DSK_GETINF:
RLCA ; ... TO USE AS OFFSET INTO DRVMAP RLCA ; ... TO USE AS OFFSET INTO DRVMAP
CALL ADDHLA ; ADD OFFSET CALL ADDHLA ; ADD OFFSET
LD D,(HL) ; D := UNIT LD D,(HL) ; D := UNIT
LD A,D ; PUT UNIT IN ACCUM LD A,D ; PUT UNIT IN ACCUM
INC A ; $FF -> $00 INC A ; $FF -> $00
JR Z,DSK_GETINF1 ; HANDLE UNASSIGNED DRIVE LETTER JR Z,DSK_GETINF1 ; HANDLE UNASSIGNED DRIVE LETTER
INC HL ; BUMP TO SLICE INC HL ; BUMP TO SLICE
LD E,(HL) ; E := SLICE LD E,(HL) ; E := SLICE
INC HL ; POINT TO DPH LSB INC HL ; POINT TO DPH LSB
@ -1261,7 +1261,8 @@ DSK_GETINF1: ; ERROR RETURN
INC A INC A
RET RET
; ;
;
; BIOS FUNCTION FOR SELECTING CPM DRIVE (A-P) IN C REGISTER
; RETURN HL - BASE ADDRESS OF DPH (0x0000 FOR AN ERROR)
; ;
DSK_SELECT: DSK_SELECT:
LD B,E ; SAVE E IN B FOR NOW LD B,E ; SAVE E IN B FOR NOW
@ -1321,19 +1322,8 @@ DSK_SELECT1A:
LD (MEDID),A LD (MEDID),A
; ;
#ELSE #ELSE
;
; DETERMINE MEDIA IN DRIVE
LD A,(SEKUNIT) ; GET UNIT
LD C,A ; STORE IN C
LD B,BF_DIOMEDIA ; DRIVER FUNCTION = DISK MEDIA
LD E,1 ; ENABLE MEDIA CHECK/DISCOVERY
RST 08 ; DO IT
LD A,E ; RESULTANT MEDIA ID TO ACCUM
LD (MEDID),A ; SAVE IT
OR A ; SET FLAGS
LD HL,0 ; ASSUME FAILURE
RET Z ; BAIL OUT IF NO MEDIA
;
; NOTE: Setting the (MEDID) is not required for RomWBW at this point
; The media ID is determined during call to DSK_MBR:
#ENDIF #ENDIF
; ;
; CLEAR LBA OFFSET (DWORD) ; CLEAR LBA OFFSET (DWORD)
@ -1343,24 +1333,7 @@ DSK_SELECT1A:
SET 7,H ; ASSUME LBA ACCESS FOR NOW SET 7,H ; ASSUME LBA ACCESS FOR NOW
LD (SEKLBA+2),HL ; CLEAR SECOND WORD LD (SEKLBA+2),HL ; CLEAR SECOND WORD
; ;
#IFDEF PLTWBW
;
LD A,(SEKUNIT) ; GET UNIT
LD C,A ; STORE IN C
LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO
RST 08 ; GET UNIT INFO, DEVICE TYPE IN D
LD A,D ; DEVICE TYPE -> A
CP DIODEV_FD ; FLOPPY?
JR NZ,DSK_SELECT1B ; IF NOT, DO LBA IO
LD HL,SEKLBA+3 ; POINT TO HIGH ORDER BYTE
RES 7,(HL) ; SWITCH FROM LBA -> CHS
;
#ENDIF
;
DSK_SELECT1B: DSK_SELECT1B:
; SET LEGACY SECTORS PER SLICE
LD HL,16640 ; LEGACY SECTORS PER SLICE
LD (SPS),HL ; SAVE IT
; ;
; CHECK MBR OF PHYSICAL DISK BEING SELECTED ; CHECK MBR OF PHYSICAL DISK BEING SELECTED
; WILL UPDATE MEDID AND LBAOFF IF VALID CP/M PARTITION EXISTS ; WILL UPDATE MEDID AND LBAOFF IF VALID CP/M PARTITION EXISTS
@ -1407,29 +1380,48 @@ DSK_SELECT2:
; THE MEDIA ID (MEDID). ; THE MEDIA ID (MEDID).
; ;
DSK_MBR: DSK_MBR:
;
#IFDEF PLTWBW
;
; GET EXTENDED INFORMATION FOR THE DEVICE/SLICE
LD A,(SEKUNIT) ; PASSING BOOT UNIT
LD D,A
LD A,(SLICE) ; AND SLICE
LD E,A
LD B,BF_SYSGET ; HBIOS FUNC: SYS GET
LD C,BF_SYSGET_DIOMED ; HBIOS SUB-FUNC: GET DISK INFO
RST 08 ; DO IT
;
; CHECK ERRORS FROM THE FUNCTION
RET NZ ; ABORT ON ERROR
; SAVE MEDIA ID
LD A,C ; C IS MEDIA ID FROM HBIOS
LD (MEDID),A ; SAVE IT
; TEST IF FLOPPY MEDIA - BIT 7 DEVICE ATTRIBUTES
BIT 7,B ; B IS ATTRIBUTES FROM HBIOS
JR NZ,DSK_MBR11 ; FLOPPY - SAVE AND RETURN DEHL -> CHS
; CODE FALL THRU NEXT IFDEF AND SETS 7,D
; THEN RETURNS DEHL -> LBA MODE
;
#ENDIF
;
#IFDEF PLTUNA
; CHECK MEDIA TYPE, ONLY HARD DISK IS APPLICABLE ; CHECK MEDIA TYPE, ONLY HARD DISK IS APPLICABLE
LD A,(MEDID) ; GET MEDIA ID LD A,(MEDID) ; GET MEDIA ID
CP MID_HD ; HARD DISK? CP MID_HD ; HARD DISK?
JR Z,DSK_MBR0 ; IF SO, CONTINUE JR Z,DSK_MBR0 ; IF SO, CONTINUE
XOR A ; ELSE, N/A, SIGNAL SUCCESS XOR A ; ELSE, N/A, SIGNAL SUCCESS
RET ; AND RETURN RET ; AND RETURN
DSK_MBR0: DSK_MBR0:
;
#IFDEF PLTWBW
; ACTIVATE BIOS BANK TO ACCESS DISK BUFFER
LD (STKSAV),SP ; SAVE CUR STACK
LD SP,STACK ; NEW STACK IN HI MEM
LD A,(BNKBIOS) ; ACTIVATE HBIOS BANK
PUSH IX ; SAVE IX
LD IX,DSK_MBR1 ; ROUTINE TO RUN
CALL HB_BNKCALL ; DO IT
POP IX ; RESTORE IX
LD SP,(STKSAV) ; RESTORE ORIGINAL STACK
RET
#ENDIF
;
DSK_MBR1: DSK_MBR1:
; SET LEGACY SECTORS PER SLICE - USED IN CAPACITY CALC
LD HL,SPS_HD512 ; LEGACY SECTORS PER SLICE
LD (SPS),HL ; SAVE IT
;
; FLUSH DSKBUF TO MAKE SURE IT IS SAFE TO USE IT. ; FLUSH DSKBUF TO MAKE SURE IT IS SAFE TO USE IT.
CALL BLKFLSH ; MAKE SURE DISK BUFFER IS NOT DIRTY CALL BLKFLSH ; MAKE SURE DISK BUFFER IS NOT DIRTY
XOR A ; CLEAR ACCUM XOR A ; CLEAR ACCUM
@ -1441,9 +1433,6 @@ DSK_MBR1:
LD C,A ; PUT IN C LD C,A ; PUT IN C
LD DE,0 ; LBA SECTOR ZERO LD DE,0 ; LBA SECTOR ZERO
LD HL,0 ; ... LD HL,0 ; ...
#IFDEF PLTWBW
SET 7,D ; MAKE SURE LBA ACCESS BIT SET
#ENDIF
CALL DSK_IO2 ; DO IT CALL DSK_IO2 ; DO IT
RET NZ ; ABORT ON ERROR RET NZ ; ABORT ON ERROR
; ;
@ -1487,6 +1476,8 @@ DSK_MBR3:
; CHECK THAT REQUESTED SLICE IS "INSIDE" PARTITION ; CHECK THAT REQUESTED SLICE IS "INSIDE" PARTITION
; SLICE SIZE IS EXACTLY 16,384 SECTORS (8MB), SO WE CAN JUST ; SLICE SIZE IS EXACTLY 16,384 SECTORS (8MB), SO WE CAN JUST
; RIGHT SHIFT PARTITION SECTOR COUNT BY 14 BITS ; RIGHT SHIFT PARTITION SECTOR COUNT BY 14 BITS
; IMPLEMENTED BY : LEFT SHIFT BY 2, AND TAKE HIGH ORDER WORD
; SAME AS DISCARDING THE LOWER 14 BITS, SINCE KEEP 2 BY SHIFT
LD E,(HL) ; HL POINTS TO FIRST BYTE LD E,(HL) ; HL POINTS TO FIRST BYTE
INC HL ; ... OF 32 BIT PARTITION INC HL ; ... OF 32 BIT PARTITION
LD D,(HL) ; ... SECTOR COUNT, LD D,(HL) ; ... SECTOR COUNT,
@ -1510,7 +1501,7 @@ DSK_MBR3:
; ;
DSK_MBR4: DSK_MBR4:
; IF BOOT FROM PARTITION, USE NEW SECTORS PER SLICE VALUE ; IF BOOT FROM PARTITION, USE NEW SECTORS PER SLICE VALUE
LD HL,16384 ; NEW SECTORS PER SLICE
LD HL,SPS_HD1K ; NEW SECTORS PER SLICE
LD (SPS),HL ; SAVE IT LD (SPS),HL ; SAVE IT
; UPDATE MEDIA ID ; UPDATE MEDIA ID
@ -1519,18 +1510,19 @@ DSK_MBR4:
; ;
DSK_MBR5: DSK_MBR5:
; ADJUST LBA OFFSET BASED ON TARGET SLICE ; ADJUST LBA OFFSET BASED ON TARGET SLICE
; ALSO JP HERE IF NO PARTITION TABLE, OR NO CPM PARTION
LD A,(SLICE) ; GET SLICE, A IS LOOP CNT LD A,(SLICE) ; GET SLICE, A IS LOOP CNT
LD HL,(SEKLBA) ; SET DE:HL LD HL,(SEKLBA) ; SET DE:HL
LD DE,(SEKLBA+2) ; ... TO STARTING LBA LD DE,(SEKLBA+2) ; ... TO STARTING LBA
LD BC,(SPS) ; SECTORS PER SLICE LD BC,(SPS) ; SECTORS PER SLICE
RES 7,D ; CLEAR LBA MODE BIT RES 7,D ; CLEAR LBA MODE BIT
DSK_MBR6:
DSK_MBR6:
OR A ; SET FLAGS TO CHECK LOOP CNTR OR A ; SET FLAGS TO CHECK LOOP CNTR
JR Z,DSK_MBR8 ; DONE IF COUNTER EXHAUSTED JR Z,DSK_MBR8 ; DONE IF COUNTER EXHAUSTED
ADD HL,BC ; ADD ONE SLICE TO LOW WORD ADD HL,BC ; ADD ONE SLICE TO LOW WORD
JR NC,DSK_MBR7 ; CHECK FOR CARRY JR NC,DSK_MBR7 ; CHECK FOR CARRY
INC DE ; IF SO, BUMP HIGH WORD INC DE ; IF SO, BUMP HIGH WORD
DSK_MBR7:
DSK_MBR7:
DEC A ; DEC LOOP DOWNCOUNTER DEC A ; DEC LOOP DOWNCOUNTER
JR DSK_MBR6 ; AND LOOP JR DSK_MBR6 ; AND LOOP
DSK_MBR8: DSK_MBR8:
@ -1552,21 +1544,11 @@ DSK_MBR9:
LD (CAP_REQ),HL ; LSW LD (CAP_REQ),HL ; LSW
LD (CAP_REQ+2),DE ; MSW LD (CAP_REQ+2),DE ; MSW
; ;
#IFDEF PLTWBW
; GET DSK_CAP (DE:HL)
LD B,BF_DIOCAP ; HBIOS DISK CAPACITY FUNC
LD A,(SEKUNIT) ; DISK UNIT NUMBER
LD C,A ; ... INTO C
RST 08 ; HBIOS CALL (DE:HL = CAPACITY)
#ENDIF
;
#IFDEF PLTUNA
; GET DSK_CAP (DE:HL) ; GET DSK_CAP (DE:HL)
LD C,$45 ; UBIOS DISK INFO FUNC LD C,$45 ; UBIOS DISK INFO FUNC
LD A,(SEKUNIT) ; DISK UNIT NUMBER LD A,(SEKUNIT) ; DISK UNIT NUMBER
LD B,A ; ... INTO B LD B,A ; ... INTO B
RST 08 ; CALL UNA (DE:HL = CAPACITY) RST 08 ; CALL UNA (DE:HL = CAPACITY)
#ENDIF
; ;
; SAVE DSK_CAP (DE:HL) ; SAVE DSK_CAP (DE:HL)
PUSH DE ; SAVE DSK_CAP (MSW) PUSH DE ; SAVE DSK_CAP (MSW)
@ -1591,9 +1573,12 @@ DSK_MBR9:
OR $FF ; SIGNAL ERROR OR $FF ; SIGNAL ERROR
RET ; DONE RET ; DONE
; ;
#ENDIF
;
DSK_MBR10: DSK_MBR10:
; FINALIZE SLICE LBA ; FINALIZE SLICE LBA
SET 7,D ; SET LBA ACCESS FLAG SET 7,D ; SET LBA ACCESS FLAG
DSK_MBR11:
; RESAVE IT ; RESAVE IT
LD (SEKLBA),HL ; LOWORD LD (SEKLBA),HL ; LOWORD
LD (SEKLBA+2),DE ; HIWORD LD (SEKLBA+2),DE ; HIWORD
@ -1601,7 +1586,7 @@ DSK_MBR10:
XOR A ; SUCCESS XOR A ; SUCCESS
RET ; DONE RET ; DONE
; ;
;
; CHECK DISK STATUS (PART OF BIOS COLD WARM BOOT)
; ;
DSK_STATUS: DSK_STATUS:
#IFDEF PLTUNA #IFDEF PLTUNA
@ -1619,21 +1604,21 @@ DSK_STATUS:
RET RET
#ENDIF #ENDIF
; ;
;
; READ PHYSICAL SECTOR INTO BUFFER
; ;
DSK_READ: DSK_READ:
; SET B = FUNCTION: READ ; SET B = FUNCTION: READ
LD B,BF_DIOREAD LD B,BF_DIOREAD
JR DSK_IO JR DSK_IO
; ;
;
; WRITE PHYSICAL SECTOR FROM BUFFER
; ;
DSK_WRITE: DSK_WRITE:
; SET B = FUNCTION: WRITE ; SET B = FUNCTION: WRITE
LD B,BF_DIOWRITE LD B,BF_DIOWRITE
JR DSK_IO JR DSK_IO
; ;
;
; READ/WRITE PHYSICAL SECTOR
; ;
DSK_IO: DSK_IO:
LD A,(HSTUNIT) ; GET UNIT LD A,(HSTUNIT) ; GET UNIT
@ -1671,8 +1656,8 @@ LBA_IO:
LD L,A LD L,A
; ADD IN LBA OFFSET FOR PARTITION AND/OR SLICE ; ADD IN LBA OFFSET FOR PARTITION AND/OR SLICE
LD BC,(HSTLBA) ; LBA OFFSET LOWORD LD BC,(HSTLBA) ; LBA OFFSET LOWORD
ADD HL,BC
EX DE,HL
ADD HL,BC
EX DE,HL
LD BC,(HSTLBA+2) ; LBA OFFSET HIWORD LD BC,(HSTLBA+2) ; LBA OFFSET HIWORD
ADC HL,BC ADC HL,BC
EX DE,HL EX DE,HL
@ -1816,8 +1801,10 @@ DEFDRIVE .DB 0 ; DEFAULT DRIVE
CCPBUF .DW 0 ; ADDRESS OF CCP BUF IN BIOS BANK CCPBUF .DW 0 ; ADDRESS OF CCP BUF IN BIOS BANK
MEDID .DB 0 ; TEMP STORAGE FOR MEDIA ID MEDID .DB 0 ; TEMP STORAGE FOR MEDIA ID
SLICE .DB 0 ; CURRENT SLICE SLICE .DB 0 ; CURRENT SLICE
#IFDEF PLTUNA
SPS .DW 0 ; SECTORS PER SLICE SPS .DW 0 ; SECTORS PER SLICE
CAP_REQ .DW 0,0 ; LBA CAP REQUIRED FOR SLICE CAP_REQ .DW 0,0 ; LBA CAP REQUIRED FOR SLICE
#ENDIF
STKSAV .DW 0 ; TEMP SAVED STACK POINTER STKSAV .DW 0 ; TEMP SAVED STACK POINTER
; ;
#IFDEF PLTWBW #IFDEF PLTWBW
@ -2596,7 +2583,7 @@ MD_INIT:
LD A,(HCB + HCB_RAMD_BNKS) ; RAM DISK SIZE IN BANKS LD A,(HCB + HCB_RAMD_BNKS) ; RAM DISK SIZE IN BANKS
LD IX,DPB_RAM ; ADDRESS OF DPB LD IX,DPB_RAM ; ADDRESS OF DPB
CALL MD_INIT1 ; FIX IT UP CALL MD_INIT1 ; FIX IT UP
;
;
JR MD_INIT4 ; DONE JR MD_INIT4 ; DONE
; ;
MD_INIT1: MD_INIT1:

6
Source/HBIOS/hbios.asm

@ -5263,11 +5263,11 @@ SYS_GETDIOMED:
; SAVE CALL ARGUMENTS ; SAVE CALL ARGUMENTS
LD (DIOMED_SLICE),DE ; STORES DE -> SLICE/UNIT PARAMETERS LD (DIOMED_SLICE),DE ; STORES DE -> SLICE/UNIT PARAMETERS
; READ DEVICE INFORMATION USING DIODEVICE FUNTON
; READ DEVICE INFORMATION USING DIODEVICE FUNCTION
LD A,(DIOMED_UNIT) LD A,(DIOMED_UNIT)
LD C,A ; UNIT ID PARAMETER INTO C LD C,A ; UNIT ID PARAMETER INTO C
LD B,BF_DIODEVICE ; DRIVER FUNCTION = DISK MEDIA LD B,BF_DIODEVICE ; DRIVER FUNCTION = DISK MEDIA
CALL DIO_DISPATCH ; CALL DIO TO GET MEDIAID (RESULT IN E)
CALL DIO_DISPATCH ; CALL DIO TO GET DEVICE ATTRIBUTES
RET NZ ; ABORT ON ERROR RET NZ ; ABORT ON ERROR
; ;
; DEVICE ATTRIBUTES IN C ; DEVICE ATTRIBUTES IN C
@ -5298,7 +5298,7 @@ SYS_GETDIOMED1A:
; RETURN MEDIA ID (NOT HD) WITH SUCCESS ; RETURN MEDIA ID (NOT HD) WITH SUCCESS
LD DE,0 ; LBA VALUE WILL BE ZERO LD DE,0 ; LBA VALUE WILL BE ZERO
LD HL,0 LD HL,0
JP SYS_GETDIOMED6A ; RETURN SUCESS
JP SYS_GETDIOMED6A ; RETURN SUCCESS
; ;
SYS_GETDIOMED1B: SYS_GETDIOMED1B:
; FOUND HD, NEED TO PROCESS MBR / PART TABLE ; FOUND HD, NEED TO PROCESS MBR / PART TABLE

5
Source/UBIOS/ubios.inc

@ -25,3 +25,8 @@ MID_FD360 .EQU 7
MID_FD120 .EQU 8 MID_FD120 .EQU 8
MID_FD111 .EQU 9 MID_FD111 .EQU 9
MID_HDNEW .EQU 10 MID_HDNEW .EQU 10
;
; SECTORS PER SLICE
;
SPS_HD512 .EQU $4100
SPS_HD1K .EQU $4000

2
Source/ver.inc

@ -2,7 +2,7 @@
#DEFINE RMN 5 #DEFINE RMN 5
#DEFINE RUP 0 #DEFINE RUP 0
#DEFINE RTP 0 #DEFINE RTP 0
#DEFINE BIOSVER "3.5.0-dev.89"
#DEFINE BIOSVER "3.5.0-dev.90"
#define rmj RMJ #define rmj RMJ
#define rmn RMN #define rmn RMN
#define rup RUP #define rup RUP

2
Source/ver.lib

@ -3,5 +3,5 @@ rmn equ 5
rup equ 0 rup equ 0
rtp equ 0 rtp equ 0
biosver macro biosver macro
db "3.5.0-dev.89"
db "3.5.0-dev.90"
endm endm

Loading…
Cancel
Save