Browse Source

ParPortProp Driver Refactoring

pull/3/head
Wayne Warthen 10 years ago
parent
commit
6d8c2283b9
  1. BIN
      Hardware/Prop/Spin/ParPortProp.spin
  2. BIN
      Hardware/Prop/Spin/PropIO.spin
  3. BIN
      Hardware/Prop/Spin/PropIO2.spin
  4. 2
      Hardware/Prop/Spin/safe_spi.spin
  5. 2
      Source/HBIOS/hdsk.asm
  6. 30
      Source/HBIOS/md.asm
  7. 1073
      Source/HBIOS/ppp.asm
  8. 212
      Source/HBIOS/prp.asm
  9. 46
      Source/HBIOS/rf.asm
  10. BIN
      Tools/bst/bstl.exe

BIN
Hardware/Prop/Spin/ParPortProp.spin

Binary file not shown.

BIN
Hardware/Prop/Spin/PropIO.spin

Binary file not shown.

BIN
Hardware/Prop/Spin/PropIO2.spin

Binary file not shown.

2
Hardware/Prop/Spin/safe_spi.spin

@ -154,6 +154,8 @@ PUB start_explicit( DO, CLK, DI, CS ) : card_type | tmp, i
}}
' Start from scratch
stop
' Reset card capacity
SPI_capacity := 0
' clear my log buffer
{
bytefill( @log_cmd_resp, 0, LOG_SIZE+1 )

2
Source/HBIOS/hdsk.asm

@ -82,7 +82,7 @@ HDSK_CAP:
HDSK_GEOM:
; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS
; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE
CALL SD_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC
CALL HDSK_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC
LD L,H ; DIVIDE BY 256 FOR # TRACKS
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
LD D,$80 | 16 ; HEADS / CYL = 16, SET LBA BIT

30
Source/HBIOS/md.asm

@ -3,6 +3,22 @@
; MD DISK DRIVER (MEMORY DISK)
;==================================================================================================
;
;
;
MD_INIT:
PRTS("MD: UNITS=2 $")
PRTS("ROMDISK=$")
LD HL,ROMSIZE - 128
CALL PRTDEC
PRTS("KB RAMDISK=$")
LD HL,RAMSIZE - 128
CALL PRTDEC
PRTS("KB$")
XOR A ; INIT SUCCEEDED
RET ; RETURN
;
;
;
MD_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F
@ -31,20 +47,6 @@ MD_MEDIA:
;
;
;
MD_INIT:
PRTS("MD: UNITS=2 $")
PRTS("ROMDISK=$")
LD HL,ROMSIZE - 128
CALL PRTDEC
PRTS("KB RAMDISK=$")
LD HL,RAMSIZE - 128
CALL PRTDEC
PRTS("KB$")
XOR A ; INIT SUCCEEDED
RET ; RETURN
;
;
;
MD_STATUS:
XOR A ; ALWAYS OK
RET

1073
Source/HBIOS/ppp.asm

File diff suppressed because it is too large

212
Source/HBIOS/prp.asm

@ -6,7 +6,7 @@
; TODO:
; 1) ADD SUPPORT FOR DSKY
;
; GLOBAL PARPORTPROP INITIALIZATION
; GLOBAL PROPIO INITIALIZATION
;
PRP_INIT:
;
@ -15,15 +15,8 @@ PRP_INIT:
CALL PRTHEXBYTE
;
CALL PRP_DETECT
LD DE,PRP_STR_NOXFC
LD DE,PRP_STR_NOHW
JP NZ,WRITESTR
; JR Z,PRP_INIT1
; CALL WRITESTR
; OR $FF
; RET
;
;PRP_INIT1:
;
; RESET INTERFACE, RETURN WITH NZ ON FAILURE
#IF (PRPSDTRACE >= 3)
@ -39,30 +32,30 @@ PRP_INIT:
CALL PRPSD_GETVER
RET NZ
;
; PRINT FIRMWARE VERSION
PRTS(" F/W=$")
LD HL,PRP_FWVER
CALL LD32
LD A,D
CALL PRTHEXBYTE
CALL PRTDECB
CALL PC_PERIOD
LD A,E
CALL PRTHEXBYTE
CALL PRTDECB
CALL PC_PERIOD
LD B,H
LD C,L
CALL PRTHEXWORD
CALL PRTDEC
;
; CHECK F/W VERSION & NOTIFY USER IF UPGRADE REQUIRED
LD HL,PRP_FWVER
CALL LD32
XOR A
CP D
JR NZ,PRP_INIT2
JR NZ,PRP_INIT1
CP E
JR NZ,PRP_INIT2
LD DE,PRPSTR_UPGRADE
JR NZ,PRP_INIT1
LD DE,PRP_STR_UPGRADE
CALL WRITESTR
;
PRP_INIT2:
PRP_INIT1:
CALL PRPCON_INIT ; CONSOLE INITIALIZATION
CALL PRPSD_INIT ; SD CARD INITIALIZATION
;
@ -71,30 +64,30 @@ PRP_INIT2:
;
;
PRP_DETECT:
LD HL,(PRPSD_TIMEOUT)
PUSH HL
LD HL,$0100
LD (PRPSD_TIMEOUT),HL
CALL PRP_DETECT1
POP HL
LD (PRPSD_TIMEOUT),HL
LD BC,2000 ; TRY FOR ABOUT 4 SECONDS
PRP_DETECT1:
CALL PRP_DETECT2
RET Z
DEC BC
LD A,B
OR C
JR NZ,PRP_DETECT1
OR $FF
RET
;
PRP_DETECT1:
CALL PRPSD_WAITBSY
;RET NZ ; IGNORE CURRENT RESULT
PRP_DETECT2:
LD A,PRPSD_CMDRESET
OUT (PRPSD_DSKCMD),A
CALL PRPSD_WAITBSY
RET NZ
LD DE,64 ; 1MS
CALL VDELAY
LD A,$A5
OUT (PRPSD_DSKIO),A
LD A,$5A
OUT (PRPSD_DSKIO),A
LD A,PRPSD_CMDNOP
OUT (PRPSD_DSKCMD),A
CALL PRPSD_WAITBSY
RET NZ
LD DE,64 ; 1MS
CALL VDELAY
IN A,(PRPSD_DSKIO)
CP $A5
RET NZ
@ -104,7 +97,8 @@ PRP_DETECT1:
;
;
;
PRP_STR_NOXFC .TEXT " NOT PRESENT$"
PRP_STR_NOHW .TEXT " NOT PRESENT$"
PRP_STR_UPGRADE .TEXT " !!!UPGRADE REQUIRED!!!$"
;
;==================================================================================================
; PROPIO CONSOLE DRIVER
@ -126,6 +120,7 @@ PRPCON_INIT:
CALL NEWLINE
PRTS("PRPCON:$")
;
XOR A ; SIGNAL SUCCESS
RET
;
;
@ -187,7 +182,7 @@ PRPCON_OST1:
RET ; RETURN
;
;==================================================================================================
; PRPSD DISK DRIVER
; PROPIO SD CARD DRIVER
;==================================================================================================
;
PRPSD_UNITCNT .EQU 1
@ -238,7 +233,7 @@ PRPSD_STCRCERR .EQU -8 ; CRC ERROR ON RECEIVED DATA PACKET
PRPSD_STNOMEDIA .EQU -9 ; NO MEDIA IN CONNECTOR
PRPSD_STWRTPROT .EQU -10 ; ATTEMPT TO WRITE TO WRITE PROTECTED MEDIA
;
;
; SD CARD INITIALIZATION
;
PRPSD_INIT:
; REINITIALIZE THE CARD HERE
@ -264,6 +259,7 @@ PRPSD_INIT:
CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
PRTS("MB$") ; PRINT SUFFIX
;
XOR A ; SIGNAL SUCCESS
RET
;
;
@ -292,7 +288,7 @@ PRPSD_DISPATCH:
;
PRPSD_READ:
#IF (PRPSDTRACE == 1)
LD HL,PRPSD_PRTERR ; SET UP SD_PRTERR
LD HL,PRPSD_PRTERR ; SET UP PRPSD_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS
#ENDIF
@ -412,6 +408,70 @@ PRPSD_GEOM:
XOR A ; SIGNAL SUCCESS
RET
;
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT
; UNIT IS SPECIFIED IN A
;
PRPSD_SELUNIT:
CP PRPSD_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?)
JP NC,PRPSD_INVUNIT ; HANDLE INVALID UNIT
XOR A ; SIGNAL SUCCESS
RET ; DONE
;
;
;
PRPSD_INITCARD:
; CLEAR ALL STATUS DATA
LD HL,PRPSD_UNITDATA
LD BC,PRPSD_UNITDATALEN
XOR A
CALL FILL
;
; RESET INTERFACE, RETURN WITH NZ ON FAILURE
#IF (PRPSDTRACE >= 3)
CALL PRPSD_PRTPREFIX
PRTS(" RESET$")
#ENDIF
; REQUEST INTERFACE RESET, RESULT IN A, Z/NZ SET
LD A,PRPSD_CMDRESET ; CLEAR ANY ERRORS ON PROPIO
CALL PRPSD_SNDCMD
RET NZ ; NZ SET, A HAS RESULT CODE
;
; (RE)INITIALIZE THE CARD, RETURN WITH NZ ON FAILURE
#IF (PRPSDTRACE >= 3)
CALL PRPSD_PRTPREFIX
PRTS(" INIT$")
#ENDIF
; REQUEST HARDWARE INIT, RESULT IN A, Z/NZ SET
LD A,PRPSD_CMDINIT
CALL PRPSD_SNDCMD
RET NZ ; NZ SET, A HAS RESULT CODE
#IF (PRPSDTRACE >= 3)
; GET CSD IF DEBUGGING
CALL PRPSD_GETCSD
RET NZ
#ENDIF
; GET CARD TYPE
CALL PRPSD_GETTYPE
RET NZ
; GET CAPACITY
CALL PRPSD_GETCAP
RET NZ
RET ; N/NZ SET, A HAS RESULT CODE
;
; CHECK THE SD CARD, ATTEMPT TO REINITIALIZE IF NEEDED
;
PRPSD_CHKCARD:
LD A,(PRPSD_STAT) ; GET STATUS
OR A ; SET FLAGS
RET Z ; IF ALL GOOD, DONE
JP NZ,PRPSD_INITCARD ; OTHERWISE, REINIT
;
;
;
PRPSD_GETVER:
@ -454,9 +514,6 @@ PRPSD_GETVER:
PRPSD_GETTYPE:
#IF (PRPSDTRACE >= 3)
CALL PRPSD_PRTPREFIX
#ENDIF
#IF (PRPSDTRACE >= 3)
PRTS(" TYPE$")
#ENDIF
LD A,PRPSD_CMDTYPE
@ -479,9 +536,6 @@ PRPSD_GETTYPE:
PRPSD_GETCAP:
#IF (PRPSDTRACE >= 3)
CALL PRPSD_PRTPREFIX
#ENDIF
#IF (PRPSDTRACE >= 3)
PRTS(" CAP$")
#ENDIF
LD A,PRPSD_CMDCAP
@ -508,9 +562,6 @@ PRPSD_GETCAP:
PRPSD_GETCSD:
#IF (PRPSDTRACE >= 3)
CALL PRPSD_PRTPREFIX
#ENDIF
#IF (PRPSDTRACE >= 3)
PRTS(" CSD$")
#ENDIF
LD A,PRPSD_CMDCSD
@ -611,70 +662,6 @@ PRPSD_WAITBSY2:
OR A ; SET FLAGS
RET ; AND RETURN WITH STATUS IN A
;
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT
; UNIT IS SPECIFIED IN A
;
PRPSD_SELUNIT:
CP PRPSD_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?)
JP NC,PRPSD_INVUNIT ; HANDLE INVALID UNIT
XOR A ; SIGNAL SUCCESS
RET ; DONE
;
;
;
PRPSD_INITCARD:
; CLEAR ALL STATUS DATA
LD HL,PRPSD_UNITDATA
LD BC,PRPSD_UNITDATALEN
XOR A
CALL FILL
;
; RESET INTERFACE, RETURN WITH NZ ON FAILURE
#IF (PRPSDTRACE >= 3)
CALL PRPSD_PRTPREFIX
PRTS(" RESET$")
#ENDIF
; REQUEST INTERFACE RESET, RESULT IN A, Z/NZ SET
LD A,PRPSD_CMDRESET ; CLEAR ANY ERRORS ON PROPIO
CALL PRPSD_SNDCMD
RET NZ ; NZ SET, A HAS RESULT CODE
;
; (RE)INITIALIZE THE CARD, RETURN WITH NZ ON FAILURE
#IF (PRPSDTRACE >= 3)
CALL PRPSD_PRTPREFIX
PRTS(" INIT$")
#ENDIF
; REQUEST HARDWARE INIT, RESULT IN A, Z/NZ SET
LD A,PRPSD_CMDINIT
CALL PRPSD_SNDCMD
RET NZ ; NZ SET, A HAS RESULT CODE
#IF (PRPSDTRACE >= 3)
; GET CSD IF DEBUGGING
CALL PRPSD_GETCSD
RET NZ
#ENDIF
; GET CARD TYPE
CALL PRPSD_GETTYPE
RET NZ
; GET CAPACITY
CALL PRPSD_GETCAP
RET NZ
RET ; N/NZ SET, A HAS RESULT CODE
;
; CHECK THE SD CARD, ATTEMPT TO REINITIALIZE IF NEEDED
;
PRPSD_CHKCARD:
LD A,(PRPSD_STAT) ; GET STATUS
OR A ; SET FLAGS
RET Z ; IF ALL GOOD, DONE
JP NZ,PRPSD_INITCARD ; OTHERWISE, REINIT
;
; SEND INDEX OF BLOCK TO READ/WRITE FROM SD CARD
; 32 BIT VALUE (4 BYTES)
;
@ -884,17 +871,19 @@ PRPSD_STR_STCRCERR .TEXT "CRC ERROR$"
PRPSD_STR_STNOMEDIA .TEXT "NO MEDIA$"
PRPSD_STR_STWRTPROT .TEXT "WRITE PROTECTED$"
PRPSD_STR_STUNK .TEXT "UNKNOWN$"
;
PRPSD_STR_TYPEUNK .TEXT "UNK$"
PRPSD_STR_TYPEMMC .TEXT "MMC$"
PRPSD_STR_TYPESDSC .TEXT "SDSC$"
PRPSD_STR_TYPESDHC .TEXT "SDHC$"
PRPSD_STR_TYPESDXC .TEXT "SDXC$"
PRPSTR_UPGRADE .TEXT " !!!UPGRADE REQUIRED!!!$"
;
;=============================================================================
; DATA STORAGE
;=============================================================================
;
PRP_FWVER .DB $00, $00, $00, $00 ; MMNNBBB (M=MAJOR, N=MINOR, B=BUILD)
;
PRPSD_UNITDATA:
PRPSD_STAT .DB 0
PRPSD_DSKSTAT .DB 0
@ -905,8 +894,5 @@ PRPSD_CSDBUF .FILL 16,0
PRPSD_UNITDATALEN .EQU $ - PRPSD_UNITDATA
;
PRPSD_CMD .DB 0
PRPSD_BLK .DB 0, 0, 0, 0
;
PRP_FWVER .DB $00, $00, $00, $00 ; MMNNBBB (M=MAJOR, N=MINOR, B=BUILD)
;
PRPSD_TIMEOUT .DW $0000 ; FIX: MAKE THIS CPU SPEED RELATIVE

