From 2c2f2cf84867ce149f0b95bfa96ac3b77d3a7435 Mon Sep 17 00:00:00 2001 From: cdez Date: Sun, 21 Apr 2024 16:12:29 -0700 Subject: [PATCH] isn't working on my VM for some reason. will try on other devices. --- Sim03/sim03 | Bin 74160 -> 73936 bytes Sim04/logfile_1.lgf | 1 + Sim04/sim04 | Bin 74176 -> 75008 bytes Sim04/simulator.c | 264 ++++++++++++++++++-------- Sim04/simulator.h | 444 ++++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 616 insertions(+), 93 deletions(-) mode change 100644 => 100755 Sim03/sim03 mode change 100644 => 100755 Sim04/sim04 diff --git a/Sim03/sim03 b/Sim03/sim03 old mode 100644 new mode 100755 index 51bd24e5035d84c4f8ede1517f19ca8fe46ce461..6ac67219730b8ad1eefe0c45b586ef005f229e35 GIT binary patch literal 73936 zcmeFa3wTu3)jxbLbLNuUBqSl>KH(bfpol?0f@EYsf>DS@1tE|GqJhw4f?x@WgecQE znzW$UqK#H9wqDSRMMMpX1g)=))(W-M##U`&u%&7(wbcB7Ywdl`nF&FC-}n3e&-Z)} z!;`c3+H38#*IIk+wJ&GSP~%^4sivxm`O%e&6@n6zL`k+pG^W`!*-DlYuVgDDl;MgK zcnAJWx}NDV4M=><)Ga_oM@se5Dbq_jP!ua>YPL=()jQkA=Mfk)RT2eE^$f~NxM#W} zPtcjEiMQHYC-6#-^wGYe+)N|uk!{+-0^fFTbh=yGrA?-0Jp!p-yR6qP>shHZM7vB) zdy-A)FH739XX*ovK0babO3!))vR=bZym!@f)(Hj-NVZLS^}c z^H>Cui`pQcn!7Mx(Q1_zDl_X-J_UbdR>B|u+ZCrTpVF9f^>32ydg%Qpv)BG^!{;Us zszWsNA$rp#2&Q}={1J`N{}up=T!tbgbI|Pr-zWbpRqGdOfm)gKe6a|Zw%3x7>RZv+|SXNfPQdzbPp1pEeWw5X!xNJ=! z$d@fEtt?+TZQ8Pu%9Vv{O8~FjP`Iq5bZuc->CLFVuA+2putX_YSyoOS-1$?i?0FL|P?pVGoV%>3xT1JfX=SjuVsY-AvhuaXiwjqj z6{D$DYs%M3VU`KfUI}3f4P!$^jMF0isa#4WDzIjHC#cQwpH^BLPm%E+S@v|(T^L5X z@)HSH^)JPYp(&38rjHq?&Hgwk=fPt#4x8nBWcj*gu4ctk6K?sjD5o(?W7zy0i71yL zmr-pI<*_C)(qj?jrcQ)zk0?)$pf~-A;!>2~H47q&2Q+rfkGomqsGQ=F`AKXRIV$IQ zQzFtM%0)a92wy}w)iFPr%_2u-rtPR?QZqdjh05iW&2UyTCtMyQvi!`BD5qFqege%R zM|{xH)+eu7WT`yCDpiz%h;na4`SOTz*|ibabJ=qiIA?)#7C2{ta~AmjmjwcKC)|Ms z;}xu#0`)CHt-CEycgX#+rDXR7uL0FP;&nW|L$Z-0cs1cW+q>}@@e;wbr08s8ct63k zmlX&Ucb$ME+ErlmyZ za)!4MOiPH)Jce&3n3fKm*$h_@OiQZHNetgWFfAcEeGI>QhoY1;0_M-;Pv(W*ygm^6 zQ=smHlX;8%lUpXg8VJvP1IX^wJ3;z+$pr6^txQYy0B$lE2ExV|N~WC(roxy9N^L>L_8eWpGMM94xL z5Q0a;RF*;Q8XO4MGY3=&8$lt!J`%Cxr~m2huC4A?yj#Nn!K4o}sftB5S@64w`Go^+ zTaFId_^eEB{6ec9Hx6uT$J~+3PVzWE(2(CD^8x?+S1E{qtc_2m*OZtd86y1SbZufEJ36{JysxjvJ8eyao@j59|zt zQ(hs>`NYT!zB140p>{Xb^#Vkuv&ndCAe0A zcS&#=K+`|qQK72OL-{AUeamSQUvxvBjvZ7n1XrLg30EbO@2t-j-WO=CHMfw2mIBwE zNPIB>O**cXRU7gX2^~so$REy`yp)D~pU44|pHA68D9_!HkBA4tJjbWrME@kpf9g%j z_BG^Zit_XZe}H>dBQd`G7m4?2O&*jz&8rh9@6Ukr`6uDZ4FA@sqUb= z!GC(X|M;c{&oDMx?8s!PrLkK{2p-K5hNbDQL;YH^P&KJyDsfS7O0>07fToZ{`bB9W zQKSZo`oX3bdWag3A&6oDdI4_ELQ=ltpV7ezuF!+}>ImxnXQ8gEKBWW)LpV4cI~cKk zm*vfepKKwYV=Ri-e;p6e+2}xGumF^TXZ9q5XV`Ey!OvR_T#{{aPmkul2-D;dQXuqv zfT%-zvpLz3g{0O0Hc*JAZIqOF|JDNE_3v)=zb=ZYBE+s2RmkvW_879nfengaMZHqj zf;i%D;k@A>g+u;*0-_}cpgo<}V=aXuRIlC16!itn#oy6TyA=f?|ARocAYiw^>@ujO z&!B)EoC?f7V18y}zM9UMfz(Pv{_7a7{?|kGw3KSCUyP@apZVQv*E+(rsxIJK5zX!a z^Q&#L`vsZ1!T+G@f4j>mQYplFHr+-+Hy#)g+-GB!2~2WSL(B%V66^BMt1Kt$x|<=+Y4NR6RLPL+vgY)B6NiAbQE7ouUW~gztPP=OnTyo_qNmjn)k0vN0X z=_sY9K)OMc`cRq~XvnP%G%Vc)DvX|jEQIYwgzW4N4+Z(ULwSJ)9t8o4jgj8mdCUJT zNopu6vLyNKfzTz{=w0ZYoejeyr2!|031z?C5DU~*cPPOb(oY^-Z28w)S;9}Mu{r~m z{N#H!_GyV-##m{MrE-46S}au6fi*y}P?Jo(I(qQYH|tZ>L1m9|?P5m(dR4l&&;pE*8jWL{0!E$3I2rjdkY?_VHUz z&{BomJk%;V@6V8$hTi-v@K8r41^ZhLB?<}HaBx(Xapt#V@!=N{Eb>oU^H7wnUBNy* ztZ!8H3pAvr-2(X<>REN6^B`D6>S9gr%Q0CV2~`~m<+p@#4=g~8Ul7XO4SVeIK2u8@ z({28b32La_4j|;mB>y=wm~+}ia$F=QC^_u!q5yY9dPvtYxt;5}7^N^QP5URUWsO{( z^gjzu#p>68Lap&5&W3Zy9{(YV%qGosGB4J0Pf~aL+qy0{=0n)E)N}Q)5xx>7 z4vls)skb1HO-y&YDFQ8yU|(9{MVP``91$woN&+R#uv?m8e{J>07$hCo(B{(*+77FGf+p8pR72Y*+C{{XtH%K-;agk<-iercSt*yT6ncYt z#`ziBN!X?q1W~p*y-@Vu48d)$zkSz+0-J@)CUWM_QL^o<&pCQbJ5y=$>MlH^@VKw ztB+Z}FD3Xl0X9qGc7R>p#;*9ru9(IyS7Vo>u}f`)T`*vU@~103hzVGT7LphF+w@Z!C9;pumS?Y`vk8bLINA+l_eGhFQOHt zW6uTHyac?PF7z2C!H+rGvGP12yE&1E1wgYnoCfDd*_}h6Az3^xUcONa& ztX?=mWj%VK=KTMbs52u)UCnKLgTs9Mxz!7_0Y4@NLl${gXzwIWc4TrA_ECcE2PfIs zCqw%_2kdGk^^{1k8FY1JIQ*|DIZUI@E`G{_AdM6e6c+}hz5TMBA7 z+2&sO{}A^{;v|~5zd6^^N@wogdc!DqO4PtM|F02Xe_eM{ zrI!+3T78^NujWbrBfTEyu9JG*^5M7Ci?>O&Y-V<^owfrkA0s+p#n*MhXA}QN!U|82 z!oK~%w-okD-obqPPJrOt30^D`&g=v}usB;M4EUevHJW``>UH|h-%_ueX{SO_qM^6* zf_6rIivR*T8fE?*(wbw(y_p<4Xpcp)Bj3iC%-e^4AkK;jVpT)W?f1$()%|tkH7gRvcNZt!9{<=8m8>5t*t(5 zYhC{6)>eL-)_7ag@a>(=A)W03>P(DyEUwH07@9;j&?pK$zm0-ZXm2f&R{sa6g01xH zA~{0tD%P3>G)wVeY&})5&sDrw0OhhatsU|2gD70ThdCa8k(hK8A*@D}5yy@^l!=)= zykim$*vvpU)3nM_(FeK254$cbq=*c57Q)&=@GWdAgn;k;g$3LPdi;e+9gCiKJhNy? zAP$g00L}d!t@V$BjKu7^pn>x^c6{|y@0cTS!Va7|X8S(%799N4JFX?fXe!2jIGZZh z`9DzkFsSMficOYKm3V?+4aD6j_w7}br@MSF{u4pF#tyZXoT|^lc31(l`ydlgg zQv+h-HUiUA$bTGF(PS1DsN5a7M{rurWfb7o!9_vWG9BHckH2b*Bolq9!j_VkyQP< zZj7bP6&-Vg>l-a|6_1WE*HGq>+X5=+%}SF3q}*TVP^woEJHVlL5zp@-;-BC9CJ|TD z-Uh9}COobhSW>GypJE1I-<`Jau-|y=HMt%wMJ;EGs(nHT5AzO#`ws69$ZA3e`EvoX) z(F_Uxb~J$yD31}35!5B#2k~GD;;l)$SWU}7AcDXjqWJ)#rW$Iup+1eV+n%6-i%@2r z%F&B|^Hi>eEI_An?8w;;EU$yo+gN4Oz1vuPx!m-OvO0_3Y}h04P_{IvoXi}@Nl$Z+ zktehkrm$n_t-KLA!%1&A!$zIIgicb>x>K5W>yIK~gp&pdBZB53f+p=?FX&YVKkk&6 zLzLt~l`v7;x=gZlp-s6jd*ri>Z2#mL*50akU@A9Q=SPC=uceE>>@ zzLn+g91$(GE$#eS(U$)n-r0Vm<>REZ(L&arX?c=SPD_|DcowiU>slo>K$iqBxAKnQ zoXA>j4gTYycQ8__u+IPo`JPR%0_%XU#5>{O&0cy|d6)}Kc#JYp(gmGlzToZAUSC(; zu2x;tH94YnocxP!U>;`^UW}n5sILU8A=B?M2`@bk*SVKnCoJC@NXJhcF3nH3O~UN^ zrr*Gq_)O-@nN~lr*J!`{7X7dldlalo;WFYd3I}oak_j8QM1GMUsyYdAPhr9N8vOCa zW(?4d%41+JZit+0NQBC`>4E1-T)uG-B;IB73V7yV_BEgyw~BFcDqwIg zA&$z!pYI$HIT2a!YJ@%bs=}zq+7zI<8bn9_op)dy+^?dhc(K-lLD<+n1DrwmI#Gs= zA4%|efSq%x)v$4&C=-jlLqrEjFudvdTSFvnx5NpP6S^uA9g0MUQ&%vK4XX|0t;sOf zMD_?(pA%VqKB{-6p!9;s(kUiW*-=z&U?f4ZB#`GUg!e?^Kl`mzsFu2omHHen>0uM0 z@NXm@`!VWE)60J^X;7qeJV7*JLzZ>a+EuvY%-2)i`o|Gp8_hF4+?1hfaiM&=@Li2{JvuuAE`J1Fln$~L@&I*yfyBtdB#?%@H(OWaMbAhllKwt-o% zw?s->{qIy@ie-n8ukQ}~KU3i&9jF5z6UQp81Q3)(&J<2{vbNk;r}_gC&VL8U03n61 z#*@nQrkmnO6*|(adEz1xg=@Zmnrzd~H!0|ccZk{0-~Iw<*a_bph`E7IMXCk`!hH7w zZNFl3co*M>!|joYY#=!8sJGFo)zq^#;UcT45;P?O#e5>>fXdep+oe=!MB4rv5(yz2`8+;L+aa#pXv_ws zmoSBCpK-R(_dz>hpC=&&`d!3+VZ6`jq679mve=Y91j@5Wznn$vReG;2eeiDR;P%$P z4;`TRbpPkx`dZc}s`)C}yu8;H*?AL)8hWJ+Fgq_JV0GSxX@unNAC%5VNL#mq9&BiC zu={R}O?Nlwx+-8Twr9>;wmlV`GGIpUVb4$Br0w%*XB0ob&2KLFv01y8+U+g2@uPsp z7{H?Bv=XGLgZpl~Wp5$J0kmTFU@hmxNa1S;i8#*tOoZ0iSI@p`cK+5dAEMg`buBPGUe{xNZZh7@z`W2)v!5e+3AN0A)`Gr0<7RnSaoGPW z*zYxaKyzGp0TBbuw|4vo=EXhg%V?J@77Q@s9=W9^uMYXKeHO+PQ#O#;!5;0nqc1ox zEiT%*q;mx`x>5tJOinWIqqy0*1wE^5qXCz#Emmr7whj=Vw1bt1T$-9qm!!l{?o z0$j-gRNPk;l8J&OW*-d3(R5O2LG=5mW{Y~@GG?;f0twy;ssjgyffOr)n>l+>zGgbX67fLp((pi z?l!!Xl8!Oz>zE%$&2NzW&NG;|O|h82)`!iqwpX*%d?WK-s|9*gdo9YEG)!u%f2CA8 zYpY+QOXK8%xHOL835|~j!o|m~o4sWA(%IL~US{3po`l7_xzypWaUjNu(J8O~cVTBA zv9h7X57s*~e49J0)s9&=my!vcFu++sXst&>25by6Si3vbnZJV||tC_;(E z8O_8%z@E&!FSNk*sS^;OQhH*s3b`9`y;}|o;?}AllwhB7TrQ(+wdB0`-&G{4O}@>2 z#(Ga)g%-;~d(CGr6UkEJdKLeEuos;WIx3SGOwpwDpBv+<2U^q2wW0y%R zd5gr-J4Y$=Y>B0FL5W>qV~0s>vyEL~V-1PjVq>S;*uNx@HG-=p*I_p1zXWEX#5^&{ zlI9lzGeu%f+n9Ru!_MA?;#FCCx9W&2U~5|v##=h8*8>=4TEmIj>Pxbn*Jd90EKh0SbLO4Hg4MySFQVS#AI9 zX)zKuOf;}c$5C0mfzML0>uZ4!Xk{;*g@)?lBj ztvF3q@QJr*t4^y6W!?*O%GZ{ZuBxh-_hMnNw0y0vq;x@OZzISTgr46?mG_ku`>NKJ zl@|u~7x^lyR<10r420w>upPUZ0!5W2Rb^D?;r+Px=^#yz52yMtcH4)N3Nj5 z`EQ{_2+BJ-A8BiC_7_2rbzlHNHV_{Yq>!86U+F8Zs9^uEujM9oY@;N+gXp8%y&pPb z^kJ=dJ(i-8`%7$)A#rQR({bkhGU9NcdORUns^_s=k31ZRIb^pHPTgb^PPLl)3@hXp zGtm(pi+n&~EHiNG0^Tl{t%3 z4b<+$$|)fC$pDj}b;$pAUG>|#ck6sCzL9g_>U?+yzbv3;!trs;m)@x|%MKS>?WzW) z5lqK3KG+9OXD|-WI65YN+g&v?LK$#)V;tGb=J3i(&_Swe9`&*{>!2@g+K0tWKhga5 z9+kIIjhumxYVz<6T4_w)MA30aXB(kSJz6__uw#hUfyY9P z+sL=};L%{Jgu>gY@JA7q!l_T;x{>s#8?mazN@P28*w)wxx~}g;R;T#WwJfrPB2HIs zWC_KXuIUj%-9_6nDO58d>1#rC_VgeC(DA7lq7rt%w?lwNy7}Irn^pfZ#?rZ;RTZ-uI_$)Be~0(>kLe^UVpJfs@tCAv zw>#s&?pd4LXq?JmOlFxPTpA(54N)RIYFDBkMq=r^uA+MOtk9Q0>;A(T-&hUc#BAFZ z>LoLP(GeQI4QQwF`mYypV*&P1@Kp?ozEOJ=AMH`FipMY{gW;B3YN;(!A)FYCUzc3w zOM-6!L=CIQf_< zdYYE4M{SzjCJmZbI{EwWVrl!lO|#Xcp(C`;e+cP_&to>ta+3z`p>)1!)BM<`p(~5f zKyLXTvuS={)1;d;9^w6(k)AZe>?f~QP^ zI3gG+39hpVnoNRtA~5(A$y(}~u0SS}Jw3s$dX=mSS0GzRf<89E1vUX0G_oU^GuMDS zJ_P}T zdvE(3?hqAU8!{n_{3c2b@*H33n5)D)(cgYk3PPBshW=ysnMVr4%4R=*>i3ijjRIQW?SE6%Cln-oG;<&Nk0*U#f zjrkO85jN>7N>pdBjX5ST>CCfFV^?C&Tl{olVR2bsFE(;$Inv z@?M;#;1!kha!}K&D@es>?UVLfi{nLj*PCfdEf>FC7tvR_xJ{~vq2PT1FVj(U1RNm7 z5iV*O{Zc5ugKQr(z_@DxO`JVzih~}>jWj@2h<2Z8phUQ4=w)ULLudrO6goBHhZMyslxEesox6nI_`xUBsX!64CanRy8^J&0j{SJ0ao)8Z#~R9k>j> zn<(4vT8^rC3nlxnE2GZ;d9?BER$!9TT{F?e)BPuFhErEt@y7d1B6liT6BWpsSuX{D zVSNYxJ5(Rh*(;ZB&t^Pov1?=e|oBvo_jhhLS_XU4L*s2*~aZu9J6Sv{4FT(Mt zcOx2{9>ISk4hlBc_-d<<%T{Xe3oZWR;-t^xeZhZhn*Vgwk9n~mwHB)bi~wxODC8(z zZZZ(H2xhZt5W=OR)Qh5L--FGqlQrtgQ*`}2zhfI-vb~W1Ilk1~0qsxC3%xo!)b=d8 zR@qOF7wAFbFpOQ2W%NXem(THi~M1r~8l8Y{K^`@lLQh2#>+BpNJ32FMEv-@1ftjE{w8+H3)i% z57Dsz)zIE%T(A={Vc;{p#{}RxbghDh2vIUbppqrs3e@D?Dcx%1?HO-qvPrs&t#}|u z29AIm@(~V13=0oTf??)B{cZXg(F4BJvo@j$9P>oY=G~&9){f%65ZewG=DBP3W-rcN zudVUG&2W6`>vB-W@{Q%_A!4yxL|wnUJcY9cI#6U^SOUhNXc6BgKZ5&1^7Vb!cLHJm z9*b^@pxYy&{61`H5&FksXj12%QZ~lk;y;yriB}OT40hSlw|w-?^u6(X$wtaxDyL&V*7^Q7oeZ7K@|C5({0gFAum*Y0RFj0zB;4!4&a8` zICwMX?xbHeKu!t9;;9D9I-f%Ugm1Tmzv*fEv8Z4Uek_U%8Zy=*i(E&@SdE;;xz)G^ zAbnbmMKaeApNm|BF$YgfNPBqmIROE@la7kL&lrP&pp7U^-e|SWYE?z6XrwJ3UcUZi8u3I z{Jn|4BYXnaaTLuHMGN}+6n|;ZQmgZ4z(LX=n31GSLQ>lauKoqtXED%Zm6nikJ+jCh z2^j^*H5gaoX$w3>KvLlI1SADc5zr?PxP!z&Bsz=0BO?Xw@>tR~(u(mEtHPRDkt&bY zq_kbnZNnq~2p&tJZS_8?fTAUgq#xHw^h25@exmT7B#<8Q8G{w&Q}6Y-{GFH!BDw{h zr zAbukOks6acPH7SAS5T;4c`#7gvZ|z{Byh097kcU7ms;q^!Ba!9>}bPbt=guxj6N88 zErf3^PqOA$3NxYCwqb%r{kA~qTcW-gYMLBsxX_My8w;13owOB@Q!`aPtV|NP&yCF= zMPc^S7Mx~0s(HfWz4K+j4Y>$q{|hOJTU0BD6(5zE3o)4Cf7gHvpuL;ngj5D*=ph8= zTscYMSFo^SI)x(^b1f+Y`8NM&*33gi*31JyT%L+Vzl8An8QrJC48Dfe4ER-~Q=5L? zh@}_I$Un&t_3MKuJohrihgJ=f5)qH?Kk#!9}wifIvioa7;T2Wji+cTwOeG1pD!++p~|Eo(WDqgS9f9_RLPWQ=_mFub${vW;Q zzxY~HyhbTrTclKOtmIlz{kgiZ(ue;54F7MJFIdj)QwzRPBPvHth*5456~_O!Kg#S9 z{C8eHG+kb?(N~Ham!YCL8C=8+MUz!#LlFqVXtPiZmv=rc?s9 zCrP+ser0iys5k;?WX-cx^_3KsmQ__0OFZ9$tCZLADx(WcN};zgBW*4rCJ>q9LMwCEN(JqD& zX^ZyJU+apc*Ky~^DBnnj?xzuV7CLgV;>w^eQy6r#7@WP)lV-(5Qj9aJ3Ck)m)XwFL zE;3~&n?V8$dtp|aU{Ud^HN|U#VhCMYSXCCZ6ppN9ho75D%gQ4BwGdY>FgIpiV-;?5-Pn0hZyDZbt}t@iZAjh6W5g%k^3qWSFWKQD5UIpq7r4#7uoW4Bpgfs`TVSGqyP~kH zaP3Oq*`a+j-H~Nrt122$l?b_()TSDswiGGn&Y>xT{`W_k8BkrZ=M$PhXx@+`+L}v> zF+)|XEeX_}?1&W&W` zp1j~+O0f=Z=PNJqRTQpWWsNg9XtX5j5O>!F6&^I-tc~eErk*q)c%(+l2YD{Wx4jqP zuL6JH$KOx!_a^@SjK6>2&xLQL5655S4JG5(DwP$%lJV>CU!0ayBB`jrLptEZJS?Az z74C<;!rW3= zLo?S@7Oxzw*d7#FO8&99+;$TdZw0>AqLfhgvoaX`@LY4$!Y;QS?d~qXFM~XeH1`;O zhzx%}$KPxCJC47<;}2x=Gd$bOP4JmHd=YW$gxLZ*IZGX&PpAK@IU5D-KLBs!Tejm@ z>5#S|%|!a_j_&TANLSpAi@->?BRz(6(LLSWr;t94G+kGeSCM8Rb^H)~kUooa1JbEK zLVcu5k?upf73ndg?;|~h)VmAy9f~p&X%^C3kQN~QBhn2>hu`1by$k7Fqz91B_z84H zy7-aq?$b!${aJVSK->yl{%Cji45SY|)!n@u>FvM7e?^7#*mK?8yODMr=rs8HNWcao`Uog(gLI-Ux(aCPa@rk^x-$4H_~bF*W*Zki#;m;cedvue@F(cav$Xg>ugN#mo3B*V4TNT2VGy~$mx%<4aV%=yEa z4b{)VUl#a6HS0rlm*B4-eDV=oL{VlZB;KmciFfJ`st}2JZ$j|{@KJni(#EeLtY~`| z(x-vvpGdaq@3-n70DjS3-Q9&qE&kdPW-t&%$MLrv_|!;zp3VO>%0s}@SN5&?>uvl% z$o(Mjdn57M9*h4B;HP0MRY&1BSokHt-v#`rNc;+$|0dw?{Tlo(Y9IKek@d9#i~j-O z-v^$qL|F2d+We0L|F^Hfp9cOvz*GNO^=s_<0}&fCc6N7PABoqlVFDk@W&pnoct6Il zRXsby<#^s=?-PPSaERx6db{iC@>VT))&lV5;q}9jGz!%(y_=53j=w z_`CK*Sxef(F{%D|sOhe-ac12>@%&2Z4n#QyOwJ@tH7=t(pI z&?tyo3wqMbvTacYn#^aqyAz{ijkRRG9r*NLc6ZMPD@)f+wyhooej4!gQT1!B`mY0j z-#)~!$okqMt1nIf{|@k*ky`xqjXDuzq9_isPdU)torKtG;q&g)?{I{T+nseT{j{wM z#rb{*ySslM)z&*!TNMA_2L5MJ_=hY!%?sBfUXP5#7c!drbtmvez~h${Y+1fzRsiIU+-ONLFre}pe({s5_E@5{*EdYu6-BttWB`Iv`xMYVCa)kX{OZvtN) z)y55$PqYK?!~At^RQ-Ibz5>6$7Wf5G__>Vtq09&Tt-ue*II?8ahiFWIB9bwOXxe&@ zlRn^!fFFS0j(Grii-*5X*LDgn#A6$1?g33{B#l;N$+;W&KLLMt6#n}b{s{2byw%

