From 0bac6f32ea099c2bcb7b81bf2ae742200424ba17 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 12 Jan 2024 15:22:13 -0800 Subject: [PATCH] Update BPBIOS Disk Reference Lookup - Modified BPBIOS to implement proper physical/logical disk unit lookups. --- Doc/RomWBW Applications.pdf | Bin 239630 -> 239631 bytes Doc/RomWBW Disk Catalog.pdf | Bin 123540 -> 123541 bytes Doc/RomWBW Errata.pdf | Bin 28831 -> 28760 bytes Doc/RomWBW ROM Applications.pdf | Bin 155015 -> 155016 bytes Doc/RomWBW System Guide.pdf | Bin 546757 -> 546757 bytes Doc/RomWBW User Guide.pdf | Bin 769180 -> 769181 bytes ReadMe.md | 4 +- ReadMe.txt | 2 +- Source/Apps/format.asm | 5 +- Source/BPBIOS/@WBW Z3ENV.txt | 6 +- Source/BPBIOS/bpbio-ww.z80 | 6 ++ Source/BPBIOS/cboot-ww.z80 | 14 ++-- Source/BPBIOS/def-ww-z33.lib | 2 +- Source/BPBIOS/def-ww-z33bnk.lib | 2 +- Source/BPBIOS/def-ww-z34.lib | 2 +- Source/BPBIOS/def-ww-z34bnk.lib | 2 +- Source/BPBIOS/def-ww-z41bnk.lib | 2 +- Source/BPBIOS/dphhd.lib | 37 +++++------ Source/BPBIOS/hard-ww.z80 | 111 +++++++++++++++++--------------- Source/BPBIOS/hbios.z80 | 5 ++ Source/BPBIOS/ramd-ww.z80 | 79 ++++++----------------- Source/BPBIOS/romwbw.lib | 6 +- Source/BPBIOS/selrwd.z80 | 22 +++---- Source/Doc/Basic.h | 2 +- Source/Images/Build.cmd | 2 +- Source/Images/Makefile | 2 +- Source/ver.inc | 4 +- Source/ver.lib | 4 +- 28 files changed, 149 insertions(+), 172 deletions(-) diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index 92fb90fe46232f0ca4ce6c8009f8808aea078124..417c0466d67e7b850e18b4450b2694222841b43b 100644 GIT binary patch delta 14620 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 E0M_4mlK=n! delta 14729 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 T?v3w1C7*iMS$p^IJN5qn;M#$) diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index 44a2b878c35ca2df527af1a5d1e43149b73b65ae..f5f574a18c1a735c9bf176bc2660a0bf9e8d2fb2 100644 GIT binary patch delta 4153 zcmai0eN2{B6yJj=`pz6gv!=CPDI!zret)1c5sY-BL^CW)dz(6JhGJx8Ga^5hn>tw8 zoz0v$rOmcBNu@-WHY|!XNHGa8>BH36(m-5u%+Ax);@o%Z{p;Pm=lR`p&hK|V-Z_%A z=}1yVvHPql7+$t!X5;f+WN624V|oVsd?7Yo4K1(c;||un+x6hfvx*9H7F{bVShP6f z*z`|^Y+U?gX6A~-&H>3=2OX%~F)uM8(v_Az_@}$>d$YFjqO8bSIhmgC{k3Mr6Gu9_ z*PQ9G2hO#9H0+kkO^1&)F1=zFR&-5I$eVq-Fe#;EYua14=Uu3M`b^m$DFtcMvVLFD z)VIE&`Inw0f6d%xGUpH3vntX&dg$QoUo3iLOLE`T?mK2>J(|?px@UQ0SN^Q0sxO?I zv%db&x!J3~%vzhb+~z&oIIw%#mDit}asK1a>qm4w9vv{JsbI;}z4iP59KO0?!;ap% z+!`}%dt$@R11`(`*lF>PMsq%|uWMt0BG)w1k#&fIZ*n-)~{^c8%1FzY4J z`s$tKrR_83j=c5kzUrb4yKAoW6rZ{}r}u$tjdk0 zfGJhfy5B?tSbp2uosL-?&Zh82Pnmi zC}G{<5CX@|m=-vlP?Q?yj1eP^OF0P;-j&oIfebS2KV`Ueu@J($lA2&$Fw433l%<-u z-5~@nA7+^sH|N9?JqI)B7vBQ}W`r|K;<8W0g-{xMCb$v)nSwwnLkL{# z0^o5jgr>e{3I>Dg3?VSzLKBUNmPB}3ktEawZ4FW__CgY7FiVnfuMJ5TYY$RgMQe~a z5f=nJX>lZyaZmLUe%v*K8=f#ElhkuVa_v0@BTl+eKg7wWG)7`prBq%k1F0zCN&un^ z6RxOH-isi5oOkGZUNI>KiSI9o2;#~ncp7!RW(y+_8-SHtf$FLeU1I(GST3Z)@RLZ=hSr|F}6GW7?5}#=% zJ(X%EydI$mC0KRv?F~2oO|BM3aaR@kgvroM8SE#Rdj+I5R3`FWYk!hxP^agUW;f#b zk55`q?y@_8EljSq%F{9QJa7EMEQFn^GK4^3QK)uLciLJ{+tBKv6goo)OfF1Sk6bvz zQwt<+V85iN<3hk<+&^hxuD#i5pnV8e9zyu$%3Hwv^dqy`3@yVMy>j%8Cd8Afg{wK>^2oXA|GEvK-Ma6TnhWvi^{ jg#R~rCYqHMd9gIMtn`&-3l>Hw4TTU%PoMJG!;!xMN<-5c delta 4784 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