46
Source/HBIOS/rf.asm

@ -17,6 +17,16 @@ RF_ST .EQU 3
;
;
;
RF_INIT:
PRTS("RF: UNITS=$")
LD A,RFCNT
CALL PRTDECB
;
XOR A ; INIT SUCCEEDED
RET ; RETURN
;
;
;
RF_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F
@ -27,6 +37,10 @@ RF_DISPATCH:
JR Z,RF_STATUS
DEC A
JR Z,RF_MEDIA
DEC A
JP Z,RF_CAP
DEC A
JP Z,RF_GEOM
CALL PANIC
;
; RF_MEDIA
@ -42,18 +56,34 @@ RF_MEDIA:
;
;
;
RF_INIT:
PRTS("RF: UNITS=$")
LD A,RFCNT
CALL PRTDECB
RF_STATUS:
XOR A ; STATUS ALWAYS OK
RET
;
;
XOR A ; INIT SUCCEEDED
RET ; RETURN
;
RF_CAP:
LD A,C ; DEVICE/UNIT IS IN C
AND $0F ; ISOLATE UNIT NUM
CP RFCNT ; CHECK FOR MAX UNIT EXCEEDED
CALL NC,PANIC ; PANIC IF TOO HIGH
;
LD DE,0
LD HL,$2000 ; 8192 BLOCKS OF 512 BYTES
XOR A
RET
;
RF_STATUS:
XOR A ; STATUS ALWAYS OK
;
;
RF_GEOM:
; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS
; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE
CALL RF_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC
LD L,H ; DIVIDE BY 256 FOR # TRACKS
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
LD E,16 ; SECTORS / TRACK = 16
XOR A ; SIGNAL SUCCESS
RET
;
;

BIN
Tools/bst/bstl.exe

Binary file not shown.
Loading…
Cancel
Save