Browse Source

RC2014 Floppy

- Support for RC2014 SMB Floppy (WDC & SMC), but not yet tested.
- Final work on Multi-Sector I/O
pull/5/head
Wayne Warthen 8 years ago
parent
commit
fb63612ebf
  1. 5
      Source/HBIOS/Config/RC_std.asm
  2. 2
      Source/HBIOS/cfg_rc.asm
  3. 34
      Source/HBIOS/fd.asm
  4. 61
      Source/HBIOS/hbios.asm
  5. 294
      Source/HBIOS/hdsk.asm
  6. 32
      Source/HBIOS/ide.asm
  7. 67
      Source/HBIOS/md.asm
  8. 17
      Source/HBIOS/ppide.asm
  9. 109
      Source/HBIOS/ppp.asm
  10. 127
      Source/HBIOS/prp.asm
  11. 123
      Source/HBIOS/rf.asm
  12. 22
      Source/HBIOS/romldr.asm
  13. 7
      Source/HBIOS/std.asm
  14. 18
      Source/HBIOS/util.asm

5
Source/HBIOS/Config/RC_std.asm

@ -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 SIOMODE .SET SIOMODE_RC ; TYPE OF SIO/2 TO DETECT: SIOMODE_RC, SIOMODE_SMB
ACIAENABLE .SET TRUE ; TRUE TO AUTO-DETECT MOTOROLA 6850 ACIA 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) 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) PPIDEENABLE .SET FALSE ; TRUE FOR PPIDE DEVICE SUPPORT (PPIDE MODULE)
PPIDEMODE .SET PPIDEMODE_RC ; TYPE OF CF MODULE: PPIDEMODE_RC, PPIDEMODE_SMB

2
Source/HBIOS/cfg_rc.asm

@ -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) MDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF MDENABLE = TRUE)
; ;
FDENABLE .EQU FALSE ; TRUE FOR FLOPPY SUPPORT 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) 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) 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) FDMEDIAALT .EQU FDM720 ; ALTERNATE MEDIA TO TRY, SAME CHOICES AS ABOVE (ONLY RELEVANT IF FDMAUTO = TRUE)

34
Source/HBIOS/fd.asm

@ -8,7 +8,7 @@
; ;
; PORTS ; 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_MSR .EQU $36 ; 8272 MAIN STATUS REGISTER
FDC_DATA .EQU $37 ; 8272 DATA PORT FDC_DATA .EQU $37 ; 8272 DATA PORT
FDC_DIR .EQU $38 ; DATA INPUT REGISTER 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_TC .EQU $93 ; TERMINAL COUNT (W/ DACK)
FDC_DMA .EQU $3C ; NOT USED BY N8 FDC_DMA .EQU $3C ; NOT USED BY N8
#ENDIF #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 ; DISK OPERATIONS
; ;
@ -310,9 +318,17 @@ DOR_BR500 .EQU 10100010B ; 500KBPS W/ MOTOR ON
DOR_INIT .EQU 10100000B ; INITIAL DEFAULT LATCH VALUE DOR_INIT .EQU 10100000B ; INITIAL DEFAULT LATCH VALUE
#ENDIF #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 *** ; *** 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_INIT .EQU 00001100B ; SOFT RESET INACTIVE, DMA ENABLED
DOR_BR250 .EQU DOR_INIT DOR_BR250 .EQU DOR_INIT
DOR_BR500 .EQU DOR_INIT DOR_BR500 .EQU DOR_INIT
@ -1176,7 +1192,7 @@ FC_SETDOR
; ;
; SET FST_DCR ; 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 FC_SETDCR
LD (FST_DCR),A LD (FST_DCR),A
@ -1205,10 +1221,10 @@ FC_RESETFDC:
LD A,(FST_DOR) LD A,(FST_DOR)
PUSH AF PUSH AF
#IF ((FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3))
#IF ((FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3) | (FDMODE == FDMODE_SMBSMC))
RES 7,A RES 7,A
#ENDIF #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 LD A,0
#ENDIF #ENDIF
CALL FC_SETDOR CALL FC_SETDOR
@ -1223,7 +1239,7 @@ FC_RESETFDC:
; PULSE TERMCT TO TERMINATE ANY ACTIVE EXECUTION PHASE ; PULSE TERMCT TO TERMINATE ANY ACTIVE EXECUTION PHASE
; ;
FC_PULSETC: 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) IN A,(FDC_TC)
#ELSE #ELSE
LD A,(FST_DOR) LD A,(FST_DOR)
@ -1245,7 +1261,7 @@ FC_MOTORON:
LD DE,FDSTR_MOTON LD DE,FDSTR_MOTON
CALL WRITESTR CALL WRITESTR
#ENDIF #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) LD A,(FST_DOR)
PUSH AF PUSH AF
@ -1253,13 +1269,13 @@ FC_MOTORON:
CALL FC_SETDOR ; AND IMPLEMENT IT CALL FC_SETDOR ; AND IMPLEMENT IT
POP AF 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 XOR 00000010B ; MOTOR BIT INVERTED ON ZETA
#ENDIF #ENDIF
BIT 1,A ; SET FLAGS SET BASED ON CURRENT MOTOR BIT BIT 1,A ; SET FLAGS SET BASED ON CURRENT MOTOR BIT
RET Z ; MOTOR WAS PREVIOUSLY ON, WE ARE DONE RET Z ; MOTOR WAS PREVIOUSLY ON, WE ARE DONE
#ENDIF #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 ; SETUP DCR FOR DIDE HARDWARE
LD A,(FCD_DCR) ; GET NEW DCR VALUE LD A,(FCD_DCR) ; GET NEW DCR VALUE
CALL FC_SETDCR ; AND IMPLEMENT IT CALL FC_SETDCR ; AND IMPLEMENT IT

