From b76fd3ed445f92c10c9f0875ba943ef705ccef04 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Fri, 6 Mar 2020 15:28:52 -0800 Subject: [PATCH] SCP: Preparing for dynamic testing of simulator REGister definitions at startup --- Visual Studio Projects/BuildROMs.vcproj | 4 +- Visual Studio Projects/Post-Build-Event.cmd | 31 ++- Visual Studio Projects/Pre-Build-Event.cmd | 8 +- doc/simh.doc | Bin 289280 -> 290816 bytes makefile | 2 +- scp.c | 267 ++++++++++++++++++-- sim_defs.h | 20 ++ 7 files changed, 300 insertions(+), 32 deletions(-) diff --git a/Visual Studio Projects/BuildROMs.vcproj b/Visual Studio Projects/BuildROMs.vcproj index cf23d0f6..a672fcab 100644 --- a/Visual Studio Projects/BuildROMs.vcproj +++ b/Visual Studio Projects/BuildROMs.vcproj @@ -18,7 +18,7 @@ Krk=?6Ohz3(6zg;0|gZ&6tQFMUTa*h-MPB9j@@glYZulk zb|QA``+Fu3QQmj|@B6~%J9D`+bMHCNIrp4%V=hC_I}E+)FvZi;OI0jC_KM=ew2r^N zeEs@WW|rjdQYeiw@Px@LG|fWYG&QeU%*&WxEu3|NG|eC^`9@i?^a=X1TXV zD++%qcX^hdpF9`;=?l}xDauwpS$iT0uzoO?v5}f1V;gG{-OBQ3?n1I=`LR8_m9_kB zd%io`_(`ANU`x2=MN5XR^2Y}f=EHNDT9#K*KFea#krCTkZOcjdw`4T=k8L^DdD{F4 z)uXg6O{u+EKJnO`2Y%8Y3%|(9tVEa)nFE2HPa34K`Pdu%Nj@6m$FX#7)|!>)@fhkJ^PZ@X+L8g2XE`Nzp=4{uXQ@WILV>3bvn>^ z(80$t?dxg$;!xf??PaW--MSoKZ)30QUe@_#jjOYlu}=FKg!UcsYl4`F@_p%sJgG^ZmSx<#PUFo%S{k&S}k~Us>aZ zoVNG-81LjPXMK;av1l&aw4bqaF6+Ad{Ec&RRj|G%z<48eIrL&pK#oyPpO;=Z4PVWF?b4PdUJinxQ zlN^g!=lNUb1seA|7Prm|u*@s#W&GgiW}O$9G|$tikY!$gXVSb7rvU3bucUb^liufT zo#$=5>{P<~zOqU4a^&&IX-;#1k8NJAEIy^ZjAtB*S>J5UOj&Q^s65t023Rx0yghmR ztnagCrfgZG-r2)C&z2b}J<lW+dNw?eT|J>N?PA%%cY<3H;okAi)Vq8N*VnbZRBEllWqGEfwhQx%q zhIHx_)~i=osB1_s*YM7+v0cOZyY>y^h43iX5Z7L@AyJ_rF`=$id2>ui|B|j9d&kO~ zTqB}8g~WzON4bWx9Nrq!F+4UVB&NS>kLd8I*svJa*l5?tu*m3`{-s@AYia2mbU9QK zqsyTyYO3U*E0A96?4)zj1#5krbZxY&PC6H+pE~J0HMcyv{7je6qwAn^)z;?sM@d<_cBS}2TtmYY| zQdrBz-BS5V+Nw~m*qGktG?jD>i|tg}Ly|@bTFOoWk(Ig^PW>b!;W1&cnrBYkfPz)( zHmD+nZ|B~mTGM6?OS<;!)jl+=Pw8G^vAuhExDL)@I*~_LOqbCXs)+t$UOMYcFP+t_ zxwIbB^d$@oO*1Hp7rfyMKLns0%A*$QpbgsMJmQeSju9nZWl@wjc#C&XvN9Bg9%+yT zS>c9P5C1*)>gevHueSZUYQgXPW?c2#u-}IDYuB$~KL(Gv+@1B^WDt_OYx5?plx7)p zku{YxQRtmPr(EGbPv>Bn&g`X*$#I}=eUd+{YHe4gL2XrO1Z|3!nn#~G z{cvrKm+GNsky@OW>ekUkA^Gl*tkp*H>}}%j&3KLcWUl~DXH=9kXqZV+8sT7OMaf21 z?IGEJ4at5GfoAC&a4vJD8eXtt0kSn{QRK;lQz*CgY zp(xQWlzY-MUL zlgw>@m~)GL!|&dsMFgsL1%9#}|5)EnS5WQDo2Qg_z?1(?#rv_oDBhAY9c4SCoSM^M z$3#YWpg5}HS5!lF)PPiqdZ>>!Xp27Ri+&h@fsl$b48t)Uzhf=dVLdit6Qpu&#}0d? zf$}#K$8iUDVU78EV!nW=t~W=2k}bY(1}9BLP#etAu9PlCBr_jMn{rOA6mtsvEYK;p zQs>P7htM0EaAd(&h$)-jpM<`+Wbhsy;2~radxk{3#XC5#iDgF)+0>95vKi(@J`{r+ zDmxIpASSBdS5$*+tHEfF9_Wb}#G*H3JMNDGn1G2`hUHk{p#5E6b*b>;;o=t$UyOa& z`{9d+p)agKE#+d`a1hsU9slAc;vo&)eLTQxyg@b^I(s-6c*udAkk-%{E+~v5sDO&7 zgdkLbw3szf3!TvgLop1)F%qL7t?C3!#B9vLX1sZD;m!Ux58kYQ@aBPbx}qAG)Bt3j zOP6aa8%t~pCZE%=lKRu?o-(Wj?4jARTle6ox+n&jib&M*P3(GA@(5~DC0V=)fnF&R@Z2XnCnTVc{xRZ%M^h0(nmU3@B;Qc|`i zu9=@PRJ6U@T)(x5s{cPj{61NsrU-Fy$-U%kC!V8lE=6g9$vA+I@XDS8qZB8?M+6pX+@WXeN`F$uTwFkmX@Oe>AO&N5)~kP(uzR%#9pLz}8TGFCE=nzCqZ zIxuB^p>j2KpTR_ewqpk*f%~u@XK)se@dQut42h6TyuxefNqidQLw*!MK@@^y)EyoO zKp+~U37R4}mr_M(&V)pxHQFE=JunXAF#*3}5+q{NV8mi9!7goob+u+vy~rF)|My)< zyI*CnVw;nqY<{dM+Qb_Fv0i90g!->-+b&YN8+))1`ypk21V?cd*YFx|@D}g!0a8B{ z>Vyss$c_>yiAJS(C<9MOCGvwms-P;`pe@>=141AbtqZzh7{+28#$$=Ls-{}bu4U~! z)@J-kO|`(c=t?(ai>2mS>;JA-_)m>iU3yE~no^Wn@g*d5DVAXcRzkL%wOEH8*opJF zfQyL3Wyscb9slALULz}8ST@)rJ90QG<;ioy5`JVzDK&zh0y4|{vkD(Zb;TVZgkmhI{#$y2% zVmo$VCw5~Gq{%vfgSdmc_=2xcXueb@dIdcb(ypaP2INIP_`x3mD2MWpwl4@(&`FD!jmTSvE$2sL3Eu!AfY^U%qY)Y-9NjRY1rH-J z3S%%9<1i7wVIdY_2X85m$HzY|4Rehxf4lDr67w-C6Sm)yd)Ho&3Eu4h0$1vKd=T{uoVxve&G=! z3Q;>Tx3HqjE37%pQTB!6JGF!4}2kOERSE%01Xk2 zZs?9kL_ty&i{2QEaafEcSc>I&mDK`p_kz7SI zR~Mm%ARf1nxhU&LDCXfLzMyO|MQM+Ln2UL+NVF?q9L9rPgwyIuZC@)6A2(>NZU~l{ z>v0b6;Yu-7M+9ueGKA@x9%Kp;h=hi-cnq~T)f6Q#umndgOK7_GYFo_^qi)r1wpTN0 z2|4wJH2X+3jb{H<4Vlq2O&UY4LA-M&WjqV(u>n_*jdE>)m3WGLlxIuK#ZAPc4Q1LE zvFMGzU`ILD!EZQQd>Rw$QTa9_gyi$Qwca+C2?fD_Ktf_8ib+az3 z%xH)Zj0pT`(w=peq;(}}4kLKiY^=k2c$pl!sn2vCwo3U66>}7oax?;dp+2Ans#f68 zD9o#_tVOtU`r-2-)lEBnN6oA)j8LnY5+c;>I)l{cPsqZDYzy$_gF%>&(FB9icz9B znZ$J@pk|*sRKz~iAxuYwzJw5qu?Bhjao8DsF&6pyb6fz^F&EVaaKstG1KBUtYDKH2 zK#BSw42CUG3klZO$_h~>y(oq1Xper-uuWUkLoH@%-$Px*`Fm!p#}U|~tS8dhtFfDh zDb;DU@i&g6W)12)hG95v;|_AyB=V?(PPJrH_b{=k57SleREt&#e_%B#)~5AAFZ_Yk zxPq&QsmpxW%J~Ro{S1lqWQnV#@$k`3uT>jp)T!dy{N8HEtcko{sy?a0fcihH=BBoN z)FryW0leXN%s`fgjKyH9NcpHd4Vy6b!n&q}1iSGb=6F@sh*wwb^ctG0rx9ui&Az{y zSX^HIfa1+4auf{a$PUV*E5fk^OM}f3(dw^NolTJgRHM#eDYMn)G$e?}EtA6_wzqt@ zm=0}0kA(4wIN~t$wT2@$zjLgy2$JMtb6 zcc^+?=Mcv96imf>>@hhEXXSx=m_CEEux$zr*c^6*(UW0dXQ~`#V=FGDicrT>YrQCWk39KR46S=ppmi@*GVL)0m&jG1*qwf-SKDTVg{~uIcJy zouMn!QJ90(_ylDTg$p~hMX%WK{Yv(H8?v^Eu|`oe&hcmu~tR1mDi4(!1{xPixb2W2unXWOYX&G=^; zhpG@folOK8W{_n3I+KuK6ZWC#EaHk)*of|n`8*!tIj%0D)4)T##2b7?nx(YL@Lfi8 zhS$pp-Ez~Hg{rEnP=lOI!gM6h-2(oOCO19s)|%=Hlj&#Bj6?_HwN}5HzL++6F;%O_ zVs(nnLFOJJD}SLrS!rN$SjtwOrvcLnS<>Nz#vlQ|kfjQyJj>PlI)@5O|B3vz?3o-^ z^0{J?%}t1yL#)MIS_E9hH7uG(Uq4SuwW_%n(CU67EmQtbd+59t^V+)kw8ZGXfMsCq zBIe;Jj$t_A8G#Fg<)X=J4GpH(MWz!8(Q_1EK@Wr-*ooFFX)(|h;g|u<4FRP!}5J<1rH9xtk^y{V)Vaw0axV zO%57C+)4mV7)Jodn;bS$F@nZ3y=XOskFz+3E!IGqtie3WbDyw`h-%ScN#Gr{KKN8e>h3cBt!g-NrJ#1?TY+ zt`uGqjKE5qK?VxU6J60A5f~3CTq#&7OesJqv`vt*l5&zVlJb$V(ROKG*QJfzMH^XP zN=ZscN=HiO2y*XX&>|NnLTn=hyTIsi$n+xri1;pHS zuX@uUi#%antTT&}MR$iRemG?l7AMoRA-OM`&g-{BNR; zX2;n{L^LMi&wtpRgYE?Hg$GKVXib~UL?u*5Lo`QQ9K>0;o}}%EKgy#TYM~*5F%~o6 zbc*-k1>VTC)^fkPBEJiH$%_|wiTdPWFZLnbVao`*^l(nu(rjkY7QSb&!2V@z(~ScR z78==dnUfqwqX))g0`}q_N|Ecdd5^rjBi2CeTjp;sEg+E}6 z+5{qJi`Z{OZ5a_;j-3Qz*9l3jpX{%=$u6;v*56O>tUWzJx;tc{C(3z5ed4u?ciKXt z5teL(!X8}_E@3&%J|Ujs13sF(j!OG2^KJ76pJ6M(P8`HpT*Pl@+1fDV9Md?6BRG#Z zT){o`KhH5`EWrvS;vXY`d6ud2u4eEKq$fy ziSxLPGS_K7F&m3fo(Y*PQ*Iisn&(*$FtHn4OdD`Y9o^Cv-#aYr-)juwaEG|v z#T(=$c0uTdX!O7&OvYNA!CSmT;hPd?np#3@Jvf+nNR8EM?Nv)@i_fU-4DyN;LM)^p zwqZMdz0HP$5BP}uclaCKFbkL9beEO_1yLGh&M71@KK^T!O{e zfQ@*EPq2T+hLH0ayLm6z6~b2R!UH6t;7bN02t_w6!ZO^$W4wp@ifV)0@IxRB7>iZd zg5$V^d-wv~YZ8yzuhX;DF`;Q`FQ^|INr;Xj-F=SIU^I>(6M@JD2~HkpkRY8zHiFU& z!I%wOpgu4iYie{++CK?eZ)@O2BnzG$0kQ?G0Mirk8x|6rMG0Du7)H9b?Iw%nv6bQO z!Z@{quF)dikUXM}1knk_&_Du;WjKj9D3D06gLW8$RXB++DDj-kni^dpp;0xN4#haE z#W}n~ehTAP)Id!PgcO<-m=u;2loXN_kQ9y-j1-C#h!lntgao~|#2Txx^R+g0m)cFX zPB+unYpPCXke6mzUtVo~3;hnyCvXNga0f-+(BL5)qc9B`M!sbe!0(uW^SF#w@91P< zz+q&4PdOq#ilEyk8n#bV#%o__e-xe4Tc=Y-VIel)F+Lzj)hUg!9(%ACrS&?+3)N5) z32Ai7GbAEMTAkvE=4gd6n25tTj<@)NB7FC?c)G$mr7jZ<(G^k9Fb8qCiRW6u8|sbv zI|+gWMFJwhkU(_92{L;U1<7O~)I~iEfnk!?l~u_1QGnPHJ}T@nbccmT+IqZr}sT8#t%eDFsjj zu6!M)2sUCXyzO*K0B-UX?|XQF1SH}OK0?hx#;^b$S#^8?h0kIas%O(F_0R_R z_ma9}AYt5(L8lmc^Dq#rUCAmA6e0^agDdz9U16QF1S@a_ckmD|P^XAaX@K|mgpNgZ zN*Fwg>6F(`?p(fe=GeY%$K-e2u@wvC_t+inj`7ZT%WpQ@1kc0x)z<6uxwU=W_1O*S za(5l!-it=mT*H&T2`7I`yc*O_%QxfFCVSobH(P|f{=}`u{PeOVKf8j3fp>P2z1(xF^p2Cxm zx5hZ^#7npo)G6(-6i;A2Lz+j~E3V)wo+784PAQL8_#H>^x0`tz2)FFi zGO}YoXa}d`%=;$0GwO3_H_Ov$#9n2OWd3XG3H=y{XS{*lxP=#ZiOnSpbebjD5O5lwO48?)qE&)7 za+IcJgFk*jRn$ap48krP#Am2w2p4?O0U=n6EqIQ1@bILyLpyZBP6H1Ikk*TS3VBfw zozM--unHz@$9ZqsY`nw=lq<`y4FfS0Yq1Ic;x;}(_0cJrkp-nt7XJA3>hY_Vk9qjn z@28*5{GZIz8ZAj!O8puxBOFfagVZFv7v8leR)cq`$x_{%9oRmJQX4Wp3*B90L?PLR( z{Z0fjm$meSoTqTptu{ zl1pVis?X$78STb(HLVu6SIy>>Q9fRPS{8vwtiVc7o#wJtt)iVC&8V&6c(t$jQ@20x z-3R+z`mm(sjv^9Nfk-Tc)MTl} zXOI9pYHu;rLr*M&)NZNSQmds#OKp~#EVb8iYFm36%4pzbC;{bxW>SuIr}}U~uP?4O z`=U-VPeHl^WDsDpcWBh`a=zuRs>#tL;;Wml}&^jO(ZE+cfK;8$3 za+DI%muCo#hG>M~@-#DHOmssedg33P#xuNx`U@*UN&JGnI0>%`G%2WzD$pPFuggC4XVgP{sIEwT5f|pgOXQ*D44`Rx%bOBg{t$2)= z7+OuIjKwUxN%-0Cy@Xo{m-&5Tev~P{H`ZD5hy313xOM&(Z@6_&9`DH%zm|pBS;hnO z+B2G~g|!O}^!c^pE!9i~l%`S<0#OdV(FY4~0k5^5i`BB0tzv++_NLL>wu-d+6kCOT zI{A<%MZOM)eSfUga%omu^AdiS?JB*Vs%@P&+F8#hlnhi3J5)n;M8jH7xdelqB-^H? z-N>N#FmGQ&nz7T@G@X8O&b0FGgLsAXRILpDwlsWE%a|T#)aTU6=O$H7!z)UhwX!|s zxfqqLDPl1QQUQm;Rtd9H37;YX)F;^mtztP@VID%8&sZ>J-h6ztF#|~IJnmOy86|M| zd5m_oygsLPKZo9_bT(UstUzTnVH?I$;l^1jUEO3A&vJR0M*C;J#>?4!R7bA%VsF=a zwU@hgGBaD{v~2nat>0g?gs(E|Ln>yJYTE=-WoJ+rmbici zXj+4o1T(M-S!%LJg@UMyff$LE*nkK4jBd5qZNm)AM?CH#U2UC`5%$Pgo0g|66aJ`= zMi_u0*n`9Hs6#7*I;e}L*oZywt4k+{TBwcgID#{X$0OveM~y^(7_bt5Vjm8=@NfZ_ zaSQj5i1*M2?N^=r-z3B*`;{i(@`=lbF7Ld&{*kpo`1U#nfs~xNx{mBPTG6h%uyIE@ z=<8~Sb$SQwQkXuE2Pc$>=qb1oA&HO06asN>5kcDA5@;p3AC@?^{+cC%rNTk;r15SN@}F~tTElx%~zdWXi1 zo;Hm(I}bI60ZBHkpCjwd;HVF&n?*jI3lH!RJL|JF{MnEV0Ds{yF5@BIBXc9F4-Vr9 zPU2D{oi^;9>YH@nsjJrR92*MveaN6yE~H0_#SL4r5An_Dw=gM~qYtRpoXs8HEvOmD(~_ea zIBVeH8j7~kDJ8HNTjAV>+@LAiqhedCEp+Yay>SMQk*NdQ0m_B&9&|=uOvF6Ag!yW1 zxnld-yL%~rE2Nz9lfSvlo4Hrsoi#sO79u;ayA0X_4mD{P-PpVOw~oGGwk8z15{Daj z(#VuGzdo-{bIzwfZ_lX><~_wLq;D**z0hS%FTqAO6f)1`1H}vKFJ>*ooWdvyH(n{k z+pD?phdVq3aW0OtIESZ5Ksw@{ALURUHzDQWM3^P+)3k*}^s(B_A{-Cp!HxaYEaon< zXi@!De|d+k5KPGm;ui{`0tFxi(a~BMGkH!!A*5~3b{(VonmD04T~~=elgj4_(<3Q^ zQ5f5i&I{W*QF{>_N-f9eFb<_4e`hLEXY-<}B%Pq(#9n)v2=;27O`PZR(ix;k-=Z*! zazhD}MmIzu27Ry`+c1k&t;Rl_MOIds9l4Pg4bc>_7>zC@r9UQNAui)O;&CU8W1LQ; zGp{ABN)XTO(G9h_upo3nFYLkroWn&tMgk07IcABu;j}8ajmOB+jd2lbpbbW2BBnya zR_y9#U@x{iLmq6zHtfd{l#F0U6HlUP>+u(p%h3xR7umFAws8`w%qiGsrs@rJjEc<--IJLj`w^%eJsNpR6=XCL)CuNV`Lk^ zcmf`%J&-mO#RoC8Ko2a!Vk|-P!R$HV8NQ&v5S`+Rf(SyDA-X0?BPP75LS@kt1&0z@ zbU+Atp&x8jLW=$TU*;OJKYst_<(rq!+Wh-(Lwo+#EuNWF8ATiIs}I*QmC;Yurrl6; zX;+W4x&9lb&t8wq}k#Fv;I_CNVaTQvL&C?S_TfB+RtJl z#6xv{l7pJoT*UC~OsZXQ6Y*FvjQ$e)aRB#GV7ST8Pye^hAX&VRS8(G6ca%d#R2a#o zjM<}D2u|QKUgJINM>E90EhHjn4E-BAA{23B>6DRn9BmB>qc(C+B#|gHkv60(6Hg}7 z8BXEDMk*)zVj%Y55T4;B@=j+sj+&^8Ht2vJh{bHo$9crz72d)5cXEu%sD@y)#^B!x z*Kj75Vik5`A8z3>($1h$LLTHrIaI(XjKe%ELeW|5<{}!_&h=Y2Yw2#~@s_#ky<&c} zysoWzNlh8LLCvOKIjijs(ico;IT)=?X`=US+N8j6Y9kh66W*ZI2*xuA#a-OPG>XHB zD-^?3d?ow}p^ri|3VjQ|oF$kd8=+g$fXv*hu(QYkB4Y>kG#f@T2%HqCkBOGzs)Mx? z*h_^UrR9%mh{6nPM*<4{#wLp~Sd9~S2FFQkk{E(zID!P^qSXD-4r8!kvQAqRpl>6M z1{aXXsY=dQ_SSBO=rhaCQ&9u&NUAH{s4tUo0MFn&mC+u;FbP|57bT`K^1}+;gFE%8 zBub$U>Y@)OV>c4uLY=7r&cA;9NmR7?H5r*dZKXe*>XH(1=iDk$)hq{ix;XIe4lK2CckZm4; zM`v_FSA@@_sY+DaSWbLXlJ%uv>uZ(GU4kn8f=W4CO1CPdD;v)~Jit?AVx`$o9d$7Z z;~C>~tclG_0>@wira+rVQ?!$beK>*h@R(2M zixC)ue{czP7jW7E3$YmU7gFJI0hdr{5nTxeVlX!0JVF=KRACED*opo48^x9wsGCbz zDQciL8lf%5;9cVV|NQ$e@3gpRo;t~&f9+1(zInT)I)6L9mF&!y_FD~oj6sI;p*drc zPDfRz7?pp?^bJ%av(+(^OwNJ}naYceux0WB)9uJmd+dN@vKHx={OFg`a^VzCqxdqm zPt3tw{JmUf?%sSY2h7b|Kj&SS8zcY|uoTN-TfhYt5|3hh*d4Y7dNExN8fHNjz8I^p z7VB{g520Vq#)ovMfMYn0)3^_}6;ut66^s;65i>CtJFy!_a2ywK7k(>QIa;DM24ED% zVlrmq5uV@;J|N91+C#KJEA+!ijK-u@wK&Da#D_N@7>zuX$N0E}Qwi~hcOQ=562B&X z%hLD+nIYuY@*HP*?+5cI9==J4qwqDy8v5qi;p1E@A!k0bQQEa5D<+k;cBZ?&bhpZs zgE<5x$W2L{z)6fDrIL$J_zX$i82J7{u5lZ8P-!)NEoNdCp5p~puVKqY_@69uExFgG z)YO;N7S^I2`1T-IcbI5VJ#_}jbp;k!4G-}gC0I~tR6`?-#RN>p49v%B#N!U0;u$0X zZ=sTa8mNU(bVdZCAPL-nT}b;U<({6D7D5peM@d9uAkLG6Td29779GnsP_dACBSRxh zg%KOE3->pX08H3SJ-}+L!xt3VLPbLfcp@0Bx6mZCXCf3~=#D>;Wh;#z8X^Sea0zj^ zg*&KfvhMEROB#>JF8{6Tx8lsd*17Vk+A3^ ztBJm(p}v&jNd%GqDwt3H7vKi@yot}&{CSb=C~NZ9@?4W7)`Ed#4n^*5j1!P=JA1#_ ziCvhtgJoj)PMTqS*CW5zZtmgmEf-cfYYTUAR>r)yQD!$+W^jv9A8nF6oT^8MEYWC+ zG58&NR+S#vkrT4&{3wOLa17^h5k*Oc4-VoMG?Ft1%WxQjNY+qm^2YPL4CQvQnPVQ7 z?xG&;XX4RrDli=OaJ*?RyE>?Vrg(}3%-_cXunXA^Fl5GQ+`@{3)E6AZ4ZCsRSO?2)jO^FOUyHxQ?=^nUnVma%?(cJl_aEN9ZTGhI+jg(o zZGP=q{IZ41keo{dJji8n%p-@A+w|lt1CHXDHJ2-`Ih;Z+rzXqk2d!a$eI8S{hWZ)0X11)a zCi_uG*er1m_mQ3uWWWq_jMtrat`e6`8L&H-%M{XACghKGaL`=bM?8kBZ3$GKjqG*LSXm^52 z)1HaW=!=s$3%iqS|L{k7oJSlI@e;L9u|JMZ=#3*djzqk`D||wx(=@|~!~hJ&XpF<3 zSby3;%f-Yd?7(qUIYa-CCJ07*bi`?c){Zf4UX1of9euDt%FqP|aR`Lb9L3h;xQ#XUuX(m*OcJ~q zw@K6;1fOSD1s8A;+66i>RJufmhWByw!Z2KBn@7zn-!)0v^*wSP+S(p*z)mjtbdBdQ zfPHhO%rD$*r9UWFEV>#b647{!Pv~`yqQ*#!!4w!_!Va_}L6KO36em-0?5|Q;(FHxw8(Xm(&+rw2*T@yBqYlPmGG<{l zzCgWBrG`D~p(#dV4n9MU(O4QY>r`FyVViG5+-04&fyZSA|4(O*)mWI-&Hi~Re^8SCFM)zzqQHj^?9^~ z?Kx1)L%Q_x_Mg@&DdCOSgb}QCB!XCB74e8+9}eOW#ylo!c!&3>|Ac5^0T!afQ!@If#-Vl>8M1vcRlu0Ej^TR|4K;0|6RBT09%W+9U2 zXiUX4n6Mo;a2Ic}^)+RWqj-jwNcVjFUeq>!jLm1>};-O?$cF6bFEeG%#bkc8VWDC?A-mQLM;ElfMhnbj#0mSJG zzCz;C0Cry~NVG*eyu*8#2WXSz@(yl|D_=GKyh9E8cHr`|T$&x)ML*Xd!R?BAU$_tn ztIF3_zfj8hwP>KV(pgX2u8s=gx(&zA78HTH>G8#tAz#bgIG5n1)xP?i2R)z)GfXldrENN6FD{`R--Xm>VRY{Kw zX+u>d8xyX$f!nx)7s$sIxRz>1jXHW}ui4KYcW&Le!TftB#gy&uq#eOhT8l8QsF_Yp z(?*5qvl*1?QdrZ8&F`o{b}K@%e;Kwc+Ol9tvZ^#CWz8@j3t*p~xMKuH;uT(_T?SQY zkC%9bU+suFzBN<>6V-s9jJ|@B#$nvULk=z5hGiUv45uxV(0IU>kTy(rhb=+Nncfa3 z5>WyZFbkWp4WHmZf;wZcHE|z#PEX=WpbR9jbcP>f*(YdL$j;hka zN#$OwsxrVSzp6}RVk(wkWF9`~!kbVoFaH>(U3a}#-UA6Yt-q(N&s!3=@w7h;movoTAx1uGy3|AO zp=)LAN;h=JSnR`7q{&AMh5i@-4Oft!dY2ys z;0l)ls*)G^;0wP3lz2b=A#Gnj%DGK{nt1a=gZ}yr2HVPH;j&O!kSwGmreZPdSV*2^ z3;eqvTTWqBd5kaE>`o$a8IO?OLshb)GU{SG4r6c$HdRrQb`9-HsXj{2Qlzqss#HNS z{<-OkyVvhtKX3j$ef{Y5)7ELrob%?tHLpVY>)K&AeV}&ig6bDqm>en&Bq}?OK@xZm zX$z@JQB+3_48brg!d~3KO=Kby{-}-ih(=FHCLe)}No(|II(7DO$6YwiR zsfGv`F&#w+Qc(~rNmLuH^iwt=(lb#m20LzgWzhFkGx;dqN+5TQDywkk`-S=*-_2+= zEyWDaarz!vl6`~^?H{9$vP+t!O`55X`ED7D#;5p*f69-1ot5GvH>Z5JT3_w?aD9(t z>*z7(yASwkDbneyNjj5#AbxI&4@{YvVht%$>8n^$nJg#1nr?QA52Z+_U&?e=T=?B; z{ZgjW&z#O=@$|FCGudkWv=nLe(^90>@5i+IrA(`zmLjeG=CmeTkAKS2_fMHx|CFiq z|1q`xDO2m8GPV9crq(}YYW-8DHXvnc15&0oAZ2O;Ql>WG$J7R-Ol?5Q)CT;R+JKa) z4M>^Vz?7*COqtril&K9&ncBb~QyZ8vwSg&98~9^t15>6p(45+&ZNo=DIQGB3o2mX|4GaL;p0C{bIT0* z2gMnzT8{>_d2*A@BC8@qCGXOi4}`O}fFfje1lrk=)y+e092 zA-*zRp1Y+C4@^M&IacBi{E2ngfKAwn zZP*KOW981Ua=%x(x2xPmR11=uc5>T_ zdfZZ_K6gN9Dz~hp7@Bi`jTU@AK7{YWL++F@UndMNWLf{U-ytNY{*wJjFHPoSpf*19Nw@(4x?^u;tx#~K{LvGisnWm$zoI(iUyt_108Ga^ zY{cKViwAg%>~`FJ1;r4AUlEL+h{Xgf$0{7ab=<^j*k@!@%8`-6MMVUmGlpR#W@8Js z;RGJwF|uYNu_%cK=!Qs)!~!hFQQXEoe1cF`A*9frn8Ti#gbe?Kp!ccm{nI z?nQ!v2tX4ABO2rJ8x~_X_TehzpR>M)18u+j_t7$_g0|=Y`PZULVOYV#4qQMSi zeZ@=3th85}D$z9tMQoQ1y>MH@Mz7m+q zE53|JEEx((nOEObqu`rr6nshQ&*S6ENNCMTy+^Vz`!W(r?ais>o_&v0Ka*PSec6Xg zTF>`k_Djls%G~>k3G-S7MEHS{FKz9;Ae?~ z;U~4)Kh-Gsry2$SRHNXZY82QfQfMiEwqg0FS{M9NjRJd1sl>-W)hPHIl2?ZB$|xY! zCxqpHXMnOh{G`l0k&z4IwE+cahCqgokknAQT(S)Q5AxR`8_TF3zMM&xplE&n+F(Fw- zNPG!}+=$>4x)G8sgrpoHc|=Gm6B7BZ+!rF!gNQ65A~lFc57Z(etBA-eA~KSQbR;4^ zjs}i_6Otb0kf>zSGN@TaR8C>mM+U*%fXy9cP!@I22#wJS3$YZ3@efYoBARn>y%i?G zh!Z%Ay4=XEAvDaX$U_`%;vGK2RpG)9Y{XXhr{ziw_AMW!CoFaQ_s`QGDISXmoS;72#qztEU5nqu$KSMhFf)416K^TsWMc4!oR+LQytFRV*+}Phh zMt5p3>Y^bgVVXN-c#Me?xZpvRNBZJa1h}IV`eP_+m7)S+HkM#7(7ml zF|8syH>h2SmEkTPz_Bu;X-o^Ea-nh+c8aPP*rQ=$AlB3+#n=E7_Fx|h)#sLfD31!* z(~{9N7DY0UMV~050KaG=gXullqlCvGZuN-m*oEUm$SB^8CeCBHed8345gB+mk4tDc zl^qe(G?H6%)fhSB%^bpy5(@}F)-5A}NV9@HEsVlMB(7$Yfy{X+Wfrnvuh4<*OhYE>{G=cHha*UdeE63?|@aG9~2NSmAE7G21 zVW^GOr>MaAdY1jibL=~wC--P@k$aIs?(G|ndw2rFJ03nG|0QZUs-h;QU^>=e6VBoy zB5#pMoWfb8xkE9)=|0PV8%m)AI$|(};S|o{Ek48b0r!f2K>1f@qB`0m3}Z0~e_%aM z;T*mq?L%rcyig1EA@|7ri~^4cI|gAWwqh3^AQ1&0QzQsQH!Q-k$CUp)CLZHGbWhm7 zM{f8b5Ua2mx~Jq8wNW1$W?>apV<&dw1Ww@wZlOp5QNh$ij+EjE9vt+hNKmu=B+$0GqRk*fe#*WnjbL2Jm}>tsM;ne_frbF06)?e#nlcgJ(jJ>MVqe811<`(0sV@G^SfLq;rp#`uM+pzDxR_4p7m zgNsHu-e6%x1rDGJhv9|?HC#5;p)!uw;C`92gfufdN2-MwElf$`>JtsgMEv0juE7f* zv?+8#BN4A)BQ~dy{?W5JWsuXm978`I!jneWCo<_2wqeXXdaz;RdMz7yuaN`@TSROz zA{TQ;(2N%3XA_rcJ4i@2CNl)02g8~$x z9!=;#7rc-ot)I!KYaWa6CLGv;YSf_}=h1^+jNV3R!gR#JjvN%gQN&_e0Ywd`(FQMi z5xSis1`AS9f-)>CB%>j02d5r$Fc0tH1MI?XoPY~G@F8p`7pF)@8Zvj1{&qH2V=XGM zA0AvpFZvNu#DO3l7Q7BCHeeGDp%!1E6<2W!LyEaOf-wlgi-?09bXIE!wC>?RXq8P?!a z2a9I>fS(cg5l0F+9=8&)<)j3gO(FPhQ4Wxf+BNYhdH!*Mq3qB{D9n+4|hC|va zX^Iw(p&7|8Dj__?0Ct>VfF!)%km*p?#_t9?&vIs9KF0xLLI*{h8*M)*%Y{f#R;4QjY4PR4c#?A_3InDpitQyG$0zXw_X}gkG*_b%Wd7| znWHB2ih?I_9rB@9>m!x)a5<%|ocwr1KrWMGt`Twwv7A!(lKFkH@P!RRP8=N^rOX*8 z?*XvK!T;5;9Eg|qJq920rPa=ZQOa?xu_AKww%dj6epO7KOe0`ES0~?79}nJ3RD>?* zmhQjL-g1^qW(uC6{(Lj2rOUN(kLRQGQ)e2K@lT25SLG)S^K!pM<6LP_60~1VRaR;= zCUuobiBKZ;H@ehvlk(iyFc%?bH|kn7|9{EE3jTW% zl`FyW(B+Oo`1*3~Khb$NQF(Io$X1>>iBlk_i$_Ets6kf6F!DS8x_~Zt{&~fjVO9J! zDMa`Q5?_$Oga1GXoFL>)a1U0D15spx2r&^3xkGv{L*k1xi_|batNpd(D@A{OA%1Vve{V+QnkJ$1jP6!X;8gtC-7HBI^XPK%5fi zghj2*R$dDD_pY3Gvz447;nBvJXrtMzPcqM#s-GHTnx&s*Fq-tS28+R9ikUvk9Bpvs Jy{+VH{{qQ#_mKbq delta 38843 zcmb^41zZ%{|M>seS!_{IkPz%nT2QYY7ZnA&yG6uq*A8q~9qcZyg|&8HTe0KX-GNsT z`}cZp7%1Pz{rn$)_VL`Eot>RI=Y7tcITJe!z2!LcyyFzFV#QR&^5>u^-VEz__vP!? zuQIYA?+c+YilC^fo$<1p9vhiKH%;|WLyH=-skt)@(JNbhhBXzTc~z}^2i4OUu1+(A zGplRap;wg1Y?g(%kG0HkYi>nZX{RVH3s}Y{_gbo;qU=nmDDR3ZiW4bF=c6d;nQyl- zio#o^JFoKho7Y0We2|ARm7)}73*Y=Ofdue=1~YIrhN+p;Hnk?v#h15Pa>q|V2a#a=2Pw+YTW+f1*rz+Kil}f z$;~MzMfo^NQEJ*gThF{RF7ZBOK!_J{xW`JsnlF2yoRxdi(9=4je6htA2Tgt5L$ z0qZ!wZ{sGq{rqQNU(K#FIWp;3~eC+-GW4~f)w4Bv+PR7D+woiS2{M6fc z+A*JHNq*KG5`mF!)|C5MbI7<|ZUNTmtT`k)s(V4}I9m>VjV0Z!DfhGG(APN3-P<~y zEr-6weeOZlakd=#8PjC7j`O$W(9al_wTNXpe_OWvjT5p~wvMx9#@~1=Yp`{kEgu2K zKo4vB{B8LNFh+Wmu}){pM}TpcM``OgTRut{Q+xVb$652?=VPqlX-kVWAASMGF`m}i z;BU=`U!ZZfr**jj)_gE7!Lzt!egW2e_RYKiap-ivz107-b0sxEi~+q0vV7I1yB%g9^W|k=E%7tZw_qT)I4S(k4@1Nq9=^# zG@{9fYSLckP*V@ncb1`)sdZU8?lhED>ZR6o{Zp}vK=0H##ohApZ$I;O?zq23O~w3~ z*0P>jAf=;aIKfXHqZ$3xEP6iIR{N_3^_fzP)-L<2`CEG^WT*fnv(@oqhBxtkGZK)U z4Cla^w2E>TVd)g5HV&p&6bCZz2nk36Bp^k}aAQm`wF*!d=z=8xg-{qpAfFe97fPWt z>Y+XwpdlJT=Ft?*&=nC{SfJ|CVFH7bF$IgT7(1{NyRaL3uor*h5KiL^p5XQ4*Kv>I z9>0FP``geO^U!R@jbmu`JA5$@}A!*@B2P6KM{A zs9Cg@L28=cedU*8GgyjE`JvqZk7Ca+k&s-zM6QhVPN3lgQqjW=#$as5Q@A=RN>%j5 zYTQMZOmq`520J`?dV%7Z>BM3g9>bG9PeUiIdqcINR<4xlu7w1vHMKeQ^!75;QO1?m z;!3IBc_qM4@eI%L0+PHpcndvAv(t)}R$YQ5#raVHrSS*qqX8PC5gJ2s)e^1H5B;^l ze7%fhbS~y$4c6i?j^HSc;W#81XK)se@EEFtcC3he9Z<6)mH>7^H}6 zq86H=Ir^d>`ePslL8`%UjKB=c#5$};EH+{jq^fMk4jjh`+{Xhv#LL^4Zy&rId-?X| zg$%`dUp~m-Wb;TF8uD$Z>+SE&T3PmKev0MHvTB;|p$<-w)fQqP$Dv*`0 z0UDw^iuK^BCwij~WX&9aftY}aSdJA~>8KrRth$$bl(6Vg!lN+>y%HWJw0ZPB%7tmF z|9jAqwmrqtuTS;;`k%F!0q@{Iv*n0Pa6%_%o}_Wh3J>H#UX(#ultTqngfxJ`sD=*c zh+!Cx5g3KhkVbL>CSnfeVzaidg8Jw8+B}ynrL7puVN9R%$1$N5)$IQzirLeA-=ecM zao0{){Lex4+Dy8(z=Unsjvd&GeK>_UJi=oG&<(O7>5V=Zh0$1mg;<0oSPI$L{DsvxietD7OOqq5%SP=|B{lGS zsP%L}eh&3mx+Oo2(ZVbL$6EVe8V$oVx<9u0Cux{`B(3*w9}n>evhjS0SNM!CaA9NW z3O8hh2V?`A8+j0jAk;=3)J1(Xa8jzU6=s8ors#rjjKXM)!8k-=Jf>hO=3*YUz=W;Z zsw!%^Z(%IZneB2inNpIrwmH(jq=#pl+S*K1{r@w>?|&%NBq1&&xtE;n#B1bnrkj8% zIDk*^$)YH25QD35c2SfNjKN-{aHXq(kvNF-ZiE<F^Yk9*(=# zY(7sz8>)WN*D?2c?6szC8RCQdTDf3`Y@g=0e8AW2wYXr_+pv|CZpRKt%J*SE&f*-N z;W=L572+Yedy53vk*gHQhV00JT*wWHKtU8j5K5vB>Y^SRI4c#Dh73rUnxYvZ(H&73 zj|rHB$&gSQF&#^=6uY#2)qZT^>a!XAsR|UhN~g*;CP|_FT7|R;Y#;th8|d-BY)QO! zk<#7RgMHW!sT4u)H+&;cE_c{SCNzpFyObZZI}V+~3slfS8&;kEu_)%;HZ z4y3tHX4&~Wl8<2+ju9Az(U5j33gfX5i?AI#uoJtn2hx@uz(L%{1AK)-o2G-_mCc16 z1JdB7MjCh`8%iJ$K`4dNkVdfrDxxjgVF(P`s!+Ae?}Ghn&yStsl<8+s+_qd>dO+?; z$7tbUzmId$?Tw}1^KDzDo#uOnUwiGp>sl5vkoch(juDU+e;lH)6w9z1d$1S#aR3K# z6vyxk&ykX?Ln@?(AuUhoAe#o1p2K zfde>*>$m}qOI&z-f#VVfUu%DrQ!{AyYpaF6#U=eGNu%}1ktOECl8({B>-^N6=iPrQ z)c@_EgpVZlCT`;n*rqCv@EBRyta`v70VshWl!R<{|3DekL0xo3L=B$0p*wm&w#|Le z7Ynfn+pz;Xu^W4^7YA?b) zk<6bWD+xde zPVB-S?8QDD!eLy&Klm4K@K#$@UoH2aLLi6FQl>xe@jbMbK4gssKi16%-u-TNNejvS zzqG>b+mOU$3bK$?5{aqAOF|*pe2)^OFcPcq7uH}4OnAa+-lyoAi`t2KoZg+ETXS5X z2AJps4%HdnGKY6aw9f4duV3N9w_V{4ANax_0gxq@#vcep7&@a1!V!UPkW}?XAB;m3 zmS8ECVTFfMO%_ft1?O#_HJb%}ixZ z8{0x@DYywueqU6-RQ~^^FXxkzWv7J;${+;u3G*sU$ge2VumM|e0hjR+Uy-YTqU6J$ zsEG&+!PX))-TQgEjfZe4N`D%y(G6R06bbl(e8pJD&>CH^4C^qYIFZL`+(srZf{D6l zj~Q5mGq?s)Ks3(b8T5syrYM3zg*lR0Sktvpn`wqV>K5%*8#SHQu#uWebLg(xX%3G1 zRx=yh*%_P%GvzGGcs63O0axKbxi-Qoyg)X}voYr3HtwJqW!fCQ(Fcc+mU66tNjQoO z6klVkz-gqW*gh+^Khu!b>Tq3N87XBv08+lka2!J@ODS6^S36VQw(3<~Mk!kK>h& zt&Y5BT(KZ3I7)-EYp(igYeuryx}c+7PWE&4UA3D-)zqe!omEF&MwuuKtuZplnm|4x zf#D?3k#Wi#tVb+-OpX!iOI<-*W&DE*Ihx8i20^8%2lx|}{^0m1%n2x`g}dtgw9}8& z^pb$erWcWFCY?bl@n>XUdfRt>`A!8azzSTzb$FGbYl{h3h-c-gLltPbL)dsBRc*S# zXo9x5i^nKik1Z&ou?lw^(F``G#x!TGb!$$~4D)cbC2Iv<<1I3`qA5Z7Hf%!?wsJl~S-(Pjh|KXX zX)mZ)8`N4Fb*hjyzrWf#V?3W1t4XRbu%@L>o0<(!m*|3ctIULk454(mV5>UWs4ii3 z=wM-eU4nq!_yBW+%4tNXqjq{dZPN2dwXo(eSbbGUKK_Wp^(bWIs?RYTltw3X#!@V+ zZ;pXhbA#$`>N-R<>KvCbTHk=y0(WrNs~19UYN-_T79ZBbYi$0=3+HILpO-RMOw5(1jgYI z4&xMVA!0B)LFkQvID?z`gwN0qp~XTow8RE%#BJQc-62YV@|b~-@G;Q+L_cI6MnF(? zI4dHIScql#3s+5>XRFn9*}_PyB1)uQgzG&_CFiP#bRm7MbMDV;I_8`n z!IE|!4Q2+%|9ow)6dvO65@h^Nv(NQ*q%vU$+3|IMXmJx&*Eie$5TqjWpuns%02Pbh0 z&+s0)$!rgsPo=@d$!Q#TLWAk721qlLB%^XPA;Bi>L%vzW6*1U|@Wp%|Pw*Pomar+n z6THDYC`;LXA|nEp(PSZEIiXu_`m$72btV5KCzCM)Kjv;B?<2`gcO+U1vGJZK1zOSE$ZIuJy}fD5S~XJV zy@b!!&!?e9_yXpEb&D8>qd0~UL}w%}5|K+L@Ab5Y-j^7TCpxcDcm*36?7&VmT}gw0 zPUs8`(I)Q=e9!Qe>BE?&J{B;3HTJAxIhYp1IM}bIO+YBZ5QXV5;Rsf*VJ$?^dg6ng z=!3mDh`0EJ*bRIK$2SoRByOTAePJNeX6haen3y3-ZY9W=hG^`>K0HG_vTh^jn1Crb zg>!g}=Sa7mCI$sj1l3Rn9TAQwOv9$_wOEN5P8y%wwqKN=*MHB%XZ*ts1#rR`9!;Al-@No|3vBet5t=3>3<+blx z)=jinM=Op|7;XAvt9n3}bu`0W2xdeql?stqi*>Q){!3P^SOndM(CuvX9T}&TAm9gZ zPy%mq+(|mZYz1(g*k>i~9w>qk^uSyk#v?dvVe5&O7=;*IL2Am$7fmtF6t-Jkr|Ue9 z;Vrm;H^@m@)x}7x!daxDe7w;K;pmF-kg}9=l(LiZk}}$4EgC5nDH16TDT?Twn)hvK z4foO-)|5h#0+GUyf;a+~-SlHH2+_ELJbUP0Vj&)*!d@bci~HC;!XtPb(9X2hZ=KPV zOPdBSVP7c60ri$a=6K3F*R0G*<{S>0`v}Mq7D1MB1G1#Tkfn8mEb%YMQsW^@9d2E+ zEcF>)qt1TzPB9tN@fqp?R+1bCXvi@J6Of26NOh3S1?r#?nxhRe{7t<@sza;@a6@*a zJxqIw5yuER>K|u^4w0CMwI?|02lXV=q7aImY(nG9Ksi)J7#gBE4&oego}!UQAWEYO zsv!&wFb*2r;+PKq;++g@js8|wWb+^|p7Ve5#Xh7uWa$nU8_g+L8cBQ2p$$)T z<=dKW9#V7a!fd&8CWn#ej`5g)y?BUX|RK;&!@n?%%>6R{Q8Ng#Hel+*^u?gl4GEXQi3zDZ?9-dmX&xWje@12GcYHODyh zWzA0nrVp9#i!1o&hd{&-jJ{;JA0+cV$Yf8%;4ciYW_B&FTM>Uj(^b_M)Q0BJyK6TS zsb_Is3^`QQ=ht49qcn4zQEyd?XG(>zI3N=;!w;3v5)!gDsD6nJCkUT8dagw70#Un& z^XBMSdm{FlM|au}p2m4?d?ShUAE^th}ugFKA;xW7GF@C8{`uScyCD1w_!Uf z-(>~CM|?u|d%Q;%%*JK7-KRxBE)<6snqV^a;04|y0gey&K1Sm+VYU953>P^9V2~xs zl5BHwd&DY?`B;ypkEu7fjt}Vll+_e=&*(fNJshwAOOWn4DaKqZM8FGr8(4x3*ogP| z49AyLdgqty#J*|YV#y)UwA!*v$%!($eTdphRzrbBcd_t9jgFlLc<08gC>b=OfeLPk?}p{ zi0sIVE}v+`K2aI3f1#~WbV?tcP8p3w*nnsFhzhDsse@ST!Cn;C>l7bUK`>t0>6BN9 zhf@lj;);f7g0Yy0!#IINd_~@rI;C*R+&U$MfiQGJH$-DDuHZIaYdP<#H*4-B2oe+t zhy+6d(FLc-Y#eft$=nD*O&B1Vp9TrQ5!ix|^}Uos00;PK7HNWMmhaI@%8-enoVpfS z2~jshA`0WN7f;~uflWNxV=*qn`6H_X#$pd1BO@VpfJFF)HOfwwNNe3&s#&$j5;Xqh zD(Z*JrlF>}_o2Ofs5*Mv%3=)hzlZxsL)_D%9eyl}8pJ=u*Z6ps{*6wB+BI&Ere{XA`MC;@!d zkf+n3M6ua^b+~q`g+8Me+Cg=YvnJZ}muzodJXJFp_>%GtSySnh9LS5D{0Jp4Ho^qo zG&&^+xA}?cLp;Vy#N!=4L2pmyun>hZ==jM8-^DJp&8Sm4Vk$1+8t%Z&L1$1r9f+Qz zPU(!knRLn^tiWx&!aMADCg*sK3RzeX=Hd&!B9#jz0S$977mKk3%dsBYupK9G5~mR7 z(p0C6cV~uJfMrN{@!)zgj|<<%TZS$?IB9-dKY0D%HXaYw@;2tdbtPq%jw1^6)YiXM zUDG=`cYN|#;iKU0U=p++P>CmjP$_W zbtY|JOVv&LoS^16Hsf63%QHMhyi-$Zcdn`VwE6E;^9jR-PJE3E0CdV}B*Mjm)f1zz z5%=NgsZ%OrEKVUyHl{;A^v8(oI%Oo{axfn>&ZRT$Yp>6w({6QOJ>!H{U-No)^PHOA z;4HQ30&~5BXM8&WA7RHF@}n?L;tcGVTLxr?2YRDFa_7`3`7i;K!4kP7L8n~DeY}S* zH;qLeN*BSXh2eP&I%Nz48?g)VNQ84z;ZmmbL20~7tt6k5QXu$jGM?>M5p9J9W=mL zOvHUWL-C@tPN;(FFrWXHbKthegTx0aC&ME*t66n-wCblrda4;~ zHAWF0)(!(JEmf+eGJo70|X5Lue#L~Av*_@q3 z-j>%+pWuvVbr*dW?PW!(O20iMV)lErRm05k#SDl*Hw?m5OoNURP>~KE@I){4##Bth zV?04RN<>O4D=0BpM-t8Jh~*@DXm7psB>McXmUW_|v#nq~3$R|J2!hcOM(oB5xKp^5 z(G`*Cj?$E)6u6YJl&_Snl&h4ftvnAh{C8oUY+ws~+rauskIP=OA0azHjTrjf)5(?u zj+6iV5-pY9NxQjE&5>D05xOxucS6#CX~!F+EfG@QX%e1zp>n#RdAHlIXCQ8-bb7ib{G4YNZ?q^;5p3Ie6+xg8P~jN6K;7^&3)*-pa{G$ z0#PX7%c_Nxek=gBP#;4v26}(m2owm=DW#CT1T8lDU;qYUC?;b%G|WK)KESO(Ah|;k z6i0ou$73X-Nf7M;IwKtW@HdK=WPQgFj6j!CbQ;jKG^+w+MK7NBVdCAye|Wq!KU;<@ zV`Nw!cN6bwTmDvyYb$!{GiW>F*i=YE(6FvX_)kHKM2h1hTqzD;grYCzAP!PYQbbZb zQZ!O5QY2CgZO|4Au+Ym~@xS*h%@w~Uza^l~o9j16xOzza&Xd8JiMi~AtuGpD_ICPE zty%h?YPI?8_gXD)zt!qYjVaYDcm*Fy(%0w5nkX}xol)P;apTEZHm8*elL2M=jmuYJmLOd>4I7 zOA=B$>mv<{y;Rac*7;55b>C;3;0?3ksB>j+LbuKqQ7>dpSBCxQJVDF3&WG z!3G?_X>_ST1C5~=fv*OhGF46nYXID&Ll z=#0S&ekh4DXognkhk;m%l`uTw=@sf!Wfezn^uZ8Z!y~l(lQtsZ#r+ov*X8-T4Dq=C zn}=nr<@x-J?+=;w#NHF86CBye(s5+#(fsm%SgmTRHY2OPtoEuI?e?C{YAS7QPkk!O z%1=MsL3>t9pRuHW>S4;Cl&;bj%W)DHU@M*Olt2#*wwA^=NM zS~^je&4;t412MDxAe7Ji&8(g`Q-lhXdS^ z8v`*6ORxgFuoq`>5jU$D*s?Q_iace+BE+B_dFq4+bjL(YLk!m75RT&sUZ6=$ozfgn z@fPo4SBs_>{-}jIXpL~p#zI^(@N^ToL+LIc7-6`DCrDSDb_83o6MgGY!_l-ZwGIg{ z?%up~%KZ5IlI?No+tA+hfbTp4HxV>}`6?sajnw0Oi}}%kg`6@M?IXt zEmUgAY%v7m(6JGHA{1^yV~LM&Zb}_M6|`-}G?;=#*n-3GY|hReLJ)>}%{cu+NrxZhPz3`p1oN>TQ(LhXU@MM6-uHIGi>sj;I zvx&BcWe@ReVm=vRdn3d0C3#pTv)TZ85v#2`_+TiCLBV0I4Uofzal$x!CZvRk9 z?J1!Sl#Z0r1Zzp{=d~E6RJ;k*xR2^@3NNOgt}DyiZ-tkIf?G==t-}UlzfsD7nBT=v zVmnM?OiW|(rzM6ms|r8#LCjkonniaLC$qeD^=x4dXY%nxasu)Yy}THY3D`>%_dz1q z$Qs3=9atP1bmY(@p5ZxsJN>wc$S)Uw=eKMu3dV5S^Oc{TLwZsKqp==aumk&W3lA`s z8PCEs+`&`Cqdp6e1!f7SWkr5Cb=4^aQ3av65W%hw;_()_BU!J}9-S~Mk_tVRfv&x% z%n0g3zXWyAt1pcj>h`0Lg4sBZ6F7-s{n`D2+WeIQnAe8uN%%M_0|AG( z1h#|dJDEgd5tiW*UchY%jVr34CVHR`Mk5OUzO3}{pW_b??%ld>>vA5p=XE~}$=G#U zWr}rM=bN8p$o$|0ZI+I0oqA~N=WzUZN;eKG&|6Kdoe$J^s5-c0R)yZJ5{Bj|L-ds% zkciGjB_dcEX^B`moWWT<#WOe#p{@@x1(enw)71&)&3GKcb>yIdZh(oHgp7pS0Xqrx zF4z&p6eu{7Jvoi3*XEKAidKE&Yo0(ouJkgLIAtCi_+crc(>H;ThZ}5?n-JGPdF-GEQRCifK3l z2Wm)d)JFsKMjtH1HavtYwWKn-gVR~x|6VED{7`*5&9jC6fVOZiUHYAw>5rR^Gho6yrkwZ$a*jv^KlSI@C7P~$c9{~gkW?=Hw?untiWoV z!a3Z>6Qn0$&X5fFKr&GUZP5Yiun~u+(EuE0pw5QHj-omF3_Y-V6P_TfIB;2pl8&TKj`Sc6z3 zKsSfPU?h&=1dhz5s^cqk^DKwFa_S%6d??4h3a7eA&*dUppec7%S8Zik4!LZ9uI4n< zl~Njm1JIFgiNjnxM?7A`fqXi`58bd9l7Gp&MeyYOn zXI9pSSkCLRdexM*&3yQaEm1}4iTN-vL-yA7P7d_G4Awh#lNqHZ&uP#Nk=ReZ51=x6 zuYzm1jxYF%vGdt%;U4az=K@-E6kSLghWGe@x{Fvx@iz|P&0_N=%m3Tq>E3dE&T@mq zxCR+TQ#cJSMIAIlM^IrNB;GJTUu5v) z---Kn?lbW)zq;*9l(C5y*DhOoao)x07w1ioD)u1prB=0;zJa#B4pnSGb$##7C5WJT zLG_qveY}&IBX%kMS>#(rpAPF0ix$gi++n|heFJntXY9uTWL-%o1Q&1-##PKShBZT* z5~}yr7KX|3wr@|;D4J*ry>tf2)qWhpeLO@w-r_4Vl9-lgixC)wrC0|^=r$aL6N$`% z9LR%WD2w43iN#n8$a}^IzoalI?#wr6{5C-a^K4xJVz7V?ff6+5o%{Bn1*HCW|u$F!j zc3>B-;Q<`ilK^bSHe3KDFAqxJ{Cwy7oy$Dr`T8Bk%Hw5XQQOBdk#&;G^0Dp9wh3iM z544zO`ug3ZTociSgoWb>2|J23EHo|h$I>N76GY<@E~Cc=B7;>MIcS1%o7niH>Sp$l za32qFcnkByY7;H2NvECJulh@ah{YZhCEeaAjWQq~2IWr%8sH`V z#TO`Ks1};zIntA{efS%3c!lL;G{%xyWfQM)XuFkqjl(#Fr*PU%HAN{j*};w!I$#JA zUX=NE!Nc_j<^!w=r`gw$BdxOgbNcw{Lp+Z2*l)If*Zyt$H?QBkdd2D$3s$fdYTiKK zQ(HHT-b?ctN)Q7DJ3DauR=BsFzda$OwWNs+;OH=B06 z#=khThu$l;?PX(%9oV>!qXPR(H5=+T=nRr{7ry9fok1M04-mwcL+}CVnSspc3SL`h zW|;|_HfHwrAoUR`|EB(788+b|p5YA=vF{Ko65{a|&W9QB#AuAgI84DJB;pf%k5TE+>X?B;MGSlazv)xl;fY@8 zhlyB#c)W%C3ECQDLq7Q9)7ww+&&-cUcOS)HjlX)<{5X2`D6ba3dzR^rUd<$vSswEC z=+*dV+SfO%WU}vTNRy?bONluOhuJv^FGC7rxK_qGMuwF1&a$t=6*KZIC+p?4)+UNY zisk~M574f`fg*B*H++zVB5}by%!iI5*@o?~C;Ay2cv^{7s6>b@N7GH5ndiWTjHry~ zcmZ3iM-isckPv0ZHCz`bxfBBSam*P*PqWv7uTaiV-q?>$=h(0z_XV~iScMq$xcE~) zNxQzEWB0a3iA#~?I=CG7>F_(WV95Nzt=8-Wa4lC3gOrmI8kS-O)?*_s;UCx%dXM3^ z2q&?T7>uD9hY47ZjgSo8#~ai>#pVNT&>r2;12Zw}6t&!$9OuJ4EW%pEVmo%>Htu08 z(a>-bXYdcM<2^nj6%lep2XsL%^o0=`j^Z-H&eHTE25Zhz%QrHx1>FhlP`t-y)IQII zXoBV_OsGquEjnT;Rv;Gpk%D4KgUa|5pWay?FF!r`K79M-W$VK{e8ETsU54&jdTL6DzM!Yq0$v#v#KsdNH_qokGUb zn>0)4ev3jv$=kH(7>Z#?bBAUOQ5Y`+HSe+sxvMjAy0nuA3-4NYW0XHbF45Q+g9g0YCkRosLlbt60K zp%JEGG2-zS^{F@QF&7JQ4+*GzkNtLR#sPeW?mp`l(%m-@S_aypCr02R{=p60Ly-qu zMTA}$fdyECw@CSr$f7K^;V|yt0SY~$2aCpNj-i-<_1J_nxZZ&$-D6UNGq{NiPsl0! zUJwOpDms3v^1~UqIUYMIe&NV z`up)6hP1F{ToL-rSD)F?khM~|hU-{E6xX5)0SXrcqbr`{1!4)n2IL}txzP{(aTLc; zk9^k0l4rDf82g+yA7jXq)PDb`sbD{4}0pIQ|+M7(Lg474!2j7Bc|dM zKEabPw7^L0z)eVqhFe1t&FewDN5OyD??M}-eq+8c?V$Phcbqksi#NOXtvpsAW87J@-#y=5!Ov-I zf8Tpq+JkpG~{}H`mj0S(N!|iIla<*}|TK z&=(=xMX?Bru^$Jpl&}{dG(_J~FhH6xkw3QW99=J7i(*E|8^f zhb-+hKEa!%wL&z0Ou>5I`=n7Vzw#*Bn|=TJz1Yv^i9?Xw>(_L%mp-R18Tk+gS!CtL@}MlU#cF&Jx_fP4r5uD!nm)%u5h9 zYlULea$0DN+C#ozy3|i!P*=|uo=HqG)LvDF;Zz1yi9=q(C1JaPoA7oZBk;v~#LBRv zs`w!~ld80sJ9Kwn8`keJ(M@YFgJnSp$H7asEEe<5G?%d9HH`M+e7uoPRc z11GW8nT5G94cfY@%5)TSV>uAnS*fvA8EAnwo>YqLs^XkORSMun z9#we)eO@XQyippR(Fb?&3M=wc3q=7{*@LkKDPFWFtSaFMElQ>0=9!kqZR_j#*XIx8 zbvDcB1FvttKJaZK+qlQC<-b^U&SmY6D{ht!x~*mG`u(4?XanL@Pi;|8j!>Jg8a40J zrnO97v6`zAC~?1tPu4K{6UxSftqIl;Itkx7WXhr{wJ{PVJc2tREdX118#3G+9WfDm z@h|cb@;YdSHm=qREoWLa^XWCu!R#YC4CX}Jt-)-)nc`bP&0u%~p1_3ylY%RbC6EH# z2RjPQ8&a6TkOHktxmAI!3|nSpsYCP!wY@`FdCWieFhA8Y=wsXPp;C%ME{%U71@4fI z1)&xq(H$%C7mnjG(oiYV!XK^B3*#^gb0C$*i3&r-ku!>CEJy0eviTCbI&u}7W00*@ z6=cG!xo9-;D!0m&`>K*TA2YxhYK^V-%w>2}A?vy_OfIWqZrqg2^n9c~vo61Uv>6dp zux^-%UD%D9RJdB8;z@d%n&V*N2QXLl_TGxO;;RJF&Ic($+P=y9h;+75fr^)=Tda@# zX~eDQBqQRZ^pR=4eMKv?Qs3jJFNDob@&&J{`p9pKWf@AquZx|sFv*t|O-u5nU()KG zG_BrRlC*kjlGYy*=dG1nnPfzg)Ou@4QtSO|YQ422srA;9q}Kb_$oeErtxwX_`Xo)Q zPtw%-Xh~A*lQgwHzoynFX=;6vrq<`z)cPh(t#8uQ`X)`SZ_?EICQYqx($xC?np)qa zsr5~oTIz1n>f@I*wOq+Yt^J{rzKr^*l5z+ApX-62Ijui@q2&a9k00u+->)h4GpF>2 zubi2f2`Ps0-zb@q`)$*S&Q}es^4E#VA z^1p^2Vx=P|5HfLtFecpU#P8glxjRG_ZeQZU&vRWZ_n?*=63eY^Q|98QyrsBf#XxSV zFr1%TkC(eLS#G={cd6KZ$MQ4k*C{zf&i`gJ{|HO2ahI!Y<-$g}7ECVuk#qlYCRI+& z$vG7{MlVM&<#3Z6n~>c-=~GKDMK=3yjD?Bvs<6I*;vbmjy{FY29i~v+a2x_4L zTA(dDAp$+o4+f0E1WdzB%)$aJ#!@WDO8kX2Sc_O}!Zt`C`6palEJ?)VR>E>;Rk`V@ z+lhWuo? z6+cgg+#yfyb|<&8liSwGE$ZZUbaLxCxy@YIKm$Jyhun)y?ujM0vyxj^$?d7+R#Z#o zadVJmEN~@>i{U5f>&$lxGT(+t?${&u&ygFjq&mc%7>-i(C%Ll&#VB{Vkb6$pQ=Fq8 zSnjPLzwDP^;ma?)<#*Te>*o-Ip1otrx~Dxy0-YE^`N(hQIsYu@5#^+koGg&T`Ep=Yj;P2X4B3B`-A&n_ zkWRjI)TP@kT{h_?Nxwz953n-fE zYM)xzd1xMSoMSKD(k`{5kx$62G6Nc-wN@?dTv9A#aFNzMPMaE!tnY{531!ecx`#&q1~0YwptE{MP= zEW{EV#XUU4XSk+ky+I)Apgy`_G{#}BfhQBT<1C)z73}P}9|UqC2zAi_krL3E$u@Lf)t#;!nQnK|*1Nq-n)er*tpH!nT7K^YGdvFDB@D47t-#+kn%12o; z&;=2Y|EIJRE3gXYO{x9#uUpRPBXl#*aqVuzdHqX+ZDVZi*mEeSg;H1PrnF(hZ2Ls| z-d@Rm;+^a#KFNOK`~4F`k_GvF|0u~P{>gq4knATVlKmvm`bn!_^BR=Qm%NjWf<)@~ zk@Hr3w4E3A1;2$k(7Yd&+{DS{-djm7_v~mSyXYTs|8tnVIr^Af5|YckPqMl9NjCRB zimeV9l7`ub(*1oBeE9d{$$gSs6xe}D_B-Y%7=BZ$eUgm=yEe(p&Nta8$olg8Wcv~Y z+Q#3lSiZ?d!8h3`_$FHy*fB~j2?loDlS@K!bwPIbfBzl7WTW7hOcV@(Ti5_ar121^;BD;Gb+10+NkFzzOkg)Vtg<>^?n_2Xv3(dCx9FEVo=5pNSqn zz2@}UIT2Kh(~s-{bn)d^9)5Jj={Rqv_g`Ih5Rr+!fL`ncoS?T~DU`j2I&|(Evp3M3 ziJa&#cMa!sJ3ZuPJ^3<12Gg@=cP#ZY&Oj^l-Z`OBl>@BK^xntjD?mhM6OrRYq&v}= zjh;m091+PzMAj0K2}GoMW`nBaCnU4YAyMhE(IZ4DIHsVR3hCm+;506?7uK#a*C`Q-b2Pg{t6%%I%1ar3q0vj<1{Wo$;NR2_~Q?>LI(`S z2yD#5iiq}kSy2&#b?BR)eIBG^0T~g3umaSe$qX2A45x6hAS)hH7os|%Ac|oChM`(f zsxjtZDfUAC$IXCZe2xbt*!zO93_Dn;UY3R70UpD(96fp%%TvY68)zyjuxEze7=$%7 zNHI2GEB0U?a@XY6Zzzp2*wcs}Jr;MRGmX9xL;)qb5gE+r&do(pXb`*9*p6K|F@%ib z{b-_W7{ea(6!w&H0hbXrm7O638_6v?Y4qOlZVus}%gh!Keym?c0+C_`yL%XoiHQG; z6&D_B*ttSc_@E~0q9^)e9t=x(I)amUjF)g+%l-p`P!_Gw0i!ViJFy#2@f@z}IDmi( zsD!TQhS``46L#PtuHh{{BG-D#zrcF-s?Z*zFb-R>9gpw?X=AC3@J0Y8U+@l!a_K6Py!_pgUwK%lUr0rEkt8BVz3%Ju^Xpw8nLP2tgP+p&Ozx7gul_ukjAP94ZY$uM}Kphl#1UbO=ka8Y|Os@d*Cq zD5~74?Z3JGK#_%)ewqKh`@Br!YTRDr`*@>Grl4#$3U~A3aaA|j`@~{+%v5Q7GOCZ z;5qW=<`N+^MsvjFrJI5;`M3loKbb-vv_%&zLkuqC8d4hy(1k<^1fn_zmP7Eh2?@9_m^=&W79;UGT4`;tTneabR(^e)eZPiRzuJ}<7&x4MC}l}R+*;fW&fhONJ4 z>t|WJKZc+BGt!;;0z0}eqcIK@LpW59ar6?$V`&&gfGTur{zTpSL&R6+zs zFbzg=SbID=_u!B_N)M%%k5-W1ZAU_WyS)#8!)+LmK?rIacp8Vv*Z>nQ;wlpH8ScX= zdsIMG496I(!djfh1-!;PxQ$>9Ksi)KYji*qCSwCkXf=}ZZ_m?n#KV0QUqodDqZ@i+ z8+O4snu>-hV+cL^Vjvb_8Mb3L9^nPt#*$N1K~3~PAB;v6W{+k4pU=QS9Kjc;<46Q@ zqY{GA8Qm}xqp$+2aSG>fA5V}zioQ6C!v_^n1#Qs*@)PL`xPiO)5=Hr|Nx8RT#$+hd20&N>ixBFk%kQ;|_H4Bjq#* zLKVo*Ru7})49X2}@EPM~k|2D-7fjZ;3KJ8fdBq2OLHI0IHQd2Hyq!(OM*sQjgCWBL zGK0>DfZ+g7hw=Y7LhVS7CNmC}Bn_JwPa_5j{#q zNhZChFv5bwu{V)DK$bmN)Yc12E6g5Vl$DkwJ)jglYgsCkedjED_ybz_+}_T*yW{N6 zu(R{q8-36a0jNU*_LUG@ig|}V} z4jnI9fI{4(kK2IyJ~r_fag5(3Ba0BKO(?@zNJ6E0BM8A*fE1)bhg5CACgfue3JF3} zc!j=i`1si~v;yASU;0dP{Ok!jxWkx&D7c|}(pm!jNWFz!NNa4Hy>Z&mNvxIdMKkmi zqK2332b%%-Sqcf^*dlQ_l0~p$EMuJsIeV=Jzwa$I{2s6E(!U ztk?cZ)8qTzNpD_keKO@Gnxh&#)oi380*OeH$g0$2!LKsh??L*grLNQKJA342?8AjL5||PDo>OCsxnQ=p_5q- z(`js@IrR7PREJTtT(0svW8PS-OV?D{%VnNXsoI$N+#@S93RF%yNn2HCy38>~s_YDw z0##dvTpPQtsM@>P-lpz3|8dXc5DR#|SSxOcM)640hz5});zd2F`su5a2O^CkM%)yS zRcWSl5BPgmR%@nA?=>#QWrn+4&QLSb6B`;~#zuw4xFVdPvt7>Fro$69B`P+;%2_RU G*nR*o9Q* 1) { /* Check for special argument to invoke register test */ + if (sim_strcasecmp (argv[1], "RegisterSanityCheck") == 0) { + register_check = TRUE; + --argc; /* Remove special argument to avoid confusion later */ + for (i = 1; i < argc; i++) + argv[i] = argv[i+1]; + argv[i+1] = NULL; + } + } for (i = 1; i < argc; i++) { /* loop thru args */ if (argv[i] == NULL) /* paranoia */ continue; @@ -2632,10 +2643,25 @@ for (i = 1; i < argc; i++) { /* loop thru args */ lookswitch = FALSE; /* no more switches */ } } /* end for */ +if (*argv[0]) { /* sim name arg? */ + char *np; /* "path.ini" */ + + strlcpy (nbuf, argv[0], PATH_MAX + 2); /* copy sim name */ + if ((np = (char *)match_ext (nbuf, "EXE"))) /* remove .exe */ + *np = 0; + np = strrchr (nbuf, '/'); /* stript path and try again in cwd */ + if (np == NULL) + np = strrchr (nbuf, '\\'); /* windows path separator */ + if (np == NULL) + np = strrchr (nbuf, ']'); /* VMS path separator */ + if (np != NULL) + setenv ("SIM_BIN_NAME", np+1, 1); /* Publish simulator binary name */ + setenv ("SIM_BIN_PATH", argv[0], 1); + } + sim_quiet = sim_switches & SWMASK ('Q'); /* -q means quiet */ sim_on_inherit = sim_switches & SWMASK ('O'); /* -o means inherit on state */ - sim_init_sock (); /* init socket capabilities */ AIO_INIT; /* init Asynch I/O */ if (sim_vm_init != NULL) /* call once only */ @@ -2665,12 +2691,14 @@ sim_register_internal_device (&sim_runlimit_dev); if ((stat = sim_ttinit ()) != SCPE_OK) { fprintf (stderr, "Fatal terminal initialization error\n%s\n", sim_error_text (stat)); - read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin); + if (sim_ttisatty()) + read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin); return EXIT_FAILURE; } if ((sim_eval = (t_value *) calloc (sim_emax, sizeof (t_value))) == NULL) { fprintf (stderr, "Unable to allocate examine buffer\n"); - read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin); + if (sim_ttisatty()) + read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin); return EXIT_FAILURE; }; if (sim_dflt_dev == NULL) /* if no default */ @@ -2678,15 +2706,48 @@ if (sim_dflt_dev == NULL) /* if no default */ if ((stat = reset_all_p (0)) != SCPE_OK) { fprintf (stderr, "Fatal simulator initialization error\n%s\n", sim_error_text (stat)); + if (sim_ttisatty()) + read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin); + return EXIT_FAILURE; + } +if (register_check) { + /* This test is explicitly run after the above reset_all_p() so that any devices + which dynamically manipulate their register lists have already done that. */ + sim_printf (" Running internal register sanity checks on %s simulator.\n", sim_name); + if ((stat = sim_sanity_check_register_declarations ()) != SCPE_OK) { + sim_printf ("Simulator device register sanity check error\n"); + if (sim_ttisatty()) + read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin); + return EXIT_FAILURE; + } + sim_printf ("*** Good Registers in %s simulator.\n", sim_name); + if (argc < 2) /* No remaining command arguments? */ + return EXIT_SUCCESS; /* then we're done */ + } +if (sim_timer_init ()) { + fprintf (stderr, "Fatal timer initialization error\n"); read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin); return EXIT_FAILURE; } +/* Invoke power reset again in case some devices depend on timer + initialization having occurred */ +if ((stat = reset_all_p (0)) != SCPE_OK) { + fprintf (stderr, "Fatal simulator initialization error\n%s\n", + sim_error_text (stat)); + if (sim_ttisatty()) + read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin); + return EXIT_FAILURE; + } if ((stat = sim_brk_init ()) != SCPE_OK) { fprintf (stderr, "Fatal breakpoint table initialization error\n%s\n", sim_error_text (stat)); - read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin); + if (sim_ttisatty()) + read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin); return EXIT_FAILURE; } +/* always check for register definition problems */ +sim_sanity_check_register_declarations (); + signal (SIGINT, int_handler); if (!sim_quiet) { printf ("\n"); @@ -2697,21 +2758,6 @@ show_version (stdnul, NULL, NULL, 1, NULL); /* Quietly set SIM_OSTYP #if defined (HAVE_PCRE_H) setenv ("SIM_REGEX_TYPE", "PCRE", 1); /* Publish regex type */ #endif -if (*argv[0]) { /* sim name arg? */ - char *np; /* "path.ini" */ - - strlcpy (nbuf, argv[0], PATH_MAX + 2); /* copy sim name */ - if ((np = (char *)match_ext (nbuf, "EXE"))) /* remove .exe */ - *np = 0; - np = strrchr (nbuf, '/'); /* stript path and try again in cwd */ - if (np == NULL) - np = strrchr (nbuf, '\\'); /* windows path separator */ - if (np == NULL) - np = strrchr (nbuf, ']'); /* VMS path separator */ - if (np != NULL) - setenv ("SIM_BIN_NAME", np+1, 1); /* Publish simulator binary name */ - setenv ("SIM_BIN_PATH", argv[0], 1); - } sim_argv = argv; if (sim_switches & SWMASK ('T')) /* Command Line -T switch */ @@ -5051,7 +5097,7 @@ const char *cptr; if (NULL == sim_gotofile) return SCPE_UNK; /* only valid inside of do_cmd */ cptr = get_glyph (fcptr, gbuf, 0); if ('\0' == gbuf[0]) return SCPE_ARG; /* unspecified goto target */ -snprintf(cbuf, sizeof (cbuf), "%s %s", sim_do_filename[sim_do_depth], cptr); +snprintf (cbuf, sizeof (cbuf), "%s %s", sim_do_filename[sim_do_depth], cptr); sim_switches |= SWMASK ('O'); /* inherit ON state and actions */ return do_cmd_label (flag, cbuf, gbuf); } @@ -14971,6 +15017,186 @@ if (sim_rand_seed < 0) return (sim_rand_seed - 1); } + +typedef struct MFILE { + char *buf; + size_t pos; + size_t size; + } MFILE; + +static int Mprintf (MFILE *f, const char* fmt, ...) +{ + va_list arglist; + int len; + + while (f) { + size_t buf_space = (f->size - f->pos); + + va_start (arglist, fmt); +#if defined(NO_vsnprintf) + len = vsprintf (f->buf + f->pos, fmt, arglist); +#else /* !defined(NO_vsnprintf) */ + len = vsnprintf (f->buf + f->pos, buf_space, fmt, arglist); +#endif /* NO_vsnprintf */ + va_end (arglist); + + if ((len < 0) || (len >= (int)buf_space)) { + f->size *= 2; + buf_space = (f->size - f->pos); + if ((int)buf_space < len + 2) + f->size += len + 2; + f->buf = (char *)realloc (f->buf, f->size + 1); + if (f->buf == NULL) /* out of memory */ + return -1; + f->buf[f->size-1] = '\0'; + continue; + } + f->pos += len; + break; + } +return 0; +} + +static MFILE * +MOpen () +{ +return (MFILE *)calloc (1, sizeof (MFILE)); +} + +void +MFlush (MFILE *f) +{ +f->pos = 0; +} + +static int +FMwrite (FILE *fout, MFILE *fdata) +{ +int ret = fwrite (fdata->buf, 1, fdata->pos, fout); + +MFlush (fdata); +return ret; +} + +static void +MClose (MFILE *f) +{ +free (f->buf); +free (f); +} + +/* + * This sanity check walks through the all of simulator's device registers + * to verify that each contains a reasonable description of a method to + * access the devices simulator data and that description stays within the + * device state variables it is supposed to reference. + */ + +static t_stat sim_sanity_check_register_declarations (void) +{ +t_stat stat = SCPE_OK; +#if 0 /* Disabled for now */ +int i; +DEVICE *dptr; +MFILE *f = MOpen (); + +for (i = 0; (dptr = sim_devices[i]) != NULL; i++) { + REG *rptr; + + for (rptr = dptr->registers; (rptr != NULL) && (rptr->name != NULL); rptr++) { + uint32 bytes = 1; + uint32 rsz = SZ_R(rptr); + uint32 memsize = ((rptr->flags & REG_FIT) || (rptr->depth > 1)) ? rptr->depth * rsz : 4; + DEVICE *udptr = NULL; + t_bool Bad; + + while ((bytes << 3) < rptr->offset + rptr->width) + bytes <<= 1; + + if (rptr->depth > 1) + bytes = rptr->ele_size; + + if (rptr->flags & REG_UNIT) { + DEVICE **d; + + for (d = sim_devices; *d != NULL; d++) { + if (((UNIT *)rptr->loc >= (*d)->units) && + ((UNIT *)rptr->loc < (*d)->units + (*d)->numunits)) { + udptr = *d; + break; + } + } + } + if (((rptr->width + rptr->offset + CHAR_BIT - 1) / CHAR_BIT) >= sizeof(size_map) / sizeof(size_map[0])) { + Bad = TRUE; + rsz = 0; + } + else { + Bad = FALSE; + rsz = SZ_R(rptr); + } + + if (sim_switches & SWMASK ('R')) /* Debug output */ + sim_printf ("%5s:%-9.9s %s(rdx=%u, wd=%u, off=%u, dep=%u, strsz=%u, objsz=%u, elesz=%u, rsz=%u, %s %s%s%s membytes=%u)\n", dptr->name, rptr->name, rptr->macro, + rptr->radix, rptr->width, rptr->offset, rptr->depth, (uint32)rptr->str_size, (uint32)rptr->obj_size, (uint32)rptr->ele_size, rsz, rptr->desc ? rptr->desc : "", + (rptr->flags & REG_FIT) ? "REG_FIT" : "", (rptr->flags & REG_VMIO) ? " REG_VMIO" : "", (rptr->flags & REG_STRUCT) ? " REG_STRUCT" : "", + memsize); + + MFlush (f); + if (rptr->depth == 1) { + if (rptr->offset) + Mprintf (f, "%s %s:%s used the %s macro to describe a %u bit%s wide field at offset %u\n", sim_name, dptr->name, rptr->name, rptr->macro, rptr->width, (rptr->width == 1) ? "" : "s", rptr->offset); + else + Mprintf (f, "%s %s:%s used the %s macro to describe a %u bit wide field\n", sim_name, dptr->name, rptr->name, rptr->macro, rptr->width); + } + else + Mprintf (f, "%s %s:%s used the %s macro to describe a %u bit%s wide and %u elements deep array\n", sim_name, dptr->name, rptr->name, rptr->macro, rptr->width, (rptr->width == 1) ? "" : "s", rptr->depth); + if (rsz > sizeof (t_value)) { + Bad = TRUE; + Mprintf (f, "%u bits at offset %u is wider than the maximum allowed width of %u bits\n", rptr->width, rptr->offset, (uint32)(8 * sizeof(t_value))); + } + if ((rptr->obj_size != 0) && (rptr->ele_size != 0) && (rptr->depth != 0) && (rptr->macro != NULL)) { + if (rptr->flags & REG_UNIT) { + if (rptr->depth > udptr->numunits) { + Bad = TRUE; + Mprintf (f, "\tthe depth of the UNIT array exceeds the number of units on the %s device which is %u\n", dptr->name, udptr->numunits); + } + if (rptr->obj_size > sizeof (t_value)) { + Bad = TRUE; + Mprintf (f, "\t%u is larger than the size of the t_value type (%u)\n", (uint32)rptr->obj_size, (uint32)sizeof (t_value)); + } + } + else { + bytes *= rptr->depth; + if (!Bad) + if ((rsz * rptr->depth == rptr->obj_size) || + ((rptr->flags & REG_STRUCT) && (rsz <= rptr->obj_size)) || + ((rptr->depth == 1) && + ((rptr->obj_size == sizeof (t_value)) || (rsz < rptr->obj_size))) || + ((rptr->depth != 1) && (bytes == rptr->obj_size)) || + ((rptr->depth != 1) && (rptr->offset == 0) && (rptr->width == 8) && + ((rptr->depth == rptr->obj_size) || (rptr->depth == rptr->obj_size - 1))) || + ((rptr->depth != 1) && (rptr->offset == 0) && (rptr->obj_size == rptr->ele_size))) + continue; + Bad = TRUE; + Mprintf (f, "\ttherefore SAVE/RESTORE operations will affect %u byte%s of memory\n", bytes, (bytes != 1) ? "s" : ""); + Mprintf (f, "\twhile the variable lives in %u bytes of memory\n", (uint32)rptr->obj_size); + } + } + else + Mprintf (f, "\tthis register entry is not properly initialized\n"); + if (Bad) { + FMwrite (stdout, f); + stat = SCPE_IERR; + } + } + } +MClose (f); +#endif +return stat; +} + + /* * Compiled in unit tests for the various device oriented library * modules: sim_card, sim_disk, sim_tape, sim_ether, sim_tmxr, etc. @@ -14979,6 +15205,7 @@ return (sim_rand_seed - 1); static t_stat sim_library_unit_tests (void) { int i; +int bad_regs = 0; DEVICE *dptr; int32 saved_switches = sim_switches & ~SWMASK ('T'); t_stat stat = SCPE_OK; diff --git a/sim_defs.h b/sim_defs.h index 17b90ff6..e324dc9e 100644 --- a/sim_defs.h +++ b/sim_defs.h @@ -951,6 +951,13 @@ struct MEMFILE { _REGDATANF(#nm,loc,rdx,wd,0,dep,desc,NULL,0,0) #define BRDATADF(nm,loc,rdx,wd,dep,desc,flds) \ _REGDATANF(#nm,loc,rdx,wd,0,dep,desc,flds,0,0) +/* Range of memory whose data is successive scalar values accessed like an array Register */ +#define VBRDATA(nm,loc,rdx,wd,dep) \ + _REGDATANF(#nm,&(loc),rdx,wd,0,dep,NULL,NULL,0,0) +#define VBRDATAD(nm,loc,rdx,wd,dep,desc) \ + _REGDATANF(#nm,&(loc),rdx,wd,0,dep,desc,NULL,0,0) +#define VBRDATADF(nm,loc,rdx,wd,dep,desc,flds) \ + _REGDATANF(#nm,&(loc),rdx,wd,0,dep,desc,flds,0,0) /* Arrayed register whose data is part of the UNIT structure */ #define URDATA(nm,loc,rdx,wd,off,dep,fl) \ _REGDATANF(#nm,&(loc),rdx,wd,off,dep,NULL,NULL,0,0),((fl) | REG_UNIT) @@ -965,6 +972,9 @@ struct MEMFILE { _REGDATANF(#nm,&(loc),rdx,wd,off,dep,desc,NULL,0,siz),((fl) | REG_STRUCT) #define STRDATADF(nm,loc,rdx,wd,off,dep,siz,fl,desc,flds) \ _REGDATANF(#nm,&(loc),rdx,wd,off,dep,desc,flds,0,siz),((fl) | REG_STRUCT) +/* Hidden Blob of Data - Only used for SAVE/RESTORE */ +#define SAVEDATA(nm,loc) \ + _REGDATANF(#nm,&(loc),0,8,0,sizeof(loc),NULL,NULL,0,sizeof(loc)),(REG_HRO) #define BIT(nm) {#nm, 0xffffffff, 1, NULL, NULL} /* Single Bit definition */ #define BITNC {"", 0xffffffff, 1, NULL, NULL} /* Don't care Bit definition */ #define BITF(nm,sz) {#nm, 0xffffffff, sz, NULL, NULL} /* Bit Field definition */ @@ -1028,6 +1038,13 @@ struct MEMFILE { _REGDATANF("nm",loc,rdx,wd,0,dep,desc,NULL,0,0) #define BRDATADF(nm,loc,rdx,wd,dep,desc,flds) \ _REGDATANF("nm",loc,rdx,wd,0,dep,desc,flds,0,0) +/* Range of memory whose data is successive scalar values accessed like an array Register */ +#define VBRDATA(nm,loc,rdx,wd,dep) \ + _REGDATANF("nm",&(loc),rdx,wd,0,dep,NULL,NULL,0,0) +#define VBRDATAD(nm,loc,rdx,wd,dep,desc) \ + _REGDATANF("nm",&(loc),rdx,wd,0,dep,desc,NULL,0,0) +#define VBRDATADF(nm,loc,rdx,wd,dep,desc,flds) \ + _REGDATANF("nm",&(loc),rdx,wd,0,dep,desc,flds,0,0) /* Arrayed register whose data is part of the UNIT structure */ #define URDATA(nm,loc,rdx,wd,off,dep,fl) \ _REGDATANF("nm",&(loc),rdx,wd,off,dep,NULL,NULL,0,0),((fl) | REG_UNIT) @@ -1042,6 +1059,9 @@ struct MEMFILE { _REGDATANF("nm",&(loc),rdx,wd,off,dep,desc,NULL,0,siz),((fl) | REG_STRUCT) #define STRDATADF(nm,loc,rdx,wd,off,dep,siz,fl,desc,flds) \ _REGDATANF("nm",&(loc),rdx,wd,off,dep,desc,flds,0,siz),((fl) | REG_STRUCT) +/* Hidden Blob of Data - Only used for SAVE/RESTORE */ +#define SAVEDATA(nm,loc) \ + _REGDATANF("nm",&(loc),0,8,0,sizeof(loc),NULL,NULL,0,sizeof(loc)),(REG_HRO) #define BIT(nm) {"nm", 0xffffffff, 1, NULL, NULL} /* Single Bit definition */ #define BITNC {"", 0xffffffff, 1, NULL, NULL} /* Don't care Bit definition */ #define BITF(nm,sz) {"nm", 0xffffffff, sz, NULL, NULL} /* Bit Field definition */