|
|
@ -1276,7 +1276,7 @@ DSK_IO2: |
|
|
ADD A,D ; ADD WITH D |
|
|
ADD A,D ; ADD WITH D |
|
|
LD D,A ; PUT IT BACK IN D |
|
|
LD D,A ; PUT IT BACK IN D |
|
|
LD A,(HSTOFF+1) ; MSB OF SLICE OFFSET TO A |
|
|
LD A,(HSTOFF+1) ; MSB OF SLICE OFFSET TO A |
|
|
CALL ADDHLA ; ADD OFFSET |
|
|
|
|
|
|
|
|
CALL ADCHLA ; ADD OFFSET |
|
|
POP BC ; RECOVER FUNCTION IN B |
|
|
POP BC ; RECOVER FUNCTION IN B |
|
|
LD A,(HSTDU) ; GET THE DEVICE/UNIT VALUE |
|
|
LD A,(HSTDU) ; GET THE DEVICE/UNIT VALUE |
|
|
LD C,A ; PUT IT IN C |
|
|
LD C,A ; PUT IT IN C |
|
|
@ -1293,61 +1293,70 @@ DSK_IO2: |
|
|
LD B,E ; UNIT TO B |
|
|
LD B,E ; UNIT TO B |
|
|
LD DE,(BUFADR) ; SET BUFFER ADDRESS |
|
|
LD DE,(BUFADR) ; SET BUFFER ADDRESS |
|
|
LD HL,1 ; 1 SECTOR |
|
|
LD HL,1 ; 1 SECTOR |
|
|
|
|
|
|
|
|
|
|
|
; DISPATCH TO UBIOS |
|
|
RST 08 |
|
|
RST 08 |
|
|
CALL NZ,PANIC |
|
|
|
|
|
XOR A ; SET FLAGS BASED ON RESULT |
|
|
|
|
|
|
|
|
OR A ; SET FLAGS BASED ON RESULT |
|
|
RET |
|
|
RET |
|
|
|
|
|
|
|
|
#ELSE |
|
|
#ELSE |
|
|
|
|
|
|
|
|
DSK_IO: |
|
|
DSK_IO: |
|
|
LD A,(HSTDU) ; GET ACTIVE DEVICE/UNIT BYTE |
|
|
|
|
|
AND $F0 ; ISOLATE DEVICE PORTION |
|
|
|
|
|
CP DIODEV_FD ; FLOPPY? |
|
|
|
|
|
JR NZ,DSK_IO1 ; NO, USE LBA HANDLING |
|
|
|
|
|
; SET HL=TRACK (ADD IN TRACK OFFSET) |
|
|
|
|
|
LD DE,(HSTOFF) ; DE = TRACK OFFSET FOR LU SUPPORT |
|
|
|
|
|
LD HL,(HSTTRK) ; HL = TRACK # |
|
|
|
|
|
ADD HL,DE ; APPLY OFFSET FOR ACTIVE SLICE |
|
|
|
|
|
; SET DE=SECTOR |
|
|
|
|
|
LD DE,(HSTSEC) ; DE = SECTOR # |
|
|
|
|
|
; SET C = DEVICE/UNIT |
|
|
|
|
|
LD A,(HSTDU) ; LOAD DEVICE/UNIT VALUE |
|
|
|
|
|
LD C,A ; SAVE IN C |
|
|
|
|
|
; DISPATCH TO DRIVER |
|
|
|
|
|
RST 08 |
|
|
|
|
|
OR A ; SET FLAGS BASED ON RESULT |
|
|
|
|
|
RET |
|
|
|
|
|
; NEW LBA HANDLING |
|
|
|
|
|
; COERCE TRACK/SECTOR INTO HL:DE AS 0000:TTTS |
|
|
|
|
|
DSK_IO1: |
|
|
|
|
|
PUSH BC |
|
|
|
|
|
LD DE,(HSTTRK) ; GET TRACK INTO HL |
|
|
|
|
|
LD B,4 ; PREPARE TO LEFT SHIFT BY 4 BITS |
|
|
|
|
|
DSK_IO2: |
|
|
|
|
|
SLA E ; SHIFT DE LEFT BY 4 BITS |
|
|
|
|
|
RL D |
|
|
|
|
|
DJNZ DSK_IO2 ; LOOP TILL ALL BITS DONE |
|
|
|
|
|
LD A,(HSTSEC) ; GET THE SECTOR INTO A |
|
|
|
|
|
AND $0F ; GET RID OF TOP NIBBLE |
|
|
|
|
|
OR E ; COMBINE WITH E |
|
|
|
|
|
LD E,A ; BACK IN E |
|
|
|
|
|
LD HL,0 ; HL:DE NOW HAS SLICE RELATIVE LBA |
|
|
|
|
|
; APPLY OFFSET NOW |
|
|
|
|
|
; OFFSET IS EXPRESSED AS NUMBER OF BLOCKS * 256 TO OFFSET! |
|
|
|
|
|
LD A,(HSTOFF) ; LSB OF SLICE OFFSET TO A |
|
|
|
|
|
ADD A,D ; ADD WITH D |
|
|
|
|
|
LD D,A ; PUT IT BACK IN D |
|
|
|
|
|
LD A,(HSTOFF+1) ; MSB OF SLICE OFFSET TO A |
|
|
|
|
|
CALL ADDHLA ; ADD OFFSET |
|
|
|
|
|
POP BC ; RECOVER FUNCTION IN B |
|
|
|
|
|
LD A,(HSTDU) ; GET THE DEVICE/UNIT VALUE |
|
|
|
|
|
LD C,A ; PUT IT IN C |
|
|
|
|
|
; DISPATCH TO DRIVER |
|
|
|
|
|
RST 08 |
|
|
|
|
|
OR A ; SET FLAGS BASED ON RESULT |
|
|
|
|
|
RET |
|
|
|
|
|
|
|
|
; |
|
|
|
|
|
; TRANSLATE CP/M TRACK/SECTOR -> HBIOS TRACK/HEAD/SECTOR |
|
|
|
|
|
; NEEDS TO HANDLE FLOPPY SEPARATE FROM HARD DISK |
|
|
|
|
|
; |
|
|
|
|
|
CHS: |
|
|
|
|
|
LD A,(HSTDU) ; GET DEVICE/UNIT |
|
|
|
|
|
LD C,A ; PUT IT IN C FOR HBIOS CALL |
|
|
|
|
|
AND $F0 |
|
|
|
|
|
CP DIODEV_FD ; FLOPPY? |
|
|
|
|
|
JR NZ,CHSHD ; IF NOT, DO HD CHS XLAT |
|
|
|
|
|
; |
|
|
|
|
|
; FLOPPY SPECIFIC TRANSLATION |
|
|
|
|
|
; CURRENTLY LEAVES HEAD VALUE IMBEDDED IN |
|
|
|
|
|
; TRACK WHICH HBIOS FD DRIVER HANDLES |
|
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
|
|
LD DE,(HSTSEC) ; SECTOR DE, HEAD(D) BECOMES ZERO |
|
|
|
|
|
LD HL,(HSTTRK) ; TRACK -> TRACK (LOW BIT HAS HEAD) |
|
|
|
|
|
JR CHS2 |
|
|
|
|
|
; |
|
|
|
|
|
; HARD DISK SPECIFIC TRANSLATION |
|
|
|
|
|
; ASSUMES 16 HEADS PER CYLINDER AND 16 SECTORS PER TRACK |
|
|
|
|
|
; |
|
|
|
|
|
CHSHD: |
|
|
|
|
|
LD HL,(HSTTRK) ; GET TRACK VALUE |
|
|
|
|
|
LD A,L ; LSB OF TRACK TO A |
|
|
|
|
|
AND $0F ; ISOLATE HEAD IN LOW 4 BITS |
|
|
|
|
|
LD D,A ; STUFF IT IN D |
|
|
|
|
|
LD A,(HSTSEC) ; GET SECTOR |
|
|
|
|
|
LD E,A ; STUFF IT IN E |
|
|
|
|
|
LD A,B ; SAVE B (HBIOS FUNC) |
|
|
|
|
|
LD B,4 ; PREPARE TO SHIFT OUT 4 BIT HEAD VALUE |
|
|
|
|
|
CHSHD1: |
|
|
|
|
|
SRL H ; SHIFT ONE BIT OUT |
|
|
|
|
|
RR L ; ... OF HL |
|
|
|
|
|
DJNZ CHSHD1 ; DO ALL 4 BITS |
|
|
|
|
|
LD B,A ; RESTORE B (HBIOS FUNC) |
|
|
|
|
|
; FALL THRU TO CHS2 |
|
|
|
|
|
; |
|
|
|
|
|
; ALL TYPES OF TRANSLATION WIND UP HERE TO |
|
|
|
|
|
; MAKE THE ACTUAL HBIOS CALL |
|
|
|
|
|
; |
|
|
|
|
|
CHS2: |
|
|
|
|
|
PUSH DE ; SAVE HEAD/SECTOR + COULD MOVE |
|
|
|
|
|
LD DE,(HSTOFF) ; NOW GET SLICE OFFSET | TO CHSHD, |
|
|
|
|
|
ADD HL,DE ; ADD IT TO TRACK VALUE | NO SLICES |
|
|
|
|
|
POP DE ; RECOVER HEAD/SECTOR + FOR FLOPPY |
|
|
|
|
|
EX DE,HL ; HL <-> DE FOR HBIOS CALL |
|
|
|
|
|
; |
|
|
|
|
|
; MAKE HBIOS CALL |
|
|
|
|
|
; HBIOS FUNC SHOULD STILL BE IN B |
|
|
|
|
|
; DEVICE/UNIT SHOULD STILL BE IN C |
|
|
|
|
|
; |
|
|
|
|
|
RST 08 ; DO IT |
|
|
|
|
|
OR A ; SET FLAGS |
|
|
|
|
|
RET ; DONE |
|
|
|
|
|
|
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
|