61
Source/HBIOS/hbios.asm

@ -1299,7 +1299,6 @@ DIO_DISPATCH:
PRTS("DIO<$") PRTS("DIO<$")
CALL REGDMP ; DUMP REGS, NONE DESTROYED CALL REGDMP ; DUMP REGS, NONE DESTROYED
RET RET
DIO_DISPCALL:
; ;
#ENDIF ; *DEBUG* END #ENDIF ; *DEBUG* END
; ;
@ -1307,31 +1306,34 @@ DIO_DISPCALL:
; USE UNIT # IN C TO LOOKUP DIO_TBL ENTRY, THEN ; USE UNIT # IN C TO LOOKUP DIO_TBL ENTRY, THEN
; CONVERT C TO THE DEVICE/DRIVER SPECIFIC UNIT ID ; CONVERT C TO THE DEVICE/DRIVER SPECIFIC UNIT ID
; AND GET THE DEVICE TYPE TO A FOR DRIVER DISPATCHING ; 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) #IF (MDENABLE)
CP DIODEV_MD CP DIODEV_MD
JP Z,MD_DISPATCH JP Z,MD_DISPATCH
@ -1375,6 +1377,15 @@ DIO_DISPATCH1:
CALL PANIC CALL PANIC
RET 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 ; CONVERT AN HBIOS STANDARD HARD DISK CHS ADDRESS TO
; AN LBA ADDRESS. A STANDARD HBIOS HARD DISK IS ASSUMED ; AN LBA ADDRESS. A STANDARD HBIOS HARD DISK IS ASSUMED
; TO HAVE 16 SECTORS PER TRACK AND 16 HEADS PER CYLINDER. ; TO HAVE 16 SECTORS PER TRACK AND 16 HEADS PER CYLINDER.

294
Source/HBIOS/hdsk.asm

