|
|
|
|
@@ -439,12 +439,12 @@ WBOOT:
|
|
|
|
|
LD DE,(BNKBIOS) ; UBIOS_PAGE (SEE PAGES.INC)
|
|
|
|
|
RST 08 ; DO IT
|
|
|
|
|
PUSH DE ; SAVE PREVIOUS BANK
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LD HL,(CCPBUF) ; ADDRESS OF CCP BUF IN BIOS MEM
|
|
|
|
|
LD DE,CCP_LOC ; ADDRESS IN HI MEM OF CCP
|
|
|
|
|
LD BC,CCP_SIZ ; SIZE OF CCP
|
|
|
|
|
LDIR ; DO IT
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LD BC,$01FB ; UNA FUNC = SET BANK
|
|
|
|
|
POP DE ; RECOVER OPERATING BANK
|
|
|
|
|
RST 08 ; DO IT
|
|
|
|
|
@@ -804,7 +804,7 @@ WRITE:
|
|
|
|
|
LD A,C
|
|
|
|
|
LD (WRTYPE),A ; SAVE WRITE TYPE
|
|
|
|
|
LD A,DOP_WRITE
|
|
|
|
|
JR READWRITE
|
|
|
|
|
;JR READWRITE ; OPTIMISATION (FALL THRU TO READWRITE)
|
|
|
|
|
;
|
|
|
|
|
;__________________________________________________________________________________________________
|
|
|
|
|
READWRITE:
|
|
|
|
|
@@ -1232,11 +1232,11 @@ DSK_GETINF:
|
|
|
|
|
RLCA ; ... TO USE AS OFFSET INTO DRVMAP
|
|
|
|
|
CALL ADDHLA ; ADD OFFSET
|
|
|
|
|
LD D,(HL) ; D := UNIT
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LD A,D ; PUT UNIT IN ACCUM
|
|
|
|
|
INC A ; $FF -> $00
|
|
|
|
|
JR Z,DSK_GETINF1 ; HANDLE UNASSIGNED DRIVE LETTER
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
INC HL ; BUMP TO SLICE
|
|
|
|
|
LD E,(HL) ; E := SLICE
|
|
|
|
|
INC HL ; POINT TO DPH LSB
|
|
|
|
|
@@ -1261,7 +1261,8 @@ DSK_GETINF1: ; ERROR RETURN
|
|
|
|
|
INC A
|
|
|
|
|
RET
|
|
|
|
|
;
|
|
|
|
|
;
|
|
|
|
|
; BIOS FUNCTION FOR SELECTING CPM DRIVE (A-P) IN C REGISTER
|
|
|
|
|
; RETURN HL - BASE ADDRESS OF DPH (0x0000 FOR AN ERROR)
|
|
|
|
|
;
|
|
|
|
|
DSK_SELECT:
|
|
|
|
|
LD B,E ; SAVE E IN B FOR NOW
|
|
|
|
|
@@ -1321,19 +1322,8 @@ DSK_SELECT1A:
|
|
|
|
|
LD (MEDID),A
|
|
|
|
|
;
|
|
|
|
|
#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
|
|
|
|
|
;
|
|
|
|
|
; CLEAR LBA OFFSET (DWORD)
|
|
|
|
|
@@ -1343,24 +1333,7 @@ DSK_SELECT1A:
|
|
|
|
|
SET 7,H ; ASSUME LBA ACCESS FOR NOW
|
|
|
|
|
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:
|
|
|
|
|
; SET LEGACY SECTORS PER SLICE
|
|
|
|
|
LD HL,16640 ; LEGACY SECTORS PER SLICE
|
|
|
|
|
LD (SPS),HL ; SAVE IT
|
|
|
|
|
;
|
|
|
|
|
; CHECK MBR OF PHYSICAL DISK BEING SELECTED
|
|
|
|
|
; WILL UPDATE MEDID AND LBAOFF IF VALID CP/M PARTITION EXISTS
|
|
|
|
|
@@ -1407,29 +1380,48 @@ DSK_SELECT2:
|
|
|
|
|
; THE MEDIA ID (MEDID).
|
|
|
|
|
;
|
|
|
|
|
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
|
|
|
|
|
LD A,(MEDID) ; GET MEDIA ID
|
|
|
|
|
CP MID_HD ; HARD DISK?
|
|
|
|
|
JR Z,DSK_MBR0 ; IF SO, CONTINUE
|
|
|
|
|
XOR A ; ELSE, N/A, SIGNAL SUCCESS
|
|
|
|
|
RET ; AND RETURN
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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:
|
|
|
|
|
; 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.
|
|
|
|
|
CALL BLKFLSH ; MAKE SURE DISK BUFFER IS NOT DIRTY
|
|
|
|
|
XOR A ; CLEAR ACCUM
|
|
|
|
|
@@ -1441,9 +1433,6 @@ DSK_MBR1:
|
|
|
|
|
LD C,A ; PUT IN C
|
|
|
|
|
LD DE,0 ; LBA SECTOR ZERO
|
|
|
|
|
LD HL,0 ; ...
|
|
|
|
|
#IFDEF PLTWBW
|
|
|
|
|
SET 7,D ; MAKE SURE LBA ACCESS BIT SET
|
|
|
|
|
#ENDIF
|
|
|
|
|
CALL DSK_IO2 ; DO IT
|
|
|
|
|
RET NZ ; ABORT ON ERROR
|
|
|
|
|
;
|
|
|
|
|
@@ -1487,6 +1476,8 @@ DSK_MBR3:
|
|
|
|
|
; CHECK THAT REQUESTED SLICE IS "INSIDE" PARTITION
|
|
|
|
|
; SLICE SIZE IS EXACTLY 16,384 SECTORS (8MB), SO WE CAN JUST
|
|
|
|
|
; 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
|
|
|
|
|
INC HL ; ... OF 32 BIT PARTITION
|
|
|
|
|
LD D,(HL) ; ... SECTOR COUNT,
|
|
|
|
|
@@ -1510,7 +1501,7 @@ DSK_MBR3:
|
|
|
|
|
;
|
|
|
|
|
DSK_MBR4:
|
|
|
|
|
; 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
|
|
|
|
|
|
|
|
|
|
; UPDATE MEDIA ID
|
|
|
|
|
@@ -1519,18 +1510,19 @@ DSK_MBR4:
|
|
|
|
|
;
|
|
|
|
|
DSK_MBR5:
|
|
|
|
|
; 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 HL,(SEKLBA) ; SET DE:HL
|
|
|
|
|
LD DE,(SEKLBA+2) ; ... TO STARTING LBA
|
|
|
|
|
LD BC,(SPS) ; SECTORS PER SLICE
|
|
|
|
|
RES 7,D ; CLEAR LBA MODE BIT
|
|
|
|
|
DSK_MBR6:
|
|
|
|
|
DSK_MBR6:
|
|
|
|
|
OR A ; SET FLAGS TO CHECK LOOP CNTR
|
|
|
|
|
JR Z,DSK_MBR8 ; DONE IF COUNTER EXHAUSTED
|
|
|
|
|
ADD HL,BC ; ADD ONE SLICE TO LOW WORD
|
|
|
|
|
JR NC,DSK_MBR7 ; CHECK FOR CARRY
|
|
|
|
|
INC DE ; IF SO, BUMP HIGH WORD
|
|
|
|
|
DSK_MBR7:
|
|
|
|
|
DSK_MBR7:
|
|
|
|
|
DEC A ; DEC LOOP DOWNCOUNTER
|
|
|
|
|
JR DSK_MBR6 ; AND LOOP
|
|
|
|
|
DSK_MBR8:
|
|
|
|
|
@@ -1552,21 +1544,11 @@ DSK_MBR9:
|
|
|
|
|
LD (CAP_REQ),HL ; LSW
|
|
|
|
|
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)
|
|
|
|
|
LD C,$45 ; UBIOS DISK INFO FUNC
|
|
|
|
|
LD A,(SEKUNIT) ; DISK UNIT NUMBER
|
|
|
|
|
LD B,A ; ... INTO B
|
|
|
|
|
RST 08 ; CALL UNA (DE:HL = CAPACITY)
|
|
|
|
|
#ENDIF
|
|
|
|
|
;
|
|
|
|
|
; SAVE DSK_CAP (DE:HL)
|
|
|
|
|
PUSH DE ; SAVE DSK_CAP (MSW)
|
|
|
|
|
@@ -1591,9 +1573,12 @@ DSK_MBR9:
|
|
|
|
|
OR $FF ; SIGNAL ERROR
|
|
|
|
|
RET ; DONE
|
|
|
|
|
;
|
|
|
|
|
#ENDIF
|
|
|
|
|
;
|
|
|
|
|
DSK_MBR10:
|
|
|
|
|
; FINALIZE SLICE LBA
|
|
|
|
|
SET 7,D ; SET LBA ACCESS FLAG
|
|
|
|
|
DSK_MBR11:
|
|
|
|
|
; RESAVE IT
|
|
|
|
|
LD (SEKLBA),HL ; LOWORD
|
|
|
|
|
LD (SEKLBA+2),DE ; HIWORD
|
|
|
|
|
@@ -1601,7 +1586,7 @@ DSK_MBR10:
|
|
|
|
|
XOR A ; SUCCESS
|
|
|
|
|
RET ; DONE
|
|
|
|
|
;
|
|
|
|
|
;
|
|
|
|
|
; CHECK DISK STATUS (PART OF BIOS COLD WARM BOOT)
|
|
|
|
|
;
|
|
|
|
|
DSK_STATUS:
|
|
|
|
|
#IFDEF PLTUNA
|
|
|
|
|
@@ -1619,21 +1604,21 @@ DSK_STATUS:
|
|
|
|
|
RET
|
|
|
|
|
#ENDIF
|
|
|
|
|
;
|
|
|
|
|
;
|
|
|
|
|
; READ PHYSICAL SECTOR INTO BUFFER
|
|
|
|
|
;
|
|
|
|
|
DSK_READ:
|
|
|
|
|
; SET B = FUNCTION: READ
|
|
|
|
|
LD B,BF_DIOREAD
|
|
|
|
|
JR DSK_IO
|
|
|
|
|
;
|
|
|
|
|
;
|
|
|
|
|
; WRITE PHYSICAL SECTOR FROM BUFFER
|
|
|
|
|
;
|
|
|
|
|
DSK_WRITE:
|
|
|
|
|
; SET B = FUNCTION: WRITE
|
|
|
|
|
LD B,BF_DIOWRITE
|
|
|
|
|
JR DSK_IO
|
|
|
|
|
;
|
|
|
|
|
;
|
|
|
|
|
; READ/WRITE PHYSICAL SECTOR
|
|
|
|
|
;
|
|
|
|
|
DSK_IO:
|
|
|
|
|
LD A,(HSTUNIT) ; GET UNIT
|
|
|
|
|
@@ -1671,8 +1656,8 @@ LBA_IO:
|
|
|
|
|
LD L,A
|
|
|
|
|
; ADD IN LBA OFFSET FOR PARTITION AND/OR SLICE
|
|
|
|
|
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
|
|
|
|
|
ADC HL,BC
|
|
|
|
|
EX DE,HL
|
|
|
|
|
@@ -1816,8 +1801,10 @@ DEFDRIVE .DB 0 ; DEFAULT DRIVE
|
|
|
|
|
CCPBUF .DW 0 ; ADDRESS OF CCP BUF IN BIOS BANK
|
|
|
|
|
MEDID .DB 0 ; TEMP STORAGE FOR MEDIA ID
|
|
|
|
|
SLICE .DB 0 ; CURRENT SLICE
|
|
|
|
|
#IFDEF PLTUNA
|
|
|
|
|
SPS .DW 0 ; SECTORS PER SLICE
|
|
|
|
|
CAP_REQ .DW 0,0 ; LBA CAP REQUIRED FOR SLICE
|
|
|
|
|
#ENDIF
|
|
|
|
|
STKSAV .DW 0 ; TEMP SAVED STACK POINTER
|
|
|
|
|
;
|
|
|
|
|
#IFDEF PLTWBW
|
|
|
|
|
@@ -2596,7 +2583,7 @@ MD_INIT:
|
|
|
|
|
LD A,(HCB + HCB_RAMD_BNKS) ; RAM DISK SIZE IN BANKS
|
|
|
|
|
LD IX,DPB_RAM ; ADDRESS OF DPB
|
|
|
|
|
CALL MD_INIT1 ; FIX IT UP
|
|
|
|
|
;
|
|
|
|
|
;
|
|
|
|
|
JR MD_INIT4 ; DONE
|
|
|
|
|
;
|
|
|
|
|
MD_INIT1:
|
|
|
|
|
|