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
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

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)
;
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)

34
Source/HBIOS/fd.asm

@ -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

61
Source/HBIOS/hbios.asm

@ -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.

294
Source/HBIOS/hdsk.asm

@ -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 ; 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
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,85 +241,90 @@ 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:
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)
CALL NEWLINE
LD DE,HDSKSTR_PREFIX
LD DE,HDSKSTR_PREFIX
CALL WRITESTR
CALL PC_SPACE
LD DE,HDSKSTR_RESET
CALL WRITESTR
#ENDIF
;
LD B,32
LD A,HDSK_CMDRESET
HDSK_DSKRESET1:
OUT ($FD),A
DJNZ HDSK_DSKRESET1
XOR A ; STATUS = OK
LD (IY+HDSK_STAT),A ; SAVE IT
RET
;
@ -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

32
Source/HBIOS/ide.asm

@ -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

67
Source/HBIOS/md.asm

@ -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
Source/HBIOS/ppide.asm

@ -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

109
Source/HBIOS/ppp.asm

@ -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
;

127
Source/HBIOS/prp.asm

@ -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 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
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
;

123
Source/HBIOS/rf.asm

@ -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

22
Source/HBIOS/romldr.asm

@ -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

7
Source/HBIOS/std.asm

@ -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')

18
Source/HBIOS/util.asm

@ -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

Loading…
Cancel
Save