From 15f440ce4d097071214abc418a8aed74779bf3dd Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 10 Aug 2025 17:24:08 -0700 Subject: [PATCH] Support S100 ESP32 SD Card Interface --- Doc/ChangeLog.txt | 1 + Doc/RomWBW Applications.pdf | Bin 404243 -> 404245 bytes Doc/RomWBW Disk Catalog.pdf | Bin 257321 -> 257323 bytes Doc/RomWBW Hardware.pdf | Bin 361376 -> 361731 bytes Doc/RomWBW Introduction.pdf | Bin 94300 -> 94302 bytes Doc/RomWBW System Guide.pdf | Bin 631528 -> 631570 bytes Doc/RomWBW User Guide.pdf | Bin 576206 -> 576206 bytes ReadMe.md | 2 +- ReadMe.txt | 2 +- Source/Apps/assign/assign.asm | 12 +- Source/CBIOS/cbios.asm | 5 +- Source/Doc/Hardware.md | 19 +- Source/Doc/SystemGuide.md | 1 + Source/HBIOS/Config/FZ80_std.asm | 3 + Source/HBIOS/Config/S100_std.asm | 4 + Source/HBIOS/cfg_DUO.asm | 2 + Source/HBIOS/cfg_DYNO.asm | 2 + Source/HBIOS/cfg_EPITX.asm | 2 + Source/HBIOS/cfg_EZZ80.asm | 2 + Source/HBIOS/cfg_FZ80.asm | 8 + Source/HBIOS/cfg_GMZ180.asm | 2 + Source/HBIOS/cfg_HEATH.asm | 2 + Source/HBIOS/cfg_MASTER.asm | 8 + Source/HBIOS/cfg_MBC.asm | 2 + Source/HBIOS/cfg_MK4.asm | 2 + Source/HBIOS/cfg_MON.asm | 2 + Source/HBIOS/cfg_N8.asm | 2 + Source/HBIOS/cfg_NABU.asm | 2 + Source/HBIOS/cfg_RCEZ80.asm | 2 + Source/HBIOS/cfg_RCZ180.asm | 2 + Source/HBIOS/cfg_RCZ280.asm | 2 + Source/HBIOS/cfg_RCZ80.asm | 2 + Source/HBIOS/cfg_RPH.asm | 2 + Source/HBIOS/cfg_S100.asm | 8 + Source/HBIOS/cfg_SBC.asm | 2 + Source/HBIOS/cfg_SCZ180.asm | 2 + Source/HBIOS/cfg_Z80RETRO.asm | 2 + Source/HBIOS/cfg_ZETA.asm | 2 + Source/HBIOS/cfg_ZETA2.asm | 2 + Source/HBIOS/espsd.asm | 890 +++++++++++++++++++++++++++++++ Source/HBIOS/hbios.asm | 12 + Source/HBIOS/hbios.inc | 1 + Source/HBIOS/invntdev.asm | 4 +- Source/HBIOS/std.asm | 11 - Source/ver.inc | 2 +- Source/ver.lib | 2 +- 46 files changed, 1011 insertions(+), 26 deletions(-) create mode 100644 Source/HBIOS/espsd.asm diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index c4ab6c0b..bca13027 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -22,6 +22,7 @@ Version 3.6 - D?N: Added native USB driver support (keyboard, floppy, mass storage) - MGG: Added sample program source files for all language disk iamges - WBW: Added support for S100 Dual CF Interface +- WBW: Added support for S100 ESP32 SD Interface Version 3.5.1 ------------- diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index 967539985ed2a5ecfc9bf55aa76af6cda2e8ba47..bc996fc74a6fae55cac0b7fa4910b2e222735237 100644 GIT binary patch delta 19010 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 delta 18917 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 M`RA|gf8Eyq1L*&q@c;k- diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index f7e3fe44b05e21505f63cbc994c3f8afeb50ebcb..d63d60d76c0f74080bda24c517fd303d5b7a2d1f 100644 GIT binary patch delta 13690 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 delta 13662 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
=--{A~Ea+p`jO@i=a%%hS7h= zaDQSmXxTx~0SttS40aJ3g1KNW(x?G6r2PnJL`>MkfJhzi6;|L_l7w9tv>lsZBe0r) zFop}B2PJdNreQ8}#gJYD{$mFMM#Wez0>Cy*hc0ez#n=ap@R+?2Q62>Xup%F zFcA87umd3uK~4f55#bEj84PTN2Frh8>yO3;SOaO$VX!(e|IcKkcL~O!dJOGpSiB75 zkPrrL2~|bN$AF#DW?99*CK!6#us9edBV~E;5fl=WdnczN2FHFFjNbs@|=Ki6_9#KEA zRsZTZYkkN=K{gZX7@!1*4LKoofaI(Q;G_^CgH0n`fJR(wz6;i6AW17AB1tP24V$w9 z8d666(cp=LW7cXqM{ z_z&&FNW~3y4ILraU4zL+X{gFVP2~T~MP40&&EUw`ygdQl^gz@OI;sBE*`Id@HVW(Y zpz@0i6j;wgP%atd@|V3|@<;ligAT!C(0M~;;=MT+s3H&ydfpL82Sy*-8DTgB8;ydm zgib9CKUr#owK^0c65WDnf*d1uE;IyV%^gI9znu9$QUx!%AUGK6jTjigvVSOwfLsYS z;Q`}NMF-bA`*|#>0%l-KXyA6BT?Ts+$mbxZqac}Ecpe1S*trxM%0aj@M5-Xsg-8|j zL1CjsNM1u4AG-)N8e$a~a#e^;1={cD{Y8bWeqgLMfrZh@Fbr$PAQOaahLzz#pNH*< z0aOUpLPS4+sR%fOJPr~qf)*j*9X5lwIe^vJOdPybL80Te%w{3HpG-#_F{saPCH$j< z(CCD9_AnQDMHd#Kk(r!+oJ#OR)HJ3hd|+U^A7CC*Q~`U4N6aL2Ut;$GbN`QM002V7 z0D{7w;v(?JjlyISjrqzCj0Va?=*GdwKMW_*nE2gbH2!qa{L1&jcA;8@@yoT2y-FpJbN6>MQS534#~U&jRqRV!W(}f4@{VUdD{(oS3u#Bg~1li zrm@Chxehb{F2Bdk{nd29e5DUJ&iW3qEvy%>(Y3(A|9-|Vcm?CI6#{r3^2QdN5$R=s zaja_gY-Ruvvfi^7fyt=*fCL9tOJOb~29dcCqRghT#{D%*zp||aXb8kcu&^+u!vJmo zazEHxV9~Ik1dfZmI{@PV=U_I&VD&8`yN0X|a;;E3{d0xC*$-t`%mZOz=-y1`E^zF<8)B`VSXY{RnGeGE_yeyM`Zb zK<*CEJGwAfuUGpZ5sdH$VoZ$4!b)(h$VzBj1U&@UxESW5#tUA`{#}Uw>vDmJ4ZdJ9 zYP{fuJ0t@{L(vjzE-LOooqb?U5Kjnnu@b?0*$kUnfN^A|FLa4O2i$CCfS*L&JL@$L z%s5yILA9*8*bFvn91<(A>KH#E#9x>QlM!i#)+;E3&)y)=piy@=4d#-uNDsy#X?LK( z3#I?g1^I``Ki?Pp$11}>c#r$vfh^sJ{$Pxd!dxP1U|6rcAafCW0CNcx=H-KM2?(?Y zr;e?n!*Dc2g>eX)06dDtb})DLt8s8tkni8=s=t>2MC4~P0R13)XN^NG1-yiakrGy4 z(El4Z+vC6`zypy2G)x9)h-D;%#V399HaLVdMt| zU>vkxGra>i>jA@& zH+5n7KM?S@_(CxnbH%K=SPueop^Xe#9#U67Xn&aolaYoUm<$;oWHS8kerD5HbCDt> z1Qn>l!bxW77t4A8*hX^0H2ARu1Vw?#oi+K#T;#nEaNlSu7aCBomIqix1_(9#Brq98 zQFIV8%s7~gyr9j(16bbyG^Dl&6>u;qKiB;OI{<+p;1p<(9-h5Hm<(1KOM{=G!rU=r z?f;KmB|#(Jthvye2aHBo1AT|sY6#dTH1Gm6h&9v@HzO?rARiEv%vuFZ`1k8ZaklZl*lmjFguycXaSPl{)A@lorzw1BHhVXx42=pfg;LR+g!cBzYI1)pU zK)Nsh7{)=efA$8sfC#_D!TcJ`Y2*q?dV;|!eLQWY5#GRPCC-RwXh5K^qT}fL5FY(+ nCa!i0HiVVLD%ja^6_+Fyl~fd^rf~t6D*@a4T&k+B{%%|VTq#U& delta 32359 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 diff --git a/Doc/RomWBW Introduction.pdf b/Doc/RomWBW Introduction.pdf index 088b10944aecd78365f74b42024b64ef67fdcbb8..f1b7f4a583db0badac88e3ae89fcb269cab6533f 100644 GIT binary patch delta 4874 zcmai1S!|V65Vi$kt-%mYjX;DODHN#Kv&~sr7NxzQWl=yM5D-}!2&*6pF7P9`AQ5D# z)?k7qA`KA2Qb|n#LxU)hfMG2`0$A|2yK~!Q!gS9-pP|tf*c5>gnFH;_|VDdDki`FV|jOReN(<;~&4wU$AXOS;x8s zk9YfibLys8hxKXIml|q1rS=_~Ccn=7;A+Pu8$TYr`Gt*(2i$Hb$lQJYMs;*+-12oR zGOHHdpV4_rVW%I~ygt6PZt&FKvj1M$V_L)5*vZPAIb-rp4g2%Uzs%UD(|Wdl?pIT| z?3;qJ(j)VV{_*Mi&Wt|QSeSQY{q&n--ptACykz`(F=g_nm(GlS?AX!b_ovQWy>iE@ z%9qO~3_G&$-G)6+$gO?RR#lRCG{s43o6x4(Ym_VQtc6HcD* zd8s7+VVG7F+xlSDj{CB+Z}&PoVE+01<7;!vXB7{;m|M|3r|X7gg%9k{EIIn<2HS7u zCwt+g#(oFdy)$6X_3|5iuCMNLcKevDeRqz&c>4DXOAnU~tzJE{$4_q`{qcO)tL58@ zPE6_eh5oMLLZAL`bm@C@(7gFo*Jj_k_=N0!_;&kq`$l~|ZKScMpMua!z70ZBw!k zq$DBYRwKx8_rjL@KpP;*2mq3FgcX1V?uhWS!@)AN ztdySmS>;$E)+o#Tz{`jko#sKjXF&`?L(eMX7+S_kdY_aw+2ZIPog~6VFO*;e&02cw zJPE8c7z)1@Qc+aV=1DS<&{hBqtPxh)V;w+HVxrB`vmgy4AplsKG@6u%CHmj`Q3c=+ zDDa9!2#hoMq*;%pP=OXAh4D#Lqr0zJ3hO9bQg}=IDWw1kwUpQZ(h}4bNzp<~fhH4) zpe;R&g5fCpku-)vD1u?Kgq-0?gY^79uQ9w$)GVe-IYnVrm3lD`h+@ z#Cc!|dMy$$68I|#0FDt3P%>F{F0f=g=Eo}bf+K_L zByE#-UaV|-gh6^%He%rJi@hCo07`8DTDJve29+Y uXSs!EhNyx#e$0phA1}b!WaDZ`z8)Cs|9>tegI-I?NDJvbd&Zw1lKvmf{WEI- delta 4829 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 diff --git a/Doc/RomWBW User Guide.pdf b/Doc/RomWBW User Guide.pdf index 81a9c0f722e6d415ffd79a9a4fd02e10a57c007d..7ed06560119db0b3fc7e26101a4e8ff6a13b0adc 100644 GIT binary patch delta 611 zcmX>%Rr%ahctgr<}`cd*c<}x^wmE3;+HnJ-JaC zw2Z~QPgQ=dvgV6*e0Pi6)xE#Dx%U}ZK4qD)xq5%8ylf*2-^yL(zhC8Szjg5L>E1h! z@4uUF+xo9+Qj_r*) zmnQ*lKA8Po6ClHIQ(JbyqNa(Z^F%dTMYWW(T&5%)E=W9Cc8YCPnNt6@ppRxBj`RuM zsP3ySaBQ2?tSYu(!^b`HGk&q|Q8n`Tx^0I__cK*%)orEwRTY~&#Oebka9%l5$P!}7 zF~Kc3cYcK+dseDM3QB(v1gcGY{sh{ zYZRwkn{w#=%egmB&)j=6ztTKpf2^$Z&Byyybd381dHup7Kx2D}#@>rY1~%st zOjjQl+i)i5zJ`s7)SuYGpth9Ut@oIO=5~LUPk8MnxozVs{l?D@$yfJWeWvguXa2Hx z@~s@tRVFJw5N`HnYWHSh1Y!`)48$xz%nHP8K+L|~n~CFHijIY$fuXsfk%5V>fw{VY zfx4!GzHfetOJYf?f`*Hgk%5t^0bI%U)N~GxWM@k!7b8nES0hV9Ll;AH7biCp7h_Wc ZBUfiLOG{S+GdDX08$wE^Z#cyv2LR?t2)+OS delta 611 zcmX>%Rr%ah(@uW zJ3W%NKJNeN-8`v7XW_j+PF=lyaC3uz z7ssS+54@U|y7;d-QTX(y4cC0}5A#ka>i(ECOK0cwzf+E0|2(TjQn>ohx+bAOUKgQB zFV``=H97lz=hMr74tzgT6S?onEidExTR*qnc3=1_pKqFB0HYtL_qo|^Ta-S>x-Ki$ z-eh)c|LH{sLyDtPC+_09b0a!(rukC2iI?R*$*nA()_ZCG_j7M=ziwN$Ac#r--x{dL7ZP7tInrUc9(= 1) +; +ESPSD_DEV0P: ; DEVICE 0, PRIMARY + .DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) + .DB 0 ; PRIMARY + .DB ESPSD0BASE ; IO BASE ADDRESS + .DB ESPSD_STNOTRDY ; DEVICE STATUS + .DW $0000,$0001 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA +; + DEVECHO "ESPSD: IO=" + DEVECHO ESPSD0BASE + DEVECHO ", PRIMARY" + DEVECHO "\n" +; + #IF (ESPSD0DUAL) +; +ESPSD_DEV0S: ; DEVICE 0, SECONDARY + .DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) + .DB 1 ; SECONDARY + .DB ESPSD0BASE ; IO BASE ADDRESS + .DB ESPSD_STNOTRDY ; DEVICE STATUS + .DW $0000,$0001 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA +; + DEVECHO "ESPSD: IO=" + DEVECHO ESPSD0BASE + DEVECHO ", SECONDARY" + DEVECHO "\n" +; + #ENDIF +; +#ENDIF +; +#IF (ESPSDCNT >= 2) +; +ESPSD_DEV1P: ; DEVICE 1, PRIMARY + .DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) + .DB 0 ; PRIMARY + .DB ESPSD1BASE ; IO BASE ADDRESS + .DB ESPSD_STNOTRDY ; DEVICE STATUS + .DW $0000,$0001 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA +; + DEVECHO "ESPSD: IO=" + DEVECHO ESPSD1BASE + DEVECHO ", PRIMARY" + DEVECHO "\n" +; + #IF (ESPSD1DUAL) +; +ESPSD_DEV1S: ; DEVICE 1, SECONDARY + .DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) + .DB 1 ; SECONDARY + .DB ESPSD1BASE ; IO BASE ADDRESS + .DB ESPSD_STNOTRDY ; DEVICE STATUS + .DW $0000,$0001 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA +; + DEVECHO "ESPSD: IO=" + DEVECHO ESPSD1BASE + DEVECHO ", SECONDARY" + DEVECHO "\n" +; + #ENDIF +; +#ENDIF +; +#IF ($ - ESPSD_CFGTBL) != (ESPSDCNT * 2 * ESPSD_CFGSIZ) + .ECHO "*** INVALID ESPSD CONFIG TABLE ***\n" +#ENDIF +; + .DB $FF ; END OF TABLE MARKER +; +;============================================================================= +; INITIALIZATION ENTRY POINT +;============================================================================= +; +ESPSD_INIT: +; + XOR A ; ZERO ACCUM + LD (ESPSD_DEVNUM),A ; INIT DEV UNIT NUM FOR DYNAMIC ASSIGNMENT + LD IY,ESPSD_CFGTBL ; POINT TO START OF CONFIG TABLE +; +ESPSD_INIT1: + LD A,(IY) ; LOAD FIRST BYTE TO CHECK FOR END + CP $FF ; CHECK FOR END OF TABLE VALUE + JR NZ,ESPSD_INIT2 ; IF NOT END OF TABLE, CONTINUE + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +ESPSD_INIT2: + CALL NEWLINE ; FORMATTING + PRTS("ESPSD:$") ; TAG +; + PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS + LD A,(IY+ESPSD_IOBASE) ; GET IO BASE ADDRES + CALL PRTHEXBYTE ; DISPLAY IT +; + BIT 0,(IY+ESPSD_ROLE) ; GET ROLE BIT + JR NZ,ESPSD_INIT2A ; JUMP IF SECONDARY + PRTS(" PRIMARY$") ; SHOW PRIMATY + JR ESPSD_INIT2B ; JUMP AHEAD +ESPSD_INIT2A: + PRTS(" SECONDARY$") ; SHOW SECONDARY +ESPSD_INIT2B: + CALL ESPSD_DETECT ; PROBE FOR INTERFACE + JR Z,ESPSD_INIT3 ; GOT IT, MOVE ON TO INIT UNITS + PRTS(" NOT PRESENT$") ; SHOW NOT PRESENT + JR ESPSD_INIT4 ; SKIP CFG ENTRY +; +ESPSD_INIT3: + CALL ESPSD_INIT5 ; REGISTER & INIT DEVICE +; +ESPSD_INIT4: + LD DE,ESPSD_CFGSIZ ; SIZE OF CFG TABLE ENTRY + ADD IY,DE ; BUMP POINTER + JP ESPSD_INIT1 ; AND LOOP +; +ESPSD_INIT5: + ; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE + LD A,(ESPSD_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN + LD (IY+ESPSD_DEV),A ; UPDATE IT + INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN + LD (ESPSD_DEVNUM),A ; SAVE IT +; + ; ADD UNIT TO GLOBAL DISK UNIT TABLE + LD BC,ESPSD_FNTBL ; BC := FUNC TABLE ADR + PUSH IY ; CFG ENTRY POINTER + POP DE ; COPY TO DE + CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE +; + CALL ESPSD_INITDEV ; INITIALIZE DEVICE +#IF (ESPSDTRACE < 2) + JP NZ,ESPSD_PRTSTAT +#ENDIF + RET NZ +; + CALL ESPSD_PRTPREFIX ; TAG FOR ACTIVE DEVICE +; + ; PRINT STORAGE CAPACITY (BLOCK COUNT) + PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL + LD A,ESPSD_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + 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 PRTDEC32 ; PRINT DWORD IN DECIMAL + PRTS("MB$") ; PRINT SUFFIX +; + XOR A ; SUCCESS + RET +; +;============================================================================= +; DRIVER FUNCTION TABLE +;============================================================================= +; +ESPSD_FNTBL: + .DW ESPSD_STATUS + .DW ESPSD_RESET + .DW ESPSD_SEEK + .DW ESPSD_READ + .DW ESPSD_WRITE + .DW ESPSD_VERIFY + .DW ESPSD_FORMAT + .DW ESPSD_DEVICE + .DW ESPSD_MEDIA + .DW ESPSD_DEFMED + .DW ESPSD_CAP + .DW ESPSD_GEOM +#IF (($ - ESPSD_FNTBL) != (DIO_FNCNT * 2)) + .ECHO "*** INVALID IDE FUNCTION TABLE ***\n" +#ENDIF +; +ESPSD_VERIFY: +ESPSD_FORMAT: +ESPSD_DEFMED: + SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED + RET +; +; +; +ESPSD_READ: + CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR + + ;;;CALL NEWLINE + ;;;LD A,'R' + ;;;CALL COUT + ;;;CALL PRTHEXWORDHL + + LD A,ESPSD_CMD_READ ; SETUP FOR BLOCK READ CMD + JP ESPSD_IO ; CONTINUE TO GENERIC IO ROUTINE +; +; +; +ESPSD_WRITE: + CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR + + ;;;CALL NEWLINE + ;;;LD A,'W' + ;;;CALL COUT + ;;;CALL PRTHEXWORDHL + + LD A,ESPSD_CMD_WRITE ; SETUP FOR BLOCK WRITE CMD + JP ESPSD_IO ; CONTINUE TO GENERIC IO ROUTINE +; +; +; +ESPSD_STATUS: + ;;;LD A,'S' + ;;;CALL COUT + ; RETURN UNIT STATUS + LD A,(IY+ESPSD_STAT) ; GET STATUS OF SELECTED DEVICE + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +ESPSD_RESET: + ;;;LD A,'R' + ;;;CALL COUT + CALL ESPSD_INITDEV ; REINITIALIZE UNIT + OR A ; SET RESULT FLAGS + RET +; +; +; +ESPSD_DEVICE: + ;;;LD A,'D' + ;;;CALL COUT + LD D,DIODEV_ESPSD ; D := DEVICE TYPE + LD E,(IY+ESPSD_DEV) ; E := PHYSICAL DEVICE NUMBER + LD C,%00110010 ; C := ATTRIBUTES, REMOVABLE, SD CARD + LD H,0 ; H := MODE + LD L,(ESPSD_IOBASE) ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET +; +; ESPSD_GETMED +; +ESPSD_MEDIA: + ;;;LD A,'M' + ;;;CALL COUT + LD A,E ; GET FLAGS + OR A ; SET FLAGS + JR Z,ESPSD_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA +; + CALL ESPSD_INITDEV ; REINITIALIZE DEVICE +; +ESPSD_MEDIA1: + LD A,(IY+ESPSD_STAT) ; GET STATUS + OR A ; SET FLAGS + LD D,0 ; NO MEDIA CHANGE DETECTED + LD E,MID_HD ; ASSUME WE ARE OK + RET Z ; RETURN IF GOOD INIT + LD E,MID_NONE ; SIGNAL NO MEDIA + LD A,ERR_NOMEDIA ; NO MEDIA ERROR + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +ESPSD_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 (IY+ESPSD_LBA+0),L ; SAVE NEW LBA + LD (IY+ESPSD_LBA+1),H ; ... + LD (IY+ESPSD_LBA+2),E ; ... + LD (IY+ESPSD_LBA+3),D ; ... + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; +ESPSD_CAP: + ;;;LD A,'C' + ;;;CALL COUT + LD A,(IY+ESPSD_STAT) ; GET STATUS + PUSH AF ; SAVE IT + LD A,ESPSD_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; GET THE CURRENT CAPACITY INTO DE:HL + LD BC,512 ; 512 BYTES PER BLOCK + POP AF ; RECOVER STATUS + OR A ; SET FLAGS + RET +; +; +; +ESPSD_GEOM: + ;;;LD A,'G' + ;;;CALL COUT + ; 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 ESPSD_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 + RET ; DONE, A STILL HAS ESPSD_CAP STATUS +; +;============================================================================= +; FUNCTION SUPPORT ROUTINES +;============================================================================= +; +; ON RETURN, ZF SET INDICATES HARDWARE FOUND +; +ESPSD_DETECT: + ; WE USE A DUMMY SETLBA COMMAND TO TEST FOR PRESENCE + LD HL,0 ; IRRELEVANT + JP ESPSD_SETLBA ; PASS OFF TO SETLBA +; +; INITIALIZE DEVICE +; +ESPSD_INITDEV: + CALL ESPSD_INITCARD ; PERFORM DEVICE INIT + JP NZ,ESPSD_NOMEDIA ; CONVERT TO NO MEDIA ERROR +; + ; GET CAPACITY + ; NOT CURRENTLY AVAILABLE IN ESP32 API + ; CAPACITY IS HARD-CODED ABOVE AT API MAX OF $10000 BLOCKS +; + ; RESET STATUS + LD A,ESPSD_STOK + LD (IY+ESPSD_STAT),A + XOR A + RET +; +; COMMON SECTOR I/O +; +ESPSD_IO: + LD (ESPSD_CMDVAL),A ; SAVE THE COMMAND + LD (ESPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS +; + ; CHECK FOR ERROR STATUS AND REINIT? +; +#IF (ESPSDTRACE == 1) + LD HL,ESPSD_PRTERR ; SET UP SD_PRTERR + PUSH HL ; ... TO FILTER ALL EXITS +#ENDIF +; + ; SELECT PRI/SEC DEVICE + CALL ESPSD_SELECT ; SELECT DEVICE + JP NZ,ESPSD_ERR ; ON ERROR, RECORD AND BAIL OUT + ;CALL LDELAY ; *DEBUG* +; + ; SET LBA + LD A,ESPSD_LBA ; OFFSET OF LBA VALUE + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL HB_DSKACT ; SHOW ACTIVITY + CALL LD32 ; LOAD IT TO DE:HL, AF IS TRASHED + CALL ESPSD_SETLBA ; SEND LBA TO DEVICE + ;JP ESPSD_IOERR ; *DEBUG* + JP NZ,ESPSD_ERR ; ON ERROR, RECORD AND BAIL OUT + ;CALL LDELAY ; *DEBUG* +; + ; PERFORM BLOCK READ/WRITE + LD HL,(ESPSD_DSKBUF) ; RECOVER THE DISK BUFFER ADR + LD A,(ESPSD_CMDVAL) ; GET ORIGINAL CMD + CP ESPSD_CMD_READ ; READ? + JR NZ,ESPSD_IO2 ; IF NOT, SKIP AHEAD + CALL ESPSD_BLKREAD ; DO THE READ + JR ESPSD_IO3 ; CONTINUE +ESPSD_IO2: + CALL ESPSD_BLKWRITE ; DO THE WRITE +ESPSD_IO3: + JP NZ,ESPSD_ERR ; ON ERROR, RECORD AND BAIL OUT + ;CALL LDELAY ; *DEBUG* +; + ; INCREMENT LBA + LD A,ESPSD_LBA ; LBA OFFSET + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL INC32HL ; INCREMENT THE VALUE +; + ; INCREMENT DMA + LD HL,ESPSD_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR + INC (HL) ; BUMP DMA BY + INC (HL) ; ... 512 BYTES +; + ; CLEAN UP + LD HL,(ESPSD_DSKBUF) ; CURRENT DMA TO HL + XOR A ; SIGNAL SUCCESS + RET ; AND DONE +; +;============================================================================= +; COMMAND PROCESSING +;============================================================================= +; +; INITIALIZE DEVICE +; +ESPSD_INITCARD: + LD A,ESPSD_CMD_INIT0 ; INIT PRIMARY DEVICE + ADD A,(IY+ESPSD_ROLE) ; ADJUST FOR PRI/SEC + JR ESPSD_RUNCMD ; USE COMMON CMD ROUTINE +; +; (RE)SELECT DEVICE +; +ESPSD_SELECT: + LD A,ESPSD_CMD_SEL0 ; INIT PRIMARY DEVICE + ADD A,(IY+ESPSD_ROLE) ; ADJUST FOR PRI/SEC + JR ESPSD_RUNCMD ; USE COMMON CMD ROUTINE +; +; SIMPLE COMMAND COMMON CODE +; +ESPSD_RUNCMD: + LD E,A ; PUT IN E + CALL ESPSD_CMD_SLOW ; SEND COMMAND + RET NZ ; HANDLE ERROR + CALL ESPSD_GETBYTE_SLOW ; GET RESULT + RET NZ ; HANDLE ERROR + LD A,E ; RESULT TO ACCUM + OR A ; SET FLAGS + RET Z ; RETURN SUCCESS + LD A,ESPSD_STNOTRDY ; CALL THIS A NOT READY ERR + OR A ; SET FLAGS + RET ; DONE +; +; SET CURRENT LBA TO VALUE IN DE:HL +; HIGH WORD (DE) IS CURRENTLY IGNORED BECAUSE API ONLY SUPPORTS +; A 16-BIT LBA. +; +ESPSD_SETLBA: + LD E,ESPSD_CMD_SETLBA + CALL ESPSD_CMD_SLOW + RET NZ + LD E,H + CALL ESPSD_PUTBYTE_SLOW + RET NZ + LD E,L + CALL ESPSD_PUTBYTE_SLOW + RET NZ + CALL ESPSD_GETBYTE_SLOW + RET NZ + LD A,E ; RESULT TO ACCUM + OR A ; SET FLAGS + RET Z ; GOOD RETURN + LD A,ESPSD_STIOERR ; CALL THIS AN IO ERROR + OR A + RET +; +; BLOCK READ 512 BYTES TO ADDRESS IN HL +; +ESPSD_BLKREAD: + LD E,ESPSD_CMD_READ + CALL ESPSD_CMD_SLOW + RET NZ +; + LD B,0 ; LOOP COUNTER +ESPSD_BLKREAD1: + PUSH BC + CALL ESPSD_GETBYTE_SLOW + RET NZ + LD (HL),E + INC HL + CALL ESPSD_GETBYTE_SLOW + RET NZ + LD (HL),E + INC HL + POP BC + DJNZ ESPSD_BLKREAD1 +; + CALL ESPSD_GETBYTE_SLOW ; GET RESULT + RET NZ ; HANDLE ERROR + LD A,E ; RESULT TO ACCUM + OR A ; SET FLAGS + RET Z ; GOOD RETURN + LD A,ESPSD_STIOERR ; CALL THIS AN IO ERROR + OR A ; SET FLAGS + RET ; DONE +; +; BLOCK WRITE +; +ESPSD_BLKWRITE: + LD E,ESPSD_CMD_WRITE + CALL ESPSD_CMD_SLOW + RET NZ +; + LD B,0 ; LOOP COUNTER +ESPSD_BLKWRITE1: + PUSH BC + LD E,(HL) + INC HL + CALL ESPSD_PUTBYTE_SLOW + RET NZ + LD E,(HL) + INC HL + CALL ESPSD_PUTBYTE_SLOW + RET NZ + POP BC + DJNZ ESPSD_BLKWRITE1 +; + CALL ESPSD_GETBYTE_SLOW ; GET RESULT + RET NZ ; HANDLE ERROR + LD A,E ; RESULT TO ACCUM + OR A ; SET FLAGS + RET Z ; GOOD RETURN + LD A,ESPSD_STIOERR ; CALL THIS AN IO ERROR + OR A ; SET FLAGS + RET ; DONE +; +;============================================================================= +; HARDWARE INTERFACE ROUTINES +;============================================================================= +; +; SEND COMMAND BYTE IN E TO ESP32 +; +ESPSD_CMD: + PUSH DE + LD E,$33 + CALL ESPSD_PUTBYTE + POP DE + RET NZ + JR ESPSD_PUTBYTE +; +; SEND COMMAND BYTE IN E TO ESP32 +; +ESPSD_CMD_SLOW: + PUSH DE + LD E,$33 + CALL ESPSD_PUTBYTE_SLOW + POP DE + RET NZ + JR ESPSD_PUTBYTE_SLOW +; +; WRITE BYTE IN E TO ESP32 +; RETURN STATUS IN A (0=SUCCESS) +; +ESPSD_PUTBYTE: +#IF (ESPSDTRACE >= 3) + CALL PC_GT +#ENDIF + LD B,0 + LD C,(IY+ESPSD_IOBASE) +ESPSD_PUTBYTE1: + IN A,(C) + BIT 0,A + JR Z,ESPSD_PUTBYTE2 + ;JR ESPSD_PUTBYTE1 ; *DEBUG* + DJNZ ESPSD_PUTBYTE1 + LD A,ESPSD_STBSYTO + OR A + RET +ESPSD_PUTBYTE2: + INC C + OUT (C),E +; +#IF (ESPSDTRACE >= 3) + LD A,E + CALL PRTHEXBYTE +#ENDIF +; + XOR A + RET +; +; WRITE BYTE TO ESP32 FROM E WITH EXTRA LONG TIMEOUT +; +ESPSD_PUTBYTE_SLOW: + PUSH HL + LD HL,$1000 ; *TODO* TUNE THIS VALUE!!! +ESPSD_PUTBYTE_SLOW1: + PUSH HL + CALL ESPSD_PUTBYTE + POP HL + JR Z,ESPSD_PUTBYTE_SLOW_Z + DEC HL + LD A,H + OR L + JR NZ,ESPSD_PUTBYTE_SLOW1 + LD A,ESPSD_STBSYTO +ESPSD_PUTBYTE_SLOW_Z: + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXWORDHL ; *DEBUG* + POP HL + OR A ; SET FLAGS + RET +; +; READ BYTE FROM ESP32 INTO E +; RETURN STATUS IN A (0=SUCCESS) +; +ESPSD_GETBYTE: +#IF (ESPSDTRACE >= 3) + CALL PC_LT +#ENDIF + LD B,0 + LD C,(IY+ESPSD_IOBASE) +ESPSD_GETBYTE1: + IN A,(C) + BIT 7,A + JR NZ,ESPSD_GETBYTE2 + DJNZ ESPSD_GETBYTE1 + LD A,ESPSD_STBSYTO + OR A + RET +ESPSD_GETBYTE2: + INC C + IN E,(C) +; +#IF (ESPSDTRACE >= 3) + LD A,E + CALL PRTHEXBYTE +#ENDIF +; + XOR A + RET +; +; READ BYTE FROM ESP32 INTO E WITH EXTRA LONG TIMEOUT +; +ESPSD_GETBYTE_SLOW: + PUSH HL + LD HL,$1000 ; *TODO* TUNE THIS VALUE??? +ESPSD_GETBYTE_SLOW1: + PUSH HL + CALL ESPSD_GETBYTE + POP HL + JR Z,ESPSD_GETBYTE_SLOW_Z + DEC HL + LD A,H + OR L + JR NZ,ESPSD_GETBYTE_SLOW1 + LD A,ESPSD_STBSYTO +ESPSD_GETBYTE_SLOW_Z: + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXWORDHL ; *DEBUG* + POP HL + OR A ; SET FLAGS + RET +; +;============================================================================= +; ERROR HANDLING AND DIAGNOSTICS +;============================================================================= +; +; ERROR HANDLERS +; +ESPSD_INVUNIT: + LD A,ESPSD_STINVUNIT + JR ESPSD_ERR2 ; SPECIAL CASE FOR INVALID UNIT +; +ESPSD_NOMEDIA: + LD A,ESPSD_STNOMEDIA + JR ESPSD_ERR +; +ESPSD_CMDERR: + LD A,ESPSD_STCMDERR + JR ESPSD_ERR +; +ESPSD_IOERR: + LD A,ESPSD_STIOERR + JR ESPSD_ERR +; +ESPSD_RDYTO: + LD A,ESPSD_STRDYTO + JR ESPSD_ERR +; +ESPSD_DRQTO: + LD A,ESPSD_STDRQTO + JR ESPSD_ERR +; +ESPSD_BSYTO: + LD A,ESPSD_STBSYTO + JR ESPSD_ERR +; +ESPSD_NOTSUP: + LD A,ESPSD_STNOTSUP + JR ESPSD_ERR +; +ESPSD_NOTRDY: + LD A,ESPSD_STNOTRDY + JR ESPSD_ERR +; +ESPSD_ERR: + LD (IY+ESPSD_STAT),A ; SAVE NEW STATUS +; +ESPSD_ERR2: +#IF (ESPSDTRACE >= 2) + CALL ESPSD_PRTSTAT +#ENDIF + OR A ; SET FLAGS + RET +; +; +; +ESPSD_PRTERR: + RET Z ; DONE IF NO ERRORS + ; FALL THRU TO ESPSD_PRTSTAT +; +; PRINT FULL DEVICE STATUS LINE +; +ESPSD_PRTSTAT: + PUSH AF + PUSH DE + PUSH HL + LD A,(IY+ESPSD_STAT) + CP ESPSD_STINVUNIT + JR Z,ESPSD_PRTSTAT2 ; INVALID UNIT IS SPECIAL CASE + CALL ESPSD_PRTPREFIX ; PRINT UNIT PREFIX + JR ESPSD_PRTSTAT3 +ESPSD_PRTSTAT2: + CALL NEWLINE + PRTS("ESPSD:$") ; NO UNIT NUM IN PREFIX FOR INVALID UNIT +ESPSD_PRTSTAT3: + CALL PC_SPACE ; FORMATTING + CALL ESPSD_PRTSTATSTR + POP HL + POP DE + POP AF + RET +; +; PRINT STATUS STRING +; +ESPSD_PRTSTATSTR: + PUSH AF + PUSH DE + LD A,(IY+ESPSD_STAT) + OR A + LD DE,ESPSD_STR_STOK + JR Z,ESPSD_PRTSTATSTR1 + INC A + LD DE,ESPSD_STR_STINVUNIT + JR Z,ESPSD_PRTSTATSTR1 + INC A + LD DE,ESPSD_STR_STNOMEDIA + JR Z,ESPSD_PRTSTATSTR1 + INC A + LD DE,ESPSD_STR_STCMDERR + JR Z,ESPSD_PRTSTATSTR1 + INC A + LD DE,ESPSD_STR_STIOERR + JR Z,ESPSD_PRTSTATSTR1 + INC A + LD DE,ESPSD_STR_STRDYTO + JR Z,ESPSD_PRTSTATSTR1 + INC A + LD DE,ESPSD_STR_STDRQTO + JR Z,ESPSD_PRTSTATSTR1 + INC A + LD DE,ESPSD_STR_STBSYTO + JR Z,ESPSD_PRTSTATSTR1 + INC A + LD DE,ESPSD_STR_STNOTSUP + JR Z,ESPSD_PRTSTATSTR1 + INC A + LD DE,ESPSD_STR_STNOTRDY + JR Z,ESPSD_PRTSTATSTR1 + LD DE,ESPSD_STR_STUNK +ESPSD_PRTSTATSTR1: + CALL WRITESTR + POP DE + POP AF + RET +; +; PRINT DIAGNONSTIC PREFIX +; +ESPSD_PRTPREFIX: + PUSH AF + CALL NEWLINE + PRTS("ESPSD$") + LD A,(IY+ESPSD_DEV) ; GET CURRENT DEVICE NUM + CP $FE ; NOT YET ASSIGNED? + JR Z,ESPSD_PRTPREFIX1 ; SKIP DEV NUM IF SO + CALL PRTDECB +ESPSD_PRTPREFIX1: + CALL PC_COLON + POP AF + RET +; +;============================================================================= +; STRING DATA +;============================================================================= +; +ESPSD_STR_STOK .TEXT "OK$" +ESPSD_STR_STINVUNIT .TEXT "INVALID UNIT$" +ESPSD_STR_STNOMEDIA .TEXT "NO MEDIA$" +ESPSD_STR_STCMDERR .TEXT "COMMAND ERROR$" +ESPSD_STR_STIOERR .TEXT "IO ERROR$" +ESPSD_STR_STRDYTO .TEXT "READY TIMEOUT$" +ESPSD_STR_STDRQTO .TEXT "DRQ TIMEOUT$" +ESPSD_STR_STBSYTO .TEXT "BUSY TIMEOUT$" +ESPSD_STR_STNOTSUP .TEXT "NOT SUPPORTED$" +ESPSD_STR_STNOTRDY .TEXT "NOT READY$" +ESPSD_STR_STUNK .TEXT "UNKNOWN ERROR$" +; +;============================================================================= +; DATA STORAGE +;============================================================================= +; +ESPSD_CMDVAL .DB 0 ; PENDING COMMAND FOR IO FUCNTIONS +ESPSD_DSKBUF .DW 0 ; ACTIVE DISK BUFFER +; +ESPSD_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index d8b4bb86..eae5fba4 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -4169,6 +4169,9 @@ HB_INITTBL: #IF (CHENABLE) .DW CH_INIT #ENDIF +#IF (ESPSDENABLE) + .DW ESPSD_INIT +#ENDIF #IF (PRPENABLE) .DW PRP_INIT #ENDIF @@ -8971,6 +8974,15 @@ SIZ_CH .EQU $ - ORG_CH MEMECHO " bytes.\n" #ENDIF ; +#IF (ESPSDENABLE) +ORG_ESPSD .EQU $ + #INCLUDE "espsd.asm" +SIZ_ESPSD .EQU $ - ORG_ESPSD + MEMECHO "ESPSD occupies " + MEMECHO SIZ_ESPSD + MEMECHO " bytes.\n" +#ENDIF +; #IF (ESPENABLE) ORG_ESP .EQU $ #INCLUDE "esp.asm" diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 50fc8be7..3f8ebd4a 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -421,6 +421,7 @@ DIODEV_SYQ .EQU $0C DIODEV_CHUSB .EQU $0D DIODEV_CHSD .EQU $0E DIODEV_USB .EQU $0F +DIODEV_ESPSD .EQU $10 ; ; RTC DEVICE IDS ; diff --git a/Source/HBIOS/invntdev.asm b/Source/HBIOS/invntdev.asm index 164015b8..045416bb 100644 --- a/Source/HBIOS/invntdev.asm +++ b/Source/HBIOS/invntdev.asm @@ -1,6 +1,6 @@ ;============================================================================== ; DEVIVE INVENTORY - Inventory Device -; Version June-2025 +; Version August-2025 ;============================================================================== ; ; This was extracted from HBIOS and converted into a ROM Application @@ -10,6 +10,7 @@ ; ; Change Log: ; 2025-06-30 [MAP] Initial Release copied from HBIOS.ASM +; 2025-08-09 [WBW] Add support for ESPSD driver ;______________________________________________________________________________ ; ; Include Files @@ -582,6 +583,7 @@ PS_DDSYQ .TEXT "SYQ$" PS_DDCHUSB .TEXT "CHUSB$" PS_DDCHSD .TEXT "CHSD$" PS_DDCHNATUSB .TEXT "USB$" +PS_DDESPSD .TEXT "ESPSD$" ; ; DISK TYPE STRINGS ; diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index a6d4591b..f5cd620d 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -224,17 +224,6 @@ PPIDEMODE_NONE .EQU 0 PPIDEMODE_STD .EQU 1 ; STANDARD PPIDEMODE_S100A .EQU 2 ; S100 PRIMARY INTERFACE PPIDEMODE_S100B .EQU 3 ; S100 SECONDARY INTERFACE -;;;; -;;;; PPIDE MODE SELECTIONS -;;;; -;;;PPIDEMODE_NONE .EQU 0 -;;;PPIDEMODE_SBC .EQU 1 ; STANDARD SBC PARALLEL PORT -;;;PPIDEMODE_DIO3 .EQU 2 ; DISKIO V3 PARALLEL PORT -;;;PPIDEMODE_MFP .EQU 3 ; MULTIFUNCTION / PIC -;;;PPIDEMODE_N8 .EQU 4 ; MULTIFUNCTION / PIC -;;;PPIDEMODE_RC .EQU 5 ; RCBUS PPIDE MODULE @ $20 (ED BRINDLEY) -;;;PPIDEMODE_DYNO .EQU 6 ; DYNO PPIDE @ $4C -;;;PPIDEMODE_RPH .EQU 7 ; RHYOPHYRE (RPH) ; ; SD MODE SELECTIONS ; diff --git a/Source/ver.inc b/Source/ver.inc index 8a18d80f..c44c4263 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 6 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.6.0-dev.16" +#DEFINE BIOSVER "3.6.0-dev.17" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 00539cd2..6ab08361 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 6 rup equ 0 rtp equ 0 biosver macro - db "3.6.0-dev.16" + db "3.6.0-dev.17" endm