mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
Start of new geometry/capacity functions in HBIOS
This commit is contained in:
@@ -797,6 +797,9 @@ CIO_GETINF1:
|
||||
; ROUTE CALL TO SPECIFIED DISK I/O DRIVER
|
||||
; B: FUNCTION
|
||||
; C: DEVICE/UNIT
|
||||
; H:7: INDICATES LBA MODE
|
||||
; CHS MODE: DE:HL==TT:HS
|
||||
; LBA MODE: HL:DE==NN:NN (32 BIT ADDRESS)
|
||||
;
|
||||
DIO_DISPATCH:
|
||||
; GET THE REQUESTED FUNCTION TO SEE IF SPECIAL HANDLING
|
||||
@@ -813,8 +816,56 @@ DIO_DISPATCH:
|
||||
; ULTIMATELY, HSTTRK AND HSTSEC ARE TO BE REMOVED
|
||||
CP BF_DIOST ; BEYOND READ/WRITE FUNCTIONS ?
|
||||
JR NC,DIO_DISPATCH1 ; YES, BYPASS
|
||||
LD (HSTTRK),HL ; RECORD TRACK
|
||||
LD (HSTSEC),DE ; RECORD SECTOR
|
||||
LD (HSTSEC),HL ; RECORD HEAD/SECTOR (OR LBA HIGH)
|
||||
LD (HSTTRK),DE ; RECORD TRACK (OR LBA LOW)
|
||||
;
|
||||
; PUSH BC
|
||||
; CALL NEWLINE
|
||||
; PUSH DE
|
||||
; POP BC
|
||||
; CALL PRTHEXWORD
|
||||
; CALL PC_COLON
|
||||
; PUSH HL
|
||||
; POP BC
|
||||
; CALL PRTHEXWORD
|
||||
; POP BC
|
||||
;
|
||||
; HACK TO CONVERT INCOMING CHS TO LBA IFF HD ACCESS (NOT FLOPPY)
|
||||
; FIRST CHECK FOR FLOPPY DEVICE AND BYPASS IF SO
|
||||
LD A,C ; GET REQUEST DEVICE/UNIT FROM C
|
||||
AND $F0 ; ISOLATE THE DEVICE PORTION
|
||||
CP DIODEV_FD ; FLOPPY?
|
||||
JR Z,DIO_DISPATCH1 ; YES, BYPASS
|
||||
;
|
||||
; NOW CHECK IF INCOMING IS ALREADY LBA AND BYPASS IF SO
|
||||
BIT 7,H ; TEST HIGH BIT OF HEAD/LBA
|
||||
RES 7,H ; CLEAR LBA INDICATOR BIT
|
||||
JR NZ,DIO_DISPATCH1 ; IF NZ, ALREADY LBA, BYPASS
|
||||
;
|
||||
; WE HAVE INCOMING HARDDISK CHS, CONVERT TO LBA
|
||||
; DE=TRACK (0..N), H=HEAD (0..15), L=SECTOR (0..15)
|
||||
; XLAT DE:HL (TT:HS) --> 32 BIT LBA (LBAHI:LBALO)
|
||||
LD A,H ; HEAD TO A
|
||||
RLCA ; LEFT SHIFT TO HIGH NIBBLE
|
||||
RLCA ; ... DEPENDS ON HIGH
|
||||
RLCA ; ... NIBBLE BEING 0 SINCE
|
||||
RLCA ; ... IT ROTATES INTO LOW NIBBLE
|
||||
OR L ; COMBINE WITH SECTOR (HIGH NIBBLE MUST BE ZERO)
|
||||
LD L,A ; THIS IS LBA LOW LSB
|
||||
LD H,E ; LBA LOW MSB, E -> H
|
||||
LD (HSTLBALO),HL ; SAVE FINAL LBA LOW
|
||||
LD L,D ; LBA HIGH LSB, D -> L
|
||||
LD H,0 ; LBA HIGH MSB, ZERO FILL
|
||||
LD (HSTLBAHI),HL ; SAVE FINAL LBA HIGH
|
||||
;
|
||||
; PUSH BC
|
||||
; CALL PC_SPACE
|
||||
; LD BC,(HSTLBAHI)
|
||||
; CALL PRTHEXWORD
|
||||
; CALL PC_COLON
|
||||
; LD BC,(HSTLBALO)
|
||||
; CALL PRTHEXWORD
|
||||
; POP BC
|
||||
;
|
||||
DIO_DISPATCH1:
|
||||
; START OF THE ACTUAL DRIVER DISPATCHING LOGIC
|
||||
@@ -1680,9 +1731,30 @@ PRTD3M3:
|
||||
;
|
||||
IDLECOUNT .DB 0
|
||||
;
|
||||
HSTDSK .DB 0 ; DISK IN BUFFER
|
||||
HSTTRK .DW 0 ; TRACK IN BUFFER
|
||||
HSTSEC .DW 0 ; SECTOR IN BUFFER
|
||||
;HSTTRK .DW 0 ; TRACK IN BUFFER
|
||||
;HSTSEC .DW 0 ; SECTOR IN BUFFER
|
||||
;
|
||||
; THE HOST (HST) VALUES BELOW INDICATE THE DISK AND BLOCK CURRENTLY
|
||||
; ADDRESSED FOR READ/WRITE OPERATIONS.
|
||||
; THE 32-BIT BLOCK ADDRESS CAN BE TREADED AS EITHER CHS OR LBA, HIGH ORDER BIT ON SIGNIFIES LBA
|
||||
; CHS:
|
||||
; .DW 0 ; TRACK (0-65535)
|
||||
; .DB 0 ; SECTOR (0-255)
|
||||
; .DB 0 ; HEAD (0-127)
|
||||
;
|
||||
; LBA:
|
||||
; .DW 0 ; LBA LOW WORD
|
||||
; .DW 0 ; LBA HIGH WORD
|
||||
;
|
||||
; DISK DEVICE/UNIT ID
|
||||
HSTDSK .DB 0 ; DISK DEVICE/UNIT ID
|
||||
; LBA LOW WORD -OR- TRACK
|
||||
HSTLBALO .EQU $ ; BLOCK ADDRESS LBA LOW WORD
|
||||
HSTTRK .DW 0 ; BLOCK ADDRESS TRACK
|
||||
; LBA HIGH WORD -OR- HEAD/SECTOR
|
||||
HSTLBAHI .EQU $ ; BLOCK ADDRESS LBA HIGH WORD
|
||||
HSTSEC .DB 0 ; BLOCK ADDRESS SECTOR
|
||||
HSTHEAD .DB 0 ; BLOCK ADDRESS HEAD
|
||||
;
|
||||
DIOBUF .DW HB_BUF ; PTR TO 1024 BYTE DISK XFR BUFFER
|
||||
;
|
||||
|
||||
@@ -121,16 +121,26 @@ HDSK_RW:
|
||||
AND $0F
|
||||
LD (HDSK_DEVICE),A
|
||||
|
||||
; INCOMING TRK:SEC ACTUALLY REPRESENTS 32 BIT LBA
|
||||
; MAP TRK:SEC TO HDSK DRIVER AS TTSS:SS
|
||||
; ; INCOMING TRK:SEC ACTUALLY REPRESENTS 32 BIT LBA
|
||||
; ; MAP TRK:SEC TO HDSK DRIVER AS TTSS:SS
|
||||
;
|
||||
; LD A,(HSTTRK) ; LSB OF TRACK
|
||||
; LD (HDSK_TRK + 1),A ; MAPS TO MSB OF HDSK TRK
|
||||
; LD A,(HSTSEC + 1) ; MSB OF SECTOR
|
||||
; LD (HDSK_TRK),A ; MAPS TO LSB OF HDSK TRK
|
||||
; LD A,(HSTSEC) ; LSB OF SECTOR
|
||||
; LD (HDSK_SEC),A ; MAPS TO LSB OF HDSK SEC
|
||||
|
||||
; INCOMING ADDRESS IS LBA
|
||||
; MAP HHHH:LLLL TO HDSK DRIVER AS HHLL:LL
|
||||
|
||||
LD A,(HSTTRK) ; LSB OF TRACK
|
||||
LD A,(HSTLBAHI) ; LSB OF LBA HIGH
|
||||
LD (HDSK_TRK + 1),A ; MAPS TO MSB OF HDSK TRK
|
||||
LD A,(HSTSEC + 1) ; MSB OF SECTOR
|
||||
LD A,(HSTLBALO + 1) ; MSB OF LBA LOW
|
||||
LD (HDSK_TRK),A ; MAPS TO LSB OF HDSK TRK
|
||||
LD A,(HSTSEC) ; LSB OF SECTOR
|
||||
LD A,(HSTLBALO) ; LSB OF LBA LOW
|
||||
LD (HDSK_SEC),A ; MAPS TO LSB OF HDSK SEC
|
||||
|
||||
|
||||
; SET TRANSFER ADDRESS
|
||||
LD BC,(DIOBUF)
|
||||
LD (HDSK_DMA),BC
|
||||
|
||||
@@ -355,14 +355,14 @@ IDE_SETUP1:
|
||||
LD (IDE_DEVICE),A
|
||||
OUT (IDEDEVICE),A
|
||||
|
||||
; SEND 3 BYTES OF LBA (HSTTRK:HSTSEC) T:SS -> CYL:SEC (CC:S)
|
||||
LD A,(HSTTRK) ; HSTTRK LSB
|
||||
; SEND 3 BYTES OF LBA T:SS -> CYL:SEC (CC:S)
|
||||
LD A,(HSTLBAHI) ; LBA HIGH LSB
|
||||
LD (IDE_CYLHI),A ; SAVE IT
|
||||
OUT (IDECYLHI),A ; -> CYLINDER HI
|
||||
LD A,(HSTSEC + 1) ; HSTSEC MSB
|
||||
LD A,(HSTLBALO + 1) ; LBA LOW MSB
|
||||
LD (IDE_CYLLO),A ; SAVE IT
|
||||
OUT (IDECYLLO),A ; -> CYLINDER LO
|
||||
LD A,(HSTSEC) ; HSTSEC LSB
|
||||
LD A,(HSTLBALO) ; LBA LOW LSB
|
||||
LD (IDE_SEC),A ; SAVE IT
|
||||
OUT (IDESECTN),A ; -> SECTOR NUM
|
||||
|
||||
|
||||
@@ -110,30 +110,30 @@ MD_WRITE:
|
||||
; ASSUMES A "READ" OPERATION. HL AND DE CAN BE SWAPPED
|
||||
; AFTERWARDS TO ACHIEVE A WRITE OPERATION
|
||||
;
|
||||
; ON INPUT, WE HAVE LBA ADDRESSING IN TRK:SEC
|
||||
; ON INPUT, WE HAVE LBA ADDRESSING IN HSTLBAHI:HSTLBALO
|
||||
; BUT WE NEVER HAVE MORE THAN $FFFF BLOCKS IN A RAM/ROM DISK,
|
||||
; SO THE HIGH WORD (TRK) IS IGNORED
|
||||
; SO THE HIGH WORD (HSTLBAHI) IS IGNORED
|
||||
;
|
||||
; EACH RAM/ROM BANK IS 32K BY DEFINITION AND EACH SECTOR IS 512
|
||||
; BYTES BY DEFINITION. SO, EACH RAM/ROM BANK CONTAINS 64 SECTORS
|
||||
; (32,768 / 512 = 64). THEREFORE, YOU CAN THINK OF HSTSEC AS
|
||||
; (32,768 / 512 = 64). THEREFORE, YOU CAN THINK OF LBA AS
|
||||
; 00000BBB:BBOOOOOO IS WHERE THE 'B' BITS REPRESENT THE BANK NUMBER
|
||||
; AND THE 'O' BITS REPRESENT THE SECTOR NUMBER.
|
||||
; AND THE 'O' BITS REPRESENT THE SECTOR NUMBER WITHIN THE BANK.
|
||||
;
|
||||
; TO EXTRACT THE BANK NUMBER, WE CAN LEFT SHIFT TWICE TO GIVE US:
|
||||
; 000BBBBB:OOOOOOOO:OOOOOOO. FROM THIS WE CAN EXTRACT THE MSB OF HSTTRK
|
||||
; 000BBBBB:OOOOOOOO. FROM THIS WE CAN EXTRACT THE MSB
|
||||
; TO USE AS THE BANK NUMBER. NOTE THAT THE "RAW" BANK NUMBER MUST THEN
|
||||
; BE OFFSET TO THE START OF THE ROM/RAM BANKS.
|
||||
; ALSO NOTE THAT THE HIGH BIT OF THE BANK NUMBER REPRESENTS "RAM" SO THIS
|
||||
; BIT MUST ALSO BE SET ACCORDING TO THE UNIT BEING ADDRESSED.
|
||||
;
|
||||
; TO GET THE BYTE OFFSET, WE THEN RIGHT SHIFT THE LSB BY 1 TO GIVE US:
|
||||
; 0OOOOOOO AND EXTRACT THE LSB OF THE HSTTRK TO REPRESENT THE MSB OF
|
||||
; 0OOOOOOO AND EXTRACT THE LSB TO REPRESENT THE MSB OF
|
||||
; THE BYTE OFFSET. THE LSB OF THE BYTE OFFSET IS ALWAYS 0 SINCE WE ARE
|
||||
; DEALING WITH 512 BYTE BOUNDARIES.
|
||||
;
|
||||
MD_IOSETUP:
|
||||
LD HL,(HSTSEC) ; HL := LOW WORD OF LBA
|
||||
LD HL,(HSTLBALO) ; HL := LOW WORD OF LBA
|
||||
; ALIGN BITS TO EXTRACT BANK NUMBER FROM H
|
||||
SLA L ; LEFT SHIFT ONE BIT
|
||||
RL H ; FULL WORD
|
||||
|
||||
@@ -466,16 +466,16 @@ PPIDE_SETUP1:
|
||||
LD (PPIDEP_HEAD),A ; SAVE HEAD VALUE
|
||||
CALL PPIDE_WRITE ; WRITE IT
|
||||
|
||||
; SEND 3 BYTES OF LBA (HSTTRK:HSTSEC) T:SS -> CYL:SEC (CC:S)
|
||||
LD A,(HSTTRK) ; HSTTRK LSB
|
||||
; SEND 3 BYTES OF LBA T:SS -> CYL:SEC (CC:S)
|
||||
LD A,(HSTLBAHI) ; LBA HIGH LSB
|
||||
LD (PPIDEP_CYLHI),A ; SAVE IT
|
||||
LD C,PPIDE_CYL_MSB ; IDE CYL MSB REGISTER
|
||||
CALL PPIDE_WRITE ; -> CYLINDER HI
|
||||
LD A,(HSTSEC + 1) ; HSTSEC MSB
|
||||
LD A,(HSTLBALO + 1) ; LBA LOW MSB
|
||||
LD (PPIDEP_CYLLO),A ; SAVE IT
|
||||
LD C,PPIDE_CYL_LSB ; IDE CYL LSB REGISTER
|
||||
CALL PPIDE_WRITE ; -> CYLINDER HI
|
||||
LD A,(HSTSEC) ; HSTSEC LSB
|
||||
LD A,(HSTLBALO) ; LBA LOW LSB
|
||||
LD (PPIDEP_SEC),A ; SAVE IT
|
||||
LD C,PPIDE_SECTOR ; IDE CYL LSB REGISTER
|
||||
CALL PPIDE_WRITE ; -> CYLINDER HI
|
||||
|
||||
@@ -304,7 +304,7 @@ PPPSD_CHKCARD:
|
||||
CALL NZ,PPPSD_INITCARD ; INIT CARD IF NOT READY
|
||||
RET ; RETURN WITH STATUS IN A
|
||||
;
|
||||
; SET UP LBA BLOCK INDEX BASED ON HSTTRK AND HSTSEC
|
||||
; SET UP LBA BLOCK INDEX
|
||||
; NOTE THAT BYTE ORDER IS LITTLE ENDIAN FOR PROPLELLER!
|
||||
;
|
||||
PPPSD_SETBLK:
|
||||
@@ -319,9 +319,9 @@ PPPSD_SETBLK:
|
||||
; DEC HL ; POINT TO NEXT BYTE
|
||||
; LD A,(HSTSEC) ; A = HSTSEC:LSB
|
||||
; LD (HL),A ; LBALO:LSB = A = HSTSEC:LSB
|
||||
LD HL,(HSTSEC) ; GET SECTOR
|
||||
LD HL,(HSTLBALO) ; GET LBA LOW WORD
|
||||
LD (PPP_LBALO),HL ; SAVE IT IN LBA BUFFER LO
|
||||
LD HL,(HSTTRK) ; GET TRACK
|
||||
LD HL,(HSTLBAHI) ; GET LBA HIGH WORD
|
||||
LD (PPP_LBAHI),HL ; SAVE IT IN LBA BUFFER HI
|
||||
RET
|
||||
;
|
||||
|
||||
@@ -270,13 +270,13 @@ PRPSD_SETBLK:
|
||||
; CALL PRPSD_SETBLK1
|
||||
; XOR A ; A = 0, NOT USED
|
||||
; CALL PRPSD_SETBLK1
|
||||
LD A,(HSTSEC) ; SECTOR LSB
|
||||
LD A,(HSTLBALO) ; LBA LOW LSB
|
||||
CALL PRPSD_SETBLK1
|
||||
LD A,(HSTSEC + 1) ; SECTOR MSB
|
||||
LD A,(HSTLBALO + 1) ; LBA LOW MSB
|
||||
CALL PRPSD_SETBLK1
|
||||
LD A,(HSTTRK) ; TRACK LSB
|
||||
LD A,(HSTLBAHI) ; LBA HIGH LSB
|
||||
CALL PRPSD_SETBLK1
|
||||
LD A,(HSTTRK + 1) ; TRACK MSB
|
||||
LD A,(HSTLBAHI + 1) ; LBA HIGH MSB
|
||||
CALL PRPSD_SETBLK1
|
||||
RET
|
||||
PRPSD_SETBLK1:
|
||||
|
||||
@@ -118,9 +118,9 @@ RF_SETADR:
|
||||
LD A,(RF_IO)
|
||||
OR RF_AL
|
||||
LD C,A
|
||||
LD A,(HSTSEC)
|
||||
LD A,(HSTLBALO)
|
||||
OUT (C),A
|
||||
LD A,(HSTTRK)
|
||||
LD A,(HSTLBALO+1)
|
||||
INC C
|
||||
OUT (C),A
|
||||
RET
|
||||
|
||||
@@ -1111,8 +1111,8 @@ SD_SETADDR:
|
||||
;
|
||||
; TT:SS = BC:DE -> TS:S0, THEN LEFT SHIFT ONE BIT
|
||||
SD_SETADDRSDSC:
|
||||
LD BC,(HSTTRK)
|
||||
LD DE,(HSTSEC)
|
||||
LD BC,(HSTLBAHI)
|
||||
LD DE,(HSTLBALO)
|
||||
LD B,C
|
||||
LD C,D
|
||||
LD D,E
|
||||
@@ -1126,8 +1126,8 @@ SD_SETADDRSDSC:
|
||||
; SDHC CARDS USE SIMPLE LBA, NO TRANSLATION NEEDED
|
||||
;
|
||||
SD_SETADDRSDHC:
|
||||
LD BC,(HSTTRK) ; LBA HIGH WORD
|
||||
LD DE,(HSTSEC) ; LBA LOW WORD
|
||||
LD BC,(HSTLBAHI) ; LBA HIGH WORD
|
||||
LD DE,(HSTLBALO) ; LBA LOW WORD
|
||||
RET ; DONE
|
||||
;
|
||||
; HANDLE READY TIMEOUT ERROR
|
||||
|
||||
Reference in New Issue
Block a user