diff --git a/Hardware/Prop/Spin/ParPortProp.spin b/Hardware/Prop/Spin/ParPortProp.spin index 8cb012d5..e6d96923 100644 Binary files a/Hardware/Prop/Spin/ParPortProp.spin and b/Hardware/Prop/Spin/ParPortProp.spin differ diff --git a/Hardware/Prop/Spin/PropIO.spin b/Hardware/Prop/Spin/PropIO.spin index 3e1a56b8..cbd341b3 100644 Binary files a/Hardware/Prop/Spin/PropIO.spin and b/Hardware/Prop/Spin/PropIO.spin differ diff --git a/Hardware/Prop/Spin/PropIO2.spin b/Hardware/Prop/Spin/PropIO2.spin index 17220370..2ca06d54 100644 Binary files a/Hardware/Prop/Spin/PropIO2.spin and b/Hardware/Prop/Spin/PropIO2.spin differ diff --git a/Hardware/Prop/Spin/safe_spi.spin b/Hardware/Prop/Spin/safe_spi.spin index 0b400d49..af49954a 100644 --- a/Hardware/Prop/Spin/safe_spi.spin +++ b/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 ) diff --git a/Source/HBIOS/hdsk.asm b/Source/HBIOS/hdsk.asm index a5fa3efe..d0ed37b8 100644 --- a/Source/HBIOS/hdsk.asm +++ b/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 diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index d1a0f7f5..ffa43899 100644 --- a/Source/HBIOS/md.asm +++ b/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 diff --git a/Source/HBIOS/ppp.asm b/Source/HBIOS/ppp.asm index 93b1a0c8..d0ede301 100644 --- a/Source/HBIOS/ppp.asm +++ b/Source/HBIOS/ppp.asm @@ -3,124 +3,255 @@ ; PARPORTPROP DRIVER ;================================================================================================== ; -PPIA .EQU PPIBASE + 0 ; PORT A -PPIB .EQU PPIBASE + 1 ; PORT B -PPIC .EQU PPIBASE + 2 ; PORT C -PPIX .EQU PPIBASE + 3 ; PPI CONTROL PORT +; TODO: +; 1) ADD SUPPORT FOR DSKY +; +PPP_IO .EQU PPIBASE + 0 ; PPP DATA I/O (PPI PORT A) +PPP_CTL .EQU PPIBASE + 2 ; PPP CTL LINES (PPI PORT C) +PPP_PPICTL .EQU PPIBASE + 3 ; PPI CONTROL PORT ; ; COMMAND BYTES ; -PPP_CMDNOP .EQU $00 ; DO NOTHING -PPP_CMDECHOBYTE .EQU $01 ; RECEIVE A BYTE, INVERT IT, SEND IT BACK -PPP_CMDECHOBUF .EQU $02 ; RECEIVE 512 BYTE BUFFER, SEND IT BACK +PPP_CMDNOP .EQU $00 ; DO NOTHING +PPP_CMDECHOBYTE .EQU $01 ; RECEIVE A BYTE, INVERT IT, SEND IT BACK +PPP_CMDECHOBUF .EQU $02 ; RECEIVE 512 BYTE BUFFER, SEND IT BACK ; -PPP_CMDDSKRES .EQU $10 ; RESTART SD CARD SUPPORT -PPP_CMDDSKSTAT .EQU $11 ; SEND LAST SD CARD STATUS (4 BYTES) -PPP_CMDDSKPUT .EQU $12 ; PPI -> SECTOR BUFFER -> PPP -PPP_CMDDSKGET .EQU $13 ; PPP -> SECTOR BUFFER -> PPI -PPP_CMDDSKRD .EQU $14 ; READ SCTOR FROM SD CARD INTO PPP BUFFER, RETURN 1 BYTE STATUS -PPP_CMDDSKWR .EQU $15 ; WRITE SECTOR TO SD CARD FROM PPP BUFFER, RETURN 1 BYTE STATUS +PPP_CMDDSKRES .EQU $10 ; RESTART SD CARD SUPPORT +PPP_CMDDSKSTAT .EQU $11 ; SEND LAST SD CARD STATUS (4 BYTES) +PPP_CMDDSKPUT .EQU $12 ; PPI -> SECTOR BUFFER -> PPP +PPP_CMDDSKGET .EQU $13 ; PPP -> SECTOR BUFFER -> PPI +PPP_CMDDSKRD .EQU $14 ; READ SCTOR FROM SD CARD INTO PPP BUFFER, RETURN 1 BYTE STATUS +PPP_CMDDSKWR .EQU $15 ; WRITE SECTOR TO SD CARD FROM PPP BUFFER, RETURN 1 BYTE STATUS +PPP_CMDDSKTYPE .EQU $16 ; GET SD CARD TYPE +PPP_CMDDSKCAP .EQU $17 ; GET CURRENT DISK CAPACITY +PPP_CMDDSKCSD .EQU $18 ; GET CURRENT SD CARD CSD REGISTER ; -PPP_CMDVIDOUT .EQU $20 ; WRITE A BYTE TO THE TERMINAL EMULATOR +PPP_CMDVIDOUT .EQU $20 ; WRITE A BYTE TO THE TERMINAL EMULATOR ; -PPP_CMDKBDSTAT .EQU $30 ; RETURN A BYTE WITH NUMBER OF CHARACTERS IN BUFFER -PPP_CMDKBDRD .EQU $31 ; RETURN A CHARACTER, WAIT IF NECESSARY +PPP_CMDKBDSTAT .EQU $30 ; RETURN A BYTE WITH NUMBER OF CHARACTERS IN BUFFER +PPP_CMDKBDRD .EQU $31 ; RETURN A CHARACTER, WAIT IF NECESSARY ; -PPP_CMDSPKTONE .EQU $40 ; EMIT SPEAKER TONE AT SPECIFIED FREQUENCY AND DURATION +PPP_CMDSPKTONE .EQU $40 ; EMIT SPEAKER TONE AT SPECIFIED FREQUENCY AND DURATION ; -PPP_CMDSIOINIT .EQU $50 ; RESET SERIAL PORT AND ESTABLISH A NEW BAUD RATE (4 BYTE BAUD RATE) -PPP_CMDSIORX .EQU $51 ; RECEIVE A BYTE IN FROM SERIAL PORT -PPP_CMDSIOTX .EQU $52 ; TRANSMIT A BYTE OUT OF THE SERIAL PORT -PPP_CMDSIORXST .EQU $53 ; SERIAL PORT RECEIVE STATUS (RETURNS # BYTES OF RX BUFFER USED) -PPP_CMDSIOTXST .EQU $54 ; SERIAL PORT TRANSMIT STATUS (RETURNS # BYTES OF TX BUFFER SPACE AVAILABLE) -PPP_CMDSIORXFL .EQU $55 ; SERIAL PORT RECEIVE BUFFER FLUSH -PPP_CMDSIOTXFL .EQU $56 ; SERIAL PORT TRANSMIT BUFFER FLUSH (NOT IMPLEMENTED) +PPP_CMDSIOINIT .EQU $50 ; RESET SERIAL PORT AND ESTABLISH A NEW BAUD RATE (4 BYTE BAUD RATE) +PPP_CMDSIORX .EQU $51 ; RECEIVE A BYTE IN FROM SERIAL PORT +PPP_CMDSIOTX .EQU $52 ; TRANSMIT A BYTE OUT OF THE SERIAL PORT +PPP_CMDSIORXST .EQU $53 ; SERIAL PORT RECEIVE STATUS (RETURNS # BYTES OF RX BUFFER USED) +PPP_CMDSIOTXST .EQU $54 ; SERIAL PORT TRANSMIT STATUS (RETURNS # BYTES OF TX BUFFER SPACE AVAILABLE) +PPP_CMDSIORXFL .EQU $55 ; SERIAL PORT RECEIVE BUFFER FLUSH +PPP_CMDSIOTXFL .EQU $56 ; SERIAL PORT TRANSMIT BUFFER FLUSH (NOT IMPLEMENTED) ; -PPP_CMDRESET .EQU $F0 ; SOFT RESET PROPELLER +PPP_CMDRESET .EQU $F0 ; SOFT RESET PROPELLER +PPP_CMDVER .EQU $F1 ; SEND FIRMWARE VERSION ; ; GLOBAL PARPORTPROP INITIALIZATION ; PPP_INIT: - PRTS("PPP: RESET$") + PRTS("PPP: IO=0x$") + LD A,PPIBASE + CALL PRTHEXBYTE ; - LD A,$9B ; PPI MODE 0, ALL PINS INPUT - OUT (PPIX),A ; SEND IT - - LD A,11000010B ; PPI MODE 2 (BI HANDSHAKE), PC0-2 OUT, PB IN - OUT (PPIX),A - + CALL PPP_INITPPP ; INIT PPP BOARD + RET NZ ; BAIL OUT ON ERROR +; + CALL PPP_DETECT ; DETECT PPP PRESENCE + LD DE,PPP_STR_NOHW ; PREPARE FOR NOT PRESENT + JP NZ,WRITESTR ; BAIL OUT WITH NZ IF NOT DETECTED +; + CALL PPP_GETVER ; GET F/W VERSION + RET NZ ; ABORT ON FAILURE +; + ; PRINT FIRMWARE VERSION + PRTS(" F/W=$") + LD HL,PPP_FWVER + CALL LD32 + LD A,D + CALL PRTDECB + CALL PC_PERIOD + LD A,E + CALL PRTDECB + CALL PC_PERIOD + CALL PRTDEC +; + ; CHECK F/W VERSION & NOTIFY USER IF UPGRADE REQUIRED + LD HL,PPP_FWVER + CALL LD32 + XOR A + CP D + JR NZ,PPP_INIT1 + CP E + JR NZ,PPP_INIT1 + LD DE,PPP_STR_UPGRADE + CALL WRITESTR +; +PPP_INIT1: + CALL PPPCON_INIT ; CONSOLE INITIALIZATION + CALL PPPSD_INIT ; SD CARD INITIALIZATION +; + RET +; +; +; +PPP_INITPPP: + ; SETUP PARALLEL PORT (8255) + LD A,%11000010 ; PPI MODE 2 (BI HANDSHAKE), PC0-2 OUT, PB IN + OUT (PPP_PPICTL),A ; NOTE: ALL OUTPUTS SET TO LOGIC ZERO ON MODE CHANGE CALL DELAY ; PROBABLY NOT NEEDED - - LD A,00000000B ; SET PC0 -> 0 - OUT (PPIX),A - LD A,00000010B ; SET PC1 -> 0 - OUT (PPIX),A - LD A,00000101B ; SET PC2 -> 1 - ASSERT RESET ON PPP - OUT (PPIX),A - LD A,00000110B ; SET PC3 -> 0 - OUT (PPIX),A - + + ; RESET PROPELLER + LD A,%00000101 ; SET PC2 (ASSERT PROP RESET LINE) + OUT (PPP_PPICTL),A CALL DELAY ; PROBABLY NOT NEEDED - - IN A,(PPIA) ; CLEAR GARBAGE??? - + IN A,(PPP_IO) ; CLEAR GARBAGE??? CALL DELAY ; PROBABLY NOT NEEDED - - LD A,00000001B ; SET CMD FLAG - OUT (PPIX),A ; SEND IT - LD E,PPP_CMDRESET - CALL PUTBYTE ; SEND THE COMMAND BYTE - CALL DELAY - LD A,00000000B ; CLEAR CMD FLAG - OUT (PPIX),A - - LD A,00000100B ; SET PC2 -> 0 - DEASSERT RESET ON PPP - OUT (PPIX),A - + LD A,%00000001 ; SET PC0 (CMD FLAG) + OUT (PPP_PPICTL),A ; DO IT + LD A,PPP_CMDRESET ; RESET COMMAND + CALL PPP_PUTBYTE ; SEND IT + CALL DELAY ; DELAY FOR PPP TO PROCESS COMMAND + LD A,%00000000 ; CLEAR PC0 (CMD FLAG) + OUT (PPP_PPICTL),A ; DO IT + LD A,%00000100 ; CLEAR PC2 (DEASSERT PROP RESET LINE) + OUT (PPP_PPICTL),A ; DO IT CALL DELAY ; PROBABLY NOT NEEDED - - LD BC,0 -INIT1: - PUSH BC - CALL DELAY - CALL DELAY - CALL DELAY - CALL DELAY - CALL DELAY - IN A,(PPIA) - POP BC + + XOR A ; SIGNAL SUCCESS + RET +; +; +; +PPP_DETECT: + LD BC,4000 ; TRY FOR ABOUT 4 SECONDS +PPP_DETECT1: + LD DE,64 ; 1 MS + CALL VDELAY + IN A,(PPP_IO) CP $AA - RET Z + RET Z ; RETURN IF MATCH DEC BC LD A,B OR C - JR NZ,INIT1 - + JR NZ,PPP_DETECT1 + OR $FF ; SIGNAL FAILURE + RET +; +; +; +PPP_GETVER: +#IF (PPPSDTRACE >= 3) + CALL PPP_PRTPREFIX + PRTS(" VER$") +#ENDIF + LD D,PPP_CMDVER ; COMMAND = GET VERSION + CALL PPP_SNDCMD ; SEND COMMAND + RET NZ + LD B,4 ; GET 4 BYTES + LD HL,PPP_FWVER +PPP_GETVER1: + CALL PPP_GETBYTE + LD (HL),A + INC HL + DJNZ PPP_GETVER1 +; +#IF (PPPSDTRACE >= 3) + CALL PC_SPACE + LD HL,PPP_FWVER + CALL LD32 + CALL PRTHEX32 +#ENDIF +; + XOR A ; SIGNAL SUCCESS + RET +; +; +; +PPP_SNDCMD: + IN A,(PPP_IO) ; DISCARD ANYTHING PENDING + ; WAIT FOR OBF HIGH (OUTPUT BUFFER TO BE EMPTY) + IN A,(PPP_CTL) + BIT 7,A + JR Z,PPP_SNDCMD + + LD A,%00000001 ; SET CMD FLAG + OUT (PPP_PPICTL),A ; SEND IT + +PPP_SNDCMD0: + IN A,(PPP_CTL) + BIT 7,A + JR Z,PPP_SNDCMD0 + LD A,D + OUT (PPP_IO),A + +PPP_SNDCMD1: + ; WAIT FOR OBF HIGH (BYTE HAS BEEN RECEIVED) + IN A,(PPP_CTL) + BIT 7,A + JR Z,PPP_SNDCMD1 + ; TURN OFF CMD + LD A,%00000000 ; CLEAR CMD FLAG + OUT (PPP_PPICTL),A + + XOR A ; SIGNAL SUCCESS + RET +; +; +; +PPP_PUTBYTE: + PUSH AF + IN A,(PPP_CTL) + BIT 7,A + JR Z,PPP_PUTBYTE + POP AF + OUT (PPP_IO),A + RET +; +; +; +PPP_GETBYTE: + IN A,(PPP_CTL) + BIT 5,A + JR Z,PPP_GETBYTE + IN A,(PPP_IO) + RET +; +; PRINT DIAGNONSTIC PREFIX +; +PPP_PRTPREFIX: CALL NEWLINE - LD DE,PPPSTR_TIMEOUT - CALL WRITESTR - - CALL PPPSD_INIT ; SD CARD INITIALIZATION - + PRTS("PPP:$") RET ; +; +; +PPP_STR_NOHW .TEXT " NOT PRESENT$" +PPP_STR_UPGRADE .TEXT " !!!UPGRADE REQUIRED!!!$" +; +PPP_FWVER .DB $00, $00, $00, $00 ; MMNNBBB (M=MAJOR, N=MINOR, B=BUILD) +; ;================================================================================================== ; PARPORTPROP CONSOLE DRIVER ;================================================================================================== ; +PPPCON_INIT: + CALL NEWLINE + PRTS("PPPCON:$") +; + XOR A + RET +; ; DISPATCH FOR CONSOLE SUBFUNCTIONS ; PPPCON_DISPATCH: - LD A,B ; GET REQUESTED FUNCTION - AND $0F ; ISOLATE SUB-FUNCTION - JR Z,PPPCON_IN ; JUMP IF CHARACTER IN - DEC A ; NEXT SUBFUNCTION - JR Z,PPPCON_OUT ; JUMP IF CHARACTER OUT - DEC A ; NEXT SUBFUCNTION - JR Z,PPPCON_IST ; JUMP IF INPUT STATUS - DEC A ; NEXT SUBFUNCTION - JR Z,PPPCON_OST ; JUMP IF OUTPUT STATUS - CALL PANIC ; OTHERWISE SOMETHING IS BADLY BROKEN + LD A,B ; GET REQUESTED FUNCTION + AND $0F ; ISOLATE SUB-FUNCTION + JR Z,PPPCON_IN ; JUMP IF CHARACTER IN + DEC A ; NEXT SUBFUNCTION + JR Z,PPPCON_OUT ; JUMP IF CHARACTER OUT + DEC A ; NEXT SUBFUCNTION + JR Z,PPPCON_IST ; JUMP IF INPUT STATUS + DEC A ; NEXT SUBFUNCTION + JR Z,PPPCON_OST ; JUMP IF OUTPUT STATUS + CALL PANIC ; OTHERWISE SOMETHING IS BADLY BROKEN ; ; CHARACTER INPUT ; WAIT FOR A CHARACTER AND RETURN IT IN E @@ -129,19 +260,18 @@ PPPCON_IN: CALL PPPCON_IST ; CHECK FOR CHAR PENDING JR Z,PPPCON_IN ; WAIT FOR IT IF NECESSARY LD D,PPP_CMDKBDRD ; CMD = KEYBOARD READ - CALL SENDCMD ; SEND COMMAND - CALL GETBYTE ; GET CHARACTER READ + CALL PPP_SNDCMD ; SEND COMMAND + CALL PPP_GETBYTE ; GET CHARACTER READ XOR A ; CLEAR A (SUCCESS) - RET ; AND RETURN + RET ; AND RETURN ; ; CHARACTER INPUT STATUS ; RETURN STATUS IN A, 0 = NOTHING PENDING, > 0 CHAR PENDING ; PPPCON_IST: LD D,PPP_CMDKBDSTAT ; CMD = KEYBOARD STATUS - CALL SENDCMD ; SEND COMMAND - CALL GETBYTE ; GET RESPONSE - LD A,E ; MOVE IT TO A + CALL PPP_SNDCMD ; SEND COMMAND + CALL PPP_GETBYTE ; GET RESPONSE OR A ; SET FLAGS RET NZ ; A <> 0, CHAR(S) PENDING JP CIO_IDLE ; OTHERWISE RET VIA IDLE PROCESSING @@ -153,8 +283,9 @@ PPPCON_OUT: CALL PPPCON_OST ; CHECK FOR OUTPUT READY JR Z,PPPCON_OUT ; WAIT IF NECESSARY LD D,PPP_CMDVIDOUT ; CMD = VIDEO OUTPUT - CALL SENDCMD ; SEND COMMAND - CALL PUTBYTE ; SEND IT + CALL PPP_SNDCMD ; SEND COMMAND + LD A,E + CALL PPP_PUTBYTE ; SEND IT RET ; RETURN ; ; CHARACTER OUTPUT STATUS @@ -170,157 +301,284 @@ PPPCON_OST: ; PARPORTPROP SD CARD DRIVER ;================================================================================================== ; -PPPSD_DISPATCH: - LD A,B ; GET REQUESTED FUNCTION - AND $0F - JP Z,PPPSD_READ ; READ - DEC A - JP Z,PPPSD_WRITE ; WRITE - DEC A - JP Z,PPPSD_STATUS ; STATUS - DEC A - JP Z,PPPSD_MEDIA ; MEDIA ID - DEC A - JP Z,PPPSD_CAP - DEC A - JP Z,PPPSD_GEOM - CALL PANIC +PPPSD_UNITCNT .EQU 1 ; -; SETUP FOR SUBSEQUENT ACCESS -; INIT CARD IF NOT READY OR ON DRIVE LOG IN +; SD CARD TYPE ; -PPPSD_MEDIA: - ; REINITIALIZE THE CARD HERE TO DETERMINE PRESENCE +PPPSD_TYPEUNK .EQU 0 ; CARD TYPE UNKNOWN/UNDETERMINED +PPPSD_TYPEMMC .EQU 1 ; MULTIMEDIA CARD (MMC STANDARD) +PPPSD_TYPESDSC .EQU 2 ; SDSC CARD (V1) +PPPSD_TYPESDHC .EQU 3 ; SDHC CARD (V2) +PPPSD_TYPESDXC .EQU 4 ; SDXC CARD (V3) +; +; SD CARD STATUS (PPPSD_STAT) +; +PPPSD_STOK .EQU 0 ; OK +PPPSD_STINVUNIT .EQU -1 ; INVALID UNIT +PPPSD_STRDYTO .EQU -2 ; TIMEOUT WAITING FOR CARD TO BE READY +PPPSD_STINITTO .EQU -3 ; INITIALIZATOIN TIMEOUT +PPPSD_STCMDTO .EQU -4 ; TIMEOUT WAITING FOR COMMAND RESPONSE +PPPSD_STCMDERR .EQU -5 ; COMMAND ERROR OCCURRED (REF SD_RC) +PPPSD_STDATAERR .EQU -6 ; DATA ERROR OCCURRED (REF SD_TOK) +PPPSD_STDATATO .EQU -7 ; DATA TRANSFER TIMEOUT +PPPSD_STCRCERR .EQU -8 ; CRC ERROR ON RECEIVED DATA PACKET +PPPSD_STNOMEDIA .EQU -9 ; NO MEDIA IN CONNECTOR +PPPSD_STWRTPROT .EQU -10 ; ATTEMPT TO WRITE TO WRITE PROTECTED MEDIA +; +; SD CARD INITIALIZATION +; +PPPSD_INIT: + ; REINITIALIZE THE CARD HERE CALL PPPSD_INITCARD - LD A,MID_NONE ; ASSUME FAILURE RET NZ - - ; ALL IS WELL, RETURN MEDIA IDENTIFIER - LD A,MID_HD ; SET MEDIA ID - RET -; ; + CALL NEWLINE + PRTS("PPPSD:$") ; -PPPSD_CAP: - LD HL,PPPSD_BLKCNT ; GET BLOCK COUNT - CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL - LD BC,512 ; 512 BYTES PER BLOCK - XOR A ; SIGNAL SUCCESS - RET ; AND DONE + ; PRINT CARD TYPE + PRTS(" TYPE=$") + CALL PPPSD_PRTTYPE ; + ; PRINT STORAGE CAPACITY (BLOCK COUNT) + PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL + LD HL,PPPSD_BLKCNT ; POINT TO BLOCK COUNT + CALL LD32 ; GET THE CAPACITY VALUE + CALL PRTHEX32 ; PRINT HEX VALUE ; + ; PRINT STORAGE SIZE IN MB + PRTS(" SIZE=$") ; PRINT FIELD LABEL + LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB + CALL SRL32 ; RIGHT SHIFT + CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED) + PRTS("MB$") ; PRINT SUFFIX ; -PPPSD_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 PPPSD_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 ; -; SD CARD INITIALIZATION -; -PPPSD_INIT: - ; MARK DRIVE NOT READY - ; HARDWARE INIT DEFERRED UNTIL DRIVE SELECT - XOR A - DEC A - LD (PPPSD_STAT),A - RET ; -; REPORT SD CARD READY STATE ; -PPPSD_STATUS: - LD A,(PPPSD_STAT) ; GET THE CURRENT READY STATUS - OR A - RET +PPPSD_DISPATCH: + LD A,C ; DEVICE/UNIT TO A + AND $0F ; REMOVE DEVICE BITS LEAVING JUST UNIT ID + CALL PPPSD_SELUNIT ; SELECT DESIRED UNIT + RET NZ ; ABORT ON ERROR + LD A,B ; GET REQUESTED FUNCTION + AND $0F + JP Z,PPPSD_READ ; READ + DEC A + JP Z,PPPSD_WRITE ; WRITE + DEC A + JP Z,PPPSD_STATUS ; STATUS + DEC A + JP Z,PPPSD_MEDIA ; MEDIA ID + DEC A + JP Z,PPPSD_CAP + DEC A + JP Z,PPPSD_GEOM + CALL PANIC ; ; READ AN LBA BLOCK FROM THE SD CARD ; PPPSD_READ: +#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 + +#IF (PPPSDTRACE >= 3) + PRTS(" READ$") +#ENDIF + ; READ A SECTOR - CALL PPPSD_SETBLK ; SETUP PPP_LBA WITH BLOCK NUMBER - LD D,PPP_CMDDSKRD ; COMMAND = DSKWR - CALL SENDCMD ; SEND COMMAND + LD D,PPP_CMDDSKRD ; COMMAND = DSKRD + CALL PPP_SNDCMD ; SEND COMMAND + RET NZ + + LD DE,$FFFF + LD HL,$FFFF + LD BC,HSTLBA + CALL ST32 + CALL PPPSD_SENDBLK ; SEND THE LBA BLOCK NUMBER - CALL GETBYTE - LD A,E - LD (PPPSD_STAT),A ; SAVE STATUS - CALL PPPSD_PRTREAD ; PRINT DIAGNOSTICS AS NEEDED + CALL PPP_GETBYTE ; GET READ RESULT +#IF (PPPSDTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF OR A ; SET FLAGS - RET NZ ; BAIL OUT ON ERROR + JR Z,PPPSD_READ1 + + ; HANDLE ERROR + CALL PPPSD_GETDSKSTAT ; GET FULL ERROR CODE + JP PPPSD_ERRCMD ; HANDLE ERRORS +PPPSD_READ1: ; GET THE SECTOR DATA LD D,PPP_CMDDSKGET ; COMMAND = DSKGET - CALL SENDCMD ; SEND COMMAND + CALL PPP_SNDCMD ; SEND COMMAND + RET NZ ; READ THE SECTOR DATA LD BC,512 LD HL,(DIOBUF) -DSKREAD1: - CALL GETBYTE - LD (HL),E +PPPSD_READ2: + CALL PPP_GETBYTE + LD (HL),A INC HL DEC BC LD A,B OR C - JP NZ,DSKREAD1 + JP NZ,PPPSD_READ2 - XOR A ; SUCCESS + XOR A ; SIGNAL SUCCESS RET ; ; WRITE AN LBA BLOCK TO THE SD CARD ; PPPSD_WRITE: +#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 - - CALL PPPSD_SETBLK ; SETUP THE LBA BLOCK INDEX - + +#IF (PPPSDTRACE >= 3) + CALL PPPSD_PRTPREFIX +#ENDIF + +#IF (PPPSDTRACE >= 3) + PRTS(" WRITE$") +#ENDIF + ; PUT THE SECTOR DATA LD D,PPP_CMDDSKPUT ; COMMAND = DSKPUT - CALL SENDCMD ; SEND COMMAND + CALL PPP_SNDCMD ; SEND COMMAND + RET NZ ; SEND OVER THE SECTOR CONTENTS LD BC,512 LD HL,(DIOBUF) -DSKWRITE1: - LD E,(HL) +PPPSD_WRITE1: + LD A,(HL) INC HL - CALL PUTBYTE + CALL PPP_PUTBYTE DEC BC LD A,B OR C - JP NZ,DSKWRITE1 + JP NZ,PPPSD_WRITE1 ; WRITE THE SECTOR LD D,PPP_CMDDSKWR ; COMMAND = DSKWR - CALL SENDCMD + CALL PPP_SNDCMD + RET NZ CALL PPPSD_SENDBLK ; SEND THE LBA BLOCK NUMBER - CALL GETBYTE - LD A,E - LD (PPPSD_STAT),A ; SAVE STATUS - CALL PPPSD_PRTWRITE ; PRINT DIAGNOSTICS AS NEEDED + CALL PPP_GETBYTE +#IF (PPPSDTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF + OR A ; SET FLAGS + RET Z ; DONE IF NO ERRORS + + ; HANDLE ERROR + CALL PPPSD_GETDSKSTAT ; GET FULL ERROR CODE + JP PPPSD_ERRCMD ; EXIT VIA ERROR HANDLER +; +; REPORT SD CARD READY STATE +; +PPPSD_STATUS: + LD A,(PPPSD_STAT) ; GET THE CURRENT READY STATUS + OR A + RET +; +; SETUP FOR SUBSEQUENT ACCESS +; INIT CARD IF NOT READY OR ON DRIVE LOG IN +; +PPPSD_MEDIA: + ; REINITIALIZE THE CARD HERE TO DETERMINE PRESENCE + CALL PPPSD_INITCARD +#IF (PPPSDTRACE == 1) + CALL PPPSD_PRTERR ; PRINT ANY ERRORS +#ENDIF + LD A,MID_HD ; ASSUME SUCCESS, SETUP MEDIA ID + RET Z ; RETURN IF GOOD INIT + LD A,MID_NONE ; SIGNAL NO MEDA OR A ; SET FLAGS - RET ; ALL DONE + RET ; AND RETURN +; +; +; +PPPSD_CAP: + LD HL,PPPSD_BLKCNT ; GET BLOCK COUNT + CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL + LD BC,512 ; 512 BYTES PER BLOCK + XOR A ; SIGNAL SUCCESS + RET ; AND DONE +; +; +; +PPPSD_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 PPPSD_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 +; +; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT +; UNIT IS SPECIFIED IN A +; +PPPSD_SELUNIT: + CP PPPSD_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?) + JP NC,PPPSD_INVUNIT ; HANDLE INVALID UNIT + XOR A ; SIGNAL SUCCESS + RET ; DONE ; ; REINITIALIZE THE SD CARD ; PPPSD_INITCARD: + ; CLEAR ALL STATUS DATA + LD HL,PPPSD_UNITDATA + LD BC,PPPSD_UNITDATALEN + XOR A + CALL FILL +; ; RESET & STATUS DISK LD D,PPP_CMDDSKRES ; COMMAND = DSKRESET - CALL SENDCMD - CALL GETBYTE - LD A,E + CALL PPP_SNDCMD + RET NZ + CALL PPP_GETBYTE LD (PPPSD_STAT),A ; SAVE UPDATED STATUS OR A - RET ; Z/NZ SET, A HAS RESULT CODE + RET NZ ; BAIL OUT ON ERROR + +#IF (PPPSDTRACE >= 3) + ; GET CSD IF DEBUGGING + CALL PPPSD_GETCSD + RET NZ +#ENDIF + + ; GET CARD TYPE + CALL PPPSD_GETTYPE + RET NZ + + ; GET CAPACITY + CALL PPPSD_GETCAP + RET NZ + + RET ; ; CHECK THE SD CARD, ATTEMPT TO REINITIALIZE IF NEEDED ; @@ -330,183 +588,336 @@ PPPSD_CHKCARD: CALL NZ,PPPSD_INITCARD ; INIT CARD IF NOT READY RET ; RETURN WITH STATUS IN A ; -; SET UP LBA BLOCK INDEX -; NOTE THAT BYTE ORDER IS LITTLE ENDIAN FOR PROPLELLER! -; -PPPSD_SETBLK: -; LD HL,PPP_LBA + 3 ; WORK BACKWARDS, START WITH END OF LBA -; XOR A ; MSB OF LBA IS ALWAYS ZERO -; LD (HL),A ; LBAHI:MSB = 0 -; DEC HL ; POINT TO NEXT BYTE -; LD DE,(HSTTRK) ; DE = HSTTRK -; LD (HL),D ; LBAHI:LSB = D = HSTTRK:MSB -; DEC HL ; POINT TO NEXT BYTE -; LD (HL),E ; LBALO:MSB = E = HSTTRK:LSB -; DEC HL ; POINT TO NEXT BYTE -; LD A,(HSTSEC) ; A = HSTSEC:LSB -; LD (HL),A ; LBALO:LSB = A = HSTSEC:LSB - LD HL,(HSTLBALO) ; GET LBA LOW WORD - LD (PPP_LBALO),HL ; SAVE IT IN LBA BUFFER LO - LD HL,(HSTLBAHI) ; GET LBA HIGH WORD - LD (PPP_LBAHI),HL ; SAVE IT IN LBA BUFFER HI - RET ; -; SEND INDEX OF BLOCK TO READ FROM SD CARD -; 32 BIT VALUE (4 BYTES) -; NOTE THAT BYTES ARE SENT REVERSED, PROPELLER IS LITTLE ENDIAN ; -PPPSD_SENDBLK: - LD HL,PPP_LBA - LD B,4 -PPPSD_SENDBLK1: - LD E,(HL) +PPPSD_GETDSKSTAT: +#IF (PPPSDTRACE >= 3) + CALL PPPSD_PRTPREFIX + PRTS(" STAT$") +#ENDIF + + LD D,PPP_CMDDSKSTAT ; COMMAND = GET DISK STATUS + CALL PPP_SNDCMD ; SEND COMMAND + RET NZ ; ABORT ON ERROR + + LD B,4 ; GET 4 BYTES + LD HL,PPPSD_ERRCODE ; TO ERROR CODE +PPPSD_GETDSKSTAT1: + CALL PPP_GETBYTE + LD (HL),A INC HL - CALL PUTBYTE - DJNZ PPPSD_SENDBLK1 + DJNZ PPPSD_GETDSKSTAT1 + +#IF (PPPSDTRACE >= 3) + CALL PC_SPACE + LD HL,PPPSD_ERRCODE + CALL LD32 + CALL PRTHEX32 +#ENDIF + + XOR A RET ; -; PRINT DIAGNOSTICS AFTER COMMAND EXECUTION ; -PPPSD_PRTREAD: - LD DE,PPPSTR_READ - JR PPPSD_PRT +; +PPPSD_GETTYPE: +#IF (PPPSDTRACE >= 3) + CALL PPPSD_PRTPREFIX + PRTS(" TYPE$") +#ENDIF -PPPSD_PRTWRITE: - LD DE,PPPSTR_WRITE - JR PPPSD_PRT + LD D,PPP_CMDDSKTYPE ; COMMAND = GET DISK TYPE + CALL PPP_SNDCMD ; SEND COMMAND + RET NZ ; ABORT ON ERROR + CALL PPP_GETBYTE ; GET DISK TYPE VALUE + LD (PPPSD_CARDTYPE),A ; SAVE IT -PPPSD_PRT: - OR A -#IF (PPPSDTRACE == 0) +#IF (PPPSDTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF + + XOR A ; SIGNAL SUCCESS RET -#ELSE -#IF (PPPSDTRACE == 1) - RET Z +; +; +; +PPPSD_GETCAP: +#IF (PPPSDTRACE >= 3) + CALL PPPSD_PRTPREFIX + PRTS(" CAP$") #ENDIF - PUSH AF - PUSH DE ; SAVE PTR TO FUNC STRING - CALL NEWLINE - LD DE,PPPSTR_PREFIX ; PRINT DRIVER PREFIX - CALL WRITESTR - CALL PC_SPACE - POP DE ; RECOVER PTR TO FUNC STRING - CALL WRITESTR ; PRINT FUNCTION - CALL PPPSD_PRTBLK ; PRINT BLOCK NUMBER + + LD D,PPP_CMDDSKCAP ; COMMAND = GET CAPACITY + CALL PPP_SNDCMD ; SEND COMMAND + RET NZ ; ABORT ON ERROR + + LD B,4 ; GET 4 BYTES + LD HL,PPPSD_BLKCNT +PPPSD_GETCAP1: + CALL PPP_GETBYTE + LD (HL),A + INC HL + DJNZ PPPSD_GETCAP1 + +#IF (PPPSDTRACE >= 3) CALL PC_SPACE - LD DE,PPPSTR_ARROW ; PRINT ARROW - CALL WRITESTR + LD HL,PPPSD_BLKCNT + CALL LD32 + CALL PRTHEX32 +#ENDIF + + XOR A + RET +; +; +; +PPPSD_GETCSD: +#IF (PPPSDTRACE >= 3) + CALL PPPSD_PRTPREFIX + PRTS(" CSD$") +#ENDIF + + LD D,PPP_CMDDSKCSD ; COMMAND = GET CAPACITY + CALL PPP_SNDCMD ; SEND COMMAND + RET NZ ; ABORT ON ERROR + + LD B,16 ; GET 4 BYTES + LD HL,PPPSD_CSDBUF +PPPSD_GETCSD1: + CALL PPP_GETBYTE + LD (HL),A + INC HL + DJNZ PPPSD_GETCSD1 + +#IF (PPPSDTRACE >= 3) CALL PC_SPACE - POP AF - PUSH AF - CALL PRTHEXBYTE ; PRINT RESULT BYTE - CALL NZ,PPPSD_PRTERR ; PRINT DETAILED ERROR VALUE IF APPROPRIATE - POP AF - RET ; RET WITH A = STATUS + LD DE,PPPSD_CSDBUF + LD A,16 + CALL PRTHEXBUF +#ENDIF + + XOR A + RET +; +; SEND INDEX OF BLOCK TO READ FROM SD CARD +; 32 BIT VALUE (4 BYTES) +; NOTE THAT BYTES ARE SENT REVERSED, PROPELLER IS LITTLE ENDIAN +; +PPPSD_SENDBLK: +#IF (PPPSDTRACE >= 3) + PRTS(" BLK$") +#ENDIF -PPPSD_PRTBLK: +#IF (PPPSDTRACE >= 3) CALL PC_SPACE - LD HL,PPP_LBA + 4 + LD HL,HSTLBA + CALL LD32 + CALL PRTHEX32 +#ENDIF + + LD HL,HSTLBA LD B,4 -PPPSD_PRTBLK1: - DEC HL +PPPSD_SENDBLK1: LD A,(HL) - CALL PRTHEXBYTE - DJNZ PPPSD_PRTBLK1 - RET - -PPPSD_PRTERR: - LD D,PPP_CMDDSKSTAT - CALL SENDCMD - - LD HL,PPP_DSKSTAT - LD B,4 -PPPSD_PRTERR1: - CALL GETBYTE - LD (HL),E INC HL - DJNZ PPPSD_PRTERR1 - - CALL PC_LBKT - LD BC,(PPP_DSKSTHI) - CALL PRTHEXWORD - LD BC,(PPP_DSKSTLO) - CALL PRTHEXWORD - CALL PC_RBKT - + CALL PPP_PUTBYTE + DJNZ PPPSD_SENDBLK1 RET +; +;============================================================================= +; ERROR HANDLING AND DIAGNOSTICS +;============================================================================= +; +; ERROR HANDLERS +; +PPPSD_INVUNIT: + LD A,PPPSD_STINVUNIT + JR PPPSD_ERR2 ; SPECIAL CASE FOR INVALID UNIT +; +PPPSD_ERRRDYTO: + LD A,PPPSD_STRDYTO + JR PPPSD_ERR +; +PPPSD_ERRINITTO: + LD A,PPPSD_STINITTO + JR PPPSD_ERR +; +PPPSD_ERRCMDTO: + LD A,PPPSD_STCMDTO + JR PPPSD_ERR +; +PPPSD_ERRCMD: + LD A,PPPSD_STCMDERR + JR PPPSD_ERR +; +PPPSD_ERRDATA: + LD A,PPPSD_STDATAERR + JR PPPSD_ERR +; +PPPSD_ERRDATATO: + LD A,PPPSD_STDATATO + JR PPPSD_ERR +; +PPPSD_ERRCRC: + LD A,PPPSD_STCRCERR + JR PPPSD_ERR +; +PPPSD_NOMEDIA: + LD A,PPPSD_STNOMEDIA + JR PPPSD_ERR +; +PPPSD_WRTPROT: + LD A,PPPSD_STWRTPROT + JR PPPSD_ERR2 ; DO NOT UPDATE UNIT STATUS! +; +PPPSD_ERR: + LD (PPPSD_STAT),A ; UPDATE STATUS +PPPSD_ERR2: +#IF (PPPSDTRACE >= 2) + CALL PPPSD_PRTSTAT #ENDIF + OR A ; SET FLAGS + RET ; -;================================================================================================== -; PPPSD DISK DRIVER - DATA -;================================================================================================== ; -PPPSD_STAT .DB 0 -; -PPP_LBA: -PPP_LBALO .DW 0 -PPP_LBAHI .DW 0 -PPP_DSKSTAT: -PPP_DSKSTLO .DW 0 -PPP_DSKSTHI .DW 0 -; -PPPSTR_PREFIX .TEXT "PPPDSK:$" -PPPSTR_CMD .TEXT "CMD=$" -PPPSTR_READ .TEXT "READ$" -PPPSTR_WRITE .TEXT "WRITE$" -;PPPSTR_RC .TEXT "RC=$" -PPPSTR_ARROW .TEXT "-->$" -PPPSTR_ERR .TEXT "ERR=$" -;PPPSTR_RCOK .TEXT "OK$" -;PPPSTR_RCRDYTO .TEXT "READY TIMEOUT$" ; -;================================================================================================== -; GLOBAL PPP DRIVER FUNCTIONS -;================================================================================================== +PPPSD_PRTERR: + RET Z ; DONE IF NO ERRORS + ; FALL THRU TO PPPSD_PRTSTAT ; -PUTBYTE: - IN A,(PPIC) - BIT 7,A - JR Z,PUTBYTE - LD A,E - OUT (PPIA),A +; PRINT STATUS STRING +; +PPPSD_PRTSTAT: + PUSH AF + PUSH DE + PUSH HL + OR A + LD DE,PPPSD_STR_STOK + JR Z,PPPSD_PRTSTAT1 + INC A + LD DE,PPPSD_STR_STINVUNIT + JR Z,PPPSD_PRTSTAT1 ; INVALID UNIT IS SPECIAL CASE + INC A + LD DE,PPPSD_STR_STRDYTO + JR Z,PPPSD_PRTSTAT1 + INC A + LD DE,PPPSD_STR_STINITTO + JR Z,PPPSD_PRTSTAT1 + INC A + LD DE,PPPSD_STR_STCMDTO + JR Z,PPPSD_PRTSTAT1 + INC A + LD DE,PPPSD_STR_STCMDERR + JR Z,PPPSD_PRTSTAT1 + INC A + LD DE,PPPSD_STR_STDATAERR + JR Z,PPPSD_PRTSTAT1 + INC A + LD DE,PPPSD_STR_STDATATO + JR Z,PPPSD_PRTSTAT1 + INC A + LD DE,PPPSD_STR_STCRCERR + JR Z,PPPSD_PRTSTAT1 + INC A + LD DE,PPPSD_STR_STNOMEDIA + JR Z,PPPSD_PRTSTAT1 + INC A + LD DE,PPPSD_STR_STWRTPROT + JR Z,PPPSD_PRTSTAT1 + LD DE,PPPSD_STR_STUNK +PPPSD_PRTSTAT1: + CALL PPPSD_PRTPREFIX ; PRINT UNIT PREFIX + CALL PC_SPACE ; FORMATTING + CALL WRITESTR + LD A,(PPPSD_STAT) + CP PPPSD_STCMDERR + CALL Z,PPPSD_PRTSTAT2 + POP HL + POP DE + POP AF RET -; -GETBYTE: - IN A,(PPIC) - BIT 5,A - JR Z,GETBYTE - IN A,(PPIA) - LD E,A +PPPSD_PRTSTAT2: + CALL PC_SPACE + LD A,(PPPSD_DSKSTAT) + CALL PRTHEXBYTE + CALL PC_SPACE + JP PPPSD_PRTERRCODE RET -; -SENDCMD: - IN A,(PPIA) ; DISCARD ANYTHING PENDING - ; WAIT FOR OBF HIGH (OUTPUT BUFFER TO BE EMPTY) - IN A,(PPIC) - BIT 7,A - JR Z,SENDCMD - - LD A,00000001B ; SET CMD FLAG - OUT (PPIX),A ; SEND IT - -SENDCMD0: - IN A,(PPIC) - BIT 7,A - JR Z,SENDCMD0 - LD A,D - OUT (PPIA),A -SENDCMD1: - ; WAIT FOR OBF HIGH (BYTE HAS BEEN RECEIVED) - IN A,(PPIC) - BIT 7,A - JR Z,SENDCMD1 - ; TURN OFF CMD - LD A,00000000B ; CLEAR CMD FLAG - OUT (PPIX),A - +; +; +; +PPPSD_PRTERRCODE: + PUSH HL + PUSH DE + LD HL,PPPSD_ERRCODE + CALL LD32 + CALL PRTHEX32 + POP DE + POP HL RET ; -PPPSTR_TIMEOUT .TEXT "ParPortProp not responding!$" +; PRINT DIAGNONSTIC PREFIX +; +PPPSD_PRTPREFIX: + CALL NEWLINE + PRTS("PPPSD0:$") + RET ; -PPPSD_BLKCNT .DB $00, $00, $20, $00 ; ASSUME 1GB (LITTLE ENDIAN DWORD) +; PRINT THE CARD TYPE +; +PPPSD_PRTTYPE: + LD A,(PPPSD_CARDTYPE) + LD DE,PPPSD_STR_TYPEMMC + CP PPPSD_TYPEMMC + JR Z,PPPSD_PRTTYPE1 + LD DE,PPPSD_STR_TYPESDSC + CP PPPSD_TYPESDSC + JR Z,PPPSD_PRTTYPE1 + LD DE,PPPSD_STR_TYPESDHC + CP PPPSD_TYPESDHC + JR Z,PPPSD_PRTTYPE1 + LD DE,PPPSD_STR_TYPESDXC + CP PPPSD_TYPESDXC + JR Z,PPPSD_PRTTYPE1 + LD DE,PPPSD_STR_TYPEUNK +PPPSD_PRTTYPE1: + JP WRITESTR +; +;============================================================================= +; STRING DATA +;============================================================================= +; +; +PPPSD_STR_STOK .TEXT "OK$" +PPPSD_STR_STINVUNIT .TEXT "INVALID UNIT$" +PPPSD_STR_STRDYTO .TEXT "READY TIMEOUT$" +PPPSD_STR_STINITTO .TEXT "INITIALIZATION TIMEOUT$" +PPPSD_STR_STCMDTO .TEXT "COMMAND TIMEOUT$" +PPPSD_STR_STCMDERR .TEXT "COMMAND ERROR$" +PPPSD_STR_STDATAERR .TEXT "DATA ERROR$" +PPPSD_STR_STDATATO .TEXT "DATA TIMEOUT$" +PPPSD_STR_STCRCERR .TEXT "CRC ERROR$" +PPPSD_STR_STNOMEDIA .TEXT "NO MEDIA$" +PPPSD_STR_STWRTPROT .TEXT "WRITE PROTECTED$" +PPPSD_STR_STUNK .TEXT "UNKNOWN$" +; +PPPSD_STR_TYPEUNK .TEXT "UNK$" +PPPSD_STR_TYPEMMC .TEXT "MMC$" +PPPSD_STR_TYPESDSC .TEXT "SDSC$" +PPPSD_STR_TYPESDHC .TEXT "SDHC$" +PPPSD_STR_TYPESDXC .TEXT "SDXC$" +; +;============================================================================= +; DATA STORAGE +;============================================================================= +; +PPPSD_UNITDATA: +PPPSD_STAT .DB 0 +PPPSD_DSKSTAT .DB 0 +PPPSD_ERRCODE .DB $00, $00, $00, $00 +PPPSD_CARDTYPE .DB 0 +PPPSD_BLKCNT .DB $00, $00, $00, $00 ; ASSUME 1GB (LITTLE ENDIAN DWORD) +PPPSD_CSDBUF .FILL 16,0 +PPPSD_UNITDATALEN .EQU $ - PPPSD_UNITDATA diff --git a/Source/HBIOS/prp.asm b/Source/HBIOS/prp.asm index 7a646d8e..c4fc208f 100644 --- a/Source/HBIOS/prp.asm +++ b/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 diff --git a/Source/HBIOS/rf.asm b/Source/HBIOS/rf.asm index 043dca70..62cfa367 100644 --- a/Source/HBIOS/rf.asm +++ b/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 ; ; diff --git a/Tools/bst/bstl.exe b/Tools/bst/bstl.exe new file mode 100644 index 00000000..dab87ecf Binary files /dev/null and b/Tools/bst/bstl.exe differ