Browse Source

Added new HBIOS Function SYSGET_DIOMED

master
Mark Pruden 1 year ago
parent
commit
497e5333c4
  1. 1
      Doc/ChangeLog.txt
  2. BIN
      Doc/RomWBW Applications.pdf
  3. BIN
      Doc/RomWBW Disk Catalog.pdf
  4. BIN
      Doc/RomWBW Errata.pdf
  5. BIN
      Doc/RomWBW System Guide.pdf
  6. BIN
      Doc/RomWBW User Guide.pdf
  7. 2
      ReadMe.md
  8. 3
      ReadMe.txt
  9. 38
      Source/Doc/SystemGuide.md
  10. 252
      Source/HBIOS/hbios.asm
  11. 6
      Source/HBIOS/hbios.inc
  12. 2
      Source/ver.inc
  13. 2
      Source/ver.lib

1
Doc/ChangeLog.txt

@ -39,6 +39,7 @@ Version 3.5
- WBW: Add Warm/Cold reboot options to CPUSPD utility
- D?N: Added support for eZ80 CPU
- MAP: Contributed COPYSL utility
- MAP: Added new HBIOS function SYSGET_DIOMED
Version 3.4
-----------

BIN
Doc/RomWBW Applications.pdf

Binary file not shown.

BIN
Doc/RomWBW Disk Catalog.pdf

Binary file not shown.

BIN
Doc/RomWBW Errata.pdf

Binary file not shown.

BIN
Doc/RomWBW System Guide.pdf

Binary file not shown.

BIN
Doc/RomWBW User Guide.pdf

Binary file not shown.

2
ReadMe.md

@ -3,7 +3,7 @@
**RomWBW ReadMe** \
Version 3.5 \
Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \
27 Sep 2024
05 Oct 2024
# Overview

3
ReadMe.txt

@ -1,6 +1,6 @@
RomWBW ReadMe
Wayne Warthen (wwarthen@gmail.com)
27 Sep 2024
05 Oct 2024
@ -114,7 +114,6 @@ functionality.
Complete instructions for installation and operation of RomWBW are found
in the RomWBW User Guide.
Documentation
Documentation for RomWBW includes:

38
Source/Doc/SystemGuide.md

@ -1076,8 +1076,10 @@ there is no media in device, function will return an error status.
**NOTE**: This function will always return MID_HD512 for hard disk
devices. MID_HD1K is provided for use internally by operating systems
that provide different filsystem formats depending on the partition
table. This function cannot be used to determine if an HD1K formatted
partition exists on the hard disk.
table. To determine if an HD1K formatted partition exists on the hard disk
please see the following function.
[SYSGET Subfunction 0x12 -- Get Extended Disk Media (DIOMED)]
### Function 0x19 -- Disk Define Media (DIODEFMED)
@ -2459,6 +2461,36 @@ the caller can use interbank calls directly to the function in the
driver which bypasses the overhead of the normal function invocation
lookup.
#### SYSGET Subfunction 0x12 -- Get Extended Disk Media (DIOMED)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|---------------------------------------|
| B: 0xF8 | A: Status |
| C: 0x12 | C: Media ID |
| D: Disk Unit | DEHL: Sector Address |
| E: Slice | |
Report the Media ID (C) for the for media in the specified Disk Unit (D),
and for hard disks the absolute Sector offset to the start of the Slice (E).
The Status (A) is a standard HBIOS result code.
This function extends upon [Function 0x18 -- Disk Media (DIOMEDIA)] for hard
disk media by scanning for a partition to determine if the disk uses HD512
or HD1K, correctly reporting MID_HD or MID_HDNEW respectively.
It will also return the sector number of the first sector in the
slice if the slice number is valid. If the slice number is invalid
(it wont fix on the media) an error will be returned.
The slice calculation is performed by considering the partition start
(if it exists), the size of a slice for the given format type, and ensuring
that the slice fits within the media or partition size, taking into
consideration other partitions that may exist.
If the Unit specified is not a hard disk the Media ID will be returned and
the slice parameter ignored. If there is no media in device, or the slice
number is invaid (Parameter Out Of Range) the function will return an error status.
#### SYSGET Subfunction 0x20 -- Get RTC Device Unit Count (RTCCNT)
| **Entry Parameters** | **Returned Values** |
@ -3211,7 +3243,7 @@ The following section outlines the read only data referenced by the
| CMDREG | 5 | 1 | IO PORT ADDRESS FOR MODE 1 |
| | | | _Below are the register mirror values_ |
| | | | _that HBIOS used for initialisation_ |
| REG. 0 | 6 | 1 | $00 - NO EXTERNAL VID
| REG. 0 | 6 | 1 | $00 - NO EXTERNAL VID |
| REG. 1 | 7 | 1 | $50 or $70 - SET MODE 1 and interrupt if enabled |
| REG. 2 | 8 | 1 | $00 - PATTERN NAME TABLE := 0 |
| REG. 3 | 9 | 1 | $00 - NO COLOR TABLE |

