From 6d8c2283b94ada47575ccaec6dcda8f9bc473002 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 25 Nov 2015 15:43:07 -0800 Subject: [PATCH] ParPortProp Driver Refactoring --- Hardware/Prop/Spin/ParPortProp.spin | Bin 47682 -> 49604 bytes Hardware/Prop/Spin/PropIO.spin | Bin 31130 -> 32992 bytes Hardware/Prop/Spin/PropIO2.spin | Bin 32276 -> 32166 bytes Hardware/Prop/Spin/safe_spi.spin | 2 + Source/HBIOS/hdsk.asm | 2 +- Source/HBIOS/md.asm | 30 +- Source/HBIOS/ppp.asm | 1073 ++++++++++++++++++--------- Source/HBIOS/prp.asm | 212 +++--- Source/HBIOS/rf.asm | 46 +- Tools/bst/bstl.exe | Bin 0 -> 186880 bytes 10 files changed, 898 insertions(+), 467 deletions(-) create mode 100644 Tools/bst/bstl.exe diff --git a/Hardware/Prop/Spin/ParPortProp.spin b/Hardware/Prop/Spin/ParPortProp.spin index 8cb012d5ec285c9b9756fcbbead42222da546403..e6d96923c5d6210fcd9f9cb4f7cd8b85697d5559 100644 GIT binary patch delta 1196 zcmaJ>OHWfl6h7BJxKu1PS1hFJZDL=Dnp+dFR3L3B6f}SWp`s*G`!EerOQ{dygAfzr z%0x~~aHVnM7Badek+?E0jBEdZ3wK6cdS<2kQfH- z`e=9|0-ZE>(bEgvVlUr^p=amBfPLU#-)tTi&PT2IM00A>Fbn62UXprg_2EjB2RBqZ z4rnUARb5RLScVehaYb{x2O&=QT{Ph-^V66)tYb{GcV^)hsVS4D8&Dx!4vMe@3$)8Z zhFCJR7U^WU$~FbbI<|<(#%~V~l5mdUoYw?frRrFgJmj~?yOszOqFj1#QPc3J%f${H z98qz^-QsEFpO6Z}7=F`Xiq#85U#61Wp)~n*UQwbl2`KWbSo+8>n-XMWzITceL?sZU zIT*Ny4!@&yP{ib5x@y*ofWFrY_lcuIj3s=ZXk(uOR$Cn~+@-P4UE8f_MD4m+jwr>+ zkra{_Brj$PZY)KeL0N`fl$R`$M)N#&Y{tds0Rb#ppAc1q0<9rRnRmt%@nz7H z>!>4mIqJc_SrxZZK9)<~ZANEGZ8H7+K5?`zU^U&3MzRI%Dc6Y_AE+jO)j}j8qnOuji1m7^v<2__$J-w?#Aauf7{ z6vP)P>P!6owPBxy_w8!B+azaS$6i~T`R|~bUo6hHCeNy=8vkWm{$CoMM#T@KrlJjH R*>QcS1&_rX%yBt#8XJH)@4%RY>G^0!KX%{!bfF;C_T=a}3OAhG$3n;YZg4}m6| lmv~fgZmtSh#4&?#o7N@@inO#z+q6b4ZLH|2 zUOXszaBiZA7ZE{G_99YBz(1gR@hI^u2%-m1>g*<2HpY68$6MaMneUr<^UZtrzv=2X z^e@BA#2HA#H00qpOhOKL7^S&i86vGlXz(xu{q&8}JPZewbz?schg6FQELbEzbJ1wa z5!Dnq%T#?J;zO46n^Xr87}ss-Zsi1lz;N})jGETPgGYeKeq8rCsFYdB%B&6bCh z2A7m=SZ57*m#yOqmhu1XkbRH=C20)W-1yYKB7N)%TTsu5C~^UecwN?MSb%l70u`uY z(CfC1!5pkXiBi1=tFR!Yxwj^B3YN*~0y>iJeF`6C!owe~v~xtM2NhNNwZ~|Y?2#EA zJ`fn}PP%j=&PA76fA}F9R#~6-hL9gN;Ja`)3Ij8aW;BwlnHs)2=fgm3gwETA-v?4E zOXk4Tf3R!{KU9XBvBGW)o{l`ADmMW7W207$)_6zYa7(aYKw$of(ewb`7JMy?ud|MF zb$KNAa99|YbbDigC_5+@ZpTsA_-O>|F JSQ5$=$8YX2_yYg{ delta 260 zcmaFR$TaIS;|4X3%{3e;tdkG%J=uJVe;U{1A}PJei=<>Wb4l-F+svo*hm&7{p@u<$ zp@^ZFp@4yxfot+cE8)!wIv$LZ`wU$szvJVWd{38;6)ZjZzpg%%<*3&UWnB!DoU9FNUKvElsEg4L~Y>2oagBeU_^KOoC;mvk3 M66~8Bl&3@i04{b8RR910 delta 120 zcmZ4Xn{mn?#tj7={3;9vKxoNe3Z@MvUlf*{oWRKP v(u1hmyqF_gnBSQpk)Z&HlYz=g7%Dg4l{RIc{6>ibU1D;elJI6B 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 0000000000000000000000000000000000000000..dab87ecf1f74a5240f89ccebf1852ad0db757e9a GIT binary patch literal 186880 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