@ -3,8 +3,6 @@
; HDSK DISK DRIVER ; HDSK DISK DRIVER
;================================================================================================== ;==================================================================================================
; ;
HDSK_UNITCNT .EQU 2 ; TWO VIRTUAL HARD DISKS
;
; IO PORT ADDRESSES ; IO PORT ADDRESSES
; ;
HDSK_IO .EQU $FD HDSK_IO .EQU $FD
@ -15,85 +13,131 @@ HDSK_CMDREAD .EQU 2
HDSK_CMDWRITE .EQU 3 HDSK_CMDWRITE .EQU 3
HDSK_CMDPARAM .EQU 4 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 ; STATUS
; ;
HDSKRC_OK .EQU 0
HDSK_STOK .EQU 0 ; OK
HDSK_STNOTRDY .EQU -1 ; NOT READY
; ;
; ;
; ;
HDSK_INIT: HDSK_INIT:
CALL NEWLINE ; FORMATTING CALL NEWLINE ; FORMATTING
PRTS("HDSK: UNITS=$")
LD A,HDSK_UNITCNT
PRTS("HDSK:$")
PRTS(" DEVICES=$")
LD A,HDSK_DEVCNT
CALL PRTDECB CALL PRTDECB
; ;
; SETUP THE DISPATCH TABLE ENTRIES ; 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: 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 ; INIT SUCCEEDED
RET ; RETURN
;
; PROBE FOR DEVICE EXISTENCE
;
HDSK_PROBE:
XOR A ; SIGNAL SUCCESS
RET ; AND DONE
; ;
XOR A
DEC A ; INITIAL STATUS IS NOT READY $FF
LD (HDSK_STAT),A ; SAVE IT
XOR A ; INIT SUCCEEDED
RET ; RETURN
; 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
; ;
HDSK_DISPATCH:
; DISPATCH ACCORDING TO DISK SUB-FUNCTION ; 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 DEC A
JP Z,HDSK_RESET ; SUB-FUNC 1: RESET
JP Z,HDSK_RESET ; SUB-FUNC 1: RESET
DEC A DEC A
JP Z,HDSK_SEEK ; SUB-FUNC 2: SEEK
JP Z,HDSK_SEEK ; SUB-FUNC 2: SEEK
DEC A DEC A
JP Z,HDSK_READ ; SUB-FUNC 3: READ SECTORS
JP Z,HDSK_READ ; SUB-FUNC 3: READ SECTORS
DEC A DEC A
JP Z,HDSK_WRITE ; SUB-FUNC 4: WRITE SECTORS
JP Z,HDSK_WRITE ; SUB-FUNC 4: WRITE SECTORS
DEC A DEC A
JP Z,HDSK_VERIFY ; SUB-FUNC 5: VERIFY SECTORS
JP Z,HDSK_VERIFY ; SUB-FUNC 5: VERIFY SECTORS
DEC A DEC A
JP Z,HDSK_FORMAT ; SUB-FUNC 6: FORMAT TRACK
JP Z,HDSK_FORMAT ; SUB-FUNC 6: FORMAT TRACK
DEC A DEC A
JP Z,HDSK_DEVICE ; SUB-FUNC 7: DEVICE REPORT
JP Z,HDSK_DEVICE ; SUB-FUNC 7: DEVICE REPORT
DEC A DEC A
JP Z,HDSK_MEDIA ; SUB-FUNC 8: MEDIA REPORT
JP Z,HDSK_MEDIA ; SUB-FUNC 8: MEDIA REPORT
DEC A DEC A
JP Z,HDSK_DEFMED ; SUB-FUNC 9: DEFINE MEDIA
JP Z,HDSK_DEFMED ; SUB-FUNC 9: DEFINE MEDIA
DEC A DEC A
JP Z,HDSK_CAP ; SUB-FUNC 10: REPORT CAPACITY
JP Z,HDSK_CAP ; SUB-FUNC 10: REPORT CAPACITY
DEC A DEC A
JP Z,HDSK_GEOM ; SUB-FUNC 11: REPORT GEOMETRY
JP Z,HDSK_GEOM ; SUB-FUNC 11: REPORT GEOMETRY
; ;
HDSK_VERIFY: HDSK_VERIFY:
HDSK_FORMAT: HDSK_FORMAT:
HDSK_DEFMED: HDSK_DEFMED:
CALL PANIC ; INVALID SUB-FUNCTION
CALL PANIC ; INVALID SUB-FUNCTION
; ;
; ;
; ;
HDSK_STATUS: HDSK_STATUS:
LD A,(HDSK_STAT) ; LOAD STATUS
OR A ; SET FLAGS
LD A,(IY+HDSK_STAT) ; LOAD STATUS
OR A ; SET FLAGS
RET RET
; ;
; ;
@ -129,10 +173,10 @@ HDSK_GEOM:
; ;
; ;
HDSK_DEVICE: 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 RET
; ;
; ;
@ -149,8 +193,10 @@ HDSK_SEEK:
BIT 7,D ; CHECK FOR LBA FLAG BIT 7,D ; CHECK FOR LBA FLAG
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA
RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY 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 XOR A ; SIGNAL SUCCESS
RET ; AND RETURN RET ; AND RETURN
; ;
@ -176,12 +222,11 @@ HDSK_RW:
RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0
LD B,A ; INIT SECTOR DOWNCOUNTER LD B,A ; INIT SECTOR DOWNCOUNTER
LD C,0 ; INIT SECTOR READ/WRITE COUNT 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 ; RESET HDSK INTERFACE IF NEEDED
LD A,(HDSK_STAT) ; GET CURRENT STATUS
LD A,(IY+HDSK_STAT) ; GET CURRENT STATUS
OR A ; SET FLAGS OR A ; SET FLAGS
PUSH BC ; SAVE COUNTERS PUSH BC ; SAVE COUNTERS
CALL NZ,HDSK_DSKRESET ; RESET IF NOT READY CALL NZ,HDSK_DSKRESET ; RESET IF NOT READY
@ -196,85 +241,90 @@ HDSK_RW0:
; CONVERT LBA HHHH:LLLL (4 BYTES) ; CONVERT LBA HHHH:LLLL (4 BYTES)
; TO HDSK TRACK/SECTOR TTTT:SS (3 BYTES) ; TO HDSK TRACK/SECTOR TTTT:SS (3 BYTES)
; SAVING TO HDSK PARM BLOCK ; 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 ; 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 ; 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) #IF (HDSKTRACE > 0)
PUSH AF ; SAVE RETURN CODE
PUSH AF ; SAVE RETURN CODE
#IF (HDSKTRACE == 1) #IF (HDSKTRACE == 1)
CALL NZ,HDSK_PRT ; DIAGNOSE ERRORS ONLY
CALL NZ,HDSK_PRT ; DIAGNOSE ERRORS ONLY
#ENDIF #ENDIF
#IF (HDSKTRACE >= 2) #IF (HDSKTRACE >= 2)
CALL HDSK_PRT ; DISPLAY ALL READ/WRITE RESULTS
CALL HDSK_PRT ; DISPLAY ALL READ/WRITE RESULTS
#ENDIF #ENDIF
POP AF ; RESTORE RETURN CODE
POP AF ; RESTORE RETURN CODE
#ENDIF #ENDIF
JR NZ,HDSK_RW5 ; BAIL OUT ON ERROR
JR NZ,HDSK_RW5 ; BAIL OUT ON ERROR
; INCREMENT LBA ; 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 ; 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: 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: HDSK_RW6:
; RETURN WITH SECTORS READ IN E AND UPDATED DMA ADDRESS IN HL ; 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: HDSK_DSKRESET:
LD B,32
LD A,HDSK_CMDRESET
HDSK_DSKRESET1:
OUT ($FD),A
DJNZ HDSK_DSKRESET1
XOR A ; STATUS = OK
LD (HDSK_STAT),A ; SAVE IT
;
#IF (HDSKTRACE >= 2) #IF (HDSKTRACE >= 2)
CALL NEWLINE CALL NEWLINE
LD DE,HDSKSTR_PREFIX
LD DE,HDSKSTR_PREFIX
CALL WRITESTR CALL WRITESTR
CALL PC_SPACE CALL PC_SPACE
LD DE,HDSKSTR_RESET LD DE,HDSKSTR_RESET
CALL WRITESTR CALL WRITESTR
#ENDIF #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 RET
; ;
@ -283,9 +333,9 @@ HDSK_DSKRESET1:
HDSK_PRT: HDSK_PRT:
CALL NEWLINE CALL NEWLINE
LD DE,HDSKSTR_PREFIX
LD DE,HDSKSTR_PREFIX
CALL WRITESTR CALL WRITESTR
CALL PC_SPACE CALL PC_SPACE
LD DE,HDSKSTR_CMD LD DE,HDSKSTR_CMD
CALL WRITESTR CALL WRITESTR
@ -311,7 +361,7 @@ HDSK_PRT:
CP HDSK_CMDPARAM CP HDSK_CMDPARAM
JP Z,HDSK_PRTCMD JP Z,HDSK_PRTCMD
LD DE,HDSKSTR_UNKCMD LD DE,HDSKSTR_UNKCMD
HDSK_PRTCMD:
HDSK_PRTCMD:
CALL WRITESTR CALL WRITESTR
CALL PC_RBKT CALL PC_RBKT
@ -324,7 +374,7 @@ HDSK_PRTCMD:
HDSK_PRTRW: HDSK_PRTRW:
CALL PC_SPACE CALL PC_SPACE
LD A,(HDSK_DEV)
LD A,(HDSK_DRV)
CALL PRTHEXBYTE CALL PRTHEXBYTE
CALL PC_SPACE CALL PC_SPACE
LD BC,(HDSK_TRK) LD BC,(HDSK_TRK)
@ -349,12 +399,12 @@ HDSK_PRTRW:
CALL PC_SPACE CALL PC_SPACE
CALL PC_LBKT CALL PC_LBKT
LD A,(HDSK_RC) LD A,(HDSK_RC)
LD DE,HDSKSTR_RCOK
CP HDSKRC_OK
LD DE,HDSKSTR_STOK
CP HDSK_STOK
JP Z,HDSK_PRTRC JP Z,HDSK_PRTRC
LD DE,HDSKSTR_RCUNK
LD DE,HDSKSTR_STUNK
HDSK_PRTRC:
HDSK_PRTRC:
CALL WRITESTR CALL WRITESTR
CALL PC_RBKT CALL PC_RBKT
@ -372,21 +422,19 @@ HDSKSTR_READ .TEXT "READ$"
HDSKSTR_WRITE .TEXT "WRITE$" HDSKSTR_WRITE .TEXT "WRITE$"
HDSKSTR_PARAM .TEXT "PARAM$" HDSKSTR_PARAM .TEXT "PARAM$"
HDSKSTR_UNKCMD .TEXT "UNKCMD$" 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 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_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