252
Source/HBIOS/hbios.asm

@ -5146,6 +5146,8 @@ SYS_GET:
JP Z,SYS_GETDIOCNT
CP BF_SYSGET_DIOFN
JP Z,SYS_GETDIOFN
CP BF_SYSGET_DIOMED
JP Z,SYS_GETDIOMED
CP BF_SYSGET_RTCCNT
JP Z,SYS_GETRTCCNT
CP BF_SYSGET_DSKYCNT
@ -5227,6 +5229,256 @@ 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
; 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_WRKSTA .EQU $
DIOMED_LBAOFF .FILL 4,0 ; START OF PARTITION / SLICE (SECTORS)
DIOMED_LBASIZ .FILL 4,0 ; SIZE OF MEDIA / PARTITION (SECTORS)
DIOMED_MID .DB 0 ; DISCOVERED MEDIAID
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
;
; 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
OR A ; SET FLAGS
JR Z, SYS_GETDIOMED1A ; BAIL IF NO MEDIA
CP MID_HD ; IS IT A HARD DISK
JR NZ, SYS_GETDIOMED1A ; BAIL IF NOT HARD DISK
JR SYS_GETDIOMED1B ; CONTINUE TO PROCESS HD
;
SYS_GETDIOMED1A:
; RETURN MEDIA ID (NOT HD) WITH SUCCESS
LD DE,0
LD HL,0
LD C,A ; RETURN MEDIA ID IN C
XOR A ; SIGNAL SUCCESS
RET ; NOT HD JUST RETURN
;
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 A, MID_HD ; HD512 MEDIA
LD (DIOMED_MID), A ; STORE IT
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
;
; SLICE WONT FIT - STOP AND RETURN ERROR
LD DE,0
LD HL,0 ; EMTY OFFSET IN DEHL
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
;
; SLICE FITS - RETURN CORRECTLY
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:

6
Source/HBIOS/hbios.inc

@ -109,6 +109,7 @@ BF_SYSGET_CIOCNT .EQU $00 ; GET CHAR UNIT COUNT
BF_SYSGET_CIOFN .EQU $01 ; GET CIO UNIT FN/DATA ADR
BF_SYSGET_DIOCNT .EQU $10 ; GET DISK UNIT COUNT
BF_SYSGET_DIOFN .EQU $11 ; GET DIO UNIT FN/DATA ADR
BF_SYSGET_DIOMED .EQU $12 ; GET DISK MEDIA EXTENDED INFO
BF_SYSGET_RTCCNT .EQU $20 ; GET RTC UNIT COUNT
BF_SYSGET_DSKYCNT .EQU $30 ; GET DSKY UNIT COUNT
BF_SYSGET_VDACNT .EQU $40 ; GET VDA UNIT COUNT
@ -311,6 +312,11 @@ MID_FD120 .EQU 8
MID_FD111 .EQU 9
MID_HDNEW .EQU 10
;
; SECTORS PER SLICE
;
SPS_HD512 .EQU $4100
SPS_HD1K .EQU $4000
;
; CHAR DEVICE IDS
;
CIODEV_UART .EQU $00

2
Source/ver.inc

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

2
Source/ver.lib

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

Loading…
Cancel
Save