|
|
|
|
@@ -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"
|
|
|
|
|
|