32
Source/HBIOS/ide.asm

@ -107,15 +107,18 @@
; IDE3: SECONDARY SLAVE ; IDE3: SECONDARY SLAVE
; ;
IDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE IDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE
IDE_IO_BASE .EQU $20 ; DEFAULT IO BASE (NOTE OVERRIDES BELOW)
; ;
#IF (IDEMODE == IDEMODE_MK4) #IF (IDEMODE == IDEMODE_MK4)
IDE_IO_BASE .EQU MK4_IDE
IDE_IO_BASE .SET MK4_IDE
#ENDIF #ENDIF
#IF (IDEMODE == IDEMODE_RC) #IF (IDEMODE == IDEMODE_RC)
IDE_IO_BASE .EQU $10
IDE_IO_BASE .SET $10
#ENDIF #ENDIF
#IF ((IDEMODE != IDEMODE_MK4) & (IDEMODE != IDEMODE_RC))
IDE_IO_BASE .EQU $20
#IF (IDEMODE == IDEMODE_SMB)
IDE_IO_BASE .SET $E0
#ENDIF #ENDIF
#IF ((IDEMODE == IDEMODE_DIO) | (IDEMODE == IDEMODE_MK4)) #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
#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_UNITCNT .SET 1 ; RC2014 COMPACT FLASH SUPPORTS ONLY 1 DEVICE
IDE_IO_DATA .EQU $IDE_IO_BASE + $00 ; DATA PORT (8 BIT) (R/W) IDE_IO_DATA .EQU $IDE_IO_BASE + $00 ; DATA PORT (8 BIT) (R/W)
#ENDIF #ENDIF
@ -399,22 +402,21 @@ IDE_DEFMED:
; ;
; ;
IDE_READ: 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 JR IDE_IO ; CONTINUE TO GENERIC IO ROUTINE
; ;
; ;
; ;
IDE_WRITE: 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 JR IDE_IO ; CONTINUE TO GENERIC IO ROUTINE
; ;
; ;
; ;
IDE_IO: IDE_IO:
LD (IDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
LD A,E ; BLOCK COUNT TO A LD A,E ; BLOCK COUNT TO A
OR A ; SET FLAGS OR A ; SET FLAGS
RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 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_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT
CALL IDE_CHKDEVICE ; CHECK DEVICE AND CLEAR STATUS CALL IDE_CHKDEVICE ; CHECK DEVICE AND CLEAR STATUS
POP BC ; RESTORE COUNTERS POP BC ; RESTORE COUNTERS
RET NZ
JR NZ,IDE_IO3 ; BAIL OUT ON ERROR
IDE_IO1: IDE_IO1:
PUSH BC ; SAVE COUNTERS PUSH BC ; SAVE COUNTERS
LD HL,(IDE_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS LD HL,(IDE_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS
@ -795,7 +797,7 @@ IDE_RESET:
OUT (MK4_XAR),A OUT (MK4_XAR),A
#ENDIF #ENDIF
#IF (IDEMODE == IDEMODE_RC)
#IF ((IDEMODE == IDEMODE_RC) | (IDEMODE == IDEMODE_SMB))
; RC2014 CANNOT ADDRESS THE DEVICE CONTROL PORT AND ; RC2014 CANNOT ADDRESS THE DEVICE CONTROL PORT AND
; HAS NO WAY TO PERFORM A HARD RESET FROM SOFTWARE, ; HAS NO WAY TO PERFORM A HARD RESET FROM SOFTWARE,
; SO FAKE IT BY SETTING THE REGISTERS TO THE SAME ; SO FAKE IT BY SETTING THE REGISTERS TO THE SAME
@ -808,7 +810,7 @@ IDE_RESET:
OUT (IDE_IO_SECT),A OUT (IDE_IO_SECT),A
#ENDIF #ENDIF
#IF ((IDEMODE != IDEMODE_MK4) & (IDEMODE != IDEMODE_RC))
#IF ((IDEMODE != IDEMODE_MK4) & (IDEMODE != IDEMODE_RC) & (IDEMODE != IDEMODE_SMB))
; INITIATE SOFT RESET ; INITIATE SOFT RESET
LD A,%00001110 ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES LD A,%00001110 ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES
OUT (IDE_IO_CTRL),A OUT (IDE_IO_CTRL),A
@ -817,7 +819,7 @@ IDE_RESET:
LD DE,2 ; DELAY 32US (SPEC IS >= 25US) LD DE,2 ; DELAY 32US (SPEC IS >= 25US)
CALL VDELAY CALL VDELAY
; ;
#IF (IDEMODE != IDEMODE_RC)
#IF ((IDEMODE != IDEMODE_RC) & (IDEMODE != IDEMODE_SMB))
; CONFIGURE OPERATION AND END SOFT RESET ; CONFIGURE OPERATION AND END SOFT RESET
LD A,%00001010 ; NO INTERRUPTS, DEASSERT RESET LD A,%00001010 ; NO INTERRUPTS, DEASSERT RESET
OUT (IDE_IO_CTRL),A ; PUSH TO REGISTER OUT (IDE_IO_CTRL),A ; PUSH TO REGISTER

67
Source/HBIOS/md.asm

@ -167,11 +167,66 @@ MD_SEEK:
CALL ST32 ; SAVE LBA ADDRESS CALL ST32 ; SAVE LBA ADDRESS
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET ; AND RETURN RET ; AND RETURN
; ;
; ;
; ;
MD_READ: 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 CALL MD_IOSETUP ; SETUP FOR MEMORY COPY
#IF (MDTRACE >= 2) #IF (MDTRACE >= 2)
LD (MD_SRC),HL 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 CALL MD_IOSETUP ; SETUP FOR MEMORY COPY
EX DE,HL ; SWAP SRC/DEST FOR WRITE EX DE,HL ; SWAP SRC/DEST FOR WRITE
#IF (MDTRACE >= 2) #IF (MDTRACE >= 2)
@ -335,6 +384,8 @@ MD_PRT:
; ;
; ;
; ;
MD_RWFNADR .DW 0
;
MD_UNIT .DB 0 MD_UNIT .DB 0
MD_DSKBUF .DW 0 MD_DSKBUF .DW 0
; ;

17
Source/HBIOS/ppide.asm

@ -17,10 +17,6 @@ PPIDE_IO_BASE .EQU $60
PPIDE_IO_BASE .EQU $20 PPIDE_IO_BASE .EQU $20
#ENDIF #ENDIF
; ;
#IF (PPIDEMODE == PPIDEMODE_SMB)
PPIDE_IO_BASE .EQU $E0
#ENDIF
;
#IF (PPIDEMODE == PPIDEMODE_MFP) #IF (PPIDEMODE == PPIDEMODE_MFP)
PPIDE_IO_BASE .EQU $44 PPIDE_IO_BASE .EQU $44
#ENDIF #ENDIF
@ -417,22 +413,21 @@ PPIDE_DEFMED:
; ;
; ;
PPIDE_READ: 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 JR PPIDE_IO ; CONTINUE TO GENERIC IO ROUTINE
; ;
; ;
; ;
PPIDE_WRITE: 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 JR PPIDE_IO ; CONTINUE TO GENERIC IO ROUTINE
; ;
; ;
; ;
PPIDE_IO: PPIDE_IO:
LD (PPIDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
LD A,E ; BLOCK COUNT TO A LD A,E ; BLOCK COUNT TO A
OR A ; SET FLAGS OR A ; SET FLAGS
RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 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_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT
CALL PPIDE_CHKDEVICE ; CHECK DEVICE AND CLEAR STATUS CALL PPIDE_CHKDEVICE ; CHECK DEVICE AND CLEAR STATUS
POP BC ; RESTORE COUNTERS POP BC ; RESTORE COUNTERS
RET NZ
JR NZ,PPIDE_IO3 ; BAIL OUT ON ERROR
PPIDE_IO1: PPIDE_IO1:
PUSH BC ; SAVE COUNTERS PUSH BC ; SAVE COUNTERS
LD HL,(PPIDE_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS LD HL,(PPIDE_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS

109
Source/HBIOS/ppp.asm

@ -462,31 +462,85 @@ PPPSD_FORMAT:
PPPSD_DEFMED: PPPSD_DEFMED:
CALL PANIC ; INVALID SUB-FUNCTION CALL PANIC ; INVALID SUB-FUNCTION
; ;
; READ AN LBA BLOCK FROM THE SD CARD
;
; ;
PPPSD_READ: 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 (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) #IF (PPPSDTRACE == 1)
LD HL,PPPSD_PRTERR ; SET UP PPPSD_PRTERR LD HL,PPPSD_PRTERR ; SET UP PPPSD_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS PUSH HL ; ... TO FILTER ALL EXITS
#ENDIF #ENDIF
PUSH BC ; SAVE COUNTERS
CALL PPPSD_CHKCARD ; CHECK / REINIT CARD AS NEEDED 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) #IF (PPPSDTRACE >= 3)
CALL PPPSD_PRTPREFIX CALL PPPSD_PRTPREFIX
#ENDIF #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) #IF (PPPSDTRACE >= 3)
PRTS(" READ$") PRTS(" READ$")
#ENDIF #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 PPPSD_SENDBLK ; SEND THE LBA BLOCK NUMBER
CALL PPP_GETBYTE ; GET READ RESULT CALL PPP_GETBYTE ; GET READ RESULT
@ -496,52 +550,39 @@ PPPSD_READ:
CALL PC_SPACE CALL PC_SPACE
CALL PRTHEXBYTE CALL PRTHEXBYTE
#ENDIF #ENDIF
OR A ; SET FLAGS OR A ; SET FLAGS
JR Z,PPPSD_READ1
JR Z,PPPSD_RDSEC1
; HANDLE ERROR ; HANDLE ERROR
CALL PPPSD_GETDSKSTAT ; GET FULL ERROR CODE 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 ; GET THE SECTOR DATA
LD D,PPP_CMDDSKGET ; COMMAND = DSKGET LD D,PPP_CMDDSKGET ; COMMAND = DSKGET
CALL PPP_SNDCMD ; SEND COMMAND CALL PPP_SNDCMD ; SEND COMMAND
RET NZ
RET NZ ; BAIL OUT ON ERROR
; READ THE SECTOR DATA ; READ THE SECTOR DATA
LD BC,512 LD BC,512
LD HL,(PPPSD_DSKBUF) LD HL,(PPPSD_DSKBUF)
PPPSD_READ2:
PPPSD_RDSEC2:
CALL PPP_GETBYTE CALL PPP_GETBYTE
LD (HL),A LD (HL),A
INC HL INC HL
DEC BC DEC BC
LD A,B LD A,B
OR C OR C
JP NZ,PPPSD_READ2
JP NZ,PPPSD_RDSEC2
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET 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) #IF (PPPSDTRACE >= 3)
PRTS(" WRITE$") PRTS(" WRITE$")
#ENDIF #ENDIF
@ -554,14 +595,14 @@ PPPSD_WRITE:
; SEND OVER THE SECTOR CONTENTS ; SEND OVER THE SECTOR CONTENTS
LD BC,512 LD BC,512
LD HL,(PPPSD_DSKBUF) LD HL,(PPPSD_DSKBUF)
PPPSD_WRITE1:
PPPSD_WRSEC1:
LD A,(HL) LD A,(HL)
INC HL INC HL
CALL PPP_PUTBYTE CALL PPP_PUTBYTE
DEC BC DEC BC
LD A,B LD A,B
OR C OR C
JP NZ,PPPSD_WRITE1
JP NZ,PPPSD_WRSEC1
; WRITE THE SECTOR ; WRITE THE SECTOR
LD D,PPP_CMDDSKWR ; COMMAND = DSKWR LD D,PPP_CMDDSKWR ; COMMAND = DSKWR
@ -1048,6 +1089,8 @@ PPPSD_STR_TYPESDXC .TEXT "SDXC$"
; DATA STORAGE ; DATA STORAGE
;============================================================================= ;=============================================================================
; ;
PPPSD_IOFNADR .DW 0 ; PENDING IO FUNCTION ADDRESS
;
PPPSD_UNIT .DB 0 PPPSD_UNIT .DB 0
PPPSD_DSKBUF .DW 0 PPPSD_DSKBUF .DW 0
; ;

127
Source/HBIOS/prp.asm

@ -361,87 +361,124 @@ PRPSD_DEFMED:
; ;
; ;
PRPSD_READ: 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 (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) #IF (PRPSDTRACE == 1)
LD HL,PRPSD_PRTERR ; SET UP PRPSD_PRTERR LD HL,PRPSD_PRTERR ; SET UP PRPSD_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS PUSH HL ; ... TO FILTER ALL EXITS
#ENDIF #ENDIF
PUSH BC ; SAVE COUNTERS
CALL PRPSD_CHKCARD ; CHECK / REINIT CARD AS NEEDED 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) #IF (PRPSDTRACE >= 3)
CALL PRPSD_PRTPREFIX CALL PRPSD_PRTPREFIX
#ENDIF #ENDIF
#IF (PRPSDTRACE >= 3)
PRTS(" READ$")
#ENDIF
;LD DE,$FFFF
;LD HL,$FFFF
;LD BC,HSTLBA
;CALL ST32
CALL PRPSD_SETBLK
LD HL,(PRPSD_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS
CALL JPHL ; ... AND CALL IT
JR NZ,PRPSD_IO2 ; BAIL OUT ON ERROR
LD A,PRPSD_CMDREAD
CALL PRPSD_SNDCMD
RET NZ ; RETURN ON FAILURE, A = STATUS
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
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 OR A ; SET FLAGS
RET ; RETURN WITH A = STATUS 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) #IF (PRPSDTRACE >= 3)
CALL PRPSD_PRTPREFIX
PRTS(" READ$")
#ENDIF #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 CALL PRPSD_SETBLK
#IF (PRPSDTRACE >= 3) #IF (PRPSDTRACE >= 3)
PRTS(" PREP$") PRTS(" PREP$")
#ENDIF #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) #IF (PRPSDTRACE >= 3)
PRTS(" WRITE$") PRTS(" WRITE$")
#ENDIF #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) 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_UNIT .DB 0
PRPSD_DSKBUF .DW 0 PRPSD_DSKBUF .DW 0
; ;

123
Source/HBIOS/rf.asm

@ -150,44 +150,87 @@ RF_SEEK:
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET ; AND RETURN RET ; AND RETURN
; ;
;
;
;
;
RF_READ: 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: 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_UNIT .DB 0
RF_DSKBUF .DW 0 RF_DSKBUF .DW 0

22
Source/HBIOS/romldr.asm

@ -271,8 +271,9 @@ CHAIN:
PUSH HL ; SAVE ENTRY ADDRESS PUSH HL ; SAVE ENTRY ADDRESS
; ;
#IF (PLATFORM == PLT_UNA) #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 LD BC,$01FC ; UNA FUNC: SET BOOTSTRAP HISTORY
RST 08 ; CALL UNA RST 08 ; CALL UNA
; ;
@ -281,7 +282,6 @@ CHAIN:
PUSH DE ; ... ON STACK PUSH DE ; ... ON STACK
DI ; ENTER WITH INTS DISABLED DI ; ENTER WITH INTS DISABLED
JP $FFF7 ; UNA INTER-PAGE EXEC CHAIN JP $FFF7 ; UNA INTER-PAGE EXEC CHAIN
HALT
#ELSE #ELSE
LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER
LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO
@ -387,7 +387,7 @@ BOOTDISK:
#ENDIF #ENDIF
; ;
; CHECK SIGNATURE ; CHECK SIGNATURE
;CALL NEWLINE ; FORMATTING
CALL NEWLINE ; FORMATTING
LD DE,(BB_SIG) ; GET THE SIGNATURE LD DE,(BB_SIG) ; GET THE SIGNATURE
LD A,$A5 ; FIRST BYTE SHOULD BE $A5 LD A,$A5 ; FIRST BYTE SHOULD BE $A5
CP D ; COMPARE CP D ; COMPARE
@ -451,16 +451,20 @@ BOOTDISK:
JP NZ,DB_ERR ; HANDLE ERROR JP NZ,DB_ERR ; HANDLE ERROR
; ;
; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT ; 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 LD BC,$01FC ; UNA FUNC: SET BOOTSTRAP HISTORY
RST 08 ; CALL UNA RST 08 ; CALL UNA
JP NZ,DB_ERR ; HANDLE ERROR
; ;
; JUMP TO COLD BOOT ENTRY ; JUMP TO COLD BOOT ENTRY
LD HL,(BB_CPMENT) ; GET THE ENTRY POINT 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 DI ; ENTER WITH INTS DISABLED
JP (HL) ; ... AND GO
JP $FFF7 ; UNA INTER-PAGE EXEC CHAIN
; ;
#ELSE #ELSE
; ;
@ -479,7 +483,7 @@ BOOTDISK:
LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER
LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO
LD A,(HB_CURBNK) ; GET CURRENT BANK ID FROM PROXY DATA 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 A,(BL_DEVICE) ; LOAD BOOT DEVICE/UNIT
LD D,A ; SAVE IN D LD D,A ; SAVE IN D
LD A,(BL_LU) ; LOAD BOOT LU LD A,(BL_LU) ; LOAD BOOT LU

7
Source/HBIOS/std.asm

@ -86,6 +86,9 @@ FDMODE_ZETA2 .EQU 3 ; ZETA V2
FDMODE_DIDE .EQU 4 ; DUAL IDE FDMODE_DIDE .EQU 4 ; DUAL IDE
FDMODE_N8 .EQU 5 ; N8 FDMODE_N8 .EQU 5 ; N8
FDMODE_DIO3 .EQU 6 ; DISKIO V3 FDMODE_DIO3 .EQU 6 ; DISKIO V3
FDMODE_SMBSMC .EQU 7 ; RC2014 SMB SMC9266
FDMODE_SMBWDC .EQU 8 ; RC2014 SMB WD37C65
; ;
; IDE MODE SELECTIONS ; IDE MODE SELECTIONS
; ;
@ -94,6 +97,7 @@ IDEMODE_DIO .EQU 1 ; DISKIO V1
IDEMODE_DIDE .EQU 2 ; DUAL IDE IDEMODE_DIDE .EQU 2 ; DUAL IDE
IDEMODE_MK4 .EQU 3 ; MARK IV ONBOARD IDE (8 BIT) IDEMODE_MK4 .EQU 3 ; MARK IV ONBOARD IDE (8 BIT)
IDEMODE_RC .EQU 4 ; RC2014 CF BOARD (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 ; PPIDE MODE SELECTIONS
; ;
@ -103,7 +107,6 @@ PPIDEMODE_DIO3 .EQU 2 ; DISKIO V3 PARALLEL PORT
PPIDEMODE_MFP .EQU 3 ; MULTIFUNCTION / PIC PPIDEMODE_MFP .EQU 3 ; MULTIFUNCTION / PIC
PPIDEMODE_N8 .EQU 4 ; MULTIFUNCTION / PIC PPIDEMODE_N8 .EQU 4 ; MULTIFUNCTION / PIC
PPIDEMODE_RC .EQU 5 ; RC2014 PPIDE STANDARD $20 IO BASE PPIDEMODE_RC .EQU 5 ; RC2014 PPIDE STANDARD $20 IO BASE
PPIDEMODE_SMB .EQU 6 ; RC2014 PPIDE SMB $E0 IO BASE
; ;
; SD MODE SELECTIONS ; SD MODE SELECTIONS
; ;
@ -317,7 +320,7 @@ MON_SERIAL .EQU MON_LOC + (1 * 3) ; MONITOR ENTRY (SERIAL PORT)
; HELPER MACROS ; HELPER MACROS
; ;
#DEFINE PRTC(C) CALL PRTCH \ .DB C ; PRINT CHARACTER C TO CONSOLE - PRTC('X') #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 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') #DEFINE XIO_PRTC(C) CALL XIO_PRTCH \ .DB C ; PRINT CHARACTER C TO CONSOLE - PRTC('X')

18
Source/HBIOS/util.asm

@ -920,6 +920,24 @@ SUB32:
RET NC RET NC
DEC DE DEC DE
RET 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

Loading…
Cancel
Save