|
|
|
@ -4062,8 +4062,11 @@ HB_DISPATCH1: |
|
|
|
JP C,VDA_DISPATCH |
|
|
|
CP BF_SND + $10 ; $50-$5F: SOUND DRIVERS |
|
|
|
JP C,SND_DISPATCH |
|
|
|
CP BF_SYS ; SKIP TO BF_SYS VALUE AT $F0 |
|
|
|
JR C,HB_DISPERR ; ERROR IF LESS THAN BF_SYS |
|
|
|
; GAP TO E0 |
|
|
|
CP BF_EXT ; SKIP TO BF_EXT VALUE AT $E0 |
|
|
|
JR C,HB_DISPERR ; ERROR IF LESS THAN BF_EXT |
|
|
|
CP BF_EXT + $10 ; $E0-$EF: EXTENDED |
|
|
|
JP C,EXT_DISPATCH |
|
|
|
JP SYS_DISPATCH ; OTHERWISE SYS CALL |
|
|
|
; FALL THRU |
|
|
|
; |
|
|
|
@ -4724,6 +4727,19 @@ SND_BEEP_DISP: |
|
|
|
RET |
|
|
|
; |
|
|
|
;-------------------------------------------------------------------------------------------------- |
|
|
|
; EXTENDED FUNCTION DISPATCHER |
|
|
|
;-------------------------------------------------------------------------------------------------- |
|
|
|
; |
|
|
|
; B: FUNCTION |
|
|
|
; |
|
|
|
EXT_DISPATCH: |
|
|
|
LD A,B ; GET REQUESTED FUNCTION |
|
|
|
AND $0F ; ISOLATE SUB-FUNCTION |
|
|
|
JP Z,EXT_SLICE ; $E0 |
|
|
|
DEC A |
|
|
|
JP HB_DISPERR ; ERROR COULD NOT FIND FUNCTION |
|
|
|
; |
|
|
|
;-------------------------------------------------------------------------------------------------- |
|
|
|
; SYSTEM FUNCTION DISPATCHER |
|
|
|
;-------------------------------------------------------------------------------------------------- |
|
|
|
; |
|
|
|
@ -4758,6 +4774,7 @@ SYS_DISPATCH: |
|
|
|
DEC A |
|
|
|
JP Z,SYS_INT ; $FC |
|
|
|
DEC A |
|
|
|
JP HB_DISPERR ; ERROR COULD NOT FIND FUNCTION |
|
|
|
; |
|
|
|
HB_DISP_END .EQU $ |
|
|
|
; |
|
|
|
@ -4860,6 +4877,290 @@ Z280_IVT: |
|
|
|
HB_Z280IVT_END .EQU $ |
|
|
|
; |
|
|
|
;================================================================================================== |
|
|
|
; EXTENSION API FUNCTIONS |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
HB_EXTAPI_BEG .EQU $ |
|
|
|
; |
|
|
|
;-------------------------------------------------------------------------------------------------- |
|
|
|
; SLICE CALCULATE - GET DISK EXTENDED HARD DISK MEDIA INFORMATION |
|
|
|
;-------------------------------------------------------------------------------------------------- |
|
|
|
; This function is specificly intended for Hard Drives, where it will scan |
|
|
|
; the partition table and return a Media ID, including hd1k (MID_HDNEW). |
|
|
|
; It will also return the absolute LBA offset of the first sector in the slice |
|
|
|
; If the slice number is invalid (wont fit) the Status will return an error |
|
|
|
; If the Unit is not a hard disk the Media ID will be returned and slice ignored. |
|
|
|
;-------------------------------------------------------------------------------------------------- |
|
|
|
; ENTRY: |
|
|
|
; B: FUNCTION 0xE0 EXT_SLICE |
|
|
|
; D: DISK UNIT, preferably for a hard disk. |
|
|
|
; E: SLICE, ignored if media is not a hard disk |
|
|
|
; RETURNS: |
|
|
|
; A: STATUS, -6 (parameter out of range) - if Slice is invalid |
|
|
|
; Other errors Include ERR_NOUNIT, ERR_NOMEDIA, |
|
|
|
; If any error is raised the other return values are undefined |
|
|
|
; B: DEVICE ATTRIBUTES, as reported by DIODEVICE |
|
|
|
; C: MEDIAID, including MID_HDNEW if hd1k partition is found |
|
|
|
; DEHL: LBAOFFSET, of Slice if valid, 0 otherwise. |
|
|
|
;-------------------------------------------------------------------------------------------------- |
|
|
|
; |
|
|
|
SLICE_SLICE .DB 0 ; SLICE ARGUMENT (E) |
|
|
|
SLICE_UNIT .DB 0 ; UNIT ARGUMENT (D) |
|
|
|
SLICE_DEVATT .DB 0 ; DEVICE ATTRIBUTES |
|
|
|
SLICE_MID .DB 0 ; DISCOVERED MEDIAID |
|
|
|
; |
|
|
|
SLICE_WRKSTA .EQU $ |
|
|
|
SLICE_LBAOFF .FILL 4,0 ; START OF PARTITION / SLICE (SECTORS) |
|
|
|
SLICE_LBASIZ .FILL 4,0 ; SIZE OF MEDIA / PARTITION (SECTORS) |
|
|
|
SLICE_SPS .DW 0 ; DISCOVERED SECTORS PER SLICE (16BIT) |
|
|
|
SLICE_FND .DB 0 ; DID WE FIND A NON CPM PARTITION |
|
|
|
SLICE_WRKSIZ .EQU $ - SLICE_WRKSTA ; SIZE OF WORKING DATA |
|
|
|
; |
|
|
|
EXT_SLICE: |
|
|
|
; SAVE CALL ARGUMENTS |
|
|
|
LD (SLICE_SLICE),DE ; STORES DE -> SLICE/UNIT PARAMETERS |
|
|
|
|
|
|
|
; READ DEVICE INFORMATION USING DIODEVICE FUNCTION |
|
|
|
LD A,(SLICE_UNIT) |
|
|
|
LD C,A ; UNIT ID PARAMETER INTO C |
|
|
|
LD B,BF_DIODEVICE ; DRIVER FUNCTION = DISK MEDIA |
|
|
|
CALL DIO_DISPATCH ; CALL DIO TO GET DEVICE ATTRIBUTES |
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
; |
|
|
|
; DEVICE ATTRIBUTES IN C |
|
|
|
LD A,C |
|
|
|
LD (SLICE_DEVATT),A ; STORE DEVICE ATTRIBUTES |
|
|
|
; |
|
|
|
; DETERMINE MEDIA IN DRIVE USING DIOMEDIA FUNCTION |
|
|
|
LD A,(SLICE_UNIT) |
|
|
|
LD C,A ; UNIT ID PARAMETER INTO C |
|
|
|
LD E,1 ; ENABLE MEDIA CHECK/DISCOVERY |
|
|
|
LD B,BF_DIOMEDIA ; DRIVER FUNCTION = DISK MEDIA |
|
|
|
CALL DIO_DISPATCH ; CALL DIO TO GET MEDIAID (RESULT IN E) |
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
; |
|
|
|
; CHECK MEDIA TYPE, ONLY HD IS APPLICABLE |
|
|
|
LD A,E ; RESULTANT MEDIA ID TO ACCUM |
|
|
|
LD (SLICE_MID),A ; INIT VALUE, MAY BE USED LATER |
|
|
|
OR A ; SET FLAGS |
|
|
|
JR Z, EXT_SLICE1A ; BAIL IF NO MEDIA |
|
|
|
CP MID_HD ; IS IT A HARD DISK |
|
|
|
JR Z, EXT_SLICE1B ; IS HD, CONTINUE TO PROCESS HD |
|
|
|
; |
|
|
|
; NOT A HARD DISK, CHECK SLICE = 0 |
|
|
|
LD A,(SLICE_SLICE) ; GET THE SLICE |
|
|
|
OR A ; SET FLAGS |
|
|
|
JP NZ, EXT_SLICE5C ; SLICE NOT ZERO - SIGNAL ERROR AND RETURN |
|
|
|
; |
|
|
|
EXT_SLICE1A: |
|
|
|
; RETURN MEDIA ID (NOT HD) WITH SUCCESS |
|
|
|
LD DE,0 ; LBA VALUE WILL BE ZERO |
|
|
|
LD HL,0 |
|
|
|
JP EXT_SLICE6A ; RETURN SUCCESS |
|
|
|
; |
|
|
|
EXT_SLICE1B: |
|
|
|
; FOUND HD, NEED TO PROCESS MBR / PART TABLE |
|
|
|
; CLEAR WORKING STORAGE |
|
|
|
LD HL,SLICE_WRKSTA ; HL SET TO FIRST BYTE |
|
|
|
LD (HL),0 ; CLEAR FIRST BYTE |
|
|
|
LD D,H |
|
|
|
LD E,L |
|
|
|
INC DE ; DE SET TO SECOND BYTE |
|
|
|
LD BC,SLICE_WRKSIZ - 1 ; NUMBER OF LDIR COPIES |
|
|
|
LDIR ; BLOCK COPY TO CLEAR WORKING STORAGE |
|
|
|
; |
|
|
|
; SEEK TO SECTOR ZERO (MBR TABLE) |
|
|
|
LD B,BF_DIOSEEK ; SEEK FUNCTION |
|
|
|
LD A,(SLICE_UNIT) ; GET UNIT |
|
|
|
LD C,A ; PUT IN C |
|
|
|
LD DE,$8000 ; LBA SECTOR ZERO |
|
|
|
LD HL,0 ; ASSUME LBA ACCESS FOR NOW |
|
|
|
CALL DIO_DISPATCH ; DO IT |
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
; |
|
|
|
; READ SECTOR ZERO (MBR TABLE) |
|
|
|
LD B,BF_DIOREAD ; READ FUNCTION |
|
|
|
LD A,(SLICE_UNIT) ; GET UNIT |
|
|
|
LD C,A ; PUT IN C |
|
|
|
LD A,(HB_CURBNK) ; GET CURRENT BANK ID |
|
|
|
LD D,A ; PUT IN D |
|
|
|
LD E,1 ; SECTOR COUNT |
|
|
|
LD HL,HB_WRKBUF ; IO BUFFER TO USE |
|
|
|
CALL DIO_DISPATCH ; DO IT |
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
; |
|
|
|
; CHECK MBR OF DISK TO SEE IF IT HAS A PARTITION TABLE. |
|
|
|
LD HL,HB_WRKBUF ; DSKBUF ADR |
|
|
|
LD DE,$1FE ; OFFSET TO SIGNATURE |
|
|
|
ADD HL,DE ; POINT TO SIGNATURE |
|
|
|
LD A,(HL) ; GET FIRST BYTE |
|
|
|
CP $55 ; CHECK FIRST BYTE |
|
|
|
JR NZ,EXT_SLICE3C ; NO MATCH, NO PART TABLE |
|
|
|
INC HL ; NEXT BYTE |
|
|
|
LD A,(HL) ; GET SECOND BYTE |
|
|
|
CP $AA ; CHECK SECOND BYTE |
|
|
|
JR NZ,EXT_SLICE3C ; NO MATCH, NO PART TABLE |
|
|
|
; |
|
|
|
; FOUND PARTITION TABLE - LOOP AND PROCESS PARTITION TABLE |
|
|
|
LD HL,HB_WRKBUF ; DSKBUF ADR |
|
|
|
LD DE,$1BE+4 ; OFFSET OF FIRST ENTRY PART TYPE |
|
|
|
ADD HL,DE ; POINT TO IT |
|
|
|
LD B,4 ; FOUR ENTRIES IN PART TABLE LOOP |
|
|
|
EXT_SLICE2A: |
|
|
|
LD A,(HL) ; GET PART TYPE |
|
|
|
LD DE,4 |
|
|
|
ADD HL,DE ; MOVE HL FWD TO GET TO LBA OFFSET |
|
|
|
CP $2E ; CP/M PARTITION? |
|
|
|
JR Z,EXT_SLICE3B ; HD1K, GRAB THE LBA OFFSET |
|
|
|
CP $00 ; IS ANOTHER PARTITION TYPE, NOT CPM |
|
|
|
JR NZ,EXT_SLICE3A ; OTHER VALID PART TYPE |
|
|
|
EXT_SLICE2B: |
|
|
|
LD DE,12 ; REMAINING SIZE TO GET TO NEXT PARTITION |
|
|
|
EXT_SLICE2C: |
|
|
|
ADD HL,DE ; BUMP TO NEXT PARTITION ENTRY - TYPE |
|
|
|
DJNZ EXT_SLICE2A ; LOOP THRU TABLE |
|
|
|
JR EXT_SLICE3C ; READ ALL - NO CP/M PARTITION FOUND |
|
|
|
; |
|
|
|
EXT_SLICE3A |
|
|
|
; FOUND OTHER (NOT CPM) PARTITION |
|
|
|
LD A,(SLICE_FND) ; HAVE WE ALREADY FOUND PROCESSED NON CPM |
|
|
|
OR A ; PARTITION, AND CAPTURED ITS START SECTOR, SO |
|
|
|
JR NZ,EXT_SLICE2B ; IGNORE AND CONTINUTE TO NEXT PARTITION ENTRY |
|
|
|
; |
|
|
|
; NOTE THERE SLIGHT ISSUE HERE THAT WE ONLY CONSIDER THE FIRST NON-CPM PARTITION |
|
|
|
; TO GET THE UPPER SIZE OF MEDIA, IDEALLY WE WOULD CONSIDER ALL, AND TAKE THE LOWEWST |
|
|
|
; STARTING SECTOR - THIS IS A COMPRIMISE - OUT OF SEQUENCE PARTITIONS ARE UNLIKELY. |
|
|
|
; |
|
|
|
PUSH BC ; SAVE IT, BEING USED IN PARTITION LOOP |
|
|
|
LD BC, 4 ; IF NOT ALREADY SET - COPY 4 BYTES |
|
|
|
LD DE, SLICE_LBASIZ ; FROM PARTION LBA OFFSET (HL) - TO WORKING LBA SIZE (DE) |
|
|
|
LDIR ; COPY 4 BYTES |
|
|
|
POP BC ; RESTORE |
|
|
|
; |
|
|
|
LD A,$FF |
|
|
|
LD (SLICE_FND),A ; SET FOUND FLAG, SO DONT PROCESS ANY OTHERS |
|
|
|
LD DE,8 ; AND INC HL BY 8 TO GET TO NEXT PARITION |
|
|
|
JR EXT_SLICE2C ; CONTINUE TO NEXT PARTITION |
|
|
|
; |
|
|
|
EXT_SLICE3B: |
|
|
|
; FOUND CP/M (HD1K) PARTITION - RECORD THIS |
|
|
|
LD A, MID_HDNEW ; DISCOVERED HD1K MEDIA |
|
|
|
LD (SLICE_MID), A ; STORE IT |
|
|
|
LD BC, SPS_HD1K ; DISCOVERED HD1K MEDIA |
|
|
|
LD (SLICE_SPS), BC ; STORE IT |
|
|
|
; |
|
|
|
; CAPTURE THE LBA OFFSET AND SECTOR COUNT FROM PARTITION |
|
|
|
; HL POINTS TO PART LBA OFFSET FIELD OF PART ENTRY |
|
|
|
LD DE,SLICE_LBAOFF ; LOC TO STORE OFFSET AND SIZE |
|
|
|
LD BC,8 ; 8 BYTES - LBA OFFSET AND SIZE |
|
|
|
LDIR ; COPY IT |
|
|
|
; |
|
|
|
JR EXT_SLICE4A ; CONTINUE AND COMPUTE THE SLICE |
|
|
|
; |
|
|
|
EXT_SLICE3C: |
|
|
|
; NO PARTITION TABLE FOUND / NO CPM PARTITION FOUND -> HD512 |
|
|
|
LD BC, SPS_HD512 ; WITH HD512 SECTORS PER SLICE |
|
|
|
LD (SLICE_SPS), BC ; STORE IT |
|
|
|
|
|
|
|
; DID WE FIND AN OTHER (NOT CPM) PARTITION |
|
|
|
LD A,(SLICE_FND) ; HAVE WE ALREADY FOUND PROCESSED NON CPM |
|
|
|
OR A ; PARTITION, AND CAPTURED ITS START SECTOR, SO |
|
|
|
JR NZ,EXT_SLICE4A ; MEDIA SIZE IS KNOWN BASED ON START OF PARTITION |
|
|
|
|
|
|
|
; FIND THE PHYSICAL CAPCITY OF THE MEDIA CALL (DIOCAP) |
|
|
|
LD B, BF_DIOCAP ; HBIOS FUNC: TO GET DISK LBA CAPACITY |
|
|
|
LD A, (SLICE_UNIT) |
|
|
|
LD C, A ; PUT DISK UNIT IN C FOR FUNC CALL |
|
|
|
CALL DIO_DISPATCH ; DO IT - RETURNS SIZE in DE:HL |
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
|
|
|
|
; UPDATE LBA SIZE FROM MEDIA SIZE |
|
|
|
LD (SLICE_LBASIZ), HL ; LOWER ORDER BYTES - HL |
|
|
|
EX DE,HL |
|
|
|
LD (SLICE_LBASIZ+2), HL ; HIGHER ORDER BYTES - DE |
|
|
|
; |
|
|
|
EXT_SLICE4A: |
|
|
|
; COMPUTE THE START SECTOR (RELATIVE) FOR SLICE -> DE:HL |
|
|
|
LD HL,0 ; STARTING SECTOR NUMBER |
|
|
|
LD DE,0 ; ASSUMING A 0 OFFSET, SO CAN COMPARE TO SIZE |
|
|
|
LD BC,(SLICE_SPS) |
|
|
|
LD A,(SLICE_SLICE) |
|
|
|
OR A ; SLICE NUMBER - SET FLAGS TO CHECK LOOP CTR |
|
|
|
JR Z,EXT_SLICE5A ; NOTHING TO COUNT |
|
|
|
EXT_SLICE4B: |
|
|
|
ADD HL,BC ; ADD ONE SLICE (SPS) TO LOW WORD |
|
|
|
JR NC,EXT_SLICE4C ; CHECK FOR CARRY |
|
|
|
INC DE ; IF SO, BUMP HIGH WORD |
|
|
|
EXT_SLICE4C: |
|
|
|
DEC A ; DEC LOOP (SLICE) COUNTER |
|
|
|
JR NZ,EXT_SLICE4B ; AND LOOP |
|
|
|
; |
|
|
|
EXT_SLICE5A: |
|
|
|
; DE:HL NOW CONTAINS THE STARTING SECTOR FOR SLICE |
|
|
|
PUSH HL ; SAVE THE SECTOR OFFSET (SPS * SLICE NUMBER) |
|
|
|
PUSH DE |
|
|
|
; |
|
|
|
ADD HL, BC ; ADD SPS, GET REQUIRED CAPCITY (UPPER SECTOR) |
|
|
|
JR NC, EXT_SLICE5B |
|
|
|
INC DE |
|
|
|
EXT_SLICE5B: |
|
|
|
; DEHL HAS THE REQUIRED NUMBER OF SECTORS (ON MEDIA) FOR THE SLICE |
|
|
|
PUSH DE ; SAVE DSK_REQ (MSW) |
|
|
|
PUSH HL ; SAVE DSK_REQ (LSW) |
|
|
|
; |
|
|
|
; CHECK DSK_CAPACITY >= CAP_REQUIRED, CF SET ON OVERFLOW |
|
|
|
; NO NEED SAVE ACTUAL RESULT |
|
|
|
OR A ; CLEAR CARRY FOR SBC |
|
|
|
LD HL,(SLICE_LBASIZ+0) ; CAPACITY LSW |
|
|
|
POP DE ; REQUIRED LSW |
|
|
|
SBC HL,DE ; CAPACITY - REQUIRED (LSW) |
|
|
|
LD HL,(SLICE_LBASIZ+2) ; CAPAITY MSW |
|
|
|
POP DE ; REQUIRED MSW |
|
|
|
SBC HL,DE ; CAPACITY - REQUIRED (MSW) |
|
|
|
; |
|
|
|
; POP STARTING OFSETT SECTOR |
|
|
|
POP DE |
|
|
|
POP HL |
|
|
|
; |
|
|
|
; REQUIRE - CAPACITY -> GENERATES BORROW IF CAPITY > REQUIREMENT |
|
|
|
JR NC,EXT_SLICE6 ; IF WE HAVE ENOUGH CAPACITY |
|
|
|
; |
|
|
|
EXT_SLICE5C: |
|
|
|
; SLICE WONT FIT - STOP AND RETURN ERROR |
|
|
|
LD DE,0 |
|
|
|
LD HL,0 ; EMTY OFFSET IN DEHL |
|
|
|
LD A,(SLICE_DEVATT) |
|
|
|
LD B,A ; DEVICE ATTRIBUTES IN B |
|
|
|
LD A,(SLICE_MID) |
|
|
|
LD C,A ; RETURN MEDIA ID IN C |
|
|
|
LD A,ERR_RANGE ; OTHERWISE SIGNAL NOT ENOUGH CAPACITY |
|
|
|
OR A |
|
|
|
RET |
|
|
|
; |
|
|
|
EXT_SLICE6: |
|
|
|
; FINAL CALC AND RETURN SUCCESS |
|
|
|
; ADD PARTITION OFFSET (START) TO DEHL TO GET ABSOLUTE SLICE OFFSET |
|
|
|
LD BC,(SLICE_LBAOFF+0) ; LSB OF LBA OFFSET |
|
|
|
ADD HL,BC ; ADD LSB OFFSET |
|
|
|
EX DE,HL ; FLIP DE INTO HL |
|
|
|
LD BC,(SLICE_LBAOFF+2) ; MSB OF LBA OFFSET |
|
|
|
ADC HL,BC ; ADD MSB |
|
|
|
EX DE, HL ; FLIP BACK DE:HL AS SLICE OFFSET |
|
|
|
; |
|
|
|
EXT_SLICE6A: |
|
|
|
; SLICE FITS - RETURN CORRECTLY |
|
|
|
LD A,(SLICE_DEVATT) |
|
|
|
LD B,A ; DEVICE ATTRIBUTES IN B |
|
|
|
LD A,(SLICE_MID) |
|
|
|
LD C,A ; RETURN MEDIA ID IN C |
|
|
|
XOR A ; CLEAR FLAGS |
|
|
|
RET ; RETUNING DE:HL AND C |
|
|
|
; |
|
|
|
;-------------------------------------------------------------------------------------------------- |
|
|
|
; |
|
|
|
HB_EXTAPI_END .EQU $ |
|
|
|
; |
|
|
|
;================================================================================================== |
|
|
|
; SYSTEM API FUNCTIONS |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
@ -5146,8 +5447,11 @@ SYS_GET: |
|
|
|
JP Z,SYS_GETDIOCNT |
|
|
|
CP BF_SYSGET_DIOFN |
|
|
|
JP Z,SYS_GETDIOFN |
|
|
|
CP BF_SYSGET_DIOMED |
|
|
|
JP Z,SYS_GETDIOMED |
|
|
|
CP $12 ; LEFT FOR BACKWRD COMPATABILITY |
|
|
|
JP Z,EXT_SLICE ; FUNCTION MOVED TO TOP LEVEL $E0 |
|
|
|
; REMOVING THE ABOVE CAUSED UPGRADE ISSUES FOR EARLY ADOPTERS |
|
|
|
; SINCE OS BOOT LOADERS DEPEND ON IT. WITHOUT CAN LEAVE OS |
|
|
|
; UNBOOTABLE AND MIGRATION HARDER - Oct 2024 |
|
|
|
CP BF_SYSGET_RTCCNT |
|
|
|
JP Z,SYS_GETRTCCNT |
|
|
|
CP BF_SYSGET_DSKYCNT |
|
|
|
@ -5229,278 +5533,6 @@ SYS_GETDIOFN: |
|
|
|
LD IY,DIO_TBL ; POINT TO UNIT TABLE |
|
|
|
JP SYS_GETFN ; GO TO COMMON CODE |
|
|
|
; |
|
|
|
; GET DISK EXTENDED HARD DISK MEDIA INFORMATION |
|
|
|
; This function is specificly intended for Hard Drives, where it will scan |
|
|
|
; the partition table and return a Media ID, including hd1k (MID_HDNEW). |
|
|
|
; It will also return the absolute LBA offset of the first sector in the slice |
|
|
|
; If the slice number is invalid (wont fit) the Status will return an error |
|
|
|
; If the Unit is not a hard disk the Media ID will be returned and slice ignored. |
|
|
|
; |
|
|
|
; ENTRY: |
|
|
|
; B: FUNCTION 0xF8 SYSGET |
|
|
|
; C: SUB FUNCTION 0x12 DIOMED |
|
|
|
; D: DISK UNIT, preferably for a hard disk. |
|
|
|
; E: SLICE, ignored if media is not a hard disk |
|
|
|
; RETURNS: |
|
|
|
; A: STATUS, -6 (parameter out of range) - if Slice is invalid |
|
|
|
Other errors Include ERR_NOUNIT, ERR_NOMEDIA, |
|
|
|
If any error is raised the other return values are undefined |
|
|
|
; B: DEVICE ATTRIBUTES, as reported by DIODEVICE |
|
|
|
; C: MEDIAID, including MID_HDNEW if hd1k partition is found |
|
|
|
; DEHL: LBAOFFSET, of Slice if valid, 0 otherwise. |
|
|
|
; |
|
|
|
DIOMED_SLICE .DB 0 ; SLICE ARGUMENT (E) |
|
|
|
DIOMED_UNIT .DB 0 ; UNIT ARGUMENT (D) |
|
|
|
DIOMED_DEVATT .DB 0 ; DEVICE ATTRIBUTES |
|
|
|
DIOMED_MID .DB 0 ; DISCOVERED MEDIAID |
|
|
|
; |
|
|
|
DIOMED_WRKSTA .EQU $ |
|
|
|
DIOMED_LBAOFF .FILL 4,0 ; START OF PARTITION / SLICE (SECTORS) |
|
|
|
DIOMED_LBASIZ .FILL 4,0 ; SIZE OF MEDIA / PARTITION (SECTORS) |
|
|
|
DIOMED_SPS .DW 0 ; DISCOVERED SECTORS PER SLICE (16BIT) |
|
|
|
DIOMED_FND .DB 0 ; DID WE FIND A NON CPM PARTITION |
|
|
|
DIOMED_WRKSIZ .EQU $ - DIOMED_WRKSTA ; SIZE OF WORKING DATA |
|
|
|
; |
|
|
|
SYS_GETDIOMED: |
|
|
|
; SAVE CALL ARGUMENTS |
|
|
|
LD (DIOMED_SLICE),DE ; STORES DE -> SLICE/UNIT PARAMETERS |
|
|
|
|
|
|
|
; READ DEVICE INFORMATION USING DIODEVICE FUNCTION |
|
|
|
LD A,(DIOMED_UNIT) |
|
|
|
LD C,A ; UNIT ID PARAMETER INTO C |
|
|
|
LD B,BF_DIODEVICE ; DRIVER FUNCTION = DISK MEDIA |
|
|
|
CALL DIO_DISPATCH ; CALL DIO TO GET DEVICE ATTRIBUTES |
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
; |
|
|
|
; DEVICE ATTRIBUTES IN C |
|
|
|
LD A,C |
|
|
|
LD (DIOMED_DEVATT),A ; STORE DEVICE ATTRIBUTES |
|
|
|
; |
|
|
|
; DETERMINE MEDIA IN DRIVE USING DIOMEDIA FUNCTION |
|
|
|
LD A,(DIOMED_UNIT) |
|
|
|
LD C,A ; UNIT ID PARAMETER INTO C |
|
|
|
LD E,1 ; ENABLE MEDIA CHECK/DISCOVERY |
|
|
|
LD B,BF_DIOMEDIA ; DRIVER FUNCTION = DISK MEDIA |
|
|
|
CALL DIO_DISPATCH ; CALL DIO TO GET MEDIAID (RESULT IN E) |
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
; |
|
|
|
; CHECK MEDIA TYPE, ONLY HD IS APPLICABLE |
|
|
|
LD A,E ; RESULTANT MEDIA ID TO ACCUM |
|
|
|
LD (DIOMED_MID),A ; INIT VALUE, MAY BE USED LATER |
|
|
|
OR A ; SET FLAGS |
|
|
|
JR Z, SYS_GETDIOMED1A ; BAIL IF NO MEDIA |
|
|
|
CP MID_HD ; IS IT A HARD DISK |
|
|
|
JR Z, SYS_GETDIOMED1B ; IS HD, CONTINUE TO PROCESS HD |
|
|
|
; |
|
|
|
; NOT A HARD DISK, CHECK SLICE = 0 |
|
|
|
LD A,(DIOMED_SLICE) ; GET THE SLICE |
|
|
|
OR A ; SET FLAGS |
|
|
|
JP NZ, SYS_GETDIOMED5C ; SLICE NOT ZERO - SIGNAL ERROR AND RETURN |
|
|
|
; |
|
|
|
SYS_GETDIOMED1A: |
|
|
|
; RETURN MEDIA ID (NOT HD) WITH SUCCESS |
|
|
|
LD DE,0 ; LBA VALUE WILL BE ZERO |
|
|
|
LD HL,0 |
|
|
|
JP SYS_GETDIOMED6A ; RETURN SUCCESS |
|
|
|
; |
|
|
|
SYS_GETDIOMED1B: |
|
|
|
; FOUND HD, NEED TO PROCESS MBR / PART TABLE |
|
|
|
; CLEAR WORKING STORAGE |
|
|
|
LD HL,DIOMED_WRKSTA ; HL SET TO FIRST BYTE |
|
|
|
LD (HL),0 ; CLEAR FIRST BYTE |
|
|
|
LD D,H |
|
|
|
LD E,L |
|
|
|
INC DE ; DE SET TO SECOND BYTE |
|
|
|
LD BC,DIOMED_WRKSIZ - 1 ; NUMBER OF LDIR COPIES |
|
|
|
LDIR ; BLOCK COPY TO CLEAR WORKING STORAGE |
|
|
|
; |
|
|
|
; SEEK TO SECTOR ZERO (MBR TABLE) |
|
|
|
LD B,BF_DIOSEEK ; SEEK FUNCTION |
|
|
|
LD A,(DIOMED_UNIT) ; GET UNIT |
|
|
|
LD C,A ; PUT IN C |
|
|
|
LD DE,$8000 ; LBA SECTOR ZERO |
|
|
|
LD HL,0 ; ASSUME LBA ACCESS FOR NOW |
|
|
|
CALL DIO_DISPATCH ; DO IT |
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
; |
|
|
|
; READ SECTOR ZERO (MBR TABLE) |
|
|
|
LD B,BF_DIOREAD ; READ FUNCTION |
|
|
|
LD A,(DIOMED_UNIT) ; GET UNIT |
|
|
|
LD C,A ; PUT IN C |
|
|
|
LD A,(HB_CURBNK) ; GET CURRENT BANK ID |
|
|
|
LD D,A ; PUT IN D |
|
|
|
LD E,1 ; SECTOR COUNT |
|
|
|
LD HL,HB_WRKBUF ; IO BUFFER TO USE |
|
|
|
CALL DIO_DISPATCH ; DO IT |
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
; |
|
|
|
; CHECK MBR OF DISK TO SEE IF IT HAS A PARTITION TABLE. |
|
|
|
LD HL,HB_WRKBUF ; DSKBUF ADR |
|
|
|
LD DE,$1FE ; OFFSET TO SIGNATURE |
|
|
|
ADD HL,DE ; POINT TO SIGNATURE |
|
|
|
LD A,(HL) ; GET FIRST BYTE |
|
|
|
CP $55 ; CHECK FIRST BYTE |
|
|
|
JR NZ,SYS_GETDIOMED3C ; NO MATCH, NO PART TABLE |
|
|
|
INC HL ; NEXT BYTE |
|
|
|
LD A,(HL) ; GET SECOND BYTE |
|
|
|
CP $AA ; CHECK SECOND BYTE |
|
|
|
JR NZ,SYS_GETDIOMED3C ; NO MATCH, NO PART TABLE |
|
|
|
; |
|
|
|
; FOUND PARTITION TABLE - LOOP AND PROCESS PARTITION TABLE |
|
|
|
LD HL,HB_WRKBUF ; DSKBUF ADR |
|
|
|
LD DE,$1BE+4 ; OFFSET OF FIRST ENTRY PART TYPE |
|
|
|
ADD HL,DE ; POINT TO IT |
|
|
|
LD B,4 ; FOUR ENTRIES IN PART TABLE LOOP |
|
|
|
SYS_GETDIOMED2A: |
|
|
|
LD A,(HL) ; GET PART TYPE |
|
|
|
LD DE,4 |
|
|
|
ADD HL,DE ; MOVE HL FWD TO GET TO LBA OFFSET |
|
|
|
CP $2E ; CP/M PARTITION? |
|
|
|
JR Z,SYS_GETDIOMED3B ; HD1K, GRAB THE LBA OFFSET |
|
|
|
CP $00 ; IS ANOTHER PARTITION TYPE, NOT CPM |
|
|
|
JR NZ,SYS_GETDIOMED3A ; OTHER VALID PART TYPE |
|
|
|
SYS_GETDIOMED2B: |
|
|
|
LD DE,12 ; REMAINING SIZE TO GET TO NEXT PARTITION |
|
|
|
SYS_GETDIOMED2C: |
|
|
|
ADD HL,DE ; BUMP TO NEXT PARTITION ENTRY - TYPE |
|
|
|
DJNZ SYS_GETDIOMED2A ; LOOP THRU TABLE |
|
|
|
JR SYS_GETDIOMED3C ; READ ALL - NO CP/M PARTITION FOUND |
|
|
|
; |
|
|
|
SYS_GETDIOMED3A |
|
|
|
; FOUND OTHER (NOT CPM) PARTITION |
|
|
|
LD A,(DIOMED_FND) ; HAVE WE ALREADY FOUND PROCESSED NON CPM |
|
|
|
OR A ; PARTITION, AND CAPTURED ITS START SECTOR, SO |
|
|
|
JR NZ,SYS_GETDIOMED2B ; IGNORE AND CONTINUTE TO NEXT PARTITION ENTRY |
|
|
|
; |
|
|
|
; NOTE THERE SLIGHT ISSUE HERE THAT WE ONLY CONSIDER THE FIRST NON-CPM PARTITION |
|
|
|
; TO GET THE UPPER SIZE OF MEDIA, IDEALLY WE WOULD CONSIDER ALL, AND TAKE THE LOWEWST |
|
|
|
; STARTING SECTOR - THIS IS A COMPRIMISE - OUT OF SEQUENCE PARTITIONS ARE UNLIKELY. |
|
|
|
; |
|
|
|
PUSH BC ; SAVE IT, BEING USED IN PARTITION LOOP |
|
|
|
LD BC, 4 ; IF NOT ALREADY SET - COPY 4 BYTES |
|
|
|
LD DE, DIOMED_LBASIZ ; FROM PARTION LBA OFFSET (HL) - TO WORKING LBA SIZE (DE) |
|
|
|
LDIR ; COPY 4 BYTES |
|
|
|
POP BC ; RESTORE |
|
|
|
; |
|
|
|
LD A,$FF |
|
|
|
LD (DIOMED_FND),A ; SET FOUND FLAG, SO DONT PROCESS ANY OTHERS |
|
|
|
LD DE,8 ; AND INC HL BY 8 TO GET TO NEXT PARITION |
|
|
|
JR SYS_GETDIOMED2C ; CONTINUE TO NEXT PARTITION |
|
|
|
; |
|
|
|
SYS_GETDIOMED3B: |
|
|
|
; FOUND CP/M (HD1K) PARTITION - RECORD THIS |
|
|
|
LD A, MID_HDNEW ; DISCOVERED HD1K MEDIA |
|
|
|
LD (DIOMED_MID), A ; STORE IT |
|
|
|
LD BC, SPS_HD1K ; DISCOVERED HD1K MEDIA |
|
|
|
LD (DIOMED_SPS), BC ; STORE IT |
|
|
|
; |
|
|
|
; CAPTURE THE LBA OFFSET AND SECTOR COUNT FROM PARTITION |
|
|
|
; HL POINTS TO PART LBA OFFSET FIELD OF PART ENTRY |
|
|
|
LD DE,DIOMED_LBAOFF ; LOC TO STORE OFFSET AND SIZE |
|
|
|
LD BC,8 ; 8 BYTES - LBA OFFSET AND SIZE |
|
|
|
LDIR ; COPY IT |
|
|
|
; |
|
|
|
JR SYS_GETDIOMED4A ; CONTINUE AND COMPUTE THE SLICE |
|
|
|
; |
|
|
|
SYS_GETDIOMED3C: |
|
|
|
; NO PARTITION TABLE FOUND / NO CPM PARTITION FOUND -> HD512 |
|
|
|
LD BC, SPS_HD512 ; WITH HD512 SECTORS PER SLICE |
|
|
|
LD (DIOMED_SPS), BC ; STORE IT |
|
|
|
|
|
|
|
; DID WE FIND AN OTHER (NOT CPM) PARTITION |
|
|
|
LD A,(DIOMED_FND) ; HAVE WE ALREADY FOUND PROCESSED NON CPM |
|
|
|
OR A ; PARTITION, AND CAPTURED ITS START SECTOR, SO |
|
|
|
JR NZ,SYS_GETDIOMED4A ; MEDIA SIZE IS KNOWN BASED ON START OF PARTITION |
|
|
|
|
|
|
|
; FIND THE PHYSICAL CAPCITY OF THE MEDIA CALL (DIOCAP) |
|
|
|
LD B, BF_DIOCAP ; HBIOS FUNC: TO GET DISK LBA CAPACITY |
|
|
|
LD A, (DIOMED_UNIT) |
|
|
|
LD C, A ; PUT DISK UNIT IN C FOR FUNC CALL |
|
|
|
CALL DIO_DISPATCH ; DO IT - RETURNS SIZE in DE:HL |
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
|
|
|
|
; UPDATE LBA SIZE FROM MEDIA SIZE |
|
|
|
LD (DIOMED_LBASIZ), HL ; LOWER ORDER BYTES - HL |
|
|
|
EX DE,HL |
|
|
|
LD (DIOMED_LBASIZ+2), HL ; HIGHER ORDER BYTES - DE |
|
|
|
; |
|
|
|
SYS_GETDIOMED4A: |
|
|
|
; COMPUTE THE START SECTOR (RELATIVE) FOR SLICE -> DE:HL |
|
|
|
LD HL,0 ; STARTING SECTOR NUMBER |
|
|
|
LD DE,0 ; ASSUMING A 0 OFFSET, SO CAN COMPARE TO SIZE |
|
|
|
LD BC,(DIOMED_SPS) ; |
|
|
|
LD A,(DIOMED_SLICE) |
|
|
|
OR A ; SLICE NUMBER - SET FLAGS TO CHECK LOOP CTR |
|
|
|
JR Z,SYS_GETDIOMED5A ; NOTHING TO COUNT |
|
|
|
SYS_GETDIOMED4B: |
|
|
|
ADD HL,BC ; ADD ONE SLICE (SPS) TO LOW WORD |
|
|
|
JR NC,SYS_GETDIOMED4C ; CHECK FOR CARRY |
|
|
|
INC DE ; IF SO, BUMP HIGH WORD |
|
|
|
SYS_GETDIOMED4C: |
|
|
|
DEC A ; DEC LOOP (SLICE) COUNTER |
|
|
|
JR NZ,SYS_GETDIOMED4B ; AND LOOP |
|
|
|
; |
|
|
|
SYS_GETDIOMED5A: |
|
|
|
; DE:HL NOW CONTAINS THE STARTING SECTOR FOR SLICE |
|
|
|
PUSH HL ; SAVE THE SECTOR OFFSET (SPS * SLICE NUMBER) |
|
|
|
PUSH DE |
|
|
|
; |
|
|
|
ADD HL, BC ; ADD SPS, GET REQUIRED CAPCITY (UPPER SECTOR) |
|
|
|
JR NC, SYS_GETDIOMED5B |
|
|
|
INC DE |
|
|
|
SYS_GETDIOMED5B: |
|
|
|
; DEHL HAS THE REQUIRED NUMBER OF SECTORS (ON MEDIA) FOR THE SLICE |
|
|
|
PUSH DE ; SAVE DSK_REQ (MSW) |
|
|
|
PUSH HL ; SAVE DSK_REQ (LSW) |
|
|
|
; |
|
|
|
; CHECK DSK_CAPACITY >= CAP_REQUIRED, CF SET ON OVERFLOW |
|
|
|
; NO NEED SAVE ACTUAL RESULT |
|
|
|
OR A ; CLEAR CARRY FOR SBC |
|
|
|
LD HL,(DIOMED_LBASIZ+0) ; CAPACITY LSW |
|
|
|
POP DE ; REQUIRED LSW |
|
|
|
SBC HL,DE ; CAPACITY - REQUIRED (LSW) |
|
|
|
LD HL,(DIOMED_LBASIZ+2) ; CAPAITY MSW |
|
|
|
POP DE ; REQUIRED MSW |
|
|
|
SBC HL,DE ; CAPACITY - REQUIRED (MSW) |
|
|
|
; |
|
|
|
; POP STARTING OFSETT SECTOR |
|
|
|
POP DE |
|
|
|
POP HL |
|
|
|
; |
|
|
|
; REQUIRE - CAPACITY -> GENERATES BORROW IF CAPITY > REQUIREMENT |
|
|
|
JR NC,SYS_GETDIOMED6 ; IF WE HAVE ENOUGH CAPACITY |
|
|
|
; |
|
|
|
SYS_GETDIOMED5C: |
|
|
|
; SLICE WONT FIT - STOP AND RETURN ERROR |
|
|
|
LD DE,0 |
|
|
|
LD HL,0 ; EMTY OFFSET IN DEHL |
|
|
|
LD A,(DIOMED_DEVATT) |
|
|
|
LD B,A ; DEVICE ATTRIBUTES IN B |
|
|
|
LD A,(DIOMED_MID) |
|
|
|
LD C,A ; RETURN MEDIA ID IN C |
|
|
|
LD A,ERR_RANGE ; OTHERWISE SIGNAL NOT ENOUGH CAPACITY |
|
|
|
OR A |
|
|
|
RET |
|
|
|
; |
|
|
|
SYS_GETDIOMED6: |
|
|
|
; FINAL CALC AND RETURN SUCCESS |
|
|
|
; ADD PARTITION OFFSET (START) TO DEHL TO GET ABSOLUTE SLICE OFFSET |
|
|
|
LD BC,(DIOMED_LBAOFF+0) ; LSB OF LBA OFFSET |
|
|
|
ADD HL,BC ; ADD LSB OFFSET |
|
|
|
EX DE,HL ; FLIP DE INTO HL |
|
|
|
LD BC,(DIOMED_LBAOFF+2) ; MSB OF LBA OFFSET |
|
|
|
ADC HL,BC ; ADD MSB |
|
|
|
EX DE, HL ; FLIP BACK DE:HL AS SLICE OFFSET |
|
|
|
; |
|
|
|
SYS_GETDIOMED6A: |
|
|
|
; SLICE FITS - RETURN CORRECTLY |
|
|
|
LD A,(DIOMED_DEVATT) |
|
|
|
LD B,A ; DEVICE ATTRIBUTES IN B |
|
|
|
LD A,(DIOMED_MID) |
|
|
|
LD C,A ; RETURN MEDIA ID IN C |
|
|
|
XOR A ; CLEAR FLAGS |
|
|
|
RET ; RETUNING DE:HL AND C |
|
|
|
; |
|
|
|
; GET RTC UNIT COUNT |
|
|
|
; |
|
|
|
SYS_GETRTCCNT: |
|
|
|
@ -9323,6 +9355,7 @@ SLACK .EQU BNKTOP - $ |
|
|
|
.ECHO "SYSINIT \t" \ .ECHO HB_SYSINIT_BEG \ .ECHO "\t" \ .ECHO HB_SYSINIT_END - HB_SYSINIT_BEG \ .ECHO "\n" |
|
|
|
.ECHO "DISP \t" \ .ECHO HB_DISP_BEG \ .ECHO "\t" \ .ECHO HB_DISP_END - HB_DISP_BEG \ .ECHO "\n" |
|
|
|
.ECHO "Z280IVT \t" \ .ECHO HB_Z280IVT_BEG \ .ECHO "\t" \ .ECHO HB_Z280IVT_END - HB_Z280IVT_BEG \ .ECHO "\n" |
|
|
|
.ECHO "EXTAPI \t" \ .ECHO HB_EXTAPI_BEG \ .ECHO "\t" \ .ECHO HB_EXTAPI_END - HB_EXTAPI_BEG \ .ECHO "\n" |
|
|
|
.ECHO "SYSAPI \t" \ .ECHO HB_SYSAPI_BEG \ .ECHO "\t" \ .ECHO HB_SYSAPI_END - HB_SYSAPI_BEG \ .ECHO "\n" |
|
|
|
.ECHO "INTFUNC \t" \ .ECHO HB_INTFUNC_BEG \ .ECHO "\t" \ .ECHO HB_INTFUNC_END - HB_INTFUNC_BEG \ .ECHO "\n" |
|
|
|
.ECHO "UTIL \t" \ .ECHO HB_UTIL_BEG \ .ECHO "\t" \ .ECHO HB_UTIL_END - HB_UTIL_BEG \ .ECHO "\n" |
|
|
|
|