K{40@ot%V85hOYyE<8QmWJyCt- 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∓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 Eznhmdvj6}9 diff --git a/Sim04/logfile_1.lgf b/Sim04/logfile_1.lgf index e69de29..c83aaef 100644 --- a/Sim04/logfile_1.lgf +++ b/Sim04/logfile_1.lgf @@ -0,0 +1 @@ +0.000000, OS: Simulator start diff --git a/Sim04/sim04 b/Sim04/sim04 old mode 100644 new mode 100755 index f6221d95a60a779f2f839fe1989b279112a47725..5158a60021c474423ec65882057d57b7ca83819a GIT binary patch literal 75008 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 RQT{V57`UEtWpF)O{|=MYwQv9c literal 74176 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 diff --git a/Sim04/simulator.c b/Sim04/simulator.c index 4867aca..5bb97b1 100644 --- a/Sim04/simulator.c +++ b/Sim04/simulator.c @@ -17,6 +17,32 @@ bool accessMemory(ProcessControlBlock *singlePCB, int offset, int size) return true; } +/* +Name: addLog +Process: allocates the memory for the log, ... +Function Input/Parameters: source log (logFile) +Function Output/Parameters: none +Function Output/Returned: filled PCB (logFile *) +Device Input/Device: none +Device Output/Device: none +Dependencies: malloc, sizeof, ??? +*/ +logFile *addLog(const logFile source) +{ + // declare a pointer to working node + logFile *workingNode; + // make some space that the pointer is pointing to + workingNode = malloc(sizeof(logFile)); + // make some space for the string data + // workingNode->stringData = malloc(sizeof(source.stringData)); + // get each value from the source, and set their values + copyString(workingNode->stringData, source.stringData); + // make sure to set the next pointer to NULL! + workingNode->nextPtr = NULL; + // return workingNode + return workingNode; +} + /* Name: addProcess Process: allocates the memory for the pcb, grabs the data from the created PCB, @@ -77,6 +103,27 @@ bool allocMemory(ProcessControlBlock *singlePCB, int offset, int size, int array return true; } +/* +Name: createFileLogList +Process: initializes the logging file struct +Function Input/Parameters: none +Function Output/Parameters: none +Function Output/Returned: head pointer to the logfile struct +Device Input/Device: none +Device Output/Device: none +Dependencies: malloc, sizeof, ??? +*/ +logFileLL *createFileLogList() +{ + // allocate and create the logFileLL using malloc and size of + logFileLL *headBlock; + headBlock = malloc(sizeof(logFileLL)); + // set the head pointer to NULL + headBlock->headPtr = NULL; + // return headBlock + return headBlock; +} + /* Name: createProcessList Process: reads through the opcode struct to fill out the linked list of PCBs @@ -122,6 +169,26 @@ bool deallocMemory(ProcessControlBlock *singlePCB, int arraySize) return true; } +/* +Name: destroyFileLogList +Process: deallocates memory used for the linked list struct +Function Input/Parameters: head pointer to linked list (logFileLL *) +Function Output/Parameters: none +Function Output/Returned: NULL +Device Input/Device: none +Device Output/Device: none +Dependencies: free, destroyFileLogHelper, ??? +*/ +logFileLL *destroyFileLogList(logFileLL *linkedListPtr) +{ + // call the first destroyFileLogHelper + destroyFileLogHelper(linkedListPtr->headPtr); + // free the rest of the struct + free(linkedListPtr); + // return null + return NULL; +} + /* Name: destroyProcessList Process: deallocates memory used for the linked list struct @@ -142,6 +209,30 @@ ProcessControlBlockLL *destroyProcessList(ProcessControlBlockLL *linkedListPtr) return NULL; } +/* +Name: destroyFileLogHelper +Process: recursively clears the logfile linked list struct, freeing the struct +Function Input/Parameters: head pointer to logfile list (logFile *) +Function Output/Parameters: none +Function Output/Returned: NULL +Device Input/Device: none +Device Output/Device: none +Dependencies: free, destroyFileLogHelper(recursively), ??? +*/ +logFile *destroyFileLogHelper(logFile *nodePtr) +{ + // check to see if the pointer is NOT null + if (nodePtr != NULL) + { + // if not null, move to the next pointer (recurse) + nodePtr->nextPtr = destroyFileLogHelper(nodePtr->nextPtr); + } + // free the 'parent' node + free(nodePtr); + // return null + return NULL; +} + /* Name: destroyProcessListHelper Process: recursively clears the PCB linked list struct, freeing the struct @@ -384,48 +475,65 @@ Device Input/Device: none Device Output/Device: none Dependencies: fprintf, ??? */ -void logOutput(ConfigDataType *configPtr, char *logStr, bool isEnd) +logFileLL *logOutput(ConfigDataType *configPtr, char *logStr, bool isEnd, logFileLL *logPtr) { - if(configPtr->logToCode == LOGTO_BOTH_CODE) + logFile toLog; + logFile *logStrPtr; + logFile *wkgLogPtr; + logFile *prevWkgLogPtr; + wkgLogPtr = logPtr->headPtr; + // close the file, if at the end. + if (isEnd) { - // + if (configPtr->logToCode == LOGTO_FILE_CODE) + { + // + printf("\nSimulator has output to the file '%s'.\n", configPtr->logToFileName); + } FILE *fileWritePtr; - fileWritePtr = fopen(configPtr->logToFileName, "w+"); + fileWritePtr = fopen(configPtr->logToFileName, "w"); if (fileWritePtr != NULL) { - fprintf(fileWritePtr, "%s", logStr); - fprintf(stdout, "%s", logStr); + while (wkgLogPtr != NULL) + { + fprintf(fileWritePtr, "%s", wkgLogPtr->stringData); + wkgLogPtr = wkgLogPtr->nextPtr; + } } - // no return, void - // close the file, if at the end. - if (isEnd) - { - fclose(fileWritePtr); - } - // fclose(fileWritePtr); - } - else if(configPtr->logToCode == LOGTO_FILE_CODE) - { - // - printf("\nSimulator will output to a file.\n"); - FILE *fileWritePtr; - fileWritePtr = fopen(configPtr->logToFileName, "w+"); - if (fileWritePtr != NULL) - { - fprintf(fileWritePtr, "%s", logStr); - } - // no return, void - // close the file, if at the end. - if (isEnd) - { - fclose(fileWritePtr); - } - // fclose(fileWritePtr); + fclose(fileWritePtr); } else { - fprintf(stdout, "%s", logStr); + // need to add the string to the end of the LL. + if(configPtr->logToCode == LOGTO_BOTH_CODE || configPtr->logToCode == LOGTO_FILE_CODE) + { + // + copyString(toLog.stringData, logStr); + toLog.nextPtr = NULL; + while (wkgLogPtr != NULL) + { + prevWkgLogPtr = wkgLogPtr; + wkgLogPtr = wkgLogPtr->nextPtr; + } + if (logPtr->headPtr == NULL) + { + logPtr->headPtr = addLog(toLog); + } + if (wkgLogPtr == NULL) + { + logStrPtr = addLog(toLog); + // prevWkgLogPtr->nextPtr = addLog(toLog); + // prevWkgLogPtr->nextPtr = logStrPtr; + wkgLogPtr = logStrPtr; + } + } + if (configPtr->logToCode == LOGTO_BOTH_CODE || configPtr->logToCode == LOGTO_MONITOR_CODE) + { + // + fprintf(stdout, "%s", logStr); + } } + return logPtr; } /* @@ -636,8 +744,8 @@ Device Input/Device: none Device Output/Device: none Dependencies: pthreads, sprintf, logOutput, ??? */ -void runCPU(char *command, char *argument, int intArg, ConfigDataType *configPtr, - int processId, ProcessControlBlock *singlePCB, ConfigDataCodes schedMethod) +void runCPU(char *command, char *argument, int intArg, ConfigDataType *configPtr, int processId, + ProcessControlBlock *singlePCB, ConfigDataCodes schedMethod, logFileLL *logList) { double timeDigits; char timeStringy[MAX_STR_LEN]; @@ -655,13 +763,13 @@ void runCPU(char *command, char *argument, int intArg, ConfigDataType *configPtr cpuTime = intArg * configPtr->procCycleRate; timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(cpuOutput, "%f, Process: %d, %s %s operation start\n", timeDigits, processId, command, argument); - logOutput(configPtr, cpuOutput, false); + logOutput(configPtr, cpuOutput, false, logList); // run timer for intArg * procCycleRate pthread_create(&cpuThread, NULL, runTimer, (void *)cpuTimePtr); pthread_join(cpuThread, NULL); timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(cpuOutput, "%f, Process: %d, %s %s operation end\n", timeDigits, processId, command, argument); - logOutput(configPtr, cpuOutput, false); + logOutput(configPtr, cpuOutput, false, logList); // pthread_exit(NULL); break; @@ -669,13 +777,13 @@ void runCPU(char *command, char *argument, int intArg, ConfigDataType *configPtr cpuTime = intArg * configPtr->procCycleRate; timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(cpuOutput, "%f, Process: %d, %s %s operation start\n", timeDigits, processId, command, argument); - logOutput(configPtr, cpuOutput, false); + logOutput(configPtr, cpuOutput, false, logList); // run timer for intArg * procCycleRate pthread_create(&cpuThread, NULL, runTimer, (void *)cpuTimePtr); pthread_join(cpuThread, NULL); timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(cpuOutput, "%f, Process: %d, %s %s operation end\n", timeDigits, processId, command, argument); - logOutput(configPtr, cpuOutput, false); + logOutput(configPtr, cpuOutput, false, logList); break; default: @@ -694,8 +802,8 @@ Device Input/Device: none Device Output/Device: none Dependencies: pthreads, sprintf, logOutput, ??? */ -void runIO(char *command, char *argument, int intArg, ConfigDataType *configPtr, - int processId, ProcessControlBlock *singlePCB, ConfigDataCodes schedMethod) +void runIO(char *command, char *argument, int intArg, ConfigDataType *configPtr, int processId, + ProcessControlBlock *singlePCB, ConfigDataCodes schedMethod, logFileLL *logList) { double timeDigits; char timeStringy[MAX_STR_LEN]; @@ -710,12 +818,12 @@ void runIO(char *command, char *argument, int intArg, ConfigDataType *configPtr, ioTime = intArg * configPtr->ioCycleRate; timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(ioOutput, "%f, Process: %d, %s %s operation start\n", timeDigits, processId, command, argument); - logOutput(configPtr, ioOutput, false); + logOutput(configPtr, ioOutput, false, logList); pthread_create(&ioThread, NULL, runTimer, (void *)ioTimePtr); pthread_join(ioThread, NULL); timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(ioOutput, "%f, Process: %d, %s %s operation end\n", timeDigits, processId, command, argument); - logOutput(configPtr, ioOutput, false); + logOutput(configPtr, ioOutput, false, logList); break; case PREEMPTIVE_CODE: @@ -724,11 +832,11 @@ void runIO(char *command, char *argument, int intArg, ConfigDataType *configPtr, ioTime = intArg * configPtr->ioCycleRate; timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(ioOutput, "%f, Process: %d, %s %s operation start\n", timeDigits, processId, command, argument); - logOutput(configPtr, ioOutput, false); + logOutput(configPtr, ioOutput, false, logList); pthread_create(&ioThread, NULL, runTimer, (void *)ioTimePtr); timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(ioOutput, "%f, Process: %d, %s %s operation end\n", timeDigits, processId, command, argument); - logOutput(configPtr, ioOutput, false); + logOutput(configPtr, ioOutput, false, logList); // pthread_join(ioThread, NULL); // not sure if this will be needed... // pthread_exit(NULL); // this may be needed if pthread_join doesn't produce expected results. // call the interruptManager here, with the IO Return code. @@ -751,8 +859,8 @@ Device Input/Device: none Device Output/Device: none Dependencies: accessTimer, compareString, runCPU, runIO, ??? */ -void runProcess(ProcessControlBlock *singlePCB, ConfigDataType *configPtr, ProcessControlBlockLL *pcbList, - ConfigDataCodes schedMethod) +void runProcess(ProcessControlBlock *singlePCB, ConfigDataType *configPtr, ProcessControlBlockLL *pcbList, + ConfigDataCodes schedMethod, logFileLL *logList) { double timeDigits; // run over the entire process, running the CPU when a CPU cycle comes up @@ -781,13 +889,13 @@ void runProcess(ProcessControlBlock *singlePCB, ConfigDataType *configPtr, Proce { // run the CPU for the required amount of time. runCPU(workingMeta->command, workingMeta->strArg1, workingMeta->intArg2, configPtr, singlePCB->uniquePid, - singlePCB, schedMethod); + singlePCB, schedMethod, logList); } if(compareString(command, "dev") == EQUIV) { // run IO operations for the required amount of time. runIO(workingMeta->command, workingMeta->strArg1, workingMeta->intArg2, configPtr, singlePCB->uniquePid, - singlePCB, schedMethod); + singlePCB, schedMethod, logList); } if(compareString(command, "mem") == EQUIV) { @@ -797,7 +905,7 @@ void runProcess(ProcessControlBlock *singlePCB, ConfigDataType *configPtr, Proce timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(processOutput, "%f, Process: %d, %s %s request (%d, %d)\n", timeDigits, singlePCB->uniquePid, command, argument, intArg, intArgTwo); - logOutput(configPtr, processOutput, false); + logOutput(configPtr, processOutput, false, logList); // run the memory manager in allocate mode memManagerSuccess = memManager(pcbList, MEMORY_ALLOCATE, intArg, intArgTwo, configPtr, singlePCB); if(!memManagerSuccess) @@ -806,7 +914,7 @@ void runProcess(ProcessControlBlock *singlePCB, ConfigDataType *configPtr, Proce timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(processOutput, "%f, Process: %d, failed %s %s request (%d, %d)\n", timeDigits, singlePCB->uniquePid, command, argument, intArg, intArgTwo); - logOutput(configPtr, processOutput, false); + logOutput(configPtr, processOutput, false, logList); } } else if(compareString(argument, "access") == EQUIV) @@ -814,7 +922,7 @@ void runProcess(ProcessControlBlock *singlePCB, ConfigDataType *configPtr, Proce timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(processOutput, "%f, Process: %d, %s %s request (%d, %d)\n", timeDigits, singlePCB->uniquePid, command, argument, intArg, intArgTwo); - logOutput(configPtr, processOutput, false); + logOutput(configPtr, processOutput, false, logList); // run the memory manager in access mode memManagerSuccess = memManager(pcbList, MEMORY_ACCESS, intArg, intArgTwo, configPtr, singlePCB); if (!memManagerSuccess) @@ -823,7 +931,7 @@ void runProcess(ProcessControlBlock *singlePCB, ConfigDataType *configPtr, Proce timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(processOutput, "%f, Process: %d, failed %s %s request (%d, %d)\n", timeDigits, singlePCB->uniquePid, command, argument, intArg, intArgTwo); - logOutput(configPtr, processOutput, false); + logOutput(configPtr, processOutput, false, logList); } } } @@ -850,14 +958,14 @@ void runProcess(ProcessControlBlock *singlePCB, ConfigDataType *configPtr, Proce // timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(processOutput, "\n%f, OS: Process %d ended\n", timeDigits, singlePCB->uniquePid); - logOutput(configPtr, processOutput, false); + logOutput(configPtr, processOutput, false, logList); } else { // timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(processOutput, "\n%f, OS: Segmentation Fault, Process %d ended\n", timeDigits, singlePCB->uniquePid); - logOutput(configPtr, processOutput, false); + logOutput(configPtr, processOutput, false, logList); } // deallocate the memory for the process memManager(pcbList, MEMORY_DEALLOCATE, intArg, intArgTwo, configPtr, singlePCB); @@ -883,6 +991,7 @@ void runSim(ConfigDataType *configPtr, OpCodeType *metaDataMstrPtr) // need a variable for headPointer to point ProcessControlBlockLL *pcbList; ProcessControlBlock *pcbPtr; + logFileLL *loggingList; // string variable for nextCode, temp unused // char *nextCode; // string variable for the timer stuff @@ -895,6 +1004,16 @@ void runSim(ConfigDataType *configPtr, OpCodeType *metaDataMstrPtr) int memoryOffset = 0; int memorySize = 1; + // create the file list with createFileLogList, store the pointed to address + loggingList = createFileLogList(); + + // check to see if in file mode, and print, 'Sim will output to file' + if (configPtr->logToCode == LOGTO_FILE_CODE) + { + // + printf("Simulator will output to a file. (Please be patient...)\n"); + } + if (schedulingMethod == CPU_SCHED_FCFS_P_CODE || schedulingMethod == CPU_SCHED_RR_P_CODE || schedulingMethod == CPU_SCHED_SRTF_P_CODE) @@ -912,7 +1031,7 @@ void runSim(ConfigDataType *configPtr, OpCodeType *metaDataMstrPtr) // Operating System start timer goes here, log it. timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(simulatorOutput, "%f, OS: Simulator start\n", timeDigits); - logOutput(configPtr, simulatorOutput, false); + logOutput(configPtr, simulatorOutput, false, loggingList); // int variable for process to run int currentPid; // create the process list with createProcessList, store the pointed to address @@ -941,7 +1060,7 @@ void runSim(ConfigDataType *configPtr, OpCodeType *metaDataMstrPtr) int *processTimeLeftPtr = &processTimeLeft; // set the current process id to the first scheduled process - currentPid = scheduleProcess(pcbList, configPtr); + currentPid = scheduleProcess(pcbList, configPtr, loggingList); // initialize memory with the memManager memManager(pcbList, MEMORY_INITIALIZE, memoryOffset, memorySize, configPtr, pcbList->headPtr); @@ -961,10 +1080,10 @@ void runSim(ConfigDataType *configPtr, OpCodeType *metaDataMstrPtr) timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(simulatorOutput, "%f, OS: Process %d set to RUNNING state from READY state\n\n", timeDigits, pcbPtr->uniquePid); - logOutput(configPtr, simulatorOutput, false); + logOutput(configPtr, simulatorOutput, false, loggingList); pthread_t runThread; pthread_create(&runThread, NULL, runTimer, (void *)processTimeLeftPtr); - runProcess(pcbPtr, configPtr, pcbList, schedulingMethod); + runProcess(pcbPtr, configPtr, pcbList, schedulingMethod, loggingList); switch (schedulingMethod) { case NON_PREEMPTIVE_CODE: @@ -972,7 +1091,7 @@ void runSim(ConfigDataType *configPtr, OpCodeType *metaDataMstrPtr) timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(simulatorOutput, "%f, OS: Process %d set to TERMINATED state from RUNNING state\n\n", timeDigits, pcbPtr->uniquePid); - logOutput(configPtr, simulatorOutput, false); + logOutput(configPtr, simulatorOutput, false, loggingList); // this assumes that the processes finish executing all the way though. pcbPtr->process_state = PROCESS_STATE_TERMINATED; break; @@ -987,7 +1106,7 @@ void runSim(ConfigDataType *configPtr, OpCodeType *metaDataMstrPtr) processTimeLeftPtr = &processTimeLeft; pcbPtr = pcbPtr->nextPtr; } - currentPid = scheduleProcess(pcbList, configPtr); + currentPid = scheduleProcess(pcbList, configPtr, loggingList); pcbPtr = pcbList->headPtr; } pthread_join(cpuThread, NULL); @@ -995,14 +1114,13 @@ void runSim(ConfigDataType *configPtr, OpCodeType *metaDataMstrPtr) memManager(pcbList, MEMORY_CLEAR, memoryOffset, memorySize, configPtr, pcbList->headPtr); timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(simulatorOutput, "%f, OS: System Stop\n", timeDigits); - logOutput(configPtr, simulatorOutput, false); + logOutput(configPtr, simulatorOutput, false, loggingList); timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(simulatorOutput, "%f, OS: Simulation End\n", timeDigits); - logOutput(configPtr, simulatorOutput, true); + logOutput(configPtr, simulatorOutput, true, loggingList); // deallocate the process list with destroyProcessList destroyProcessList(pcbList); - // once complete, log the output to FILE if required - logOutput(configPtr, "", true); + destroyFileLogList(loggingList); // pthread_exit(NULL); // this line seems to make the program execution stop short... no warning either // void function, no return. } @@ -1018,7 +1136,7 @@ Device Input/Device: none Device Output/Device: none Dependencies: sprintf, logOutput, ??? */ -int scheduleProcess(ProcessControlBlockLL *headPointer, ConfigDataType *configPtr) +int scheduleProcess(ProcessControlBlockLL *headPointer, ConfigDataType *configPtr, logFileLL *logList) { double timeDigits; ProcessControlBlock *wkgPtr; @@ -1063,7 +1181,7 @@ int scheduleProcess(ProcessControlBlockLL *headPointer, ConfigDataType *configPt timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(loggingStr, "%f, OS: Process %d set to READY state from NEW state\n", timeDigits, wkgPtr->uniquePid); - logOutput(configPtr, loggingStr, false); + logOutput(configPtr, loggingStr, false, logList); } // move to the next pointer wkgPtr = wkgPtr->nextPtr; @@ -1080,7 +1198,7 @@ int scheduleProcess(ProcessControlBlockLL *headPointer, ConfigDataType *configPt timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(loggingStr, "%f, OS: Process %d selected with %.0f ms remaining\n", timeDigits, wkgPtr->uniquePid, wkgPtr->timeLeft); - logOutput(configPtr, loggingStr, false); + logOutput(configPtr, loggingStr, false, logList); returnPid = wkgPtr->uniquePid; } // move to next pointer @@ -1105,7 +1223,7 @@ int scheduleProcess(ProcessControlBlockLL *headPointer, ConfigDataType *configPt timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(loggingStr, "%f, OS: Process %d set to READY state from NEW state\n", timeDigits, wkgPtr->uniquePid); - logOutput(configPtr, loggingStr, false); + logOutput(configPtr, loggingStr, false, logList); } // move to the next pointer wkgPtr = wkgPtr->nextPtr; @@ -1124,7 +1242,7 @@ int scheduleProcess(ProcessControlBlockLL *headPointer, ConfigDataType *configPt timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(loggingStr, "%f, OS: Process %d selected with %.0f ms remaining\n", timeDigits, wkgPtr->uniquePid, wkgPtr->timeLeft); - logOutput(configPtr, loggingStr, false); + logOutput(configPtr, loggingStr, false, logList); returnPid = wkgPtr->uniquePid; } // move to next pointer @@ -1156,7 +1274,7 @@ int scheduleProcess(ProcessControlBlockLL *headPointer, ConfigDataType *configPt timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(loggingStr, "%f, OS: Process %d set to READY state from NEW state\n", timeDigits, wkgPtr->uniquePid); - logOutput(configPtr, loggingStr, false); + logOutput(configPtr, loggingStr, false, logList); } // move to the next pointer wkgPtr = wkgPtr->nextPtr; @@ -1209,7 +1327,7 @@ int scheduleProcess(ProcessControlBlockLL *headPointer, ConfigDataType *configPt timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(loggingStr, "%f, OS: Process %d selected with %.0f ms remaining\n", timeDigits, shortestJobProcNum, (double)shortestJob); - logOutput(configPtr, loggingStr, false); + logOutput(configPtr, loggingStr, false, logList); } returnPid = shortestJobProcNum; break; @@ -1228,7 +1346,7 @@ int scheduleProcess(ProcessControlBlockLL *headPointer, ConfigDataType *configPt timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(loggingStr, "%f, OS: Process %d set to READY state from NEW state\n", timeDigits, wkgPtr->uniquePid); - logOutput(configPtr, loggingStr, false); + logOutput(configPtr, loggingStr, false, logList); } // move to the next pointer wkgPtr = wkgPtr->nextPtr; @@ -1283,7 +1401,7 @@ int scheduleProcess(ProcessControlBlockLL *headPointer, ConfigDataType *configPt timeDigits = accessTimer(LAP_TIMER, timeStringy); sprintf(loggingStr, "%f, OS: Process %d selected with %.0f ms remaining\n", timeDigits, shortestJobProcNum, (double)shortestJob); - logOutput(configPtr, loggingStr, false); + logOutput(configPtr, loggingStr, false, logList); } returnPid = shortestJobProcNum; break; diff --git a/Sim04/simulator.h b/Sim04/simulator.h index b31aa41..df03988 100644 --- a/Sim04/simulator.h +++ b/Sim04/simulator.h @@ -32,6 +32,19 @@ typedef enum{ CLEAR_INTERRUPT } INTERRUPT_ROUTINE; +typedef struct logFileStruct +{ + char stringData[HUGE_STR_LEN]; + // connect to the next process control block here + struct logFileStruct *nextPtr; +} logFile; + +typedef struct logFileLLStruct +{ + // holds the head ptr for PCBs + logFile *headPtr; +} logFileLL; + typedef struct ProcessControlBlockStruct { int uniquePid; @@ -90,6 +103,31 @@ Device Output/Device: none Dependencies: ??? */ +/* +Name: accessMemory +Process: checks that the memory is between the offset and the size. + checks that the memory is ??? +Function Input/Parameters: source PCB (ProcessControlBlock *), offset (int), size (int) +Function Output/Parameters: none +Function Output/Returned: boolean to indicate success or failure of accessed memory +Device Input/Device: none +Device Output/Device: none +Dependencies: ??? +*/ +bool accessMemory(ProcessControlBlock *singlePCB, int offset, int size); + +/* +Name: addLog +Process: allocates the memory for the log, ... +Function Input/Parameters: source log (logFile) +Function Output/Parameters: none +Function Output/Returned: filled PCB (logFile *) +Device Input/Device: none +Device Output/Device: none +Dependencies: malloc, sizeof, ??? +*/ +logFile *addLog(const logFile source); + /* Name: addProcess Process: allocates the memory for the pcb, grabs the data from the created PCB, @@ -103,9 +141,33 @@ Dependencies: malloc, sizeof, ??? */ ProcessControlBlock *addProcess(const ProcessControlBlock source); +/* +Name: allocMemory +Process: 'allocates' memory within the PCB, stores offset and size within it's PCB +Function Input/Parameters: source PCB (ProcessControlBlock *), offset (int), size (int) +Function Output/Parameters: none +Function Output/Returned: boolean to indicate success or failure of allocated memory +Device Input/Device: none +Device Output/Device: none +Dependencies: ??? +*/ +bool allocMemory(ProcessControlBlock *singlePCB, int offset, int size, int arraySize); + +/* +Name: createFileLogList +Process: initializes the logging file struct +Function Input/Parameters: none +Function Output/Parameters: none +Function Output/Returned: head pointer to the logfile struct +Device Input/Device: none +Device Output/Device: none +Dependencies: malloc, sizeof, ??? +*/ +logFileLL *createFileLogList(); + /* Name: createProcessList -Process: initializes head pointer to the PCBs +Process: reads through the opcode struct to fill out the linked list of PCBs Function Input/Parameters: none Function Output/Parameters: none Function Output/Returned: head pointer to the PCBs @@ -115,6 +177,30 @@ Dependencies: malloc, sizeof, ??? */ ProcessControlBlockLL *createProcessList(); +/* +Name: deallocMemory +Process: 'deallocates' memory within the PCB, removes every offset and size within it's PCB +Function Input/Parameters: source PCB (ProcessControlBlock *) +Function Output/Parameters: none +Function Output/Returned: boolean to indicate success or failure of allocated memory +Device Input/Device: none +Device Output/Device: none +Dependencies: ??? +*/ +bool deallocMemory(ProcessControlBlock *singlePCB, int arraySize); + +/* +Name: destroyFileLogList +Process: deallocates memory used for the linked list struct +Function Input/Parameters: head pointer to linked list (logFileLL *) +Function Output/Parameters: none +Function Output/Returned: NULL +Device Input/Device: none +Device Output/Device: none +Dependencies: free, destroyFileLogHelper, ??? +*/ +logFileLL *destroyFileLogList(logFileLL *linkedListPtr); + /* Name: destroyProcessList Process: deallocates memory used for the linked list struct @@ -127,6 +213,18 @@ Dependencies: free, destroyProcessListHelper, ??? */ ProcessControlBlockLL *destroyProcessList(ProcessControlBlockLL *linkedListPtr); +/* +Name: destroyFileLogHelper +Process: recursively clears the logfile linked list struct, freeing the struct +Function Input/Parameters: head pointer to logfile list (logFile *) +Function Output/Parameters: none +Function Output/Returned: NULL +Device Input/Device: none +Device Output/Device: none +Dependencies: free, destroyFileLogHelper(recursively), ??? +*/ +logFile *destroyFileLogHelper(logFile *nodePtr); + /* Name: destroyProcessListHelper Process: recursively clears the PCB linked list struct, freeing the struct @@ -150,8 +248,7 @@ Device Input/Device: none Device Output/Device: none Dependencies: ??? */ -ProcessControlBlockLL *fillProcessList(ConfigDataType *configPtr, OpCodeType *metadataPtr, - ProcessControlBlockLL *headPointer); +ProcessControlBlockLL *fillProcessList(ConfigDataType *configPtr, OpCodeType *metadataPtr, ProcessControlBlockLL *headPointer); /* Name: findMin @@ -165,19 +262,47 @@ Dependencies: none */ int findMin(int one, int another); +/* +Name: interruptManager +Process: does the managing of interrupts for the program +Function Input/Parameters: ??? +Function Output/Parameters: none +Function Output/Returned: ??? +Device Input/Device: none +Device Output/Device: none +Dependencies: none +*/ +bool interruptManager(ConfigDataType *configPtr, ProcessControlBlock *singlePCB, INTERRUPT_ROUTINE interruptRequest); + /* Name: logOutput Process: Takes in a string, and then outputs it to monitor AND/OR file -Function Input/Parameters: string (char *), file pointer (FILE *), +Function Input/Parameters: string (char *), file pointer (FILE *), configuration data (ConfigDataType *), end of simulator (bool) Function Output/Parameters: none Function Output/Returned: none Device Input/Device: none Device Output/Device: none -Dependencies: sprintf, ??? +Dependencies: fprintf, ??? */ -void logOutput(ConfigDataType *configPtr, char *logStr, bool isEnd); +logFileLL *logOutput(ConfigDataType *configPtr, char *logStr, bool isEnd, logFileLL *logPtr); + +/* +Name: memManager +Process: checks to make sure an allocate will be successful, + makes sure that an access will not segfault (or return segfault if it does), + and initializes memory and deallocates memory +Function Input/Parameters: PCBList (ProcessControlBlockLL *), memory code (MEMORY_SIGNALS), + offset (int), size (int), configuration data (ConfigDataType *) +Function Output/Parameters: none +Function Output/Returned: boolean for success or failure of memory management +Device Input/Device: none +Device Output/Device: none +Dependencies: ??? +*/ +bool memManager(ProcessControlBlockLL *pcbList, MEMORY_SIGNALS memCode, int offset, int size, ConfigDataType *configPtr, + ProcessControlBlock *singlePCB); /* Name: runCPU @@ -187,10 +312,10 @@ Function Output/Parameters: none Function Output/Returned: none Device Input/Device: none Device Output/Device: none -Dependencies: ??? +Dependencies: pthreads, sprintf, logOutput, ??? */ -void runCPU(char *command, char *argument, int intArg, ConfigDataType *configPtr, - int processId, ProcessControlBlock *singlePCB, ConfigDataCodes schedMethod); +void runCPU(char *command, char *argument, int intArg, ConfigDataType *configPtr, int processId, + ProcessControlBlock *singlePCB, ConfigDataCodes schedMethod, logFileLL *logList); /* Name: runIO @@ -200,33 +325,312 @@ Function Output/Parameters: none Function Output/Returned: none Device Input/Device: none Device Output/Device: none -Dependencies: ??? +Dependencies: pthreads, sprintf, logOutput, ??? */ -void runIO(char *command, char *argument, int intArg, ConfigDataType *configPtr, - int processId, ProcessControlBlock *singlePCB, ConfigDataCodes schedMethod); +void runIO(char *command, char *argument, int intArg, ConfigDataType *configPtr, int processId, + ProcessControlBlock *singlePCB, ConfigDataCodes schedMethod, logFileLL *logList); + /* -Name: runSim -Process: primary simulation driver -Function Input/Parameters: configuration data (ConfigDataType *), - metadata (OpCodeType *) +Name: runProcess +Process: runs the process that was selected +Function Input/Parameters: ??? Function Output/Parameters: none Function Output/Returned: none Device Input/Device: none Device Output/Device: none -Dependencies: ??? +Dependencies: accessTimer, compareString, runCPU, runIO, ??? +*/ +void runProcess(ProcessControlBlock *singlePCB, ConfigDataType *configPtr, ProcessControlBlockLL *pcbList, + ConfigDataCodes schedMethod, logFileLL *logList); + +/* +Name: runSim +Process: primary simulation driver +Function Input/Parameters: configuration data (ConfigDataType *), + metadata (OpCodeType *) +Function Output/Parameters: none +Function Output/Returned: none +Device Input/Device: none +Device Output/Device: none +Dependencies: pthreads, accessTimer, sprintf, logOutput, runProcess, destroyProcessList, ??? */ void runSim(ConfigDataType *configPtr, OpCodeType *metaDataMstrPtr); /* Name: scheduleProcess Process: takes in the scheduling data, and then returns which process is to be ran -Function Input/Parameters: head pointer of PCB List (ProcessControlBlockLL *) +Function Input/Parameters: head pointer of PCB List (ProcessControlBlockLL *), + configuration data (ConfigDataType *) Function Output/Parameters: none Function Output/Returned: none Device Input/Device: none Device Output/Device: none +Dependencies: sprintf, logOutput, ??? +*/ +int scheduleProcess(ProcessControlBlockLL *headPointer, ConfigDataType *configPtr, logFileLL *logList); /* + Name: accessMemory + Process: checks that the memory is between the offset and the size. + checks that the memory is ??? + Function Input/Parameters: source PCB (ProcessControlBlock *), offset (int), size (int) + Function Output/Parameters: none + Function Output/Returned: boolean to indicate success or failure of accessed memory + Device Input/Device: none + Device Output/Device: none + Dependencies: ??? + */ +bool accessMemory(ProcessControlBlock *singlePCB, int offset, int size); + +/* +Name: addLog +Process: allocates the memory for the log, ... +Function Input/Parameters: source log (logFile) +Function Output/Parameters: none +Function Output/Returned: filled PCB (logFile *) +Device Input/Device: none +Device Output/Device: none +Dependencies: malloc, sizeof, ??? +*/ +logFile *addLog(const logFile source); + +/* +Name: addProcess +Process: allocates the memory for the pcb, grabs the data from the created PCB, + dumps the data so that the node can be linked correctly. +Function Input/Parameters: source PCB (ProcessControlBlock) +Function Output/Parameters: none +Function Output/Returned: filled PCB (ProcessControlBlock *) +Device Input/Device: none +Device Output/Device: none +Dependencies: malloc, sizeof, ??? +*/ +ProcessControlBlock *addProcess(const ProcessControlBlock source); + +/* +Name: allocMemory +Process: 'allocates' memory within the PCB, stores offset and size within it's PCB +Function Input/Parameters: source PCB (ProcessControlBlock *), offset (int), size (int) +Function Output/Parameters: none +Function Output/Returned: boolean to indicate success or failure of allocated memory +Device Input/Device: none +Device Output/Device: none Dependencies: ??? */ -int scheduleProcess(ProcessControlBlockLL *headPointer, ConfigDataType *configPtr); +bool allocMemory(ProcessControlBlock *singlePCB, int offset, int size, int arraySize); -#endif // SIMULATORX \ No newline at end of file +/* +Name: createFileLogList +Process: initializes the logging file struct +Function Input/Parameters: none +Function Output/Parameters: none +Function Output/Returned: head pointer to the logfile struct +Device Input/Device: none +Device Output/Device: none +Dependencies: malloc, sizeof, ??? +*/ +logFileLL *createFileLogList(); + +/* +Name: createProcessList +Process: reads through the opcode struct to fill out the linked list of PCBs +Function Input/Parameters: none +Function Output/Parameters: none +Function Output/Returned: head pointer to the PCBs +Device Input/Device: none +Device Output/Device: none +Dependencies: malloc, sizeof, ??? +*/ +ProcessControlBlockLL *createProcessList(); + +/* +Name: deallocMemory +Process: 'deallocates' memory within the PCB, removes every offset and size within it's PCB +Function Input/Parameters: source PCB (ProcessControlBlock *) +Function Output/Parameters: none +Function Output/Returned: boolean to indicate success or failure of allocated memory +Device Input/Device: none +Device Output/Device: none +Dependencies: ??? +*/ +bool deallocMemory(ProcessControlBlock *singlePCB, int arraySize); + +/* +Name: destroyFileLogList +Process: deallocates memory used for the linked list struct +Function Input/Parameters: head pointer to linked list (logFileLL *) +Function Output/Parameters: none +Function Output/Returned: NULL +Device Input/Device: none +Device Output/Device: none +Dependencies: free, destroyFileLogHelper, ??? +*/ +logFileLL *destroyFileLogList(logFileLL *linkedListPtr); + +/* +Name: destroyProcessList +Process: deallocates memory used for the linked list struct +Function Input/Parameters: head pointer to linked list (ProcessControlBlockLL *) +Function Output/Parameters: none +Function Output/Returned: NULL +Device Input/Device: none +Device Output/Device: none +Dependencies: free, destroyProcessListHelper, ??? +*/ +ProcessControlBlockLL *destroyProcessList(ProcessControlBlockLL *linkedListPtr); + +/* +Name: destroyFileLogHelper +Process: recursively clears the logfile linked list struct, freeing the struct +Function Input/Parameters: head pointer to logfile list (logFile *) +Function Output/Parameters: none +Function Output/Returned: NULL +Device Input/Device: none +Device Output/Device: none +Dependencies: free, destroyFileLogHelper(recursively), ??? +*/ +logFile *destroyFileLogHelper(logFile *nodePtr); + +/* +Name: destroyProcessListHelper +Process: recursively clears the PCB linked list struct, freeing the struct +Function Input/Parameters: head pointer to linked list (ProcessControlBlockLL *) +Function Output/Parameters: none +Function Output/Returned: NULL +Device Input/Device: none +Device Output/Device: none +Dependencies: free, destroyProcessListHelper(recursively), ??? +*/ +ProcessControlBlock *destroyProcessListHelper(ProcessControlBlock *nodePtr); + +/* +Name: fillProcessList +Process: iterates through the metadata LL, fills out each process as needed. +Function Input/Parameters: metadata (OpCodeType *), + headPointer (ProcessControlBlockLL *) +Function Output/Parameters: none +Function Output/Returned: pointer to filled PCB (ProcessControlBlockLL *) +Device Input/Device: none +Device Output/Device: none +Dependencies: ??? +*/ +ProcessControlBlockLL *fillProcessList(ConfigDataType *configPtr, OpCodeType *metadataPtr, ProcessControlBlockLL *headPointer); + +/* +Name: findMin +Process: compares two values, returns the smaller of the two. +Function Input/Parameters: two integer values (int) +Function Output/Parameters: none +Function Output/Returned: minimum of the two input integer values (int) +Device Input/Device: none +Device Output/Device: none +Dependencies: none +*/ +int findMin(int one, int another); + +/* +Name: interruptManager +Process: does the managing of interrupts for the program +Function Input/Parameters: ??? +Function Output/Parameters: none +Function Output/Returned: ??? +Device Input/Device: none +Device Output/Device: none +Dependencies: none +*/ +bool interruptManager(ConfigDataType *configPtr, ProcessControlBlock *singlePCB, INTERRUPT_ROUTINE interruptRequest); + +/* +Name: logOutput +Process: Takes in a string, and then outputs it to monitor AND/OR file +Function Input/Parameters: string (char *), file pointer (FILE *), + configuration data (ConfigDataType *), + end of simulator (bool) +Function Output/Parameters: none +Function Output/Returned: none +Device Input/Device: none +Device Output/Device: none +Dependencies: fprintf, ??? +*/ +logFileLL *logOutput(ConfigDataType *configPtr, char *logStr, bool isEnd, logFileLL *logPtr); + +/* +Name: memManager +Process: checks to make sure an allocate will be successful, + makes sure that an access will not segfault (or return segfault if it does), + and initializes memory and deallocates memory +Function Input/Parameters: PCBList (ProcessControlBlockLL *), memory code (MEMORY_SIGNALS), + offset (int), size (int), configuration data (ConfigDataType *) +Function Output/Parameters: none +Function Output/Returned: boolean for success or failure of memory management +Device Input/Device: none +Device Output/Device: none +Dependencies: ??? +*/ +bool memManager(ProcessControlBlockLL *pcbList, MEMORY_SIGNALS memCode, int offset, int size, ConfigDataType *configPtr, + ProcessControlBlock *singlePCB); + +/* +Name: runCPU +Process: runs the CPU operations for however long it takes +Function Input/Parameters: ??? +Function Output/Parameters: none +Function Output/Returned: none +Device Input/Device: none +Device Output/Device: none +Dependencies: pthreads, sprintf, logOutput, ??? +*/ +void runCPU(char *command, char *argument, int intArg, ConfigDataType *configPtr, int processId, + ProcessControlBlock *singlePCB, ConfigDataCodes schedMethod, logFileLL *logList); + +/* +Name: runIO +Process: runs the IO operations for however long it takes +Function Input/Parameters: ??? +Function Output/Parameters: none +Function Output/Returned: none +Device Input/Device: none +Device Output/Device: none +Dependencies: pthreads, sprintf, logOutput, ??? +*/ +void runIO(char *command, char *argument, int intArg, ConfigDataType *configPtr, int processId, + ProcessControlBlock *singlePCB, ConfigDataCodes schedMethod, logFileLL *logList); + +/* +Name: runProcess +Process: runs the process that was selected +Function Input/Parameters: ??? +Function Output/Parameters: none +Function Output/Returned: none +Device Input/Device: none +Device Output/Device: none +Dependencies: accessTimer, compareString, runCPU, runIO, ??? +*/ +void runProcess(ProcessControlBlock *singlePCB, ConfigDataType *configPtr, ProcessControlBlockLL *pcbList, + ConfigDataCodes schedMethod, logFileLL *logList); + +/* +Name: runSim +Process: primary simulation driver +Function Input/Parameters: configuration data (ConfigDataType *), + metadata (OpCodeType *) +Function Output/Parameters: none +Function Output/Returned: none +Device Input/Device: none +Device Output/Device: none +Dependencies: pthreads, accessTimer, sprintf, logOutput, runProcess, destroyProcessList, ??? +*/ +void runSim(ConfigDataType *configPtr, OpCodeType *metaDataMstrPtr); + +/* +Name: scheduleProcess +Process: takes in the scheduling data, and then returns which process is to be ran +Function Input/Parameters: head pointer of PCB List (ProcessControlBlockLL *), + configuration data (ConfigDataType *) +Function Output/Parameters: none +Function Output/Returned: none +Device Input/Device: none +Device Output/Device: none +Dependencies: sprintf, logOutput, ??? +*/ +int scheduleProcess(ProcessControlBlockLL *headPointer, ConfigDataType *configPtr, logFileLL *logList); + +#endif // SIMULATORX