mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
RC2014 Floppy
- Support for RC2014 SMB Floppy (WDC & SMC), but not yet tested. - Final work on Multi-Sector I/O
This commit is contained in:
@@ -12,6 +12,9 @@ SIOENABLE .SET TRUE ; TRUE TO AUTO-DETECT ZILOG SIO/2
|
||||
SIOMODE .SET SIOMODE_RC ; TYPE OF SIO/2 TO DETECT: SIOMODE_RC, SIOMODE_SMB
|
||||
ACIAENABLE .SET TRUE ; TRUE TO AUTO-DETECT MOTOROLA 6850 ACIA
|
||||
;
|
||||
FDENABLE .SET FALSE ; TRUE FOR FLOPPY SUPPORT
|
||||
FDMODE .SET FDMODE_SMBWDC ; FDMODE_SMBSMC, FDMODE_SMBWDC
|
||||
;
|
||||
IDEENABLE .SET TRUE ; TRUE FOR IDE DEVICE SUPPORT (CF MODULE)
|
||||
PPIDEMODE .SET IDEMODE_RC ; TYPE OF CF MODULE: IDEMODE_RC, IDEMODE_SMB
|
||||
PPIDEENABLE .SET FALSE ; TRUE FOR PPIDE DEVICE SUPPORT (PPIDE MODULE)
|
||||
PPIDEMODE .SET PPIDEMODE_RC ; TYPE OF CF MODULE: PPIDEMODE_RC, PPIDEMODE_SMB
|
||||
|
||||
@@ -36,7 +36,7 @@ MDENABLE .EQU TRUE ; TRUE FOR ROM/RAM DISK SUPPORT (ALMOST ALWAYS WANT THIS ENA
|
||||
MDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF MDENABLE = TRUE)
|
||||
;
|
||||
FDENABLE .EQU FALSE ; TRUE FOR FLOPPY SUPPORT
|
||||
FDMODE .EQU FDMODE_ZETA ; FDMODE_DIO, FDMODE_ZETA, FDMODE_DIDE, FDMODE_N8, FDMODE_DIO3
|
||||
FDMODE .EQU FDMODE_SMBWDC ; FDMODE_DIO, FDMODE_ZETA, FDMODE_DIDE, FDMODE_N8, FDMODE_DIO3
|
||||
FDTRACE .EQU 1 ; 0=SILENT, 1=FATAL ERRORS, 2=ALL ERRORS, 3=EVERYTHING (ONLY RELEVANT IF FDENABLE = TRUE)
|
||||
FDMEDIA .EQU FDM144 ; FDM720, FDM144, FDM360, FDM120 (ONLY RELEVANT IF FDENABLE = TRUE)
|
||||
FDMEDIAALT .EQU FDM720 ; ALTERNATE MEDIA TO TRY, SAME CHOICES AS ABOVE (ONLY RELEVANT IF FDMAUTO = TRUE)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
;
|
||||
; PORTS
|
||||
;
|
||||
#IF ((FDMODE == FDMODE_DIO) | (FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3))
|
||||
#IF ((FDMODE == FDMODE_DIO) | (FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3) | (FDMODE == FDMODE_SMBSMC))
|
||||
FDC_MSR .EQU $36 ; 8272 MAIN STATUS REGISTER
|
||||
FDC_DATA .EQU $37 ; 8272 DATA PORT
|
||||
FDC_DIR .EQU $38 ; DATA INPUT REGISTER
|
||||
@@ -41,6 +41,14 @@ FDC_DACK .EQU $90 ; DACK
|
||||
FDC_TC .EQU $93 ; TERMINAL COUNT (W/ DACK)
|
||||
FDC_DMA .EQU $3C ; NOT USED BY N8
|
||||
#ENDIF
|
||||
#IF (FDMODE = FDMODE_SMBWDC)
|
||||
FDC_MSR .EQU $50 ; 8272 MAIN STATUS REGISTER
|
||||
FDC_DATA .EQU $51 ; 8272 DATA PORT
|
||||
FDC_DOR .EQU $58 ; DIGITAL OUTPUT REGISTER
|
||||
FDC_DCR .EQU $48 ; CONFIGURATION CONTROL REGISTER
|
||||
FDC_TC .EQU $58 ; TERMINAL COUNT (W/ DACK)
|
||||
#ENDIF
|
||||
|
||||
;
|
||||
; DISK OPERATIONS
|
||||
;
|
||||
@@ -310,9 +318,17 @@ DOR_BR500 .EQU 10100010B ; 500KBPS W/ MOTOR ON
|
||||
DOR_INIT .EQU 10100000B ; INITIAL DEFAULT LATCH VALUE
|
||||
#ENDIF
|
||||
;
|
||||
; MOTOR INVERTED, DENSITY SELECT NORMAL FOR SMB SMC
|
||||
;
|
||||
#IF (FDMODE == FDMODE_SMBSMC)
|
||||
DOR_BR250 .EQU 10100110B ; 250KBPS W/ MOTOR ON
|
||||
DOR_BR500 .EQU 11100010B ; 500KBPS W/ MOTOR ON
|
||||
DOR_INIT .EQU 11100000B ; INITIAL DEFAULT LATCH VALUE
|
||||
#ENDIF
|
||||
;
|
||||
; *** DIDE/N8/ZETA V2 ***
|
||||
;
|
||||
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2))
|
||||
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_SMBWDC))
|
||||
DOR_INIT .EQU 00001100B ; SOFT RESET INACTIVE, DMA ENABLED
|
||||
DOR_BR250 .EQU DOR_INIT
|
||||
DOR_BR500 .EQU DOR_INIT
|
||||
@@ -1176,7 +1192,7 @@ FC_SETDOR
|
||||
;
|
||||
; SET FST_DCR
|
||||
;
|
||||
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2))
|
||||
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_SMBWDC))
|
||||
;
|
||||
FC_SETDCR
|
||||
LD (FST_DCR),A
|
||||
@@ -1205,10 +1221,10 @@ FC_RESETFDC:
|
||||
LD A,(FST_DOR)
|
||||
PUSH AF
|
||||
|
||||
#IF ((FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3))
|
||||
#IF ((FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3) | (FDMODE == FDMODE_SMBSMC))
|
||||
RES 7,A
|
||||
#ENDIF
|
||||
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2))
|
||||
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_SMBWDC))
|
||||
LD A,0
|
||||
#ENDIF
|
||||
CALL FC_SETDOR
|
||||
@@ -1223,7 +1239,7 @@ FC_RESETFDC:
|
||||
; PULSE TERMCT TO TERMINATE ANY ACTIVE EXECUTION PHASE
|
||||
;
|
||||
FC_PULSETC:
|
||||
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2)
|
||||
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_SMBWDC))
|
||||
IN A,(FDC_TC)
|
||||
#ELSE
|
||||
LD A,(FST_DOR)
|
||||
@@ -1245,7 +1261,7 @@ FC_MOTORON:
|
||||
LD DE,FDSTR_MOTON
|
||||
CALL WRITESTR
|
||||
#ENDIF
|
||||
#IF ((FDMODE == FDMODE_DIO) | (FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3))
|
||||
#IF ((FDMODE == FDMODE_DIO) | (FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3) | (FDMODE == FDMODE_SMBSMC))
|
||||
LD A,(FST_DOR)
|
||||
PUSH AF
|
||||
|
||||
@@ -1253,13 +1269,13 @@ FC_MOTORON:
|
||||
CALL FC_SETDOR ; AND IMPLEMENT IT
|
||||
|
||||
POP AF
|
||||
#IF ((FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3))
|
||||
#IF ((FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3) | (FDMODE == FDMODE_SMBSMC))
|
||||
XOR 00000010B ; MOTOR BIT INVERTED ON ZETA
|
||||
#ENDIF
|
||||
BIT 1,A ; SET FLAGS SET BASED ON CURRENT MOTOR BIT
|
||||
RET Z ; MOTOR WAS PREVIOUSLY ON, WE ARE DONE
|
||||
#ENDIF
|
||||
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2))
|
||||
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_SMBWDC))
|
||||
; SETUP DCR FOR DIDE HARDWARE
|
||||
LD A,(FCD_DCR) ; GET NEW DCR VALUE
|
||||
CALL FC_SETDCR ; AND IMPLEMENT IT
|
||||
|
||||
@@ -1299,7 +1299,6 @@ DIO_DISPATCH:
|
||||
PRTS("DIO<$")
|
||||
CALL REGDMP ; DUMP REGS, NONE DESTROYED
|
||||
RET
|
||||
DIO_DISPCALL:
|
||||
;
|
||||
#ENDIF ; *DEBUG* END
|
||||
;
|
||||
@@ -1307,31 +1306,34 @@ DIO_DISPCALL:
|
||||
; USE UNIT # IN C TO LOOKUP DIO_TBL ENTRY, THEN
|
||||
; CONVERT C TO THE DEVICE/DRIVER SPECIFIC UNIT ID
|
||||
; AND GET THE DEVICE TYPE TO A FOR DRIVER DISPATCHING
|
||||
; SETUP IY WITH DEVICE SPECIFIC DATA POINTER
|
||||
;
|
||||
LD A,C ; INCOMING UNIT INDEX TO A
|
||||
PUSH HL ; SAVE INCOMING HL
|
||||
LD HL,DIO_CNT ; HL := ADDRESS OF TABLE ENTRY COUNT
|
||||
CP (HL) ; COMPARE TO INCOMING ENTRY INDEX
|
||||
JR C,DIO_DISPATCH1 ; UNIT OK, PROCEED
|
||||
;
|
||||
; NOT GOOD, INCOMING UNIT IS OUT OF RANGE
|
||||
POP HL ; RESTORE HL/STACK
|
||||
CALL PANIC ; PANIC
|
||||
OR $FF ; SIGNAL ERROR
|
||||
RET ; AND RETURN
|
||||
;
|
||||
DIO_DISPATCH1:
|
||||
INC HL ; BUMP PAST COUNT PREFIX TO START OF TABLE
|
||||
RLCA ; MULTIPLY BY 4 TO
|
||||
RLCA ; ... TO CALC ENTRY OFFSET
|
||||
CALL ADDHLA ; HL := ENTRY OFFSET
|
||||
LD A,(HL) ; GET DEVICE TYPE BYTE
|
||||
INC HL ; BUMP TO DEVICE UNIT INDEX BYTE
|
||||
LD C,(HL) ; DEVICE UNIT INDEX TO C
|
||||
POP HL ; RECOVER INCOMING HL VALUE
|
||||
;
|
||||
; DISPATCH TO DRIVER BASED ON DEVICE TYPE IN A
|
||||
;
|
||||
DIO_DISPCALL:
|
||||
PUSH IY ; SAVE INCOMING IY
|
||||
|
||||
LD IY,DIO_DISPEXIT ; PRIME STACK WITH
|
||||
PUSH IY ; ... RETURN VECTOR
|
||||
|
||||
LD IY,DIO_TBL ; POINT IY TO START OF DIO TABLE
|
||||
LD A,C ; A := INCOMING DISK UNIT INDEX
|
||||
CP (IY-1) ; COMPARE TO COUNT
|
||||
JR NC,DIO_DISPERR ; HANDLE INVALID UNIT INDEX
|
||||
|
||||
PUSH DE ; SAVE DE
|
||||
RLCA ; MULTIPLY UNIT INDEX
|
||||
RLCA ; ... BY 4 (SIZE OF TABLE ENTRY)
|
||||
LD D,0 ; SET DE TO
|
||||
LD E,A ; ... TABLE ENTRY OFFSET
|
||||
ADD IY,DE ; APPLY OFFSET SO IY HAS ENTRY ADR
|
||||
EX DE,HL ; SAVE HL IN DE
|
||||
LD A,(IY+0) ; A := DEVICE TYPE
|
||||
LD C,(IY+1) ; C := DEVICE NUMBER
|
||||
LD L,(IY+2) ; HL := DATA BLOB ADDRESS
|
||||
LD H,(IY+3) ; ...
|
||||
EX (SP),HL ; RESTORE DE INTO HL, BLOB ADR TO TOS
|
||||
EX DE,HL ; ORIGINAL DE & HL RESTORED
|
||||
POP IY ; BLOB ADR TO IY
|
||||
|
||||
#IF (MDENABLE)
|
||||
CP DIODEV_MD
|
||||
JP Z,MD_DISPATCH
|
||||
@@ -1375,6 +1377,15 @@ DIO_DISPATCH1:
|
||||
CALL PANIC
|
||||
RET
|
||||
;
|
||||
DIO_DISPEXIT:
|
||||
POP IY ; RECOVER ORIGINAL INCOMING IY
|
||||
RET ; AND RETURN TO CALLER
|
||||
;
|
||||
DIO_DISPERR:
|
||||
CALL PANIC ; PANIC
|
||||
OR $FF ; SIGNAL ERROR
|
||||
RET ; AND RETURN
|
||||
;
|
||||
; CONVERT AN HBIOS STANDARD HARD DISK CHS ADDRESS TO
|
||||
; AN LBA ADDRESS. A STANDARD HBIOS HARD DISK IS ASSUMED
|
||||
; TO HAVE 16 SECTORS PER TRACK AND 16 HEADS PER CYLINDER.
|
||||
|
||||
@@ -3,8 +3,6 @@
|
||||
; HDSK DISK DRIVER
|
||||
;==================================================================================================
|
||||
;
|
||||
HDSK_UNITCNT .EQU 2 ; TWO VIRTUAL HARD DISKS
|
||||
;
|
||||
; IO PORT ADDRESSES
|
||||
;
|
||||
HDSK_IO .EQU $FD
|
||||
@@ -15,85 +13,131 @@ 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)
|
||||
;
|
||||
HDSK_CFGTBL:
|
||||
; DEVICE 0
|
||||
.DB 0 ; DEVICE NUMBER
|
||||
.DB 0 ; DEVICE STATUS
|
||||
.DW 0,0 ; CURRENT LBA
|
||||
; DEVICE 1
|
||||
.DB 1 ; DEVICE NUMBER
|
||||
.DB 0 ; DEVICE STATUS
|
||||
.DW 0,0 ; CURRENT LBA
|
||||
;
|
||||
#IF ($ - HDSK_CFGTBL) != (HDSK_DEVCNT * HDSK_CFGSIZ)
|
||||
.ECHO "*** INVALID HDSK CONFIG TABLE ***\n"
|
||||
#ENDIF
|
||||
;
|
||||
.DB $FF ; END MARKER
|
||||
;
|
||||
; STATUS
|
||||
;
|
||||
HDSKRC_OK .EQU 0
|
||||
HDSK_STOK .EQU 0 ; OK
|
||||
HDSK_STNOTRDY .EQU -1 ; NOT READY
|
||||
;
|
||||
;
|
||||
;
|
||||
HDSK_INIT:
|
||||
CALL NEWLINE ; FORMATTING
|
||||
PRTS("HDSK: UNITS=$")
|
||||
LD A,HDSK_UNITCNT
|
||||
PRTS("HDSK:$")
|
||||
PRTS(" DEVICES=$")
|
||||
LD A,HDSK_DEVCNT
|
||||
CALL PRTDECB
|
||||
;
|
||||
; SETUP THE DISPATCH TABLE ENTRIES
|
||||
;
|
||||
LD B,HDSK_UNITCNT ; LOOP CONTROL
|
||||
LD C,0 ; PHYSICAL UNIT INDEX
|
||||
XOR A ; ZERO ACCUM
|
||||
LD (HDSK_CURDEV),A ; SET CURRENT DEVICE NUM TO ZERO
|
||||
LD IY,HDSK_CFGTBL ; START OF DEV CFG TABLE
|
||||
HDSK_INIT0:
|
||||
PUSH BC ; SAVE LOOP CONTROL
|
||||
LD B,C ; PHYSICAL UNIT
|
||||
LD C,DIODEV_HDSK ; DEVICE TYPE
|
||||
LD DE,0 ; UNIT DATA BLOB ADDRESS
|
||||
CALL DIO_ADDENT ; ADD ENTRY, BC IS NOT DESTROYED
|
||||
POP BC ; RESTORE LOOP CONTROL
|
||||
INC C ; NEXT PHYSICAL UNIT
|
||||
DJNZ HDSK_INIT0 ; LOOP UNTIL DONE
|
||||
CALL HDSK_PROBE ; HARDWARE PROBE
|
||||
JR NZ,HDSK_INIT1 ; SKIP DEVICE IF NOT PRESENT
|
||||
LD A,(HDSK_CURDEV) ; GET CURRENT DEVICE
|
||||
LD (IY+HDSK_DEV),A ; POPULATE DEVICE FIELD OF CFG ENTRY
|
||||
LD B,A ; PUT IN B
|
||||
LD C,DIODEV_HDSK ; DEVICE TYPE TO C
|
||||
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 $FF
|
||||
JR NZ,HDSK_INIT0 ; IF NOT, LOOP
|
||||
;
|
||||
XOR A
|
||||
DEC A ; INITIAL STATUS IS NOT READY $FF
|
||||
LD (HDSK_STAT),A ; SAVE IT
|
||||
XOR A ; INIT SUCCEEDED
|
||||
RET ; RETURN
|
||||
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
|
||||
;
|
||||
;
|
||||
;
|
||||
HDSK_DISPATCH:
|
||||
; SAVE THE TARGET DEVICE/UNIT LOCALLY IN DRIVER
|
||||
LD A,C ; DEVICE/UNIT FROM C
|
||||
AND $0F ; ISOLATE UNIT NUM
|
||||
CP 2 ; CHECK FOR MAX UNIT EXCEEDED
|
||||
LD (HDSK_UNIT),A ; SAVE IT
|
||||
CALL NC,PANIC ; PANIC IF TOO HIGH
|
||||
;
|
||||
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
|
||||
LD A,B ; GET REQUESTED FUNCTION
|
||||
AND $0F ; ISOLATE SUB-FUNCTION
|
||||
JP Z,HDSK_STATUS ; SUB-FUNC 0: STATUS
|
||||
LD A,B ; GET REQUESTED FUNCTION
|
||||
AND $0F ; ISOLATE SUB-FUNCTION
|
||||
JP Z,HDSK_STATUS ; SUB-FUNC 0: STATUS
|
||||
DEC A
|
||||
JP Z,HDSK_RESET ; SUB-FUNC 1: RESET
|
||||
JP Z,HDSK_RESET ; SUB-FUNC 1: RESET
|
||||
DEC A
|
||||
JP Z,HDSK_SEEK ; SUB-FUNC 2: SEEK
|
||||
JP Z,HDSK_SEEK ; SUB-FUNC 2: SEEK
|
||||
DEC A
|
||||
JP Z,HDSK_READ ; SUB-FUNC 3: READ SECTORS
|
||||
JP Z,HDSK_READ ; SUB-FUNC 3: READ SECTORS
|
||||
DEC A
|
||||
JP Z,HDSK_WRITE ; SUB-FUNC 4: WRITE SECTORS
|
||||
JP Z,HDSK_WRITE ; SUB-FUNC 4: WRITE SECTORS
|
||||
DEC A
|
||||
JP Z,HDSK_VERIFY ; SUB-FUNC 5: VERIFY SECTORS
|
||||
JP Z,HDSK_VERIFY ; SUB-FUNC 5: VERIFY SECTORS
|
||||
DEC A
|
||||
JP Z,HDSK_FORMAT ; SUB-FUNC 6: FORMAT TRACK
|
||||
JP Z,HDSK_FORMAT ; SUB-FUNC 6: FORMAT TRACK
|
||||
DEC A
|
||||
JP Z,HDSK_DEVICE ; SUB-FUNC 7: DEVICE REPORT
|
||||
JP Z,HDSK_DEVICE ; SUB-FUNC 7: DEVICE REPORT
|
||||
DEC A
|
||||
JP Z,HDSK_MEDIA ; SUB-FUNC 8: MEDIA REPORT
|
||||
JP Z,HDSK_MEDIA ; SUB-FUNC 8: MEDIA REPORT
|
||||
DEC A
|
||||
JP Z,HDSK_DEFMED ; SUB-FUNC 9: DEFINE MEDIA
|
||||
JP Z,HDSK_DEFMED ; SUB-FUNC 9: DEFINE MEDIA
|
||||
DEC A
|
||||
JP Z,HDSK_CAP ; SUB-FUNC 10: REPORT CAPACITY
|
||||
JP Z,HDSK_CAP ; SUB-FUNC 10: REPORT CAPACITY
|
||||
DEC A
|
||||
JP Z,HDSK_GEOM ; SUB-FUNC 11: REPORT GEOMETRY
|
||||
JP Z,HDSK_GEOM ; SUB-FUNC 11: REPORT GEOMETRY
|
||||
;
|
||||
HDSK_VERIFY:
|
||||
HDSK_FORMAT:
|
||||
HDSK_DEFMED:
|
||||
CALL PANIC ; INVALID SUB-FUNCTION
|
||||
CALL PANIC ; INVALID SUB-FUNCTION
|
||||
;
|
||||
;
|
||||
;
|
||||
HDSK_STATUS:
|
||||
LD A,(HDSK_STAT) ; LOAD STATUS
|
||||
OR A ; SET FLAGS
|
||||
LD A,(IY+HDSK_STAT) ; LOAD STATUS
|
||||
OR A ; SET FLAGS
|
||||
RET
|
||||
;
|
||||
;
|
||||
@@ -129,10 +173,10 @@ HDSK_GEOM:
|
||||
;
|
||||
;
|
||||
HDSK_DEVICE:
|
||||
LD D,DIODEV_HDSK ; D := DEVICE TYPE
|
||||
LD E,C ; E := PHYSICAL UNIT
|
||||
LD C,%00000000 ; C := ATTRIBUTES, NON-REMOVABLE HARD DISK
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
LD D,DIODEV_HDSK ; D := DEVICE TYPE
|
||||
LD E,(IY+HDSK_DEV) ; E := PHYSICAL DEVICE NUMBER
|
||||
LD C,%00000000 ; C := ATTRIBUTES, NON-REMOVABLE HARD DISK
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
;
|
||||
@@ -149,8 +193,10 @@ 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 BC,HSTLBA ; POINT TO LBA STORAGE
|
||||
CALL ST32 ; SAVE LBA ADDRESS
|
||||
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
|
||||
;
|
||||
@@ -176,12 +222,11 @@ HDSK_RW:
|
||||
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,(HDSK_UNIT) ; GET UNIT
|
||||
;AND $0F
|
||||
LD (HDSK_DEV),A ; ... AND SAVE IT
|
||||
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,(HDSK_STAT) ; GET CURRENT STATUS
|
||||
LD A,(IY+HDSK_STAT) ; GET CURRENT STATUS
|
||||
OR A ; SET FLAGS
|
||||
PUSH BC ; SAVE COUNTERS
|
||||
CALL NZ,HDSK_DSKRESET ; RESET IF NOT READY
|
||||
@@ -196,68 +241,82 @@ HDSK_RW0:
|
||||
; CONVERT LBA HHHH:LLLL (4 BYTES)
|
||||
; TO HDSK TRACK/SECTOR TTTT:SS (3 BYTES)
|
||||
; SAVING TO HDSK PARM BLOCK
|
||||
LD A,(HSTLBA) ; LSB OF LBA
|
||||
LD (HDSK_SEC),A ; ... SAVED TO SECTOR
|
||||
LD HL,(HSTLBA+1) ; 2 MIDDLE BYTES OF LBA
|
||||
LD (HDSK_TRK),HL ; ... SAVE TO TRACK
|
||||
|
||||
; (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
|
||||
|
||||
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
|
||||
|
||||
IN A,(C) ; GET RESULT CODE
|
||||
LD (HDSK_RC),A ; SAVE IT
|
||||
OR A ; SET FLAGS
|
||||
|
||||
#IF (HDSKTRACE > 0)
|
||||
PUSH AF ; SAVE RETURN CODE
|
||||
PUSH AF ; SAVE RETURN CODE
|
||||
#IF (HDSKTRACE == 1)
|
||||
CALL NZ,HDSK_PRT ; DIAGNOSE ERRORS ONLY
|
||||
CALL NZ,HDSK_PRT ; DIAGNOSE ERRORS ONLY
|
||||
#ENDIF
|
||||
#IF (HDSKTRACE >= 2)
|
||||
CALL HDSK_PRT ; DISPLAY ALL READ/WRITE RESULTS
|
||||
CALL HDSK_PRT ; DISPLAY ALL READ/WRITE RESULTS
|
||||
#ENDIF
|
||||
POP AF ; RESTORE RETURN CODE
|
||||
POP AF ; RESTORE RETURN CODE
|
||||
#ENDIF
|
||||
|
||||
JR NZ,HDSK_RW5 ; BAIL OUT ON ERROR
|
||||
JR NZ,HDSK_RW5 ; BAIL OUT ON ERROR
|
||||
|
||||
; INCREMENT LBA
|
||||
LD HL,HSTLBA
|
||||
PUSH HL
|
||||
CALL LD32
|
||||
CALL INC32
|
||||
POP BC
|
||||
CALL ST32
|
||||
|
||||
LD A,HDSK_LBA ; OFFSET OF LBA IN DEV CFG
|
||||
PUSH IY ; COPY IT
|
||||
POP HL ; ... TO HL
|
||||
CALL ADDHLA ; SET HL := LBA ADDRESS
|
||||
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
|
||||
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
|
||||
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 ; AND RETURN, A HAS RETURN CODE
|
||||
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 ; AND RETURN, A HAS RETURN CODE
|
||||
;
|
||||
;
|
||||
;
|
||||
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:
|
||||
@@ -265,16 +324,7 @@ HDSK_DSKRESET1:
|
||||
DJNZ HDSK_DSKRESET1
|
||||
|
||||
XOR A ; STATUS = OK
|
||||
LD (HDSK_STAT),A ; SAVE IT
|
||||
|
||||
#IF (HDSKTRACE >= 2)
|
||||
CALL NEWLINE
|
||||
LD DE,HDSKSTR_PREFIX
|
||||
CALL WRITESTR
|
||||
CALL PC_SPACE
|
||||
LD DE,HDSKSTR_RESET
|
||||
CALL WRITESTR
|
||||
#ENDIF
|
||||
LD (IY+HDSK_STAT),A ; SAVE IT
|
||||
|
||||
RET
|
||||
;
|
||||
@@ -283,9 +333,9 @@ HDSK_DSKRESET1:
|
||||
HDSK_PRT:
|
||||
CALL NEWLINE
|
||||
|
||||
LD DE,HDSKSTR_PREFIX
|
||||
LD DE,HDSKSTR_PREFIX
|
||||
CALL WRITESTR
|
||||
|
||||
|
||||
CALL PC_SPACE
|
||||
LD DE,HDSKSTR_CMD
|
||||
CALL WRITESTR
|
||||
@@ -311,7 +361,7 @@ HDSK_PRT:
|
||||
CP HDSK_CMDPARAM
|
||||
JP Z,HDSK_PRTCMD
|
||||
LD DE,HDSKSTR_UNKCMD
|
||||
HDSK_PRTCMD:
|
||||
HDSK_PRTCMD:
|
||||
CALL WRITESTR
|
||||
CALL PC_RBKT
|
||||
|
||||
@@ -324,7 +374,7 @@ HDSK_PRTCMD:
|
||||
|
||||
HDSK_PRTRW:
|
||||
CALL PC_SPACE
|
||||
LD A,(HDSK_DEV)
|
||||
LD A,(HDSK_DRV)
|
||||
CALL PRTHEXBYTE
|
||||
CALL PC_SPACE
|
||||
LD BC,(HDSK_TRK)
|
||||
@@ -349,12 +399,12 @@ HDSK_PRTRW:
|
||||
CALL PC_SPACE
|
||||
CALL PC_LBKT
|
||||
LD A,(HDSK_RC)
|
||||
LD DE,HDSKSTR_RCOK
|
||||
CP HDSKRC_OK
|
||||
LD DE,HDSKSTR_STOK
|
||||
CP HDSK_STOK
|
||||
JP Z,HDSK_PRTRC
|
||||
LD DE,HDSKSTR_RCUNK
|
||||
LD DE,HDSKSTR_STUNK
|
||||
|
||||
HDSK_PRTRC:
|
||||
HDSK_PRTRC:
|
||||
CALL WRITESTR
|
||||
CALL PC_RBKT
|
||||
|
||||
@@ -372,21 +422,19 @@ HDSKSTR_READ .TEXT "READ$"
|
||||
HDSKSTR_WRITE .TEXT "WRITE$"
|
||||
HDSKSTR_PARAM .TEXT "PARAM$"
|
||||
HDSKSTR_UNKCMD .TEXT "UNKCMD$"
|
||||
HDSKSTR_RCOK .TEXT "OK$"
|
||||
HDSKSTR_RCUNK .TEXT "UNKNOWN ERROR$"
|
||||
HDSKSTR_STOK .TEXT "OK$"
|
||||
HDSKSTR_STUNK .TEXT "UNKNOWN ERROR$"
|
||||
;
|
||||
;==================================================================================================
|
||||
; HDSK DISK DRIVER - DATA
|
||||
;==================================================================================================
|
||||
;
|
||||
HDSK_STAT .DB 0
|
||||
HDSK_RC .DB 0
|
||||
;
|
||||
HDSK_UNIT .DB 0
|
||||
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_DEV .DB 0 ; 0..7, HARD DISK UNIT
|
||||
HDSK_SEC .DB 0 ; 0..255 SECTOR
|
||||
HDSK_TRK .DW 0 ; 0..2047 TRACK
|
||||
HDSK_DMA .DW 0 ; DEFINES WHERE RESULT IS PLACED IN MEMORY
|
||||
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
|
||||
|
||||
@@ -107,15 +107,18 @@
|
||||
; IDE3: SECONDARY SLAVE
|
||||
;
|
||||
IDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE
|
||||
IDE_IO_BASE .EQU $20 ; DEFAULT IO BASE (NOTE OVERRIDES BELOW)
|
||||
;
|
||||
#IF (IDEMODE == IDEMODE_MK4)
|
||||
IDE_IO_BASE .EQU MK4_IDE
|
||||
IDE_IO_BASE .SET MK4_IDE
|
||||
#ENDIF
|
||||
|
||||
#IF (IDEMODE == IDEMODE_RC)
|
||||
IDE_IO_BASE .EQU $10
|
||||
IDE_IO_BASE .SET $10
|
||||
#ENDIF
|
||||
#IF ((IDEMODE != IDEMODE_MK4) & (IDEMODE != IDEMODE_RC))
|
||||
IDE_IO_BASE .EQU $20
|
||||
|
||||
#IF (IDEMODE == IDEMODE_SMB)
|
||||
IDE_IO_BASE .SET $E0
|
||||
#ENDIF
|
||||
|
||||
#IF ((IDEMODE == IDEMODE_DIO) | (IDEMODE == IDEMODE_MK4))
|
||||
@@ -138,7 +141,7 @@ IDE_IO_DMA .EQU $IDE_IO_BASE + $09 ; DATA PORT (16 BIT DMA LO/HI BYTES) (R/W)
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
;
|
||||
#IF (IDEMODE == IDEMODE_RC)
|
||||
#IF ((IDEMODE == IDEMODE_RC) | (IDEMODE == IDEMODE_SMB))
|
||||
IDE_UNITCNT .SET 1 ; RC2014 COMPACT FLASH SUPPORTS ONLY 1 DEVICE
|
||||
IDE_IO_DATA .EQU $IDE_IO_BASE + $00 ; DATA PORT (8 BIT) (R/W)
|
||||
#ENDIF
|
||||
@@ -399,22 +402,21 @@ IDE_DEFMED:
|
||||
;
|
||||
;
|
||||
IDE_READ:
|
||||
LD (IDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
LD HL,IDE_RDSEC ; GET ADR OF SECTOR READ FUNC
|
||||
LD (IDE_IOFNADR),HL ; SAVE IT AS PENDING IO FUNC
|
||||
LD BC,IDE_RDSEC ; GET ADR OF SECTOR READ FUNC
|
||||
LD (IDE_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC
|
||||
JR IDE_IO ; CONTINUE TO GENERIC IO ROUTINE
|
||||
;
|
||||
;
|
||||
;
|
||||
IDE_WRITE:
|
||||
LD (IDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
LD HL,IDE_WRSEC ; GET ADR OF SECTOR WRITE FUNC
|
||||
LD (IDE_IOFNADR),HL ; SAVE IT AS PENDING IO FUNC
|
||||
LD BC,IDE_WRSEC ; GET ADR OF SECTOR WRITE FUNC
|
||||
LD (IDE_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC
|
||||
JR IDE_IO ; CONTINUE TO GENERIC IO ROUTINE
|
||||
;
|
||||
;
|
||||
;
|
||||
IDE_IO:
|
||||
LD (IDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
LD A,E ; BLOCK COUNT TO A
|
||||
OR A ; SET FLAGS
|
||||
RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0
|
||||
@@ -428,7 +430,7 @@ IDE_IO:
|
||||
CALL IDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT
|
||||
CALL IDE_CHKDEVICE ; CHECK DEVICE AND CLEAR STATUS
|
||||
POP BC ; RESTORE COUNTERS
|
||||
RET NZ
|
||||
JR NZ,IDE_IO3 ; BAIL OUT ON ERROR
|
||||
IDE_IO1:
|
||||
PUSH BC ; SAVE COUNTERS
|
||||
LD HL,(IDE_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS
|
||||
@@ -795,7 +797,7 @@ IDE_RESET:
|
||||
OUT (MK4_XAR),A
|
||||
#ENDIF
|
||||
|
||||
#IF (IDEMODE == IDEMODE_RC)
|
||||
#IF ((IDEMODE == IDEMODE_RC) | (IDEMODE == IDEMODE_SMB))
|
||||
; RC2014 CANNOT ADDRESS THE DEVICE CONTROL PORT AND
|
||||
; HAS NO WAY TO PERFORM A HARD RESET FROM SOFTWARE,
|
||||
; SO FAKE IT BY SETTING THE REGISTERS TO THE SAME
|
||||
@@ -808,7 +810,7 @@ IDE_RESET:
|
||||
OUT (IDE_IO_SECT),A
|
||||
#ENDIF
|
||||
|
||||
#IF ((IDEMODE != IDEMODE_MK4) & (IDEMODE != IDEMODE_RC))
|
||||
#IF ((IDEMODE != IDEMODE_MK4) & (IDEMODE != IDEMODE_RC) & (IDEMODE != IDEMODE_SMB))
|
||||
; INITIATE SOFT RESET
|
||||
LD A,%00001110 ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES
|
||||
OUT (IDE_IO_CTRL),A
|
||||
@@ -817,7 +819,7 @@ IDE_RESET:
|
||||
LD DE,2 ; DELAY 32US (SPEC IS >= 25US)
|
||||
CALL VDELAY
|
||||
;
|
||||
#IF (IDEMODE != IDEMODE_RC)
|
||||
#IF ((IDEMODE != IDEMODE_RC) & (IDEMODE != IDEMODE_SMB))
|
||||
; CONFIGURE OPERATION AND END SOFT RESET
|
||||
LD A,%00001010 ; NO INTERRUPTS, DEASSERT RESET
|
||||
OUT (IDE_IO_CTRL),A ; PUSH TO REGISTER
|
||||
|
||||
@@ -167,11 +167,66 @@ MD_SEEK:
|
||||
CALL ST32 ; SAVE LBA ADDRESS
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND RETURN
|
||||
|
||||
;
|
||||
;
|
||||
;
|
||||
MD_READ:
|
||||
LD (MD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
LD BC,MD_RDSEC ; GET ADR OF SECTOR READ FUNC
|
||||
LD (MD_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC
|
||||
JR MD_RW ; CONTINUE TO GENERIC R/W ROUTINE
|
||||
|
||||
;
|
||||
;
|
||||
;
|
||||
MD_WRITE:
|
||||
LD BC,MD_WRSEC ; GET ADR OF SECTOR WRITE FUNC
|
||||
LD (MD_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC
|
||||
LD A,(MD_UNIT) ; GET UNIT NUMBER
|
||||
OR A ; SET FLAGS TO TEST FOR ROM (UNIT 0)
|
||||
JR NZ,MD_RW ; NOT ROM, SO OK TO WRITE, CONTINUE
|
||||
LD E,0 ; UNIT IS READ ONLY, ZERO SECTORS WRITTEN
|
||||
OR $FF ; SIGNAL ERROR
|
||||
RET ; AND DONE
|
||||
;
|
||||
;
|
||||
;
|
||||
MD_RW:
|
||||
LD (MD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
LD A,E ; BLOCK 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
|
||||
MD_RW1:
|
||||
PUSH BC ; SAVE COUNTERS
|
||||
LD HL,(MD_RWFNADR) ; GET PENDING IO FUNCTION ADDRESS
|
||||
CALL JPHL ; ... AND CALL IT
|
||||
JR NZ,MD_RW2 ; IF ERROR, SKIP INCREMENT
|
||||
LD HL,HSTLBA ; POINT TO 32-BIT CURRENT LBA
|
||||
PUSH HL ; SAVE POINTER
|
||||
CALL LD32 ; LOAD 32-BIT LBA INTO DE:HL
|
||||
CALL INC32 ; INCREMENT LBA FOR NEXT I/O
|
||||
POP BC ; RECOVER LBA POINTER INTO BC
|
||||
CALL ST32 ; AND SAVE IT
|
||||
LD HL,MD_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR
|
||||
INC (HL) ; BUMP DMA BY
|
||||
INC (HL) ; ... 512 BYTES
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
MD_RW2:
|
||||
POP BC ; RECOVER COUNTERS
|
||||
JR NZ,MD_RW3 ; IF ERROR, BAIL OUT
|
||||
INC C ; BUMP COUNT OF SECTORS READ
|
||||
DJNZ MD_RW1 ; LOOP AS NEEDED
|
||||
MD_RW3:
|
||||
LD E,C ; SECTOR READ COUNT TO E
|
||||
LD HL,(MD_DSKBUF) ; CURRENT DMA TO HL
|
||||
OR A ; SET FLAGS BASED ON RETURN CODE
|
||||
RET ; AND RETURN, A HAS RETURN CODE
|
||||
;
|
||||
;
|
||||
;
|
||||
MD_RDSEC:
|
||||
CALL MD_IOSETUP ; SETUP FOR MEMORY COPY
|
||||
#IF (MDTRACE >= 2)
|
||||
LD (MD_SRC),HL
|
||||
@@ -196,13 +251,7 @@ MD_READ:
|
||||
;
|
||||
;
|
||||
;
|
||||
MD_WRITE:
|
||||
LD (MD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
LD A,C ; DEVICE/UNIT IS IN C
|
||||
AND $0F ; ISOLATE UNIT NUM
|
||||
LD A,1 ; PREPARE TO RETURN FALSE
|
||||
RET Z ; RETURN ERROR IF ROM UNIT
|
||||
|
||||
MD_WRSEC:
|
||||
CALL MD_IOSETUP ; SETUP FOR MEMORY COPY
|
||||
EX DE,HL ; SWAP SRC/DEST FOR WRITE
|
||||
#IF (MDTRACE >= 2)
|
||||
@@ -335,6 +384,8 @@ MD_PRT:
|
||||
;
|
||||
;
|
||||
;
|
||||
MD_RWFNADR .DW 0
|
||||
;
|
||||
MD_UNIT .DB 0
|
||||
MD_DSKBUF .DW 0
|
||||
;
|
||||
|
||||
@@ -17,10 +17,6 @@ PPIDE_IO_BASE .EQU $60
|
||||
PPIDE_IO_BASE .EQU $20
|
||||
#ENDIF
|
||||
;
|
||||
#IF (PPIDEMODE == PPIDEMODE_SMB)
|
||||
PPIDE_IO_BASE .EQU $E0
|
||||
#ENDIF
|
||||
;
|
||||
#IF (PPIDEMODE == PPIDEMODE_MFP)
|
||||
PPIDE_IO_BASE .EQU $44
|
||||
#ENDIF
|
||||
@@ -417,22 +413,21 @@ PPIDE_DEFMED:
|
||||
;
|
||||
;
|
||||
PPIDE_READ:
|
||||
LD (PPIDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
LD HL,PPIDE_RDSEC ; GET ADR OF SECTOR READ FUNC
|
||||
LD (PPIDE_IOFNADR),HL ; SAVE IT AS PENDING IO FUNC
|
||||
LD BC,PPIDE_RDSEC ; GET ADR OF SECTOR READ FUNC
|
||||
LD (PPIDE_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC
|
||||
JR PPIDE_IO ; CONTINUE TO GENERIC IO ROUTINE
|
||||
;
|
||||
;
|
||||
;
|
||||
PPIDE_WRITE:
|
||||
LD (PPIDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
LD HL,PPIDE_WRSEC ; GET ADR OF SECTOR WRITE FUNC
|
||||
LD (PPIDE_IOFNADR),HL ; SAVE IT AS PENDING IO FUNC
|
||||
LD BC,PPIDE_WRSEC ; GET ADR OF SECTOR WRITE FUNC
|
||||
LD (PPIDE_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC
|
||||
JR PPIDE_IO ; CONTINUE TO GENERIC IO ROUTINE
|
||||
;
|
||||
;
|
||||
;
|
||||
PPIDE_IO:
|
||||
LD (PPIDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
LD A,E ; BLOCK COUNT TO A
|
||||
OR A ; SET FLAGS
|
||||
RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0
|
||||
@@ -446,7 +441,7 @@ PPIDE_IO:
|
||||
CALL PPIDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT
|
||||
CALL PPIDE_CHKDEVICE ; CHECK DEVICE AND CLEAR STATUS
|
||||
POP BC ; RESTORE COUNTERS
|
||||
RET NZ
|
||||
JR NZ,PPIDE_IO3 ; BAIL OUT ON ERROR
|
||||
PPIDE_IO1:
|
||||
PUSH BC ; SAVE COUNTERS
|
||||
LD HL,(PPIDE_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS
|
||||
|
||||
@@ -462,31 +462,85 @@ PPPSD_FORMAT:
|
||||
PPPSD_DEFMED:
|
||||
CALL PANIC ; INVALID SUB-FUNCTION
|
||||
;
|
||||
; READ AN LBA BLOCK FROM THE SD CARD
|
||||
;
|
||||
;
|
||||
PPPSD_READ:
|
||||
LD BC,PPPSD_RDSEC ; GET ADR OF SECTOR READ FUNC
|
||||
LD (PPPSD_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC
|
||||
JR PPPSD_IO ; CONTINUE TO GENERIC IO ROUTINE
|
||||
;
|
||||
;
|
||||
;
|
||||
PPPSD_WRITE:
|
||||
LD BC,PPPSD_WRSEC ; GET ADR OF SECTOR READ FUNC
|
||||
LD (PPPSD_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC
|
||||
JR PPPSD_IO ; CONTINUE TO GENERIC IO ROUTINE
|
||||
;
|
||||
;
|
||||
;
|
||||
PPPSD_IO:
|
||||
LD (PPPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
LD A,E ; BLOCK 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 R/W COUNTER
|
||||
|
||||
#IF (PPPSDTRACE == 1)
|
||||
LD HL,PPPSD_PRTERR ; SET UP PPPSD_PRTERR
|
||||
PUSH HL ; ... TO FILTER ALL EXITS
|
||||
#ENDIF
|
||||
|
||||
PUSH BC ; SAVE COUNTERS
|
||||
CALL PPPSD_CHKCARD ; CHECK / REINIT CARD AS NEEDED
|
||||
RET NZ ; BAIL OUT ON ERROR
|
||||
POP BC ; RESTORE COUNTERS
|
||||
JR NZ,PPPSD_IO3 ; BAIL OUT ON ERROR
|
||||
|
||||
PPPSD_IO1:
|
||||
PUSH BC ; SAVE COUNTERS
|
||||
|
||||
#IF (PPPSDTRACE >= 3)
|
||||
CALL PPPSD_PRTPREFIX
|
||||
#ENDIF
|
||||
|
||||
LD HL,(PPPSD_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS
|
||||
CALL JPHL ; ... AND CALL IT
|
||||
JR NZ,PPPSD_IO2 ; BAIL OUT ON ERROR
|
||||
|
||||
LD HL,HSTLBA ; POINT TO 32-BIT CURRENT LBA
|
||||
PUSH HL ; SAVE POINTER
|
||||
CALL LD32 ; LOAD 32-BIT LBA INTO DE:HL
|
||||
CALL INC32 ; INCREMENT LBA FOR NEXT I/O
|
||||
POP BC ; RECOVER LBA POINTER INTO BC
|
||||
CALL ST32 ; AND SAVE IT
|
||||
LD HL,PPPSD_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR
|
||||
INC (HL) ; BUMP DMA BY
|
||||
INC (HL) ; ... 512 BYTES
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
|
||||
PPPSD_IO2:
|
||||
POP BC ; RECOVER COUNTERS
|
||||
JR NZ,PPPSD_IO3 ; IF ERROR PENDING, BAIL OUT
|
||||
INC C ; BUMP COUNT OF SECTORS READ
|
||||
DJNZ PPPSD_IO1 ; LOOP AS NEEDED
|
||||
|
||||
PPPSD_IO3:
|
||||
LD E,C ; SECTOR READ COUNT TO E
|
||||
LD HL,(PPPSD_DSKBUF) ; CURRENT BUF ADR TO HL
|
||||
OR A ; SET FLAGS
|
||||
RET ; RETURN WITH A = STATUS
|
||||
;
|
||||
;
|
||||
;
|
||||
PPPSD_RDSEC:
|
||||
;
|
||||
#IF (PPPSDTRACE >= 3)
|
||||
PRTS(" READ$")
|
||||
#ENDIF
|
||||
|
||||
; READ A SECTOR
|
||||
LD D,PPP_CMDDSKRD ; COMMAND = DSKRD
|
||||
CALL PPP_SNDCMD ; SEND COMMAND
|
||||
RET NZ
|
||||
LD D,PPP_CMDDSKRD ; READ COMMAND
|
||||
CALL PPP_SNDCMD ; ... AND SEND COMMAND
|
||||
RET NZ ; BAIL OUT ON ERROR
|
||||
|
||||
CALL PPPSD_SENDBLK ; SEND THE LBA BLOCK NUMBER
|
||||
CALL PPP_GETBYTE ; GET READ RESULT
|
||||
@@ -496,52 +550,39 @@ PPPSD_READ:
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
|
||||
|
||||
OR A ; SET FLAGS
|
||||
JR Z,PPPSD_READ1
|
||||
|
||||
JR Z,PPPSD_RDSEC1
|
||||
|
||||
; HANDLE ERROR
|
||||
CALL PPPSD_GETDSKSTAT ; GET FULL ERROR CODE
|
||||
JP PPPSD_ERRCMD ; HANDLE ERRORS
|
||||
|
||||
PPPSD_READ1:
|
||||
JP PPPSD_ERRCMD ; RETURN VIA ERROR HANDLER
|
||||
|
||||
PPPSD_RDSEC1:
|
||||
; GET THE SECTOR DATA
|
||||
LD D,PPP_CMDDSKGET ; COMMAND = DSKGET
|
||||
CALL PPP_SNDCMD ; SEND COMMAND
|
||||
RET NZ
|
||||
RET NZ ; BAIL OUT ON ERROR
|
||||
|
||||
; READ THE SECTOR DATA
|
||||
LD BC,512
|
||||
LD HL,(PPPSD_DSKBUF)
|
||||
PPPSD_READ2:
|
||||
PPPSD_RDSEC2:
|
||||
CALL PPP_GETBYTE
|
||||
LD (HL),A
|
||||
INC HL
|
||||
DEC BC
|
||||
LD A,B
|
||||
OR C
|
||||
JP NZ,PPPSD_READ2
|
||||
JP NZ,PPPSD_RDSEC2
|
||||
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
; WRITE AN LBA BLOCK TO THE SD CARD
|
||||
;
|
||||
PPPSD_WRITE:
|
||||
LD (PPPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
|
||||
#IF (PPPSDTRACE == 1)
|
||||
LD HL,PPPSD_PRTERR ; SET UP PPPSD_PRTERR
|
||||
PUSH HL ; ... TO FILTER ALL EXITS
|
||||
#ENDIF
|
||||
|
||||
CALL PPPSD_CHKCARD ; CHECK / REINIT CARD AS NEEDED
|
||||
RET NZ ; BAIL OUT ON ERROR
|
||||
|
||||
#IF (PPPSDTRACE >= 3)
|
||||
CALL PPPSD_PRTPREFIX
|
||||
#ENDIF
|
||||
|
||||
;
|
||||
PPPSD_WRSEC:
|
||||
;
|
||||
#IF (PPPSDTRACE >= 3)
|
||||
PRTS(" WRITE$")
|
||||
#ENDIF
|
||||
@@ -554,14 +595,14 @@ PPPSD_WRITE:
|
||||
; SEND OVER THE SECTOR CONTENTS
|
||||
LD BC,512
|
||||
LD HL,(PPPSD_DSKBUF)
|
||||
PPPSD_WRITE1:
|
||||
PPPSD_WRSEC1:
|
||||
LD A,(HL)
|
||||
INC HL
|
||||
CALL PPP_PUTBYTE
|
||||
DEC BC
|
||||
LD A,B
|
||||
OR C
|
||||
JP NZ,PPPSD_WRITE1
|
||||
JP NZ,PPPSD_WRSEC1
|
||||
|
||||
; WRITE THE SECTOR
|
||||
LD D,PPP_CMDDSKWR ; COMMAND = DSKWR
|
||||
@@ -1048,6 +1089,8 @@ PPPSD_STR_TYPESDXC .TEXT "SDXC$"
|
||||
; DATA STORAGE
|
||||
;=============================================================================
|
||||
;
|
||||
PPPSD_IOFNADR .DW 0 ; PENDING IO FUNCTION ADDRESS
|
||||
;
|
||||
PPPSD_UNIT .DB 0
|
||||
PPPSD_DSKBUF .DW 0
|
||||
;
|
||||
|
||||
@@ -361,87 +361,124 @@ PRPSD_DEFMED:
|
||||
;
|
||||
;
|
||||
PRPSD_READ:
|
||||
LD BC,PRPSD_RDSEC ; GET ADR OF SECTOR READ FUNC
|
||||
LD (PRPSD_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC
|
||||
JR PRPSD_IO ; CONTINUE TO GENERIC IO ROUTINE
|
||||
;
|
||||
;
|
||||
;
|
||||
PRPSD_WRITE:
|
||||
LD BC,PRPSD_WRSEC ; GET ADR OF SECTOR READ FUNC
|
||||
LD (PRPSD_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC
|
||||
JR PRPSD_IO ; CONTINUE TO GENERIC IO ROUTINE
|
||||
;
|
||||
;
|
||||
;
|
||||
PRPSD_IO:
|
||||
LD (PRPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
LD A,E ; BLOCK 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 R/W COUNTER
|
||||
|
||||
#IF (PRPSDTRACE == 1)
|
||||
LD HL,PRPSD_PRTERR ; SET UP PRPSD_PRTERR
|
||||
PUSH HL ; ... TO FILTER ALL EXITS
|
||||
#ENDIF
|
||||
|
||||
PUSH BC ; SAVE COUNTERS
|
||||
CALL PRPSD_CHKCARD ; CHECK / REINIT CARD AS NEEDED
|
||||
RET NZ ; BAIL OUT ON ERROR
|
||||
POP BC ; RESTORE COUNTERS
|
||||
JR NZ,PRPSD_IO3 ; BAIL OUT ON ERROR
|
||||
|
||||
PRPSD_IO1:
|
||||
PUSH BC ; SAVE COUNTERS
|
||||
|
||||
#IF (PRPSDTRACE >= 3)
|
||||
CALL PRPSD_PRTPREFIX
|
||||
#ENDIF
|
||||
|
||||
#IF (PRPSDTRACE >= 3)
|
||||
PRTS(" READ$")
|
||||
#ENDIF
|
||||
LD HL,(PRPSD_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS
|
||||
CALL JPHL ; ... AND CALL IT
|
||||
JR NZ,PRPSD_IO2 ; BAIL OUT ON ERROR
|
||||
|
||||
;LD DE,$FFFF
|
||||
;LD HL,$FFFF
|
||||
;LD BC,HSTLBA
|
||||
;CALL ST32
|
||||
LD HL,HSTLBA ; POINT TO 32-BIT CURRENT LBA
|
||||
PUSH HL ; SAVE POINTER
|
||||
CALL LD32 ; LOAD 32-BIT LBA INTO DE:HL
|
||||
CALL INC32 ; INCREMENT LBA FOR NEXT I/O
|
||||
POP BC ; RECOVER LBA POINTER INTO BC
|
||||
CALL ST32 ; AND SAVE IT
|
||||
LD HL,PRPSD_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR
|
||||
INC (HL) ; BUMP DMA BY
|
||||
INC (HL) ; ... 512 BYTES
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
|
||||
CALL PRPSD_SETBLK
|
||||
|
||||
LD A,PRPSD_CMDREAD
|
||||
CALL PRPSD_SNDCMD
|
||||
RET NZ ; RETURN ON FAILURE, A = STATUS
|
||||
|
||||
LD C,PRPSD_DSKIO
|
||||
LD B,0
|
||||
LD HL,(PRPSD_DSKBUF)
|
||||
INIR
|
||||
INIR
|
||||
PRPSD_IO2:
|
||||
POP BC ; RECOVER COUNTERS
|
||||
JR NZ,PRPSD_IO3 ; IF ERROR PENDING, BAIL OUT
|
||||
INC C ; BUMP COUNT OF SECTORS READ
|
||||
DJNZ PRPSD_IO1 ; LOOP AS NEEDED
|
||||
|
||||
PRPSD_IO3:
|
||||
LD E,C ; SECTOR READ COUNT TO E
|
||||
LD HL,(PRPSD_DSKBUF) ; CURRENT BUF ADR TO HL
|
||||
OR A ; SET FLAGS
|
||||
RET ; RETURN WITH A = STATUS
|
||||
;
|
||||
;
|
||||
;
|
||||
PRPSD_WRITE:
|
||||
LD (PRPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
|
||||
#IF (PRPSDTRACE == 1)
|
||||
LD HL,PRPSD_PRTERR ; SET UP PRPSD_PRTERR
|
||||
PUSH HL ; ... TO FILTER ALL EXITS
|
||||
#ENDIF
|
||||
|
||||
CALL PRPSD_CHKCARD ; CHECK / REINIT CARD AS NEEDED
|
||||
RET NZ ; BAIL OUT ON ERROR
|
||||
PRPSD_RDSEC:
|
||||
;
|
||||
CALL PRPSD_SETBLK ; SEND BLOCK ADDRESS
|
||||
|
||||
#IF (PRPSDTRACE >= 3)
|
||||
CALL PRPSD_PRTPREFIX
|
||||
PRTS(" READ$")
|
||||
#ENDIF
|
||||
|
||||
LD A,PRPSD_CMDREAD ; READ COMMAND
|
||||
CALL PRPSD_SNDCMD ; ... AND SEND COMMAND
|
||||
RET NZ ; BAIL OUT ON ERROR
|
||||
|
||||
LD C,PRPSD_DSKIO ; SET PORT
|
||||
LD B,0 ; SET LOOP COUNTER FOR 256 ITER
|
||||
LD HL,(PRPSD_DSKBUF) ; SET BUF ADR
|
||||
INIR ; READ 256 BYTES
|
||||
INIR ; ... AND AGAIN FOR 512 TOTAL
|
||||
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
PRPSD_WRSEC:
|
||||
;
|
||||
CALL PRPSD_SETBLK
|
||||
|
||||
#IF (PRPSDTRACE >= 3)
|
||||
PRTS(" PREP$")
|
||||
#ENDIF
|
||||
|
||||
LD A,PRPSD_CMDPREP
|
||||
CALL PRPSD_SNDCMD
|
||||
RET NZ ; RETURN ON FAILURE, A = STATUS
|
||||
LD A,PRPSD_CMDPREP ; PREPARE COMMAND
|
||||
CALL PRPSD_SNDCMD ; SEND IT
|
||||
RET NZ ; BAIL OUT ON ERROR
|
||||
|
||||
LD C,PRPSD_DSKIO
|
||||
LD B,0
|
||||
LD HL,(PRPSD_DSKBUF)
|
||||
OTIR
|
||||
OTIR
|
||||
LD C,PRPSD_DSKIO ; SET PORT
|
||||
LD B,0 ; SET LOOP COUNTER FOR 256 ITER
|
||||
LD HL,(PRPSD_DSKBUF) ; SET BUF ADR
|
||||
OTIR ; WRITE 256 BYTES
|
||||
OTIR ; ... AND AGAIN FOR 512 TOTAL
|
||||
|
||||
#IF (PRPSDTRACE >= 3)
|
||||
PRTS(" WRITE$")
|
||||
#ENDIF
|
||||
|
||||
LD A,PRPSD_CMDWRITE
|
||||
CALL PRPSD_SNDCMD
|
||||
RET NZ ; RETURN ON FAILURE, A = STATUS
|
||||
|
||||
OR A ; SET FLAGS
|
||||
RET ; RETURN WITH A = STATUS
|
||||
LD A,PRPSD_CMDWRITE ; WRITE COMMAND
|
||||
CALL PRPSD_SNDCMD ; SEND IT
|
||||
RET NZ ; BAIL OUT ON ERROR
|
||||
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; RETURN
|
||||
;
|
||||
;
|
||||
;
|
||||
@@ -987,6 +1024,8 @@ PRPSD_STR_TYPESDXC .TEXT "SDXC$"
|
||||
;
|
||||
PRP_FWVER .DB $00, $00, $00, $00 ; MMNNBBB (M=MAJOR, N=MINOR, B=BUILD)
|
||||
;
|
||||
PRPSD_IOFNADR .DW 0 ; PENDING IO FUNCTION ADDRESS
|
||||
;
|
||||
PRPSD_UNIT .DB 0
|
||||
PRPSD_DSKBUF .DW 0
|
||||
;
|
||||
|
||||
@@ -150,44 +150,87 @@ RF_SEEK:
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
RF_READ:
|
||||
LD (RF_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
CALL RF_SETIO
|
||||
CALL RF_SETADR
|
||||
LD HL,(RF_DSKBUF)
|
||||
LD B,0
|
||||
LD A,(RF_IO)
|
||||
OR RF_DAT
|
||||
LD C,A
|
||||
INIR
|
||||
INIR
|
||||
XOR A
|
||||
RET
|
||||
LD BC,RF_RDSEC ; GET ADR OF SECTOR READ FUNC
|
||||
LD (RF_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC
|
||||
JR RF_RW ; CONTINUE TO GENERIC R/W ROUTINE
|
||||
;
|
||||
;
|
||||
;
|
||||
RF_WRITE:
|
||||
LD (RF_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
CALL RF_SETIO
|
||||
LD A,(RF_IO)
|
||||
OR RF_ST
|
||||
LD C,A
|
||||
IN A,(C)
|
||||
BIT 0,A ; CHECK WRITE PROTECT
|
||||
LD A,1 ; PREPARE TO RETURN FALSE (ERROR)
|
||||
RET NZ ; WRITE PROTECTED!
|
||||
CALL RF_SETADR
|
||||
LD HL,(RF_DSKBUF)
|
||||
LD B,0
|
||||
LD A,(RF_IO)
|
||||
OR RF_DAT
|
||||
LD C,A
|
||||
OTIR
|
||||
OTIR
|
||||
XOR A
|
||||
RET
|
||||
LD BC,RF_WRSEC ; GET ADR OF SECTOR WRITE FUNC
|
||||
LD (RF_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC
|
||||
CALL RF_CHKWP ; WRITE PROTECTED?
|
||||
JR Z,RF_RW ; IF 0, NOT WP, CONTINUE WITH GENERIC R/W ROUTINE
|
||||
LD E,0 ; ZERO SECTORS WRITTEN
|
||||
OR $FF ; SIGNAL ERROR
|
||||
RET ; AND DONE
|
||||
;
|
||||
;
|
||||
;
|
||||
RF_RW:
|
||||
LD (RF_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
LD A,E ; BLOCK 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
|
||||
CALL RF_SETIO ; SET BASE PORT IO ADR FOR SELECTED UNIT
|
||||
RF_RW1:
|
||||
PUSH BC ; SAVE COUNTERS
|
||||
LD HL,(RF_RWFNADR) ; GET PENDING IO FUNCTION ADDRESS
|
||||
CALL JPHL ; ... AND CALL IT
|
||||
JR NZ,RF_RW2 ; IF ERROR, SKIP INCREMENT
|
||||
LD HL,HSTLBA ; POINT TO 32-BIT CURRENT LBA
|
||||
PUSH HL ; SAVE POINTER
|
||||
CALL LD32 ; LOAD 32-BIT LBA INTO DE:HL
|
||||
CALL INC32 ; INCREMENT LBA FOR NEXT I/O
|
||||
POP BC ; RECOVER LBA POINTER INTO BC
|
||||
CALL ST32 ; AND SAVE IT
|
||||
LD HL,RF_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR
|
||||
INC (HL) ; BUMP DMA BY
|
||||
INC (HL) ; ... 512 BYTES
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RF_RW2:
|
||||
POP BC ; RECOVER COUNTERS
|
||||
JR NZ,RF_RW3 ; IF ERROR, BAIL OUT
|
||||
INC C ; BUMP COUNT OF SECTORS READ
|
||||
DJNZ RF_RW1 ; LOOP AS NEEDED
|
||||
RF_RW3:
|
||||
LD E,C ; SECTOR READ COUNT TO E
|
||||
LD HL,(RF_DSKBUF) ; CURRENT DMA TO HL
|
||||
OR A ; SET FLAGS BASED ON RETURN CODE
|
||||
RET ; AND RETURN, A HAS RETURN CODE
|
||||
;
|
||||
; READ SECTOR
|
||||
;
|
||||
RF_RDSEC:
|
||||
CALL RF_SETADR ; SEND SECTOR STARTING ADDRESS TO CARD
|
||||
LD HL,(RF_DSKBUF) ; HL := DISK BUFFER ADDRESS
|
||||
LD B,0 ; INIT BYTE COUNTER
|
||||
LD A,(RF_IO) ; GET IO PORT BASE
|
||||
OR RF_DAT ; OFFSET TO DAT PORT
|
||||
LD C,A ; PUT IN C FOR PORT IO
|
||||
INIR ; READ 256 BYTES
|
||||
INIR ; AND ANOTHER 256 BYTES FOR 512 TOTAL
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND DONE
|
||||
;
|
||||
; WRITE SECTOR
|
||||
;
|
||||
RF_WRSEC:
|
||||
CALL RF_SETADR ; SEND SECTOR STARTING ADDRESS TO CARD
|
||||
LD HL,(RF_DSKBUF) ; HL := DISK BUFFER ADDRESS
|
||||
LD B,0 ; INIT BYTE COUNTER
|
||||
LD A,(RF_IO) ; GET IO PORT BASE
|
||||
OR RF_DAT ; OFFSET TO DAT PORT
|
||||
LD C,A ; PUT IN C FOR PORT IO
|
||||
OTIR ; WRITE 256 BYTES
|
||||
OTIR ; AND ANOTHER 256 BYTES FOR 512 TOTAL
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND DONE
|
||||
;
|
||||
;
|
||||
;
|
||||
@@ -223,7 +266,19 @@ RF_SETADR:
|
||||
;
|
||||
;
|
||||
;
|
||||
RF_IO .DB 0
|
||||
RF_CHKWP:
|
||||
CALL RF_SETIO ; SET BASE PORT IO ADR FOR SELECTED UNIT
|
||||
LD A,(RF_IO) ; GET IO PORT BASE
|
||||
OR RF_ST ; OFFSET TO ST PORT
|
||||
LD C,A ; PUT PORT ADR IN C FOR IO
|
||||
IN A,(C) ; READ ST PORT
|
||||
BIT 0,A ; CHECK WRITE PROTECT (BIT 0)
|
||||
RET ; RET WP STATUS IN ZF, NZ=WP
|
||||
;
|
||||
;
|
||||
;
|
||||
RF_IO .DB 0
|
||||
RF_RWFNADR .DW 0
|
||||
;
|
||||
RF_UNIT .DB 0
|
||||
RF_DSKBUF .DW 0
|
||||
|
||||
@@ -271,8 +271,9 @@ CHAIN:
|
||||
PUSH HL ; SAVE ENTRY ADDRESS
|
||||
;
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
LD DE,-1
|
||||
LD L,1
|
||||
LD BC,$00FB ; GET LOWER PAGE ID
|
||||
RST 08 ; DE := LOWER PAGE ID == BOOT ROM PAGE
|
||||
LD L,1 ; BOOT DISK UNIT IS ROM (UNIT ID = 1)
|
||||
LD BC,$01FC ; UNA FUNC: SET BOOTSTRAP HISTORY
|
||||
RST 08 ; CALL UNA
|
||||
;
|
||||
@@ -281,7 +282,6 @@ CHAIN:
|
||||
PUSH DE ; ... ON STACK
|
||||
DI ; ENTER WITH INTS DISABLED
|
||||
JP $FFF7 ; UNA INTER-PAGE EXEC CHAIN
|
||||
HALT
|
||||
#ELSE
|
||||
LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER
|
||||
LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO
|
||||
@@ -387,7 +387,7 @@ BOOTDISK:
|
||||
#ENDIF
|
||||
;
|
||||
; CHECK SIGNATURE
|
||||
;CALL NEWLINE ; FORMATTING
|
||||
CALL NEWLINE ; FORMATTING
|
||||
LD DE,(BB_SIG) ; GET THE SIGNATURE
|
||||
LD A,$A5 ; FIRST BYTE SHOULD BE $A5
|
||||
CP D ; COMPARE
|
||||
@@ -451,16 +451,20 @@ BOOTDISK:
|
||||
JP NZ,DB_ERR ; HANDLE ERROR
|
||||
;
|
||||
; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT
|
||||
LD DE,-1
|
||||
LD A,(BL_BOOTID)
|
||||
LD L,A
|
||||
LD DE,-1 ; BOOT ROM PAGE, -1 FOR N/A
|
||||
LD A,(BL_BOOTID) ; GET BOOT DISK UNIT ID
|
||||
LD L,A ; PUT IN L
|
||||
LD BC,$01FC ; UNA FUNC: SET BOOTSTRAP HISTORY
|
||||
RST 08 ; CALL UNA
|
||||
JP NZ,DB_ERR ; HANDLE ERROR
|
||||
;
|
||||
; JUMP TO COLD BOOT ENTRY
|
||||
LD HL,(BB_CPMENT) ; GET THE ENTRY POINT
|
||||
PUSH HL ; PUT ON STACK FOR UNA CHAIN FUNC
|
||||
LD DE,BID_USR ; TARGET BANK ID IS USER BANK
|
||||
PUSH DE ; PUT ON STACK FOR UNA CHAIN FUNC
|
||||
DI ; ENTER WITH INTS DISABLED
|
||||
JP (HL) ; ... AND GO
|
||||
JP $FFF7 ; UNA INTER-PAGE EXEC CHAIN
|
||||
;
|
||||
#ELSE
|
||||
;
|
||||
@@ -479,7 +483,7 @@ BOOTDISK:
|
||||
LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER
|
||||
LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO
|
||||
LD A,(HB_CURBNK) ; GET CURRENT BANK ID FROM PROXY DATA
|
||||
LD L,A ; ... AND SAVE AND BOOT BANK
|
||||
LD L,A ; ... AND SAVE AS BOOT BANK
|
||||
LD A,(BL_DEVICE) ; LOAD BOOT DEVICE/UNIT
|
||||
LD D,A ; SAVE IN D
|
||||
LD A,(BL_LU) ; LOAD BOOT LU
|
||||
|
||||
@@ -86,6 +86,9 @@ FDMODE_ZETA2 .EQU 3 ; ZETA V2
|
||||
FDMODE_DIDE .EQU 4 ; DUAL IDE
|
||||
FDMODE_N8 .EQU 5 ; N8
|
||||
FDMODE_DIO3 .EQU 6 ; DISKIO V3
|
||||
FDMODE_SMBSMC .EQU 7 ; RC2014 SMB SMC9266
|
||||
FDMODE_SMBWDC .EQU 8 ; RC2014 SMB WD37C65
|
||||
|
||||
;
|
||||
; IDE MODE SELECTIONS
|
||||
;
|
||||
@@ -94,6 +97,7 @@ IDEMODE_DIO .EQU 1 ; DISKIO V1
|
||||
IDEMODE_DIDE .EQU 2 ; DUAL IDE
|
||||
IDEMODE_MK4 .EQU 3 ; MARK IV ONBOARD IDE (8 BIT)
|
||||
IDEMODE_RC .EQU 4 ; RC2014 CF BOARD (8 BIT)
|
||||
IDEMODE_SMB .EQU 5 ; RC2014 IDE SMB $E0 IO BASE (8 BIT)
|
||||
;
|
||||
; PPIDE MODE SELECTIONS
|
||||
;
|
||||
@@ -103,7 +107,6 @@ PPIDEMODE_DIO3 .EQU 2 ; DISKIO V3 PARALLEL PORT
|
||||
PPIDEMODE_MFP .EQU 3 ; MULTIFUNCTION / PIC
|
||||
PPIDEMODE_N8 .EQU 4 ; MULTIFUNCTION / PIC
|
||||
PPIDEMODE_RC .EQU 5 ; RC2014 PPIDE STANDARD $20 IO BASE
|
||||
PPIDEMODE_SMB .EQU 6 ; RC2014 PPIDE SMB $E0 IO BASE
|
||||
;
|
||||
; SD MODE SELECTIONS
|
||||
;
|
||||
@@ -317,7 +320,7 @@ MON_SERIAL .EQU MON_LOC + (1 * 3) ; MONITOR ENTRY (SERIAL PORT)
|
||||
; HELPER MACROS
|
||||
;
|
||||
#DEFINE PRTC(C) CALL PRTCH \ .DB C ; PRINT CHARACTER C TO CONSOLE - PRTC('X')
|
||||
#DEFINE PRTS(S) CALL PRTSTRD \ .DB S ; PRINT STRING S TO CONSOLE - PRTD("HELLO")
|
||||
#DEFINE PRTS(S) CALL PRTSTRD \ .TEXT S ; PRINT STRING S TO CONSOLE - PRTD("HELLO")
|
||||
#DEFINE PRTX(X) CALL PRTSTRI \ .DW X ; PRINT STRING AT ADDRESS X TO CONSOLE - PRTI(STR_HELLO)
|
||||
;
|
||||
#DEFINE XIO_PRTC(C) CALL XIO_PRTCH \ .DB C ; PRINT CHARACTER C TO CONSOLE - PRTC('X')
|
||||
|
||||
@@ -920,6 +920,24 @@ SUB32:
|
||||
RET NC
|
||||
DEC DE
|
||||
RET
|
||||
;
|
||||
; INC32 (HL)
|
||||
; INCREMENT 32 BIT BINARY AT ADDRESS
|
||||
;
|
||||
INC32HL:
|
||||
PUSH HL
|
||||
PUSH BC
|
||||
LD B,4
|
||||
INC32HL1:
|
||||
INC (HL)
|
||||
INC HL
|
||||
JR NZ,INC32HL2
|
||||
DJNZ INC32HL1
|
||||
INC32HL2:
|
||||
POP BC
|
||||
POP HL
|
||||
RET
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user