mirror of https://github.com/wwarthen/RomWBW.git
Browse Source
- Cosmetic updates - Fix fv.asm keyboard status function - Bump version numberpull/419/merge
10 changed files with 42 additions and 488 deletions
@ -1,449 +0,0 @@ |
|||
; |
|||
;================================================================================================== |
|||
; HDSK DISK DRIVER |
|||
;================================================================================================== |
|||
; |
|||
; IO PORT ADDRESSES |
|||
; |
|||
HDSK_IO .EQU $FD |
|||
; |
|||
HDSK_CMDNONE .EQU 0 |
|||
HDSK_CMDRESET .EQU 1 |
|||
HDSK_CMDREAD .EQU 2 |
|||
HDSK_CMDWRITE .EQU 3 |
|||
HDSK_CMDPARAM .EQU 4 |
|||
; |
|||
; HDSK DEVICE CONFIGURATION |
|||
; |
|||
HDSK_DEVCNT .EQU 2 ; NUMBER OF HDSK DEVICES SUPPORTED |
|||
HDSK_CFGSIZ .EQU 6 ; SIZE OF CFG TBL ENTRIES |
|||
; |
|||
HDSK_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) |
|||
HDSK_STAT .EQU 1 ; OFFSET OF STATUS (BYTE) |
|||
HDSK_LBA .EQU 2 ; OFFSET OF LBA (DWORD) |
|||
; |
|||
DEVECHO "HDSK: IO=" |
|||
DEVECHO HDSK_IO |
|||
DEVECHO ", DEVICE COUNT=" |
|||
DEVECHO HDSK_DEVCNT |
|||
DEVECHO "\n" |
|||
; |
|||
HDSK_CFGTBL: |
|||
; DEVICE 0 |
|||
.DB 0 ; DRIVER DEVICE NUMBER |
|||
.DB 0 ; DEVICE STATUS |
|||
.DW 0,0 ; CURRENT LBA |
|||
#IF (HDSK_DEVCNT >= 2) |
|||
; DEVICE 1 |
|||
.DB 1 ; DEVICE NUMBER |
|||
.DB 0 ; DEVICE STATUS |
|||
.DW 0,0 ; CURRENT LBA |
|||
#ENDIF |
|||
; |
|||
#IF ($ - HDSK_CFGTBL) != (HDSK_DEVCNT * HDSK_CFGSIZ) |
|||
.ECHO "*** INVALID HDSK CONFIG TABLE ***\n" |
|||
#ENDIF |
|||
; |
|||
.DB $FF ; END MARKER |
|||
; |
|||
; STATUS |
|||
; |
|||
HDSK_STOK .EQU 0 ; OK |
|||
HDSK_STNOTRDY .EQU -1 ; NOT READY |
|||
; |
|||
; |
|||
; |
|||
HDSK_INIT: |
|||
CALL NEWLINE ; FORMATTING |
|||
PRTS("HDSK:$") |
|||
PRTS(" DEVICES=$") |
|||
LD A,HDSK_DEVCNT |
|||
CALL PRTDECB |
|||
; |
|||
; SETUP THE DISPATCH TABLE ENTRIES |
|||
; |
|||
XOR A ; ZERO ACCUM |
|||
LD (HDSK_CURDEV),A ; INIT CURRENT DEVICE NUM |
|||
LD IY,HDSK_CFGTBL ; START OF DEV CFG TABLE |
|||
HDSK_INIT0: |
|||
CALL HDSK_PROBE ; HARDWARE PROBE |
|||
JR NZ,HDSK_INIT1 ; SKIP DEVICE IF NOT PRESENT |
|||
LD BC,HDSK_FNTBL ; BC := DRIVER FUNC TABLE ADDRESS |
|||
PUSH IY ; CFG ENTRY POINTER |
|||
POP DE ; ... TO DE |
|||
CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK TABLE |
|||
CALL HDSK_INITDEV ; PERFORM DEVICE INITIALIZATION |
|||
HDSK_INIT1: |
|||
LD BC,HDSK_CFGSIZ ; SIZE OF CFG ENTRY |
|||
ADD IY,BC ; BUMP IY TO NEXT ENTRY |
|||
LD HL,HDSK_CURDEV ; POINT TO CURRENT DEVICE |
|||
INC (HL) ; AND INCREMENT IT |
|||
LD A,(IY) ; GET FIRST BYTE OF ENTRY |
|||
INC A ; TEST FOR END OF TABLE ($FF) |
|||
JR NZ,HDSK_INIT0 ; IF NOT, LOOP |
|||
; |
|||
XOR A ; INIT SUCCEEDED |
|||
RET ; RETURN |
|||
; |
|||
; PROBE FOR DEVICE EXISTENCE |
|||
; |
|||
HDSK_PROBE: |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET ; AND DONE |
|||
; |
|||
; INITIALIZE DEVICE |
|||
; |
|||
HDSK_INITDEV: |
|||
LD (IY+HDSK_STAT),HDSK_STNOTRDY ; STATUS := NOT READY |
|||
XOR A ; CLEAR ACCUM |
|||
LD (IY+HDSK_LBA+0),A ; ZERO LBA |
|||
LD (IY+HDSK_LBA+1),A ; ... |
|||
LD (IY+HDSK_LBA+2),A ; ... |
|||
LD (IY+HDSK_LBA+3),A ; ... |
|||
XOR A ; SIGNAL SUCCESS (REDUNDANT) |
|||
RET ; AND DONE |
|||
; |
|||
; DRIVER FUNCTION TABLE |
|||
; |
|||
HDSK_FNTBL: |
|||
.DW HDSK_STATUS |
|||
.DW HDSK_RESET |
|||
.DW HDSK_SEEK |
|||
.DW HDSK_READ |
|||
.DW HDSK_WRITE |
|||
.DW HDSK_VERIFY |
|||
.DW HDSK_FORMAT |
|||
.DW HDSK_DEVICE |
|||
.DW HDSK_MEDIA |
|||
.DW HDSK_DEFMED |
|||
.DW HDSK_CAP |
|||
.DW HDSK_GEOM |
|||
#IF (($ - HDSK_FNTBL) != (DIO_FNCNT * 2)) |
|||
.ECHO "*** INVALID HDSK FUNCTION TABLE ***\n" |
|||
#ENDIF |
|||
; |
|||
; |
|||
; |
|||
HDSK_VERIFY: |
|||
HDSK_FORMAT: |
|||
HDSK_DEFMED: |
|||
SYSCHKERR(ERR_NOTIMPL) ; INVALID SUB-FUNCTION |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
HDSK_STATUS: |
|||
LD A,(IY+HDSK_STAT) ; LOAD STATUS |
|||
OR A ; SET FLAGS |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
HDSK_RESET: |
|||
JP HDSK_DSKRESET |
|||
; |
|||
; GET DISK CAPACITY |
|||
; RETURN DE:HL=BLOCK COUNT, BC=BLOCK SIZE |
|||
; ASSUME 1GB MEDIA SIZE, SO 1GB / 512B |
|||
; IS $200000 SECTORS |
|||
; |
|||
HDSK_CAP: |
|||
LD DE,$20 ; BLOCK COUNT MSW |
|||
LD HL,0 ; BLOCK COUNT LSW |
|||
LD BC,512 ; 512 BYTE SECTOR |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
HDSK_GEOM: |
|||
; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS |
|||
; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE |
|||
CALL HDSK_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC |
|||
LD L,H ; DIVIDE BY 256 FOR # TRACKS |
|||
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL |
|||
LD D,$80 | 16 ; HEADS / CYL = 16, SET LBA BIT |
|||
LD E,16 ; SECTORS / TRACK = 16 |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
HDSK_DEVICE: |
|||
LD D,DIODEV_HDSK ; D := DEVICE TYPE |
|||
LD E,(IY+HDSK_DEV) ; E := PHYSICAL DEVICE NUMBER |
|||
LD C,%00110000 ; C := ATTRIBUTES, NON-REMOVABLE HARD DISK |
|||
LD H,0 ; H := 0, DRIVER HAS NO MODES |
|||
LD L,HDSK_IO ; L := BASE I/O ADDRESS |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
HDSK_MEDIA: |
|||
LD E,MID_HD ; HARD DISK MEDIA |
|||
LD D,0 ; D:0=0 MEANS NO MEDIA CHANGE |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
HDSK_SEEK: |
|||
BIT 7,D ; CHECK FOR LBA FLAG |
|||
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA |
|||
RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA) |
|||
LD (IY+HDSK_LBA+0),L ; SAVE NEW LBA |
|||
LD (IY+HDSK_LBA+1),H ; ... |
|||
LD (IY+HDSK_LBA+2),E ; ... |
|||
LD (IY+HDSK_LBA+3),D ; ... |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET ; AND RETURN |
|||
; |
|||
; |
|||
; |
|||
HDSK_READ: |
|||
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR |
|||
LD A,HDSK_CMDREAD |
|||
JR HDSK_RW |
|||
; |
|||
; |
|||
; |
|||
HDSK_WRITE: |
|||
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR |
|||
LD A,HDSK_CMDWRITE |
|||
JR HDSK_RW |
|||
; |
|||
; |
|||
; |
|||
HDSK_RW: |
|||
LD (HDSK_CMD),A ; SET COMMAND BYTE |
|||
LD (HDSK_DMA),HL ; SAVE INITIAL DMA |
|||
LD A,E ; SECTOR COUNT TO A |
|||
OR A ; SET FLAGS |
|||
RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 |
|||
LD B,A ; INIT SECTOR DOWNCOUNTER |
|||
LD C,0 ; INIT SECTOR READ/WRITE COUNT |
|||
LD A,(IY+HDSK_DEV) ; GET DEVICE NUMBER |
|||
LD (HDSK_DRV),A ; ... AND SET FIELD IN HDSK PARM BLOCK |
|||
|
|||
; RESET HDSK INTERFACE IF NEEDED |
|||
LD A,(IY+HDSK_STAT) ; GET CURRENT STATUS |
|||
OR A ; SET FLAGS |
|||
PUSH BC ; SAVE COUNTERS |
|||
CALL NZ,HDSK_DSKRESET ; RESET IF NOT READY |
|||
POP BC ; RESTORE COUNTERS |
|||
JR NZ,HDSK_RW6 ; ABORT ON FAILURE |
|||
|
|||
HDSK_RW0: |
|||
PUSH BC ; SAVE COUNTERS |
|||
XOR A ; A = 0 |
|||
LD (HDSK_RC),A ; CLEAR RETURN CODE |
|||
; |
|||
#IF (DSKYENABLE) |
|||
#IF (DSKYDSKACT) |
|||
LD A,HDSK_LBA |
|||
CALL LDHLIYA |
|||
CALL HB_DSKACT ; SHOW ACTIVITY |
|||
#ENDIF |
|||
#ENDIF |
|||
; |
|||
; CONVERT LBA HHHH:LLLL (4 BYTES) |
|||
; TO HDSK TRACK/SECTOR TTTT:SS (3 BYTES) |
|||
; SAVING TO HDSK PARM BLOCK |
|||
; (IY+HDSK_LBA+0) ==> (HDSK_SEC) |
|||
LD A,(IY+HDSK_LBA+0) |
|||
LD (HDSK_SEC),A |
|||
; (IY+HDSK_LBA+1) ==> (HDSK_TRK+0) |
|||
LD A,(IY+HDSK_LBA+1) |
|||
LD (HDSK_TRK+0),A |
|||
; (IY+HDSK_LBA+2) ==> (HDSK_TRK+1) |
|||
LD A,(IY+HDSK_LBA+2) |
|||
LD (HDSK_TRK+1),A |
|||
|
|||
; EXECUTE COMMAND |
|||
LD B,7 ; SIZE OF PARAMETER BLOCK |
|||
LD HL,HDSK_PARMBLK ; ADDRESS OF PARAMETER BLOCK |
|||
LD C,$FD ; HDSK CMD PORT |
|||
OTIR ; SEND IT |
|||
|
|||
; GET RESULT |
|||
IN A,(C) ; GET RESULT CODE |
|||
LD (HDSK_RC),A ; SAVE IT |
|||
OR A ; SET FLAGS |
|||
|
|||
#IF (HDSKTRACE > 0) |
|||
PUSH AF ; SAVE RETURN CODE |
|||
#IF (HDSKTRACE == 1) |
|||
CALL NZ,HDSK_PRT ; DIAGNOSE ERRORS ONLY |
|||
#ENDIF |
|||
#IF (HDSKTRACE >= 2) |
|||
CALL HDSK_PRT ; DISPLAY ALL READ/WRITE RESULTS |
|||
#ENDIF |
|||
POP AF ; RESTORE RETURN CODE |
|||
#ENDIF |
|||
|
|||
JR NZ,HDSK_RW5 ; BAIL OUT ON ERROR |
|||
|
|||
; INCREMENT LBA |
|||
LD A,HDSK_LBA ; LBA OFFSET IN CFG ENTRY |
|||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED |
|||
CALL INC32HL ; INCREMENT THE VALUE |
|||
|
|||
; INCREMENT DMA |
|||
LD HL,HDSK_DMA+1 ; POINT TO MSB OF DMA |
|||
INC (HL) ; BUMP DMA BY |
|||
INC (HL) ; ... 512 BYTES |
|||
|
|||
XOR A ; A := 0 SIGNALS SUCCESS |
|||
|
|||
HDSK_RW5: |
|||
POP BC ; RECOVER COUNTERS |
|||
JR NZ,HDSK_RW6 ; IF ERROR, GET OUT |
|||
|
|||
INC C ; RECORD SECTOR COMPLETED |
|||
DJNZ HDSK_RW0 ; LOOP AS NEEDED |
|||
|
|||
HDSK_RW6: |
|||
; RETURN WITH SECTORS READ IN E AND UPDATED DMA ADDRESS IN HL |
|||
LD E,C ; SECTOR READ COUNT TO E |
|||
LD HL,(HDSK_DMA) ; CURRENT DMA TO HL |
|||
OR A ; SET FLAGS BASED ON RETURN CODE |
|||
RET Z ; RETURN IF SUCCESS |
|||
LD A,ERR_IO ; SIGNAL IO ERROR |
|||
OR A ; SET FLAGS |
|||
RET ; AND DONE |
|||
; |
|||
; |
|||
; |
|||
HDSK_DSKRESET: |
|||
; |
|||
#IF (HDSKTRACE >= 2) |
|||
CALL NEWLINE |
|||
LD DE,HDSKSTR_PREFIX |
|||
CALL WRITESTR |
|||
CALL PC_SPACE |
|||
LD DE,HDSKSTR_RESET |
|||
CALL WRITESTR |
|||
#ENDIF |
|||
; |
|||
LD B,32 |
|||
LD A,HDSK_CMDRESET |
|||
HDSK_DSKRESET1: |
|||
OUT ($FD),A |
|||
DJNZ HDSK_DSKRESET1 |
|||
|
|||
XOR A ; STATUS = OK |
|||
LD (IY+HDSK_STAT),A ; SAVE IT |
|||
|
|||
RET |
|||
; |
|||
; |
|||
; |
|||
HDSK_PRT: |
|||
CALL NEWLINE |
|||
|
|||
LD DE,HDSKSTR_PREFIX |
|||
CALL WRITESTR |
|||
|
|||
CALL PC_SPACE |
|||
LD DE,HDSKSTR_CMD |
|||
CALL WRITESTR |
|||
LD A,(HDSK_CMD) |
|||
CALL PRTHEXBYTE |
|||
|
|||
CALL PC_SPACE |
|||
CALL PC_LBKT |
|||
LD A,(HDSK_CMD) |
|||
LD DE,HDSKSTR_NONE |
|||
CP HDSK_CMDNONE |
|||
JP Z,HDSK_PRTCMD |
|||
LD DE,HDSKSTR_RESET |
|||
CP HDSK_CMDRESET |
|||
JP Z,HDSK_PRTCMD |
|||
LD DE,HDSKSTR_READ |
|||
CP HDSK_CMDREAD |
|||
JP Z,HDSK_PRTCMD |
|||
LD DE,HDSKSTR_WRITE |
|||
CP HDSK_CMDWRITE |
|||
JP Z,HDSK_PRTCMD |
|||
LD DE,HDSKSTR_PARAM |
|||
CP HDSK_CMDPARAM |
|||
JP Z,HDSK_PRTCMD |
|||
LD DE,HDSKSTR_UNKCMD |
|||
HDSK_PRTCMD: |
|||
CALL WRITESTR |
|||
CALL PC_RBKT |
|||
|
|||
LD A,(HDSK_CMD) |
|||
CP HDSK_CMDREAD |
|||
JR Z,HDSK_PRTRW |
|||
CP HDSK_CMDWRITE |
|||
JR Z,HDSK_PRTRW |
|||
RET |
|||
|
|||
HDSK_PRTRW: |
|||
CALL PC_SPACE |
|||
LD A,(HDSK_DRV) |
|||
CALL PRTHEXBYTE |
|||
CALL PC_SPACE |
|||
LD BC,(HDSK_TRK) |
|||
CALL PRTHEXWORD |
|||
CALL PC_SPACE |
|||
LD A,(HDSK_SEC) |
|||
CALL PRTHEXBYTE |
|||
CALL PC_SPACE |
|||
LD BC,(HDSK_DMA) |
|||
CALL PRTHEXWORD |
|||
|
|||
CALL PC_SPACE |
|||
LD DE,HDSKSTR_ARROW |
|||
CALL WRITESTR |
|||
|
|||
CALL PC_SPACE |
|||
LD DE,HDSKSTR_RC |
|||
CALL WRITESTR |
|||
LD A,(HDSK_RC) |
|||
CALL PRTHEXBYTE |
|||
|
|||
CALL PC_SPACE |
|||
CALL PC_LBKT |
|||
LD A,(HDSK_RC) |
|||
LD DE,HDSKSTR_STOK |
|||
CP HDSK_STOK |
|||
JP Z,HDSK_PRTRC |
|||
LD DE,HDSKSTR_STUNK |
|||
|
|||
HDSK_PRTRC: |
|||
CALL WRITESTR |
|||
CALL PC_RBKT |
|||
|
|||
RET |
|||
; |
|||
; |
|||
; |
|||
HDSKSTR_PREFIX .TEXT "HDSK:$" |
|||
HDSKSTR_CMD .TEXT "CMD=$" |
|||
HDSKSTR_RC .TEXT "RC=$" |
|||
HDSKSTR_ARROW .TEXT "-->$" |
|||
HDSKSTR_NONE .TEXT "NONE$" |
|||
HDSKSTR_RESET .TEXT "RESET$" |
|||
HDSKSTR_READ .TEXT "READ$" |
|||
HDSKSTR_WRITE .TEXT "WRITE$" |
|||
HDSKSTR_PARAM .TEXT "PARAM$" |
|||
HDSKSTR_UNKCMD .TEXT "UNKCMD$" |
|||
HDSKSTR_STOK .TEXT "OK$" |
|||
HDSKSTR_STUNK .TEXT "UNKNOWN ERROR$" |
|||
; |
|||
;================================================================================================== |
|||
; HDSK DISK DRIVER - DATA |
|||
;================================================================================================== |
|||
; |
|||
HDSK_RC .DB 0 ; CURRENT RETURN CODE |
|||
HDSK_CURDEV .DB 0 ; CURRENT DEVICE NUMBER |
|||
; |
|||
HDSK_PARMBLK: |
|||
HDSK_CMD .DB 0 ; COMMAND (HDSK_READ, HDSK_WRITE, ...) |
|||
HDSK_DRV .DB 0 ; 0..7, HDSK DRIVE NUMBER |
|||
HDSK_SEC .DB 0 ; 0..255 SECTOR |
|||
HDSK_TRK .DW 0 ; 0..2047 TRACK |
|||
HDSK_DMA .DW 0 ; ADDRESS FOR SECTOR DATA EXCHANGE |
|||
Loading…
Reference in new issue