From 4f941de39c2bc085c71267bacef67f912c8ba8bf Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Thu, 26 Aug 2021 15:24:59 -0700 Subject: [PATCH 1/2] Miscellaneous - Improve handling of RTC latch shadow - Hardware auto-detect on DSKY and DSKYNG - Regen documentation --- Doc/RomWBW Applications.pdf | Bin 142480 -> 142480 bytes Doc/RomWBW Architecture.pdf | Bin 440180 -> 440180 bytes Doc/RomWBW Disk Catalog.pdf | Bin 131009 -> 131009 bytes Doc/RomWBW Getting Started.pdf | Bin 177901 -> 181345 bytes ReadMe.md | 25 ++++++-- ReadMe.txt | 25 ++++++-- Source/HBIOS/dma.asm | 16 ++--- Source/HBIOS/dsky.asm | 54 ++++++++++++++--- Source/HBIOS/dskyng.asm | 87 ++++++++++++++++++++++++++-- Source/HBIOS/dsrtc.asm | 2 +- Source/HBIOS/hbios.asm | 61 +++++++++++-------- Source/HBIOS/hbios.inc | 1 + Source/HBIOS/nascom.asm | 6 +- Source/HBIOS/romldr.asm | 15 ++--- Source/HBIOS/sd.asm | 18 +++--- Source/HBIOS/sn76489.asm | 20 +++---- Source/HBIOS/spk.asm | 2 +- Source/Images/d_zsdos/u0/ROMWBW.TXT | 29 ++++++---- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 20 files changed, 265 insertions(+), 100 deletions(-) diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index a576103b85c1d56846b3c2aed960600f6b452bbe..1c37b778fb539ac38a3521600c3ce8f874f5bdce 100644 GIT binary patch delta 161 zcmbPmlVie7j)oS-EllxDIu=G|hNgxVrlz_E=IRCp>Y7~ozWFIGi6yBD8ZK5w21bSk za3$NjnV6PpCKy{dySSJe7&tpR8Jn7!I~yBXSU9;^xR@9?Te=upI@&4N5L6PYU}wiw aT#{H+Qc;we#$^aJ!_b0DRn^tsjSB!5k|-zu delta 161 zcmbPmlVie7j)oS-EllxDI_5@ZhDJuFh8DU8=IRCp>Y7~ozWFIGi6yBD8ZK5w21bSk za3$NjnV6PpCYYOAxHuZRIlEaJnH#y9IawOJn3|hgm|Gf{n>jgKxY{Y$5L6PYU}wiw bT#{H+Qc;we#${-1Xkloe{Ar2i7N%y#rfH@r=4MGL&C^r2Pfuk`>qM7m=XuWv#7scU48$zk zdET?0Zs)WxGBY$av@|f7{-BIa3c=mZT+Sxw;Ot~+>SAbM;pAv+VrgvP>|$VHS}K6YG|imLrBT=@a=4}018VpmjD0& delta 176 zcmezJPU_1$sSO>e{ANjMM&`*D29~MDCI;q)&C^r2Pfuk`>qM7m=XuWv#7scU48$zk zdET?0Zs#;NGBY$XGBq-u{-BIa3c=mZT+Sxw;B4S(=;UVR=3?w*;b`P!=4R&P*%Y+>o<>|&>2LrBT=@a=4}0KB;~;Q#;t diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index 1066b5659440082ee549e13bd159d86dfb468ef3..10ade0276b87178f960fdd276fe983b4799ecd90 100644 GIT binary patch delta 159 zcmX^3pZ(x}_J%Et4_@k67?~NG8d@5d=^B`;8yKi-a_Rf#r?@1Rq$+5*SQ!}@85+Qq zZ0C8!7%H0J;^gLL?rdb?=Ir9^X6S5a?&56eYHI3a?rPy?Z0_o2r(i=+NvwjM9anKl ZVo^y&QED2Op^>Sni8+_5s;j>n7XUaGDxv@Y delta 159 zcmX^3pZ(x}_J%Et4_@k+8<`mz8JQYc>Kd4<8yKi-a_Rf#r?@1Rq$+5*SQ!}@85+Qq zZ0C8!7%G}zVd-S)XlZ6?Vrgb!?C9id=;r2RVr*n+?qulfW@cb+r(i=+NvwjM9anKl ZVo^y&QED2Op^>Sni8+_5s;j>n7Xb2|DUtvH diff --git a/Doc/RomWBW Getting Started.pdf b/Doc/RomWBW Getting Started.pdf index e78e795b05d5617c45ac557cbda9b37e34c777f9..2cc815629c3144a7371cd180f10c664c4b703261 100644 GIT binary patch delta 54702 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 I3(su)FR%6uy#N3J delta 52019 zcmZsDbwHHc^S4WPcX!vauyjg;bT=s7DH1Lqp&+@yDk+lE-Km7MbW5iK(jo%y0{4D@ z*L&Z8eAqeXnR8~&d1mG_XO1f`G57W`;$K5%*5V#pnIJjJBS*(eOXNBmzPF{8`^az| zv?u(XpyvI&if$e&tNP}*p)@-$e%5rV?>{U`0>(2IH5Blc)tsdHTUml5$Rp)2KM9jQ z5oLs(9*WdjHIHvV7$#?{*~XR;PS4nQS;K&5w}Zj(du3V~HkRZF z2$_uG=4-}Aek^Pz)Gec*?Vp(n;@Z?)$EKEd@=uDl6FC!AKS^8jXMSB+s;z#K;S3n_ zPXZL2pN{jO0-3^?l28%!)YwRa2g6#aLg@R~ecBJrcA9-%=-)j2uDVPQ7;cDX^pnM7 z6x93newu_n9m*e8^*Tq{mNezS9Blw~20}AmW{Nd33Qy}Jc*x8?6#fBK)1Aw`LzlOs=(J>%0{FfD!=j} zd+1WU^IY|GH@!y|v07#E>>`mUFCXem;vO>g{dXP27 zC`;o*vOF}r>v7~wurCiK}i&%Z+bwD|%-Xb%E_3-qks{e(1fQf-Y zkU}!FaqBW8Lp>W&xPq2BY=GEHyTE1 z3&f-V<7}*KP^)Ib>QjVpbOay}Hku4zhwQyEb4%kRia0ptY?%9wSt!K^hAB5WXH4J{ zdyYGj>dS&^5b)z4&6j7zEDDs6JLT3HNtTruevGAU-#QgR6#=1&&<1>tebMlge|4sF z29umoJ#fqNV@td?>vGpaNw3upUYKR{GRsF)O<|ZnhOwrDE-wX2+w{KVeMF`4CWpxK zO8&I^X{?&IqWb$;Ust0K@Ql5qL?VWY6cZQd8o#YGf6N-s@IxYlDGGsf-REXE4Y(sq zSfa>yE$5X|;KOk+Zc(KkP1O|Aerz~(gg27ZZ^U9}%pA5-uhj>65cy7B_{ICe@xZAn z0@`E5Wm)6#{>a%P+~zkzlHax0>D3_EB?Hg2`xQ+`M~c+>OIaCY0cew)l0fffb(4hZ znw0aY&rptpjrHOS!4}cVHg$1?#rSb*+1>gA^z+~G^>NR&CPWd!+wHRJ0VMU^-Kl4f zy#2}FM)%U_>p%MRsj@J~b;{bxtm)aZCn!(}>rxcgctSp(%h5XD)pSiuMMD@egUno! zLjcwfomtk(=1uYD7 zFzj^&@h%+6Oln4?{o@Oa~MZ2}zJ} z`^bkEasE4sa<6kgL#jd|)IOm|U5^Q60w7BvA1=qBpm!7WNG;)`ZvJ@2mE@6xg8c(4 zz2#b-{?(msBf7*+W8@81JpVT$%%g^E=M`25S01f~UfJn(1HLZ{e0zzjyqqt29w`$7 z_bwDKQZ)r+M96DUWX#|Dyaf|9&_M?B-{3zlDxN9OiTTbt^0h9|d2HyKsu8Ud)E6%Q z+YU%CPU2US+v+B2#rX1d+ipY50dcexkb*gJ*m`r)rmwtgt8eH$`>RlIQ}n~Jcf{=Z zpOD|Wi{yIR>-Em~KJpc$jbM5@ujjL?R}n$p0_i=0geHKtqz$XaO#0O%`o!^J-MrnZ;oX4(Jp6n>Ixq;tBLISipwL1$;jJR@Rz5JiRfvaQSdb3P2jT$>L#>#334wfk z@Y%RoJ7S27WAMt+nTQBOL$+8DZl|OMAb}oO5yOTY0n7j(%u)?Ngebz#e{alM_2xb2 z!FWN_2FnTQ?D!9m{C0GFDhXNFDmj6N0?M@Z7%3w8O4v%XYwaVew&66)4vQ=rNGUUm z)pocfNG^CX<*Z#ncHQff4jg!ofH|Q#t0-ED*-UxDIatI_C+vp4^To4zKc5~>(QF8B zqK_-0N39|iJafc-KKQvfPJj_&)iuUtC~@{;p~>edNIXfUiH=As%8Ont{^hbTDcZ0V z4J&vol8-S&H)ydIEdBa}nJEW3`|Rf`p-#NcFb|?pEW!k%tySOhUq0kLOnx=$uV)YD z;}a~G{5Y*9x*i}26a-6KZd#j$rz3&oIQKl9w5^b`R`l!Ud=Qc!U?MF-=-d5;WU>Y? zP}vN#E+1EOe?u`?obvPAQ@@la)y5aEd1O$Qbs5W+D`FcQD7RwQ z)Af0WQuCR5U}UEhHi?gvbV7VX8`v9L<57bEmhPOtf$RFyfmh=B<(S6(`Bdw3iqV4I zNl27RsC)YmqZl2%#iW7oPP;`DVP{f;qp!46 zr#;!?PPX00v;4bO(i-QVd+;Xj^agRq{El5T3OydoEwDB1;v*arQ0zYA<6$7N>r@X3 zBSfo>*r!l+kaDN=jiJh2JoOjfevx-XA|-AaMA##+J@NSlz%Vx%1o=$h#ogJO@+qfQ z*7yf#V1C~iYSr}{ZB3qsh;9_A{tVf#Mzeb0E(l2TeD^sW+l$$rk}!$Gr?!J_`qb8ZXi z+7|+x^J0rnmOQW@xz?)T9;ox~owbz(n!m`^xxSIXVQiVkYjG7a7YJ&71_nN#VT>fm zzsQJQjc6J|v77|T4eVUFx#mST|7h0H{5ITHm=xb(G(y7aDkudBH#&U6Yogfi=s|Ug z+hC@QI(3vFiCC^65xBb3`aCmVHKwW}Wke1y6;0-Se%%lPrVm{~@x@yU$E=Il2^Rx9 zQeK8jM6A5w%2M=e)Hl(`dYR*ctk<0QrVT?E-5i9<-+kRk(6?6QD^kV=91CMq7QZ-% zUMA6w_X;iZ=nJsW49cWl^;K`h+jH=3iHKiPd2MFy9EuCGvsgTMs{9-ZoFGI50tKLz z3iL!k!G9YZAP_3!$pT$wz}Eos-L=vI;r0P;mf%mJzn;Q>J@3pF9T0eHDB$ft;9pPv zyQdk3q~xuUyEP$jUa&(1fEaX`%N@W6`+)!uhu-j^LPNO&V2V}%Y-k2EHf-4gzyX!v zX@NC3z$x5t+a|-Cfxstn|K@FX2EJ_AS04ZtG=|`=J0}zs=m|~ax@Cq2Z3RAoN^w7g zKH(1~1m4d1AI1wVF)YCWzzX#PVxz!~*{ueeFd3oxAUp*4pY|YDLg1}ff4%~J4-&d< zo(Hi)O$7h?)=mL7=q@YP--BJ=Qw0Rspx4}3Ff26y=KoA6 zB9I>p(;5U2Rd)#SdT3pS`G zA}$M%|9&-r{Gj{Q1>HaYSY3W-B_TPC&Ktgd5sF?=847Y(2O@wGDya10?#ErrrBWdN zEw6v77zCwvV1rgD;{*7h1D34NpNiQ3Rt*RYt1N-5Mq33L8M>p4eK+I(ss=8X1%QPG z2)g&7|JZt<+im;Dp!Z6H`YOZq2PM*Eg<44bsV1nH3Q09ga~&0Gs9}Zx5`orhsKUGU zX;4ES8c{*THR+%bBUA(d0Vuu-7xaZDQT1mdMHHyNq4{m+IYVV=gC#!n(hvtaZAk@t zxdGp?=Y|AOd@J@lqLLLAl-Y<58fHZSow2%aYq6q)nj4Y9_XO2FUrzYiTB!kutJSTw zP!I&+Ls>Eq{`Y$ognzHBDECrBH!W!Z0=Hfos^oxw`;LhN8vyjTzy6ysg5X^|R{hg~ z01ZJ<_?9uze6DUrbK-uhz)g86TUXZrsPf2)IkE+-h8 z0N**!JP83HsCu9<{NKnxHUR&v)b!Ab2;^IJYIzAEfJLhDgWjMaz~h^2`~RQB;9H4V zk?;09G|-Fu?$ZU|3r8q)`;q)HtT5Czf)xRL7Y_YzAbb^0C~go@^;yJk6zGR=3jjY9 zJ;E8<7Rv(Vh`@m!#ZtlwZ4t1cED;1yt~e@aESv>=ejahc(6tDn>ee`16zFk`Is7&4 zSZ63Kg$#-v#{eBoVTaPj;XyHAWC+57P~12=s2uE`6a*uKD#kIwq~!s;P|*||SVju~ zwfZ;gH!8F+?)GCLArii`*MDeN7+Pt_iXwC`szVA5K$;hMG^r+v8us{KzIjETzDL9_YMd4h#YXIb9@yJxSBiZh+wtk0Iq868hca# z5UN$hKy=UlA7MB@AKzUZj>31hQK6lAbz-8yp8Yw=G$5Q7hmu_-}Pn!02n&jEp*EPqlXnnV~23(QTXA% zANH_9FRHNrDG$`Mg%}YC5`tCY!LtgbhV!oT3b%py4-a&?wAQF6OS=sYgmkbTgiujz zjMQ8%h8DeC#u9xk5KtrE zC7*;eApWzG!W#r2R*MO|yi??i18wx1zN zD(pj&P2Zh_F1q7g@wSRP1^1eY2DP*NQE}7NWu36%!ms-{LNNQ#xK=wL7;GdnMpKrb zISUj^3{$t59gy22rb-jBzaa>|(ScuE=ycza6l$w+o$AAzQ-8STFoj6hW4x3$`f53N)kni%Fen zK;H5L$(8OBmxvnYZNy+<2s7Qw>?fQ=qoix4hs)WhCFc*mTZF4rq=oPZc>e@A1#7cR z$u+E%?hI@;apYhBP@hZrL?J}lF#1rN*l=RFC+te}J3|O7Tb@<1<9N%=y9JlICd$l} z1d{@wk@&N zja4%$P)F>KJ_HiYO(syA&7bFuyumNuqm$Lt^d%Sbb@}Vsi&%xWNW5jDOG8FTl$M*HpiPe5TWBaY5C1M^VJd zOw#61bQE3Ou}Hc)gX=nuis4J$D00kIoX`cn1Q+9?i@CjO`ObbcX587}f_v)Nae(Wc zyC|Xb^zr&=>&K^t1%jt1LC`NVOeg08o_*n|ztqrp)<2gKx}vHa@;07=lh9{cIxSpX zXT*A*wkxsu>Oa|ufsFSqnL>YLmr7*@$vs;&w6}d=B_4Kz@@Vw@g#W48*S()@?j>cf zI}?!|1K#zTVhT~5B5M0Zye$m(?kXn0qWmFNvt#F))r0-?!4@5B_GP+2EG3SQNi1tU zPP05p?u(yMqH^;NJ|m$o6%nSwH($M5>8meJvKP!adD9rneaQ()618<56YD$@hUZ9c&codmv=-Ux;K zn#1udTk1OSkV-oT#V0-)M%cUJWK7i8Mc5e~tm%!G+XQ0SDA+|NNtQ}fImTc{|2WQM zUx8uM{cH)sQ(R)lId47~hBZO2J!dq*U3_ce;t3-5Gw+l9oMvvb zN2tH})nf@4Dv3x4V>@Th4PPvxAsp$gut42jt7B?Ud%%1C{A=Le$ki` zNdM|vvbZo(`W5YGdu%l*pxXn1PXOxO?F5w`B8NKla6zT9m=XAau!I(PwB0@wfdVxg z!iJhwkr3VCj6Z@MejwZ(v!L?-%DXsyfUt?Zr)yWCUpG#_ki-BPy#-e1m-*RzyR&uEP@&?;sZqB5v|be045GB(7r`N zIN{`;z`e}|joQ5Ti12p1ZSZZktZmlBox4z!AO350n-zf{K85?7)n762t><5sAgcD+ zaY8|WXDRQd{$KYDx_8ga0)Iywf8$wx(7yl|JR1j}B`Y-Q2i`5e^dGEH-R)cFJ@rHA zmVkT62JPL(hZB?!?+BrXtOWlGDQ|f+AF{#&b{TR2>Hi@Ccq}1s3k8U(4UbmgYfD53 z&lchl3H%2P@C(4f0DK?aPZ!E@_%|9@yTHGVGH>-)a7YM;2z{?76rzX<10e#u;b9^?iy#VHMFa#ui!ZRCt%TUONRt8f z1_|Iv2+unI5u@|N5fB^2>!Q-@P^sjor7Vj-Bc5uAM; zIUo@gwqlP!3R~s?U=a!Z2hiV61Po*WdPjSahNbCd=+m|YrQ%b;1McJgb~gZZp(><|AU+Ph3`}LZ18OQ9j5(1 zb0>T!s%1|MFegwJ`sYD2uzC+9`74ixWV)8kb{CBj4`uV%C8blvAPol96*C;@qYG^b+}br z^Tsx#czI0MXU%I`vEOG5ElSo7_x&J{+-^%jycZe=VK?SOU(FVJJn5LT>`PIqH>5qY zEj6%$ITK}wIC*3x-ngJF8A?#84$V0VOav|OT|4T3{0fz%12ygBATxQ8@X~Ds>z+Hf~~XGXJ% z#RAXH=&@|Pzx2i>djVw9PAN>mMt}_MOh6ZZ;9E9{a~OdPFR8gnFxaKE`Iuv^_085Z z9}ac4Y_wkb+)Ee*Jis}So<&KqZ@%kfaZMSWLG&% z7)ON?vZDH8cL{LQgU#^iYmpz;ONa%s-y)eGXLd=JSwqXxeLq6@bp#!>wBpe@Iez_m zas5TQq&PxS?ZItnf3(r%Xw1VC{`?9p3AU<|tE+o7Fh*M?I7Q+mfJ*3>e|bsYLq8ot>s%y_z%1$+ zG9!jH1QVInD2!r-m_f!BoT44&b9pzy7O#EKuO*-7>&+9{jDA<@(LmR<2#jO;UMWOh zi<$325#8eDqiX(*nq)nsqleh>m6Sc5~DeydS3R+brc0*7)XXuKsaokUfXrRIV1qD;?Lo2o;AKM<&(D_q z?^_u-6oL8OPK+I)5r>26%vb*C5?@q)&|$Fm9LQqg1OY6RsaGi8BdY9jS0AWYBnrjM ze(Qb{l#wdms{py|`IP)Y+_IsmWfhk%_((QQ+@wIyO6ZJgZ1;I<*s43B7FYCwZ5!q$ zl0pJ%&Ni{T-NO$}4)d&YPFfG}o4NZJ2po>F#K^|i`pe#ZYR#KI`{X4mj5JmZ?!nW_ z_o+wyAg+^lEkVvgZ?KYE9Ir|9${u08Gmm-p(?-(EuV{1-_}SQdY$u!(`;`OqcY(YJ zlYX6>Y*I96X%9anN%DyET2nqOD*j!gG5XAOhm|g>AuOo@X~E#_K<0kbOnZS5qBUj&}vyiFb5`xzKF7vMga7r9M`!kxpP3DCP_7pyV^ zK!gMog2M;^8yh6gP&E$jFxs{Z8idF{d&+B1FiHo^2pm|LUedJlEs;K+xCRFbeV6ttSmblzu} zyWA>4#boerOl;KNJsve~ zT+3%hdwy1n`Ylz?(-lYb&I@rV1`E@lc)nYY%<+Lbh*aLlLXo%EYG2E+{{&b}?`@ri z_aA-snfUrHeA>-H^I%{kr74**4ckX-K5nQ3Wb6o0bu^wfckZpDaGYkK(VUVxd9fJH zYL@XzmzWc3E2}zn=F81oSl6Z$crvHqQKG4V`?c#5rN-y6Vvh1T5`A4UF4I|u!e~Y< z_p4u(Mb1lZy(p{O?J<#$L}sv&1c1O);UsDlAqsVMS)@$qE~aqJ2%zj{XrhQ;o;+;B z$a@R2fG0Q6^dgT8izrk)t903#=BP6mIa`HfMy^DOi+o?)h;8#y0f-u&}S&vn@e zl?f-|A%TJ3Ip3Gy8nt*S zOA<^~$Ixj)^l(1w9E9(va8tjTyUeg9bVNdx{ZE>a6?0DvDrgv ztVtGp6+7pi;gw{c+{HZ{gcTjZ3M7OWh=BxlsQcr~D9|i5GZwO?TgORQ8MyoP6g^~n zn|NGH(JfyfFDL;W>4bGl%}*lxqAw{Ey)d?uUe;Ev_mTqBJDGeKdk2X;=|b%1Qqxuu zpe=$6*ohLJ+hUY^n546J+|Byy223^DvoxB<2&Q__a&R_l_=iN$+ zZ0>WDdgvUW{z~y^pQuL#{Wz&0wc~02TiA!!d;EwU3v7@A;P?M`I@LXSdP@Q9h4_Y-t z))j)>+wXa8%L4WjGr#m1B#`c3V4gzf9Y)|V|FW@L5KMnF-911mg+i?%T*LP}RQW{e z<$3R=!Ss@(T)s+|NQGE}>@mHl5!c1V*(`*MqU7e*LBfOu@1Yox$bU|`;K?6&T8-tl zuIUzu{oj!=|G&?P_~AuOx6lh-qV|u&%7?dyLr6eD_*wd`yR0>Exy4u4UoBSR2sA-~ zld8eQN@F%16=gC6@03!4G+jgpIaDKT>c6!wQ6Jc=7G;ploW1I0j1xb~6q8JXZoNwX zeWc(S@a$&uyQm&vp4@(V<^nH^ic+4Xrn*jZ`L*XH-uRk_`?%D2v`meNY~2Irc+#ZQZq zy=kcY;`>#7GH%D&F7DpVsibM1TR7;{7tf!V3AJI^$z|HqxYlxIK1;4!AzsKP{9uaV zbo!;K@Y}TSBtP+3-oxhJ=5yKu`{@xXOv0h!ebuK^laR@h@75dex{#Q@oJ;rqOs#s% zl%1@1yEy(J$#xG0q4m#L>YBr&qAyNq_xTnOOv>3QXhOq-nqS7eo^#Qx$F8M%$<+}q z>PI8~qIR^l-UQm#HN4dAsR!Fam0@Dl*$azkPGvM)LS9g#Ug)2^(AX|~O7QyWGd{^v zU1j=5qK1%NWhWsp1xlJT)1#ZKLyTch;WmHo4?KYJbe`nz`8_uHROEqQ!PGv7A72ju zhB)=P3b{EOJ_%x*FQ!-4lB5kRCEO#|qC6Vw$ki5=H>MEBa>eOR<=Di~x3La8n!KndlaVJLniNK+LQiKfjC?rCtuEm zQ}-kCx~OK(B)&Hxu0ArHq`fTl%yucPbs2Y=g81RfPdfWDe=XXk*Vo*h=SIOl$_q8< zR(+&gE7CH~V||%_EMinW94=-zIC*SK-R{SxEO= z(MZFhuTFTcm3isFY>xpSdYj*(%_LEYpLUP=Vj$nD-Zl$^Dl1Dk6Vw!!hlJ8XfH_^|gXIugtm7jK5F%NDQALlAFoCx784U9b!Wldsdj8PiPy|MiAZ9DC1e1Q{29uTeF zZi!IPx_xN0+3gJRxc0S_$#5h4>T3d0j_~)C^cy^n`xV`CzPh+^@#X?2;WY}!aeH)z zyqo_6j1w+0T&}7YBviYZoj1zmw4I$0!s4({UaKMz`qo9=PtnS9$a$fuKrI>S$oVG$ z??ZQ~wUmA3Y$`%oISR=Mh#wPNCv<+PB&7P~Q$)n~c7|R|APCKPm8;O@i zt(Evk8u^yXZIb#*5T0X%mxcYWhyZ@71N;6EPHZUwpu=;6cW3%}25@X53{Ub|tSCOq z$NyF1Y`bqe_CTTx=}lLLxygPf6N>mFXBOYsJ_v-fJbfkvF0-{m?b6&**~gZExMx{X zeCJn05Mfc!!dkk5F(z-@v9Jxo@EcTJheEU(QZkvhW9H)L&l8Oj)W*Y?pehN@nF|HJ zACwaqKlrN*P2ty{}pU({H_&i5U$XArGA?Uq@ZkYb>P;v^YhHltFtH$z+w2iJ#^0F8So`@u|rP3Xv%| z)sf+R<=LI$-F`yvOXWn5YeBfy7VNG1Z-) z)>EdTOoQ4|)G^f&n?C}$cO#kY%|$p^Iw>lE%Zt2Cq^-D&U>fER);R9nSZR2=#p8NS zGr`)Vs?G1{1D_^7MQItgMBE+rj#Jcq`32jZ%3nx!n`e9^Gm2~{u6HYoH%L7dHWdM} za+=y73ob|a@_kb z4fGTB*I*guUHj>+LppNm{u45?Qf{Kb?7?9s$G`m}y@&Q16{0+}dTWdCZ&Cc8RlY5s zrGuYD|L05z#P`>k(qB0kZE(vED1DT*7Siu>I}=mdZQynJAzcOfa&q|{RxC!p@xzY<1WD+kTgYgI1E7_0w^1g1j+RXIoL6WEOOPk^ zxU}y3DPif-mZqUdG-z@;+9`R#`N*%v%SySD7y`e~@d{bsO3)~f_r3aos`3g8(fBV$ z-t$fTXF*)4UFf)WCp^s#&iM;YsG<;f-8kN1qHxLS3jg@n2#8Ml-ADgIeUJ4E$5vioL90vS zS<{1xNIWdL&fLKluhhr{c%0jm-@XnSv zHcP7QI8w$k9 zZtD~oS;a5=+Up;H#|!?37DA^>`XR|8_yQTjtJeO##Jz`RI;q(GX3o2NAIhh$a4TX% zr;AIZw`*G~HCO6DD2v%2+s&v+&TANSt#3nM-t_9a_yvg@rr5d(Sh@)~x(Q(}_ke@@aKsY5B0?LZ9u8EHaWs1dA1_t^cc<|0X`#4~ZBD82- zLycr74OS#f@&Qdi)OYxCh0Gp4*Rigi3#g*SpYZs7^MgKXJkQ1DCjJ|qlSMs^;l<)t zogLsXO@>v{HR@Z8qBJs*!*JMd#r3V9Ytq-ibwW1M<=)_;FC(sEF2yB~Q<}(qQK6Cwu6RO-qyWjgw-Bv}FwD|@u2JiD*UtWl^S46BNx)}77IAZA7d4L%Ca+gK zE@hP3VO$98d;A%hA{rVRzma;D?KA;X!{wF@i$2l)WK<=bW(mF=sT`FeOsd-lxQD!K z*E)9AvzqPBqNILbf{HF7*k{h$X78Hl1(j$(DglK)s&>O#6MXi>`T{e|#fC?t!k~g= zf1{nYx|s@dy==^CyYGaQOebce26OQ`Y~S2~FR%cmRU0|0D?xFpZCJk3zk?k*Di|~j z%h+%+-rk7PlEQi-=PM0cr*&n$m-Xc|^K+DoBvuKjJG*iO%f}NS#2TWZJRuRyV8yQ= z6q41PPw8U){Svx#U@=I#hDPc>jXJYsPNn_oXqM_H31~Z+uIz7>WZggfPA|9b-SsOq zmOUWFaCBDJ3?7lAiIq}Tij-U;1aI{1)ZmeAiVLcge_p1uvT_-puwBa-VC{T?rc(zq z&3%b#&fC$K)Q=zNXyUlXCJ_0Pe@6Dq=;s08X_{HuQ+*jl)wwXmtZoPY9nrTQEKyGa zH-z&{^jZ)^>nze9lN0R*hyGR$Yu=4(eUy3<;V++GSThjuLj+j9T{Y0M??H+jy)rL3 z@D`6q*#j*4%k^xNRxJku2FM2xB7*qfDWuy7|Ne^0Kg*gxe8TWrWM&o+@cwA#|FTP< zyL&KyMEJKAOf0Z2RR94A-(AH39j~F0G5ki2FrA=)2oJoB__H{G9u6e_-N-M*1A+pw z31O*n|3C*+0(WE5@haTj_q)H3!K(lSgXus(&~2Rs48;)M{k9Su2?!JsxJzFp>#KUL zv*5Ljlz-vY){8(!@?VcH67~hpb|pti=t+Lx2dK_GlrP6(BRnYAV3cNz*$bl5rL#|c z9(W}v?El*R#P`LOU*&wu1v4u?ec^h#LUZIxIyEa?#fqqCwgL8!uN9lY{QWmCRQJIarWowJFVbx3f6b>ixJBr;5MI{6IfQOkm89dcge?9)*jdrjVVIP5eH5 z=JaQeO2i$ScIKO-#q7HB#x~#W6Gp9hM15CPXM8>T-7l7Zka4&QdMqUvGnvxcM2nk@ zWj;Mt>c8am8N)QixpTNXW)73O#hX*tZW$_R37+@8D&=pFJxBip3>5&9+=yFfo-P_6 zoT)ah)kxc@i2n#BmalmK@&@vVEiO+UB{pke3`j4Wg8f8?#eFiV2K&(QCidg^^P%*{ zt(7x%wPQ+=6XUm%rq+|;V;092VUl}TQ_R#yM}tnXgnuc-%t|;=4HHeZ?D_L(f-DsQSn0PJxJxj(#pG|U*SHh=}KfPFSW8XxVht=aP8AB7-k`SvSzN;!=&p+dsQx1 zYk~Rj!ttWN(ZPrJx7^zU0{x!r^7?nezWZAWQNQLoyMAw#9$p6l-a5R^5m3!wt)0+A zJN9~BSpmy9{GvyLTpPCQ011rwy-9kCMnn{>z!%$|<>OH9vcmOr_*dvpE7{FS*W(de zaMFWQ8HBM=<2MF-n^%fdlNIMYA2kh)ywjOX;w@h$kq@SA`yNlLN&s+(Fk7j%v{F5E zzbsS_gq};0wuI6dXJ)jDBfFzvn0thiq8%SCkedH+JG7bVLF-3cGKUnZbG-@Eve3aZ zkA9^tkh!A(l8zase54c_zR7W1wyC?u?kRjioHRoojvZ5o@M?bp{(k^`@zpXuvR5q` z$kZ+i*eloHv($PZ=OkyBN^EYsQOzzil_XXEN$Zg8b;NL;6f}dAYBR%LX3Y4-bj0Vf z%xoIItB^4wnVc61BBXT?PFnGC^E2YG#%1P{h!2t5$Zs*@UOb-|kVVHYx^#5TPVIW7 zp=TiYxV5Nx`u#NS7tUax6>q$0jk(YI^M#ko+?1VN&rvX3yM{>JSs%)eOp>VYf-D&?y$~^eN~LZ& zaCTkJX6z`YzAHAY8lPI}gb1~p6+LVY>quyG%ip3?9XXOh{PAll=4nwewZ*r_P#TwO zQ-b-6bUwR=^GYuvd})s68L_aJb{Q=<@m^C<_g3MF%AW1Dm)88%jR)$ zsPsPxCcZ)ZF-?{Ui`NDa!M+*7FHf~75EFy`TQ>{3tD9y2+XVk#Whvf`JTbF)XFpo3qo`Ojz|5dj_{c(&=TSEU7j;`S2ve|iDo*TqHP zg_F0v{#l3%0{(gP=QbN9X#^la1pnnvN)3&?=7kBK!~IEHh#naA!GR*}T35A59hXaE z9m{2Kd__0Ea-m<>8boSwJD;J?x1@hR`hfsNjHHwRGwC^Iqu-7Ckzbqt`Mh2VmoAB8 za#!@^qHJGaf-T2jvUy2Sch+hNRt*tu2Bt0p4W-FqeH~@wa(l7Va)~h;F^Mwd{nf0d zV>~CRbg~hdA{__EN498^ViLKo1zMReohYVI!Xdcc41SMY9=*djY<10y$BUlQ zJ2hahEq$4dokXP5n4jF7<6(MyF{Vc%D1om2n0V-1oT1N~5hO-21RCc`t#w14d8bGA zA<3C+8YOpI_JA#vQx{3G{3Q<&#MB6F8nu9f1h+;HS3p1Iv)~LhW)0?tr>#y)M8Kuh z-~u}jAH{`0wP;GQv;CHO`-L@55ABPx5Pl3F?f4MVvPCsUpLpNLKcQ^OGhP--Z9BHJk6AaHn5gP|R&^JNsGDvCfs2wpE%CzzHEF_qWm}YI9Ohw9uTGO&5oEltL@@Oq4 zRB#5W4P3#9M(?ev*Bh!)6|iD12Y}>_zJBC-*o&ev*hc+E z33&4Qji5%&oFsFlWyq5Aj&Y_&25M!9YWju&q1y{9#pNgIBvuq2;wosXt<-28G~Yb- zJjgaLSEPfVu<*MNJn&-ne#5U8Yq{gx`1KLHq>KO8-31eAf`_FLRwH$PFwVqxbZk0a zAm{5rxsA6P%T3b#E*XIo2PBZ{Wp++fD%QM0(3 z2&yLL#})i!*-a)0gJ>~yha9UXW7#BizKP`Ti#^YjYyfjSDfD!OJufdb9J#nIbF4$R z_&hC+hKiyR@CILw$jglm-QevyB{}@s{gSjZ7C5}2@r!nMuOC;xccH*j<+PsHPk%0m z`R~tXiE`c0Ql)fdtBFkBAYU=R0kj#ayL`)XG8Ko|2J)hd89=I|-Z(kEf9BWOcQJeP z3!$JRbXg2X_I-dw;l<99)O)VbvobeXTBeqC+_M|w5NmL=9-%n`s(^!A? z5-A|~+@$VnVq+WbiWj50l5a|`ezhJ5AHmPsPzxq+SDg5NbiH>VR`35m?%c}Wn`EzS zZnv44oz;*svy;8IJA03;6GB8tWF|yHva&;VgD5M7sQ6vCoA>+mdVjvZe>mrPJ@<8; z>s;sD=kdJ8JKnxbpNUu0x7K7PQNH3zU=D8@sCx#^lm2Kyi>P(%^5aM5$FrV06<^M# zr|P;!N@WDO1>Y#VgX_KM9%rr-C>4zOiE4FMyIVV9F_9630*O!Xq$EIBoAwY1vU^uqiA3G1w_g*LebqcT2K$$KH^c-rR5Q; zH#xmmgP#3rx!@Z1qwaIYZ6%j{^X_)hs5*PmC{?Gu0E>6%M|G;=UJKhSTS^v&N}g$( z)Qx}c7rUGH&&xiwT0Z>N6ZN$CW7UUCH)y&}`$h`z*L~DTgD=LcY$}ZrBeT0^M+-d` zBOYAT`I#X-L|2R#s;f+~rRtQQ$HG(?vLX=lajEFnjSHn8nGYAT6gTsOy&KnYDEdwB zZ5kSUX9;foEO&108(EvvLuU62t-+6j$PdnYiX~7+e3uAM(op|=SUPFFAH2QpTE3VY z2J>1#?s(Y8G&u1lq>*OEOAep4gecQ|kPNs;01hFygjn&#Bv8VVGBR+PC8US}%k#j3 zw;@tO9a|TBuUp_b4O6{_ADw$e*K?YUqUE=dn=1Y#r3cA*O!iE^QznlYS!Y;m@C9xQ z6;PJ49R3zY$X(-gxA(AmZ{{;U9c*xwGwvEO(|~Q`ugw&#PVx3En$j6gbY{Q35~UW0QdADX4PEANHlhWY}7XzZKuAg>3)fhtef?tkH1N^KKcTg3n3 zk=cn@o?mtfHhG{cNc7cTulxO(ZdSWBdv6gozPKBDrTufzLf#b~({hrhb(Q3n6y?gv zf7e_#9?0o9MzV){><=y5jiMXKe-Au8#YU|xZKH$urQkA+_p?;4lt&yb!hg5@+1t{D zUBlTlUzgl#UHhvn>AtM9Tkjx>#}w5H3p5|^v?vc0o70f5ly`+NHnes={93>FG?V+{ zhjL>5;%b*qqZ2u0&f&415ALNFr6AwUo=s?_dU841?abACm89PQZj99v zH+4WoavPCiGgjn`Z>&+z|48ZA3+T@zS%ioD^*9ZF0btXIX@#E@dbG9WtOh_IA6a6%WZ@B)wwek<^$k1i7y@WYD4EWANQ z5((g{xD@ygu3jks?!m0?r2rNVM9QB=C&UXAxI<(ZkT?>6xj+RFJ}S(+lYcI*LFe?{ zD?-@IKEVSbhU3B^1~}0N04`p5L4@$FByd#a192fF#9^@nh#lSqZ2;B+TPA_0 z6eeFN0(S5Qa^-;#J>2FCkwFsh%_N8xrU-*h!z;efIrz2@!~qa1Kq((=<_D?4V}OwM z01prT;{&n4%YKkBXucB;luP@A_csH+5FKpl52?UZegNXshM}qW0orGO=py{k5AYcT z0NMzK2Kb2JkN_wErt=3{{}SNC3jRRrk$D+37#!w-kP1Rl5)KWA*f5pnUim|u*yhzh zC;*g4IBH1~A;O1~gCGLfJOHSz2!goaUjYy&K&3GU0s)W%Civc6hy+#$hHk+RFtnav z;KgttU|$P{lwi9cKr;vdU3M=BBmhX9hW$gJ>+mpW0H0WGW7>gVL@;?M_>&Y1j7gwD zf*u8fhC67WY$6ya`xgr-{2C2ufU*QfUc$n6fO_+g|K(zbr^12Cp%92G?Ey6&ydMHm zFm(sKu{A{l-Rhx0cOn|}kYgxhhKmGc0YEm`;nh&kyXWtKBc?DY6i&SZcw57Oh0Z&` zf=o2T3Uh@X(pY5#5kPPt45Udc0z$)x@S~u4z(1@e z^wCiy@T4jn>%T8Z?sPaLly<;?2a`nrMulh~UWGZj6$KbSL;%KwD98?`iv*o3!h{bi zMuNyNc0r{J(F8C&0;2&VMHFDnkA{R{wJ1Q_hz73sU}!WkkTtv&1r%n-06xxWKx>VG zyy5H7fOahw&|)#Pf92d1ft1D$cG5VY=r9`eCQyDFmW%^|`Njar$v7Zc8Uvkyp?D}3 zM#chKMLeL{!~$(6T~7rs$3q(MSI`PRWFU(JOg;&a75pp?M3cmdmzfBLz)~ELU`YhI zh>M3f5E7zrWjtV9OM$czDD1F>4U!;oaE(w#VaL_cNYsNTK>VQA89q>RG~ka0)@k^B zDwG6YN(4H3Qh-Nci9kPP8gvPCUO^zJ4T9#zhi~2mmMxM%OIaFZjkyTO(xF&@VFMNG zXc{WgAyNp`#=w-!X&A@=pJBkIjtJ5tKp*@q6PiRwVNtj6Bn*uqq>cbt)bOi&P&JUk zKsMp%ET{$?V^D9fUN%$#ka8d7sbTUQ=ocVk(82JT`_MBChzkSeg1_8{dg0zwFq6E< zg~~v-FmOCLAP-srgROuO#O63E=I0yAP~DKrR|-@|0C40;c{XMv-8kD)PGIva?DmP0}i zyq^t-oll?!81Ftfx?2HN!bA5#^VLd75`wF8F$3x;^a8fY14Oqffars5@&R%710(>q zS3{F9`vY+Lv<6y(KY^o$>RJeb;G6=8rlG42VuE0YLeRd_0@&G}LCf&?L%?*l0aAqE z-6Dtvc6$zW!L*OSk#-~W8VZE(Z62zF(*Z+Dv=F zl>!qq0AgAn$dBoBz-ZGCeS;+%F-LEqC0MNqblS}U=rjadH3OM|L4dY|Q(gd>`XOiq z9%})_+F>w5z<*i+v9ji*>&}cqjWBH+pe>IAhcsRR#`!UfBHwmE{Phkxgzt3#BFO|M zzTr-AC_f2FK`?F?Xa`XX!gcSVO?V%3`g{tSfbF_LP!Fdu9ys)X!?_tq1%fqtfh1}U z!iQjVAD|k{L+lW&-wzHW7oZE^@GW2fosA2@+5_Nl`y+H7f^7#OT6lg25@>M$4ADUt z#4{XZgP?{h7NI;DiQ`3-nv1oojf0ClSWO(gXCo51aLdxez{Azr6Ogc91ON9|8I*)% zL&OsF6O4YThJa=01BCt;^4Susqa;pXsFp|xu&_7=a9T=;f|g@kyQPE}I5}F15s6p= zu&xAHdmQ0BEhR7tjz2=S1i#QoNFA-IOGy7m9a!|7 zEDO+>`=P8L3ysRa_D5E80PW+YxR%K57mXrY}CoX`zOPo{}vIKdTI6*>L0>>o4 z8WbB5@I?ZwE00fr)sx~umY_=|PCgB{#HoqW`1 z3AzV$^wA!szd&xlBKCw0q#Ii#57PqDee%hPB^W#4qmdIfkZ$lx-?3`U67^_cpfN(g zg_GYFEkSZn*cy7E1>^=Sh>wLpZX~2mtb%l4>U?6=fjGhY>ys0Vw*RnUw4JbFig}`r zYT{vn5Cegt#Ly@HiGfg2CvVq5BZ%tg6*!g^ge88GBuq&_6nJHhwT&qVh{BeKJ5ma) zpVXWHT7Y@+6JIbT0x{1O$8sP@l(^){_!9$RqOhePFls;msH1XrN9HjP4cI54qc)Jq zlL`}n6PU+76&I{&RwmX|P#`Y#{_n zw4rYUl0(3s-+{X`;}*cQ0|fRZ4g@`}6sYfa$%+r{Wq37rHdSbSeW1%sa((?(E*oJD z?ipX-XdL$Er+lLqPWk%!l7oZ3!~Asx`GK{P^&gvw-zy#)*V?^%VkklLm`U)XoevKi zqnwF79h*QijuNAj^~aAzmQLl}9G3RZcz#kIoWnz!vSA6iuY8_e?iyf&?vQnpu$>k^ z?dFDqzVqkLA594yExADO`)gw)@{ajMv*^&+*uDJBmnt|sEQc%pFIP@UHk=-6J$xSa zWNp=1>Dj;r#o@PjCN_$;_lQ%!5YO-+F2k$apEGQspEbS4I5$#+x`!v39(=X3B9%PN z7pANHOpgt(jb2XU&bA^M&J{Tm1<2U%1%x;6=ASWuGdUE_vKFK{OiOthm1L>HOHY(RIw_`E8XP)A^@wYi=6vpC%cI`HqsAR5(L(D6;@!Q(^%c)Jz@4x?$?;YSF4t_kbSzRUY z!C!t!|Ca1e^UuRy2ma!J=ouVLuE^ECTvF{ozn>gm4X!)r+k~gbUJrja8-8i=JFw@_ z{~)kinawxl+{nm_+_IZhw%P%YJy9Xo4olNRe0eFF6gyi>uOSsDUXE0Dh;Rp`yV=U?|y*R|mw-86Jahx6;w@V3VT zzdcpYpxt~gPRL0N%}=;P)Abko)Ava4st+;DOMNF-3#)x&|K^+VD7{psc4)${6fvUF zb!F-CX#U%u^={vjcefI|9Dk*Q#&RH0b2Q3!9(|){UNxGC`BM=pN_f8dOxSePy>C%C za(JXJOjHrJpY}}kU-LLsgubA0@FgttUh0x8@RsPDajR)j8TO^3w9EWPJ+w5ZJe;KI zI%+DBMcA6z!d!O$D*j+MS7pqSaZ^T3cf_EOIi8IDuH;kgtS>V@QL<@;-Ga-P8M_|X z+3lkBG}D-nwWZ9Dvl~9HkCO_T)eb9DvChW(eNi8&-pVr| zEV|&a=+5`~YZhVHBxN!v%Hx8&q2k%T5j)w7-mx!zOX%>?M^iMFK0=xXW@a|HoUdTs zCv$&*cZz_(mD+tx=`EGWeeQF;i(dl8Q6zZYTTYl5mEu&v!^7>=DW!h1HaN@C>oP~`QzH%t z{la@=wPSd;VynlE!H>$$ICU}N@{_w4lDZ#h%HE#3mN~l4pVKJ!`st69Z<1${vjwZs zt)k0ZP4~$481={cp54p2dRB3_R_pIz#`>mtbX0b!Vw0zqGcSswuR`|a*NlVv7fR+E z)Nkt)#XK*Y9=)qxtRBht=*$hua9>}a7w1R3ve~FUe!6TePakrM}!+Y;dKzjcIPrP_gjd*uU}hQ z*)xvy@5^R@uB})to_D4G5+6u+!QkSJ%(#QwZ^-q1`>8nJC~no2>-W4VU00OTzUp~d z#Cy^?)iL;+BFa#&S2XkPC+(LSs_JBU9m$)Fp*(u0ReZnc@->~~X;&b5-LiDhFGcIhvT4_x&T_qQayP zZHmpYnVU6Z;8=gs0p$%x&9iMMqHN72-&iPv2eL9)cd~2y|?P0qJ$yr-Isacom zskgLv#DjQkWXyKrT}hL_+>udxkt-XPL`2)$r(9cROR_)gn4KwX^sU-)`XO;fUNH3@ zms`Nw8g@oO_KZN*H}})c)noX^>gLL;{+KRL()BKD>~*3FsGV?jsaVUl2_KP+U+4scH0ok5q`Q*wm% zcQzQC>(3tOYJBYRrgfAbC#<*1LDb=*S>@2K9&3qrtM)D}re%aix=j8m^=VGh6)U_K zI2DsG#(rz(wcU@>ThI7@zY=I(e7)=_A?-yHUn?!X5%k5h;3M-VeWw+Nc89SUCH}6V z_SF52ni~~9XAO7cCr5N~9Xlg*&#ERzUHA8i%!Gw^xI zchNt&rp>|?hx#2HHRaL7v{KUvQr9j=$qS*kw-xrjzYuT{;EYlqOwO>{Ou5_G8gyzs zo-k1%^wQ|mGWT02Eq_jnZ=<0}^|pfPa!sma*(CVvdN!9$LLCHNiT?>UD^9FB#kCa~pz`Y4=frIJJObr( z0*;r(Y}*|&)PDGFW2}k{-1P<=yw}`=S?jN(-EO9LDqCB=cb{tf)B9M3=hYVzBUSwQ z`{kS}SKSv)Ls4w7kWK?;@kO=?g3YL;d)R(-nmL9|FNm$ z57R%3<;;7aN%Ju)A=)ek%d<_FRp_4Iu? zDU(G&$*S@cIbDT|XyXTm#MAgc1k0)hr>)tyGI)v2H17zf)jY4(;1S*UVkq(bFMnuY zQb`Qyr9)-D$^v;Z+Rr+2R(F*+CkhtVC&Ip?bCpcaK1K9b5d3)P`ViN;CqKGdWrcR@ zyzcs}{rd!xzx=qZ@if1To2@13;+G$MoUdqzjlayuMWn@yb2lq_dh>gI!_2LRY3{Ny zFWhf2KKtN(sXSEGw#U2nRVzK7vbl$E^}H9SfZsb&o_}0kZBQj_&-e51 z)hpI$TT67+kN25pKJA*4DwG#YIleBqtgXw?EML--cE^<6Zz;Ob#-3S*D7;CHMy6c@ z8Z)^_HE!gDnzP7S(GsrnivDK6?lWN_AiU@lF;hBeXZ|voCJblMt9i9c0fpyJduu(o zo{-xp#VdsSZe8MDzh&(>)3&{E>T6SCF+w&7T~66@jigI6KKYD5t`K`UE|o;vex~Ps zVYs}SXiTQKsiSe;VJOa-MkmH50lo<{sR>C+0Wp|1>Zuje3kkZE zQ3-ZT1U*Ue{Ji8^P~TCd8}NUIhxos znMzw1r_7s*7p>2CvS`p-4Dco--;zwWj8UUgdvrHdHOUWEDgS`eT0+imT;Pg2S=7J} zT=Z%v$#666sUpLvmT|n#ud2;s8)+!i<=Tcc4HGNS{QY4`GhWE3V7`U@s-MsD%x;3u2}T6R z^IwxmeW;zy7%z*zB^{sBU!)S}sr~Tu+}`$i$Kc;@hG+S|z0>vllg2VwJ{4WT8ngW) zc1P_()?=;7`ij9O0VesBpMf!LAF_4^F88(+XOfjchGM@@SK|e>I8nCa2KqZ1eP+Gc z?}1*8YZ7OY-`iu7NPg^2$^oltOWOAgEu-hMYJ4Lj6_QFmNqP%|>9~vS0_R9rm-HcU8ZnDl?=rjg zwW%pB{|&K&TYBm!vt-Z{t)a%;039K9lz_s;@=l2^ujxxygU>z8>c1gt|Dk6gPfat! zYrhL!63goTL}UiVHMMmfIZ{^cPyc4#v$l$)KU;Lt4uzw($oxjcc9{(K!rNwa-J)3s-}By^ z0~0@!AEg;R43=$NiOY{Q2TREp@s@u)CSaylMEg$NVJ6aB^YHk+gL?A1R-MaOxO(QA zC0}f*pKRxVx!@I9?vTxV+^7E9Lp>ZLKSvP?EtYT6#gV36|JME#3w#zO+S+%=`YQ9%lJe?@@E7_aX!HI$dJw<`1d0W(Pfi?-R4NrBnoRfu8tZGr= zw$z1AM!I(PsUnXv+cYB2gShSVCHmOUpj;;%@>6iDk6rN9TBl+mWDK|53DX#tqOH4LTxns`L z$(Ly?$ZR~1vX$TdP&2aR`-H9R^ICR}t4x`D1z(1F$SBE_OvsvjO=WzDaY&l^^Iz}k zjObn%!EX)27bS&O4BE@>libJ5L?jRX@{gmpX)3KBU0DqEG_4%@rCNX0Of0DNkA}$$ zaw`i?mW=t_pTg57;iYCV8>oV6ZvOJBtm+~zLecyCbUQWV{5coYX`66j=z)=LX0bBI1(qZW*=BhmEZW=W2Utf)i$PJ6>S$FVxQ~k{0Z|m>qWE!nZ z3S#Hp6)vqwa+BWv?*&c{AEJwmJ`AfnTAN7r!-2)U!n4Z-ZNe%F@}V9epMm{fLPj4D^<2 zWn5osmBmhqpbwu1B?c!wkLVbe>c89US-SOflAb!tkTQxu*OHj4KrwGoB^jT zc!a-)L$t?lmqkm&q$o-x+&&~ycFx&l>Yvq%d|E_oC?%p4NiJT?!?UbHTV3A$_h)s1 ziQC5?jd#CYbiPF{<~uy3j@I%^?TenT%vjBRlJhWx;iX3_bp*ajP0fR!1p+tiO}ON` zdlwAk`|8tIQobpL<&&vwq-bj1c4kw`oky#6>#@fQ2sT~0FeF&Yp>f)Dh>B_l*LRqK{YGkeX_cjxS;^IiyflZCwIiZ05jbCJ z)n1Xe^;Z;ey7|+w?b<{--tW2Kn7#Af6>Ra_pG>@%f<56|kDL>K%g!5RKU+lRKg{Jq z>rn3)(df0OrFxqRhAfq?Xw+_;@_4pdn)86*L)nrJ>Z~R&o&4okan&VODnH|wmm3y! zzT_3ldi8FRygcLIduwSR(oZiWdVh8nrrolPETo-xfjQ6de?PycaeC13H2h7bWgusR+?boS~eTn`^jZwX4=9vAFKBI~DxEtT>jCC%=aLDR|mc{P$2Mq8krC@cvR6QMJ2Ao#pUDobU3D%0M$-g)K$t_Yurl zXx%*{@umfd+1nN3uCG_OtySdRol^e9Z@k>T*)YvqMxkqu8KZnJa^!OlRsV3&$54(R?6scpj2Ymez8&P?h-n%ojRkA zRn&}4!QK1uMAgc<8@Jgb)gLZwG;+Ot(pHSl#SIAPuPrFX8+@4Sg-7r)fVFQmS~7jf zAD`n?XQ`QZ%|V?hq#ha55&QL?GGHknFEm=`{EWebl$m$2kkclvI% zuH4f&F(ay`6uBv$sthgtZ}nOxmgjoDaz|{@9g5!CTGd_XmU5}7WG60fnzs=#FE6G? zw~KCHT`+c6Y9Q#WU!tzNi$90+v+s2=vYm{vvJdTeC8KKLVxQ7uD>T;|{a8^Hxmpa{ zzMBtsGONV?rNDx><1uX>Bqe?2dtL_Dy3C|FJX~=1GhA(1aTS6bChoS>p62NZXJ_p1 zbU$?1ZLSDnJV&d=Q13HJn(*igt4_n81$0@V!UJo{V8@|^>1dl!>l*Kzzxr1`dhU#L z(tgo+oqciiU1Q!IH3COjQIlHUuVH64TC~Hq*3}*`$_QF^ht=wMyVm$0c1yOm)0wQS zuV;(CWf7NKTt_Ub+Lz`KqI&-@eZAoz?;Tq=&G_c*nI9{)f;W1D4A-@I*cXQ``WX?R z8LTOoEM6(=yxtV`SdF;x71sZO>+!C0`jNer-UH9oyN_{*$y`NLb++y#dPZ^;j)u-W zTnREQD*S>7iMPw86CHbR1 z%hH%foJV}l=PxB*=g$}^i5N^P&;@arSX!dbQ}cKUuLRvqqPsQUQ$^(Z`{sW1SzqhO zOU=cZ-F)a5{O4cZr_*zNs+0LICC$dXm{@1@y@w_zCGu+ zyQ;p$^kVP5U6@q7l+46%jxBMU6&Z}*TBgYP+b1ZoPp|bNhcN8-I1U&=xzJ9>it+Pv!lsb5Q-Cc?E;^|vB zf9j^r&?qH-t1gB}u4m2bUUmT%-H_`RT_2JEGF8s-9 zT6Ok5aY=$A*0kNe&VtJ$l8>(b9M`a12@`OKJ|Y9HIDEq6H#NTLC-$BrJbMfG`+}eZ zv9ahY`b$~Kft(UR=cWHEtMYbm{XVH1@ zw2v`lclzZZfPxQV7%N#a6X_>-)-Gw`w8vnZ-;n(5sJ`m)5KGz z$X$6-L+1d8sPJL0%O;USmE+OQLeYaPY3spyX6+eIbAA&(Y)zz`J|pEK%ipk4KHWe% zD??jC$aMR#^ILjKls=`$4|e|t?0#z;OXzGgqDh8wMzC0MrSRhE1g~`b(WmZ_-E9&= zNl$G|%O`3y<%mND4$xmD82o7Ayrm74^ikg7F z3m1KF7e^2BOmNC6Kb`oTFBJ7ru8T~jvgIqfRPq8&^lVHwUGB=Ga#>MSbwjD#4VXQ+ z+;_v4hm1h11d-R3qeX_U{p^+;U??Jm!|;ew*U;cbNNKgvz#*OG_OM#x)x*7%y+-67 z^G4FHY85BPUaZ&IEpk7q+qCCy*6pRrx`y4;zxwW1PK;cfggN&MBGu&mFFM{)$?Pi9 zXi?1^Wd%__u1ed`)Q7rW+y$ZmL3KLsu3Y`0W+pThJtDoG%6KJ|;ge*)^V7`F90W9G z<%YksG>OZinfzQQ>OK>6Ilrqgq!(&YbBU9ge{`>Py>C~X=#C_9eYJGpP7(T-B`U}O zKe0jJxk_67k{gK+O9*$M3^~8_WPPQnD-!+rvY|sy+Jjx24^t}d+dXA}g>F1zApLCr zD2yR@WmB~6*6t#5kVMAl(=-2>XJBiV5fabo(azwTE^)=~DOLU5R2w_r8D;~}yQAkA z*yo$pt){H3X#A*N_cBdIRVU5a<3CC47c{hKMIw)X)ncF`fd9^ zq8Iw2Ebcg;{jxw|=@RpDTS<0zg($6L(a^P%Z%Imjl8$hkd74^{DndQ>r?8EKDBZW) zBqk%n^xSXl)^_me-?0+uu^TOB<@eIsDD)fW;gLM9h(jdOa`r5c3++PkH-6e%IKN&D zzfKooNALJ}V7lr;AL01M9c0V_LmRmpbq>1n=;vN&336*!1m) zxj$AHN37=meo___ZSk5qLq?=2>`_ah_Sd-wwISpoC3268OI8DvJm#a*jNixmiK@SQ ziau@EtkUezW8zx8v23_N+%ami!AoA9Z}#wS+55438SyKgjjIBg52d=Z%pOqQW~$X@ z>dVxcfOlgJeHTn$#00LEBnmX2D=grtzp9e$TM*kmzPIGTdb9b)e5ch-#I183mD%cs zyn9w;pU@6*giI_=ePlFk|+Ne9sD;)7wWm&?)^e?F-cE7bef|qGU5nrVypRggA9sxy&xU!LLgQU({Jz_-qs2dTx z?__sUeaH*WG?WyLu?k)M zv-m02$C2h2?1W0EUl9Jpz1qr6yyQM_-u+fC;OysnZ`+>?OXFT(>gUJ%W}uS2JyzgK zLAbM)>EW8abE^1TIh#Qww@9L??F?1ycjcZWdcpgo3iw}e?H3R@WO;3+6vdj(b}9Ud-noMnhHkM%A}j=Y@}_P5GVf3$E+*Y*MkM-_b9y!sgxqJi+Y}Udg{PNTxH%C0 z0VjEpHg?kI-OPB2br;V&+uG-ve@cZqa?5^-vRmHFr=wf5OHKUn=b}nxs6vze{W;!X zdZE-7pOz0-iw39HY%l(JC^h$LiP(-CZR}p~GBz^QW#Q~4sa~cWfA^#tGLl!-!_mxy zrF?j&UR^tP$5#|tNf+VV;MdPf;=7hwqRML6eD=>{PG|d{x0eqf#k7>2t-sL5D7rztq_gZp|llz%PWjEe0&tFJ$^GD4xM%ME& zCw8v%m7b&gH0IMxvYoRzHL-P{ypcn{>D$vpSH}VG*Hjjwe1Y& zUq9Y>+%411NL*@6GcNOS>}=B_&CIXNO}k4i=<`A5KDmdg2ZUx5j9$&Nsmj6}Y?Cb~}pp^h|WJzFqQToo7FC#y;uYDRn?8y?GO8xN6oZdnmg8-EU!ol!p1n z#~~x8tgR}lPsTshN*`W6z)h6Fw|&@(I!Gw758aT=ma=DDc2@Z19lK%G(znWh**Wf+fB9JJu@og#L@#rdOr-kyH$kxbx7 z9{cuURWjYy-_7B(Q>hp6i=V%d+9Tx88Cq%?8Iw`-=0$|fXUf`Fkwq0|tiSJ%Obu7F z$^X`sv)5}ffA7p359%(})#+1YehT(LGe){x` z%Oq)DB6_vJ0^x@5HD+sy9P zkss9+c~i0}H(~}%&UPyu&g5u!DCzJ;4W>u&HavS_@iI+OSnkQvrt`d`AlVagk+Qdza~3C;48D^inwK)l*V9DXveVA2g6N;CVj`qMBsl zwCViX=IS!~%6QfI-m_s`NZt8|-SmgH(^1RbX#|V8Pwi^;_8LDL4(2zKn52)iM3JwT zYA@uYukU@j{Dy|Y9UrCO{MNF1-N4I2r?B%-l#vFp;GxkyVaIT)V{ zZ>86j*W=}RvTIno(dcQrb9{L=UHrJpXsur|(DHOH%8Ys{_j;6EANX+o{98^3Zl|Rb z`^nm8x9y9DD6VX0`MpkpzHjya{u~|16A$&YB%z0HJo@3eJ93%tpt0Be9lz17x(U+V*N0#N9J&AvZ0Azzp3H5 zP2qa*`TflW4N~5StRYcF5pNQg9NXA2b$0thPg54Uw;ksW3;G^3Xw>a?k0C=@?^+n! zy(7*ld!Ip7r^uy8mPRx6^F2S;7pER2t={KuooF>=2zgpgBaudQJMAj}dj+!hUEcj_ zZyn0~e_c#SuzvsU_r&mJS@W1Xt$Vr}`2_Ey91gNv9umF&dZjMb^Oo<*`wE7@h3Mpf zU827d(e_%j{wp#>S~>xccmOBK?}uFTxTh;O5V7RL$y5-tQ=nrE>7UN*cuCCfj?Li=#% zZ=qJF4Qr_h_v!rWZ90N?)BPq$bBdUdGVam3TVGp!`w|%m$@1`GBc@ZCb@SK4a<$zr zZ+#SwL5`VPy~TewVlkR5tf@GCz<2Y3x9qbwk^^XEhEIJ6Ey4WvuZaisyC!yY5T9R~ zWLh@we}25JqZ`pxe#-P|wYkCWr|Xf7mVr;xPF>~|&)~Jzqn(wtw!ipgqf4g(H}AT; z1`BuHEuEHx#`|9SsT1ew?S@__2JtdRg$t4V?hyHIWg}qnT3qqk)wZ8HlLE}H-yaye zK9Ob4vPb`%_cXbeW8_j$lybJdkE++xo>fRLE!Y2o%(YvtcOyf;58muO{Q-{$QP4X~ z#O$+aEIxyZc59X>?;P53Dajt3z8Lvh*`FhHRgaXN+2qm3ig&XL_j3?kGu0m+FeA;l zs8h3{j;rgcjb=^m%>8Mw+jk3 z#Fy0GCicuFJaX3#xZ);6>uBRp6=$*NBrD4~^ReSuoiB^{Rf}`_B*q8028_CX`;5et8#Rg6<;zc_P4%ucG^`WxY<5uSH`NEct8?itq`tDQ4!!srjU(jO`i z4Cbnz>5|Mg`KlFZ@4b&4Zf8m5;MIkV25f&;TIwgD^}$BkOA0_WnpJUSK3o{cbn<$-p%`JQ?C$yR5!@ zC6+BxV=cYK6X6lHO!A3H0q}#IOl@Zn@lv;W>j8hlu)|W@msO!)l-xq~w3Ox9r^C!I zmFm>G(L+O2E}C=pnbQZ6;emYeE$NDrs(*754Q@`=4_lV#?k4@Zyjpo<2YI11mTvSe zOq=;>gl^dNR@zGEpKu;d8;gBjzVS`|Cz6K)HC-zE-k!gATo1CNGq#3GSbNNW+33+G z5egSq_b#T~E0gU$%l#zfW5?DCnS!indwHFeMi&~FdG*sfV-xxtO*1ZkoM`2FSf1DK zmieGr@Pk-=u1qcW7VfCMemUj#i94{LN}BRxRx0sz!ZA&n^&89?lmn}HSQH&s}=wCx8KEa&ib1 z^&Jc;P8PnHT6mK;Qa*xDkSb>MBSpi{E3Nl#CaH)N-z9m$wu3+3P}d~4%6ujRlFYtRDYqWzioj|^4ixz1#y@z1YSK6bgI2LE#V zafl<~EI1DjzXPC{U*iBFX=;FA!_(H()zi_1->@N`!=da5m=M4>uwS0TtdkIPgFFX< zN*L@u*Ko-IA&4LZ5RT*4oGH*+co`8u1}9Ggd?H30tYwL4KG|OHzu&G)fL*EqriHIT z$qG>eotXS(jo?6_#9?L|1V0UclN^2i{vXr~M#k6%aT~MoU6&2w90PVEJ|dBSa$sa& z)+;5HGfz@q+ivWw~WeYR{oW}pvSYwNj#q9aLZi`@K#o{j5FrV}TPBt+t0ssJf zkMIO$Y2})%u&6zPLH=k{KJdN&MF$(OF{BvyIRA(r3uOU&L?0m)*u(&$<%kYIDo6h% zk8+hJ9K@8iwm}5Hv_sJ7{EsStEIDGuq9@qIj*vIN6)awbO$-Y(0soJ{BmXRb19syC zwcluuv?~8wE7NGsTd8T%g#)L;`ouG1rq1x0`jE{{@lw3Xq+2HXG3L9pi|R>g5i zH?SQc_8h=%Fpi63fk)u~QBMBlAlM1~|Ia}zq=-!%3%yRi9`%6 zJ#1aP*ic71C;q2Y=w5rxUU5KQp6GeQI-fbW7Z`5!9)*XiMc(7{E4=2tEVYC;h`TR-3-N(>%! zK`0#2DO?f8lz`!%-htw`&aMa@IKd4;Kq`Xu7(4i2TsMRqoalzYr$3<|`-s(yl!5i! z5b7s}kdkn++p!@bZv+zt5x?q&U?xAF53nf`Lc;X!2w6%{h3cPPfE{SBx+4_vuplCM z2C$s}AC?o)64v+$Fz7g4Cy*j+uZT-v({;`RA%cgMg9|+VuSzW7is(2~Cjh2nl_$t2 ztV%IZ4FuBz>mCTv(?=1(cAf}XfEAa3U$`QeSWnzLkv_&~9ZQR2q|d;0o(L4o;)Rg; zpWu)uxHN2VCw?94I)RU2b%6p2N4hG#5W;YgH-JC>1xE= z7;yea=P~1P@JAMa7^bJ;DIZL?|5KI?3DC{lz6jm_*f|yuhr@gk3g`dV?|+WI{|t^} zzfVAwM>#^uh{63J8SsWLLim3MJQ5`h3;O|^Co>t=Wl1SG-VdRG0M#J+{19jGu=6WS z?GNr-fTr({Fu}!$Hv1!VwExGklWlFW-k;zfj~&BK*hC^&$4>B~#}|VH%p8D_CH3=5W|ER-SI$j?9Qyr!k{;Lj+)pvX`WAq*O{qZFKAJ31|ae~strsHJwahwkEf8g%0 zg8wyywS!$Fi2ystNLR`K+)YlVwc`{WyK!Rnc?s6a3PP|W z#3eER&wzp(h|>(%dorJmgQug=u@GRD5rv-wVN^@NeL)CN!2{Gb0VcrD8i38g+0xz? zC=|!eB*54a6~+I6fG`4$8Y! z1S2>=@r9vagesU8*rUOH>s$zenCbXd$!BltV(Ve)B;@T0YywFM6s#A5ID^?-+c5;e z!FM#ju<<##czRhnIh~lsLOI#^z@Fbnjv~e3`VcUo`7MJbEv8FUj#`AoKoD4n<}t4j zrem;|!wCh`GskN|tUe)3*GR~~vS^S?Fr}HH!R-iaNbQeC$iOCFk1de8`q+B-IN16E zr@{Sa42@uuKH4f83;{O~i?A3lE`}XeClp{@>|~f=d4O>-u(h$^9fT+XOd_BU7%atr zeNaFVJ9w~cC_upis83W$Vkp?P&apWuK*8P?Pk5v;l;a_W)guEU69v5yhMbM4Y{Re2IJ7T4N>_eql^E9nHUH;J)YJ4CXdA6O8o#THyPK z#J|15%rj@8&wSC`@af6!@m_sVijD8{N zM+zuF2mjXt&;ZXkfJMvsI0Pj;6@xJUr{hS#D+9lZLoiVx!I=MtnAABlSSt|04&RAI z5W)Gei0kyncZ~mJM*=f#iHaX3jsi1`|0^ybo*9Gy)ssQY!9*(nu01*hG^CMTA@5z>TS~2^Vou z-PnbQ+J#-{qT*I?7m6)&fl-b( z6kE|!mSan?)oh1ddf7(Y8kL1&hHWXouvXyRs2|uoJj{P*HqR_{NyVLlGlg)yv z3>!pYpmv8vKf}ga4^-?}{$8S@0h#51=ECdMQGljbE$(=@;N-Rfi0=4neDeLQR+nqfgY_?+fKfQ$>p1=R<*IvGTlP0^s^!h9IXPW=>u!{4~e^{M-=h9EBCr^B8Y(vww z)ay83k7w)p>?e;deBsWGt89hib5}pz*68A{$^4x+s$12N-udSn)#p!G-M0F1_0khP z6-(wvkE@SQeXa~x^EtkKd}RNEk41x#?6alSfNr*T94#2k=xC#f)6t^s7e`ALsMHhG z{UDLbfv#cOHx@Y-oxyfYM@m}g%(IoW7)`4S8n$BnJR85RyCKQIU91gvv(IjVb>Evq zceKI66Gs~j*>bdKs#ns6>A)ZqQIQ8yg~W@bMoykHHQP}pIE)5Qx`ERoV%EQ3U8oIL zC>w^>09{Axt&okQ4Hn2b+GzQNqeU|uJKFr)N7ehNV0PkBb?Sw&5#6cB&dSE@+UNg` zxoD81F;QtZKYU!B`qG#TDK4AGT2!)*(L#0CE?d=-M!mm&e&T1K5yd&*M zdkVSR<_ScrUTJJAu7zyFg)UgUY@eONh0vNkbhO@r2S>}5gdB|w_S9R|ho=|~@G8C> zDS_{2KXyR|8`#8eL+9@LN{ytZW!-D@In*QWDGAr18LHK&Pc|EM2hiAJD@aA)*+2A4NGZ zIwR(^<-|zZ(M@QC>yE4FU{gXbciB+x595U`Y$!A%3K;IUlrWyKETef4o_pn%Lp8aD0_8 zEsnCqQDcLnipTN_Es4r-A`*cC#n`cLX`LYoCny8OmK6Ro~pA!DLT@!m|@5?R--7o8#4Dy)6xKZaeD8*d~5Q;(Fq zy`itc-Q~bk2y~{PCZiG#lBP`JfjMCn77`8$3n|WMhxp~d1S~?MI;Ynosyy0F1U~x^ zkx@AWa1W$brO>EzDeNb>ki3Etn8JQy*n<6e|1pT+l*LMzi|mL2N8|N_`k7)Rk+8SK zNIi+s#d>v19m0R2?Lcq58h0`J29b>r6#eQ5tf62^*kE7DULu zHY%Bwm;i}WF##?kNB@VI5$}@y>^fN;>5r@gvn-s6q}6`KF%?0P4TcRx|6RjSN73{l zH4+ArlZaN6lSuFs8r@BnA8mcvv;#G$`02fEzI9q>at8&y3|eDPXXLY4~`hu?4*JM+*o1z+DhwjipIjL{1tj zTo|!SJIQPWGj>Vr9HE#5h|s*svh#FbjB!#=J;oqe=NLJ@_N(JPctVT01ac`l4qpAf zAd|Q2X=OqfYYx`^AlNidqqAfrWN)$uVw-QI6q6w-E;824e~=f^ZBSL&d>C=D4xpeC zN<{K;uY?gxAY2&YSqb>W64s*SFmRWMY`7 zatu@_R~Rqjb6y4`@fU!Kb7?>?iPWilAmCjilEx5-;lMMmb$i(?crS4TiJ0G;3~1u! z64uj8CXokw$s|bLw50Z8KCvzIiK)nn6V65k>E>Vl2GkTQ;hB+$=Vkm}Q2{_;J5nx( z@8*BMjbgO<%2fGPe_*ND53gGZeRE4~2BJl$1h|QOang+uvaYVJD4i9WrGURTNIXyg zfBIs5{2Hk(ue7vw-dQoMvqS@l0NHPugpG1Spf7vI4@@z38JO7BwWIGuN+6x{rPh*N zV1~--PLNJ^mY*Q1oU6gFpU1%YCDo-B1?bf6F$9lR(>Y&VUO$jQG)Kncc$A#JfNiS< zXa3W0vFR(1O44C>#@2(-nf$Ay)wI(sgG8JX0_xbCt%~Q-x0%GkBp__pkj{$JaXO#| zA>>yHl#`C5WDY58ea=2{V>ZFteg+O=+EP#uGU0fg9?=);D=Ws$u4%@9cC5-6IA@sLHeuErd9G(@6C_`km5g9xWjp#df->M6}zP#Oii;pj4LVA6d^NV@}Ehz|DyxWTT=ArYaiUD{eJ5?nxEOB#I%>`EF3 zI+|^!*mx^S-!S$UrL#g5*g4^b*y8*eLEZ^r>ovdlJ)A$6M_ZRfd z*H2wvh4;Z#F%j8Zs*Q*TjMJ!)S&9d2Q(Q@6+8(EmwOEI@Fap14>c=eZ#7f-aD{``n|UZwch&fq{_9L72?wcOZSU$`w;4dBwtIT}Kwe`awuH`oALgh2 zz*PV~bc#J?W&`JQ3$#sSpS~={1!<%6D3IJ10fKZz4i^@&weskqxBfZf4ghs zvqfl}c=*nwB=SJc(7giJApOGCC?}8{Mvs%vbh)%pdtd;XU;xlSUi}0ywO)bQCjP{T zmk@2O%sxhgXm1TQvF}9!Q8?3J<7JRWPNRvP$Z`GiT22SoH2BZ%6yFIg%ARFhpLsAB zE?2D|XwL%^^){K*f1MiHA~{}bqX*X^1|Nq*lXEFB+XIu~#bPorM%mjw3-&kqv5(P= zgThu&6zPmsd*$LfzPPYvJRl|{T;{ z$vFBoQLGeB(`4XG!Ly<1c51oY;kRsy@H|&Jci!PFJ8+$}PYjJIt8~V2`IT_VROF5) z@gWo5MHF+gTZyudG1VgXj^M+u4!BSz$eETuUPiG<${eS;>~O z9(*8I%0J59h-6wKH0+GT0ocI @@ -597,9 +597,9 @@ well as real spinning hard disks. | fd\_cpm22.img | hd\_cpm22.img | DRI CP/M 2.2 boot disk | | fd\_zsdos.img | hd\_zsdos.img | ZSDOS 1.1 boot disk | | fd\_nzcom.img | hd\_nzcom.img | NZCOM boot disk | -| fd\_cpm3 | hd\_cpm3.img | DRI CP/M 3 boot disk | -| fd\_zpm3 | hd\_zpm3.img | ZPM3 boot disk | -| fd\_ws4 | hd\_ws4.img | WordStar v4 application disk | +| fd\_cpm3.img | hd\_cpm3.img | DRI CP/M 3 boot disk | +| fd\_zpm3.img | hd\_zpm3.img | ZPM3 boot disk | +| fd\_ws4.img | hd\_ws4.img | WordStar v4 application disk | In addition to the disk images above, there is also a special hard disk image called hd\_combo.img. This image contains all of the images above, @@ -1029,6 +1029,8 @@ through the normal startup process just like it was started from ROM. However, your ROM has not been updated and the next time you boot your system, it will revert to the system image contained in ROM. +# Upgrading via Flash Utility + If you do not have easy access to a ROM programmer, it is usually possible to reprogram your system ROM using the FLASH utility from Will Sowerbutts. This application, called FLASH.COM, can be found on the ROM @@ -1069,6 +1071,21 @@ To confirm your ROM chip has been successfully updated, restart your system and boot an operating system from ROM. Do not boot from a disk device yet. Review the boot messages to see if any issues have occurred. +# Upgrading via XModem Flash Updater + +Similar to using the Flash utility, the system ROM can be updated or +upgraded through the ROM based updater utility. This works by by +reprogrammed the flash ROM as the file is being transfered. + +This has the advantage that secondary storage is not required to hold +the new image. + +From the Boot Loader menu select X (Xmodem Flash Updater) and then U +(Begin Update). Then initiate the Xmodem transfer of the .img or .upd +file. + +# Post Update System Image and Application update process + Once you are satisfied that the ROM is working well, you will need to update the system images and RomWBW custom applications on your disk drives. The system images and custom applications are matched to the diff --git a/ReadMe.txt b/ReadMe.txt index 48a802d5..ce2d8fda 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -3,7 +3,7 @@ RomWBW Z80/Z180 System Software Version 3.1 Pre-release -Thursday 22 July 2021 +Thursday 26 August 2021 Wayne Warthen wwarthen@gmail.com @@ -629,9 +629,9 @@ well as real spinning hard disks. fd_cpm22.img hd_cpm22.img DRI CP/M 2.2 boot disk fd_zsdos.img hd_zsdos.img ZSDOS 1.1 boot disk fd_nzcom.img hd_nzcom.img NZCOM boot disk - fd_cpm3 hd_cpm3.img DRI CP/M 3 boot disk - fd_zpm3 hd_zpm3.img ZPM3 boot disk - fd_ws4 hd_ws4.img WordStar v4 application disk + fd_cpm3.img hd_cpm3.img DRI CP/M 3 boot disk + fd_zpm3.img hd_zpm3.img ZPM3 boot disk + fd_ws4.img hd_ws4.img WordStar v4 application disk In addition to the disk images above, there is also a special hard disk image called hd_combo.img. This image contains all of the images above, @@ -1053,6 +1053,8 @@ through the normal startup process just like it was started from ROM. However, your ROM has not been updated and the next time you boot your system, it will revert to the system image contained in ROM. +Upgrading via Flash Utility + If you do not have easy access to a ROM programmer, it is usually possible to reprogram your system ROM using the FLASH utility from Will Sowerbutts. This application, called FLASH.COM, can be found on the ROM @@ -1093,6 +1095,21 @@ To confirm your ROM chip has been successfully updated, restart your system and boot an operating system from ROM. Do not boot from a disk device yet. Review the boot messages to see if any issues have occurred. +Upgrading via XModem Flash Updater + +Similar to using the Flash utility, the system ROM can be updated or +upgraded through the ROM based updater utility. This works by by +reprogrammed the flash ROM as the file is being transfered. + +This has the advantage that secondary storage is not required to hold +the new image. + +From the Boot Loader menu select X (Xmodem Flash Updater) and then U +(Begin Update). Then initiate the Xmodem transfer of the .img or .upd +file. + +Post Update System Image and Application update process + Once you are satisfied that the ROM is working well, you will need to update the system images and RomWBW custom applications on your disk drives. The system images and custom applications are matched to the diff --git a/Source/HBIOS/dma.asm b/Source/HBIOS/dma.asm index 314a30b4..df255434 100644 --- a/Source/HBIOS/dma.asm +++ b/Source/HBIOS/dma.asm @@ -41,7 +41,7 @@ DMA_INIT: xor a out (DMABASE+1),a ; force ready off ; - ld a,(RTCVAL) + ld a,(HB_RTCVAL) or %00001000 ; half out (RTCIO),a ; clock ; @@ -59,7 +59,7 @@ DMA_INIT: ; DMA_EXIT: push af - ld a,(RTCVAL) + ld a,(HB_RTCVAL) and %11110111 ; full out (RTCIO),a ; clock pop af @@ -151,7 +151,7 @@ DMALDIR: ld b,DMACopy_Len ; dma command ld c,DMABASE ; block ; - ld a,(RTCVAL) + ld a,(HB_RTCVAL) or %00001000 ; half out (RTCIO),a ; clock di @@ -165,7 +165,7 @@ DMALDIR: sub %00011011 push af - ld a,(RTCVAL) + ld a,(HB_RTCVAL) and %11110111 ; full out (RTCIO),a ; clock pop af @@ -201,7 +201,7 @@ DMAOTIR: ld b,DMAOut_Len ; dma command ld c,DMABASE ; block ; - ld a,(RTCVAL) + ld a,(HB_RTCVAL) or %00001000 ; half out (RTCIO),a ; clock di @@ -215,7 +215,7 @@ DMAOTIR: sub %00011011 ; push af - ld a,(RTCVAL) + ld a,(HB_RTCVAL) and %11110111 ; full out (RTCIO),a ; clock pop af @@ -256,7 +256,7 @@ DMAINIR: ld b,DMAIn_Len ; dma command ld c,DMABASE ; block ; - ld a,(RTCVAL) + ld a,(HB_RTCVAL) or %00001000 ; half out (RTCIO),a ; clock di @@ -270,7 +270,7 @@ DMAINIR: sub %00011011 ; push af - ld a,(RTCVAL) + ld a,(HB_RTCVAL) and %11110111 ; full out (RTCIO),a ; clock pop af diff --git a/Source/HBIOS/dsky.asm b/Source/HBIOS/dsky.asm index fb7326d4..e0c640a1 100644 --- a/Source/HBIOS/dsky.asm +++ b/Source/HBIOS/dsky.asm @@ -37,11 +37,11 @@ PPIX .EQU DSKYPPIBASE + 3 ; PPI CONTROL PORT ; CONFIGURE PARALLEL PORT AND CLEAR KEYPAD BUFFER ;____________________________________________________________________________________________________ ; -DSKY_INIT: +DSKY_PREINIT: OR $FF ; SIGNAL TO WAIT FOR KEY RELEASE LD (DSKY_KEYBUF),A ; SET IT - - ; PPI PORT B IS NORMALLY SET TO INPUT, BUT DURING HERE WE +; + ; PPI PORT B IS NORMALLY SET TO INPUT, BUT HERE WE ; TEMPORARILY SET IT TO OUTPUT. WHILE IN OUTPUT MODE, WE ; WRITE A VALUE OF $FF WHICH WILL BE PERSISTED BY THE PPI ; CHIP BUS HOLD CIRCUIT IF THERE IS NO DSKY PRESENT. SO, @@ -53,22 +53,47 @@ DSKY_INIT: OUT (PPIX),A LD A,$FF ; SET PPIB=$FF, BUS HOLD OUT (PPIB),A - +; LD A,$82 ; PA OUT, PB IN, PC OUT OUT (PPIX),A - +; ;IN A,(PPIB) ; *DEBUG* ;CALL PRTHEXBYTE ; *DEBUG* - +; + IN A,(PPIB) ; READ PPIB + XOR $FF ; INVERT RESULT + LD (DSKY_PRESENT),A ; SAVE AS PRESENT FLAG +; DSKY_RESET: PUSH AF - +; LD A,$70 ; PPISD AND 7218 INACTIVE OUT (PPIC),A - +; POP AF RET ; +#IFNDEF ROMLDR +; +DSKY_INIT: + CALL NEWLINE ; FORMATTING + PRTS("DSKY:$") ; FORMATTING +; + PRTS(" IO=0x$") ; FORMATTING + LD A,DSKYPPIBASE ; GET BASE PORT + CALL PRTHEXBYTE ; PRINT BASE PORT + PRTS(" MODE=$") ; FORMATTING + PRTS("V1$") ; PRINT DSKY TYPE +; + LD A,(DSKY_PRESENT) ; PRESENT? + OR A ; SET FLAGS + RET NZ ; YES, ALL DONE + PRTS(" NOT PRESENT$") ; NOT PRESENT +; + RET +; +#ENDIF +; #IFDEF DSKY_KBD ; KY_0 .EQU $00 @@ -102,6 +127,10 @@ KY_BO .EQU $17 ; BOOT ;____________________________________________________________________________________________________ ; DSKY_GETKEY: + LD A,(DSKY_PRESENT) ; DOES IT EXIST? + OR A ; SET FLAGS + JR Z,DSKY_GETKEY1A ; ABORT IF NOT PRESENT +; CALL DSKY_STAT ; CHECK STATUS JR Z,DSKY_GETKEY ; LOOP IF NOTHING READY LD A,(DSKY_KEYBUF) @@ -114,6 +143,7 @@ DSKY_GETKEY1: INC HL INC C ; BUMP INDEX DJNZ DSKY_GETKEY1 ; LOOP UNTIL EOT +DSKY_GETKEY1A: LD A,$FF ; NOT FOUND ERR, RETURN $FF RET DSKY_GETKEY2: @@ -129,6 +159,10 @@ DSKY_GETKEY2: ;____________________________________________________________________________________________________ ; DSKY_STAT: + LD A,(DSKY_PRESENT) ; DOES IT EXIST? + OR A ; SET FLAGS + RET Z ; ABORT WITH A=0 IF NOT THERE +; LD A,(DSKY_KEYBUF) ; GET CURRENT BUF VAL CP $FF ; $FF MEANS WE ARE WAITING FOR PREV KEY TO BE RELEASED JR Z,DSKY_STAT1 ; CHECK FOR PREV KEY RELEASE @@ -197,7 +231,7 @@ DSKY_SCAN1: INC E ; BUMP COL ID DJNZ DSKY_SCAN1 ; LOOP THROUGH ALL COLS XOR A ; NOTHING FOUND, RETURN ZERO - JR DSKY_RESET ; RETURN VIA RESET + JP DSKY_RESET ; RETURN VIA RESET DSKY_SCAN2: RRC E ; MOVE COL ID RRC E ; ... TO HIGH BITS 6 & 7 @@ -344,6 +378,8 @@ DSKY_HEXMAP: ; ; SEG DISPLAY WORKING STORAGE ; +DSKY_PRESENT .DB 0 +; DSKY_BUF .FILL 8,0 DSKY_BUFLEN .EQU $ - DSKY_BUF DSKY_HEXBUF .FILL 4,0 diff --git a/Source/HBIOS/dskyng.asm b/Source/HBIOS/dskyng.asm index 6ea0e9c4..103e4d2a 100644 --- a/Source/HBIOS/dskyng.asm +++ b/Source/HBIOS/dskyng.asm @@ -66,7 +66,7 @@ DSKY_CMD_FIFO: .EQU %01000000 ; READ FIFO ; DSKY_PRESCL: .EQU DSKYOSC/100000 ; PRESCALER ; -;__DSKY_INIT_________________________________________________________________________________________ +;__DSKY_PREINIT______________________________________________________________________________________ ; ; CONFIGURE PARALLEL PORT AND INITIALIZE 8279 ;____________________________________________________________________________________________________ @@ -74,9 +74,11 @@ DSKY_PRESCL: .EQU DSKYOSC/100000 ; PRESCALER ; ; HARDWARE RESET 8279 BY PULSING RESET LINE ; -DSKY_INIT: -; - ; SETUP PPI +DSKY_PREINIT: + ; CHECK FOR PPI + CALL DSKY_PPIDETECT ; TEST FOR PPI HARDWARE + RET NZ ; BAIL OUT IF NOT THERE + ; SETUP PPI TO DEFAULT MODE CALL DSKY_PPIRD ; INIT 8279 VALUES TO IDLE STATE LD A,DSKY_PPI_IDLE @@ -86,7 +88,25 @@ DSKY_INIT: OUT (PPIC),A RES 7,A OUT (PPIC),A - ; DONE + ; INITIALIZE 8279 + CALL DSKY_REINIT + ; NOW SEE IF A DSKYNG IS REALLY THERE... + LD A,$A5 + LD (DSKY_BUF),A + LD HL,DSKY_BUF + LD C,0 + LD B,1 + CALL DSKY_PUTSTR + LD HL,DSKY_BUF + LD C,0 + LD B,1 + CALL DSKY_GETSTR + LD A,(DSKY_BUF) + CP $A5 + RET NZ ; BAIL OUT IF MISCOMPARE + LD A,$FF + LD (DSKY_PRESENT),A + RET ; DSKY_REINIT: CALL DSKY_PPIIDLE @@ -116,6 +136,53 @@ DSKY_RESET1: DSKY_RESET2: RET ; +;__DSKY_INIT_________________________________________________________________________________________ +; +; DISPLAY DSKY INFO +;____________________________________________________________________________________________________ +; +#IFNDEF ROMLDR +; +DSKY_INIT: + CALL NEWLINE ; FORMATTING + PRTS("DSKY:$") ; FORMATTING +; + PRTS(" IO=0x$") ; FORMATTING + LD A,DSKYPPIBASE ; GET BASE PORT + CALL PRTHEXBYTE ; PRINT BASE PORT + PRTS(" MODE=$") ; FORMATTING + PRTS("NG$") ; PRINT DSKY TYPE +; + LD A,(DSKY_PRESENT) ; PRESENT? + OR A ; SET FLAGS + RET NZ ; YES, ALL DONE + PRTS(" NOT PRESENT$") ; NOT PRESENT + RET ; DONE +; +#ENDIF +; +;__DSKY_PPIDETECT____________________________________________________________________________________ +; +; PROBE FOR PPI HARDWARE +;____________________________________________________________________________________________________ +; +DSKY_PPIDETECT: +; + ; TEST FOR PPI EXISTENCE + ; WE SETUP THE PPI TO WRITE, THEN WRITE A VALUE OF ZERO + ; TO PORT A (DATALO), THEN READ IT BACK. IF THE PPI IS THERE + ; THEN THE BUS HOLD CIRCUITRY WILL READ BACK THE ZERO. SINCE + ; WE ARE IN WRITE MODE, AN IDE CONTROLLER WILL NOT BE ABLE TO + ; INTERFERE WITH THE VALUE BEING READ. + CALL DSKY_PPIWR +; + LD C,PPIA ; PPI PORT A + XOR A ; VALUE ZERO + OUT (C),A ; PUSH VALUE TO PORT + IN A,(C) ; GET PORT VALUE + OR A ; SET FLAGS + RET ; AND RETURN +; #IFDEF DSKY_KBD ; KY_0 .EQU $00 @@ -153,6 +220,9 @@ KY_F1 .EQU $21 ; F1 ;____________________________________________________________________________________________________ ; DSKY_STAT: + LD A,(DSKY_PRESENT) ; DOES IT EXIST? + OR A ; SET FLAGS + RET Z ; ABORT WITH A=0 IF NOT THERE CALL DSKY_ST AND $0F ; ISOLATE THE CUR FIFO LEN RET @@ -163,6 +233,9 @@ DSKY_STAT: ;____________________________________________________________________________________________________ ; DSKY_GETKEY: + LD A,(DSKY_PRESENT) ; DOES IT EXIST? + OR A ; SET FLAGS + JR Z,DSKY_GETKEY1A ; ABORT IF NOT PRESENT CALL DSKY_STAT JR Z,DSKY_GETKEY ; LOOP IF NOTHING THERE LD A,DSKY_CMD_FIFO @@ -181,6 +254,7 @@ DSKY_GETKEY1: INC C ; BUMP INDEX DJNZ DSKY_GETKEY1 ; LOOP UNTIL EOT POP AF ; FIX STACK +DSKY_GETKEY1A: LD A,$FF ; NOT FOUND ERR, RETURN $FF RET DSKY_GETKEY2: @@ -483,7 +557,7 @@ DSKY_GETSTR1: ; .DB $00,$00,$00,$00,$00,$00,$00,$00 ; DSKY_PUTLED: - EX (SP),HL + EX (SP),HL PUSH AF PUSH BC LD C,8 @@ -690,6 +764,7 @@ DSKY_HEXMAP: .DB $71 ; F ; DSKY_PPIX_VAL: .DB 0 +DSKY_PRESENT: .DB 0 ; ; SEG DISPLAY WORKING STORAGE ; diff --git a/Source/HBIOS/dsrtc.asm b/Source/HBIOS/dsrtc.asm index b4eee956..89a42b19 100644 --- a/Source/HBIOS/dsrtc.asm +++ b/Source/HBIOS/dsrtc.asm @@ -97,7 +97,7 @@ DSRTC_IDLE .EQU %00100000 ; QUIESCENT STATE ; RTCDEF .SET RTCDEF | DSRTC_IDLE ; FOR HBIOS MAINLINE ; -#DEFINE DSRTC_OPRVAL RTCVAL +#DEFINE DSRTC_OPRVAL HB_RTCVAL ; ; VALUES FOR DIFFERENT BATTERY OR SUPERCAPACITOR CHARGE RATES ; diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 7bf1bf3e..581c74bd 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -105,10 +105,10 @@ MODCNT .SET MODCNT + 1 #ENDIF #IF (LEDMODE == LEDMODE_RTC) #DEFINE LED(N) PUSH AF - #DEFCONT \ LD A,(RTCVAL) + #DEFCONT \ LD A,(HB_RTCVAL) #DEFCONT \ AND %11111100 #DEFCONT \ OR (N & %00000011) - #DEFCONT \ LD (RTCVAL),A + #DEFCONT \ LD (HB_RTCVAL),A #DEFCONT \ OUT (LEDPORT),A #DEFCONT \ POP AF #ENDIF @@ -948,7 +948,8 @@ HBX_BUF_END .EQU $ .DW 0 ; HB_DSTADR: BNKCPY DESTINATION ADDRESS .DB BID_USR ; HB_DSTBNK: BNKCPY DESTINATION BANK ID .DW 0 ; HB_CPYLEN: BNKCPY LENGTH - .FILL 5,0 ; FILLER, RESERVED FOR FUTURE HBIOS USE + .FILL 4,0 ; FILLER, RESERVED FOR FUTURE HBIOS USE + .DB RTCDEF ; SHADOW VALUE FOR RTC LATCH PORT .DB $FE ; HB_LOCK: HBIOS MUTEX LOCK JP HBX_INVOKE ; HB_INVOKE: FIXED ADR ENTRY FOR HBX_INVOKE (ALT FOR RST 08) JP HBX_BNKSEL ; HB_BNKSEL: FIXED ADR ENTRY FOR HBX_BNKSEL @@ -1080,7 +1081,7 @@ Z280_BOOTERR .TEXT "\r\n\r\n*** Application mode boot not supported under Z280 n #ENDIF #IF (LEDMODE == LEDMODE_RTC) LD A,%00000001 ; LED 0 - LD (RTCVAL),A ; SAVE TO SHADOW REGISTER + LD (HB_RTCVAL),A ; SAVE TO SHADOW REGISTER #ENDIF OUT (LEDPORT),A #ENDIF @@ -1440,24 +1441,6 @@ SAVE_REC_M: ; DIAG(%00001111) ; -#IF (DSKYENABLE) - CALL DSKY_INIT - - LD HL,MSG_HBVER + 5 - LD A,(DSKY_HEXMAP + RMJ) - OR $80 - LD (HL),A - INC HL - LD A,(DSKY_HEXMAP + RMN) - OR $80 - LD (HL),A - INC HL - LD A,(DSKY_HEXMAP + RUP) - LD (HL),A - LD HL,MSG_HBVER - CALL DSKY_SHOW -#ENDIF -; #IF (WBWDEBUG == USEMIO) ; BUFFER OUTPUT UNTIL CALL MIO_INIT ; WE GET TO BOOT MESSAGE #ENDIF @@ -1793,6 +1776,24 @@ NOT_REC_M0: #ENDIF CALL CALLLIST ; PROCESS THE PRE-INIT CALL TABLE ; +#IF (DSKYENABLE) + ;CALL DSKY_PREINIT + + LD HL,MSG_HBVER + 5 + LD A,(DSKY_HEXMAP + RMJ) + OR $80 + LD (HL),A + INC HL + LD A,(DSKY_HEXMAP + RMN) + OR $80 + LD (HL),A + INC HL + LD A,(DSKY_HEXMAP + RUP) + LD (HL),A + LD HL,MSG_HBVER + CALL DSKY_SHOW +#ENDIF +; #IF FALSE ; ; TEST DEBUG *************************************************************************************** @@ -2242,6 +2243,14 @@ HB_WDZ: PRTX(STR_BANNER) #ENDIF ; +; EXPERIMENTAL!!! +; ENGAGE TURBO... +; +; LD A,(HB_RTCVAL) +; SET 3,A +; OUT (RTCIO),A +; LD (HB_RTCVAL),A +; INITSYS3: CALL PRTSUM ; PRINT UNIT/DEVICE SUMMARY TABLE ; @@ -2350,6 +2359,9 @@ HB_INITRLEN .EQU (($ - HB_INIT_REC) / 2) ;================================================================================================== ; HB_PCINITTBL: +#IF (DSKYENABLE) + .DW DSKY_PREINIT +#ENDIF #IF (ASCIENABLE) .DW ASCI_PREINIT #ENDIF @@ -2390,6 +2402,9 @@ HB_INITTBL: #IF (CTCENABLE) .DW CTC_INIT #ENDIF +#IF (DSKYENABLE) + .DW DSKY_INIT +#ENDIF #IF (AY38910ENABLE) .DW AY38910_INIT ; AUDIBLE INDICATOR OF BOOT START #ENDIF @@ -6116,7 +6131,7 @@ HB_SECS .FILL 4,0 ; 32 BIT SECONDS COUNTER ; HB_CPUTYPE .DB 0 ; 0=Z80, 1=80180, 2=SL1960, 3=ASCI BRG ; -RTCVAL .DB RTCDEF ; SHADOW VALUE FOR RTC LATCH PORT +;RTCVAL .DB RTCDEF ; SHADOW VALUE FOR RTC LATCH PORT IOPRVAL .DW 0 ; TEMP STORAGE FOR IOPR ; HB_BATCOND .DB 0 ; BATTERY CONDITION (0=LOW, 1=OK) diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 897cc8cc..b88012db 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -255,6 +255,7 @@ HB_SRCBNK .EQU HBX_XFCDAT + 4 ; BNKCPY: SOURCE BANK ID HB_DSTADR .EQU HBX_XFCDAT + 5 ; BNKCPY: DESTINATION ADDRESS HB_DSTBNK .EQU HBX_XFCDAT + 7 ; BNKCPY: SOURCE ADDRESS HB_CPYLEN .EQU HBX_XFCDAT + 8 ; BNKCPY: COPY LENGTH +HB_RTCVAL .EQU HBX_XFCDAT + 14 ; RTC LATCH SHADOW VALUE HB_LOCK .EQU HBX_XFCDAT + 15 ; INVOKE: HBIOS MUTEX LOCK ; HBX_XFCFNS .EQU HBX_XFC + $10 ; JUMP TABLE PORTION OF HBIOS PROXY INTERFACE AREA diff --git a/Source/HBIOS/nascom.asm b/Source/HBIOS/nascom.asm index e9f6c1da..8b2839d1 100644 --- a/Source/HBIOS/nascom.asm +++ b/Source/HBIOS/nascom.asm @@ -4855,7 +4855,7 @@ MULDLP: DJNZ MULSKP ; DIVIDE BY 8 LD B,$00 LD IX,SPK_DLYADJ ; The base address of the timing loop. ADD IX,BC ; Alter the length of the timing loop. Use an earlier starting point for each '1' lost by taking INT (L/4). - LD A,(RTCVAL) ; Fetch the present border colour from BORDCR and move it to bits 2, 1 and 0 of the A register. + LD A,(HB_RTCVAL) ; Fetch the present border colour from BORDCR and move it to bits 2, 1 and 0 of the A register. ; ; The HL register holds the 'length of the timing loop' with 16 T states being used for each '1' in the L register and 1024 T states for each '1' in the H register. ; @@ -4897,8 +4897,8 @@ BE_END: EI POP BC ; RECALL SYNTAX POINTER POP HL RET -; -RTCVAL .DB 0 +;; +;RTCVAL .DB 0 ; ; SETUP THE ONE SECOND TONE DURATION TABLE BASED ON PROCESSOR SPEED AND TONE FREQUENCY ; diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index f3c960cd..6208b89f 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -32,6 +32,8 @@ ; the desired executable image. ; #INCLUDE "std.asm" ; standard RomWBW constants + +#define ROMLDR ; #ifndef BOOT_DEFAULT #define BOOT_DEFAULT "H" @@ -206,6 +208,7 @@ prompt: call clrbuf ; zero fill the cmd buffer ; #if (DSKYENABLE) + call DSKY_PREINIT ; *** TEMPORARY *** call DSKY_RESET ; clear DSKY ld hl,msg_sel ; boot select msg call DSKY_SHOW ; show on DSKY @@ -1105,10 +1108,11 @@ clrled: out (LEDPORT),a ; clear led #endif #if (LEDMODE == LEDMODE_RTC) - ; Only bits 0 and 1 of the RTC latch are for the LEDs. Here, - ; we assume that it is OK to zero all bits of the RTC latch. - xor a ; turn off - out (LEDPORT),a ; clear led + ; Bits 0 and 1 of the RTC latch are for the LEDs. + ld a,(HB_RTCVAL) + and ~%00000011 + out (RTCIO),a ; clear led + ld (HB_RTCVAL),a #endif #endif #endif @@ -1928,9 +1932,6 @@ str_err_api .db "Unexpected hardware BIOS API failure",0 ; Includes ;======================================================================= ; -#define USEDELAY -; #include "util.asm" -; #if (DSKYENABLE) #define DSKY_KBD #if (DSKYMODE == DSKYMODE_V1) diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index 47c8cc7f..1bd0f951 100644 --- a/Source/HBIOS/sd.asm +++ b/Source/HBIOS/sd.asm @@ -368,10 +368,10 @@ SD_INIT: LD A,SD_OPRREG CALL PRTHEXBYTE ; - LD A,(RTCVAL) ; GET RTC PORT SHADOW VALUE + LD A,(HB_RTCVAL) ; GET RTC PORT SHADOW VALUE AND ~SD_OPRMSK ; CLEAR OUR BITS OR SD_OPRDEF ; SET OUR BIT DEFAULTS - LD (RTCVAL),A ; SAVE IT + LD (HB_RTCVAL),A ; SAVE IT #ENDIF ; #IF (SDMODE == SDMODE_N8) @@ -380,10 +380,10 @@ SD_INIT: LD A,SD_OPRREG CALL PRTHEXBYTE ; - LD A,(RTCVAL) ; GET RTC PORT SHADOW VALUE + LD A,(HB_RTCVAL) ; GET RTC PORT SHADOW VALUE AND ~SD_OPRMSK ; CLEAR OUR BITS OR SD_OPRDEF ; SET OUR BIT DEFAULTS - LD (RTCVAL),A ; SAVE IT + LD (HB_RTCVAL),A ; SAVE IT #ENDIF ; #IF (SDMODE == SDMODE_CSIO) @@ -401,10 +401,10 @@ SD_INIT: LD A,SD_TRDR CALL PRTHEXBYTE ; - LD A,(RTCVAL) ; GET RTC PORT SHADOW VALUE + LD A,(HB_RTCVAL) ; GET RTC PORT SHADOW VALUE AND ~SD_OPRMSK ; CLEAR OUR BITS OR SD_OPRDEF ; SET OUR BIT DEFAULTS - LD (RTCVAL),A ; SAVE IT + LD (HB_RTCVAL),A ; SAVE IT #ENDIF ; #IF (SDMODE == SDMODE_PPI) @@ -465,10 +465,10 @@ SD_INIT: LD A,SD_TRDR CALL PRTHEXBYTE ; - LD A,(RTCVAL) ; GET RTC PORT SHADOW VALUE + LD A,(HB_RTCVAL) ; GET RTC PORT SHADOW VALUE AND ~SD_OPRMSK ; CLEAR OUR BITS OR SD_OPRDEF ; SET OUR BIT DEFAULTS - LD (RTCVAL),A ; SAVE IT + LD (HB_RTCVAL),A ; SAVE IT #ENDIF ; #IF (SDMODE == SDMODE_MT) @@ -1677,7 +1677,7 @@ SD_SETUP: #ENDIF ; #IF ((SDMODE == SDMODE_JUHA) | (SDMODE == SDMODE_N8) | (SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_SC)) - LD A,(RTCVAL) + LD A,(HB_RTCVAL) LD (SD_OPRVAL),A OUT (SD_OPRREG),A #ENDIF diff --git a/Source/HBIOS/sn76489.asm b/Source/HBIOS/sn76489.asm index 73038bd6..866b7c50 100644 --- a/Source/HBIOS/sn76489.asm +++ b/Source/HBIOS/sn76489.asm @@ -15,10 +15,6 @@ SN76489_PORT_LEFT .EQU $FF ; PORTS FOR ACCESSING THE SN76489 CHIP (LEFT) SN76489_PORT_RIGHT .EQU $FB ; PORTS FOR ACCESSING THE SN76489 CHIP (RIGHT) -;SN76489_PORT_LEFT .EQU $FC ; PORTS FOR ACCESSING THE SN76489 CHIP (LEFT) -;SN76489_PORT_RIGHT .EQU $F8 ; PORTS FOR ACCESSING THE SN76489 CHIP (RIGHT) -;;SN76489_PORT_LEFT .EQU $C7 ; PORTS FOR ACCESSING THE SN76489 CHIP (LEFT) -;;SN76489_PORT_RIGHT .EQU $C8 ; PORTS FOR ACCESSING THE SN76489 CHIP (RIGHT) SN7_IDAT .EQU 0 SN7_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS SN7_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS @@ -74,7 +70,7 @@ SN7_VOLUME_OFF: #IFDEF SBCV2004 - LD A,(RTCVAL) + LD A,(HB_RTCVAL) OR %00001000 ; SBC-V2-004+ CHANGE OUT (RTCIO),A ; TO HALF CLOCK SPEED #ENDIF @@ -96,7 +92,7 @@ SN7_VOLUME_OFF: OUT (SN76489_PORT_RIGHT), A #IFDEF SBCV2004 - LD A,(RTCVAL) + LD A,(HB_RTCVAL) OR %11110111 ; SBC-V2-004+ CHANGE TO OUT (RTCIO),A ; NORMAL CLOCK SPEED #ENDIF @@ -256,7 +252,7 @@ SN7_APPLY_VOL: ; APPLY VOLUME TO BOTH LEFT AND RIGHT CHANNELS #IFDEF SBCV2004 PUSH AF - LD A,(RTCVAL) + LD A,(HB_RTCVAL) OR %00001000 ; SBC-V2-004+ CHANGE OUT (RTCIO),A ; TO HALF CLOCK SPEED POP AF @@ -266,7 +262,7 @@ SN7_APPLY_VOL: ; APPLY VOLUME TO BOTH LEFT AND RIGHT CHANNELS OUT (SN76489_PORT_RIGHT), A #IFDEF SBCV2004 - LD A,(RTCVAL) + LD A,(HB_RTCVAL) OR %11110111 ; SBC-V2-004+ CHANGE TO OUT (RTCIO),A ; NORMAL CLOCK SPEED #ENDIF @@ -301,7 +297,7 @@ SN7_APPLY_PRD: #IFDEF SBCV2004 PUSH AF - LD A,(RTCVAL) + LD A,(HB_RTCVAL) OR %00001000 ; SBC-V2-004+ CHANGE OUT (RTCIO),A ; TO HALF CLOCK SPEED POP AF @@ -311,7 +307,7 @@ SN7_APPLY_PRD: OUT (SN76489_PORT_RIGHT), A #IFDEF SBCV2004 - LD A,(RTCVAL) + LD A,(HB_RTCVAL) OR %11110111 ; SBC-V2-004+ CHANGE TO OUT (RTCIO),A ; NORMAL CLOCK SPEED #ENDIF @@ -338,7 +334,7 @@ SN7_APPLY_PRD: #IFDEF SBCV2004 PUSH AF - LD A,(RTCVAL) + LD A,(HB_RTCVAL) OR %00001000 ; SBC-V2-004+ CHANGE OUT (RTCIO),A ; TO HALF CLOCK SPEED POP AF @@ -348,7 +344,7 @@ SN7_APPLY_PRD: OUT (SN76489_PORT_RIGHT), A #IFDEF SBCV2004 - LD A,(RTCVAL) + LD A,(HB_RTCVAL) OR %11110111 ; SBC-V2-004+ CHANGE TO OUT (RTCIO),A ; NORMAL CLOCK SPEED #ENDIF diff --git a/Source/HBIOS/spk.asm b/Source/HBIOS/spk.asm index 74df2143..2cee6a99 100644 --- a/Source/HBIOS/spk.asm +++ b/Source/HBIOS/spk.asm @@ -265,7 +265,7 @@ SP_BEEPER: LD B,$00 LD IX,SPK_DLYADJ ; The base address of the timing loop. ADD IX,BC ; Alter the length of the timing loop. Use an earlier starting point for each '1' lost by taking INT (L/4). - LD A,(RTCVAL) ; Fetch the present border colour from BORDCR and move it to bits 2, 1 and 0 of the A register. + LD A,(HB_RTCVAL) ; Fetch the present border colour from BORDCR and move it to bits 2, 1 and 0 of the A register. ; ; The HL register holds the 'length of the timing loop' with 16 T states being used for each '1' in the L register and 1024 T states for each '1' in the H register. ; diff --git a/Source/Images/d_zsdos/u0/ROMWBW.TXT b/Source/Images/d_zsdos/u0/ROMWBW.TXT index d0c811f2..5f302561 100644 --- a/Source/Images/d_zsdos/u0/ROMWBW.TXT +++ b/Source/Images/d_zsdos/u0/ROMWBW.TXT @@ -13,7 +13,7 @@ RomWBW Distribution. ZSDOS is a replacement for the BDOS portion of the CP/M 2.2 operating system. Since it does not include it's own command processor, the -the ZCPR 1 D&J Command Processor has been included. +the ZCPR D&J Command Processor has been included. The primary documentation for ZSDOS and ZCPR 1 are contained in the Doc directory of the RomWBW distribution. The specific files are "ZSDOS @@ -135,12 +135,12 @@ distribution as possible. use with BackGrounder II software which is not included. Refer to the ZSDOS Manual for information on implementing BackGrounder II if desired. - - + + == ZSDOS 1.1 Files == The following files came from the official ZSDOS distribution. These -are generall documented in the "ZSDOS Manual.pdf" document in the Doc +are generally documented in the "ZSDOS Manual.pdf" document in the Doc directory of the RomWBW distribution. Note that some of the files included in the ZSDOS distribution are not listed below because they have been superseded by more recent versions listed in other sections @@ -174,16 +174,23 @@ SETTERM.COM - Terminal configuration utility for DATSWEEP & DSCONFIG SETUPZST.COM - Creates customized date/time stamping resident extensions STAMPS.DAT - Library of available date/time stamping modules for SETUPZST TD.CFG - ZCNFG configuration file for TD -TD.COM - Read and set system real-time clock +TD.COM - Read and set system real-time clock TERMBASE.DAT - Library of terminals used by SETTERM TESTCLOK.COM - Test a selected clock driver ZCAL.COM - Display a small one-month calendar to the screen ZCNFG.COM - Configuration tool for programs with .CFG files ZCNFG24.CFG - ZCNFG configuration file for ZCNFG +ZMP.COM - ZModem communications program (requires dedicated comm port) +ZMP.DOC - Documentation for ZMP +ZMP.HLP - Help file for ZMP +ZMXFER.OVR - Overlay file for ZMP +ZMTERM.OVR - Overlay file for ZMP +ZMINIT.OVR - Overlay file for ZMP +ZMCONFIG.OVR - Overlay file for ZMP ZPATH.COM - Set or display ZSDOS and ZCPR search paths -ZSCONFIG.COM - Dynamically sets many features of ZSDOS operating system +ZSCONFIG.COM - Dynamically configure features of ZSDOS operating system ZSVSTAMP.COM - Preserves file date/time stamp across modifications -ZSVSTAMP.DOC - Document describes the use and operation of ZSMSTAMP +ZSVSTAMP.DOC - Document describes the use and operation of ZSVSTAMP == CP/M 2.2 Files == @@ -194,12 +201,12 @@ called STAT is useful for modifying the IOBYTE. Most of these applications are documented in the "CPM Manual.pdf" document in the Doc directory of the RomWBW distribution. -ASM.COM - DRI 8080 assembler +ASM.COM - DRI 8080 assembler producing Intel hex files LIB.COM - DRI relocatable object file librarian LINK.COM - DRI relocatable object file linker LOAD.COM - DRI loader for Intel hex files -MAC.COM - DRI 8080 macro assembler -RMAC.COM - DRI 8080 macro assembler generating relocatable object files +MAC.COM - DRI 8080 macro assembler producing Intel hex files +RMAC.COM - DRI 8080 macro assembler producing relocatable object files STAT.COM - DRI multi-purpose file/disk/device info & configuration tool SUBMIT.COM - DRI batch file submission tool XSUB.COM - DRI batch file enhancer resident system extension @@ -261,7 +268,7 @@ UNZIP.DOC - Documentation for UNZIPZ XSUB1.COM - Replacement for DRI SUB (from Lars Nelson) ZAP.COM - Interactive disk & file utility ZDE.COM - Compact WordStar-like editor -ZDENST.COM - ZCNFG configuration tool for ZDE.COM +ZDENST.COM - Installation/configuration tool for ZDE KERCPM22.COM - Kermit file transfer application LBREXT.COM - Extract file from .LBR libraries LBREXT36.CFG - ZCNFG configuration file for LBREXT diff --git a/Source/ver.inc b/Source/ver.inc index 784c9ee1..ea83f70c 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 03 -#DEFINE BIOSVER "3.1.1-pre.108" +#DEFINE BIOSVER "3.1.1-pre.109" diff --git a/Source/ver.lib b/Source/ver.lib index 4c3ab409..728461dc 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.108" + db "3.1.1-pre.109" endm From 74dc98b1403552aab2df4c051e31049e5c7dee12 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Thu, 26 Aug 2021 17:23:52 -0700 Subject: [PATCH 2/2] Fix DSKY Initialization - Missed a couple things in the last round of DSKY changes. --- Source/HBIOS/dbgmon.asm | 4 ++-- Source/HBIOS/dsky.asm | 2 +- Source/HBIOS/dskyng.asm | 2 +- Source/HBIOS/hbios.asm | 2 ++ Source/HBIOS/romldr.asm | 2 -- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index 42e80252..4b8d512a 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -1017,7 +1017,7 @@ DSKY_ENTRY: ; START UP THE SYSTEM WITH THE FRONT PANEL INTERFACE ;_____________________________________________________________________________ ; - CALL DSKY_INIT ; INIT 8255 + CALL DSKY_PREINIT ; INITIALIZE DSKY #IF (DSKYMODE == DSKYMODE_NG) CALL DSKY_BEEP @@ -1501,7 +1501,7 @@ SEGDECODE: #IF (DSKYMODE == DSKYMODE_NG) ; CPUUP .DB $40,$39,$73,$3E,$00,$3E,$73,$40 ; "-CPU UP-" (RAW SEG) -MSGBOOT .DB $7F,$5C,$5C,$78,$A0,$00,$00,$00 ; "Boot! " (RAW SEG) +MSGBOOT .DB $7F,$5C,$5C,$78,$82,$00,$00,$00 ; "Boot! " (RAW SEG) ADDR .DB $17,$18,$19,$10,$00,$00,$00,$00 ; "Adr 0000" (ENCODED) PORT .DB $13,$14,$15,$16,$10,$10,$00,$00 ; "Port 00" (ENCODED) GOTO .DB $1A,$14,$10,$10,$00,$00,$00,$00 ; "Go 0000" (ENCODED) diff --git a/Source/HBIOS/dsky.asm b/Source/HBIOS/dsky.asm index e0c640a1..8b577ce2 100644 --- a/Source/HBIOS/dsky.asm +++ b/Source/HBIOS/dsky.asm @@ -73,7 +73,7 @@ DSKY_RESET: POP AF RET ; -#IFNDEF ROMLDR +#IFDEF HBIOS ; DSKY_INIT: CALL NEWLINE ; FORMATTING diff --git a/Source/HBIOS/dskyng.asm b/Source/HBIOS/dskyng.asm index 103e4d2a..4fb46adb 100644 --- a/Source/HBIOS/dskyng.asm +++ b/Source/HBIOS/dskyng.asm @@ -141,7 +141,7 @@ DSKY_RESET2: ; DISPLAY DSKY INFO ;____________________________________________________________________________________________________ ; -#IFNDEF ROMLDR +#IFDEF HBIOS ; DSKY_INIT: CALL NEWLINE ; FORMATTING diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 581c74bd..87ba98cf 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -68,6 +68,8 @@ ; #INCLUDE "std.asm" ; +#DEFINE HBIOS +; ; MAKE SURE EXACTLY ONE OF ROMBOOT, APPBOOT, IMGBOOT IS DEFINED. ; MODCNT .EQU 0 diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 6208b89f..386b93fd 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -32,8 +32,6 @@ ; the desired executable image. ; #INCLUDE "std.asm" ; standard RomWBW constants - -#define ROMLDR ; #ifndef BOOT_DEFAULT #define BOOT_DEFAULT "H" diff --git a/Source/ver.inc b/Source/ver.inc index ea83f70c..69ad0c84 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 03 -#DEFINE BIOSVER "3.1.1-pre.109" +#DEFINE BIOSVER "3.1.1-pre.110" diff --git a/Source/ver.lib b/Source/ver.lib index 728461dc..0dc11c0c 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.109" + db "3.1.1-pre.110" endm