From 219891823111cd42ef0b2552cdc1d96d3e1bec61 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 11 Feb 2020 11:26:14 -0800 Subject: [PATCH 1/5] Create SC126_How-To_No_2_Preparing_an_SD_Card_for_Use_with_SC126_Rev_1-5.pdf Thanks to David Reese for contributing this. --- ...g_an_SD_Card_for_Use_with_SC126_Rev_1-5.pdf | Bin 0 -> 120834 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Doc/Contrib/SC126_How-To_No_2_Preparing_an_SD_Card_for_Use_with_SC126_Rev_1-5.pdf diff --git a/Doc/Contrib/SC126_How-To_No_2_Preparing_an_SD_Card_for_Use_with_SC126_Rev_1-5.pdf b/Doc/Contrib/SC126_How-To_No_2_Preparing_an_SD_Card_for_Use_with_SC126_Rev_1-5.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9dd3fe3ba9bb5dd01f85ba17d8fa59c511b02da9 GIT binary patch literal 120834 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�`XN$M;&u1c`D^R^R5t4M*9QT3uVCF z5A-NKaWoN?9~t6fndJ2?;uVHh;|c`Y^j)Uqr^#J zyR1s$-zNk`Gn#xj<@@7x=Fm2}9N>2GB7aGL2OnQd9Ff^n$Be>)ApC-Zl~ z_4y;mB@)<=8@n`RTpA7`&e#FLatIJFcc{N5>!+vBOe zNWX&fjpFeq7RjyR_WFIln}iF~Ic;)YlR-5~AeWbXS&U+fD;m53)19x9(zrMNQkId0bs+Z!9tM9DSi0ThF4|6HS4^ zMtRy#l6fE#*XlHl0>SJ^$}wAD3UZbUJ6N~w-iBoq6sEriUf7mBg1IZ{QNm0mTLrE zL%TCK(tY7}LQu;jVF3Z|(?LPGD%i1MrC4M~?|#M8@1ARK5NX}X#N8yC%L zlA2u@Y0@s!hFcYGT_2q@23@sh6!cCxeG;;AIQ03d@KF0mj=ASbs-a1YPHn`rz7D<| zia&C$u;cIydIeoKNQZGBYG)}eB$rvd$G(PN%Ggjv@@2H>i*;n3!t*!nI3lFyrg6E~ zU;{Wkp_(YLGFny+{>wS5iU^??0BnUR*?|E3Z?0q}b0H ztY0jNqes_yB{=m%vUdjc(-GeVCSV;c5HcpB9{a7l{Tk~8GrNT)D^!S zl4ogQvMK7Y-Z@Z_LJBjlLYX->>DOVSIE@he7wC1K7!^xDx6;v;rYQ?+k{%~W0-UAq zUvGdAy!tV2cuAKjg-=PS`Li*zg)Df^2O!{{A{s>bnBi`w?)=c4z(nk|ZZWs{m`*?E zvCU2=)kY1H*ti#$jVe~yWt_E}#`{JV?C$MdW5W~_GSmJhtLnW^Cm|=hi_R&{LXy?%#TN98<@>lc>*145leI|zVdy93n$p1*x1xk+vwMGF z7CqTmn2j#zFdM3-Hu%g+k4M)b*S?Mja|}bW%H&zDCW)JQVTm)`qxDlD@F2?AD{Ot_EPqQRx18;ungh_=YMS zsd$2b_;Nc^`|K<7;oZr96_Z)UFUaZWg^h zVF}F)MqZmaj8VI2UOn6`@=cq8O&z|7c-eJQ#Hy)yMPzuO?D%Jv$iXtq^PqOlv~^zT zb7#K%4q{%j6rl@|h?N!SGTVrADJ2zrlQMtBQFjBXn@gt!HF%<|6SO{D-17rSd;DmC ztNYAgL1jm((7}w4TvSu~X}2;|0cm{+6x`z#+As^AjTyY$_&a}Q!+!MkH0A?@Gp3xQ ze7OAUGsFXTDJN9g*k|#)!rFajjgl12-XYd$ZazXk{z|Ado<}X$LOeTtH^?A$DGlgzfYFcFT{mB);!p2T;1VzZdxB^Lc()%ZvR(NPYHr z%Ih;W-0JJI)#J6dKgoJw9v0$Udb~IP|H8~|AMotrwAR#1XRj)**RL1a_x!6E#oPZM znDN{Rb}X4X_og*^+*OKt`^MI`q1n-z&$gb?0_bFvGn(CW*)jUgo4V=5$dHk61Osi+ z;HY2Iib@5d!9Fa{y9UmmiRQYs9oLruMhg>$*vQn5@ngR@+aD9;5ab;Y5NQ3p9LwU( z(&F*@$SnDgS>WPU!$s6$2Ed>9<)6R3>hd6yU#+^-5oSH@rv`$Gsvy|@qqE6Uwgp^S z{V~L?$P(+M07G*TKq_Gv$#xWa)%C`DfG$F86Jx6|DjX;%sh~xdt@s$tvti8v2(f7G zI#SkWXltW}b*U$24G=5`lo)h5LzR3t0Vh&P(B!SraFE5~Hh}eJY7IZvWWRweK9lJs z7a`D{UQ&8K*^rAYG=Khi{749GLb{IbiJ%2E&2%2Zh9i7P{EzgB{2*_6NyQ_(KdLEk zv+xCO(jMLQZ9_${T!&NXC^KXY-J8{`QD{U$L~FH*n-Y2}1$)6&h{>Yj5f zSwPX1?3x#6>n?CNwSIg8O$G3wnXBe(Ui#h>{|%ZPWx7o{K( zr(b3tjFjg3mthjKa#C*Nj&v1RYN7?y>ueiJfz`D!E24xE}yL;3(_gMdti|%K7U0%Q{2U*XjwE$EKtrJiK*+&h<~@V7R0u zB?kc1yjeCJt~`Ec4vx1#-AviX`>Y+xu5)I=7zw~vr|id7hwEZyN<`_orw-Zf`Emnd ztA-(L&;Bq3ZRz>b#24wC!g*6lhp@sC_csbglQ`4TnVZm4U>aRRNuy81JH>67j0(Nf z#rrUnoky)!{*_m4IEy;%qM_v_pHEvm^1*;r_)Q~_7wKC)k8h%RPauM=u(Yp)Um^ux zzr(@^7lI^CvANdW+a#S!J1(*$uEPiai%aWik=m9-;how;#~J%JJkwqHW0lL zyQv*IZy(CT$ngeY?}tZ@zQ$VMv8(zw1vDWK6k9^M(m~?VZ{nYYElCf*@^VV|WtlDW zlX^6ls!d_KKM>b)n9DSl_5~>)3586>ah@mY%N-z6NNzAb1;O#(u|*vrtT@i5=v&cF zUbl_QW0pcXo=^>$cN8Gm+M+?X@A>o*(H=vU`iPR{ZY=N}dxOi7IxnMalj_Kk!#I-c z(eFi3F>wOqNopR|7#$SGK=n>DYurmO?9#DU&P7D*x7XR2XUl4>hz*8G-P$TJ-X-^E z)66Q~$I%s)g7)+TPLa_y+=lhw3-*_#;Zo^eVXrM;*wKO$Xdsj;*!ei+3$-A3?V{m4 zFvPBPGUt{R?3GaNE&V07&m&z)*aXxG!&Lb;h}e$f-YLh&?z{^Tnqkg)Rw?IHSJQ$w zLAAKK0463DeR3crJR89(ED$StZkS4_8ZWI@bot^Fhx%0sB^_-y^-mFF+)bI!YFe~e z3I=jl{zWvkIgb$`x#!*SRuoVXZ61zR$XS=L37e?I&@664-z+q__Xo?P?|*x?e(3pg^N8VhOJKET5{otX*3t>MCs-T;O-s&{3X6>8-9h000B z=twddl4qYNPBvGfTyhteZ3Z$S+%Ay%JU0kWQ?wI^g|Gm*@yeq4^Q*Bv^F_GGRPP@$ zFl<&H;28p@SLrzyVBFow2i{h~4QmB+DL75;!L{-1sj}qRruh{q>0?59vIg>=RI6=g zsaltM$c>ED{S$kBo5uX0x^U_tFBkD(QL9kXZqHe_Mt1qlqXDo{OrEIFP|`!(AA1G3 zcNLB!bO!!L_h&DXeBAo03{M6v&bK9>*-rIUMfU>*kToj{U5|GJl|Z$ih?G~5O=mX@ z`})>7w-bR*v74vr#Pep-P1FpEAItN3=M!XZ{g$chm!~5VM$la=Q}bJaGAs)^lcAf7 zQRZs;HPt>?)hKLji=BS`09(#5IDe$7G_j9ugiyG?3+D6E)en&2GWHmU;T*CPccDla zs0~eQ=r&9<^Nah64*{#Gd=cI3u?#+1d~}?dcK+b2LUqC1*(g-%2TI#rf_Dnp@f}&} zgol7^lq}xl3}kxF5=60wpTAos=JeV#5YP=}Oed%WJD=A}HN9-6lU1<3uKgnhA1$j2 z!eH?DlQj>=gb|}EAIjk@=se7|pOCq%Tm7;;UuvY$^=O73XZA81{=BWV)7umES zq0p2;=9s+X9&YuA9%+3kLD8gdr`k+Ac*)L}a{npR;N(IDZ+wR6(__p-DkxTLS9u|Fc!EqMmJlfwX}wq{R|J8tc@d(;Y(lukccP^dbS` znVSv^H|cPyL)!Z-BR)+%T)Q?JIMGSBRupqg!^+vLt%j=}KyMo=+^WPE5^?S0o8mBF zn-{&o3qMGk6sVGy*E15Fav7qO$t^U5q>M2m&Yb6)gp>-0O*WE6VA|KP4L{T`B{){l zH?NPB#Ujs*Csh)_JgS-if6=x1;=@i=dYr<4q{n&oV-bxx1D~Y1Y-F-Tjj$N~%dESX zZmbUKxlEO`b0;%Po>ZDtE@E3oBdf>D2=FYCx>bdcqT@RleMe*+*JqH=7GjydQfo4X*_yCK7O%j|0=VqMwibtSQ|OBwTRyr% zIHaY)D{nQJTz4N4nWOG7S_g~Y&7FT!76b4wS9``Bv;3$FIjUedwWl^t=QF7SU8Er- zQcSfkR)bWvdvo1o&6T_<8~__mIt*#7OLAyeV~xEX?)yqeSFipz82I;=|1Sm@*x4EX z7Y69*|3d@x|HkwF$1onIWF%ATeNV5!ObABhlUcbwMw)3KD=8FvP!^&us3F*c_SdUo zae_p#jq@$6e!go5akA2F>J$X5Z_oFu9_)#c6^9f+DfI!!^%0k5Ca zQCZvA*w)-$kqb5=W@}r)ESPTv0D?jPK#jLr-W_O$E7|UK1eu$=(fb-mhy( zQiu7Rll}NTk}TMCNF;eiBzy?0gf513tZQ*K038BY9Am05p=b5@(AEab|5$^KO!qID=M zVzv>-7j57&D##)?h1XsJ(Wpi~OBIxJPQ6MR%(wADRO>e+F3dWa=8}_C_I5XAIqs?_+vd7owoV&ar#g|V+s(IUx*UQ z*&>Al)b)~G^UA=ubWXZ5S^~VCaf!(pid^yc2&CgK?*ydnESi5^(tzV}EJsP{7%7fY zzLWdT)C5qQyu0bzsEnqAQym?Pgeq5%%S8{BG5o@l0iC0|5v+|g*~&nkH0mx%X~Rb8 zu_EuKso@o=__MQ2qh7S3t>kK9_6!jQc$U{-*K#sM%x}{&3P2z9jZaD2SFiZ=t9oc>}PZGAwaZi>NEK1keOeEvMsT*#HSv}l|n<12_5z^et z&A1uP3u0JKqx>H7e*NO-f{X|`()W9Oom>MKJho{*i^m-b1>HjX!zA)z{3CYcLBK8Y zKT^rCyFO|j5{>qVPl>Esv~A;`!L`<$!ViSTq)q{kH!^JO(Dpi>#_Ro=OD+JnFRgj& zgVYtkqCr#yMz?MIM*-b~z`s-rpBA=t$9qtn0k`=ceY}T&IXnRUBX@vt?r*;#WWol^ zJVLfIwF6Bf`BXOo%}Hl2a@&j3cTH%iSHmO$kqOUy{u$sUxn^5JZ5ffn^si0iy&#VF z2)_G2EPIt9NC}gkvVa?gTckSOYsa5=B9B`0jPMggdxYDjUli!=Hh zXH3ZOvM@oc^AkJiQZWl|U&f3Y>;*;oWi2$JiO1Zj+;@g98cf{Fu2|sCA@nE}%gO0@ zO|*36lOG@V3EcZcEeRp^tm*G#PgD1`)q8G;p6UL-Z%P%2^QHeNH`Mvrim*;N-)jg! z%pZK9pbB=LNUJM9s*zv>x@ER$%yg_E^off@Byq@_B6LDwU5tKGkStI~4jhgu5rg`t z%|9W#G>0N!p(|MmgQ;^6CAAs_fP0$uaTqE&}_h|JGZBm`rwlu zuvD=`+0qxq*ZtY-yAwzc2fL^osmqQar)~%n3vF6`$788IMWeM+$3nFXSUF+gU7}7o z6bM~-52=K!%az40sgmSTA{p#?D&_>6sT*$pvJSbd%WF>~YgcpCHnxlc*~$o&LZF7m zAIoWvNBY^HT(C zjG)Rn#JqZwMWH4FFXRa1Y-=xH984*wV6-pZ44;(9DV(M%!BkNpUx^oC7MCC zpW-QgG#qNGFhtEsfM<1hVYAUoBh#$qQ)$XH^;o>uo7{V;AweFd;s8nR@YJY_KL6fE z(G<3w(4w-SwZ>w!S@hmS!Fjf3#&Z4KNHU=bMvX=7J6=tpFIZ2bYywV+jG~WgT5hd8 zPL}KiUR_hjXN_7#@T8IxRGs18?2|j*%~-pn=ynSacY?F9jy#VJYrY!M8zi8rXjQak z5to-mU8QkRmKyDImS2_M3M&`iRFm1MR%@ZG5V~6j%Ohu%UzegF8Gr%Qf#3&~V|pbL zkluPUeH@(%15*v2PO}hh0KL(Q#lGeV~w5P zjHF(yFa&=CIi##8N|q3VVzmjlz9qM79N1g;~(KRfJpVFqO^vD0rg6*@MqUPc74vh%aamU2k9kaG?PK}uTYPwQ)d4)W$Y{rf zNCMLU~7NDM7%zPoUkwHO8rCOaQ49pC>4HeWO zKD;PpK+O(m?n+K``c?rvzO!1g++AoPxGK#r=g$lmeNF1*&(XTw;Ux%C{?Yg`08Lwb z!6QGgYTxpJ{_ncmR;$y%~9bg>3oUnmvxe+gaHf;~`g@3)6t568B8ZLzI{( zFnVGP&Rs4HhPp92_n6$t4We)6@6oG0omREm332l9TmWc1Wei_)^XvuP@mf2lpYEPS z6?~9a3hs)kO*6>sYIb1ovj+>P_K7*XY7PV|YrW>;F4M_S@~-G~Xk3X#mWH{aA)2af zh`;C&q>$<`>^OHU1)Xo2fhg6j>wu7r|94cN>5M3S&j8a0$iKis^jIah0${wy-Gp(( z*`%E?qm-RgcnN#dl=1K!5ntObz@e0#m1gZtZkth&hb1dxlz6jJJ`YO%xI&k_{`mcs zr&`|Jq2gVkGkIZ7qGjGhDh1z70zwq2Fykh5{dS>(;=^|bTU#l&gQAVd{hCCnvv5%x z{WX|X4D)uiLCL zrtNsofNzHU=lbMr(_n8gs{UFG_KhdQmmEnJHc+5r-7>ZN_*C8Id3%<5Te(|&xsXu| zV!YtAiV6D$>i=L_##=j3GKKi^6yy29ZJ+lk^W z^){@+@y|825!j9)i?+7EJn4z-Se!XPeeRfhOj7r+tGPQrUxVkm_MqQi_pi41ldHNr zHM%=j=aZ@)i}RQ~S)+@3+vy`eJ|EkIIetCgU#W0TXm4~Wyneh#vQc=x-w&a!pQ){Q zx|+UcHL{akg6MY5xMK`<3b)_atE_@TKP9gop^P~`-0C^RyT9%qi;_=KZZF^>lka;*X1jxI@PeHoSUmdtgytT0A#h30xu{CbbNs zIy-}*+2(!jxOQrPW(ry-hkevU@ysS4^d54k2JZmV%%kuaz@WmLvP(~Y5KG`V?*J+n zb{?0;*lH2fnW0P&`Lyh)s0~_wn;B`Q4oe9((8$qQJRl{90 zzl)Jf5)`^f{mDMG570%JYz8VD*#-uwK=nc{W02u-#GOx$e#ItPW}L=x z$nDsO^Dw!N0K2CgRU|Xs51ONDhuf$77%RI>T1XtJHEHOZkQojo{~7V>RETO}9msIc zKhh8oGeV`+IOX_(m=^Yq&nh=Wv$I?o|L0KpMhX7*2d(Rc+)wm|5J zR?t<|QB{aUVDJb)BcsV=bVpf&8Frgn?w=aX=NT6${_bG%DvPgl(^`t;~PWQ zoP~%Pl`Sexk4&ZV_*mThd^1+N35#)$lM?e;GX=mz!zSwT9FO$%!c_DTWpE9dRX%as zX*Y#eEDlLG@ok~Pi;*e|2Hpq{k@yho9kzO?BtKZEQ}xgr#1_HTX}=*x8%1s^%1c{B z6$$+fm`h|B5$-bw!?9;Y0r>`Md8cYEVdqJ@snFP^yTfLxP_grb9Di4}@cK=_lb&6I zV`7{eD4)z$Aju=|4T=!3rZN}$lMHPmyw(A)s>f*Vhxm7z=>*=XN3_NgPZ-LF30)4( z1IC4-#vsY|-s$$#i)K@H#qO{VT_LUyN@G`|DRINhbxKzC?Agh5Ra*z)(eDCB|=4164s2% zXupOkD zKMn8fVnT~VIKb9KLqV}p^R5o4FS(wuoz_ikI)E8)3i-m(-jUm4mFeevf%I7GSFHDn zeGCPnd{VK*YeRJA#hQ$+zyXHIwRDqHbT0k8B>A1mqlays=^wgx$n7*Yn%_Y#U)4#8 zOy4ChynyPDtfeezqO3^1QcE1yA`Mw~C8V~D-%ypX;U3^Z5IyXYZ?p8F6&+IOX0>XN zQs#YC(IKpbGHx~S3d)MAk!X(RQpAFCx-pcbZ?5$OA;+LDvt+Wt%>(al=L037FlWs` z6F>B~2}n6bYFyym;v6;uDd_YhT_z zphIE}ZqhopVwZ0ff(BK?!T{m0gMN+kVBP?F5Hx9b?1LMfv5EK33b2QVf%M$r-u3o} zi`Anbt-9?yTD8<8S{tUN&C#y+9bWij8xKm|;7cg$+ti!s=~1qrLbf>sv);`Ly6A&D z(?Z6bMW6H?pVjeNzm%94o}NMMmL{KeW+nraU_$#$&J;^cZxR|pOB%u9W$&Cw z%r-G27YEf6V(vx#)ao{3pAOyuUUU2Urr^3TA2lu^12%KB?>;b&tkXl7M~(`U@;;I& z88sV5pU3iK$@Vw8Ov#Br3n(d&HapnXRRHLd4`r6zZ-F_@M#a@EQtWk#>rEic#jM(L zzNb{Bt6Gz2R0j~g=a1xX)i*&-AENKy#Y<)F3mg-@W}`4s?h*pQyPYM4%3P@~2G&Ox z5o&rf)ftA|Of~RYIIt}$DUyLLw$z$r977YJ+7BGwWpcAePMkd6&F5Wh$^$WS+4ZO5 zlFeDj@nv2eun4kN3gbk~(gh;0ZbxY&MUENiZ%L;Q(s+p63YDCaLnr5u0}~?e&)pjt z6BqTCVCtlyFTgaUZh2yJm0JK44rG!6MBp0mM=deM_`L6n zb|Hk|{f^l?9S3XOSn{yobkAYc+Ih_iaImd8rt{qfxpk~A}Xc|+O@Fa74fKmlvblPYSL^%TPi zen&$Oo80ECHpWQMjFk3@ZQ3s6dmQ>FBp8Y0p%oFITnp0BUbQ30;q9Zrpn{ZRxC@ra zHM+yTITtQm%)50+%xMgI&`0UvHwk2bj>GnqeM*?&Lp8R>&=?hnZ-;-2Oo z09$>P-^|!EOa<%jysfdSFEw8V2;zhzRmx;geY%6Fel@C2H6nOVwJ?UiP9NRm3NMg_ zxBX*CH~ky7eY_EYu~E@KrU7Rl7d+|vtX~})VeQ^FX6XBhvt5C-ygIP<&guyhpI>|t z_vHpX6X&6K!O1F)1f;&CYUKTDH&iI3LI1Wsj$qzLPf3i)%2BJxxb6F;`k@-M0&+~;nkTs zJVtuSl66At>dg+a((~v`3hQej-|R7(FM&_FMSJI9zi{24ydWeM0tC?*c}(!uF1#Y& zbeOodIdorKYFA@J-ZJaxT=s6vA=r`aBmvjJHcNl0$bb!B=KK+hfAdAdk8U!M@EaNg zXy2aQ&S3IZV~Jj?-M7PMOga>C)?vmP;yZTQE0kp1FmGaqc!p;fKE9&yiQ_po@?b4E87^}N5 zp!XqN^4}BxKa8CNlO|lYr7NvU+jgaG+s2!=ZKKk*ZQHhORob>Qr}{>Gwp)Gr#|4z=i^Jp$LsUl+Q)Zc z>s@XAZ;0!1#*od-vAAx#;~K9WonFVIk}fF8sV)XX%C! z?b)=_Gq>-(QYTC@WhJ~)_M$iEDa=n~9lZnhZ}rsp9MQKT(;iW|lCS(4X1!nV7}6IE z1#i5k5v&jVS)+mBrt{R+5Ru&D12uhvM7XBre`LElPW&O%?Yb(#OtFXp$gf|gdk&cS zz`Y8s8uQ7NWRGbIC@z^%BuTQq-@XPm?!KPVenI{5n?*%?znsX(Pq8gZlCvAWk}^%q z!~DLJdrly~nMBPj9_ng1*3kk|tPZwu*x?{i5ADhIs1Z1Ps8@lT|51^XTYRYjY@q>0#JQzI{z9#8`OLEh1$yqLIgXAJp8?y2di*vFOzFe!4`1^pkS6dW8)Qg|!Cj z@?uDAHT zkbh|>fajFT`)}$%&^cz+jZ$kmTIkjzgNQLkAx=x=$uN=LrshBL&lUa zVh5mDrv)kxBl?2lsK1@-&gbGvduxYqO56P!kF%C&X~Ws~VlMI0B0nXql6F#JU5!{Y z6Q3N^iCjn;zX~CWuY)wO7Ab7l=nKkMgdPj}iFthquIApO7Kqs*Uav|Sd(=p=UP~Eu z{OgpsU{?9oE{P!+e^DN?7dr*iF#ETKFDrJW|)*i}`F&oC7Yxwt5kn5pav+N<4 z$VMi6Tc^gyqIy?M8}WXo7@>tahOc87ur(X9(YXM|A>gpwZgcC_?~z1vPgIX}c%v8s z1lFyU$MX`caZUHp5kU2Sj7PFfBM>qzH{^C)nbu(iqY@$bYEgYjQ4O7$fgm)k2 zHHGcf9dO-iXTtb%C1;;Y#|m)Fu#JBMQuWTdoe$=C$Ys-sj-_@!s@27UOH1<^y!Is` z>jg2vk1v!Ot-^>`k(paoeVeY<#~>T1Ul^-)QN1pJ9lLx6u0jA?6s_az@D#qQ28e(F zJ1%Z&ReD8Fr7bxI=C0h(z%CtQao>Wq5JbkjK%PW+En1&xavElDiy*e{6Mc)07l*l^ zN8V>wuD+KlfMnnG_uj(tS%c;pyDR5;t}LA0u6&AziWp$aq)U^U-QicRQvfX@Xs`MUbl(EkiyiDYVMT?)66#j3 zs0_k+N97)ZX1pP8tJd7nrP2yrN`^@6Q zI+aD`<`;WupI{}g{_AO9g$j5IkPjd{yBcUME+w$EtwZjp~i(Rh9@8=U>Acp-}f<3d2~W=HeP=_@|G2UQ1?i1 zo5cDpchFGDK$U!lUQmP~_`u;))yvew{vV zMH@VAkpBy@Ua%hi)M7+Uu&B)j#KXk=&-XXd(K43@z!mpAodeh>A#4WFsqezXC;F`D z_f9It6|~tq?&-KS#60Y|(^uO&KJ??(+JBn*|HQNzIGF$a?aE01|4e)SW+u7+i9 z26t|=FjUZ{u)#;`>$V4Wa#ccCv;OO*JeICE<)(DuU&UHL^#ivf@z$BzV{@w7C_!+~&q6-fX4hZsj4s z>bu>Y-**b#ZYEpClax%(FXa$$823zFe7hBLi0x^@b9tdo6~Ys0_&LskL0Sd?;GpG* zqGuQTduk6Gz0%!f!Kh<|+25xiisM;&^o>Ach2Z6=PU-D(I3u_vpvwW;0dM4bBmK4B zn`>k3(LQH!#5+@0tiG}WOp2y#fcB?I%>zqK{oQdz-tqT#(_IkI9ZH~I$UK-!h!QL| z1c(tvwcb+9!3QcdJ~m-Fb^Ph}XAS#rXzH*yw*wPSuZYH+uF58JaeD7*O_ZFSbV<)V zW^@uT;;Bmy5}FZ!nqb&3a+Q0&1(`R@!jIX{>;ot-XlbG|hWKRuq3xnN{1fo3EVKJ@4>B$5#J5;Lij zG@w=)Mw8`>=EOQeazHpaWAIx8;Nn{s*Ms=d(?q=b9}&MMW01j)NGRy(o5W+?k`bZq zj;eOyT}0(Yn#@2Wr#zkzgq_DIvwJ{rG+Gf^%oYIs`rsMmpb+r#q=uc>aXhm?~zhvTX zf*akfIE1`GbclBJ71#EsANPgFloW4)tA)NAH*uC;Lk26!WON+Xqohalb^ND&U^=U7amM z#dUbkNY^{!YNd_{{yLfV%f69uKVghoCGHK)y`I=?!1bhrhGlRTNa`K279*dKrtJx#L00VC}n_Pln-t2g9?p zyU3qC-{pPxC^6Hkxck3-X69#a>E!1)g>&EwNHWBdEwbf$9k42K0%uZY6%lVfJK6I{ z3z+Te4#^{8Q-aXk@#Q14F`WOCaQKCCwD!*wJplr$-o%=bv)Zc*yKNU@BvJpgMX zdmP?8O``T_T~)gTZrRElQcMg{8Y|&6p^{h<#3SWT^d})OE%yVXLmf8VSvth@2V;cr z=YDlDHlC_07PbUP9Lto(33$a|<{})zGKlp|80PSElg3(FCpfsUHB+ulw9XL*&lg~^ zO(qKpG_}jDy<`O(30a>(h36a7{k(HqDasbSUd-#pV=te5pIgJ%+)}7c%ptTYSSF=H z#}`?Xqm&faUl$PxUe4Xhm1zdT?vRxzlII{IzsXp*G4nJqz{KsOD&8wY_5gLAtE*#R zXE<3rsb}(MoXc!3J(Nve1aeN3BYaA8iSeuBg+iq}AozNUsuuV~)80 zk-Yrk;yjr#sDHy?qK0v}x`0Wa=PrFuNGw8e|k-$@@JI=IBtd+jwc6d?R?kDhV`X-^+kC0VOcGX?scv`%kXI=DLOBqVx)>?VvO!TnS~I;iN$d675$L@nqAkc|GLl3HQk9{>SSR~r1NOgG$fw7IHK(&g&Xbp+0HYDy zOb8hAoT5+32tCdQ)dC9+a2X8CoWdi2Kx%DAQ!IzhjcIV=s1Et>;GxWpn z298#YLkf`W<<3Y+_TbIEC{nr{^khWVr&V$o2wYU%(3vKeuDLR7Q zhVc-xM;H0sTiZF!^ZeOi{SqRd|4P+{`a4V@gFwJzhRq<|MKqt+r~HrkgA|=L;RDY zyZh+JMa9#xJFAEP4qBgaAc!WUnwG{t3hKai|6DL%pzP6fN$3a#&ey)ASeC7uG;ZL( zP-FYe5tg9-TT2d2Zw)7N6OFIu>)~nTTJ}4d_~U%W*DFG|`)mL5?NBDW+v`!zf-j_Q z!oxw4?rS}!gwJan`Nj6HQ(gT4cP+Swy#shDyURfOg1zv0>S60V=_z-;tvh$M9{{vC zd=qc>m+W+x+@7kYo;Bwja->E;((6`IW_Fm=M9aHudtH z<}hg6PWF=|PU)Jo{#=rzochZI8c9^=S<+HRUojbm5n!Y+%0JD*)ZY+y`=ft(ckt=$ zS@+NHmT+AT-{~FO4+mg~FWHydngw0Xu0&P%R~7XID<+$POVflaP$mT7@;uxjwv1Qw z*MT-gvQv$+Q}A)h$;#WR%4zkq3%UlrX%n3kAYu^wNySkVX2ZROa*Fw5+Jx@b1Axgi zfBR6@1vKnJo9Fsoq-n)IR`IQf3+zhP-X^SU>6Q`Exz?bQO8}X7l#IaopU4}9OrXY5 zqtXeRfC7mYEi@NmFWaTdSc+c2rc5FAx(^SaB=Bn;!q8mS_OM*3_e>o|TU|*%WrDOe928Tz}6j{7b_KGVS zQUZ9a&4QEtRxY^07(7!`+bzJ-bLyoQ4E+kv&m7CCs=N-4H~>ixx1ZR`@Ak z-ss9UR7Ro72r*8b)lltxAY|dkw6A0pf8MCP&XZA+j;iB2nz8JTVdbs-;lsVF++aS5 zZ4+%%RuA>FpxcacV*@CJl@B5sPV{P?mPv49gj*W+xVxn2d+fSp z2)yr~uF|Fm7r9BULpb#^lZ(6&xYYe;sQXzcRrgVrq)9Z~#&5`-{)|z~-$j;e^+i;_ z{pFbtm@uwHdA&APTqy&@ZldiYz95e$zp!1gf0epP)SreaDb^B(pCqApkjlu3H(3>s zbF(y%H-|x+o@XMK=xB+b=M8=KYGeDuFA1|zZX)!~ILlQ{TTa_`y=U(fySxHg$y#bX z&fN!8_;!MZn(*$G&vSVs!X&SV{HnEG%@73iCWN6q93wCzW;)bEExY(z5u3B&&3H*z z15DFCI3bapur7B4h@_4X7QuOfu{GFq_jh~0XD{z~35DB9h zsk|9Rk1|7AQfIdh+A@k7f@NZSETED%{Hh{3W|m683)t7Sga1*w+G))kyg8tqwu<1O zB=JHS)fahM&y{vYL&@OL2PJNsm%gC*)4bqv;|CtpA_ND_1X6|-)?B#(QAjr-91$24 zUqMh1KUG6joqy7X!kopz<;}b31ZWTPbuL&i1TszRLQVJ&EM5n_UDp>7&}$I*-Zd{!r{*y7gK$ID7&yQ=%cvZK@b@vA=h6<;8KonS^!9`Go?tH_ z9(Md(F%uXwCegWJ@^hhw;JEoXtvn~`HQf?MToy`;dAADW$FndsQ1<6A$0Q#2*JG{* zO)=OMROd^b$!MH4xa%M%vJ_>rO49^T5MIWZDP>|PDg=rLO{#pURTnuNZap&*g2ZMH zp}@YyoZNT`(`>nbochvog8}%M8P!WAXb5w+(fDt&0-eQKfD+ByECaS>2hvsG_>T$m zgq&%@%RG*FaPeN?ygG+E9c7|}HYL>FKJ1djgIxXy)SqUyYfO~l5u_7yyu|0YORArE zIE#Ix$>JTF)X3rbkVJe2Qf0Zyu1bv)Pclg)6X&qXqGz-=Aoz0`>IHtP(W@>ymyJRz zJjTl)wrXxd?cSAM;9k+om5vo0CiUQC_pOPFZd4V@^KZF~zJoB;)n~QkG1S3=>aBYY zh)lA-MQTG|(>>G%`N$l}H^^Ua0Y5=VOaYZ|+0;q;64vMQPMa_szEH~k6Dq$PAViqJ z(1bCy`88Q8ft zwu!+fRPucTt>@s0aiX{0WX8X^X`{A5gNw${q>|&b9|*n#dzs_f#r~i}z#H8pUaS0x zn=G2cLGqC9P&t}Q45XIJtmv%4g`I})I%y?+P3SCrTV)f&TtU8F94K&Uk;z9sZez{P z?&pPP+9kprx1+hZ7aaKPi>bmIE@Ksz62F@$Trd!kVVU%7juxc)g)>g>(?c_}+4MLYay zo|F_#^e17Y;bl@&j+v+TN}L)r3V>hlskl;X7%XmU;p&wIn! za+oPs8-hWgS9VyzPcFG}3J3q4oD8h-mnGb-WNeEf+MmZ6lIcdZ44H(xh3C&9tdxFq zD1(L48cW5)?&?0PQQ$OzysU<-xYS&8lrX=Dq?)igDrnj`)i@0+>W#ZR`IK3!sNC!`p5@3h`Q)#@dH13vT=>O z=?<#)O3dSA^A^|yNXHX&v*PB1Ss`S&J=@XxUT!KG`sNl%zD`Jp1OJf==bZ=)(;F6A zh(`58mrXY@by(}7kcL=oy1n`5pI#NV8j2%kG5to##sZ&el^^1_bg3N>MQtmjE4OBg zOcISqPW&v)Rls>o4}oC$M-ZB4V)@BW$a0U&@d0JV0K*2nBfnZfYWOUklQvJc2>RzM z`)bh>Vt$=N*lNg7uzqdKY`gVxmgt3wR`cJAl2tpMqB!$oFqcqT@>0Fv|_WCiw zsIQ_*A`wH?hy&`BCv&1Qry|5=0?YuFsfZ(ei{aW#M!;2`#?IPhDYJN&io|L*V-_d; z-qUAIyIBXWDv=r>IlmzYo`FXZ4N?Yt@OC-m>7;44Q}G>ZuSuBQXVW6(U~Dr z1)ij(N`yqY$e1O`v2Ol>`{YrU*|wEL8ZdJjEB-3Y^|dUP;RwyS^HVrt0y8d6^+j}j z;p5(uiVg1Uc$?L&A;-{8u(q)JF-hhnvI?f?a3&3vdS2V2kY~){yJh{Uk%(bxM~7_N zprl#Wz{xyiNp!0F%Z4gesSkod1=JU)K5j%(H%ZazNC}rz#h7}gWS-=WU2s5gGCH4{ zo1d267H1?zfdVC`Dr4YVXJmM#$+p`D1H==Ue-R})ibPOU9C0{Vh;xH`CB}6B*V;nq z(=Mh`Fb({8>1x_69^*G$Zv?JN%BI*ZCQRyM*nk^Oh3H`UBf^3^vbOU3pchDg0v;Pp z9FVF3qMF)8YS3|G_I!jV5x{%V5u)G8``&?O32a$<4G)%z@kg}gbn;f(%5ks?u|?6-u^ z;?=7zRb{jbHG904A+&X8Jctt`yo#Hi#2$M_r6jU*v)c)LGw&;0B=$jaTAfUz8EWIi zmf=f@K?Ln#gIH_yiswxESuVx11gHDc#pGlAhNhsC>4a;*ssR^MA_W4;D%vWz118wK z>6d3-5^oiC@k)i(=1ULw8oWi0F8p7zsI`f4P!5g~>N0a2gL^QtciiDCUo?9Vxg{_6 z!BGT-aTtPFelDdcz;dvBzxN5#JqN=G}Hr zvh(rEr_-BS@7^-JJe4dS>mY72g-}CDUCV3Xx1Nwb|BBhX1}lDm&R%VK1sj)7`lo-5 z`4M#p_v6}!{dvvBdQBR8wi(jc2sCK!wGqpOu1Uc_ux#^o&KJxrtdRbHl4Sp+q?wr5 z>HjUs{=u^RUy|%!ZvKChWL;P?5!7wBygmKLU|dw*E(3ZPF_-){8Qi1#W0Ygyf~>Kw zYdtwsNy=2t6^|dl8j}yJ7S3hed>dLjfA1go{?Gjb+7d`R4dl%E@$a6m&&wIU%&#e~ zoBNUNp4*g~Z?_I__l6QW-CKzmdcn?LB}SiMD_<^eTMOAgdOklEI_}ln*pg}aQ$7}! zBADF#-FWt|lhAG}JlS&8zHP3Y&i`Eb9swRuxT}qQ+mZyfYE0kZPS5`6=e@t)5r|*C zrO^4hd3w3O-?B)~$0C6`f+M4?{`mb9LiVh$=j+ZS7Qg3gVA{^UL|1lalk_geH|wjA z-auH7^w;8Tc8pkh=50lX`#G9hdI!*p-^SwvpKehEL5EO({_O;i_FEs6zWLBQNP9Fx zy}gJkj^6KjmS2aCR6W{D(A|km> z^Q6s3YdrZhO<8#FwvT1-t`Sf_+h}ywpCDl}e1DDVev{9^wicSDF;Et!IcxS1!HeN2 zr1z6luBar)ce9=aVHKz)l~|s^;jjE&k-N>rOwRu%JBsbnCCI+pAJ1~R;j!ikxnrqW zk2<%un8`(B<*pkB50~53#!Sk9G#-1$fAo4<8!EYu40N9i(A1mQ>9C`rM$+(UyyyU) z)5?puo_QDCQg{@ip*-@w@}qqFmF8V{FZ$z-uKf$qMKo=F61|5jYBQ~$68br5(%mpd z!Ib(8T&gHt3N%P=$zM$xT&67_EcvgB*rF9N70_tl?L2GL@eGYnrq3b>{#vskS%?6- zV1+Y3gv6saM!YQTo7?{MMu%?V9BOS)r#XzgPN0YB&zm_~K$1!XeIP7ebod!WW8@o1 z4q_t5ur38neuEyO<_ZObT)r^FXC>q_&dh>Btzsge%UBGZ?8oaXyi6uw0Y1i;giR$H zt*kkrGaO@H=dYM7C`0dPVdjXX5Gc7b1q{S3%$^V9n3;_pMO%R+Hn`@kvr>4W@XD8$ zY`e)C9r2WCRL?QoslJ#STvnWFXzF6Q%cqiY9XO+dxD^ohsP3Bal`78d`c>bVD-f(W z19TAv&cK<<{OgnW3VaxAzb{p<%RSwwmv@rp`;9r3JRN*qYZ)OW^i=Tf2h=y;RE$$`L}(mSXqp7xIf~nx5Lkc}21t9av<4!5X$=6qE|kVN z%Mf|3bdx(a2BZq#GBJfD|My}HmSR#%o7Au}x2Nh>l(U~os%!Swa4~I>a!Bb0IjA-b zY1`9&IdXh7T~-$EYJM)IShoRpsRf{fktrMDQ|gNCZ_W9sC6XNU_xCq*HUd3;rv*2N z)zh#cI`=7Hm?@D(@J^!F~$mjP-^ZHI| zrE-M&ir>*VEds?bT|KJZ^MjHp+@l<((H&QR*i?F~kJ*UWODm`&46g^` z*dD_BW&=?o+d?IVEadDGSDTz<_lVGi7ExjmmV;!H1`5^V=7Jl|&DIr~#u&E|)cX*} zg{AQ7f$m#Va(buLN$-%CuI!JoFF9(sOB)NrLapR&QqI8u)(_fnO^5(3Cm{IDRvlZFEV;@>r9Yyj1Hm1z}_ zKe61aK8MVbT=Jf|uj#@o8w(_%LR|<<cXg-dE1=cnC4<5cy{+f)d6tbk7Dz2LDPo_=eA)>| zY&mI%WjJYh7KLh2lB2RNR#{Cotx`i)$cHb|zQL||8; zK6j9gfT6pMlnGPyYLPfkW`)NELfnkGXk|75$7k!Y=RdG51>u_vgj#X*464$02gyjOV5Ewv)(vCg13PfUMWKX z5QdGsTO*jv8~m0%2tzhYk)q3r#N^EQ-2Tvakd>Rt#$lrz_HML0tDvwjThUVrc10+K zcjT?DrNb$u`D{>_qI3~9btv;sR`|Z`mVA+>B#?jXHQdHZi z)kKTLZ?G>lchemX&$xySbKsFpz)EyrjxX&#aA0C~J~;BEz2^c|X>%KZEZC}|fHJU0 zi-FtJp}bFd+-~Dx&YF;hUt?jonbtLLM=-?Lu7{36dw+V>WT2J50j%+&|D;O2N4^u( zPb$w=&o|qyPV{ytD{He?hk3x1ZP8m`_m=Z1(Em*p!)h7&(Q+I-nc#U8!int{fTm4y zkBi@%z+XP5ld51|e5s_o4F+^u4GJ%1tI>>jyMSDO?PHzx%O3KpPb)-&OXW zldHe&v_O^`mtw}Wv+}HpE{Rvy`+k8#2w_lcyiGr#fRjm-o+5nz6#U*b zA%usqd4gkOUPwT)+cFG)-uZ!(o%EOuCpFCZP``Os)BqpB>wJ4w^L|F)TXL`kk zast!2St6zILyDR>l=YxiTA!0`(bCr&&7Lq7HgGAk0Il98ZrrAJu_UJmj&#eqD6MDw z+}yp+$=t$OZf{Y9njBf@OyZGK-y0y#qq*&ufD_mq?4dSH4_((mR9!eGx-@~$2-yyU zcDL#cVY9J$WAcnu9Vw`c4(Lg?q*B|^S7|3kv!4ErX4Yj;(NWwi{ZIyImEzT|eKwyg zp>nt$7i|o$8P7W{K4pC-{`t`nK5rsVn*W2IgU7m<0;DXS<`}xIE96r#PkkGk(8NS* zoDwrpjU?0zz$UD?z09)I4&4OBen+s7Y{C^my3sXv*5Q~Y(Wb;8P;KeU`nlZ|#iara z^A1c5kc|*c`l2aM=>$3#&^YJbaGTOz#fEi}ukoE@GQ< zp~b09AVim%qOr+^l&DD~$H2qJgfAIWT0Jb^Ezf*ion1X2FB}qk z#U#IvK!?fQ1R(<;$iV&r6?K1}?z72UfSPiBa{4zN%jlBZSL zul>PU2ZeWJ`=Qo4b=~8oN;_=j3I;P=gxkiv*k~+FY#uigMmz zt)qbFT*(pC)KKEi7vj}73UXob!rG3tPa#WuGNhEOI|O0;Q=EKV!TVOWWJQ@>CpEo+ zwp*(D3#`S^_{F>Dek=s{-E5S2WMVh7$Aq9)oEEp99Ag(MxOBKTW>xw3N`C&+4~D5g zRN6DQ8?IVt0YUVN&pj}l^GJUq(O)Xb=+f+l@W)ENyy28!xETb@GXxuL?cxe&J>gZq z?fl!Oe%uD^N#>gMR9~tEHlC2$^~N+4;WES5p(?cYHj(5dCkzTzXI6#7d(QQl@-+00 zT4l=VbXA!9cT5>BUjX^351Ld#F|m^!QglLz44LSXgu)OdRab>taMrj$29wFclm`uv zgm!BR*y6he0#=kA=I$r$1% znxn0dc(@@Fc7a5Y;Fc0bFc^1Eyroz{MHJcS9?}6aCOK?+&xTGST-1Ca-PII_v8CX5x8S#U7G8CpMMJ!@CBQ3jK zfBQrvtBMgB`VAHap=Z*hCW7RmboQ7R{KgrYh0-1D$$r1ZFs~Mnre{c&s{?mJVzGys zQIu*an@ct43Ov>+QxL>}PZl1oxDFF&l9hHMY00N}jt{mh^z6}o0z{&Z-b+XOq?tOF znjCSa0P_=l1!mQu_DaJ9S$qDn+Kiba=#|}uT|fa#WD(p)y+W~RLdOqlRgQAoQ0OIU z<}Ik~MY-&UNE~Zc9Fk3NHF1mTn@u85!0Yqll&FM|HbcG3CbO=QK?og^0|r!8MeGwi zWo8!E+J=B2&t~la)ddGOb3rS7rH+y(u^=f3nF^`LCo^OZciEc|sW%s+uax`JF zm%7ujB31V?z%_D{HO1td+FGM)35 ztyN89UZ3c&~l{vQKTB~Y3KB}0pr4mACHHl*7VO?@E z*txUNhUUV!8yT#8Q=yqZKYI^>oikmzwVgJJKj(@B1EpBI!(@lgPHl2UONroG!=p5{ z++U336(@vGriaE=nd$-?@1dwE$JvPomXR+3FNMIu(@qr^HYGL<4-I;};jQ|TK!k$h z=C!(+m2-ijKK<;O3}s3O)NPDsSM91^Jk{rH>cbHTnYsO@QGBytf*FK;W5`9FWfZEn zRV`QcBLQ6rhc`C>&eMU>bLp77)HIs=`8{oP=kcd&d50-fih8)!?Uf-su-P#I(o${d z)zy`DZ?$Nxm-T@RCzm1tZr(u~Cx!B6qZ{(Ge-$;~a3lg5=K8)2XrS%MsjE|;n-f_& z8?u%IB0gEXdsPdw3zIPF&(CuN{$?h78btqCVOlZ!NUGQ^w9pkB`s0f{dfFlvwYj0N zn;!q5M=G~cZ+5CLO}hJRzhP|}mZP7a z{Gm|TTFsv8l8YnP)Z#;K{n%0Jhp}7s0>S|f+-5H^ZI4%-eRP&XSgqm1s_Um1@Y6S; zIO)>^950mpb>#PZGCHGlw-QWyY8`EGPexSurl1f6uY>vDGiyotmuv9f+vdGVS-XLQ zs&~EMz9>m{zY-2DOXSEkL&7*-322hIJN&U$c*6ZLnW-B{2gV~Q@NY!SM+p-qP7ui0 z6e}1Ky|ZDZ&T(BJiuv1;`RC8yDduyBI4#!9T+3VFIM_5E&B_PLK#Oo%z_>de_u>-? z{JuAcAjm-_`9EZDf6hRyC<^Av8MP)8uC|8jYrw;0qbiM=4hYAygg;KBPPhg5;f_O zk7!_?Jq3>6`U#-R^zA|nIMs=y$}Ol#hgz16#X>1ncX}_~Ig{XhDmbRLlF(*rPy>Qt(S!pGZZm z`j_!h$sSjKK4-{QaC@AEKH~d7R_uUS9fh=yGo} z)Vs_0P|RB>F8;!7t2s?_Iu=)~%?i@B0bPt6`r;iz=pJolAS)R=8QKkut=)5FOdYO_ zs<_3znO`tqEgApu;?O@qXhueMj{n`KnEu0M+5fN8vg#5Q`=SWl?`kL9dPNl;3B8cN z*5D3U#{zMJGvlQRjDXW7K0cM5%h<{epLGHRl0C|*|2j%4@LMeld|7A8HFhUB{CplK z9~9rZzI>k_dG7$#+3S&Oxx2f^n1v6A{;NakOJ?DLcApdO^z31u^KMT)h=-@w1(6IW zTIg4x56B!&-o|{0)>G+iV)*%r?owk$bm#ptK(=l_%5}hdW3_GxaM^~_FwBdDuHMe; zO)C>A&*$CU!0DI6TPg`6ke<;MOmkGN3`!$oK{o6e5Z+nwk7{~3I^SjG=tqB>3vDGr zB7Y>PX`jz!1q1g=Lj}Dma;bY4hkY;}_*$%6or*Z~P(k3=+@KG#H&{dZENyd8>U6fl zbZ2}zoP5H1?a@fCBs^-vK^<3{#s{mweecFvi3nki{l9u%C>L0}?sA2WTtx3v70($w z{bj!I?Mdxn43fL&vV%z0k)xs!XBBKiDiC$g#Hxf8q zCJ0y98C+OY!mXq&dxLKnvs*^(fv^|qA44(KtvW(|3^8ZDaff4MKt5}ib()eoqBQ5q zd)1+rvR~=4oM{K=1pN>_Xt1%`n2OM%f<%Mf!esEUPFLs1y`>8iRDeExl`tbBMV)?g zTjmj2&03U2%~OK*uAMebicZ5L>2NDW)F1#e6O87;d#W|lFt?9LvBgf9d@Xb#e#;b+ z9QEeuCd(ae+>7|a5(R>nAzZ)-e%?>7j|iw?SP+HE!#?3OH?)dLe0XA5oh$~COCXz+ zkYsLC-#B!ZbJ`=GeX!)1XH0PSOyS+C2*ZRLN4b6q*pRao3O}O_O8ln}0xA1!^HVm8 zb}1K`_PGm`%N7HMWHAj06gs9c;dTV0ic3gjEOiFqd3SQi3WVJ3UNoZgo}+&4jdWI} z{RR#j8mDJC`=#rg*g1+t;FZt`OLC740bE8p;i$`mO^R{Vr*jihVDIEu_r~F~WNBon zJW(iK^ZXU@I94;L{07!Ykst90xbixRh2Rh&y<~_f8C!S#I>n-!C8cU_He)j3MO~RReDnRsk1c>yk^S@Qz;Joza-vDp=rFMnHdUiGG9-}*e|qb2Q}mk1 z-J0jS(qdk5d5^)&=H#WHfP5xl1P}HKwH7IAH9)-5c`80$xDkB!55s+wdPX=YO z0>&E~JAb~SowBTY+y!mJFID6lF_8J@EW0H%{&5gg#=B&2nn>*w-t(MTM z&L;JaqSFMsOR&59)M(b*r&O~bKS*s;;lFRRpclf>S$g3Rm=1_0jwuVDvYt)~yfWUl zBPe44DX1qjC!WV4#8#0hpmA2<;gOOYj(Qhmfk6IUKOd^ePK)#H2^ZqOu^y1cHYkS? z$O#~_s(5K9Lk2%rC3_kvQ(92Ea8G`_t6uvtA>CcHvm{#NV`9xUJO(Gxa3MsCDp+?~ zPSnb-VACt*MK-d;>1y#y-8oE@YuhyfZHWl+yH^v9gS3Tt+iWIhZzer;1MsrZG($s9 zbM^r!pGg^z5^WmCp!J-c6;k5Hjv#0qij0jTi4EL5Im7lKevJRm)jh*HF8**uOR*3KeTh* zfhhWp8B=27swvQ4{~j>!8Kj^hEcNjsZ}ao&e7*mrAlHlh^BT^O7rC4k@}!~N*-0VG zIXGs-B|uFvjLnx|>SrA4suC#JuAqFv@#wzTue#h2Kkd3BzArcA-7k$jFR|`hv6W|Z zw9(ZHujb1y2qS+00fXXFM^&Mox0P$atfxf+tW^ zc~m;?KAo+0qcf$28HDs>0T1o|2Mt3BsfO9QOpKKz)nSgZn4#f{P=szosEDf~rr-ugLt4*dT70h6Ac;BXShqDGST>WB_udC(?#x~Q0ZNhEoTIvNf}L*qb? zkKaEgMtlN6hZ)+)s7!RH`B~PCcKx0$#cF-~>Bt1DJC)~qzoFr*u^?Q~uZ=N}#JWqxUX(9u)h-^TyNu1K{T)hZhX+Lt33!@5DNoiuZIy52h z;;kzb>2L?tFSCIYO)t=5c<3BOn_-EoXz4(D*p>kE2QcU!|8aXNMp$wsSJGH;?JGlB?PlxCJZ#oN7N!Eq1Nc$`BGCEga9)I?HTw6Ryr`?zl` zRF4*dKR{gRAscU8|009OZogqYtfBhuaA$dVUTD7+X6z&Bl;l8oUpfpeplJ|jjdq8> zySnRWasDi3(d?iU2vl#gV)&2JqfNEq)zb4016iHLs-pZd3PW_{upQtq^Kk%@S|`@l zlTYxP*QVZ;;+c+{l?V09?SYCryKxF;ZS*Lt8$BU7tdW0z> zi(7q|6=&GYx6Bm3nlro9Ac&(bAnDY5zV+%TYR#{@%*s8mDtzu;Odi@xLEOD}3cZrw zg@^lot8J95qjnPRYK8QkkT|R+u*_zcAV)yp>WlfS?A`UmTyi z6qh)aSwlb{W|Wm!7!iW&Hm6>w51v9_r>$zifo;j!r zBbK4OmUC9kgkV3$F{gg^utcS{I)2rWmxlQ!4|b^NGQ%GDSsd#x5bbp{xB_+VL9_V? zyVbe3U~oO9KpC>6NibvA6*W6d!xrSNPw}BxldXCN9kR9Kw ze#>pyU=WUSX!IswWoepuv3+B30n)WpA_?o=L`;x3BbG9}+Ow!kICUv3iqm@`#+c!x zA)M&4e4h0iWY(8Bk-}kQQjTV<+3{62&iLDtxoV>jElJoDiMI{;_)blbz3*tRCNZJQI@ zwr$(CZQHgc$;7tpbv);I(54H?A_g`s(06Uy4GHcUmSyKBaOCAyj^MQ z0r^9cVi4^F?j@2_^s>L{-mtDvS%Ic(5oj99&>sg?o1X)r0xXYA0j&6Glx#@`^Bt3< z5;g(v;EbCsCXRems6XX(Nnr;zvGpuu4Eok3T%x#AFls^;>polr!pO=jFRj&TcFN2u zw|IkQ(f&YqD42f-SlE99@>IHKa!XZFLf$Y7{Uiw&at2@tbL#bML)^yos13Bpo>&phe zHSpEL@T|D7s|__U?fvp^!}h_G z$o|pR6`Jwx(L5p*d6J__cHhK10o4xpSk!2r;u5Ws-T6%@m&vty%*5i$s z%HnjPMJzU6C!ZgNh&M9-+ZWWoflUkytpCYCVfy!9_5XZ9G5udT%d}EP)+Uao^mz2_ zYz$01Jdpnq8g|WG^mI$bHgPlYa@rDAQBv7Da(r4};AZ5ej){)rnjaNtA(m{Wnn<>S zSgSK!0UrS+{oz1Gg%y2141b%dg`2F4o4*Ylc>$khgcMEsqdw!DCxaBKvf&H>&H`}{ zr4LJz`^|exMM;aBk?qArvgoqC&;^;Jp!)l0lI+kN|(*}P3uTTXZtHTT;5kg5lK?YseP)ARB}^UX!?14XrGXX=U9{jvG$jckJMoFrJy?IoMB zG>%$|apF=aoO51gt8qFlF$Is$oE96PX^>{Mq zsWSga_rqItlBT(Cr)`9nxmpIt%G3N8yftF5|F(E0fWMz20 z$8*~F(mlOO$2EOJ$t~TcxAW+JL)M1Z@oqu0pgXl@Q{D@6v8HAn+tTl#WUd~EMut0z zl~a;ufu92>G#|Ku)R}88BuKddW9C7>1R9Mb3& z&3(I$OFMJPY42nh_C#H%=nDDr1b93RczWQq;SOB#0giNq`$-rcS?on8k;z7fy^}a9 z0=M2BP+qyXdPv=LS1n|C5hVMSPz8vnge6_w zepxbEzgs=kOS|c4ea*sz1J#5?XYRGRMDjNdj~TZX@ROL(2GftjD7tWg5d)S5;`|t9 z(HtbFK)k-7*FQbpH7vx#_ak#M#D$$hT4XC{+C55_K#$>J8-3 zkw`1{OcT?XfIPLxol1%-Nu5kq?w*?=!tuS1XHu?@2m~t(EobYjd!fVbZC=y{QSpcI z;&Ny5nQ|og3K?e^g6wZ#8AEozvrSIcmbD>+9gC##IQDmNK$X_&U+2d4{v@W|<=^yv zC0Yzq{%uEnb@ZfB(UqNDYZvkOiNJmGPit;U%&wh0931Z6tV;k48~4qxVp)rd%r-U$ z!l)wYXk)Qqbhisx(;m_Fe+J$iADEN%c)#gFAiZjRp^^|OOBIpMu5GJ)?mdb zz|}2Y956)gIOIZhPToM0VS@*vDBdje1oyw?BF*4Cx5P2tN786>B3=ODaCQvpMfEd6 zv4SBA?{}+j6WW;Y4r!_q)~)<9-6@5N3Iy;sr)Ak-O+6Asl1McWh?cLoTd*X}I7w2? z-_un}s=lIZKTbO|Ec@baOac#|tQf%Z?^9%0Co4N;tR)o3JIQ5MqL70OO% z9beM7>z}s|-lb5T<0}J>Mrjimd0HqhHip*Tb&W$ZMo(^oGwe+HaDhkrV%pgdup&|R z#mOY{za;fk!&;Z?0LuxhD~SGe%azKRzbx)8LK8hXhA#HMevbHXFE=i(I zu}pd9T*!jNk`&BPFdmwo@xTrDtnJd(eH+>>TIJ={$&43fWIW%r;!*&{qc;G0V53jl z*gHz^aNTi#>bO@hG9d179wKa33sec#IUFiz@ zok5h#=bkV3xBoZ}-H7B+)o(tEHHjkfJAgVYDn;0t>sWu1c#z8pU39Kz%-D9K&~{gO z2{ZF0Dyl_Y;d$X#vm~kt(`;lVzmz^9-HJ)=VnATMhn|_c{cpM`nJGU2RYxn8PJ4o6 z7PVtu6l#ADeP=%{93fua;VxQ;x2e|3Izum092ZIpHEE^o`^gR+DbN4zZMsI_YfvVt;;0+4IuAhVHe#ij*I zDztEeRlbbw4p-5F6*0llNp|?{hVb3;@`_|MhZU;Qt)1`Ger~Oq^s;oL6-$~N&fi%p zI{m5*ofTm|K?UYB`m&(vk36&W5yx+nU!c?$uptqy#pQ{LWUkILcU@$tq&Q9<_$S`r z(BU$EzpmVVWVRkwI)N!9T?U!N?L@^c^Ldq}m`^8QWy9HcXoYS)uTL`yMd@?<`T4>3 zMGUHkETUmEpQEwKASBiwNrT=K0f5j2j0?Q$3gddvW2|$@CMGBd;oHhfqwT{o`ciXN z@k#j#3Ly3O{@CrmudACIpa$@*1<8TV0fb9N9MYwtq_)sk+%;#b?)3))Oj*v^jePax zWztE&!7zp{J(Y3VjA9BAB%*=X3(+V5)6j3wR5R0^@aI&N56_g}?!RVZ60skpQbz=) zQ>eZwS4L});7(an?0=eSSaBvXRmV>?oIBLn>^z98nwtqNrdnY*CfVj`jhZaHTBa_z zlq|MPwhCI$&~iGjr>~V9Tp#y@*$8n2wWoEFDSzTPs%clzD!kf^dh&*ldaC(jlB)0r zsk(0dnej)r9h?7g6Wvx+orr0Ysu_3Au8%cPlj}=-dYz$0u-c%mW-K)Xv@o+UOYqEn z-Pm2oTI;HO9h=c74KO$x+sVP7r}_au|6qI}Uq(>_NO3@TSCwQ^+jK$={`^{?LP`qk z5iJj@lOdVPPi!kepT0;24?@~t9JLPa5Cp!|w@RS4OIn_Cnt4HMBy8zHb^ivajiev= z;p8xHde62-;@j3CgpEwjV(FA)xvtT$Hw$yYZ?6BrZIqko2K;~zBQ~j4%+L(L*#6h&sdr0I)jd{D9eel15AMD_)P-}kKA@1-gLr-KBc}eSbS^c`0^sg^r!%K zPCA(83nq?3CNJy?;fx7QGJG|NLeyeFis&HBVg2;y5^DVu&dES0;m5WRio*s6VD1q) zIg~~@s+gby6eR2Pa)p(8sky}ete2aCKyEYS4|?=HT?_H+q2$2GoDKCousP0S)olX^ zi;$|tLC5N05@V4nAo5gw4X75W9m4P5I)w_b(wQs|8^shJ&#mJjumN+{j?{!@v4FR2 zh?|Qilsg0*1KWX28Rn9pov!a%V&t&VGj!(cB zSr6PDPH4b!kgM^-$%TxJ&#Q8??!BR8nezIsURm>Ml_`47tNEF3$cpb*u+6mPcjTgQX$nvc3<_Im^ziVh^hk%7>NSb9 zO_?yK6pkLtOeBUlP1NTd5uqTGN$U(~?f?`cjuKazmg<`t=Myz63!cDXr@Zt5Iqc3h z)W?z3l5uk1D(i(a^+sCrFgmc{@b(h)@*j8I-T2`SLPW82WSVrk65M{BPq)WNwn?*yeBKD2w1wIG^46|9%GsQASw zH)){b9ws7$yW2v7skTtX-b|aT$Oe-^NXoj&N@i`$K9i!~ z`5J|Q%#({$KPPEX5rhwQQnNkD{!H0yzMcqTQKY(qT&Gkr@7z&oYPG&7G#HpdFu%^8 zhx?SxjW`5ZT&9f3X?MHiJYFw-a9Zkr_PKHW+RU2f0PdmhEH%VaMTJyE@rKr z6DvX(QW`OPI3}PBJ15vr(o8%wQJnY0T(NX`cphN}iE7R;#<$(bgx$&yd?^AyAv^?+ zZ)l&$R0$mBByd`JGgyZd;FvBjeE`_bsi+-;TVfDpMSi+GGKi7?c5m_LSEy2x_F1t! zdE(>x_i@V==${CU54SH!59rE|v&o85Ob5mWyJ8&r89KU6OD2}Mr$qGuXoo~s(mm(? zGm^u;AidnRY&eIhv&Imv$5_m{H*=C?Fb#q3Vo5!FkG!=5eV?99R_IaITPU2ATRw5u zcp~qmeeEu|)V;QMf$ZD${REitdi`A~@IXrU;&XHLO=a3sSk-*y^eN|hJe0~y1{*`A zseN|+w$4j7m>6yF1z|*Ifxx~!q9oczCh7iG=6U>%Wy{Re49!O`EmX#6Mm0JvIbSBt zWFg6+ouR~WluU5Z+YQNGPz$U>LySzgLWa-QvjeilX~Dot8D-WZ2kE^5#1eCqocdg% z^+NS*l|cAvvnISXh6_Hwj_}>zVdiV~nT3=>rT7*g%T{g$+zS#xq7s040BRFRz_$gd zy_w~(GX3I!zCeD|lSclLS8okN^NCggU=7H`7AM)j-f+R7mEy!IaDp__cK}w_h_&-j z#+$R^pF@!3wdqX67aQqD8s+6Oi*uwT4YO{Wz~&uDrCHPu{1ePpbs%u#w7>(+#}**!pZz??rMJ9*0Hhr+Ar3Va;( zbx}L&vZMFQ{?1*!+j!*ibY2Y%INq?LiH_l|WmKAP;zKdaj9#`JW1Tdf)%+&UE)R$H zvSTnU%8aAKPw}+j%F2esS-S7GU+HJgNpWvkI;GRkL~pOwa)!lLERx^cu)L^Nq+p2F zRK!??ZwH1LNXu{s!oin=U@)>~6(gCd?8Q@DzSB_Z^;qv6Bc=A%3X9xde!zvCy{&um z%yDqlO6I0+@i2d-ru?|#@!3y^B@STjZ}{osQ{s@z_ds2Q3OQj=UQw2R zdp1*><^0x%<2>brb$P6PtxEMaIoULW_#-AVlFJ!eqiOJpD`{qVP%j_FB+^4!$KcDi zt3T5?8&k}wbO}HP)nnKYeT@u$WIZ04-@uG7Xy%CwX!C5SQb($AdH@W#{puw{T9ztDe=4oS?g->l0K_&~c_Qj0_CDE1?=?<5vzsXE2yXH58h?KLf-$lB!Kj$Zc5!=* zlmIAQ=yc*YlO90_P_+krL(nzo2k}4zgoVjcmgHPUS^+cH*>(BWbW^WYr>Cq1@{K;6 zE4CbM|IIW9P+_WW7Iq3xdm=K1|0A|G7FfcBB7TxzQ)QSUNlSWGjg?mRPbcU=C7+nT znjK1N7PMxNigdyGAV*@U=9-$Y5wT-oTPk2G9yk#J!2YHUD85}{-N3Abfq8i@Su=VC zYjf;bqv(YerUz2;k@X}!oVjyI%3 zD|C!y^5sA%t3O``z$oTc&>#!I6)>j>10SF`QkKFv5cG^I5v@|4i;`efz}(_x8GC3h zBQc#F^#$5J-BOgM+vLPS1@2|K+N+B7FdMdkqp+joa72t&j-UEsZV3!fB=6oo(VpE- zwRhVu{oW*t5H}0oRPpJw2fk6cYmcEJ1hvtH3UQh&-J%W<5&RK2#>D}$vSPt(~%@T1WN5h|)up|&VH zf9pI<62yvjzl9}Oyk9n)7ZKq{m_{+|AA(4&c0;c6kd+Dr^Pi^w5hnZC3ZwObI71LJ zx~GXAX*IL9G6kHeMZotuz?D<$*0CWH>EtrL;N2*B(WdSY0JbU1>5Mq99dCi_4}2zg?$L;z(# zwgVV_A9s|r2l;U5Y$D#`cC2aJl1%*Zy-(_1H()NjLE0BBOI-+}nwf~zK5$2_sY!Gw zpy!^=E3~v&~u@L8jvnSX$I@gfqLK`r60q#EX=Yx%gotIBLXoZV;SlkeOsd- zdM=0cvV`(==Nf)IoxGo3oMrFBTaB~x6ESu|#Qt#B8+juxZjMO{Ik0!f?n80B$#KJ% z{(K)y(PFeUOQ&>6S6&7 zSOLotJB&Yfhn?38S6y~E1_K<_lRv1J=8^4t39D+v7u3`#L$$%&VuEBOcgRm73lfMM zQX3Kk&_h(il=XXFMGoK>NtyhD39(EIcSl8(!H7KKMqWh-uyM3CndXJVwQWxY%!ypp z`grbn<=dI6f8X+Yy-4&sDk!bdsIe)=I}{SZzKrX}3Dy_PV)bQdFwkl+kZYUOtj^K9 zwuGTcWIm&W_8 z*LQ-onBw4ogEBBl9=^s<+*oGWK3T1qJip9_Hf6Xebgf4j6Pjp#PA6!c`i*mYKsgnx z4h_p(A;QE(FlfL3_Ga}0ht--xGXakTQcl%K1DmafvZ2G4SiH)Zzb>*;PuFeS$M+}3 z_sK{&DW=}Q!dOnldS~8}7fQ|EUhTAO^*$bI8LI3HAv*UmQwinBBmZ<31VhGIQ+7!) z5yn3Lz@PljBZH6CH6Idf?@-}(J!GrVV`hzBJMG;*N-PW|g_Tc9=nE|T&mH9IKOTbB zy*@xyeNAyXhHpE*B&S5Kxtv#=l5wKow!KoJ?Br%zGZ~G9{IRYz5YdXOFgj)Fga+x5 zjNr;Ed5iC^v!-NzY*4M{yzX;2(iUbgmK=pM+(S5aneo*q3Nj0O;G=&0G_>)C?Q}U) z)5hDtevUrCj2PSnXKDOC-^v0EAu2ispICRw#_pvoJ=JjWENBYgh=)3&L>e&@SB3r2 z7M0{twbp-h%A%{g>R%eW6K(e`EQ{!U7S^PjIK;_484Ia@x)JtGf^(j zGOkF-BU*1N4wRA9oFhAdxJ0v%sL99L2Fc4pAj~wwaZYI>k$Einv(DD>i>*p_P|zZZ z=%sYY@{MAQ3%tpEX}1?AHD)(U`-l)eZ{U%o90omZIjHHT{Dn)AU<=hOJ+kxh3@x+M zx;voK%F|c{(^YrQZp#$4f0*vLaTfpbYzw0%Ck5%o^{g+=XN5o%#W0uZpI85hW?a}v ze&6FOj0i@wzi^V2b{uUCn>azd{(zS|Tektg;5ug&q<%*njC=-NQ6tMz@N4 zkcs~Yq(9@PemX(th-u}7MZ|d-7;=U`Lykg;WvUXD33?zw3JP|Y{g)|*(zL>Zj4Vj( zk_JjgeO2S$PEb&R(R-*Kom9zbt6FKDe2vu@_2#CfHB@JK@roz=xcYQJ3RT~eIym!s zh@U^R>yexM$Pk&LV&DN!r2a@EdiF=1M)-4)&2ZScst z9iG*RN|;oS6bmYcE#u@?j{ooiC0p9cx1R;E3`&d>uq(6688lmU z>|)z%Cq}8GH$&>f=T{~<3&NP8Hv6OM`lts1C`lcFs6YoghZ1k7R*iP6AVcB%=7yE? z&{_6eOF$#u#}u-Fwf>lr@~ltep_S&WhBUw*btXytM~4EnB|#=?d`X~=rY=R4RZ#tS zci0ru-pqpQXBQdZ@vH;Rh_x&5iQgE_0-(~kbX3WW_BVr|?{A)DWgR^m6CGm~`lI+Z zv;F$`{HNW^P}M=Es!|t$#9cS1^a>GLh$$GSPuQM_S&df`8kI8wFK}@rnYDx<0b1S` zOHM#~JcsI)R;z?9sUnHt&&i%Jc?MuX8rk3B8InWf3VTFmoiZA6wnUWbLvk>6v?J`B zBj*f6`%!VrXvLmMew<%$Qjt8%5jfkzgBeio=R=k++4K_gwRuLKvn(9g+E$67TCL z?PkWv@8OBM+(0l@%f$;~+=*)GK`p;iE_lpUJY#mKWC z({=;(RFRWHoAZA==oo|H4^?qGk0EOeYaO!d5R^{$) zj-WhJIDFAw;)s*-_1ljADNQ0+v85*ysIuT&`KW>^3tphdk+nr}HFr@cU@%DUba(V( z9ExJF!F+K1jSpnXrm*l>sYm&z0%CQ?0I2<^j!wwE07%jL+_?`S?ns;ch%+|LMVp3t z*b-DEB9A|=kxyg?5yFLjYRtN&jb3&$U+|#aZ{eU567!+Dk6<>7)>4fMI5Q_Sr3Q9% zbe{JcJKM^uod26_OuLWzC@{{rJj5Am*%KV2njZJRth$l)n8;b$|KY%O@z9RrNbeb1bkB9Vlo(EQhO?7cs-f!0Kx7*& zt(!LD*#x%HiMUfKj@gmiF(HP4r@$k~{nTUX$2Jqr-w?ANc#vqH#Bv`Z1p8yOMsrFY z#tn4}HWG?S3*KyCgF7)}%zz?133j4wWG`E%3SI*Wkw~FM%88+-9E%58d`c4yTW&?@ zfO>)gQ9@QL#Kbn1(w1oCgf%2Sc~Sw12WUrLX;>dqo02+W*NK6=-C0Ypg0GFATO$@2 zXQaw`(r>E-JMzFnZaTkAss7+o4$3E=Y<~3IaLhv^-a*h1`hq!>e1a9<*ap=B6Es5i z6~>7;1GO-uv(chA<|`jbX6bS26Wc{3bkH+ulmPrQWvVp6N6DD|RT(s&Ry@wDut)2n zhlz|SFp<#BDiKXQ>r8OlOO_wk1G>{jbumL4o&Oydsm0Ht=-$=iPe=7#QI0D(<0vr7 zfK*jZDdKj@9XSoodHRZ{MG?o5wk}d2FLg$Oap9YSWI{p=PCl#8ex!i|>inDuAq#Zy zady%|Y$U(F)0y#oSs_$s?QQQf@aG+{%Ojn>nwQrD_+887S{ml`A|a?j^V)D%bk+yL}wqIynNbP+3(ctmUem-bQ1$d z5rKURyuPzZ(M7EGqNkW+x2pPrQ(3+0ntH`LN>n`4dCUR*?kMDDdQ-jEpQ3XX{Z!$R z?_)&!5aQNZ#Cu#DKz-8f-_uvqq_>uR$w@;6z6XYmMp zFBW+#Wk+krqcsiNGRW%>p%&4IU!E0TzeT^*`b?kJeC72fmOn{?CE@d?1GK%tfA!&N ze%PZS+J?D5gf>EL)qu|d7+-;Ft5*ceC5*1yV*dURrd4&^LTM*n*S2#!TZ-9qKP!m6 zMM@&nVmnFbaPe`4qn^`!S;GY1uiVxx&F-dT!;)(L;vj!{kP zkY)3$1N03XCR0%|S{?qzxIVSj+3>vt+#I#26U;lFCE_823{ys)!jG~uqiYb>zT3jb zxMkwtAUK;@x7w0Ag~ezfE0>;i2w@+Qi)=~haiR8)0qoqQ+wph^M0Iww?)^I%~ILa?8Fw454GtXyfe*r^`1x*Zh9AfL~Vd zE1RtIOE?C#-}*S3Kt*PRY*Q;nYt3&y(bhw2CKUmyI+;w;2^Tt1@4peEO?VzfaPF{+ zht~FCh~Ib5f|<0gqBfrq*S`2b*lE783DfPlDCXuh zt7fgH)ec>OG&P!RIG=N13>z#Jg^J7;(~mt-&bU`TXC5hx#~B}MM(;8lpBXTLWWRtP zZV!kX*Lxx#wvmooW5}0#bL2dO11QdcZ;=be2Wv#ae`b*NH<;az zQO5JD_XzXTq0B=Qycc1AO5+cIM%>wSZLHohitKndK3<(ycF*?oYwgnQQ3;Lg*+gII z^x1^NG($_T#erez7#!;U_72O^^M?G=xc=hl%vwkbsO^O6-U@kSXz9OA(S3t>-h?>= z+vyZMpFBOg?t*Im8FEo;^>DPlmWpcGfiTSpvi8{9ZE$R74EhsjEoR_}e7~x@mzq)1 z6(_n4sC(jiOK&FLU=wTvJNQED*&B*GTTb@__t^*OedK6rfV-2i6Ai@s?BW`lq0(k( zIq(6l&!#i_Y46Qw4^t(mS6LLy;4z*WjXT$r!tt`>nCsU1fThs1gQ!vE}OgK@~0pv94<$@$yan4(1NH6$C8UT-e`s#2&s;t8GxFasX^{wKnuJuXvb(^Vb=yCLH zi`TBFtrhp8alzPc>bk>Lbsv5G&}#Z6^1mP({{bxi<<_RBV`TbIz9G~9$Tw7Uvo)d> zv9Wd(GIB7mH?wuLvHzzkqi1DAE5QHvM=5LTXlA8HE$*miX=VUPD`Kf<;(*7(_Fek+ z6A-X*)u3i!!J}qiVZ)=RXJ*4=XQtPp{V!{NYZFT&JZeTdNLqde10!okJXTf)NZP-H z{jL1j_D#;Amu}jQ7nv_fP*KW|l?_c>ka=EC%T|G{T6(=pM0n>!kPzk;Qnqmhu2fsLWj|Ab>|B}&I+(7^{^y+cN?4M3j%Xow>y zw5*S_KMqO1fWzB1jAQWyXW!pizUs85e26{%F}!C23b*oD%L)Av|B*WKc${*-4!3b` zv*%^)<$jyuEfy)=(XF+c^x3j(EKy(k_}ohU>5e|V=bmNAJJ7Jkz&l?e&6@q5LiEPt z;(Zw+`Fd~R0lhr(#^m){@iUo8_LSq|oqhjhRcb4}V#aatE)Oc^?cfGG`5nsDM~bJ( z-KumxI;%%o`s~QK_1Q4%$fTD2h!)GSbcI;%`o5=y38J}rJvJ6P$KtL^V$QP;} zB*hTSd7K4IMe_~NTh7_zTB5DI7i;*cw`RQsz$VQBX!EA~&~s0H!(}GZNH^h*M<4nF zhYRLo15(Q83ADH;ARy1@2biEwh`aQCNKDx0_?%AKXVUP(RvujNXAr~32C9@#1W)R5 zj2HC>)S&9CO6kOWj{qF?2jy@56Puxp^HXxR0vCJfA!_{ja1G+T*;a zkLBm%8jrrML(m8HSCtySpikHv#1FZY!Mgw+s1K-4w6G&EH=@U%*#ckkX`iUv2(J-` zVV|XP$2z$=h%<1ncy(X4$;UO>=RMmSW7$oWj%2$hBd)sMUy)j?n@8-CnXqlsn8lSp z-?y%MnPgOpdbX5zJ{SMD$oMzK;rHtK?+~C>aME}D8xM;1PDcN<3g|f){axh$S0tF( zJ2(oO>e=IcFIFkNf0bDnA!$|23>{4!G#FS}@V-|i9t#UQ9y9ZQuD|W9Y;^y${k=0X z(*INb$Nt;ypE?~A_517dxBNZUKhIhI)&IZx zhSd7682-=Rg7?qfBM(WdXrp9p_BTB7{t4v&Z)pGjlh>I3ujIA=hF&v%qqkZ9XRKdz zx#?;QHPP`n)DT(JRW7Pit+X#43O5^S)PEDKIa`|0hh=VnuK&4-Pi2cU;G7n~H>T80 zZsk*jf*?LGB7==c01(&64P@cdfJ_vHkW`h#bpw%?KzegAzD&A^4V=Gv>gwSsoSaNc zV?4@CV|O^5T&Fb2wecdA5D^R&_Iyik-Xvy}Fd+=|j)7llfrGWZis2I2c7c~*aC)fL zL~_(B5E1)i-v6n#(ohz`{>ADeEcON<0Af>fYI*jnUZ)68(Fdk19;=;Uh5W&En<2RcSk46znfDX6%?zK3j< zeupa;eVaAcjKLKE`$bXCKXuGd>VfRz$2A%PDTmoEEKl>YHn>a%WhIb84{OXT^@{gO z&OuKvBjG#1rjBgA(ReEK6*NK5d-G#l zWXKey9daWCS2$-UEBJ=3MqCHJyPU{0 z48uppo;Y*aZeAW1JE(GzhB?4z8euO}pmyvJ9DIzObTnM18}h#cSLM)5 zN7Q4VB~-&$3v_x{JzzdqUw_`a+@pw5j!4X+BFT)vW`;G`(!g%RSNAUB`A}y^p=}?~ z8E4U9b-ChnL+kwDejzs$sxeDg^;;uQZ-7n_%)-!802|^b3P|!kjwM+8&^I6cb{3iP`Q>sVb-P=i0RFl`g$<&JfwtEL!#QAT zGbFng>yN|S#<_tjk2kCjjKwasaS@TMd<5wq&wF+Uq;^1MV~9JRaubH@mr2oQt3&k9 ztifQfQgEu}f@3uX33+Y*q9b}rQrLh+IHZUf&7hWgo$aj#GvtbZDq&W}lwCC`o>%0N z+$&ju^2|TfH&UIl80E>21mj=;F$|LXSt-pA^F z05zVu+~f6T!OlTQyU}&VS#ny9G=oC;tI=kUjuC4o!1UfDR=7#gqG|%OPCy)?CB&>? z)O$5SQA>ZC;{E=SiEwU=8+(PZQdO^ku#1(ROs!S#I@b>pHTU9KXf9$T?51WWZbzo7 zs0x35bo65HP~Xsr+cJ?h#?CN*(acmaWGTUndCyTrBAitzPq8n~P!?!JH(uee*kW&I zW1+e0G?kqtdt1#yW}2Zqi+Pk=`l*=7wk$E%szC47d;W?_LaTe5kgEEvM=<`*RXsg4 z1h?4UO7D5;PvTos;l%84Q-GW;suz}G{5y7RG7wcW%SeeDZKO(5tJB+d(N@cXdUmZy ze%f*BT=DQIPfG&Dm%?|~SmlbwvbrBxchc#g1D!}EK=Fo2#Y$`aw49h=P)$}#L$uS5 zUqP#inz4bMmp0m@xkGs{u7afcMh=-Np+0QFcsPL!t2)CGOl#m`oRiM;A{DjD^nuu= zm1A|f~MPmf8l;r3Xzo+ z2*z~6^;9F|%r@q)L><;x$MW9lqIsU8AkSp{Y7% zkI61hqVfm~t+l<;Fd>VIgGQBC3IYu6dgI!-!;*rdlPL}#SN%APyY7P94FncKq^xvf0tutsdQ^f9ZOh_b%hL!m*yYHQS z^ejV*6$f~JJAzTtvz2XJ00!A<;>Hi@^te^NQl6'(1BkZWYSK;4II3liqAMCS4- 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 literal 0 HcmV?d00001 From 0445b3547cc828e85469f7661d8d56294deb67b8 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 11 Feb 2020 14:44:32 -0800 Subject: [PATCH 2/5] Adjust for older PowerShell versions --- Source/Images/Build.cmd | 12 ++++++------ Source/Images/BuildFD.ps1 | 34 +++++++++++++++++++++------------- Source/Images/BuildHD.ps1 | 34 +++++++++++++++++++++------------- 3 files changed, 48 insertions(+), 32 deletions(-) diff --git a/Source/Images/Build.cmd b/Source/Images/Build.cmd index 6e379154..891419cb 100644 --- a/Source/Images/Build.cmd +++ b/Source/Images/Build.cmd @@ -9,9 +9,9 @@ call Clean.cmd echo : echo : Building Floppy Disk Images... echo : -call BuildFD.cmd cpm22 ..\cpm22\cpm_wbw -call BuildFD.cmd zsdos ..\zsdos\zsys_wbw -call BuildFD.cmd nzcom ..\zsdos\zsys_wbw +call BuildFD.cmd cpm22 ..\cpm22\cpm_wbw.sys +call BuildFD.cmd zsdos ..\zsdos\zsys_wbw.sys +call BuildFD.cmd nzcom ..\zsdos\zsys_wbw.sys call BuildFD.cmd cpm3 call BuildFD.cmd zpm3 call BuildFD.cmd ws4 @@ -19,9 +19,9 @@ call BuildFD.cmd ws4 echo : echo : Building Hard Disk Images... echo : -call BuildHD.cmd cpm22 ..\cpm22\cpm_wbw -call BuildHD.cmd zsdos ..\zsdos\zsys_wbw -call BuildHD.cmd nzcom ..\zsdos\zsys_wbw +call BuildHD.cmd cpm22 ..\cpm22\cpm_wbw.sys +call BuildHD.cmd zsdos ..\zsdos\zsys_wbw.sys +call BuildHD.cmd nzcom ..\zsdos\zsys_wbw.sys call BuildHD.cmd cpm3 call BuildHD.cmd zpm3 call BuildHD.cmd ws4 diff --git a/Source/Images/BuildFD.ps1 b/Source/Images/BuildFD.ps1 index 531a891f..f482bc10 100644 --- a/Source/Images/BuildFD.ps1 +++ b/Source/Images/BuildFD.ps1 @@ -1,4 +1,5 @@ -Param([Parameter(Mandatory)]$Disk, $SysFile="") +#Param([Parameter(Mandatory)]$Disk, $SysFile="") +Param($Disk, $SysFile="") $ErrorAction = 'Stop' @@ -18,8 +19,23 @@ if (-not (Test-Path("d_${Disk}/"))) "Generating Floppy Disk ${Disk}..." -$Blank = ([string]([char]0xE5)) * $Size -Set-Content -Value $Blank -NoNewLine -Path $ImgFile +#$Blank = ([string]([char]0xE5)) * $Size +#Set-Content -Value $Blank -NoNewLine -Path $ImgFile +$Blank = ([byte[]](0xE5) * $Size) +[System.IO.File]::WriteAllBytes($ImgFile, $Blank) + +if ($SysFile.Length -gt 0) +{ + "Adding System Image $SysFile..." + #$Sys = Get-Content -Path "$SysFile.sys" -Raw + #$Img = Get-Content -Path $ImgFile -Raw + #$NewImg = $Sys + $Img.SubString($Sys.Length, $Img.Length - $Sys.Length) + #Set-Content -NoNewLine -Path $ImgFile $NewImg + + $Cmd = "mkfs.cpm -f $Fmt -b $SysFile $ImgFile" + $Cmd + Invoke-Expression $Cmd +} for ($Usr=0; $Usr -lt 16; $Usr++) { @@ -45,17 +61,9 @@ if (Test-Path("d_${Disk}.txt")) } } -if ($SysFile.Length -gt 0) -{ - "Adding System Image $SysFile..." - $Sys = Get-Content -Path "$SysFile.sys" -Raw - $Img = Get-Content -Path $ImgFile -Raw - $NewImg = $Sys + $Img.SubString($Sys.Length, $Img.Length - $Sys.Length) - Set-Content -NoNewLine -Path $ImgFile $NewImg -} - "Moving image $ImgFile into output directory..." -&$env:COMSPEC /c move $ImgFile ..\..\Binary\ +#&$env:COMSPEC /c move $ImgFile ..\..\Binary\ +Move-Item $ImgFile -Destination "..\..\Binary\" -Force return \ No newline at end of file diff --git a/Source/Images/BuildHD.ps1 b/Source/Images/BuildHD.ps1 index 523a4b62..eedfa4aa 100644 --- a/Source/Images/BuildHD.ps1 +++ b/Source/Images/BuildHD.ps1 @@ -1,4 +1,5 @@ -Param([Parameter(Mandatory)]$Disk, $SysFile="") +#Param([Parameter(Mandatory)]$Disk, $SysFile="") +Param($Disk, $SysFile="") $ErrorAction = 'Stop' @@ -18,8 +19,23 @@ if (-not (Test-Path("d_${Disk}/"))) "Generating Hard Disk ${Disk}..." -$Blank = ([string]([char]0xE5)) * $Size -Set-Content -Value $Blank -NoNewLine -Path $ImgFile +#$Blank = ([string]([char]0xE5)) * $Size +#Set-Content -Value $Blank -NoNewLine -Path $ImgFile +$Blank = ([byte[]](0xE5) * $Size) +[System.IO.File]::WriteAllBytes($ImgFile, $Blank) + +if ($SysFile.Length -gt 0) +{ + "Adding System Image $SysFile..." + #$Sys = Get-Content -Path "$SysFile.sys" -Raw + #$Img = Get-Content -Path $ImgFile -Raw + #$NewImg = $Sys + $Img.SubString($Sys.Length, $Img.Length - $Sys.Length) + #Set-Content -NoNewLine -Path $ImgFile $NewImg + + $Cmd = "mkfs.cpm -f $Fmt -b $SysFile $ImgFile" + $Cmd + Invoke-Expression $Cmd +} for ($Usr=0; $Usr -lt 16; $Usr++) { @@ -45,17 +61,9 @@ if (Test-Path("d_${Disk}.txt")) } } -if ($SysFile.Length -gt 0) -{ - "Adding System Image $SysFile..." - $Sys = Get-Content -Path "$SysFile.sys" -Raw - $Img = Get-Content -Path $ImgFile -Raw - $NewImg = $Sys + $Img.SubString($Sys.Length, $Img.Length - $Sys.Length) - Set-Content -NoNewLine -Path $ImgFile $NewImg -} - "Moving image $ImgFile into output directory..." -&$env:COMSPEC /c move $ImgFile ..\..\Binary\ +#&$env:COMSPEC /c move $ImgFile ..\..\Binary\ +Move-Item $ImgFile -Destination "..\..\Binary\" -Force return \ No newline at end of file From 382b5594f06da75ff854f19f4cf0a328e02ebead Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 11 Feb 2020 17:01:55 -0800 Subject: [PATCH 3/5] Support multiple devices in IDE driver --- Doc/ChangeLog.txt | 4 + Source/HBIOS/Config/MK4_std.asm | 1 - Source/HBIOS/Config/RCZ180_ext.asm | 1 - Source/HBIOS/Config/RCZ180_nat.asm | 1 - Source/HBIOS/Config/RCZ80_kio.asm | 1 - Source/HBIOS/Config/RCZ80_std.asm | 1 - Source/HBIOS/Config/SBC_std.asm | 1 - Source/HBIOS/Config/SCZ180_126.asm | 1 - Source/HBIOS/Config/SCZ180_130.asm | 1 - Source/HBIOS/cfg_dyno.asm | 21 +- Source/HBIOS/cfg_ezz80.asm | 21 +- Source/HBIOS/cfg_master.asm | 21 +- Source/HBIOS/cfg_mk4.asm | 21 +- Source/HBIOS/cfg_n8.asm | 21 +- Source/HBIOS/cfg_rcz180.asm | 21 +- Source/HBIOS/cfg_rcz80.asm | 21 +- Source/HBIOS/cfg_sbc.asm | 21 +- Source/HBIOS/cfg_scz180.asm | 21 +- Source/HBIOS/ide.asm | 878 ++++++++++++++++++----------- Source/HBIOS/ppide.asm | 85 ++- Source/HBIOS/std.asm | 6 +- 21 files changed, 755 insertions(+), 415 deletions(-) diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 1edf01e5..2dbd6d4e 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -43,6 +43,10 @@ Version 2.9.2 - PMS: Enhanced PPIDE driver to handle multiple PPI interfaces - PMS: Added a ROM based game - WBW: Only assign drive letters to hard disk devices with media +- WBW: Enhanced IDE driver to handle multiple IDE interfaces +- D?R: Contributed SC126 How-To: Preparing a MicroSD Card to Transfer Files to/from a Linux System +- PMS: Updated romldr to handle more than 9 drives +- PMS: Added "user" rom module template Version 2.9.1 ------------- diff --git a/Source/HBIOS/Config/MK4_std.asm b/Source/HBIOS/Config/MK4_std.asm index b144c790..4909dc00 100644 --- a/Source/HBIOS/Config/MK4_std.asm +++ b/Source/HBIOS/Config/MK4_std.asm @@ -38,7 +38,6 @@ FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_DIDE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .SET IDEMODE_MK4 ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] ; PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) ; diff --git a/Source/HBIOS/Config/RCZ180_ext.asm b/Source/HBIOS/Config/RCZ180_ext.asm index 29837d4a..7c9cca5b 100644 --- a/Source/HBIOS/Config/RCZ180_ext.asm +++ b/Source/HBIOS/Config/RCZ180_ext.asm @@ -41,6 +41,5 @@ FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .SET IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] ; PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/RCZ180_nat.asm b/Source/HBIOS/Config/RCZ180_nat.asm index 2ebeebf9..5c83fe9a 100644 --- a/Source/HBIOS/Config/RCZ180_nat.asm +++ b/Source/HBIOS/Config/RCZ180_nat.asm @@ -41,6 +41,5 @@ FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .SET IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] ; PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/RCZ80_kio.asm b/Source/HBIOS/Config/RCZ80_kio.asm index d30c7ff0..eeede184 100644 --- a/Source/HBIOS/Config/RCZ80_kio.asm +++ b/Source/HBIOS/Config/RCZ80_kio.asm @@ -47,6 +47,5 @@ FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .SET IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] ; PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/RCZ80_std.asm b/Source/HBIOS/Config/RCZ80_std.asm index 61ef8517..d266d9f2 100644 --- a/Source/HBIOS/Config/RCZ80_std.asm +++ b/Source/HBIOS/Config/RCZ80_std.asm @@ -34,6 +34,5 @@ FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .SET IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] ; PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/SBC_std.asm b/Source/HBIOS/Config/SBC_std.asm index 31e094cf..d5cb313a 100644 --- a/Source/HBIOS/Config/SBC_std.asm +++ b/Source/HBIOS/Config/SBC_std.asm @@ -34,7 +34,6 @@ FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_DIO3 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; IDEENABLE .SET FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .SET IDEMODE_DIO ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] ; PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) ; diff --git a/Source/HBIOS/Config/SCZ180_126.asm b/Source/HBIOS/Config/SCZ180_126.asm index 01f051ca..09d2100a 100644 --- a/Source/HBIOS/Config/SCZ180_126.asm +++ b/Source/HBIOS/Config/SCZ180_126.asm @@ -41,7 +41,6 @@ FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .SET IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] ; PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) ; diff --git a/Source/HBIOS/Config/SCZ180_130.asm b/Source/HBIOS/Config/SCZ180_130.asm index 60de55b9..ae332544 100644 --- a/Source/HBIOS/Config/SCZ180_130.asm +++ b/Source/HBIOS/Config/SCZ180_130.asm @@ -43,7 +43,6 @@ FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .SET IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] ; PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) ; diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index e6808004..0babcf5d 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -105,9 +105,26 @@ FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER ; IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .EQU IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -IDE8BIT .EQU TRUE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_RC ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $10 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $00 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $00 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index d38b3587..d691eb2d 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -120,9 +120,26 @@ FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER ; IDEENABLE .EQU TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .EQU IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -IDE8BIT .EQU TRUE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_RC ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $10 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $00 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $00 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index a63aa593..f02968d7 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -164,9 +164,26 @@ RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) ; IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .EQU IDEMODE_NONE ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -IDE8BIT .EQU FALSE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_NONE ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $20 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $00 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $00 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 448d6361..37025c1a 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -119,9 +119,26 @@ RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) ; IDEENABLE .EQU TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .EQU IDEMODE_MK4 ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -IDE8BIT .EQU TRUE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_MK4 ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $80 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $00 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $00 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_DIDE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $20 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $28 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $28 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU FALSE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU FALSE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_DIDE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $30 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $38 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $38 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU FALSE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU FALSE ; IDE 2B (MASTER): 8 BIT XFER ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 0a1b2aa6..3592584b 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -122,9 +122,26 @@ RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) ; IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .EQU IDEMODE_DIO ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -IDE8BIT .EQU FALSE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_DIO ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $20 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $20 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $28 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU FALSE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU FALSE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index 9e1ba907..aeb1f0c4 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -125,9 +125,26 @@ FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER ; IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .EQU IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -IDE8BIT .EQU TRUE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_RC ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $10 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $00 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $00 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 1a79f75a..3a49b4d3 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -129,9 +129,26 @@ FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER ; IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .EQU IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -IDE8BIT .EQU TRUE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_RC ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $10 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $00 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $00 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 67c1b36a..78193630 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -122,9 +122,26 @@ RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) ; IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .EQU IDEMODE_DIO ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -IDE8BIT .EQU FALSE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_DIO ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $20 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $20 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $28 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU FALSE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU FALSE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 79f88b5e..532544d7 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -120,9 +120,26 @@ FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER ; IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .EQU IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -IDE8BIT .EQU TRUE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_RC ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $10 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $00 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $00 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index c9149ca7..5c4240a9 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -4,9 +4,20 @@ ;============================================================================= ; ; TODO: -; - IMPLEMENT IDE_INITDEVICE -; - HANDLE SECONDARY INTERFACE ON DIDE -; - IMPLEMENT INTELLIGENT RESET, CHECK IF DEVICE IS ACTUALLY BROKEN BEFORE RESET +; - FIX SCALER CONSTANT +; - GOPARTNER NEEDS TO HANDLE "NO PARTNER" CONDITION +; - IMPLEMENT H/W PROBES FOR DIO AND DIDE +; +; NOTES: +; - WELL KNOWN IDE PORT ADDRESSES: +; BOARD BASE DATLO DATHI +; ------ ------ ------ ------ +; DIO $20 $20 $28 +; DIDE-A $20 $28 $28 +; DIDE-B $30 $38 $38 +; MK4 $80 N/A N/A +; RC $10 N/A N/A +; SMB $E0 N/A N/A ; ; +-----------------------------------------------------------------------+ ; | CONTROL BLOCK REGISTERS | @@ -100,77 +111,31 @@ #DEFINE DCALL \; #ENDIF ; -; UNIT MAPPING IS AS FOLLOWS: -; IDE0: PRIMARY MASTER -; IDE1: PRIMARY SLAVE -; IDE2: SECONDARY MASTER -; IDE3: SECONDARY SLAVE -; -IDE_DEVCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE -IDE_IO_BASE .EQU $20 ; DEFAULT IO BASE (NOTE OVERRIDES BELOW) -; -#IF (IDEMODE == IDEMODE_MK4) -IDE_IO_BASE .SET $80 -IDE_XAR .EQU $88 ; EXTERNAL ADDRESS REGISTER (XAR)#ENDIF -#ENDIF - -#IF (IDEMODE == IDEMODE_RC) -IDE_IO_BASE .SET $10 -#ENDIF - -#IF (IDEMODE == IDEMODE_SMB) -IDE_IO_BASE .SET $E0 -#ENDIF - -#IF ((IDEMODE == IDEMODE_DIO) | (IDEMODE == IDEMODE_MK4)) -#IF (IDE8BIT) -IDE_IO_DATA .EQU $IDE_IO_BASE + $00 ; DATA PORT (8 BIT PIO) (R/W) -#ELSE -IDE_IO_DATALO .EQU $IDE_IO_BASE + $00 ; DATA PORT (16 BIT PIO LO BYTE) (R/W) -IDE_IO_DATAHI .EQU $IDE_IO_BASE + $08 ; DATA PORT (16 BIT PIO HI BYTE) (R/W) -IDE_IO_DATA .EQU IDE_IO_DATALO -#ENDIF -#ENDIF -; -#IF (IDEMODE == IDEMODE_DIDE) -IDE_DEVCNT .SET 4 ; DIDE HAS PRIMARY AND SECONDARY INTERACES -#IF (IDE8BIT) -IDE_IO_DATA .EQU $IDE_IO_BASE + $00 ; DATA PORT (8 BIT PIO) (R/W) -#ELSE -IDE_IO_DATA .EQU $IDE_IO_BASE + $08 ; DATA PORT (16 BIT PIO LO/HI BYTES) (R/W) -IDE_IO_DMA .EQU $IDE_IO_BASE + $09 ; DATA PORT (16 BIT DMA LO/HI BYTES) (R/W) -#ENDIF -#ENDIF -; -#IF ((IDEMODE == IDEMODE_RC) | (IDEMODE == IDEMODE_SMB)) -IDE_DEVCNT .SET 1 ; RC2014 COMPACT FLASH SUPPORTS ONLY 1 DEVICE -IDE_IO_DATA .EQU $IDE_IO_BASE + $00 ; DATA PORT (8 BIT) (R/W) -#ENDIF -; -;IDE_IO_DATA .EQU $IDE_IO_BASE + $00 ; DATA INPUT/OUTPUT (R/W) -IDE_IO_ERR .EQU $IDE_IO_BASE + $01 ; ERROR REGISTER (R) -IDE_IO_FEAT .EQU $IDE_IO_BASE + $01 ; FEATURES REGISTER (W) -IDE_IO_COUNT .EQU $IDE_IO_BASE + $02 ; SECTOR COUNT REGISTER (R/W) -IDE_IO_SECT .EQU $IDE_IO_BASE + $03 ; SECTOR NUMBER REGISTER (R/W) -IDE_IO_CYLLO .EQU $IDE_IO_BASE + $04 ; CYLINDER NUM REGISTER (LSB) (R/W) -IDE_IO_CYLHI .EQU $IDE_IO_BASE + $05 ; CYLINDER NUM REGISTER (MSB) (R/W) -IDE_IO_DRVHD .EQU $IDE_IO_BASE + $06 ; DRIVE/HEAD REGISTER (R/W) -IDE_IO_LBA0 .EQU $IDE_IO_BASE + $03 ; LBA BYTE 0 (BITS 0-7) (R/W) -IDE_IO_LBA1 .EQU $IDE_IO_BASE + $03 ; LBA BYTE 1 (BITS 8-15) (R/W) -IDE_IO_LBA2 .EQU $IDE_IO_BASE + $03 ; LBA BYTE 2 (BITS 16-23) (R/W) -IDE_IO_LBA3 .EQU $IDE_IO_BASE + $03 ; LBA BYTE 3 (BITS 24-27) (R/W) -IDE_IO_STAT .EQU $IDE_IO_BASE + $07 ; STATUS REGISTER (R) -IDE_IO_CMD .EQU $IDE_IO_BASE + $07 ; COMMAND REGISTER (EXECUTE) (W) -IDE_IO_ALTSTAT .EQU $IDE_IO_BASE + $0E ; ALTERNATE STATUS REGISTER (R) -IDE_IO_CTRL .EQU $IDE_IO_BASE + $0E ; DEVICE CONTROL REGISTER (W) -IDE_IO_DRVADR .EQU $IDE_IO_BASE + $0F ; DRIVE ADDRESS REGISTER (R) +IDE_REG_DATA .EQU $00 ; DATA /OUTPUT (R/W) +IDE_REG_ERR .EQU $01 ; ERROR REGISTER (R) +IDE_REG_FEAT .EQU $01 ; FEATURES REGISTER (W) +IDE_REG_COUNT .EQU $02 ; SECTOR COUNT REGISTER (R/W) +IDE_REG_SECT .EQU $03 ; SECTOR NUMBER REGISTER (R/W) +IDE_REG_CYLLO .EQU $04 ; CYLINDER NUM REGISTER (LSB) (R/W) +IDE_REG_CYLHI .EQU $05 ; CYLINDER NUM REGISTER (MSB) (R/W) +IDE_REG_DRVHD .EQU $06 ; DRIVE/HEAD REGISTER (R/W) +IDE_REG_LBA0 .EQU $03 ; LBA BYTE 0 (BITS 0-7) (R/W) +IDE_REG_LBA1 .EQU $04 ; LBA BYTE 1 (BITS 8-15) (R/W) +IDE_REG_LBA2 .EQU $05 ; LBA BYTE 2 (BITS 16-23) (R/W) +IDE_REG_LBA3 .EQU $06 ; LBA BYTE 3 (BITS 24-27) (R/W) +IDE_REG_STAT .EQU $07 ; STATUS REGISTER (R) +IDE_REG_CMD .EQU $07 ; COMMAND REGISTER (EXECUTE) (W) +IDE_REG_XAR .EQU $08 ; ECB DIDE EXTERNAL ADDRESS REGISTER (W) +IDE_REG_ALTSTAT .EQU $0E ; ALTERNATE STATUS REGISTER (R) +IDE_REG_CTRL .EQU $0E ; DEVICE CONTROL REGISTER (W) +IDE_REG_DRVADR .EQU $0F ; DRIVE ADDRESS REGISTER (R) ; ; COMMAND BYTES ; -IDE_CIDE_RECAL .EQU $10 -IDE_CIDE_READ .EQU $20 -IDE_CIDE_WRITE .EQU $30 -IDE_CIDE_IDDEV .EQU $EC +IDE_CIDE_RECAL .EQU $10 +IDE_CIDE_READ .EQU $20 +IDE_CIDE_WRITE .EQU $30 +IDE_CIDE_IDDEV .EQU $EC IDE_CIDE_SETFEAT .EQU $EF ; ; FEATURE BYTES @@ -197,57 +162,130 @@ IDE_STBSYTO .EQU -7 ; ; DRIVE SELECTION BYTES (FOR USE IN DRIVE/HEAD REGISTER) ; -IDE_DRVSEL: -IDE_DRVMASTER .DB %11100000 ; LBA, MASTER DEVICE -IDE_DRVSLAVE .DB %11110000 ; LBA, SLAVE DEVICE +;IDE_DRVSEL: +IDE_DRVMASTER .EQU %11100000 ; LBA, MASTER DEVICE +IDE_DRVSLAVE .EQU %11110000 ; LBA, SLAVE DEVICE ; ; IDE DEVICE CONFIGURATION ; -IDE_CFGSIZ .EQU 12 ; SIZE OF CFG TBL ENTRIES +IDE_CFGSIZ .EQU 19 ; SIZE OF CFG TBL ENTRIES ; ; PER DEVICE DATA OFFSETS ; IDE_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) -IDE_STAT .EQU 1 ; LAST STATUS (BYTE) -IDE_TYPE .EQU 2 ; DEVICE TYPE (BYTE) -IDE_FLAGS .EQU 3 ; FLAG BITS BIT 0=CF, 1=LBA (BYTE) -IDE_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) -IDE_LBA .EQU 8 ; OFFSET OF LBA (DWORD) +IDE_MODE .EQU 1 ; OPERATION MODE: IDE MODE (BYTE) +IDE_STAT .EQU 2 ; LAST STATUS (BYTE) +IDE_TYPE .EQU 3 ; DEVICE TYPE (BYTE) +IDE_ACC .EQU 4 ; ACCESS FLAG BITS BIT 0=MASTER, 1=8BIT (BYTE) +IDE_MED .EQU 5 ; MEDIA FLAG BITS BIT 0=CF, 1=LBA (BYTE) +IDE_MEDCAP .EQU 6 ; MEDIA CAPACITY (DWORD) +IDE_LBA .EQU 10 ; OFFSET OF LBA (DWORD) +IDE_IOBASE .EQU 14 ; IO BASE ADDRESS (BYTE) +IDE_DATALO .EQU 15 ; 16 BIT DATA LO BYTE +IDE_DATAHI .EQU 16 ; 16 BIT DATA HI BYTE +IDE_PARTNER .EQU 17 ; PARTNER DEVICE (MASTER <-> SLAVE) (WORD) +; +IDE_ACC_MAS .EQU %00000001 ; UNIT IS MASTER (ELSE SLAVE) +IDE_ACC_8BIT .EQU %00000010 ; UNIT WANTS 8 BIT I/O (ELSE 16 BIT) +; +IDE_MED_CF .EQU %00000001 ; MEDIA IS CF CARD +IDE_MED_LBA .EQU %00000010 ; MEDIA HAS LBA CAPABILITY +; +IDE_DEVCNT .EQU IDECNT * 2 ; IDE_CFGTBL: - ; DEVICE 0, PRIMARY MASTER +; +#IF (IDECNT >= 1) +; +IDE_DEV0M: ; DEVICE 0, MASTER .DB 0 ; DRIVER DEVICE NUMBER + .DB IDE0MODE ; DRIVER DEVICE MODE .DB 0 ; DEVICE STATUS .DB 0 ; DEVICE TYPE - .DB 0 ; FLAGS BYTE + .DB IDE_ACC_MAS | (IDE0A8BIT & IDE_ACC_8BIT) ; UNIT ACCESS FLAGS + .DB 0 ; MEDIA FLAGS .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA -#IF (IDE_DEVCNT >= 2) - ; DEVICE 1, PRIMARY SLAVE - .DB 1 ; DRIVER DEVICE NUMBER + .DB IDE0BASE ; IO BASE ADDRESS + .DB IDE0DATLO ; IO BASE ADDRESS + .DB IDE0DATHI ; IO BASE ADDRESS + .DW IDE_DEV0S ; PARTNER +; +IDE_DEV0S: ; DEVICE 0, SLAVE + .DB 0 ; DRIVER DEVICE NUMBER + .DB IDE0MODE ; DRIVER DEVICE MODE .DB 0 ; DEVICE STATUS .DB 0 ; DEVICE TYPE - .DB 0 ; FLAGS BYTE + .DB (IDE0B8BIT & IDE_ACC_8BIT) ; UNIT ACCESS FLAGS + .DB 0 ; MEDIA FLAGS .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA + .DB IDE0BASE ; IO BASE ADDRESS + .DB IDE0DATLO ; IO BASE ADDRESS + .DB IDE0DATHI ; IO BASE ADDRESS + .DW IDE_DEV0M ; PARTNER #ENDIF -#IF (IDE_DEVCNT >= 3) - ; DEVICE 2, SECONDARY MASTER - .DB 2 ; DRIVER DEVICE NUMBER +; +#IF (IDECNT >= 2) +; +IDE_DEV1M: ; DEVICE 1, MASTER + .DB 0 ; DRIVER DEVICE NUMBER + .DB IDE1MODE ; DRIVER DEVICE MODE + .DB 0 ; DEVICE STATUS + .DB 0 ; DEVICE TYPE + .DB IDE_ACC_MAS | (IDE1A8BIT & IDE_ACC_8BIT) ; UNIT ACCESS FLAGS + .DB 0 ; MEDIA FLAGS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA + .DB IDE1BASE ; IO BASE ADDRESS + .DB IDE1DATLO ; IO BASE ADDRESS + .DB IDE1DATHI ; IO BASE ADDRESS + .DW IDE_DEV1S ; PARTNER +; +IDE_DEV1S: ; DEVICE 1, SLAVE + .DB 0 ; DRIVER DEVICE NUMBER + .DB IDE1MODE ; DRIVER DEVICE MODE .DB 0 ; DEVICE STATUS .DB 0 ; DEVICE TYPE - .DB 0 ; FLAGS BYTE + .DB (IDE1B8BIT & IDE_ACC_8BIT) ; UNIT ACCESS FLAGS + .DB 0 ; MEDIA FLAGS .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA + .DB IDE1BASE ; IO BASE ADDRESS + .DB IDE1DATLO ; IO BASE ADDRESS + .DB IDE1DATHI ; IO BASE ADDRESS + .DW IDE_DEV1M ; PARTNER #ENDIF -#IF (IDE_DEVCNT >= 4) - ; DEVICE 2, SECONDARY SLAVE - .DB 3 ; DRIVER DEVICE NUMBER +; +#IF (IDECNT >= 3) +; +IDE_DEV2M: ; DEVICE 2, MASTER + .DB 0 ; DRIVER DEVICE NUMBER + .DB IDE2MODE ; DRIVER DEVICE MODE + .DB 0 ; DEVICE STATUS + .DB 0 ; DEVICE TYPE + .DB IDE_ACC_MAS | (IDE2A8BIT & IDE_ACC_8BIT) ; UNIT ACCESS FLAGS + .DB 0 ; MEDIA FLAGS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA + .DB IDE2BASE ; IO BASE ADDRESS + .DB IDE2DATLO ; IO BASE ADDRESS + .DB IDE2DATHI ; IO BASE ADDRESS + .DW IDE_DEV2S ; PARTNER +; +IDE_DEV2S: ; DEVICE 2, SLAVE + .DB 0 ; DRIVER DEVICE NUMBER + .DB IDE2MODE ; DRIVER DEVICE MODE .DB 0 ; DEVICE STATUS .DB 0 ; DEVICE TYPE - .DB 0 ; FLAGS BYTE + .DB (IDE2B8BIT & IDE_ACC_8BIT) ; UNIT ACCESS FLAGS + .DB 0 ; MEDIA FLAGS .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA + .DB IDE2BASE ; IO BASE ADDRESS + .DB IDE2DATLO ; IO BASE ADDRESS + .DB IDE2DATHI ; IO BASE ADDRESS + .DW IDE_DEV1M ; PARTNER #ENDIF ; #IF ($ - IDE_CFGTBL) != (IDE_DEVCNT * IDE_CFGSIZ) @@ -273,78 +311,87 @@ IDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS ;============================================================================= ; IDE_INIT: - CALL NEWLINE ; FORMATTING - PRTS("IDE:$") -; ; COMPUTE CPU SPEED COMPENSATED TIMEOUT SCALER - ; AT 1MHZ, THE SCALER IS 961 (50000US / 52TS = 961) - ; SCALER IS THEREFORE 961 * CPU SPEED IN MHZ + ; AT 1MHZ, THE SCALER IS 218 (50000US / 229TS = 218) + ; SCALER IS THEREFORE 218 * CPU SPEED IN MHZ LD DE,961 ; LOAD SCALER FOR 1MHZ LD A,(CB_CPUMHZ) ; LOAD CPU SPEED IN MHZ CALL MULT8X16 ; HL := DE * A LD (IDE_TOSCALER),HL ; SAVE IT ; -#IF (IDEMODE == IDEMODE_DIO) - PRTS(" MODE=DIO$") -#ENDIF -#IF (IDEMODE == IDEMODE_DIDE) - PRTS(" MODE=DIDE$") -#ENDIF -#IF (IDEMODE == IDEMODE_MK4) - PRTS(" MODE=MK4$") -#ENDIF - ; PRINT IDE INTERFACE PORT ADDRESS - PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS - LD A,IDE_IO_DATA ; GET IO ADDRESS - CALL PRTHEXBYTE ; PRINT IT -; -; - CALL IDE_DETECT ; CHECK FOR HARDWARE - JR Z,IDE_INIT00 ; CONTINUE IF PRESENT + XOR A ; ZERO ACCUM + LD (IDE_DEVNUM),A ; INIT DEV UNIT NUM FOR DYNAMIC ASSIGNMENT + LD IY,IDE_CFGTBL ; POINT TO START OF CONFIG TABLE ; - ; HARDWARE NOT PRESENT - PRTS(" NOT PRESENT$") - OR $FF ; SIGNAL FAILURE - RET +IDE_INIT1: + LD A,(IY) ; LOAD FIRST BYTE TO CHECK FOR END + CP $FF ; CHECK FOR END OF TABLE VALUE + JR NZ,IDE_INIT2 ; IF NOT END OF TABLE, CONTINUE + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN ; -IDE_INIT00: - ; PRINT UNIT COUNT - PRTS(" DEVICES=$") ; PRINT LABEL FOR DEVICE COUNT - LD A,IDE_DEVCNT ; GET UNIT COUNT - CALL PRTDECB ; PRINT IT IN DECIMAL +IDE_INIT2: + BIT 0,(IY+IDE_ACC) ; MASTER? + JR Z,IDE_INIT4 ; IF NOT MASTER, SKIP AHEAD ; -; SETUP THE DISPATCH TABLE ENTRIES + CALL NEWLINE ; FORMATTING + PRTS("IDE:$") ; LABEL FOR IO ADDRESS ; - LD B,IDE_DEVCNT ; LOOP CONTROL - LD IY,IDE_CFGTBL ; START OF CFG TABLE -IDE_INIT0: - PUSH BC ; SAVE LOOP CONTROL + PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS + LD A,(IY+IDE_IOBASE) ; GET IO BASE ADDRES + CALL PRTHEXBYTE ; DISPLAY IT +; + PRTS(" MODE=$") ; LABEL FOR MODE + LD A,(IY+IDE_MODE) ; GET MODE BITS + LD DE,IDE_STR_MODE_DIO ; MODE LABEL + CP IDEMODE_DIO ; TEST FOR MODE + JR Z,IDE_INIT2A ; IF SO, DISPLAY IT + LD DE,IDE_STR_MODE_DIDE ; MODE LABEL + CP IDEMODE_DIDE ; TEST FOR MODE + JR Z,IDE_INIT2A ; IF SO, DISPLAY IT + LD DE,IDE_STR_MODE_MK4 ; MODE LABEL + CP IDEMODE_MK4 ; TEST FOR MODE + JR Z,IDE_INIT2A ; IF SO, DISPLAY IT + LD DE,IDE_STR_MODE_RC ; MODE LABEL + CP IDEMODE_RC ; TEST FOR MODE + JR Z,IDE_INIT2A ; IF SO, DISPLAY IT + JR IDE_INIT4 ; NO MODE? BYPASS ENTRY +IDE_INIT2A: + CALL WRITESTR ; DISPLAY MODE +; + CALL IDE_DETECT ; PROBE FOR INTERFACE + JR Z,IDE_INIT3 ; GOT IT, MOVE ON TO INIT UNITS + CALL PC_SPACE ; FORMATTING + LD DE,IDE_STR_NOHW ; NOT PRESENT MESSAGE + CALL WRITESTR ; DISPLAY IT + JR IDE_INIT4 ; SKIP CFG ENTRY +; +IDE_INIT3: + CALL IDE_RESET ; RESET THE BUS + CALL IDE_INIT5 ; DETECT/INIT MASTER + PUSH IY ; SAVE CFG PTR + CALL IDE_GOPARTNER ; SWITCH IY TO PARTNER CFG + CALL IDE_INIT5 ; DETECT/INIT SLAVE + POP IY ; RESTORE CFG PTR +; +IDE_INIT4: + LD DE,IDE_CFGSIZ ; SIZE OF CFG TABLE ENTRY + ADD IY,DE ; BUMP POINTER + JP IDE_INIT1 ; AND LOOP +; +IDE_INIT5: + ; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE + LD A,(IDE_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN + LD (IY+IDE_DEV),A ; UPDATE IT + INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN + LD (IDE_DEVNUM),A ; SAVE IT +; + ; ADD UNIT TO GLOBAL DISK UNIT TABLE LD BC,IDE_FNTBL ; BC := FUNC TABLE ADR PUSH IY ; CFG ENTRY POINTER POP DE ; COPY TO DE - CALL DIO_ADDENT ; ADD ENTRY, BC IS NOT DESTROYED - LD BC,IDE_CFGSIZ ; SIZE OF CFG ENTRY - ADD IY,BC ; BUMP IY TO NEXT ENTRY - POP BC ; RESTORE BC - DJNZ IDE_INIT0 ; LOOP AS NEEDED -; - ; INITIALIZE THE IDE INTERFACE NOW - CALL IDE_RESET ; DO HARDWARE SETUP/INIT - RET NZ ; ABORT IF RESET FAILS -; - ; DEVICE DISPLAY LOOP - LD B,IDE_DEVCNT ; LOOP ONCE PER DEVICE - LD IY,IDE_CFGTBL ; START OF CFG TABLE -IDE_INIT1: - PUSH BC ; SAVE LOOP CONTROL - CALL IDE_INIT2 ; DISPLAY UNIT INFO - LD BC,IDE_CFGSIZ ; SIZE OF CFG ENTRY - ADD IY,BC ; BUMP IY TO NEXT ENTRY - POP BC ; RESTORE LOOP CONTROL - DJNZ IDE_INIT1 ; LOOP UNTIL DONE - RET ; DONE + CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE ; -IDE_INIT2: ; CHECK FOR BAD STATUS LD A,(IY+IDE_STAT) ; GET STATUS OR A ; SET FLAGS @@ -352,13 +399,13 @@ IDE_INIT2: ; CALL IDE_PRTPREFIX ; PRINT DEVICE PREFIX ; -#IF (IDE8BIT) - PRTS(" 8BIT$") -#ENDIF + LD DE,IDE_STR_8BIT + BIT 1,(IY+IDE_ACC) ; 8 BIT ACCESS? + CALL NZ,WRITESTR ; ; PRINT LBA/NOLBA CALL PC_SPACE ; FORMATTING - BIT 1,(IY+IDE_FLAGS) ; TEST LBA FLAG + BIT 1,(IY+IDE_MED) ; TEST LBA FLAG LD DE,IDE_STR_NO ; POINT TO "NO" STRING CALL Z,WRITESTR ; PRINT "NO" BEFORE "LBA" IF LBA NOT SUPPORTED PRTS("LBA$") ; PRINT "LBA" REGARDLESS @@ -377,8 +424,7 @@ IDE_INIT2: CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED) PRTS("MB$") ; PRINT SUFFIX ; - XOR A ; SIGNAL SUCCESS - RET ; RETURN WITH A=0, AND Z SET + RET ; ;---------------------------------------------------------------------- ; PROBE FOR IDE HARDWARE @@ -388,8 +434,11 @@ IDE_INIT2: ; IDE_DETECT: ; -#IF (IDEMODE == IDEMODE_DIDE) -#ENDIF +;#IF (IDEMODE == IDEMODE_DIDE) +;#ENDIF +;; +;#IF (IDEMODE == IDEMODE_DIO) +;#ENDIF ; XOR A ; SIGNAL SUCCESS RET ; AND RETURN @@ -451,7 +500,7 @@ IDE_IO: #ENDIF PUSH BC ; SAVE COUNTERS CALL IDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT - CALL IDE_CHKDEVICE ; CHECK DEVICE AND CLEAR STATUS + CALL IDE_CHKERR ; CHECK FOR ERR STATUS AND RESET IF SO POP BC ; RESTORE COUNTERS JR NZ,IDE_IO3 ; BAIL OUT ON ERROR IDE_IO1: @@ -492,7 +541,7 @@ IDE_STATUS: IDE_DEVICE: LD D,DIODEV_IDE ; D := DEVICE TYPE LD E,(IY+IDE_DEV) ; E := PHYSICAL DEVICE NUMBER - BIT 0,(IY+IDE_FLAGS) ; TEST CF BIT IN FLAGS + BIT 0,(IY+IDE_MED) ; TEST CF BIT IN FLAGS LD C,%00000000 ; ASSUME NON-REMOVABLE HARD DISK JR Z,IDE_DEVICE1 ; IF Z, WE ARE DONE LD C,%01001000 ; OTHERWISE REMOVABLE COMPACT FLASH @@ -582,11 +631,15 @@ IDE_SETFEAT: PRTS(" SETFEAT$") #ENDIF LD A,(IDE_DRVHD) - OUT (IDE_IO_DRVHD),A + ;OUT (IDE_IO_DRVHD),A + CALL IDE_OUT + .DB IDE_REG_DRVHD DCALL PC_SPACE DCALL PRTHEXBYTE POP AF - OUT (IDE_IO_FEAT),A ; SET THE FEATURE VALUE + ;OUT (IDE_IO_FEAT),A ; SET THE FEATURE VALUE + CALL IDE_OUT + .DB IDE_REG_FEAT DCALL PC_SPACE DCALL PRTHEXBYTE LD A,IDE_CIDE_SETFEAT ; CMD = SETFEAT @@ -601,7 +654,9 @@ IDE_IDENTIFY: PRTS(" IDDEV$") #ENDIF LD A,(IDE_DRVHD) - OUT (IDE_IO_DRVHD),A + ;OUT (IDE_IO_DRVHD),A + CALL IDE_OUT + .DB IDE_REG_DRVHD DCALL PC_SPACE DCALL PRTHEXBYTE LD A,IDE_CIDE_IDDEV @@ -620,7 +675,9 @@ IDE_RDSEC: PRTS(" READ$") #ENDIF LD A,(IDE_DRVHD) - OUT (IDE_IO_DRVHD),A + ;OUT (IDE_IO_DRVHD),A + CALL IDE_OUT + .DB IDE_REG_DRVHD DCALL PC_SPACE DCALL PRTHEXBYTE CALL IDE_SETADDR ; SETUP CYL, TRK, HEAD @@ -640,7 +697,9 @@ IDE_WRSEC: PRTS(" WRITE$") #ENDIF LD A,(IDE_DRVHD) - OUT (IDE_IO_DRVHD),A + ;OUT (IDE_IO_DRVHD),A + CALL IDE_OUT + .DB IDE_REG_DRVHD DCALL PC_SPACE DCALL PRTHEXBYTE CALL IDE_SETADDR ; SETUP CYL, TRK, HEAD @@ -657,33 +716,29 @@ IDE_SETADDR: ; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER ; IDE_IO_LBA3 HAS ALREADY BEEN SET ; HSTLBA2-0 --> IDE_IO_LBA2-0 - LD C,IDE_IO_LBA0 + 3 ; STARTING IO PORT (NOT PRE-DEC BELOW) - LD A,IDE_LBA + 2 ; OFFSET OF 3RD BYTE OF LBA IN CFG - CALL LDHLIYA ; HL := IY + A, REG A TRASHED - LD B,3 ; SEND 3 BYTES -IDE_SETADDR1: -; -#IF (IDETRACE >= 3) - LD A,(HL) - CALL PC_SPACE - CALL PRTHEXBYTE -#ENDIF -; - DEC C ; NEXT PORT - OUTD ; SEND NEXT BYTE - JR NZ,IDE_SETADDR1 ; LOOP TILL DONE + LD A,(IY+IDE_LBA+2) + DCALL PC_SPACE + DCALL PRTHEXBYTE + CALL IDE_OUT + .DB IDE_REG_LBA2 ; - ; SEND COUNT OF BLOCKS TO TRANSFER - ; 1 --> IDE_IO_COUNT - LD A,1 ; COUNT VALUE IS 1 BLOCK + LD A,(IY+IDE_LBA+1) + DCALL PC_SPACE + DCALL PRTHEXBYTE + CALL IDE_OUT + .DB IDE_REG_LBA1 ; -#IF (IDETRACE >= 3) + LD A,(IY+IDE_LBA+0) DCALL PC_SPACE DCALL PRTHEXBYTE -#ENDIF + CALL IDE_OUT + .DB IDE_REG_LBA0 ; - DEC C ; PORT := IDE_IO_COUNT - OUT (C),A ; SEND IT + LD A,1 + DCALL PC_SPACE + DCALL PRTHEXBYTE + CALL IDE_OUT + .DB IDE_REG_COUNT ; #IF (DSKYENABLE) CALL IDE_DSKY @@ -702,7 +757,9 @@ IDE_RUNCMD: LD A,(IDE_CMD) ; GET THE COMMAND DCALL PC_SPACE DCALL PRTHEXBYTE - OUT (IDE_IO_CMD),A ; SEND IT (STARTS EXECUTION) + ;OUT (IDE_IO_CMD),A ; SEND IT (STARTS EXECUTION) + CALL IDE_OUT + .DB IDE_REG_CMD #IF (IDETRACE >= 3) PRTS(" -->$") #ENDIF @@ -720,79 +777,116 @@ IDE_GETBUF: #IF (IDETRACE >= 3) PRTS(" GETBUF$") #ENDIF - +; CALL IDE_WAITDRQ ; WAIT FOR BUFFER READY RET NZ ; BAIL OUT IF TIMEOUT - +; LD B,0 - -#IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE)) - LD C,IDE_IO_DATA - INIR - INIR -;X1: -; NOP -; INI -; JR NZ,X1 -;X2: -; NOP -; INI -; JR NZ,X2 -#ELSE - LD C,IDE_IO_DATAHI +; + BIT 1,(IY+IDE_ACC) ; 8 BIT? + JR Z,IDE_GETBUF1 ; IF NOT, DO 16 BIT + CALL IDE_GETBUF8 ; DO 8 BIT + JR IDE_GETBUF2 +; IDE_GETBUF1: - IN A,(IDE_IO_DATALO) ; READ THE LO BYTE - LD (HL),A ; SAVE IN BUFFER - INC HL ; INC BUFFER POINTER - INI ; READ AND SAVE HI BYTE, INC HL, DEC B - JP NZ,IDE_GETBUF1 ; LOOP AS NEEDED -#ENDIF + CALL IDE_GETBUF16 +; +IDE_GETBUF2: CALL IDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED! CALL IDE_GETRES JP NZ,IDE_IOERR RET ; +IDE_GETBUF8: + ; 8 BIT I/O + ;LD C,IDE_IO_DATA + LD C,(IY+IDE_IOBASE) + INIR + INIR + RET +; +IDE_GETBUF16: + ; 16 BIT I/O + ;LD C,IDE_IO_DATAHI + LD D,(IY+IDE_DATALO) + LD E,(IY+IDE_DATAHI) + CALL IDE_GETBUF16A ; GET FIRST 256 BYTES + CALL IDE_GETBUF16A ; GET SECOND 256 BYTES + RET +; +IDE_GETBUF16A: + LD C,D ; PORT FOR LSB + INI ; GET IT, SAVE IT, AND DEC B + LD C,E ; PORT FOR MSB + INI ; GET IT, SAVE IT, AND DEC B + JR NZ,IDE_GETBUF16A ; LOOP TILL COUNTER EXHAUSTED + RET +; ; ; IDE_PUTBUF: #IF (IDETRACE >= 3) - PRTS(" GETBUF$") + PRTS(" PUTBUF$") #ENDIF - +; CALL IDE_WAITDRQ ; WAIT FOR BUFFER READY RET NZ ; BAIL OUT IF TIMEOUT ; - ;LD HL,(IDE_DSKBUF) LD B,0 - -#IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE)) - LD C,IDE_IO_DATA - OTIR - OTIR -#ELSE - LD C,IDE_IO_DATAHI +; + BIT 1,(IY+IDE_ACC) ; 8 BIT? + JR Z,IDE_PUTBUF1 ; IF NOT, DO 16 BIT + CALL IDE_PUTBUF8 ; DO 8 BIT + JR IDE_PUTBUF2 +; IDE_PUTBUF1: - LD A,(HL) ; GET THE LO BYTE AND KEEP IT IN A FOR LATER - INC HL ; BUMP TO NEXT BYTE IN BUFFER - OUTI ; WRITE HI BYTE, INC HL, DEC B - OUT (IDE_IO_DATALO),A ; NOW WRITE THE SAVED LO BYTE TO LO BYTE - JP NZ,IDE_PUTBUF1 ; LOOP AS NEEDED -#ENDIF + CALL IDE_PUTBUF16 +; +IDE_PUTBUF2: CALL IDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED! CALL IDE_GETRES JP NZ,IDE_IOERR RET ; +IDE_PUTBUF8: + ; 8 BIT I/O + ;LD C,IDE_IO_DATA + LD C,(IY+IDE_IOBASE) + OTIR + OTIR + RET +; +IDE_PUTBUF16: + ; 16 BIT I/O + ;LD C,IDE_IO_DATAHI + LD D,(IY+IDE_DATALO) + LD E,(IY+IDE_DATAHI) + CALL IDE_PUTBUF16A ; PUT FIRST 256 BYTES + CALL IDE_PUTBUF16A ; PUT SECOND 256 BYTES + RET +; +IDE_PUTBUF16A: + LD C,D ; PORT FOR LSB + OUTI ; PUT IT AND DEC B + LD C,E ; PORT FOR MSB + OUTI ; PUT IT AND DEC B + JR NZ,IDE_PUTBUF16A ; LOOP TILL COUNTER EXHAUSTED + RET +; ; ; IDE_GETRES: - IN A,(IDE_IO_STAT) ; GET STATUS + ;IN A,(IDE_IO_STAT) ; GET STATUS + CALL IDE_IN + .DB IDE_REG_STAT DCALL PC_SPACE DCALL PRTHEXBYTE AND %00000001 ; ERROR BIT SET? RET Z ; NOPE, RETURN WITH ZF ; - IN A,(IDE_IO_ERR) ; READ ERROR REGISTER + ;IN A,(IDE_IO_ERR) ; READ ERROR REGISTER + CALL IDE_IN + .DB IDE_REG_ERR DCALL PC_SPACE DCALL PRTHEXBYTE OR $FF ; FORCE NZ TO SIGNAL ERROR @@ -805,44 +899,102 @@ IDE_GETRES: ; RESET ALL DEVICES ON BUS ; IDE_RESET: +#IF (IDETRACE >= 3) + CALL IDE_PRTPREFIX + PRTS(" RESET$") +#ENDIF +; +;#IF (IDEMODE == IDEMODE_MK4) +; + LD A,(IY+IDE_MODE) ; GET MODE + CP IDEMODE_MK4 ; MK4? + JR NZ,IDE_RESET1 ; IF NOT, BYPASS ; -#IF (IDEMODE == IDEMODE_MK4) ; USE HARDWARE RESET LINE + PRTS(" HARD$") LD A,$80 ; HIGH BIT OF XAR IS IDE RESET - OUT (IDE_XAR),A + ;OUT (IDE_IO_XAR),A + CALL IDE_OUT + .DB IDE_REG_XAR LD DE,2 ; DELAY 32US (SPEC IS >= 25US) CALL VDELAY XOR A ; CLEAR RESET BIT - OUT (IDE_XAR),A -#ENDIF - -#IF ((IDEMODE == IDEMODE_RC) | (IDEMODE == IDEMODE_SMB)) + ;OUT (IDE_IO_XAR),A + CALL IDE_OUT + .DB IDE_REG_XAR +; +IDE_RESET1: +; +;#ENDIF +; +;#IF (IDEMODE == IDEMODE_RC) +; + LD A,(IY+IDE_MODE) ; GET MODE + CP IDEMODE_RC ; RC2014? + JR NZ,IDE_RESET2 ; IF NOT, BYPASS +; ; RC2014 CANNOT ADDRESS THE DEVICE CONTROL PORT AND ; HAS NO WAY TO PERFORM A HARD RESET FROM SOFTWARE, ; SO FAKE IT BY SETTING THE REGISTERS TO THE SAME ; VALUES THAT A RESET WOULD CAUSE. + PRTS(" FAKE$") XOR A - OUT (IDE_IO_CYLLO),A - OUT (IDE_IO_CYLHI),A + ;OUT (IDE_IO_CYLLO),A + CALL IDE_OUT + .DB IDE_REG_CYLLO + ;OUT (IDE_IO_CYLHI),A + CALL IDE_OUT + .DB IDE_REG_CYLHI INC A - OUT (IDE_IO_COUNT),A - OUT (IDE_IO_SECT),A -#ENDIF - -#IF ((IDEMODE != IDEMODE_MK4) & (IDEMODE != IDEMODE_RC) & (IDEMODE != IDEMODE_SMB)) + ;OUT (IDE_IO_COUNT),A + CALL IDE_OUT + .DB IDE_REG_COUNT + ;OUT (IDE_IO_SECT),A + CALL IDE_OUT + .DB IDE_REG_SECT +; +IDE_RESET2: +; +;#ENDIF +; +;#IF ((IDEMODE != IDEMODE_MK4) & (IDEMODE != IDEMODE_RC)) +; + LD A,(IY+IDE_MODE) ; GET MODE + CP IDEMODE_MK4 ; MK4? + JR Z,IDE_RESET3 ; IF SO, BYPASS + CP IDEMODE_RC ; RC2014? + JR Z,IDE_RESET3 ; IF SO, BYPASS +; ; INITIATE SOFT RESET + PRTS(" SOFT$") LD A,%00001110 ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES - OUT (IDE_IO_CTRL),A -#ENDIF + ;OUT (IDE_IO_CTRL),A + CALL IDE_OUT + .DB IDE_REG_CTRL +; +IDE_RESET3: +; +;#ENDIF ; LD DE,2 ; DELAY 32US (SPEC IS >= 25US) CALL VDELAY ; -#IF ((IDEMODE != IDEMODE_RC) & (IDEMODE != IDEMODE_SMB)) +;#IF (IDEMODE != IDEMODE_RC) +; + LD A,(IY+IDE_MODE) ; GET MODE + CP IDEMODE_RC ; RC2014? + JR Z,IDE_RESET4 ; IF SO, BYPASS +; ; CONFIGURE OPERATION AND END SOFT RESET + PRTS(" CONFIG$") LD A,%00001010 ; NO INTERRUPTS, DEASSERT RESET - OUT (IDE_IO_CTRL),A ; PUSH TO REGISTER -#ENDIF + ;OUT (IDE_IO_CTRL),A ; PUSH TO REGISTER + CALL IDE_OUT + .DB IDE_REG_CTRL +; +IDE_RESET4: +; +;#ENDIF ; ; SPEC ALLOWS UP TO 450MS FOR DEVICES TO ASSERT THEIR PRESENCE ; VIA -DASP. I ENCOUNTER PROBLEMS LATER ON IF I DON'T WAIT HERE @@ -854,28 +1006,16 @@ IDE_RESET: LD DE,150000/16 ; ~???MS CALL VDELAY ; - ;; CLEAR OUT ALL DATA (FOR ALL UNITS) - ;LD HL,IDE_UDATA - ;LD BC,IDE_UDLEN - ;XOR A - ;CALL FILL -; - ;LD A,(IDE_UNIT) ; GET THE CURRENT UNIT SELECTION - ;PUSH AF ; AND SAVE IT - PUSH IY ; SAVE CURRENT DEVICE CFG PTR - - ; PROBE / INITIALIZE ALL UNITS - LD B,IDE_DEVCNT ; NUMBER OF UNITS TO TRY - LD IY,IDE_CFGTBL ; START OF CFG TABLE -IDE_RESET1: - PUSH BC ; SAVE LOOP CONTROL - CALL IDE_INITUNIT ; PROBE/INIT UNIT - LD BC,IDE_CFGSIZ ; SIZE OF CFG ENTRY - ADD IY,BC ; BUMP IY TO NEXT ENTRY - POP BC ; RESTORE BC - DJNZ IDE_RESET1 ; LOOP AS NEEDED -; - POP IY ; RECOVER DEVICE CFG PTR + ; INITIALIZE THE INDIVIDUAL UNITS (MASTER AND SLAVE). + ; BASED ON TESTING, IT APPEARS THAT THE MASTER UNIT MUST + ; BE DONE FIRST OR THIS BEHAVES BADLY. + PUSH IY ; SAVE CFG PTR + BIT 0,(IY+IDE_ACC) ; MASTER? + CALL Z,IDE_GOPARTNER ; IF NOT, SWITCH TO MASTER + CALL IDE_INITUNIT ; INIT CURRENT UNIT + CALL IDE_GOPARTNER ; POINT TO SLAVE + CALL IDE_INITUNIT ; INIT PARTNER UNIT + POP IY ; RECOVER ORIG CFG PTR ; XOR A ; SIGNAL SUCCESS RET ; AND DONE @@ -886,19 +1026,14 @@ IDE_INITUNIT: CALL IDE_SELUNIT ; SELECT UNIT RET NZ ; ABORT IF ERROR - ;LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT - ;LD (HL),IDE_TOFAST ; USE FAST TIMEOUT DURING INIT - LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT LD (HL),IDE_TONORM ; SET NORMAL TIMEOUT CALL IDE_PROBE ; DO PROBE - CALL Z,IDE_INITDEV ; IF FOUND, ATTEMPT TO INIT DEVICE - - ;LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT - ;LD (HL),IDE_TONORM ; BACK TO NORMAL TIMEOUT + RET NZ ; JUST RETURN IF NOTHING THERE - RET + CALL IDE_INITDEV ; IF FOUND, ATTEMPT TO INIT DEVICE + RET ; DONE ; ; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT ; UNIT IS SPECIFIED IN IDE_UNIT @@ -910,22 +1045,16 @@ IDE_SELUNIT: PRTS(" SELUNIT$") #ENDIF ; -#IF (IDEMODE == IDEMODE_DIDE) - ; SELECT PRIMARY/SECONDARY INTERFACE FOR DIDE HARDWARE -#ENDIF - PUSH HL ; SAVE HL, IT IS DESTROYED BELOW - PUSH IY - POP BC - LD A,(IY+IDE_DEV) ; GET DEVICE - AND $01 ; LS BIT DETERMINES MASTER/SLAVE - LD HL,IDE_DRVSEL - CALL ADDHLA - LD A,(HL) ; LOAD DRIVE/HEAD VALUE - POP HL ; RECOVER HL + BIT 0,(IY+IDE_ACC) ; MASTER? + JR Z,IDE_SELUNIT1 ; HANDLE SLAVE + LD A,IDE_DRVMASTER ; MASTER + JR IDE_SELUNIT2 +IDE_SELUNIT1: + LD A,IDE_DRVSLAVE ; SLAVE +IDE_SELUNIT2: LD (IDE_DRVHD),A ; SAVE IT -; - XOR A ; SIGNAL SUCCESS - RET ; AND DONE + XOR A ; SUCCESS + RET ; ; ; @@ -936,14 +1065,18 @@ IDE_PROBE: #ENDIF ; LD A,(IDE_DRVHD) - OUT (IDE_IO_DRVHD),A + ;OUT (IDE_IO_DRVHD),A + CALL IDE_OUT + .DB IDE_REG_DRVHD DCALL PC_SPACE DCALL PRTHEXBYTE CALL DELAY ; DELAY ~16US ; - LD C,IDE_IO_STAT - IN A,(C) + ;LD C,IDE_IO_STAT + ;IN A,(C) + CALL IDE_IN + .DB IDE_REG_STAT DCALL PC_SPACE DCALL PRTHEXBYTE CP $FF @@ -962,7 +1095,9 @@ IDE_PROBE0: DCALL IDE_REGDUMP ; ; CHECK STATUS - IN A,(IDE_IO_STAT) ; GET STATUS + ;IN A,(IDE_IO_STAT) ; GET STATUS + CALL IDE_IN + .DB IDE_REG_STAT DCALL PC_SPACE DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS OR A ; SET FLAGS TO TEST FOR ZERO @@ -970,22 +1105,30 @@ IDE_PROBE0: ; ; CHECK SIGNATURE DCALL PC_SPACE - IN A,(IDE_IO_COUNT) + ;IN A,(IDE_IO_COUNT) + CALL IDE_IN + .DB IDE_REG_COUNT DCALL PRTHEXBYTE CP $01 JP NZ,IDE_NOMEDIA DCALL PC_SPACE - IN A,(IDE_IO_SECT) + ;IN A,(IDE_IO_SECT) + CALL IDE_IN + .DB IDE_REG_SECT DCALL PRTHEXBYTE CP $01 JP NZ,IDE_NOMEDIA DCALL PC_SPACE - IN A,(IDE_IO_CYLLO) + ;IN A,(IDE_IO_CYLLO) + CALL IDE_IN + .DB IDE_REG_CYLLO DCALL PRTHEXBYTE CP $00 JP NZ,IDE_NOMEDIA DCALL PC_SPACE - IN A,(IDE_IO_CYLHI) + ;IN A,(IDE_IO_CYLHI) + CALL IDE_IN + .DB IDE_REG_CYLHI DCALL PRTHEXBYTE CP $00 JP NZ,IDE_NOMEDIA @@ -1005,33 +1148,21 @@ IDE_INITDEV: OR A ; SET FLAGS JP Z,IDE_NOMEDIA ; EXIT SETTING NO MEDIA STATUS ; - ; CLEAR OUT UNIT SPECIFIC DATA, BUT PRESERVE THE EXISTING - ; VALUE OF THE UNIT TYPE WHICH WAS ESTABLISHED BY THE DEVICE - ; PROBES WHEN THE IDE BUS WAS RESET - ;PUSH AF ; SAVE UNIT TYPE VALUE FROM ABOVE - ;PUSH HL ; SAVE UNIT TYPE FIELD POINTER - ;IDE_DPTR(0) ; SET HL TO START OF UNIT DATA - ;LD BC,IDE_UDLEN - ;XOR A - ;CALL FILL - ;POP HL ; RECOVER UNIT TYPE FIELD POINTER - ;POP AF ; RECOVER UNIT TYPE VALUE - ;LD (HL),A ; AND PUT IT BACK -; -#IF (IDE8BIT) + BIT 1,(IY+IDE_ACC) ; 8 BIT ACCESS? + JR Z,IDE_INITDEV0 ; NO, DO 16 BIT INIT LD A,IDE_FEAT_ENABLE8BIT ; FEATURE VALUE = ENABLE 8-BIT PIO -#ELSE - LD A,IDE_FEAT_DISABLE8BIT ; FEATURE VALUE = DISABLE 8-BIT PIO -#ENDIF - CALL IDE_SETFEAT ; SET FEATURE - -#IF (IDE8BIT) + RET NZ ; BAIL OUT ON ERROR + JR IDE_INITDEV00 ; CONTINUE +; +IDE_INITDEV0: ; "REAL" IDE DRIVES MAY NOT ACCEPT THE DISABLE8BIT FEATURE COMMAND, ; SO IT IS ONLY AN ERROR IF WE ARE ATTEMPTING TO ENABLE8BIT. - ; CREDIT TO ED BRINDLEY FOR THIS CORRECTION. - RET NZ ; BAIL OUT ON ERROR -#ENDIF + ; CREDIT TO ED BRINDLEY FOR THIS CORRECTION. SO ERROR RETURN IGNORED HERE. + LD A,IDE_FEAT_DISABLE8BIT ; FEATURE VALUE = ENABLE 8-BIT PIO + CALL IDE_SETFEAT ; SET FEATURE, IGNORE ERRORS +; +IDE_INITDEV00: ; CALL IDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND RET NZ ; BAIL OUT ON ERROR @@ -1040,7 +1171,7 @@ IDE_INITDEV: DCALL DUMP_BUFFER ; DUMP IT IF DEBUGGING ; XOR A - LD (IY+IDE_FLAGS),0 ; CLEAR FLAGS + LD (IY+IDE_MED),0 ; CLEAR FLAGS ; DETERMINE IF CF DEVICE LD HL,HB_WRKBUF ; FIRST WORD OF IDENTIFY DATA HAS CF FLAG @@ -1051,14 +1182,14 @@ IDE_INITDEV: LD A,$84 ; SECOND BYTE OF MARKER IS $84 CP (HL) ; COMPARE JR NZ,IDE_INITDEV1 ; IF NOT MATCH, NOT CF - SET 0,(IY+IDE_FLAGS) ; SET FLAGS BIT FOR CF MEDIA + SET 0,(IY+IDE_MED) ; SET FLAGS BIT FOR CF MEDIA ; IDE_INITDEV1: ; DETERMINE IF LBA CAPABLE LD A,(HB_WRKBUF+98+1) ; GET BYTE WITH LBA BIT FROM BUFFER BIT 1,A ; CHECK THE LBA BIT JR Z,IDE_INITDEV2 ; NOT SET, BYPASS - SET 1,(IY+IDE_FLAGS) ; SET FLAGS BIT FOR LBA + SET 1,(IY+IDE_MED) ; SET FLAGS BIT FOR LBA ; IDE_INITDEV2: ; GET DEVICE CAPACITY AND SAVE IT @@ -1078,15 +1209,24 @@ IDE_INITDEV2: ; RET ; RETURN, A=0, Z SET ; +; SWITCH IY POINTER FROM CURRENT UNIT CFG TO PARTNER UNIT CFG ; +IDE_GOPARTNER: + PUSH HL ; SAVE HL + LD L,(IY+IDE_PARTNER) ; GET PARTNER ENTRY + LD H,(IY+IDE_PARTNER+1) ; ... + PUSH HL ; MOVE HL + POP IY ; ... TO IY + POP HL ; RESTORE INCOMING HL + RET ; AND DONE +; +; CHECK CURRENT DEVICE FOR ERROR STATUS AND ATTEMPT TO RECOVER +; VIA RESET IF DEVICE IS IN ERROR. ; -IDE_CHKDEVICE: +IDE_CHKERR: LD A,(IY+IDE_STAT) ; GET STATUS OR A ; SET FLAGS - RET Z ; RETURN IF ALL IS WELL -; - ; ATTEMPT TO REINITIALIZE HERE??? - JP IDE_ERR + CALL NZ,IDE_RESET ; IF ERROR STATUS, RESET BUS RET ; ; @@ -1097,7 +1237,9 @@ IDE_WAITRDY: IDE_WAITRDY1: LD DE,(IDE_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR IDE_WAITRDY2: - IN A,(IDE_IO_STAT) ; READ STATUS + ;IN A,(IDE_IO_STAT) ; READ STATUS + CALL IDE_IN + .DB IDE_REG_STAT LD C,A ; SAVE IT AND %11000000 ; ISOLATE BUSY AND RDY BITS XOR %01000000 ; WE WANT BUSY(7) TO BE 0 AND RDY(6) TO BE 1 @@ -1117,7 +1259,9 @@ IDE_WAITDRQ: IDE_WAITDRQ1: LD DE,(IDE_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR IDE_WAITDRQ2: - IN A,(IDE_IO_STAT) ; WAIT FOR DRIVE'S 512 BYTE READ BUFFER + ;IN A,(IDE_IO_STAT) ; WAIT FOR DRIVE'S 512 BYTE READ BUFFER + CALL IDE_IN + .DB IDE_REG_STAT LD C,A ; SAVE IT AND %10001000 ; TO FILL (OR READY TO FILL) XOR %00001000 @@ -1137,7 +1281,9 @@ IDE_WAITBSY: IDE_WAITBSY1: LD DE,(IDE_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR IDE_WAITBSY2: - IN A,(IDE_IO_STAT) ; WAIT FOR DRIVE'S 512 BYTE READ BUFFER ; 11TS + ;IN A,(IDE_IO_STAT) ; WAIT FOR DRIVE'S 512 BYTE READ BUFFER ; 11TS + CALL IDE_IN ; 17TS + ???TS + .DB IDE_REG_STAT ; 0TS LD C,A ; SAVE IT ; 4TS AND %10000000 ; TO FILL (OR READY TO FILL) ; 7TS RET Z ; 5TS @@ -1146,7 +1292,39 @@ IDE_WAITBSY2: OR E ; 4TS JR NZ,IDE_WAITBSY2 ; 12TS DJNZ IDE_WAITBSY1 ; ----- - JP IDE_BSYTO ; EXIT WITH BSYTO ERR ; 52TS + JP IDE_BSYTO ; EXIT WITH BSYTO ERR ; ??TS +; +; READ A VALUE FROM THE DEVICE POINTED TO BY IY AND RETURN IT IN A +; +IDE_IN: + EX (SP),HL ; GET PARM POINTER + PUSH BC + LD A,(HL) + INC HL + LD C,(IY+IDE_IOBASE) + ADD A,C + LD C,A + IN A,(C) + POP BC + EX (SP),HL ; RESTORE STACK + RET +; +; OUTPUT VALUE IN A TO THE DEVICE POINTED TO BY IY +; +IDE_OUT: + EX (SP),HL ; GET PARM POINTER + PUSH BC + PUSH AF + LD A,(HL) + INC HL + LD C,(IY+IDE_IOBASE) + ADD A,C + LD C,A + POP AF + OUT (C),A + POP BC + EX (SP),HL ; RESTORE STACK + RET ; ;============================================================================= ; ERROR HANDLING AND DIAGNOSTICS @@ -1252,7 +1430,10 @@ IDE_REGDUMP: PUSH BC CALL PC_SPACE CALL PC_LBKT - LD C,IDE_IO_CMD + ;LD C,IDE_IO_CMD + LD A,(IY+IDE_IOBASE) + ADD A,IDE_REG_CMD + LD C,A LD B,7 IDE_REGDUMP1: IN A,(C) @@ -1284,16 +1465,20 @@ IDE_PRTPREFIX: #IF (DSKYENABLE) IDE_DSKY: LD HL,DSKY_HEXBUF ; POINT TO DSKY BUFFER - IN A,(IDE_IO_DRVHD) ; GET DRIVE/HEAD + CALL IDE_IN + .DB IDE_REG_DRVHD LD (HL),A ; SAVE IN BUFFER INC HL ; INCREMENT BUFFER POINTER - IN A,(IDE_IO_CYLHI) ; GET DRIVE/HEAD + CALL IDE_IN + .DB IDE_REG_CYLHI LD (HL),A ; SAVE IN BUFFER INC HL ; INCREMENT BUFFER POINTER - IN A,(IDE_IO_CYLLO) ; GET DRIVE/HEAD + CALL IDE_IN + .DB IDE_REG_CYLLO LD (HL),A ; SAVE IN BUFFER INC HL ; INCREMENT BUFFER POINTER - IN A,(IDE_IO_SECT) ; GET DRIVE/HEAD + CALL IDE_IN + .DB IDE_REG_SECT LD (HL),A ; SAVE IN BUFFER CALL DSKY_HEXOUT ; SEND IT TO DSKY RET @@ -1314,6 +1499,13 @@ IDE_STR_STBSYTO .TEXT "BUSY TIMEOUT$" IDE_STR_STUNK .TEXT "UNKNOWN ERROR$" ; IDE_STR_NO .TEXT "NO$" +IDE_STR_NOHW .TEXT "NOT PRESENT$" +IDE_STR_8BIT .TEXT " 8-BIT$" +; +IDE_STR_MODE_DIO .TEXT "DIO$" +IDE_STR_MODE_DIDE .TEXT "DIDE$" +IDE_STR_MODE_MK4 .TEXT "MK4$" +IDE_STR_MODE_RC .TEXT "RC$" ; ;============================================================================= ; DATA STORAGE @@ -1327,3 +1519,5 @@ IDE_IOFNADR .DW 0 ; PENDING IO FUNCTION ADDRESS IDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK ; IDE_DSKBUF .DW 0 ; ACTIVE DISK BUFFER +; +IDE_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index fc964390..3cb48b86 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -4,8 +4,8 @@ ;============================================================================= ; ; TODO: -; - IMPLEMENT INTELLIGENT RESET, CHECK IF DEVICE IS ACTUALLY BROKEN BEFORE RESET ; - FIX SCALER CONSTANT +; - GOPARTNER NEEDS TO HANDLE "NO PARTNER" CONDITION ; ; NOTES: ; - WELL KNOWN PPIDE PORT ADDRESSES: @@ -30,8 +30,8 @@ PPIDE_DIR_WRITE .EQU %10000000 ; IDE BUS DATA OUTPUT MODE PPIDE_CTL_DA0 .EQU %00000001 ; DRIVE ADDRESS BUS - BIT 0 (DA0) PPIDE_CTL_DA1 .EQU %00000010 ; DRIVE ADDRESS BUS - BIT 1 (DA1) PPIDE_CTL_DA2 .EQU %00000100 ; DRIVE ADDRESS BUS - BIT 2 (DA2) -PPIDE_CTL_CS1FX .EQU %00001000 ; DRIVE CHIP SELECT 0 (ACTIVE LOW, INVERTED) -PPIDE_CTL_CS3FX .EQU %00010000 ; DRIVE CHIP SELECT 1 (ACTIVE LOW, INVERTED) +PPIDE_CTL_CS1 .EQU %00001000 ; DRIVE CHIP SELECT 0 (ACTIVE LOW, INVERTED) +PPIDE_CTL_CS3 .EQU %00010000 ; DRIVE CHIP SELECT 1 (ACTIVE LOW, INVERTED) PPIDE_CTL_DIOW .EQU %00100000 ; DRIVE I/O WRITE (ACTIVE LOW, INVERTED) PPIDE_CTL_DIOR .EQU %01000000 ; DRIVE I/O READ (ACTIVE LOW, INVERTED) PPIDE_CTL_RESET .EQU %10000000 ; DRIVE RESET (ACTIVE LOW, INVERTED) @@ -66,7 +66,7 @@ PPIDE_CTL_RESET .EQU %10000000 ; DRIVE RESET (ACTIVE LOW, INVERTED) ; | PPIDE_REG_STAT | 0x07 | R | STATUS REGISTER | ; | PPIDE_REG_CMD | 0x07 | W | COMMAND REGISTER (EXECUTE) | ; +-----------------------+-------+-------+-------------------------------+ -; * LBA0-4 ARE ALTERNATE DEFINITIONS OF SECT, CYL, AND DRVHD PORTS +; * LBA0-3 ARE ALTERNATE DEFINITIONS OF SECT, CYL, AND DRVHD PORTS ; ; === STATUS REGISTER === ; @@ -122,33 +122,31 @@ PPIDE_CTL_RESET .EQU %10000000 ; DRIVE RESET (ACTIVE LOW, INVERTED) ; SRST: SOFTWARE RESET ; ~IEN: INTERRUPT ENABLE ; -; CONTROL VALUES TO USE WHEN ACCESSING THE VARIOUS IDE DEVICE REGISTERS -; -PPIDE_REG_DATA .EQU PPIDE_CTL_CS1FX | $00 ; DATA INPUT/OUTPUT (R/W) -PPIDE_REG_ERR .EQU PPIDE_CTL_CS1FX | $01 ; ERROR REGISTER (R) -PPIDE_REG_FEAT .EQU PPIDE_CTL_CS1FX | $01 ; FEATURES REGISTER (W) -PPIDE_REG_COUNT .EQU PPIDE_CTL_CS1FX | $02 ; SECTOR COUNT REGISTER (R/W) -PPIDE_REG_SECT .EQU PPIDE_CTL_CS1FX | $03 ; SECTOR NUMBER REGISTER (R/W) -PPIDE_REG_CYLLO .EQU PPIDE_CTL_CS1FX | $04 ; CYLINDER NUM REGISTER (LSB) (R/W) -PPIDE_REG_CYLHI .EQU PPIDE_CTL_CS1FX | $05 ; CYLINDER NUM REGISTER (MSB) (R/W) -PPIDE_REG_DRVHD .EQU PPIDE_CTL_CS1FX | $06 ; DRIVE/HEAD REGISTER (R/W) -PPIDE_REG_LBA0 .EQU PPIDE_CTL_CS1FX | $03 ; LBA BYTE 0 (BITS 0-7) (R/W) -PPIDE_REG_LBA1 .EQU PPIDE_CTL_CS1FX | $04 ; LBA BYTE 1 (BITS 8-15) (R/W) -PPIDE_REG_LBA2 .EQU PPIDE_CTL_CS1FX | $05 ; LBA BYTE 2 (BITS 16-23) (R/W) -PPIDE_REG_LBA3 .EQU PPIDE_CTL_CS1FX | $06 ; LBA BYTE 3 (BITS 24-27) (R/W) -PPIDE_REG_STAT .EQU PPIDE_CTL_CS1FX | $07 ; STATUS REGISTER (R) -PPIDE_REG_CMD .EQU PPIDE_CTL_CS1FX | $07 ; COMMAND REGISTER (EXECUTE) (W) -PPIDE_REG_ALTSTAT .EQU PPIDE_CTL_CS3FX | $06 ; ALTERNATE STATUS REGISTER (R) -PPIDE_REG_CTRL .EQU PPIDE_CTL_CS3FX | $06 ; DEVICE CONTROL REGISTER (W) -PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3FX | $07 ; DRIVE ADDRESS REGISTER (R) -; #IF (PPIDETRACE >= 3) #DEFINE DCALL CALL #ELSE #DEFINE DCALL \; #ENDIF ; -PPIDE_DEVCNT .EQU PPIDECNT * 2 ; ASSUME ONLY PRIMARY INTERFACE +; CONTROL VALUES TO USE WHEN ACCESSING THE VARIOUS IDE DEVICE REGISTERS +; +PPIDE_REG_DATA .EQU PPIDE_CTL_CS1 | $00 ; DATA INPUT/OUTPUT (R/W) +PPIDE_REG_ERR .EQU PPIDE_CTL_CS1 | $01 ; ERROR REGISTER (R) +PPIDE_REG_FEAT .EQU PPIDE_CTL_CS1 | $01 ; FEATURES REGISTER (W) +PPIDE_REG_COUNT .EQU PPIDE_CTL_CS1 | $02 ; SECTOR COUNT REGISTER (R/W) +PPIDE_REG_SECT .EQU PPIDE_CTL_CS1 | $03 ; SECTOR NUMBER REGISTER (R/W) +PPIDE_REG_CYLLO .EQU PPIDE_CTL_CS1 | $04 ; CYLINDER NUM REGISTER (LSB) (R/W) +PPIDE_REG_CYLHI .EQU PPIDE_CTL_CS1 | $05 ; CYLINDER NUM REGISTER (MSB) (R/W) +PPIDE_REG_DRVHD .EQU PPIDE_CTL_CS1 | $06 ; DRIVE/HEAD REGISTER (R/W) +PPIDE_REG_LBA0 .EQU PPIDE_CTL_CS1 | $03 ; LBA BYTE 0 (BITS 0-7) (R/W) +PPIDE_REG_LBA1 .EQU PPIDE_CTL_CS1 | $04 ; LBA BYTE 1 (BITS 8-15) (R/W) +PPIDE_REG_LBA2 .EQU PPIDE_CTL_CS1 | $05 ; LBA BYTE 2 (BITS 16-23) (R/W) +PPIDE_REG_LBA3 .EQU PPIDE_CTL_CS1 | $06 ; LBA BYTE 3 (BITS 24-27) (R/W) +PPIDE_REG_STAT .EQU PPIDE_CTL_CS1 | $07 ; STATUS REGISTER (R) +PPIDE_REG_CMD .EQU PPIDE_CTL_CS1 | $07 ; COMMAND REGISTER (EXECUTE) (W) +PPIDE_REG_ALTSTAT .EQU PPIDE_CTL_CS3 | $06 ; ALTERNATE STATUS REGISTER (R) +PPIDE_REG_CTRL .EQU PPIDE_CTL_CS3 | $06 ; DEVICE CONTROL REGISTER (W) +PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3 | $07 ; DRIVE ADDRESS REGISTER (R) ; ; COMMAND BYTES ; @@ -202,7 +200,7 @@ PPIDE_LBA .EQU 9 ; OFFSET OF LBA (DWORD) PPIDE_DATALO .EQU 13 ; BASE PORT AND IDE DATA BUS LSB (8255 PORT A) (BYTE) PPIDE_CTL .EQU 14 ; IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C)(BYTE) PPIDE_PPI .EQU 15 ; 8255 CONTROL PORT(BYTE) -PPIDE_PARTNER .EQU 16 ; PARTNER DEVICE (MASTER <-> SLAVE) +PPIDE_PARTNER .EQU 16 ; PARTNER DEVICE (MASTER <-> SLAVE) (WORD) ; PPIDE_ACC_MAS .EQU %00000001 ; UNIT IS MASTER (ELSE SLAVE) PPIDE_ACC_8BIT .EQU %00000010 ; UNIT WANTS 8 BIT I/O (ELSE 16 BIT) @@ -210,6 +208,8 @@ PPIDE_ACC_8BIT .EQU %00000010 ; UNIT WANTS 8 BIT I/O (ELSE 16 BIT) PPIDE_MED_CF .EQU %00000001 ; MEDIA IS CF CARD PPIDE_MED_LBA .EQU %00000010 ; MEDIA HAS LBA CAPABILITY ; +PPIDE_DEVCNT .EQU PPIDECNT * 2 +; PPIDE_CFGTBL: ; #IF (PPIDECNT >= 1) @@ -722,7 +722,6 @@ PPIDE_WRSEC: ; ; PPIDE_SETADDR: - ; XXX ; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER ; IDE_IO_LBA3 HAS ALREADY BEEN SET ; HSTLBA2-0 --> IDE_IO_LBA2-0 @@ -731,19 +730,19 @@ PPIDE_SETADDR: DCALL PRTHEXBYTE CALL PPIDE_OUT .DB PPIDE_REG_LBA2 - +; LD A,(IY+PPIDE_LBA+1) DCALL PC_SPACE DCALL PRTHEXBYTE CALL PPIDE_OUT .DB PPIDE_REG_LBA1 - +; LD A,(IY+PPIDE_LBA+0) DCALL PC_SPACE DCALL PRTHEXBYTE CALL PPIDE_OUT .DB PPIDE_REG_LBA0 - +; LD A,1 DCALL PC_SPACE DCALL PRTHEXBYTE @@ -1000,7 +999,9 @@ PPIDE_RESET: CALL PPIDE_GOPARTNER ; POINT TO SLAVE CALL PPIDE_INITUNIT ; INIT PARTNER UNIT POP IY ; RECOVER ORIG CFG PTR - RET +; + XOR A ; SIGNAL SUCCESS + RET ; AND DONE ; ; ; @@ -1015,9 +1016,7 @@ PPIDE_INITUNIT: RET NZ ; JUST RETURN IF NOTHING THERE CALL PPIDE_INITDEV ; IF FOUND, ATTEMPT TO INIT DEVICE - RET NZ ; IF FAILED, ALL DONE - - RET + RET ; DONE ; ; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT ; @@ -1026,15 +1025,15 @@ PPIDE_SELUNIT: CALL PPIDE_PRTPREFIX PRTS(" SELUNIT$") #ENDIF - BIT 0,(IY+PPIDE_ACC) ; MASTER? - JR Z,PPIDE_SELUNIT1 ; HANDLE SLAVE - LD A,PPIDE_DRVMASTER ; MASTER - JR PPIDE_SELUNIT2 -PPIDE_SELUNIT1: - LD A,PPIDE_DRVSLAVE ; SLAVE -PPIDE_SELUNIT2: - LD (PPIDE_DRVHD),A ; SAVE IT - XOR A ; SUCCESS + BIT 0,(IY+PPIDE_ACC) ; MASTER? + JR Z,PPIDE_SELUNIT1 ; HANDLE SLAVE + LD A,PPIDE_DRVMASTER ; MASTER + JR PPIDE_SELUNIT2 +PPIDE_SELUNIT1: + LD A,PPIDE_DRVSLAVE ; SLAVE +PPIDE_SELUNIT2: + LD (PPIDE_DRVHD),A ; SAVE IT + XOR A ; SUCCESS RET ; ; diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index e8ecf3a6..aa6ae0aa 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -151,10 +151,8 @@ FDMODE_DYNO .EQU 9 ; DYNO WDC 37C65 @ $84 IDEMODE_NONE .EQU 0 IDEMODE_DIO .EQU 1 ; DISKIO V1 IDEMODE_DIDE .EQU 2 ; DUAL IDE -IDEMODE_MK4 .EQU 3 ; MARK IV ONBOARD IDE (8 BIT) -IDEMODE_RC .EQU 4 ; RC2014 CF MODULE (8 BIT) @ $10 (SPENCER OWEN) -IDEMODE_SMB .EQU 5 ; RC2014 IDE MODULE (8 BIT) @ $E0 (SCOTT BAKER) -IDEMODE_DYNO .EQU 6 ; DYNO IDE MODULE (8 BIT) @4A +IDEMODE_MK4 .EQU 3 ; MARK IV ONBOARD IDE (8 BIT ONLY) +IDEMODE_RC .EQU 4 ; RC2014 CF MODULE (8 BIT ONLY) ; ; PPIDE MODE SELECTIONS ; From a9b400f0766371c457d0e7f283201578164d940d Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 11 Feb 2020 17:10:11 -0800 Subject: [PATCH 4/5] Update ide.asm Cosmetic bug fix --- Source/HBIOS/ide.asm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index 5c4240a9..b2f771f3 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -911,7 +911,9 @@ IDE_RESET: JR NZ,IDE_RESET1 ; IF NOT, BYPASS ; ; USE HARDWARE RESET LINE +#IF (IDETRACE >= 3) PRTS(" HARD$") +#ENDIF LD A,$80 ; HIGH BIT OF XAR IS IDE RESET ;OUT (IDE_IO_XAR),A CALL IDE_OUT @@ -937,7 +939,9 @@ IDE_RESET1: ; HAS NO WAY TO PERFORM A HARD RESET FROM SOFTWARE, ; SO FAKE IT BY SETTING THE REGISTERS TO THE SAME ; VALUES THAT A RESET WOULD CAUSE. +#IF (IDETRACE >= 3) PRTS(" FAKE$") +#ENDIF XOR A ;OUT (IDE_IO_CYLLO),A CALL IDE_OUT @@ -966,7 +970,9 @@ IDE_RESET2: JR Z,IDE_RESET3 ; IF SO, BYPASS ; ; INITIATE SOFT RESET +#IF (IDETRACE >= 3) PRTS(" SOFT$") +#ENDIF LD A,%00001110 ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES ;OUT (IDE_IO_CTRL),A CALL IDE_OUT @@ -986,7 +992,9 @@ IDE_RESET3: JR Z,IDE_RESET4 ; IF SO, BYPASS ; ; CONFIGURE OPERATION AND END SOFT RESET +#IF (IDETRACE >= 3) PRTS(" CONFIG$") +#ENDIF LD A,%00001010 ; NO INTERRUPTS, DEASSERT RESET ;OUT (IDE_IO_CTRL),A ; PUSH TO REGISTER CALL IDE_OUT From 5d35a80cf702a6c7f0f2d5c2585291d82331c64d Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 11 Feb 2020 19:31:30 -0800 Subject: [PATCH 5/5] Update romldr.asm --- Source/HBIOS/romldr.asm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 4fce8151..c6be9084 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -244,7 +244,9 @@ SEL1: OUT (LEDPORT),A ; CLEAR LED #ENDIF #ENDIF - CALL DSKY_KEY ; GET PENDING KEY PRESS ; NOTE DESKY_GETKEY + CALL DSKY_GETKEY ; GET PENDING KEY PRESS ; NOTE DESKY_GETKEY + CP $FF ; CHECK FOR ERROR + JR Z,SEL2 ; IF SO, IGNORE KEY, AND CONT LOOPING CP KY_BO ; CHECK FOR REBOOT ; CAN RETURN AN INVALID JP Z,REBOOT ; REBOOT REQUEST ; KEYSCAN AS FFH WHICH LD DE,MENU_S+11-MENU_V ; POINT TO DSKY MENU COLUMN ; MAY BE MATCHED WITH @@ -307,8 +309,8 @@ MATS2: LD B,0 ; WE GOT A MATCH FROM THE MENU TABLE. POINT MATD: LD B,A LD A,C ; IF INPUT WAS SERIAL DEC C ; CONVERT TO FROM. - JR Z,MATD1 ; ASCII TO DECIMAL. - LD A,B ; DSKY NUMBERS ARE + LD A,B ; ASCII TO DECIMAL. + JR Z,MATD1 ; DSKY NUMBERS ARE SUB '0' ; ALREADY DECIMAL MATD1: CP 10 ; DO A RANGE CHECK JR NC,MATX ; NOT VALID, HANDLE IT BELOW