ZIL;p4wtHfo${H*IZ15cm_Pk5^ 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 diff --git a/Doc/RomWBW ROM Applications.pdf b/Doc/RomWBW ROM Applications.pdf index 47f903b956be474d5fe6caca6e7b9f41dd56c7f0..5cae7d61c7d0369407f5af849f06613b56ee3e0a 100644 GIT binary patch delta 8253 zcmai3f2@{e8TNemhY&~;i3qG?a@6n;&+i|oM?<5S5)%~@)JefHfewkMtw!|zp>=Gv zVrib1%><^7HWpR`hs0up(lVLMl{A;xj?>kotqFOkwCnx8bKdWJ@9S*AKkVkd-{*d= z``7i{-_SFYA9!Z+wt=oR{NjeLnZ?!{uUmdtO+EOpTSlh$zVm~jo}0ckFzL{=m*)KS z{%%!SW?x2t#g z(AgU=e)gVE?dadG&U@tCT zesa|d8ydwgK6l$^1~-0vPS?(F9v{5p(??&OxA^qNnGauh*AoYiyfOdYU4z#?z5C{e zx1YFm_~Pq(?z*&h#fC|HC%^gZfxYWb{rKY-9(#0i|E(YU@7Kb>!s!<*`)A{~+jrmj zhc9=pS+({%>(t|KUHPlaPH+DG!GWXi9hftJ)Ak!L+A{jajMej2&tBH|`WJt=Zri{2 z&hFW>;E9>9{OQoHo+I;bKYXV5+kGz_Uf8|=*qZxhH-=_6y7tX(G|pUpjyBr4=)!}$ zC(W8_oYLch;l94c<5z}mRsQK7=$_L2hf+~FDbqP>DKjSc;qI#%mlT%&OXa#u+Z?p` zthUM;alF=@oui9*pM`_4jlPaW0cU(> z&;q2=nSfxB%m&u;hV?@9WSguiNSG5TMs3I7YNHiRrbD80znS{g!CGgL=S#6@B z+nH!7S<55j7mtL%Ns)$CDhhyMS5OSy<2azyc}?L2uTzFDs~pBAhX&TN60{y zWkooEAklKc8R@i3S+$e8Xf;ji6yA}sW2k-1)Cql3RyLJ@<|w}xyiF3VkZovI z4(?yUAFZR(iIHnIM(1TnA_kk3CC%_BZCod+P5jZ#Xxc$yWI1VvWRM9L6t!h-4z9($oO%`$x}XobY)Gaf&jYV0 zbm;TM1JKfgM8@K7V^z}Te-@QUUME9r$mziIKqs=r*N6u=wBUN^fWI?Aca}s6jl)!w zGMjukvC2PH$vU)e89J1<1wJAk<_hbO98)j$i>rWJp~IimwQM%tRs^UZ+e>XABei zUcKv;F~k{YaLxYLj;D8#s5YWb6dKMD4fB9dh6yu*Xu6L{RmhCu0HCPCpZ z$s9rL6QChIxF}>rFsND~M3l7b0Rc}-5j#*E^gU_oL6=D;%MLF<&^nZ26aT85km%HW z0^WA?!5n2GsgSjNT&RFIpsXg0-j0im@xPGW1Rr#5o<2s?L-y45kO>_hY;i)!TJyc5 zS403Uorwi5EMpQfn1z54+(6bbnu?*Z4IV(R{RpsRE=2H;vPw$)EBHY+XqY6-Ug=;` ziC7Nal*IKwK-d;5jE?WM>Mxb6199VInN}yvcbSB#Y_4oeB@3=B-;da>6xeN$v7?$z z)=S0=L>Lk#uYeH7c=nPpEv4|mD0x3@ zLubO3t-sV88)6;&FJWW}2w}`y4A4n-#%m)=7PbhKblO+Urxo@R|KzETVQgi#LJusC zJ_xE(m%-L}A%iW3d0h{(pbH^{FAJi2~V|uE?HdIt)YdO60}?2+CCB^Hq&bv=!M5I0Czf)f8r=nKM`(wG zR%SmA9=_+M#*89)IrO0JC0mC&IxHO(h^Hpxr?@w4@gyMI*c?Y?Uu`1}=S6PA80kpH zi5MTYg_4BBRuPcpRwnd~@q@dHnX^S};mv1HWsPvES;JsKO0DxF(28MeO0GRhC8oSGf07MYAKglJ=> zF%>%WsDKd|N)wC=N++ywI~Rnl$Yh)=QA7FC5+{R`NyIZaqsTj5{^}sp2^$w;9vO^B z=3VngJz#bWCXrYxMnCbp2n9>0o2Sym- z@5<&69lzi`#;F`^YU)j8_e+qtULt0Mh L>G|aHB~$(fX=0l0 delta 7100 zcmai2eQefO6}B(aLB|Mf1+q+%)<7DEHTU}?ELl@?qzy6V*o_MJ5$(DzUpPzK@>!D$& zuX*&}*Ux`$nR;RRH`X21gJ&+S?%F=>H-|Uf{r$IQ&5qSmO9MBYt%h{%%|AF=xBu|#qn~}JbMM-LKOcDc)cn(@8z0-TsWu$Avi`>DHKXr;?(wRD zeOG>e|K+W<-EDt)xbxFz>OOdM$I(}=^zAx3`B?4lRY(3f^i(LCAAY3n$=Oq$zV&a9 zG=89U=BXjyf6G6I<~;kon$EqOm%i66yV37if8ETHU;ge(58UzeGt0lSd*0~V#~yg& z`JG$muGl`fZP~`<8*h7G^AnRAzS?rWd$@7NoAs@m>i_hs#ux10Pj|fjsh8ffae4Qa zBWKrN`t{_WpRfCJ?Y}nEHf+A4~*-*50&Y+eLRm9XmKUcVE-YT{BL<(a_hk`a3VS zFF3yATbD*}2sI}^mr6}lb(@nSHJroA-vFZO-3*1no`cBhDC+O4=Mghgz`11qmw#yEGpE|6QvB!kQ1>z z+E@+&>zwy#C_^~_w2y2W=HH*0w*zPU!(MHaN6E>uFKyO#N~E?7!4wgcVz5E`t7crY zB3P|bFCe;Ed_vI7yAY$KEJSJ8Z=;Izw^ByI_ZfTDtN&rfL~B#A8E!F^S`lc#r4#(D zXrxP}3_;CRnnNfpHDya7XfBOp2uiN{hLNj-5jqXSrbzc2Wg^vwQP$F+nbdJtp)QG*!gY)q6C#tTiGp1x zTrgo%M+?}cs+LMPN|#hhQZuB|UZ$Z8K?5X}^VB=3f~EnIDh8WsmI8up*SMY}o)Uag zf*=y1QhSErpQ2=r7$g@8Ym^VEKSNL-MYOuYc10y2r4KSywE}_~ZIuc18d>OmI<8I!KdB~K@IfUFwJ_8>p{5i-dL5!G6ek;B&RM&WvI2%NhJH? zM*%_UltwcvkUm(NlbQBZ$`F)J)MZ1RlTp)4BBd6_r;!Xn4MetK_YB$EFbPJdMUo!_ z1PvClji>x5hy8?31r@8*lOZSZ!x@4K9QjRCE3~YToJ2G>H7u(H zVWQ%&p65m@j7S|7A%bztiXc7ZOhfZA4P^)_W)usS|BVciW@Dq!8>E`s0702H3bG^Y z8)+mLX`ot>S3| zu!=Hm4enVg-d+*HMP?bupoAlLqRlI12WC*H#q(oL)p*?o79i;EmFd!m3G2%r*G=LM?W5A^< zbYw}aMDM{d3~LS%B$lp`Ck1lJN?bt-;XxC8@AMfq> z!|Ynm>pl9nRI{pr(oiN@mJKK`RDD5&C{ufeV4u)L@-?X{tf3$3uVh6)(V}bx_{Y{X z3SX+a16GiDN@Fy;GH6j*n-#RRKDA{C%5gxqMK3d6H8e%yC>eC>%@E8-^uNStY!}=) zBYaF_6&*pK=`{+d4g9EFeT!|df*EZz>%aouxkM~zSb~(Plp*+umbTj1?pX#xdBiJz zBtwvki|vkUz(9-TG8X7fTugE`AowTTT)N$&UoT(7QHXx($q+OT2DGCD0^2ovRN|>B zLK@Bx+!1BTnn0mt{ZO!(i-tP^K{SBvuEKUUUw~yoh13BEE*TprbLT3u;V-4IQlE7Kfvlx5Ct^9m2sJu&U8G^BZ+rhGu;@vpH zi2lD95H-YOX;KmO>!#o#=kkL^z}N;EBOgo-$)D&80c)r>3Oc$nmQHpckts@x{zi67%HHQWQYh%ium1?}9h zS8%p41;Yd-LlAONO(Posp{6^=43uEfP=+A9!wTeC%1p$ww|ospc@)T+djUZR0)(TY z!gj~AT|~l6?HPhQVtIj#V7c516kUP-y1xQM{zR`T*6^UB5NOU+s=5#9m`WRS;6S;E zc=l4|#MF-}UySHZs4nx&lELC>#H=t7Q0j#hG#g_Oz#0RrA=KrLBbBVcaDb{4 zgI7qLaG|3|ag*yRSYZTuJF?y2SwU0`p-7A^dH~Tz=|ueKs1_4!xI$sw#Qb!;6k{JA z28jT1{{T7D@YDbR diff --git a/Doc/RomWBW System Guide.pdf b/Doc/RomWBW System Guide.pdf index b4e4acade502ac964c65d2b2f9b205e3544daabb..491b01b1ea5ca026f411e403ea8a45153dc99dd0 100644 GIT binary patch delta 590 zcmX@QUh(L9#R;wTlTY^DHsEP{U&po2!Q##q#>U1fHQ6oO#rBEXioTfBw5ayKv!-{S zxX4@2u$h@cYXLGwOOssT}(AxzI86qD9lOo=H5FfHB|RH=?DBFr_fc`GO{aML)ifpTyvjWtqV}TV{QHvMC7#aY zpTyb{5Tg3FS%Pz#knDj8kB|LM6xmny@kUeV$p!nCuzA;=+IRXUxN7KPR~@N5`J&hu-n}ufBPA^O*}ww&i{1O8no(Avu++z$>EYUg@&bnc2&f zFKqPa^VLH-588 zn;96Xw&8kmafH&3cUzTh%6Tf+TkK5uwyi3E;*9f0fA()EU+j15%BS^xr!9g{SFS#* z_;B;yvxnoS#l7sD>^NVzIgqJ6kckn9K{PWEvj8zG5VLI$WMVh@$6;t>Xkub+WInZ* zLmJN6x`AU$n6sm!xvR6Gg^7uyg^7!yi<5zynTw^Xv73R3fuXarvw@w04Iw4dmxpu6 F0RTfp0PO$( delta 590 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 EKa+?tzW@LL delta 35588 zcmai-3+%ULS;rF(FYsa@yqQV3SI03odCmt=Q(j;sDu*|T4P{v|mqcQgi{W}87rK>+ zEBh^n2be`TEnkbl%Q*meBZy1KK+Uto_@vkSFA2R`tTPG`@jB&4`fH&`OM27d-j9hyJgo=FS__0-#F{) z%OAYt-u>4;ddkV4|Iu*rWnVpT+@7}_d-!D^dhw6H?}+PeyXL{)`ogYrfB5^?9`aNB zKKawH-;?cs>Z)UZc*Jx5>CmXa3^m;~uGw zJn!Qd9(Li6eW|HGipci(@_g-0A+UippeUxzO~S>AN!AOFVVk3aOxVITVCTfhCm zr_X)wLx+Clmwxk_*FEpvdw=iwCx7|$pFjArqi?$C*e@S*`N93~KL3A?x$CK~ee;2P z%3Wvw;tSq*^_6E`ci~MZUG$0D55DImfBFwE|Lybs?fMh%zWu~=A3fn`Pk7?Pw;g}x z^lJoPR2oqG51#O)t=%_I3c&pYEs zZ}?(y=%2jil-GXss{225(PfwZ%JHwf?Po53+Yj#e^vhmf-~6T*-tzU=eBiDRf8eS= zdiW*%aW7q+^OlR7*M0XLAAR7q`;U9W^S-p_&g1X@+C?8}K6CjW+?v1XiC5jV>xu7w z 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 + INCLUDE RAMD-WW.Z80 ; << This Driver is for HBIOS >> + + PAGE + ENDIF ;RAMDSK + ; << ****** Hardware Specific ****** >> ; << Enter Warm Boot routines in >> diff --git a/Source/BPBIOS/cboot-ww.z80 b/Source/BPBIOS/cboot-ww.z80 index d8dee6fd..1196b436 100644 --- a/Source/BPBIOS/cboot-ww.z80 +++ b/Source/BPBIOS/cboot-ww.z80 @@ -120,14 +120,14 @@ DYNLP: LD E,(HL) DEC DE ; Else back up Ptr to Driver DEC DE LD A,(DE) ; Get driver # -; IF RAMDSK -; DEC A -; DEC A ; Hard Disk (Driver 2)? -; JR Z,ADDSIZ ; ..jump if so -; DEC A ; RAM Disk (Driver 3)? -; ELSE + IF RAMDSK + DEC A + DEC A ; Hard Disk (Driver 2)? + JR Z,ADDSIZ ; ..jump if so + DEC A ; RAM Disk (Driver 3)? + ELSE CP 2 ; Hard Disk (Driver 2)? -; ENDIF ; Ramdsk + ENDIF ; Ramdsk JR NZ,DYNCHK ; ..jump to end if Not ADDSIZ: PUSH BC ; Save loop counter PUSH HL ; and ptr to DPH diff --git a/Source/BPBIOS/def-ww-z33.lib b/Source/BPBIOS/def-ww-z33.lib index a9cf430f..41a02394 100644 --- a/Source/BPBIOS/def-ww-z33.lib +++ b/Source/BPBIOS/def-ww-z33.lib @@ -74,7 +74,7 @@ MORDPB EQU NO ; Include additional Floppy DPB Formats? ;;--- RAM Disk Section --- ; -;RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made +RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made ;--- Hard Disk Section --- diff --git a/Source/BPBIOS/def-ww-z33bnk.lib b/Source/BPBIOS/def-ww-z33bnk.lib index 1f8a0942..b70eeed6 100644 --- a/Source/BPBIOS/def-ww-z33bnk.lib +++ b/Source/BPBIOS/def-ww-z33bnk.lib @@ -74,7 +74,7 @@ MORDPB EQU NO ; Include additional Floppy DPB Formats? ;;--- RAM Disk Section --- ; -;RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made +RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made ;--- Hard Disk Section --- diff --git a/Source/BPBIOS/def-ww-z34.lib b/Source/BPBIOS/def-ww-z34.lib index 262c731b..5bf9f733 100644 --- a/Source/BPBIOS/def-ww-z34.lib +++ b/Source/BPBIOS/def-ww-z34.lib @@ -74,7 +74,7 @@ MORDPB EQU NO ; Include additional Floppy DPB Formats? ;;--- RAM Disk Section --- ; -;RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made +RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made ;--- Hard Disk Section --- diff --git a/Source/BPBIOS/def-ww-z34bnk.lib b/Source/BPBIOS/def-ww-z34bnk.lib index 6a5a693e..e97e59f2 100644 --- a/Source/BPBIOS/def-ww-z34bnk.lib +++ b/Source/BPBIOS/def-ww-z34bnk.lib @@ -74,7 +74,7 @@ MORDPB EQU NO ; Include additional Floppy DPB Formats? ;;--- RAM Disk Section --- ; -;RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made +RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made ;--- Hard Disk Section --- diff --git a/Source/BPBIOS/def-ww-z41bnk.lib b/Source/BPBIOS/def-ww-z41bnk.lib index e8e28a1b..13fd4da1 100644 --- a/Source/BPBIOS/def-ww-z41bnk.lib +++ b/Source/BPBIOS/def-ww-z41bnk.lib @@ -74,7 +74,7 @@ MORDPB EQU NO ; Include additional Floppy DPB Formats? ;;--- RAM Disk Section --- ; -;RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made +RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made ;--- Hard Disk Section --- diff --git a/Source/BPBIOS/dphhd.lib b/Source/BPBIOS/dphhd.lib index 89a22a4d..a43ceb7e 100644 --- a/Source/BPBIOS/dphhd.lib +++ b/Source/BPBIOS/dphhd.lib @@ -9,10 +9,11 @@ ; 1.0 - 31 Aug 92 - General Release. HFB ; 0.1 - 3 Jan 92 - Initial release. HFB ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -; The Physical Drive Number byte (XDPH+3) is simply an index to the Physical -; Drive as specified in the ICFG-xx.Z80 file. Up to three physical drives -; may be defined in that section, the first byte of which defines the -; Physical/Logical Unit Address (Device & LUN for SCSI, Master/Slave for IDE), +; The Logical Drive Number byte (XDPH+3) is simply an index into the +; BPBIOS physical drive table as specified in the ICFG-xx.Z80 file. +; BPBIOS supports exactly three logical drives which +; are defined in that section, the first byte of which defines the +; Physical Unit (HBIOS Disk Unit) ; and a flag bit to specify whether or not the drive is physically present. ; See ICFG-xx.Z80 for a definition of the data. @@ -21,7 +22,7 @@ XDPH90: DEFB TRUE ; Format lock flag (Lock RAM Drive) DEFB FIXDSK ; Disk Drive Type - DEFB 2 ; Driver ID = Treat as Hard Drive + DEFB 3 ; Driver ID = Treat as Hard Drive DEFB HB_MDRAM ; Physical Drive Number DPH$90: DEFW 0 ; Skew Table pointer DEFW 0,0,0 ; Scratch area @@ -34,7 +35,7 @@ DPH$90: DEFW 0 ; Skew Table pointer XDPH91: DEFB TRUE ; Format lock flag (Lock ROM Drive) DEFB FIXDSK ; Disk Drive Type - DEFB 2 ; Driver ID = Treat as Hard Drive + DEFB 3 ; Driver ID = Treat as Hard Drive DEFB HB_MDROM ; Physical Drive Number DPH$91: DEFW 0 ; Skew Table pointer DEFW 0,0,0 ; Scratch area @@ -48,7 +49,7 @@ DPH$91: DEFW 0 ; Skew Table pointer XDPH50: DEFB TRUE ; Format lock flag (Lock First Hard Drive) DEFB FIXDSK ; Disk drive type DEFB 2 ; Driver ID - 2=hard drive - DEFB HB_HDDEV0 ; Physical drive [0..6] for this Partition + DEFB 0 ; Logical drive [0..2] for this Partition DPH$50: DEFW 0 ; Skew table pointer DEFW 0,0,0 ; Scratch area DEFW DIRBUF ; Directory buffer pointer @@ -61,7 +62,7 @@ DPH$50: DEFW 0 ; Skew table pointer XDPH51: DEFB TRUE ; --- Second Hard Drive/Partition DEFB FIXDSK ; Disk drive type DEFB 2 ; Driver ID - 2=hard drive - DEFB HB_HDDEV0 ; Physical drive [0..6] for this Partition + DEFB 0 ; Logical drive [0..2] for this Partition DPH$51: DEFW 0 DEFW 0,0,0 DEFW DIRBUF @@ -74,7 +75,7 @@ DPH$51: DEFW 0 XDPH52: DEFB TRUE ; --- Third Hard Drive/Partition DEFB FIXDSK ; Disk drive type DEFB 2 ; Driver ID - 2=hard drive - DEFB HB_HDDEV0 ; Physical drive [0..2] for this Partition + DEFB 0 ; Physical drive [0..2] for this Partition DPH$52: DEFW 0 DEFW 0,0,0 DEFW DIRBUF @@ -87,7 +88,7 @@ DPH$52: DEFW 0 XDPH53: DEFB TRUE ; --- Fourth Hard Drive/Partition DEFB FIXDSK ; Disk drive type DEFB 2 ; Driver ID - 2=hard drive - DEFB HB_HDDEV0 ; Physical drive [0..6] for this Partition + DEFB 0 ; Logical drive [0..2] for this Partition DPH$53: DEFW 0 DEFW 0,0,0 DEFW DIRBUF @@ -100,7 +101,7 @@ DPH$53: DEFW 0 XDPH54: DEFB TRUE ; --- Fifth Hard Drive/Partition DEFB FIXDSK ; Disk drive type DEFB 2 ; Driver ID - 2=hard drive - DEFB HB_HDDEV0 ; Physical drive [0..6] for this Partition + DEFB 0 ; Logical drive [0..2] for this Partition DPH$54: DEFW 0 DEFW 0,0,0 DEFW DIRBUF @@ -113,7 +114,7 @@ DPH$54: DEFW 0 XDPH55: DEFB TRUE ; --- Sixth Hard Drive/Partition DEFB FIXDSK ; Disk drive type DEFB 2 ; Driver ID - 2=hard drive - DEFB HB_HDDEV0 ; Physical drive [0..6] for this Partition + DEFB 0 ; Logical drive [0..2] for this Partition DPH$55: DEFW 0 DEFW 0,0,0 DEFW DIRBUF @@ -126,7 +127,7 @@ DPH$55: DEFW 0 XDPH56: DEFB TRUE ; --- Seventh Hard Drive/Partition DEFB FIXDSK ; Disk drive type DEFB 2 ; Driver ID - 2=hard drive - DEFB HB_HDDEV0 ; Physical drive [0..6] for this Partition + DEFB 0 ; Logical drive [0..2] for this Partition DPH$56: DEFW 0 DEFW 0,0,0 DEFW DIRBUF @@ -139,7 +140,7 @@ DPH$56: DEFW 0 XDPH57: DEFB TRUE ; --- Eighth Hard Drive/Partition DEFB FIXDSK ; Disk drive type DEFB 2 ; Driver ID - 2=hard drive - DEFB HB_HDDEV0 ; Physical drive [0..6] for this Partition + DEFB 0 ; Logical drive [0..2] for this Partition DPH$57: DEFW 0 DEFW 0,0,0 DEFW DIRBUF @@ -152,7 +153,7 @@ DPH$57: DEFW 0 XDPH58: DEFB TRUE ; --- Ninth Hard Drive/Partition DEFB FIXDSK ; Disk drive type DEFB 2 ; Driver ID - 2=hard drive - DEFB HB_HDDEV1 ; Physical drive [0..6] for this Partition + DEFB 1 ; Logical drive [0..2] for this Partition DPH$58: DEFW 0 DEFW 0,0,0 DEFW DIRBUF @@ -165,7 +166,7 @@ DPH$58: DEFW 0 XDPH59: DEFB TRUE ; --- Tenth Hard Drive/Partition DEFB FIXDSK ; Disk drive type DEFB 2 ; Driver ID - 2=hard drive - DEFB HB_HDDEV1 ; Physical drive [0..6] for this Partition + DEFB 1 ; Logical drive [0..2] for this Partition DPH$59: DEFW 0 DEFW 0,0,0 DEFW DIRBUF @@ -178,7 +179,7 @@ DPH$59: DEFW 0 XDPH60: DEFB TRUE ; --- Eleventh Hard Drive/Partition DEFB FIXDSK ; Disk drive type DEFB 2 ; Driver ID - 2=hard drive - DEFB HB_HDDEV1 ; Physical drive [0..6] for this Partition + DEFB 1 ; Logical drive [0..2] for this Partition DPH$60: DEFW 0 DEFW 0,0,0 DEFW DIRBUF @@ -191,7 +192,7 @@ DPH$60: DEFW 0 XDPH61: DEFB TRUE ; --- Twelveth Hard Drive/Partition DEFB FIXDSK ; Disk drive type DEFB 2 ; Driver ID - 2=hard drive - DEFB HB_HDDEV1 ; Physical drive [0..6] for this Partition + DEFB 1 ; Logical drive [0..2] for this Partition DPH$61: DEFW 0 DEFW 0,0,0 DEFW DIRBUF diff --git a/Source/BPBIOS/hard-ww.z80 b/Source/BPBIOS/hard-ww.z80 index b5943ac7..f17373d5 100644 --- a/Source/BPBIOS/hard-ww.z80 +++ b/Source/BPBIOS/hard-ww.z80 @@ -104,33 +104,55 @@ SELHD: ; SET DEVICE ; Writes from HSTBUF using HSTTRK and HSTSEC to build Block Number. ; NOTE: This routine uses physical drive characteristics from ICFG-xx. -HDWRIT: +HDWRIT: +; CALL PRTSTRD +; DEFB '[HD WRITE]$' XOR A LD (HSTWRT),A ; Show no active writes pending - JP HDSK_WRITE ; ..continue + + LD B,HB_DIOWRITE ; HBIOS WRITE + JR HDIO ; ..continue ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; Read from Hard Disk Drive < Internal BIOS Routine > ; Reads to HSTBUF using HSTTRK and HSTSEC to build Block Number. -; NOTE: This routine uses physical drive characteristics from ICFG-xx. -; The routine computes a sequential block number with the algorithm; -; Trk * 16 + Sector, HBIOS uses LBA addressing for hard drive like -; devices i.e. everything but floppies. The Track contains the most -; significant 16 bits, Head the next byte and Sector the least -; significant byte. Note, only 16 bits are needed to address 33 -; megabytes for now 24 bits will be used for the LBA address. For non- -; hard drive like devices, Head, Sector and Track can be computed -; using Physical characteristics (hdHds = Number_of_Heads, -; hdSPT = Sectors_per_Track) according to the algorithm: -; -; Sector := (Block# MOD hdSPT)+1 (* Quotient1 := Block# DIV hdSPT *) -; Head := Quotient1 MOD hdHds (* Quotient2 := Quotient1 DIV hdHds *) -; Track := Quotient2 -;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: HDREAD: - JP HDSK_READ +; CALL PRTSTRD ; DEBUG +; DEFB '[HD READ]$' ; DEBUG + + LD B,HB_DIOREAD ; HBIOS READ + JR HDIO ; ..continue + +;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +; Common read/write code for hard disk + +HDIO: + LD HL,(HSTDPH) ; GET ACTIVE DPH POINTER + DEC HL ; ADJUST TO POINT TO BPBIOS LOGICAL UNIT NUMBER + LD A,(HL) ; LOAD IT IN A +; + ; Convert logical -> physical + ; Code below is ugly brute force approach, but since there are + ; always exactly 3 logical drives in BPBIOS and the first one + ; is the most commonly used, this turns out to be reasonably + ; efficient. + LD HL,HDRV0 ; PERHAPS HDRV0 + OR A ; A == 0? + JR Z,HDSK_HDIO1 ; HANDLE IF SO + LD HL,HDRV1 ; PERHAPS HDRV1 + DEC A ; A == 1? + JR Z,HDSK_HDIO1 ; HANDLE IF SO + LD HL,HDRV2 ; PERHAPS HDRV2 + DEC A ; A == 2? + JR Z,HDSK_HDIO1 ; HANDLE IF SO + CALL PANIC ; INVALID LOGICAL UNIT NUMBER +HDSK_HDIO1: + LD A,(HL) ; LOAD PHYS UNIT NUM (HBIOS DISK UNIT) + AND 0FH ; REMOVE EXTRANEOUS BITS + LD C,A ; PUT IN C FOR BELOW + JR HB_DSKIO IF BANKED COMMON /BANK2/ @@ -142,28 +164,25 @@ HDREAD: ; HBIOS Disk Driver Interface ;================================================================================================== ; -; HBIOS disk commands -; -HB_DSKRD EQU 13H -HB_DSKWR EQU 14H +; Enter with B=HBIOS disk function code (read/write) +; C=HBIOS disk unit number ; -HDSK_READ: -; CALL PRTSTRD ; DEBUG -; DEFB '[HDSK READ]$' ; DEBUG - - LD B,HB_DSKRD ; HBIOS DISK READ (13H) - JR HDSK_RW +; NOTE: This routine uses physical drive characteristics from ICFG-xx. +; The routine computes a sequential block number with the algorithm; +; Trk * 16 + Sector, HBIOS uses LBA addressing for hard drive like +; devices i.e. everything but floppies. The Track contains the most +; significant 16 bits, Head the next byte and Sector the least +; significant byte. Note, only 16 bits are needed to address 33 +; megabytes for now 24 bits will be used for the LBA address. For non- +; hard drive like devices, Head, Sector and Track can be computed +; using Physical characteristics (hdHds = Number_of_Heads, +; hdSPT = Sectors_per_Track) according to the algorithm: ; -HDSK_WRITE: -; CALL PRTSTRD -; DEFB '[HDSK WRITE]$' +; Sector := (Block# MOD hdSPT)+1 (* Quotient1 := Block# DIV hdSPT *) +; Head := Quotient1 MOD hdHds (* Quotient2 := Quotient1 DIV hdHds *) +; Track := Quotient2 - LD B,HB_DSKWR ; HBIOS DISK WRITE (14H) -; -HDSK_RW: - LD HL,(HSTDPH) ; GET ACTIVE DPH POINTER - DEC HL ; ADJUST TO POINT TO UNIT NUMBER - LD C,(HL) ; LOAD IT IN C FOR HBIOS CALL LATER +HB_DSKIO: PUSH BC ; SAVE FUNCTION AND DEVICE FOR LATER LD HL,(HSTTRK) ; GET TRACK VALUE LD A,L ; LSB OF TRACK TO A @@ -172,10 +191,10 @@ HDSK_RW: LD A,(HSTSEC) ; GET SECTOR LD E,A ; STUFF IT IN E LD B,4 ; PREPARE TO SHIFT OUT 4 BIT HEAD VALUE -HDSK_RW1: +HB_DSKIO1: SRL H ; SHIFT ONE BIT OUT RR L ; ... OF HL - DJNZ HDSK_RW1 ; DO ALL 4 BITS + DJNZ HB_DSKIO1 ; DO ALL 4 BITS POP BC ; RECOVER FUNCTION AND DEVICE PUSH BC ; SAVE INCOMING FUNCTION, DEVICE/UNIT LD B,12H ; SETUP FOR NEW SEEK CALL @@ -192,17 +211,3 @@ HDSK_RW1: OR 0FFH ; A=$FF TO SIGNAL ERROR RET ; AND DONE W/ ERROR -; -;================================================================================================== -; HDSK DISK DRIVER - DATA -;================================================================================================== -; - IF BANKED - COMMON /B2RAM/ - ELSE - DSEG - ENDIF - -HDSK_PDN DEFS 1 ; PHYSICAL DEVICE - - \ No newline at end of file diff --git a/Source/BPBIOS/hbios.z80 b/Source/BPBIOS/hbios.z80 index 2d0acf90..c5884b96 100644 --- a/Source/BPBIOS/hbios.z80 +++ b/Source/BPBIOS/hbios.z80 @@ -27,6 +27,11 @@ HBX_SRCBNK EQU 0FFE4H HBX_DSTADR EQU 0FFE5H HBX_DSTBNK EQU 0FFE7H HBX_CPYLEN EQU 0FFE8H +; +; HBIOS disk commands +; +HB_DIOREAD EQU 13H +HB_DIOWRITE EQU 14H CSEG diff --git a/Source/BPBIOS/ramd-ww.z80 b/Source/BPBIOS/ramd-ww.z80 index 2cdc8267..a3f7dca5 100644 --- a/Source/BPBIOS/ramd-ww.z80 +++ b/Source/BPBIOS/ramd-ww.z80 @@ -11,9 +11,8 @@ COMMON /BANK2/ ENDIF -; This module creates a RAM Drive using the available memory (if available) -; above the TPA and possible System banks. For a banked system, the minimum -; needed is a 64k Main TPA and a 32k System Bank. +; This module implements the HBIOS RAM disk driver by using the +; RomWBW disk interface. ;..... ; Select the RAM Drive. This routine performs any setup required in a select. @@ -22,70 +21,28 @@ SELRAM: JP SETPARMS ; No action locally. ;..... ; Read a 128-byte logical sector from the RAM Drive to main memory. -; This routine uses the HSTxxx values from the base BIOS routines. -RAMRD: OR 0FFH ; Set Read flag (non-0) - JR RamRW ; ..go to common code +RAMRD: + LD B,HB_DIOREAD ; HBIOS READ + JR RAMIO ; READ/WRITE COMMON CODE ;..... ; Write a 128-byte logical sector from main memory to the RAM Drive. -; This routine uses the HSTxxx values from the base BIOS routines. -RAMWR: XOR A ; Set Write flag with 0, Read w/AFH +RAMWR: + XOR A ; Set Write flag with 0, Read w/AFH LD (HSTWRT),A ; clear pending write flag - ;..fall thru to common code.. - -; The following performs calculations for the proper address and bank, sets -; the DMA block and executes the Move to/from the Host Buffer. +; + LD B,HB_DIOWRITE ; HBIOS WRITE + JR RAMIO ; READ/WRITE COMMON CODE -RamRW: - PUSH AF ; Save R/W flag for later - ; BUILD TOTAL BYTE OFFSET INTO A:HL - XOR A,A ; A STARTS OUT ZERO - LD HL,(HSTTRK) ; HL STARTS WITH TRACK NUM - LD H,0 ; ONLY LSB IS NEEDED (INIRAMD PASSES INVALID MSB) - LD B,5 ; MULT BY 32 SECTORS PER TRACK -RAMWR1: - ADD HL,HL ; DOUBLE VALUE - ADC A,A ; ... INCLUDING A WITH CARRY - DJNZ RAMWR1 ; LOOP 5 TIMES FOR MULT BY 32 - LD DE,(HSTSEC) ; SECTOR VALUE TO 3 (ONE BYTE) - LD D,0 ; CLEAR MSB SINCE HSTSEC IS JUST ONE BYTE - ADD HL,DE ; ADD TO WORKING VALUE - ADC A,0 ; HANDLE POSSIBLE CARRY - LD B,7 ; MULT BY 128 BYTES PER SECTOR -RAMWR2: - ADD HL,HL ; DOUBLE VALUE - ADC A,A ; ... INCLUDING A WITH CARRY - DJNZ RAMWR2 ; LOOP 7 TIME FOR MULT BY 128 - ; CONVERT BYTE OFFSET IN A:HL TO BANK(A):OFFSET(HL) - SLA H ; ROTATE HIGH BIT OF H INTO CF - RL A ; ROTATE CF INTO LOW BIT OF A - SRL H ; FIX H (ROTATE BACK W/ ZERO INTO HIGH BIT) - ; ADJUST FOR STARTING RAM BANK - LD C,A ; BANK TO C - LD A,(RAMBNK) ; GET STARTING RAM BANK NUM - ADD A,C ; COMBINE TO GET ACTUAL SOURCE BANK NUM - ; SETUP FOR INTERBANK COPY - LD C,A ; SOURCE BANK TO C - LD B,BID_HB ; DEST BANK TO B (HSTBUF IN HBIOS) - ;LD A,(HB_BNKBIOS) ; DEST BANK (HSTBUF IN HBIOS) - ;LD B,A ; PUT IN B - LD DE,(HB_DSKBUF) ; DEST ADDRESS TO DE; HL ALREADY HAS SOURCE ADDRESS - ; REVERSE VALUES IF WRITE - POP AF ; Read or Write? - JR NZ,RAMWR3 ; ..jump if Read - EX DE,HL ; Else swap things around - LD A,C - LD C,B - LD B,A -RAMWR3: - ; PERFORM THE COPY - CALL XMOVE ; SET BANKS FOR COPY - LD BC,128 ; SET LENGTH OF COPY (ONE SECTOR) - CALL MOVE ; DO THE COPY - ; CLEAN UP AND RETURN - XOR A ; SIGNAL SUCCESS - RET ; AND RETURN +;..... +; Common code to setup RomWBW disk access +; +RAMIO: + LD HL,(HSTDPH) ; GET ACTIVE DPH PTR + DEC HL ; ADJUST TO POINT TO BPBIOS LOGICAL UNIT + LD C,(HL) ; USE AS HBIOS DISK UNIT NUMBER + JP HB_DSKIO ; DO THE REST IN HARD DISK DRIVER ;================== End of RAM Disk Code ==================== diff --git a/Source/BPBIOS/romwbw.lib b/Source/BPBIOS/romwbw.lib index dcecd53d..31d2b5e2 100644 --- a/Source/BPBIOS/romwbw.lib +++ b/Source/BPBIOS/romwbw.lib @@ -27,7 +27,11 @@ HB_IODEV EQU 80H ; 0x80 is current HBIOS console HB_MDRAM EQU 0 ; HBIOS Disk Unit #0 is usually the RAM Disk HB_MDROM EQU 1 ; HBIOS Disk Unit #1 is usually the ROM Disk ; -; Set HB_HDDEVN to appropriate HBIOS disk device numbers +; Map BPBIOS logical drive numbers (0-2) to HBIOS physical disk units +; HB_HDDEVn values map to HDRVn (see icfg-ww). +; +; The values below will be the default mapping. They can be changed +; using BPCNFG *Physical Drive* configuration. ; ; If the RomWBW system has no floppy drives, then the hard disk units ; will start right after the memory disk units. So, the first hard disk diff --git a/Source/BPBIOS/selrwd.z80 b/Source/BPBIOS/selrwd.z80 index 255878bd..b856f285 100644 --- a/Source/BPBIOS/selrwd.z80 +++ b/Source/BPBIOS/selrwd.z80 @@ -115,17 +115,17 @@ DVRVCT: DEFW SELERR ; Driver 0 Select DEFW HDREAD ; Driver 2 Read DEFW HDWRIT ; Driver 2 Write ENDIF ; harddsk -; IF [RAMDSK AND NOT HARDDSK] -; DEFW SELERR ; Driver 2 Select (Dummy if No Hard Drive) -; DEFW ISTRUE ; Driver 2 Read -; DEFW ISTRUE ; Driver 2 Write -; ENDIF ;ramdsk & not harddsk - -; IF RAMDSK -; DEFW SELHD ; Driver 3 Select (RAM Drive) -; DEFW HDREAD ; Driver 3 Read -; DEFW HDWRIT ; Driver 3 Write -; ENDIF ;ramdsk + IF [RAMDSK AND NOT HARDDSK] + DEFW SELERR ; Driver 2 Select (Dummy if No Hard Drive) + DEFW ISTRUE ; Driver 2 Read + DEFW ISTRUE ; Driver 2 Write + ENDIF ;ramdsk & not harddsk + + IF RAMDSK + DEFW SELRAM ; Driver 3 Select (RAM Drive) + DEFW RAMRD ; Driver 3 Read + DEFW RAMWR ; Driver 3 Write + ENDIF ;ramdsk SELERR: LD HL,0 ; Send null DPH pointer back to caller RET diff --git a/Source/Doc/Basic.h b/Source/Doc/Basic.h index c0601ac0..87447530 100644 --- a/Source/Doc/Basic.h +++ b/Source/Doc/Basic.h @@ -1,4 +1,4 @@ -$define{doc_ver}{Version 3.4}$ +$define{doc_ver}{Version 3.5}$ $define{doc_product}{RomWBW}$ $define{doc_root}{https://github.com/wwarthen/RomWBW/raw/dev/Doc}$ $ifndef{doc_title}$ $define{doc_title}{Document Title}$ $endif$ diff --git a/Source/Images/Build.cmd b/Source/Images/Build.cmd index b28ecc3a..d7776994 100644 --- a/Source/Images/Build.cmd +++ b/Source/Images/Build.cmd @@ -66,7 +66,7 @@ call BuildDisk.cmd bascomp hd wbw_hd1k || exit /b call BuildDisk.cmd fortran hd wbw_hd1k || exit /b call BuildDisk.cmd games hd wbw_hd1k || exit /b -if exist ..\BPBIOS\bp*.rel call BuildDisk.cmd bp hd wbw_hd1k || exit /b +if exist ..\BPBIOS\bp*.rel call BuildDisk.cmd bp hd wbw_hd1k ..\zsdos\zsys_wbw.sys || exit /b copy hd1k_prefix.dat ..\..\Binary\ || exit /b diff --git a/Source/Images/Makefile b/Source/Images/Makefile index 3c9e78c8..1a9cf1ba 100644 --- a/Source/Images/Makefile +++ b/Source/Images/Makefile @@ -81,7 +81,7 @@ blankhd1k: case $@ in \ (*cpm22*) sys=../CPM22/cpm_wbw.sys;; \ (*qpm*) sys=../QPM/qpm_wbw.sys;; \ - (*zsdos* | *nzcom* | *dos65*) sys=../ZSDOS/zsys_wbw.sys;; \ + (*zsdos* | *nzcom* | *dos65* | *bp*) sys=../ZSDOS/zsys_wbw.sys;; \ (*cpm3*) sys=../CPM3/cpmldr.sys;; \ (*zpm3*) sys=../ZPM3/zpmldr.sys;; \ esac ; \ diff --git a/Source/ver.inc b/Source/ver.inc index 4b83eb0e..0fcdcf0f 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -1,8 +1,8 @@ #DEFINE RMJ 3 -#DEFINE RMN 4 +#DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.4.0" +#DEFINE BIOSVER "3.5.0-pre.0" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 96f21a04..191c0936 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -1,7 +1,7 @@ rmj equ 3 -rmn equ 4 +rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.4.0" + db "3.5.0-pre.0" endm