@ -1511,8 +1511,8 @@ DSK_MBR3:
;
DSK_MBR4:
; IF BOOT FROM PARTITION, USE NEW SECTORS PER SLICE VALUE
LD HL , 16384 ; NEW SECTORS PER SLICE
LD ( SP S ), HL ; SAVE IT
LD HL , 16384 ; NEW SECTORS PER SLICE
LD ( SP S ), HL ; SAVE IT
; UPDATE MEDIA ID
LD A , MID_HDNEW ; NEW MEDIA ID
@ -1520,20 +1520,79 @@ DSK_MBR4:
;
DSK_MBR5:
; ADJUST LBA OFFSET BASED ON TARGET SLICE
LD A ,( SLICE ) ; GET SLICE, A IS LOOP CNT
LD HL ,( SEKLBA ) ; SET DE:HL
LD DE ,( SEKLBA + 2 ) ; ... TO STARTING LBA
LD BC ,( SP S ) ; SECTORS PER SLICE
DSK_MBR6:
OR A ; SET FLAGS TO CHECK LOOP CNTR
JR Z , DS K_MBR8 ; DONE IF COUNTER EXHAUSTED
ADD HL , BC ; ADD ONE SLICE TO LOW WORD
JR NC , DS K_MBR7 ; CHECK FOR CARRY
INC DE ; IF SO, BUMP HIGH WORD
DSK_MBR7:
DEC A ; DEC LOOP DOWNCOUNTER
JR DS K_MBR6 ; AND LOOP
LD A ,( SLICE ) ; GET SLICE, A IS LOOP CNT
LD HL ,( SEKLBA ) ; SET DE:HL
LD DE ,( SEKLBA + 2 ) ; ... TO STARTING LBA
LD BC ,( SP S ) ; SECTORS PER SLICE
DSK_MBR6:
OR A ; SET FLAGS TO CHECK LOOP CNTR
JR Z , DS K_MBR8 ; DONE IF COUNTER EXHAUSTED
ADD HL , BC ; ADD ONE SLICE TO LOW WORD
JR NC , DS K_MBR7 ; CHECK FOR CARRY
INC DE ; IF SO, BUMP HIGH WORD
DSK_MBR7:
DEC A ; DEC LOOP DOWNCOUNTER
JR DS K_MBR6 ; AND LOOP
DSK_MBR8:
; LBA OFFSET OF DESIRED SLICE IS NOW IN DE:HL
; NEED TO CHECK IF THE SLICE IS BEYOND CAPACITY OF MEDIA
; IF LBA_OFF + SPS >= DSK_CAP, ERROR!
; SAVE LBA_OFF
PUSH DE ; MSW
PUSH HL ; LSW
; ADD SPS TO COMPUTE LBA_REQ
LD BC ,( SP S ) ; SECTORS PER SLICE
ADD HL , BC ; ADD ONE SLICE TO LOW WORD
JR NC , DS K_MBR9 ; CHECK FOR CARRY
INC DE ; IF SO, BUMP HIGH WORD
DSK_MBR9:
; SAVE CAP_REQ
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)
PUSH HL ; SAVE DSK_CAP (LSW)
;
; CHECK DSK_CAP >= CAP_REQ, CF SET ON OVERFLOW
; NO NEED SAVE ACTUAL RESULT
OR A ; CLEAR CARRY FOR SBC
POP HL ; DSK_CAP LSW
LD DE ,( CAP_REQ ) ; CAP_REQ LSW
SBC HL , DE ; DSK_CAP - LBA_REQ (LSW)
POP HL ; DSK_CAP MSW
LD DE ,( CAP_REQ + 2 ) ; CAP_REQ MSW
SBC HL , DE ; DSK_CAP - LBA_REQ (MSW)
;
; RESTORE LBA_OFF
POP HL ; LSW
POP DE ; MSW
;
; ABORT ON OVERFLOW WITH ERROR!
JR NC , DS K_MBR10 ; IF NO OVERFLOW, CONTINUE
OR $ FF ; SIGNAL ERROR
RET ; DONE
;
DSK_MBR10:
; FINALIZE SLICE LBA
SET 7 , D ; SET LBA ACCESS FLAG
; RESAVE IT
LD ( SEKLBA ), HL ; LOWORD
@ -1758,6 +1817,7 @@ CCPBUF .DW 0 ; ADDRESS OF CCP BUF IN BIOS BANK
MEDID .DB 0 ; TEMP STORAGE FOR MEDIA ID
SLICE .DB 0 ; CURRENT SLICE
SPS .DW 0 ; SECTORS PER SLICE
CAP_REQ .DW 0 , 0 ; LBA CAP REQUIRED FOR SLICE
STKSAV .DW 0 ; TEMP SAVED STACK POINTER
;
# IFDEF PLTWBW