From 8fd2eecb85704816679eb0a16567cae8eb852ef1 Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Sun, 8 Dec 2024 22:57:03 +0100 Subject: [PATCH] =?UTF-8?q?-=20[CHG]=20mode=20berserk=20passa=20a=20per=20?= =?UTF-8?q?Fast=20Tape.=20sistema=20de=20Opcions.=20-=20[NEW]=20Opci=C3=B3?= =?UTF-8?q?=20per=20a=20parar=20execuci=C3=B3=20al=20acabar=20de=20carrega?= =?UTF-8?q?r=20una=20cinta.=20-=20[NEW]=20Opci=C3=B3=20per=20a=20parar=20l?= =?UTF-8?q?'execuci=C3=B3=20al=20trobar=20una=20instrucci=C3=B3=20del=20Z8?= =?UTF-8?q?0=20no=20v=C3=A0lida=20-=20[NEW]=20Savestate=20del=20Fernando?= =?UTF-8?q?=20Martin,=20per=20a=20provar=20m=C3=A9s=20r=C3=A0pid.=20-=20[N?= =?UTF-8?q?EW]=20Treballant=20en=20el=20sistema=20d'an=C3=A0lisi=20visual?= =?UTF-8?q?=20del=20codi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fer.sav | Bin 0 -> 49183 bytes main.cpp | 34 ++++++++++++++++++++++++++-------- z80.cpp | 19 +++++++++++++++++-- z80.h | 7 +++++++ z80analyze.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ z80analyze.h | 8 ++++++++ zx_screen.cpp | 2 +- zx_tape.cpp | 23 +++++++++++++++++++---- zx_tape.h | 10 ++++++++-- 9 files changed, 129 insertions(+), 17 deletions(-) create mode 100644 fer.sav create mode 100644 z80analyze.cpp create mode 100644 z80analyze.h diff --git a/fer.sav b/fer.sav new file mode 100644 index 0000000000000000000000000000000000000000..8e62f56671c4bfd2d6d0a892798be7e1d81d2534 GIT binary patch literal 49183 zcmeFa3t&@4)&M;B-ZYOs@@NYLgyyEL5Rpd+SW68_S_%{wTPP17C=}6(%0j9LRN6cc zD84HquWwgaS3eMU1$X!3TU>z)fzlGApeu?RNd*dsh4Lr_NbdY+=C(9oTXgr^@B9A$ z|8AOd=gv8EX3m*2bI#1YH$^E(cA`nkJ!&*|`M0e5`aE$i=fM}I+3)=I6@(auK{r3R zGna(Us0J>a9zi@p$_|Lwt7n=JhXv&6fPfRADVOn69iWi{@T%hrmUe*Wz78Se#?cPY z%=X{@sA>M=nTx>XA37Ar&x8<4>#%G$tfBIE>wqF|9+YQ34Ldy@5GVk_xbTGz(1_?q zgXeW9|H%-@e<=c7+B=v#XJ0gY|IXp&_uIq%j6BWx<4p+F3muUT6zvh@01-MMU{`|u zFp6;4(*c133bV)EM>{}M`3)jo)d61R4lHb!lb7sUi58{r8zv=*w5*!E_&WpR-FAjY*kq*%4 z;x?E4`*-jUYu(U|?H!s9@>^&PR}Y7foVK#P(&+Z%HY*woC{Md+gf_m1kOE(Rw*xdH z{h!zv?a00nD^U6Q4$2P;K>P9fa0h7gbcJYd-h>bS6?dQ_dxu3SOU30Kt6*}Ab97Ka zmp9igMg40L5;`EbbpniEH-5YWG}Y{2!?q6PHv(fj#*PlkZ#@FjtKHC{5dCsQ`}gbd zfVEAyeGZ>qYCpdv_qM3ZinIt-bU+nf`Dq9Z{!7RGAHNRd-+?>re>>jVq5S6sBEJZ* zy@S~{Gt6A}xI2_TX-~x7{J9vk?{l?R9x;c{d)h^`WOl6xM~M9L4v2JD4>uvjvz`v^ zpOj<&6Mxu2d6eJ*{apRqq7LxPWr6rN5vbZbn4#bFR9t!IaL4kW3fsT`^71hEruOZh z+Z#5V{k$P+n;LPnR{>%|_&?lNr%v6D)C)vpbm&1DaA-XA1RycG^M3BIh>*Gj&9DC? z`xDL1h&t9>B5{J|j{=P162+0@!qqRg+YH;U>x^y~|FEHzT|4K2QFo}F?A9#y?68R) zbq}Sf3=iwT_+ffI)nvHx<)LT=j%2nny#DNQTkzGX_ApYh^1o?sElth?tMIwau^Bg{r$%to4Oy|5ar<7{;Ec_< zF}*#U)}j3Dk*4lvPxXlo#ecQjSWde3y!i~suL&WwQzO(jW#1=9W;w#wEKXhNeJb+U zMKB4{|9gjinzr*>^))Q;&_nA$!!_8D8G) zi}CFncS{|WO}#plA2nZ5T>0^E^l5Q^_t-YIHP3tasU2sx!}wO0DC+B*=FbQD)f|Qn zmk!0Sh3CY>KVFl6Z`!GE)e%(Nibp8nGJZb<@`v0INR|7(>zSqob+#S-Cpuy;+Yl`& z=>J%K-iT+Wo`4v%lVf|6dPhfSrVJYfU9v~-j5>R^ujJtk&9iX?;yZN-*HjhDkpZ- zJet2F>W<;|Q&RVZw%+(D7NN=}#nkrlY2Nlqdyfk^I`2wI6FX_O(c7EPHRCH(eul_D zQ-kKK+onIH*ufqX5ALV(i;XyX2D`t-7@ONT#B1=EPBM!(p%S6H_obeRas~_63<#y* zW=9+KPg0CK(oygt(e8-A%-qSby-Bgd(-GbswZD7y>h?|N1&u)fBIS*Qw_H6|?7qa( z`8{0!ZT62EPgreeqvE#5JsQq}{xy^^;UhaQhmpG%Vbpe{y74!9goeQ?utd;%Us5K@ zNl0^zpijr)4W+?Rcc=DU8LsS9es>9X*mJG68xqWAnBUJ&IlR}ShB=-=O6?5Njt?4X<3+-rF%gIRoZFFk;@J^vaY< z7M8?qB!&ov;vF7LMPx^(%eU>}oKEH69%9aP$Q=+52@Fi%9UlteuB)Do(MWOJ)d?1% zU7fa$u_pet)8b=hfbn&5qzo~3f<;Isg5h;`*aURBGrU2#x6N4FA&mRHQvvLY+q$}) z(kPrXzrE~hc@?U!ucg~d7-StSz9njfC<^VByO#HmfZW$E+DRA$65e!t$XD<07zwMh zh2hT7Xcg1B{9{xd2G5jlN?gR#Sp_n2qtF>1EfCO-&Io!5hdY%ZZcM0?;tc)(CdW>W zu%%P($TlOdlhWXK7I(Bdkcx3PlYbcWzo(Nb(&~3~DuMjpOFAjd*q=So2^yhQmd?jV z@5i@xT3)pfdpaXvT{r3fy9BgN=!8SkS$C)tG>Ut=Gc1G4@9PYY!ZKN>c$;cak-xXB^Z8vRb}m1YeG~a_5!Bl{ zYa(;8)9D}G(W(71bbqiD1y#)Gy#Eb%9O|Sr?5^F!zcJ@K($A<-qw?T@Q-{aD8sA~X z|NV&E8;%=Wa05E`X80QkZY+Nz{ziWPcm1!{K&Qj%{|87ittG`}Bqe3UL8>dPeqg5` zAUWT-42n^Q)q!vTy*&-G;t@_moC2Zw4eoVZ*Vh)vfOg(> z=uSw0On0T{k1ou;XY_D>Z1ITkBMK+v4oJW28&V7c?z_@Qjwmk7EzB?C@5wEmFuE{3 z38mc%d|TMHvduY@p1vvPvXFI$`3{2WA)+J?-;~FE_y5}W z;tb#Kr~5)r`gT7ND6b5BcQNqm%7AXR{+3Oa@0|f>WgvC7UK23P3bAN^BCkT~&G7Z{4wL!7(>uJ3fSVGPQg{dno3&g6xf>|IVkZuA@4qqn5 znUpy>aN70tG+s~}r`|aXa`)9tvvsu?$}B_6d|yw?Ny1{L0I~$` zx#C;mw7I_#4Ti65JK*${?F_&=$pm2`l79R2oNt{C+(B7m{xHkTM+2d71E)?jC5o(? z$(E~SCRWXrTLw&T)nnsS@sVcTNMtNU*}9;Mjc#X+g(zFDn}UopP#_ZSo$6nlK5+V3 zogQU#x_D$vC%OK`l@{~#x>hcv2Ti)5AC;OO0yvT{v}t|MK1zDQ)Yb168Wf^TFivDL5Z;}tQ^qbD71YPl>%sitAC^Z*3uL3fO5G&X;#?19<%opY6kAYbYWN}>~s|#eQ z&09rzcK2u32VK~tI-O|RXzS^l{OD36nNNGza;_|x3J)JJS71jCS&4pLB}ArUMh zG3WN_{;6OKgx)wo0d;QURZ!7KHtjxW;mk*^jrq|f9MqL8%Cgl_7b}j-R*3hRxxNFZ z1G;EbqR3@4iNPi88`-H_&7gYDvphR~t633vbh=HeuLwN<=z9KMNR96sb&|1gui$@- zH$bgQf03!1-)#cnx#ejxGYc}w%yBmDpY?q}!EK#&BNd=@KGIKh#_l*|Qk#e-_d085#@7gPk<8^6_KB+Pd1-G-NxSrW;8Yq_gXn{#? zOU!0%vOfp?mq*qvsH2MIpY-3$KjtsuAA}wo?|;lRIcU7<1jUZzGlDKuBM;6ae6sVQ z2_)$kYkck*biQ-X&<_BT;C7s?I7sO92CzFQv7I%47o3NIc8NYQu*0cW9NH6D=G=Lx zb$&F;lLNyaYaNuv?#agj(;n9)e+AusFxL<2g;a?mK-I?>3%BbzA`2rHRjiJl?c1FWZzrH#F1=^lx?Be zWMJ3G?g=cc^y^5y?pEnc%2ug!jyOe*PYe#x`Ez-Fa7eN~MP$ge8m^VWAsRgw9FpkI zH4P;UUiBY_Mh9KdgRGg^6r2~0x}sKbu!)P#iw4{?$V^t7#`!*S=6vs5FIZvH_f=Gq zDp(%aBuOm31QxmmXXE&zgi{SGTEGA-60`Nd>W(NVYnEVRrQ$}tOqW=-aB^51K-nI82sK^OCG17oxC_xC;ObY-L;b&8n32b62;JMZ=yB~dS_dnMI5 zomdkZJVlVz;Ca`S3=KTBWFGjVVY|0D)A9q*e9`&XfOOKmEnR5KtA{K991~j;2c7CW zy-H0v&V~tP6hF{^uSvNcT3uRuXC0WW9(p)l-2fRQO=^8S81NXH9;yBwtV5rCCm|KU zWTJ$Ei_VfA+Y|Wq@tyVigHzbxB#sixgHvR|NpX}!U-`P3Ys{}|%=Z@Q6QH0(r$!6B zQ-d&yO=HzcxeQ24O=h*6jB8U*IS1z{e1cpK6jOM8oW2W5m^3ndqFi18$U>fz%MzdU z+)MM>36DLyeCz%NHL^EERh?SCfU>&}=q8yGh9v<_p=tOqy@M1q>D63~j8t97_l86w z43Clg9f^92It7EH9d zf|QL?hlv{Cnxx^2-h}V=s9$^^u3v%gieQ$U153{g633gCbJbat6Lr2Ore-Gthl{~k zZ2$hjQZD$6EI5aB#Vq)~zpvIA%~HxpT;qcz(fY4~erA?wgl`ua=-)vxC{!tq%^oaH zHV>=-!E9KRV$L$Yz;HUrsXhfb^C$CdZP5=XCvstz11=p4aF#^$G+LJIR|IHL{j`XO4d zC4!%j%C>MKWq_&~sJ^yQlWws#Xb`c`H{rV?@NZ-~v)o$-{b#wa%$Q%+6$Ph6dUbbM z9)LXd;C;kZ7PSaxf*7-Aj@NIu+z&`uur%&qkJ+^TB(Oz1l259rQ9hkKC=1SGz`nshqA8@6wPb!4 z(ioVZNkk1J#bPeATDq1QQDS-uKv{bKGHQyq87FAdyOs5RBz;g>ZyQuPpf}VXSpS$! zOUGE3GRwd+D6D@HVt1I_GfC{;8g%;?nBt8SYDsy$zN>Mg^X6aXE{K2U^<0LL|Gb!eS@IN>ULVQNgZwf5FXhaSj<6v;NXBsz?^;GgI zqZTo8-WCT)+epjE2Q2qL5LoZDDae9Hr`G*;cHnn(we)9aU<+M&NlUQmRmM<37VgJi zHNxJSlDB0O?s6H!>TPC{R8h7jlGMO+`MgcxTYPcC=zB(B{4-t0UC?zSO?QCnc)k3Z z>v*F)8sj?T&g)%AisU-LQ@l}rqo=T6^Av^_PXUjtM2Uyc$QAkoxdPI}F~r@(G28)k z;22;A0CJOBrq3h=O&YbVhMOAn`-W8do~-Z0{^m4$t@f<{972a^HK;`l1!S-#_JB z-OhUic1JF3Hr`=2|4X(J;$$4l$Q4S&unfa7vfwvCS`UBs#8J8VMaBFe9-<7oL&%RD zz+;@x7x8)g7=8pl9`pRz5yj(+3UkK*QD1)K#1X~0aK`-b+``=P6LNVYkB8^pGq#A& zolu-R9&>U{@-1n7`XXZmwvE@lH!U#oDKc%2;*%g4R)JU2y-)MHmFa%}6hRIu)2$|n zEF@=wPzr|rdQ(<#J7>BryAPRX)|*VhGMK-?aWKJBRx*lH!DpD@95(p0EcjHMESNz) z`rX>?z`(V>He*W0q>N*y0wbQP_YHaKY92nzN+YuEWXFt5$pwG>Xs zMNi_~T^zX@38ys1I0mLkvB3bVR^oVi8ON6Og4DsFORm=ffb=Bzt}t=K{ClkpAhleM zic~J}6h+1fWssmg85T;mZx+u!7CaU`7I^UKXnnB0-WCrwJc*CDfv*A!Rzk~2oW$19 zsK&%tNsYTdd>R740NCy6RW0uQU{9E^QEAYn09x=^gh!43MjlWqc&r%;!Xn{7u-^DV znJZ&`?T7qj(z%ylW(#Ir;bOyOB8fn{4_0sT_%vjWlXvY&7vufFi;%S+xDheloJPF` zBb&b!JShxC1{^LlUqP~K``49|%Sn7L$>i?}9t(_{6Rek9M&-do2 z=i7vCllEAkYfRBhDzr^yVuq0lObL{OrY12{A74XUSD}eLnAldDI;qNoq!@9ox86z= z;!@OP5mKJDf_6!MjSN%-tpx4X1KQfa)DkEE!89@bGj2}c?{j?IoJ|rbjq`|`vLQYW z7AN2UjyQdPnI^f>TcIkbf<&HZF3&(ri3<55y7aiWl7a!l4FQ$(;@mwldMdl ztyo4oUA`aI0i^f2{R_O&dF->E=sZ|@#ig-P7$zl<)^I0)1 z`;5~q&A^V~6{oRye)=T{q{Lt;hF~88q=RW@d1F2_ zM}$CFHvvM|i?Dsub?CEx>+-Iw8N#%#;;030q|s!WSmYl%f2)}(w_J8Y>~_%^I6O~( zJCvSeN+$!_ZDV-oAkZ4b)et>LgRTgP%_2bZNnPNM`F$@r3v({QhM!^>l+MsIx0Cji z;^3UwR(J&#{ZQ0pl2tb5&xWAxjh(Lnx4QDbn&ppwv1zJa z`GF~aM(!6~QOSJ6;%x4tY{l}TLp%5AWkp{c+BrYC1loW{l?RuAbmF17;4@rsjx1Of z7j(*lPb-2?DeHsJsDg9iNq-!y3rL@;7C}6DuR=g<-QB^SdNp) z;^O3Tg+i%Rsp8|~6A}^<$&o}4#70E0X@(_#aF>z(VUo*=BIK|#^2flRoctkq8%|_d zQ9`p6$F$&}XasKC0gj+a(U#Jnf5%WHTFR*pB1g=N!`Vi(I@KL7Y!I4xoLDhz z*w$=0EDy6pP>wjs^a#Kyycy)Gng5X){OaW;trL$~SMed#qWqB70VSRq#B)c~>dNT4DzCYJ+!Np$pjm1ZQ1W zHM=*`rGM2O;v{3wx4Nfy#bg#+FOc0MSh&WEUH99VQNco$zucr6<=^@m?2{GEPuvO{ zzbIIy+HYhgk|yx%fK;Hi2Is{O>x!oO@9M4&fh#CipVmKf9l!OpHig8FSB#RF`L{~! z{Fi^qa2PPON(}D?Tfa>m>aWj)I&%zVfmnf1wPvz}G+G~<5eH#pF{QhgCXWx!l{puTRC%9T6{-Hwyc%7;0kUkx#Z>Q9~+Nk@-Q1>|@=hd1+ z$G(8SEEL$_(($N!5`W>qo-cyO>KPs#k~_KMBo;|3%_mK97;Oz%` z?VMZRf4-s&k z>OestPohz-)Kz<6&D~EgH!2czf2V13P1fP(mViJy)d}$GI0;tpa3l1!%D@1x5!PvO zaW=BrCOZg5Rvvi5ZB+GW%N$r{R56eVcMd1Rrh{eS;y{%*FmG|d?hZ@|2j+!y)Yxh| zB{c(XQN{UYT!EXQ)&>R86O)_gF>(qBt)P*dF`o57YpT3pjYB=UFlnP)9?133>!2$s z;CI>v20XAYlt_|1NfsssMxM(~-W^^7r?SuK^ z5qU)uNMb_q=&@rUVeIFEZ7Jg;Vc2`3`%bX!WR%IsrdVPkY>EZG_U7ozh7Ggm%W^Db zR;$HQCeGqd+Bi#UnPmV$+Y%vZlSvnwV8IJ(UEkN+q^o432gA{dME(~K5+&P zklXITdQcb`a(CS=NN!TcW#J4M9^JLgb;f`<{nRQ3sddT|LF3Dj;4B2gyA*(LaZDg}p;5~Kx9+;XtUDz~HeQ|3xcQX2i|SM} z*)i0@YqYSsL=A=-bFkkit$21AAFMO(UY*|SqD^6Gytv77?xHQ*GC3RwzixbZVY=f| zUCuW!?K9O(!u${Tt98aol4(n`R4lARIa)l7*Q>D&_~vRwawnQ5{6qO4^#Y)Jb83&P zAISv>bwZ6v{Av9=!}uf}&wnnS)(+Q-UHFSR6$^&}M?wE0wBpqVHyP;;9@$Kz8+gya z4j#;hh|#^V2*wf!$|R-PW&|c)v~_`@ZIsKIgj5)e6E7NPDagL#Ea>0Z&Cb@o-UNG@ zmcMw(UTC0lk?t>xj0z<%9H1gx6O_7rg#8yf{bKrjfJvp}7ej2RGcATk9S#ggBBUBZ z+7$r=4uK~Y!$cz9vCq6n9AX*@cgT!tMjT{{6D@owsoVnFCdRuK!wh0xtb3f^(A!)G ztgYm>_9n}>PFs9n#ueY)&&5ihRO&`9CY8h!w+I`HWR3mcW!*z%0qr7VqEdGs#j3Bz z-nAI8KG}1|N~}gM5u4=6DH)0S=JNHm2UWF=`KPk@jA8thIx=-~M0cRugy7I6H#THoMBR_mW{f$BrQbnP#Lv&6}5N*C5!b{ue#x}I-bwV9sjEl6JQT*{Dcw3 zcu?!c8n(2iU~CTN3r9~H0lR2JVC(FjywSPEd|}Z&bRgfsj~Fvz)aYWKA6`^Ap}1%a z9$qx|{^HT23MTNa&-aZl8ad(K+~N`ZprP4!4#0&)lX54(Y?FIW?t~E&i*aFIE}1@X z%r;)@?w+M}gKqQ#<0g(CQJi0t)0#sjuHq5H3rJ4R!o|bD*o453)pP4wFMQ{!$wQFW z?>ECTS+ZBes9Sc5l}bjYm)r@g`lKymHDcm<>ck*sNdJ!RcAGF$MEA1MWUJ*H@_3Df zne2B%4JLMgHvPUOB>pt@2pn9}@@!DXl0eZC=)QwIe-!R2S&b&FYj#p5U|O4iM_mr^ zYJfY=lWQ3c(m@hn?`Sh**ewr1{=$FKQmZpt%*M3w-?w?5#*3rF+#>rGx z+D79o)s4mG1PE7*^QxHh%Erx&0>wqg^RIqqdX zV(FapY%l)I)wrWC8w&qHO^{!J}|VrCC(c10!g=g z1FEIh`ItaKdEomcfmdF*F3$R6If=9OExj(z+FMTItbI!%&N^QnIQ~Ll?b4X|>U15g zzBRr&UrypHpo948%jZda^%iLyjjx81(lCXueqMJUX&b~>zk8lullW?SImB1`auQ!b zk|#+izS{CU6eDs#e07aJ0f->J`olFG+lJG$@lv<(qVZK5ulP24?Tx%*>Pc?nrEB9w zdL|A{;}Kw1_JTbd*vj)+EX6L zc`;{mImB0+%X9XXLwvQbyd}Q+L%F4fpdr5cLpj7(^kS3cy>iQ*a$nAiG`{NfB8jh* zFOv95`C_27Jn(pV=kZnl7dwfsTFYN&`%--MR=E^koiD#3zMAvme?ffpfaSJ}wm8d3 zDbh05y-32Wwg~GmxrPYqyBBW~VeRQS!rJ(g2Wfy(`{e=4%eu#3CXv+8a)_h=BoL59 zfCd1GmSA{WUM5k-keCSRM~IMKDqnB>@nx6;LNDvkvrGawzq*zN(Rfb9=)$y-@vU*t zh4Mi1%f>`T7yk-jel7pUmm%Lb{H69Hp!k>wC_v0eMa_sn$&CIbK}*rt;iHQRM~sKK zr*OpGML#!aiH%vVyYJWYzRAg~rLWjZ!?Z zdj*Xr9(>jK-mA)Y)$vdl@%xOYkhTux78o(yzc;_eK(v3c@5Am^{{ltZt#isl;9L2#;$SU(*bR88aq7-)emRvd%^7mfWNLh;cEswITJj?wBpOl zdk=*VIUK#O)jz4Aq+rtRy(f)Y)bteja{c>{=|6ZdNfY*Mc%qp8 zaL{r?$AD5}vDcT*&&tZ04Bt{xXfROHa=>!vP|gaUeE5vvIxhd;Qajg~W;%Rp*_W}x z$1V5WwGx(}oSf06k|jCaLpRFeb+4`nm{-~cjruaD*NT4q0zFseq^*$Avq3sj%6|R& zwNP5V%;5n+DU2{D@1el<$Y*{c&GVXa{#S43)>yT#UcAb%SFq+ zOUq#|MEi!AWzyRQ1#WvIXnbZxVB!kn!j5B`e&d|>d( zod@*HmwV2uYo&d+#;F$>y1&+Rb?0?X4VKNlh}tBzrW;$kgQ^wuOFGFodxbtRXk5I) z=w6}ci1cyrP$SumoCKh8-4ByjxGYK2>o``WQ)Vt+`O3=Qt=zbB+e%qd@3d~2ft3eW zo?LluW!$RPJrz7*#PBh&J&b<^ySL*f6cys)5&0uvD|mDt^` zncTeGyJ3%ordxMm0EMO97fOUjPAnwh6rsXnb0?0Mio&k&__4XeN8luQxfAx5dXK;V zo;<7_o;!9thV8TUHh5^qCW9`W|D}!pQqQ&CKl)N1mKLgkg)4pgR&FZ#2HqNhCn$Ep zQxJ*%I)AQzr%C4b`kyC{Z1@krJ-bBzA^$l40myyLzZ!1!vi|yV3$wgVjcih8`BJ1ZwYt6mL}n1`E-+Tz=vH9TR6La z3tPO_TKa&&ZMqHX=uOP7Z+0)t7@0vjbrN$bkhhBL=)fake-9q3Xi#W0n*W#`oL$kN zzvy@@SQ5++R?hA*FQuRMN+w|8J%P#^J~%sDR&h}ISP~zCr$}hbVBEM07Fe*~Yz!ZQ zZEV=JHm)N%kcL$i-O`RRqQ-Uq%;$%7tLpl8#Y70W8{0Vi{WU>jDvlaAukmN+bioZ= zvx$*KogAe71N{Rne_9h9iK0$a9-YU)I{=&4^hN`m+svAe%zXLs>{*r%)jmX-#Y`IMXMryarTmyJ`+T@Wn7Uvpkk=L?hjb-^7W67HIp=-)5#cOgv z+!cs~-|BOb)$mpkkWZb^T^ntj+!d2s)H#1%V<}t%O|^_%W8AW)aq?f*bWi`)n&>P9 zH?u$f>bCC3g7rBctohH{QF{Vw*R*Z!!ERsoC=`&(T+x5$qFWF=29cpXzf=2Foo>q- zc+3Oz4l^Z6PJwjeW~j-AlWp+4Mz&fB#Wu<1jgMt$uPSThEL_^;>-}kDvsrtN7MDrI z$u0EG15G_SkRHvPIg=93oGHR*CeqvPv-YUaBUJOT-dtLPvS((`{r2OzNUt|jxArZS;t_Tjvfw)BQpo*GL4mQ+OAbmDz01TZ{xwWK} zo_oqmt*EDU=Eq`U8ge~cQbDe*r6m=maCVgf2jF9c3vvy>M(~t5tr!5*OR6F5L*xhZ z;E!BD7NJih@>bM*_uY2_)DIc1(oz&DEv+amjR0N{1mG8*Sz1~;GmONCXUw1Ruqd5N znkfF0QX2v+6e~p_ENy=psNv&}=c9(wne%6sHlU`Gl9Go@MO1TI6c5(apqhq@-+cn- z?3pz+H8ZnmeI>w;Tz?IECH0eXAg7hc<9dMbwUT<^XgOQ;2udFmPXoW1*`z4JTM3<5 z^OD{I^;t9=qVEr9xZLhi?q zPp(}haGhnIZ#K_|Ya7vcMW|%v+)`*SynIR938BAS4s8jQ5Ct^QT+%LtW{L+7*1-8& z;7<(13MY~e*A<`uH233=E1;v%w{wX;01pbNKxT7=*__oAu1PVQbO!msAP*iCiLHVL zW)i*x4F!;EjNalxYQ5g6*Q>z<=z+)uWTCm=0x29H50*agLk*0UVYLjWWn@|=PRq!( zj6%yOwTw#3#A}%ZxYV(US}s+~bkQE7cesF@|S`T`u zfvYBB>gInCPzID$E8iPx2iD3kB|wH$>1_H;I{#{%bbbMTOacxjeyoF>+4!*;gxT)+ zvB~7R;M#e=be+(8z7c=Z>lDJbHh!#@oRx4U{A158`K@#})IYX0zoq@Jgu1c2>dkT@e>#~6yfs#KRtu-`FTuJg`szK=~|C& zh$1Z7-{lAG@VH-5C`9L_@=Ke)a$eEoEqSKcUEF;1nI{t2NsgzM6blu?jKn0?ae3n_ z!XrX~dNez$j;(wA?Z-b52faQETb7j`KmF)N)%3HU4t~2~U+I5L`DF1EcuAe#$djb{C){ry=e6vyb)>UAdPd3=T*lg)TJ+q<2UBs zom-5C>_f6zZ@R_10}Z(a$;Nnp%XpuVRO-2=SxE450HEEDp&sMo2!RHlLsg3~;+VUW zMZ^rcyYDARH~LR^FF}Jw=Dy%TWtNg<0-C0*exa$POkr3Q4lO{ufCW1$a9~d>v{qwb zHcB~xLka{Nh5$1zV1d&Q8FJj`%Pbh;tMc`(9$AT=&{UR zHei-V5d&rfB-&frd{YUkJQ%r|yGul5VD8q6NW)l^BK+`+cQ;6b9B*MyE?V~|jB*Vr zyF-Z6+Vml$Ncp}bgbazJh4avMCzW6=;e%d-DG)R1NMu?dn~x$KW-^h;VI%?$qtOTh z?K}Z5wR0EOMU)1aVOmi?D}7Yr`0%Tt{2&i0OkFG(EK%duF4h8!#G$Rv!gTOuKEun_BMm(L)l= z-15B_l-b-W&k*GH-GlNy_&N9~125j&8=;*T!-P_gG0fdCmLxfDE;8lsxvNrkD?(gJntm-Ad8iek>#QhZ5V(KBimC*R?9AOfjEO;aYd=AnyFaL2gfta- z1saL;rQ39<_uAPxGbt>_#P{+C%%%t+?$)<%#f z&H`>;q4MsA|BjICc&px%o5}ylC*&5S?5+xN)oFT7NU<)x#2^@i(E_oYe|RK&?5>OJ zyvXpbVI3IIfe;VSWe~i-un%G+h@Fdayt{WJE}vRaMd(jpOTSLp?Fn(8rRhQYZ>5(o zg5k5#0@G?m*=s#}f9YKG^Q_2p6Mq0dZFLr7_&u!<{Ie1d65QBE;h-2O<)?a3$cN#Cjzr_lSc$O93Jd(!=e=vtE4cO=8UDVgu1N?Ub+~mHQ#1O+D z$2b!qAI1+O#lXT5{2KLRTosCdH@lPgH1vD;Vt6!&P*I4!C!P-8!2qwvCK9>X zR4RQ4i3Z$m4b+Rl&tyUg@RYz?f{cdP05h9Fb~v#L8AmKcp+I4%V=t{!PTQ4A$}+SD zzC9UY{G`-ty{W%4)*}Jof?|&cxhE9Av=lvEe9y9%(6n(2AASWfqvd0kAa0yW`-)s+ z42Ql`7&sY~CmBT;%u=YbqKh2vR*OOkoVt|2fxD5w;eP$}KHu?v$(g=-Uq96&zNY7r z6OPt5afxxY=feu5sK#LpQt&uzKr#mo+Y#r%5jUdkyqN?{J&{~qOmv|v_B0{4c8n*4 z+!bklLQjPxmY8bx$CZnhBC+T+4J#4R#~5Jq+`j3SB_fB*9&kf+U~(P`F*q}yXw&!t5*Tc_j6%?kIMQmCZR-QJD@m)az|R)oE;?d= zeO41q^j*G0P?q;wRwpEy2Ohai=&9|;boYrU9sOx1W_qHhj$m&~{E7-Nu7b58#-IK? z2|BhSVJWf~-^0Iz4CB1juOQ86wqOZUHBOfK3gln5pE}cbw$+MMU`0%#{FC!xgt#}zkH{--!;qG_aG3dLtw;zV zdxp0{K->tHU5J=_;_4T&D5JK!pa|*b%R`FG@_ZDAQM#;WggL^hvm(q+=JMm@mkOUB zhXLlFBtJEqzlB83=?`KdqkSu4s1>0btjHcw2$J?Cc(ZX3OUu=hc|+DRCSGbnPpe)o zZbHW7JX;7cnWM4<#2A;J6cor19v4!07}?_@=V4hQ0h>&v`7f}dB22{p`BrrONEVuq zT{~u72pKZG)dJFtU<(#9Rrkm;7jnLg+GIgdub;09DVpT@abYgZEhComkB?;12d*&k z#)ZEi=A(F*7*yC5QNWmJTld|p53ZLWb}o8QKp7+0bYevc8^Da(ErNp4&wm`WFV7zr z<~-c8$0LlV)rxwG=*Tadi+-LJ-OP(4;RuIhV~KCluOpF>k$QrW#5XW6(s{QF8E5RR1TtS!X{fA{zyF_-xZS8i z@?37}*GPm&{`n4xxqhVSJ>c^&5@=e2qo}8o;x99m+eD$lgTwB2Ymml?o%+eP2-Pmd zuFORbiC%V5s}Ojw6BG)OwfPZRX9;bWiI$}`+-#)9j!K2MDU39#JecP=UFJfV;ZpSH z0A@^!7tmSlYsn#0pQuZ2LiJpIVg#K>rPP`ppwJ6)V@5}N^L09F&h&(}Zsl%IQ?^?- zLI`EsQ-(W2R=Xzez9wrQChrl^%CWhRL~I=A-5qhk_*hED0RunQ2)|asW6^++fU*5% z5-7YOh#6FQ)lEpF%UlXENs7J};H~KGU1)fwH`9lF5={0M)T658kp=bMs?@EfBWQ1; z*L)s*$|$K$C3wjrD&1_RBciuUP?pDstp+yF5wY4ip8!xwGnpPy?`Dn@$Q>7eUS3)f z)*ED*JV1#O(Z0Ny1QL}5HQrDYtdaA`Or4v#)Pod7`dWbFl6Jp>xPoQMDx@f=Hdi5y z`BmXlu)792(qsAnEv1%FMb2@~X)Q$Xp8ld{3pXB@n&cgoY=3GwYGhN^L36Ti``i*1Q6rw+d}D zVYC-{%@}<;RO_ih?q6#?3z7TtGajUMzm@4gdi!S-&dlRIRzpsnWB1RqqDUqWKOgvy zT2ZVt!!nl&NHLsR(J=Y$U5K0cyz)7u_-v_}L7KN-6&Pgy>>YS<9?yILJ?F*QUXTd4 zT9Je7+hp;gvc-P5x0XhFD%f4M5v!s{Uei&lrgxr4u)2FMbPy}@3WCe7^N^Kz*n`k7 zvm(YDg85AGlRnU)w?nOckm}7mLdJ7}4^?H-J}_-F?L~Vty=EW!bhOs91i8z!o>##3 z&v-=bFBr-8;~qipe)72B(cAytPy*WD_%`VSw@>g`?UK#kY#el`cRCl%^kzPXe4lwU z8RUD*Tfm^I&+-ZwZ`I6grsvS!Y_EAQ%tcx{7fJ9JN)S62v85#uz2T=;baO9GqckhR zKFpjVZD9{MBFN6ZOQ7rk4|A>ZUATRs(M?(!@+va6?H2O5Tl3x)h|eIiZ<2m9U^yfJ zJ)&OWIw<*!)nH**%D-;*#Z-FzjgY1DF(c(u8YFQbTv|TN18t?yafJ0)>a!aphWb}y z^bWx@bOx7rv+vLuzm!5c*Rx(n#ATOx`LN3%L8VvQ_V{N8NtlYlR)7WV6RM-w+^C4U0!tvX;Q2N-ioSsAx(>)q;X5KH?JOf zlS{4jUSH~JSQX<$FU0Ur(QiaFol$NPQ7&`oq^Lw}=D3I+;Nt*gd0AmA!{$90v1Ulo z2uo*2hR&VWThZDkp#LYWC{~&`VeOG(tqUQP;rYFQkk6%^TM6Hov5@Y z(f)s#6&=PRLNRL(^t0l3h1Uanrm8#=xnJK0OLrkfYaf_=Xs;AUCYNT?K1e-+jwE_B z&m$j$mWgN@qkKgK%lQQ>kdH+DaQX4MVLg*@{19kgb^Hz52R6u&dh6#((7xVpMMria zlD(Et1!xuqCRYu}vp&3q&+ztP&n9q7fN|GQ>md(K%Ei z60fPe)dbRYa$Mdz61P|h>@aTmZ7!g)r_=Og7&ulpor(^Uql^A>sd@g&4#C25S)g+DXrxHuM6%w37a~4rbnS<8*e1{=NcXc#=yc;3hkY=W&w(MfSrJUrf|2!v4f%A~AZNTF6#`><--~fX%QfA}jYi zf#@j3E~4-y2N}E42%hO6&yxMpal8W&tA2}GX&xOB`E-scKq5Q?v6S4ofPeK1X@=&b z_o;>^(_Z?Hw3f~GkY_)92>Rg$tLEtaak&8Z%Bg%B?urSXvf`oyD%9lOHamMiJo&>E zR*Q^=l~+dqD%QbXA+v`USp%!$BXWZ*%>hxkYyg3peGa(emb%OX_s%mP_6PvM#UfmE z6rxt_$RyCdo7{(G^i+bQ^zJ`>20)fa?zc!#A=322H$vrW@bEmA(R_)9eS~n}B5g44 ziMCSQZ%_p0Vnp_Jt{=xO&qmO4@Js!0w_CA`lw->fnSDkReX%m4I|(wMP;JILA~L(I zha(K|I*A={pZ9;E#EgJNcoL!nM-1?ED-J7|XsU=fPFx-Vh#vu{z$ZvgT1-a z!Cedj^h(#YA-M0I;wCU5OnOUomBM-=M_fn?yZy2zCxK@L7`v>K>R?U@^f8;#M8^GS z6Fj@ijLZa!K|&^p%le$duxFmh5||Mo&%f#g;#vDR$nz~cg?T)A-b;e+5J``uIkE70 zEtYFq@+F$yw5(kqd?Yw&U0d0q0NE{zVk~+315iZ6Qpx5^KYbg86)XY zhNsUXJDqTchAk6FfB!^cb~Ks${`X1Dc~HcSE9>x`urdM!$mb!01;X$59$x z)90EUVe+K&U=Mk|Z;XdL&m_g59tZJkizp;9w_VbAEM$^-F|nl|&<;u|afpSIhm_#c z9{iG9>d))v>XtrsllmDfkRGLwqa(N#66@t6JXkLm2?30YQdxf@vFvwa!RG(BNvxN* zNQuzZ5bgjafEL?*g zfu1m+V$ih#)q&+3T5{eYX{HAsalDF>ktiG{bv5E^HG+5iX}XgZeMejL9&OPC+M*Lp zq(zrHZP94ju1px!8uTPhFGC{QL2CYWJN5sf7RBnwMqBhA)lqXyiw^VTeT2+vV(H7k z>J_MtSPtPi}kNP$!i9D?T)5WZk1b&A*39NUW6bWDq|;xGzlgXTF*qDw{5B6!*&aoO$=;*v7I z55dp#jlKdGH`hvEoFKLmc8*R~lkm|48?m?xr3;^!URqvwE6)o$K|Nw7G_CzOS)ox+^`D z{#nNE%q_QW=)I=TOD5NC&b|-dKB3>p{@DZi4(w@u-|QIl*`P-(7cEN%_ZaerA+|gA z-|_t&7w(W}wYIM9tUO^lQE+0$iKQntoTxo<;)L>~>14sl87G&X+;Fn?tzoL+i*!|B@7Cr&HRn9dZOnQ><6nGI)Z&zv};Y%(!PyySm!92lw)X6av&wU(a|P#SoLhQs!@1gXC(bF)o6Z-U zpK*Ta`3>i5&!0H2ykNReaAC%Ur583_sJ(FFg0k7vT+lqDd1>>8=Gx{H&25tY^C{Ra z>Ew77<8z&$F+AmZv@?94o8xOcD-W-$-V9&eS$P%4H^cLo+&^mXaAPck$EX0`eiali zIy%F%Zi=5cbs`)DL}QXro^?k&7)Lkm*tl^!0q==1$sHIoc8Z_q{9>YeBD}|XZ&FN> z;x8jo{y*U5R`M?Edy`_4fJbWy{^~@>#EEx*0dKrch>J-cCirs%k3;bCE`-YPEMH6# z@cN>2@PO!5cu5mI?kN!vJ0>Pc@kdP9e@Fw?*A80ZDaHHzsvzrFLU9z!c zOH6Vb;9ovq#CY4J=NJEQcuB1(YC0B^d!0e7Q~Hb$WGV{_!2t+IBq<5RJpjG%3t?}<02?pH@u3ATizy=p@qUVzz`Mpl*_=1= zrm}W&seog!CVQJJ{U@j&K z!hnzvn!c}R1SZ(TTiL6-+f-Uif8G6?ue-ngdU{^W_g#p8R=JV_?)_K5ou6#3y|Cjq zxhpB)zG1)*JV4to9Q;l0N(%TyKj7UN-}`rhucUzc0md$xX8x^fZSF0UfUrE(fA_%X z$KB1jE2&F@ag=#bPOPLcJnS5o@s+egE)K``yG2hieAV-%UFKi)3`leW;nUUTN3x7x zKe0+UD&s@2?%y^v%lP?K*iXDDcamB*jT2*1nRJa?%8lab#JJ>*S1tj|fsmyBwF-BaPJcp$_uV z7K&Sr(~wEU^U?$W_4eUF40p+b(#VKsV-w&tpe+Vs?ExVr`xHkggAQZ?ADkgD{uw0x zg@Wgv5Wa)hd_q|z`vYKWB{)#WF0k7|%AJT+OSleg1hx|Zi-aCSS_x<2g`b3*(0an> z0(=N)1BxT%u)!XXU}=;9Y%c;HCHybnit7o#2XI0g5IkWAa}|W2A^eQQe**A%ng14C z;_o0AHxQgC4tQ_2&(KIs_(m`e66(GcR}sGbSQBzPH^xK24p(2XQ&dd9 zTBO7n7-0f{@+FNzjIk``is6*-Wn9BbdCC<#y6=v`i~OidF7U{>Qdo&=IH|-V9U|lu z9t-SZq6m{P^5xZGNxsFsI;5k2F$a`gmWE{Zo$%Pvy~MSGKlx7h#U)NTv4TJGPPqH4 z`BitqUD7bE8ZE7xi_Oq+i>W1Q3?NhlvutnG6PZZZMD<8G)}s zJ$vs|I?P*9eE@#nD5^J`pUm&y|jt>Kh`co$~lJfc(KXymA@e`XQ89(r(0 zYUwsTFbXgRAHf;ZLpBy+7po94rxvkW(<3^KJyF3BnGPhtcxXC3fy7Q%AnpkqNccGx z)W5LV(ky@~^r9}9{vut4oE;?Rp{S;_%p@K47P`u@!^$d|Q1j+#*pmNko@ zMv06TsbFD3-LR=?Fb@S=G6Sm~*>Vv=+hBNdpNA)qKV^|J0(>K(1C%ioQVxec)Zp-O zqYLjddhl^YKYoh}%UngRW=t`K@*B!pg?4011w%$_{y z`ON+TzJ8<+Uw-2#{);2vIH+hiTY>D@QIj&gCL;>Bpm<7NO%r(_$o;FBuEIS z1?rn8A(^FLSBIm~UZi@r*Z2s`(&*d2G)7^TPIdNb_IjQ}>phv89uIAddKhC=meZUP@KiYd8TqECU_B2|9cebhra_Smw!8zvZFzJw;5yg2<^r zhsysO9saSi^mP}krLM=Q9@mWGV^~XXz*;&Mo2C2S>@_?O61qS_bAPYKQ6$gOZ7@q; zf?2u;W@*hAtl=ok(j$L1v-AUy@DfP49*#o?=x_)m%sjCanLH`mL-N!{A5yX>%2sO1Gz`r-+;}7BU zU$-VU@(35XPk_JKpIc_rFNPcpb~saaA?DdXrcVPm`@}{bM)OzDjVoxT5zRb}Lcc}g z@5swvhW%1a2>k-?wEl*ANKvi4H_o66sQ#dSRr5Qopv{VZJpR4-n?9B3nX73fH^9C# z_&xxOg%#>sb8r%aCE6Nk2 zk`-tkDHADWqCyGxMmkEVS19#JX`tc^3Y8wk=_!>?5vN0{L`t2gQ0u^GE~U{c)Ow^b zP-=rhqeogj6|Yky=vI9m2bVbChHppU+Y$I*903Yx?GdyyEodrk{Jy0@Pye{NEoX%vfTWtn!1wmrtLp;RM)pwwEQ6NN0m0>?|ScP$wW9mJNAAck< z+w#!8rif$>e)`ZE8e9R(w&1S~j83(~;zGiPT`3KFY@PR-79ReQfsU`y(^GsB+9hEr zNm`Ur@JxHo+d;Jgycv(>sfms7(Ijv=Y?|buq+%oLT$=&jXCa-3ByW||X@7EByCG__Jrz z3fj~5?tvZst&zcX)9=p`M`F=2U(KAacFy;}oNwP;bd)$~of?SnSzYZJ>0RyJuhDU7 zPquH*It1B6?Y!?VL#M!DunG5{%UXl&1xdI+Q&pIgg!zLIWmxfhw2E|(PhW$}0VPm@ z5qrl!5W7qwq&^UNBKX<4G_(s0JW0}!3?lwL5d&^3^3d3&wcx2$GH|a({t^?0%6Nax zI(+aakp5U-z-*G?6bpDmo;XmxS3WCo6Ue0iUpP(q|{=rHY8Y8N!!EbB!kHs zmvmRytTiC8xS#avu)q14aL(_;2XoGa!MPZC)$JIzYKQYM@%^!lR;tX2qCRt-Xv%Cj zwLJ{Ab!Oz@xGqtbe;Hg(6r2n9)2gl<=v7h=s2f@NoT2bWU{v=(!fb*;G|o~92;3}B z*})CxTJy(zclLul+50p2uKvuw+p2Q%K*q z#4i@F^{(;%%x|+$@kNF76gcW!lm2r1#3g>eTHEK{VWFP(-ea2MiOX{D`e**ZLOoSv z3VPS)yxiWy_tTrk-XHQkK2MyEU^=*%$_!o_809O{exlq8M@9r(oP)<`=@J8u3IuxV z%W=(nyUkkbHc0p`hYQR>k;>O*f;I9;pV{D>ou>>DD{qdY%#l8Si7t{eGhdJr?9bfP z?MsjN5+mI{3n4vn4qUcJ%$t$|ANm&NlgtYw27m4l2T9y>#xjfwT=V_shIvD_E+v0q z;z?*TJEiU5DRV@$oP$P48^fS{dfG~xgVzG75YAY{f)CGV_-jV<%;@2aG2l1PrCF#g z1#$T4{jf-pwW*UAY0ElMfBuDts6GEyM2tT_6cJ75KZ}5vFaiC$?+T`j6)3Uyd*nw7 z)2)%Do&|DQ1r_~u$LNGwOO~)q2o&uU>HMTV;?G_QX)|&AtHeCyc>w!qqcv5= z`e}_d+5AbN`O`x4RRW!>DA*XZzhU{0r=W(A`5oU|5paBIkC@NG4EX;N7*vdG@bb45 zK7=Yq6*NN^(>A($ZkxNrUFt4#m%A%ChAZZ5TnSgom2u@~({`qksbZ>`8m5-1W9k{Zv(j1RtajEoYn^q@ zdZ(SOWUJU}wuY@`>)3kM?yhuKxvSkZ?pk-9yWVZ*D!D4InycYzxjL?%vkR3%l~66z z2(?0;P%qd~0~jrBLd~cJuI5`&8{I%R(oJ+T-9kI)R=SO8U>cbwrkQDB984?I=4@~_ zI-8u$&K9S`+3IX#8`ws+iEUyaXf!D?b!X0@m-rbb?pAHWd8F4 z@lsgo_q6^(;wKFk5)?xXiVu}QfWSD7D#2yTHW*)6Fo4W0aBb zdV))Az-QG$u)@1Bg~CS4ODhjlmO?p00`S>>`ePfZ-}aNH>T;map0ponjgjiJHB|#2 U$rHYv%uWTVM>LT@+L8AEZ?AQiumAu6 literal 0 HcmV?d00001 diff --git a/main.cpp b/main.cpp index c3b7413..9871456 100644 --- a/main.cpp +++ b/main.cpp @@ -10,6 +10,7 @@ #include #include "ui.h" #include "ui_menu.h" +#include "z80analyze.h" uint8_t memory[65536]; uint32_t time = 0; @@ -24,10 +25,16 @@ namespace actions zxscreen::refresh(dt); } - int berserk(int value) + int fastload(int value) { - zx_tape::setberserk(!zx_tape::getberserk()); - return zx_tape::getberserk(); + zx_tape::toggleOption(ZXTAPE_OPTION_FAST_LOAD); + return zx_tape::getOption(ZXTAPE_OPTION_FAST_LOAD); + } + + int stopatend(int value) + { + zx_tape::toggleOption(ZXTAPE_OPTION_STOP_AT_END); + return zx_tape::getOption(ZXTAPE_OPTION_STOP_AT_END); } int decZoom(int value) @@ -47,6 +54,12 @@ namespace actions zxscreen::toggleFullscreen(); return zxscreen::getFullscreen(); } + + int showAnalyzer(int value) + { + z80analyze::show(); + return 0; + } } int main(int argc, char *argv[]) @@ -73,13 +86,18 @@ int main(int argc, char *argv[]) ui::menu::addoption(menu, "SAVE STATE", nullptr); menu = ui::menu::addsubmenu("TAPE"); - ui::menu::addbooloption(menu, "BERSERK MODE", zx_tape::getberserk(), actions::berserk); + ui::menu::addbooloption(menu, "BERSERK MODE", zx_tape::getOption(ZXTAPE_OPTION_FAST_LOAD), actions::fastload); + ui::menu::addbooloption(menu, "STOP AT END", zx_tape::getOption(ZXTAPE_OPTION_STOP_AT_END), actions::stopatend); menu = ui::menu::addsubmenu("SCREEN"); ui::menu::addoption(menu, "DEC ZOOM", actions::decZoom); ui::menu::addoption(menu, "INC ZOOM", actions::incZoom); ui::menu::addbooloption(menu, "FULLSCREEN", zxscreen::getFullscreen(), actions::fullscreen); + menu = ui::menu::addsubmenu("EMULATION"); + ui::menu::addbooloption(menu, "STOP ON INVALID OP", z80::getOption(Z80_OPTION_STOP_ON_INVALID), actions::decZoom); + ui::menu::addoption(menu, "SHOW ANALYZER", actions::showAnalyzer); + zx_ula::sound_init(); zx_tape::load("fernandomartin.tap"); @@ -206,9 +224,9 @@ int main(int argc, char *argv[]) zxscreen::redraw(); } else { //if (z80::getPC()==0x05C8) zx_tape::go_berserk(); - bool berserk=false; - if (zx_tape::getplaying() && zx_tape::getberserk()) { berserk=true; time = SDL_GetTicks(); } - while (zx_tape::getplaying() && zx_tape::getberserk()) + bool fastload=false; + if (zx_tape::getplaying() && zx_tape::getOption(ZXTAPE_OPTION_FAST_LOAD)) { fastload=true; time = SDL_GetTicks(); } + while (zx_tape::getplaying() && zx_tape::getOption(ZXTAPE_OPTION_FAST_LOAD)) { // zx_tape::update(z80::step()); uint8_t dt = z80::step(); @@ -221,7 +239,7 @@ int main(int argc, char *argv[]) //zx_ula::sound_update(dt); //zxscreen::refresh(dt); } - if (berserk) { printf("%i\n", SDL_GetTicks()-time); t_states=0; } + if (fastload) { printf("%i\n", SDL_GetTicks()-time); t_states=0; } // En cada bucle fem 10 pasos de la CPU, sino s'ofega for (int i=0;i<5;++i) { uint8_t dt = z80::step(); diff --git a/z80.cpp b/z80.cpp index 34bb329..e286f1a 100644 --- a/z80.cpp +++ b/z80.cpp @@ -9,6 +9,7 @@ namespace z80 static uint8_t memtag[65536]; static uint32_t t = 0; static uint16_t current_opcode_address = 0; + bool options[Z80_NUM_OPTIONS] = { true }; int (*in_ports[256])(int); void (*out_ports[256])(int, int); @@ -1032,9 +1033,8 @@ namespace z80 void INVALID(uint8_t opcode) { - // [TODO] printf("INVALID OPCODE AT: %04x\n", current_opcode_address); - z80debug::stop(); + if (options[Z80_OPTION_STOP_ON_INVALID]) z80debug::stop(); } void reset(uint8_t* mem) @@ -2738,4 +2738,19 @@ namespace z80 uint8_t getMemTag(const uint16_t addr) { return memtag[addr]; }; + const bool getOption(const int option) + { + return options[option]; + } + + void setOption(const int option, const bool value) + { + options[option] = value; + } + + void toggleOption(const int option) + { + options[option] = !options[option]; + } + } \ No newline at end of file diff --git a/z80.h b/z80.h index 957efa4..7920c39 100644 --- a/z80.h +++ b/z80.h @@ -9,6 +9,9 @@ namespace z80 #define MEMTAG_CODE 2 #define MEMTAG_DATA 3 + #define Z80_OPTION_STOP_ON_INVALID 0 + #define Z80_NUM_OPTIONS 1 + void reset(uint8_t* mem); void connect_port(int num, int (*in_ptr)(int), void (*out_ptr)(int,int)); void interrupt(); @@ -34,4 +37,8 @@ namespace z80 void setPC(const uint16_t addr); uint8_t getMemTag(const uint16_t addr); + + const bool getOption(const int option); + void setOption(const int option, const bool value); + void toggleOption(const int option); } \ No newline at end of file diff --git a/z80analyze.cpp b/z80analyze.cpp new file mode 100644 index 0000000..996531b --- /dev/null +++ b/z80analyze.cpp @@ -0,0 +1,43 @@ +#include "z80analyze.h" +#include "z80.h" +#include + +namespace z80analyze +{ + SDL_Window *win = nullptr; + SDL_Renderer *ren = nullptr; + SDL_Texture *tex = nullptr; + + void show() + { + if (!win) + { + win = SDL_CreateWindow("Z80 Analyzer", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 256, 256, SDL_WINDOW_SHOWN); + ren = SDL_CreateRenderer(win, -1, 0); + tex = SDL_CreateTexture(ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 256, 256); + } + refresh(); + } + + void refresh() + { + Uint32 *pixels; + int pitch; + SDL_LockTexture(tex, NULL, (void**)&pixels, &pitch); + for (int i=0; i<65536; ++i) + { + uint8_t tag = z80::getMemTag(i); + pixels[i] = tag==MEMTAG_NONE ? 0x808080 : tag==MEMTAG_DATA ? 0x0000FF : 0x00FF00; + } + SDL_UnlockTexture(tex); + SDL_RenderCopy(ren, tex, NULL, NULL); + SDL_RenderPresent(ren); + } + + void hide() + { + SDL_DestroyTexture(tex); + SDL_DestroyRenderer(ren); + SDL_DestroyWindow(win); + } +} diff --git a/z80analyze.h b/z80analyze.h new file mode 100644 index 0000000..b5a93b6 --- /dev/null +++ b/z80analyze.h @@ -0,0 +1,8 @@ +#pragma once + +namespace z80analyze +{ + void show(); + void refresh(); + void hide(); +} diff --git a/zx_screen.cpp b/zx_screen.cpp index 4f3f049..2adfa1f 100644 --- a/zx_screen.cpp +++ b/zx_screen.cpp @@ -181,7 +181,7 @@ namespace zxscreen void redraw(const bool present) { - if (zx_tape::getplaying() && zx_tape::getberserk()) return; + if (zx_tape::getplaying() && zx_tape::getOption(ZXTAPE_OPTION_FAST_LOAD)) return; Uint32* pixels; int pitch; diff --git a/zx_tape.cpp b/zx_tape.cpp index 895dfdf..2888446 100644 --- a/zx_tape.cpp +++ b/zx_tape.cpp @@ -1,6 +1,7 @@ #include "zx_tape.h" #include "zx_ula.h" #include "zx_screen.h" +#include "z80debug.h" #include #include #include @@ -34,7 +35,7 @@ namespace zx_tape bool playing = false; bool loaded = false; - bool berserk_mode = true; + bool options[ZXTAPE_NUM_OPTIONS] = { true, true }; std::vector blocks; uint8_t current_block = 0; @@ -80,7 +81,7 @@ namespace zx_tape void stop() { playing = false; - berserk_mode = false; + //berserk_mode = false; } void rewind() @@ -220,6 +221,7 @@ namespace zx_tape printf("end\n"); stop(); rewind(); + if (options[ZXTAPE_OPTION_STOP_AT_END]) z80debug::stop(); } else { @@ -232,8 +234,6 @@ namespace zx_tape zx_ula::set_ear(pulse_level); } - void setberserk(const bool value) { berserk_mode = value; } - const bool getberserk() { return berserk_mode; } const bool getplaying() { return playing; } void report() @@ -242,4 +242,19 @@ namespace zx_tape const int percent = (float(block_pos)/float(blocks[current_block].length))*100; printf("tape loading: %i%\n", percent); } + + const bool getOption(const int option) + { + return options[option]; + } + + void setOption(const int option, const bool value) + { + options[option] = value; + } + + void toggleOption(const int option) + { + options[option] = !options[option]; + } } diff --git a/zx_tape.h b/zx_tape.h index 50e39e5..d9a9122 100644 --- a/zx_tape.h +++ b/zx_tape.h @@ -3,13 +3,19 @@ namespace zx_tape { + #define ZXTAPE_OPTION_FAST_LOAD 0 + #define ZXTAPE_OPTION_STOP_AT_END 1 + #define ZXTAPE_NUM_OPTIONS 2 + void load(const char* filename); void play(); void stop(); void rewind(); void update(const uint8_t dt); - void setberserk(const bool value); - const bool getberserk(); const bool getplaying(); void report(); + + const bool getOption(const int option); + void setOption(const int option, const bool value); + void toggleOption(const int option); }