From 3ba60c38de6bb221cea4c2da4a0f622062639cae Mon Sep 17 00:00:00 2001 From: Lesserkuma Date: Thu, 17 Dec 2020 01:12:55 +0100 Subject: [PATCH] =?UTF-8?q?0.9=CE=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/FlashGBX_Ubuntu.png | Bin 70138 -> 67162 bytes .github/FlashGBX_Windows.png | Bin 14322 -> 14370 bytes .github/FlashGBX_macOS.png | Bin 65121 -> 68596 bytes FlashGBX/DataTransfer.py | 44 +- FlashGBX/FlashGBX.py | 440 ++++-- FlashGBX/Util.py | 107 ++ FlashGBX/config/db_AGB.json | 454 +++--- FlashGBX/config/fc_AGB_29LV128DT.txt | 53 + ...B_M36L0R705.txt => fc_AGB_M36L0R7050T.txt} | 4 +- FlashGBX/config/fc_AGB_M36L0R8060B.txt | 86 ++ FlashGBX/config/fc_AGB_M36L0R8060T.txt | 86 ++ FlashGBX/config/fc_AGB_MSP55LV128.txt | 39 +- FlashGBX/config/fc_AGB_MSP55LV128M.txt | 50 +- FlashGBX/config/fc_AGB_Nintendo_E201850.txt | 5 +- FlashGBX/config/fc_DMG_29DL161TD-90.txt | 28 +- FlashGBX/config/fc_DMG_29DL163BD-90.txt | 75 + FlashGBX/config/fc_DMG_29DL32TF-70.txt | 21 + FlashGBX/config/fc_DMG_36VF3204.txt | 10 +- FlashGBX/config/fc_DMG_AM29F016_AUDIO.txt | 2 +- FlashGBX/config/fc_DMG_AM29F016_WR.txt | 2 +- FlashGBX/config/fc_DMG_AM29F032_AUDIO.txt | 2 +- FlashGBX/config/fc_DMG_AM29F032_WR.txt | 2 +- FlashGBX/config/fc_DMG_AM29LV160MB.txt | 8 +- FlashGBX/config/fc_DMG_GL032M11BAIR4.txt | 50 +- FlashGBX/config/fc_DMG_HY29LV160TT.txt | 10 +- FlashGBX/config/fc_DMG_M29W160EB.txt | 22 + FlashGBX/config/fc_DMG_M29W640.txt | 20 + FlashGBX/config/fc_DMG_MX29LV320ABTC.txt | 6 +- FlashGBX/hw_GBxCartRW.py | 1266 ++++++++++------- FlashGBX/res/config.zip | Bin 109625 -> 112156 bytes README.md | 101 +- run.py | 2 +- setup.py | 2 +- 33 files changed, 2035 insertions(+), 962 deletions(-) create mode 100644 FlashGBX/Util.py create mode 100644 FlashGBX/config/fc_AGB_29LV128DT.txt rename FlashGBX/config/{fc_AGB_M36L0R705.txt => fc_AGB_M36L0R7050T.txt} (85%) create mode 100644 FlashGBX/config/fc_AGB_M36L0R8060B.txt create mode 100644 FlashGBX/config/fc_AGB_M36L0R8060T.txt create mode 100644 FlashGBX/config/fc_DMG_29DL163BD-90.txt diff --git a/.github/FlashGBX_Ubuntu.png b/.github/FlashGBX_Ubuntu.png index f4868c1e030a180a5efa3fc8d35bfe750522b07d..b9cbeddd84939dcacfaf8ef2f2fa18c27db62dfe 100644 GIT binary patch literal 67162 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

U4%ZRe!im#<*a)hNEveOE+bb0YCV=g% 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⪚LX?qAm(^1#ntf=xAFFPW?ufK^+`xCL3 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 KvO@f$|NjH!hOCAF literal 70138 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�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

APvBG6#!d^5yMRFzb zJ=%InnyIX!nW%j^`1*VJ={6dy$YUa=&~l5SM(`4}r6c8osWnY(mZq@aJH*38Jvef8 zcxU*?s;O>TKM$OSH?y!KkQ*U*dyPNRlTmt}6x75v*!~m?6X&$I4bS~uXii!@!me}i zVq3@njVC;GhI`?PW6JysCx2o7QprP3NkfpsOQVN!&KV8rtSQ+Ztu!g2kddY1bD~Sh zcEQ-XdLSsgFAKr6@u7^k^x@(|zrKfdJZ2f)^>O~Ngr!SJn$gYLMXV$N3Ziz~!=V>3 zLmnqdyV@A{j|`9Xmv$0>?(I@siDhAdgyD;e{F3SB8gHM$IRu2*pS{Dk;$I=u5q;Qo z8cyTlN#<=34r)A|wpH-V4~>ckiS7ZVzg-5e9XgE4q;#!|KYLNELfRkWgc5D#Il~+H zs)vw^BtSl|TFwXf(&Y@@-+uJYcob1x;d z%MXoTyb#=m8zb>cB|)~a9cVvX)!V4IWZw%>-v; zUm~T{%iNc)T#z^oWbGSxcpAjvwf~(}e#xa%X9jP~s56^3;0i|w1|Fbg337VMD=I2% zkq#}$y|*#GkHYJ{!BC%MI}$MaJp_H{gDSG*7prG4PK&NSS(El-=mHI51j+_oVH2>kM8liiwBP{Ez+Ny@Q>YZd7pPQ zup>?3t*HhIUNdNAd74FFo_$s1;}@4*s0AYXyqC!Fr|~6p&5h0}ILa@Rl|4O!3vBqz zGv70W_O^j9mV`RGWs(CZnT|lJuM*D0Pd`cL~E83@bKFljWC=X-@H}Yo%8l?7t*aazJ*#kzJ!86@al{PO6pCv5{fc&Ht zjeQTq5K1;<@S;}quq>g~l9IWLtj_;Zxi4P!Q94^{V~4E zAXP=p%zy9a6@P?95eJ#F7iak+JUjF0kZ0hKGmefYi!g|J^-}mju%KpGJSe z_4V}u?KT5#KE0V-6DS6_-+N0LI6<`GKeYq?eDj^W40K+frTi)Q|3Xaqj%-3e+D zFHHBrVnF&2mu-c*1dzM`sP0}1c)@)-uqWgH__P+NKKsAIqCIH zbwqse` z#mR_6?=k{VT(95`bjBO5-hKTVcdWPB5HUe}9`}H#Qu1#4144cnW*%=CVYue&AdiyG z=WO)#YLX>9;?6FbXS%%A=Mc|MQdo*!bkpL23CZRcymm`_t3KdDU;-*hi9HlD$W-Up zXPLLR?yIt3h287&=x6+}8lVn_d$8{aNi4z9+jQ`CG8wQwagXRvm5foHV+2KsVi{q`-)v5A_JefhjD;TJqbcm4 zr>DbcwI+8NB;w?dy=^(G)P9ap>VF4uII4Al3vdda=tN}5(b&T#XmR`Arq-?1n?~?v zq9Vz>UO5g>C}2XYRQ=#x~CK7e$FzVM-}mcI1U vbm*rJMEpi$DA$_SYe>J6*U&iijO&KI+Yq}rDFgAksg|1Xha%j=!T(& zp}X@Q^n2g;^Sk%Gmp?YcKKsnsXYaM1^*n1Yf|V3x$Vg~O@bK`+-oBB3kB5gZkB9e< zDltCLQ<TXzhrU}=U|h~)I+1-9c)Q50-9U>`rlO5M3h z%62<~`5@$GumFDfH>UXeUanf2TP1O9%~pQpH5ZQb*vG}DJ-mV=BODwBJTfoi<{O)4 z>Way&wkYp+leGVHZ#QmAzCm4Ve^6yetjNq`@laz5VwP8vpP!$-I)YXiIuE-zNfwuR z^zF^#e)v!2<4wUk!P1Yux$rcBuRi>3zs=BHb-uBWxN0AR{tiF3--uI;^qEu3Y;YY| z8fuW)1+Lw(pavb{J{%$?E`y*Koyix6(U=Pvp~(|=?lU0?3FPs!^Ay*!zNyQ3Ma=O9rtVZ@^AdYld)d%%s^N1kH0^u3Zs&&Dy*$?Un0@e){%RUQ zJ;;XbMd;>f8im+?uA=vLsQy_Cx6if?=43cCQv77AnWABafZJ_Yar(&kaxJ2-kfJ~0 z>RFRc_Bd)ji)evkec!XfG~}VIgU>fD4(&|LPWa*FGQ0k9C#%@<+wAP@NQn!#CZwIu zZZZ@K6`FDyXgC@XinJA_n>ry1wz*uWZ>tl(?BiAiV?1#pr>b0aiy{pd?ix$X`VCCu zecp%a`BSIsE*6QlKE?1CF4-+C^?7=sUIHErw}BV1d5WXbERRs#S|h@o!X;A@k?&Dc zJBbaKWet1vhnI_Y(~f?}*DgF^Jn4l_Z%4S+o(vWFw6K5J4w|s@-LwNM9rQsLpQYs)F0P))S$qnA15&PAh^0VmHPV1zGO8mIO|Z-w~kza9{{WMgUF`ay0`DoOse=;?nT-%)*aON&Qdd6R$wkK%oxw) zcpqSo(Y`)nN{42#7hCDj>D|@C^WU-;%}bm0Y!c$QWs@jwY1uLx8`fB3W6J3Otm@Y5 zu<#E0r?*%*-jvjgkJm8ufc5{`gcpPsjutSz1Dv9+e_pEz8Ey}EyMGpxMlUw+oEeHq zoIE|s7WZD)zt~fhI7Fh)J2mQeu-v}K=}?A~6^#au%k#s_;cKkuqd-j3gxwfw&0JGW ze)ZP0WEW-bIv5c_n-+b|EfRD19qhyMdOj};jJi=UeQ2#9qwrPP@$uae|;P6zEz?ZDljTK-9Ha`ULocEQr<&;@$r?nBb;}Y=vG23SQJlP zB@V4HZgQi81PkKF%T_}5ScLC_bK1ICytLa>s|W1-4Qs&+a}WYavwrM4_@xrWplHv} z=d@mC+{^gAiK?$e#e20#CgCePBs|gmoa}b2sDFw`_1vat*z2KnlsKEEz??qNNITo9 z=@R;Y;x&7oP_Hb8r}6dY6Mde>xCBWWkZ20!lQ!IMQR-PwRsHjBYB6%w)JD=z*@TyK zGS`sW0E{Vt5u51X8lvUbmka&LmjimQ5Eq4;XJho2+nm1J1V!=^O!d3Dm)Gt9{va)k z;5V!F(-Ge-AE{kkaFy6Ex>#RL-Rh1H|FGL3W-Ias>uTDN6XJ&f6Bjc@7lZ2(J2BJ| z7w4O6t`mRYar_nP3iyC`x@rOIyK4VOm zhb?8fqIV44s8(~DV`AkHKg7$I>=ot-`7QkpUiO*jT!LDPWY46jjwwyx*8(bIAQY^F z-bEVBol|1f584(bA=g72?;UZj5@1`C?BICH@40u|HRKAYAN536S+nb7W*BIw7pFGh+b2l<4_2^E4$CJ zgWt)Bx}nCGE_}_fYSb>*QL_GN_mh8Md77qdza~AOu{wi}fAPs?y-d`{@N=nI9X_QY zQ+kTpcX?F_BZVbS<9KmJIR}a}4`1MRyYvNcF_bekr-CYa4-&0dT%W$CHneZn^y*J2 zqt8nW;cNsWp{QmpA>5plKg1r6GqJk-6h8}N|7Sd1Z$=mNonG%oPya_dE?r+5lsjuS zFPFvy?;`(OF^VTDyn%|RRB8!uLxscHJsfPAdZiicY~DJ%$4;{@j=Qs~6c%cmuKz79 zqP2)*{W?w#nwYGv9ASwA#ivfu9pSZnkDt9G_d(WyrXwVU0P)?YU5^T5J8A7nC64Gl zw69((HW|8j7j{p93WxRkT115fD@2IQZIZG(yi@rF} zi?aDFez6^?U+uK)j`p19OWh8ev)e|tk7Yqhc8Q1qWQn{a!M5lI|1 z6?v~)0lz3h8d`9VvfD3DMjFKT%8LJvuR$TP43B;1A7GA#5%v2eZ492Gs^4}i5p{){ z!hc3p{bIZZJi0IiGQTAtK9(@YzBEpPnUd8%>959IZb2oy2IPe(ZR@Tkg5rq#dFGjm zXyuxaXEiqG^!)TQ$o*6B$U-x6y*gWS?c)~yo@7DabFxa(=6EW$E@qXoc z*?5hDE+9`?gM%}ubS+|da}X-2X);n0vN}a?@XlYfk>z)7#WsVZE!iQnuz9YJvBz1` z`%^li*MCE4quRKbKRMU(Oarr&5^V$x{=A(xe)yor zwxAPjI`C2EmMtHq0x?!4x?089@i1Em7m+Qm%Sj(fjtag|2&7vjR#>EJD~usAU=e9{ zQhMRuH|9*t)pEk$3Lf@0*L7Fp&96EArI!oR zSh#oGQV>4ZJgH%%M~!ejmo3S&oP2W%(y2amC2*?yGqG!;FK+L#heSN3?o1d7?hJJv z=K}8~u|^nqf)Mc2Z$I`q1$m5&IwW=ZSl@kU_Fnx29^uyz94)7*nyfdUz`)Vv3IWKs zdE_1J9T!8_OB~d&Qabt%qE3H-Z|~OlR@tvxE(`3HeHWuXbL;=iz_$%mQ4@&ls=`|O z7^FBTQsO-qUWmj42+z5 zIvTQzP~_!T>n`T5K8^HRU=D#CVtjqS>2p*B75x%P9qdsjyq25SDx`U1M6#kl<496lKJMzK@L;2LYi?pn;b$|9_LRb zgl?Z^ZF0F^p5NE*mCr62X{~am5(hhraSzv}Mq?ZU51AnjD3=uB8sSwgon`OUujg^Y zWTu0(7u4gk2suxQ_fmyTpIkhY#Fk6KpiTSU=1%Tv(Y&g>o;}FPK_-bg3(q4F?R9xO z50&lvS}WV7MixIQcnFg|#zx(LgZ?IxLc>=)XPky3Dp4WI*&UaCe!;6LSI(Z6Q(140 zfOy&J9WuM42#h6yA9Q!`K`Vd-N`vU_DoySn!6O0`Pxk00oQX}7R2$f1ji-T)qSp8! z-a>zO)g=Iutg$V5>#+K(QE^^Eyz&`+3%|n7BM?+ek->i8P*L=~yZL;OjNWe*i3izS~{UfBUXr7C>Ed zr7HjiV443us*WPPkQ(UcY(cIP+m!qTW)RU8dfSsXf&U^lKu7-G@E6C&#v?~7?QQd& z9o_8h-JXxI$V3bO7+CnSIH86LzGbkwlt~rNKT*@$=K~eg++9wlFt8^_aR#&bYN1K< zuj9NDpN3Gz=s4-8IBVin+uPE^?lzg{znNm+4DfDq1;|LwUAX|eDXGH!JzxT^wm&sH zvIE!h?{m73a@1xHjmOyA_P|Iz+wL=AG0RRc5{~ue7wDgzRi(_;R;1D~5@NPgVZG0oLFuy=UlcpFtzAF}42->}fJ$PT#fplwxoGOe zxZhKh8Y4Mtf4!An+`f9}(eA2ZL?=4BqbcWnj`MfU^Neb0ZiXdMwH>ZgS;QAe+d%K3 znM(}(@Yx8LI;Dfsx$w8k;@ypUuGUz6s%am#%g6(xQ-G?-_u$tf@$soPR26I6m&+8* zM?F>oPK@TG=MXKa{t)(g*da?$qsmPys<u$9BoS$aon=ds79TXH7(1btBVOBfdyN+VgEVI*`4~0Xcs0 zRmISy+YZ^jygJ|!lsTH%zVhR!CNafI59A8>=^}Lg#Y$5+{J!<{;<4-EJZxEStr@IG z)3h9hxr4Haf^6Tz$0a>uWjDV}zn{$O9ch-R#cK3eKGqJxCDxRl`L2|a+^P~Hw*4r( zNOAQQYq_}9tmr-O*U4h|Tp&b8GF0x#3T4Tp0l-1WGH_JQ7#WlW$_>@`4 zo3-Jm$#4ZI<`E04_o1w;gHzYLmq$5pZg3F;|JR5&Fp=UqFr z7fIFrK5-hM7C>LBLyT$yc-cV;#MDdB=5fsVh?6k9C(ktfi?&VT-Dl<%6zZIXd^9II zuR^+{*$}@zYaf^8hH+FU(-%jG+{1kM0vX|#ferM1ngvIokF@FV0j~xe6!8ecnm*CJ);sAHivRol6^ zAYGpQMnTu!G#>7GUk9*v{t)vCT)MQFaT$LLc)6_89wh<}2h38MCmdnU&?)L8yDmM| zL+(}}8kb?RkA$#hpmTX?d&e*Xn79nVGHYsCAQ2vM9(RKfX{}1FY!l zysihi)v?8h@efLc^iNHB7XP{5o#)$zoVILaksoT_dSaj()#KNTrh2ANYb5~^c zgOqZwjumlsfRQzo$(#}=&vjt2?20V5{yVEpO@j8e(VXg)K@&&j{h|4g6hHoznaOw1 z*rnAOI@kn0ic-vS2&Z)*)sfnY?3_3+JyJIo>@)9cXkad9Yb)PJUIm- z6!O5F7xT{In&Kp{rgQ1I;0Z0gWbrvZ%M-wSZPGE%SAHdl^DW7EkF1>xRE@a2iWRF_ z`bqg%H!|-~cfG2EI!&?CAChd%OC&e2W|_WdIO=uBN$wM8hjP4OW#wl*Ak5IhFz>@- zTj;aaTzfu<@QnX%ZDrGC#U(}5H?_H(aE^=^k+?>@$fFV4DtG?LlsKoWYq~HC>&oy4 zRL1%|EVJtkd9YTU3s!-D08!i6|jkq zp;`=5#;)Vi3ZArg=R-{solUoUrkR0tBl`q7J%4yySxaF;&G;CI(M(qc{0CFWzCo^S zhFa(V>+&}a132LiDdz<40=(pE6rhHdLi^rHPuP~)xF$hrMee7^I+CZSoMDRsAuq!Q zjxz#^Vj!RFgLR0R2~)y;2tRss9VTU-24?j)hDW}(xAp$IyRQDc@J8TDGrGUPo;=+f zH@P+#_$m58ci&a8;+itlAuB(1P!m%su=aH>n8%_cVPv`gpulW|*K&yFy5kiNY7AsC zrEEOW@u>QWNqzlD)Y9?1zjmvU6w*2LWSJi~CvX~DX_n&o@wx^s%Q}tsE3j8h;6CNo zak@P3SkDc{zgqU>x}BrwZV0y^-FlGkCLTNi3+07bz4^mG9Ib7IlcA83WQRhS2vwaR z%qn(QXTvUkjR1f~6of!jgGUILl<1xUvl3RAeI@6Bsu4*Ma(LU2mBj6jDYarCxvT7w z1Q8AHhRlhwigV+%V?KgL8kKsaZab;2G79a!Kl_2|7QMGjATVMrYs~O25BqDo>y{6| zkw9&yN`%b3HwXbZzjBt_s2dRSP9~6y{!IX4$S1Dew2_bvOlO8`|E60Ula8gbc5bm$mEM282p+o&~<zO;c4a zcwrhLyPMV);@xY;-Zr* zC`vU;OO?4dUKUJxLVjib{;%I-)qBMieP?P{uotS0JGHw~5dzizFMi(>g54 znBesEvfyV6=(scas5vaB(`Kgy7rj0QlWF~tXSSc!6k&b6+3u+U75!k}<8?!8#O{Pp zT0gMrBDc46iEz@(I<3f3ae>9;&SP#D z<^-|?qa^FWswvScZzq*=;Ns%j0r2@vg5RIngg_j5j-1?rg;AVzaQNYpYGL;I(_3%S}ka z(3D*zswCpFCL9R~>IliZBO3zodGmah+?wo{u73?B>)nP;xzC0Z&$>qAEv6I$vIzk? ze9&y?K8WJA$d;-O`=U5jlF=zd)$=hJT2Yw*`G>HZ7r6zQdOs@~v%$)dK{#?(9g^Dm zyNu2>5$n`U+qsKyw;kMrcu&&jt?*w8}^a+l&hIC4UiLdB`O$`}L z_VxA$cE^v8kr^6+kkEJhk{Pe&%>9;!UTx{P2KD#e{k-WUDoM?>3_4T&zG1al_H$*bD_-=+29ky<(H|pg(+-2Ie+1 zVtZ~7(qCcVy2}{E<9mxUB$M3#t&PcahpXuU2Pc1rwhHj>urS(Y967=CDbs+|Nef0AJ%G*&tB8#&4?K+^X4`NQRKiCI_uzM`4#gh=chTC43vgv$SsRZSbhUrPid5@-o9M*X znw97yJJOem`dM02H#cIF7e71s{XCA-$H?xZ{Y<^uK&G{y*05-dF!%Ljj=7j^fa>%b zfXuqp?fG7GcF_6Yze$MRwxP|D71j8f$jjt-CK_YfxQ?M>(v9pj>Nk6*<+!a? zCU3K^`?+e}Tw-OrN;W>AVu2hT>nTxIZc5KXK!V zr|PcjR{ooB16U}~A@Um>;PL?g^9{?}<5quDbM_JW|9RKnTpgeo)5Yc{@g1~?v89sU zhJy87mU1GOPA((nd#Plt)JMOa_Cn{!sDW=aw}Cxaeeo<+z~g1glMg#q4cQ~FoPv!v z8j)(U#d$Ac2*Q%gc!xMpDL%mdZ@8U=W-2G%;dbT{v{Ppr*toV1mhP23W{AXNf{CR52+Y8D*{|Gn z$Rl02{=*&z)VOo8f|Yd8j{pEso$XQ3)iA%HV9k`aM+P{jpPxSdlh>IXs4Nm#ai8em z9z>@&ukV^oaPzC@~6&elq<` zXitw*+y?rw9lVT)sZsIN0Nw|z-}c6WvSIUhel{fJ$RS*g24vCe?#NZID-0T$JdRD# z??xVFTN}T9wqp~-k~nEt`r_4+SapsiIpxu9ss!oK1>Ij`qoI((tfj(gRps3Y2vT5n zlCYT9^`U!5%g*9mR65frq=`Zdhq$Re+@QA#=kd=P6zCOx(=1z*MGsTaLwUBADR#G3 zh^dNDV!up9!A>QY()hvD_6|%aLo{bISc1QI(u)uQA8vdJvVCY8L4ZiNgt!Zk#LIoe z1R_f7yUgqLtN9~rbHg2O1`J~nYpKvEtO`!_-sZ8YMlcrPG%A`R-!d3K7HeKF7X%U6 zL|AX%^<P`2P8n)3S5+o`Q! zcQ!JkO&H6t%}?JAFisMZ_d<2OoUXylQqz(0-uZjIhzAxbXv#02>q-Nb9e55{Y?aSA z68iRx4ybJC8A;rPjKTExJnQ>#&WB}{6TS1*!IQ8?DAg*b zi?e=JI6!v4N=ldUkLRDFuJZ8IH?I;we|YBqEJuM}E}g3zp6!YA-}(a(+Fv0feZy7_ zAjJ6B!dhm6D-}re>fkG6enziLR>~-rBT?exDwQKw#3QRH-L`f*tO@j}G|*|K&68*WXY9-knPEp94zT0ExGPe84~Hr+ z&vI~5VLr$;tQ~x*By_t}EzmCfTH$zl4XUM7MI>Buj|SW{+-CCuIn6=x=yqE{;NSce z^+BDoB8`lYywhMcA4ao%*g%E_oKYN)`vuPY$7FXXZJw^eJ@#qyV*;P9b9x^DCQwaC zFgQNg)*~*2_g2YAJ|-O%%B~`$MWS&ysl5Wfij2|=5P|`fWy>BG`bglXWzCDcC*85* zk8uj*6yvQDAkn_#Xy$ka{@mePtI)1Kyz{t}KKc19cT}OkN2~fw49U$OEQ8(a2!6la z<>3jHHY_2S`mCV&2ufm>%d2)8KP%(d7X)(Ux6o4iB=;3QGuHIcv3K!`_gSKl6$@tk zk?;?7O2oz|N0KZ_UN0etQst zr>Jesrek|lAE&@x60J%&oXU4@kfeu;gO3qa_!ZI#vZ_~S6S*BgdKRY%$$zPL6Ith} zK$l)Puj{2h+JrQh8`?7%u}avua2rj$TmKFfs37~f&QTN202KlMwnLH+CSIus8>m=z z;m!}tbL<{MlNBc)nCYu&yE>)m9nml&?n80x@ky_kE^P{?bj2bK%*ShkbpdZl`s>m)$IDCk8xlK~*IQ z(=_)|d`bBM2q0dM7DJ4GP-?L7EdmQg7d2H*yVEmjHCG(j3|p=rh1V~S=#X0fy5be7 z5cr8`^6S|b(u%^Qm>kCO2Xpe|O%r=Vi^6{9j*)ps=`E}`9^J_@x{pP*Ta*UK6*uxx zZf6}wmEOF{XqlryW+(kC@b_GWJ)sYik~}nQ?kW7{5N&Al`fN6FdBMyW#paXcT{``G zO>4joOdcU-9~`9oEeS%M`V{chTjM&OTr?<78X<)Vvuv~BH!;hf*KR(He`>#qej~d` zyy(7ZyHqF_uSD}pFMVj@P6nW)XC~`|k55idbzg=+N)$OBw0r(Aigapdt!!i1C9tiN z4s`a!lDCL2Y#q&OOstCCN7lR(0YOh3BeIJR_rTjXaf57{wR=v2YPuwoVTRCgC}g`T zd9xi#o%Zg@FsV5tDGV!*7>pq~Q{C_4-Et!|{) z-K_!7dx-#X|NNVkchN^$fc&4I*J}6N;or&KU6%XZVuH!;rd++|4BcFvzWEZ#qTU94 zhVDwFfBq}Xul5Rn%=;ijVcw&pBGIVhKIzvgfVv0H%`=2(IGE0VbSp%p*mC2ZSq@s( z9G7+}Vq-C(@^rWJ&hUiuUTh2Czpd!T4q1hi%I(Ei39Nqc7zVeNluzW4G`t#q7lV-h z0X!jv75DoZQ@-b<4-O+yodOd{D*xy(<+aVkAOBA93mr5(iaq3J6s1~U6tADM4LCYj z$J$E_)H`z3eYLdgMUbL@!nN>@B`5ou7^O7QJB7>ImZ zy`JAD1-~boJ>bCq%|*$sal*DCYjslq7s0}0vqDMMt`!y|eItHYR`grmrcCJ_D3pjM z%+!T;V<@M%bc>&7B;RTTu2*G0yMyg|UUsDYkt!7M1sx#jF5eu8x@(uZ&E3W>p~YR$ zH43qHzHAjdwtw?Y;J46>4KL1%ar69hcf{v}~$LYT! zn4@2fw!ftvGq9|y`t{V#Qm#AvJ68~3z)LVN^^8J8N38%{bPE<3?`@b8r2nPuNM2YY z=#a3Ma}j32Hk6oNry`ZpF3}xfI#iW^9=Euq`)Q~#eo3%yx(8gg(^vAFvhqAG`T3IM zzo)dQg50a_285;kuC}WhogN_0JaMvsJJ*YiQ*7b^d9d!CJJ9 z8?er=Q7z5Zwt_ODfd<6#8SK+l?Me)?Vk3R%u)P<#uD7Jt9t(-PI)eHxlswy&(EPkV z!?c@S9!RC!Kz??xm5**uNPb>`6Tf)q3+Tq#3`z818WyrZxdN zhV?MqfIYZ{^E<2nr~;5%QSSmvEcJ?(s6>|IQYUz=;~&0=-1bu51AXNh@)0)g^+~Ei z^mC`J*pa*dfQ;yAU z{}2$86J0;=2*G!nWdr~%?_Ek2#6G~8d^=Im|t!BE0<$f9lt@8Y1j z1?_ksonnOw*Gezi@tXk=DY(mFtl>5l4%VW2g@UwuLqPPxGF%U#%1Y%9VI&exk-v7Q z)pI*%YmzPi(@)GGu7;L;MfyIxx7p4@)6TGFxvue#b_QB%Dg4Y#0yCPkG4=DcRzog9l zVX}m4?V<6^39$URpw7m0`F6B$L#+M>E_LK{c6tteHl;#!PKbN%Grdif(n$rX2XNKp zHeX#Foo?-YxU;=mq?!%QX$^;4jpPqoR$ObSZuzp6I}X48A&B||Pv|TODhuSwlSo%C z=6t+A^L-Jv)|rof7I)D1<3e}uBp7c(or&{-B*U_>rrL^@dDVKXR7yVCmvzFEFA060C=Jp5O*RM*3KxJ&q zKDc0@&?Ja_HiOj6$$krn+V(y7cHcUSkE z6;LWVejSJE{(k-9)lr#+`N69ZAd&02gb16jCq)K2%tV$wbaT*=R@J7%^TB~!-yhDf z`q`Hx^NwYEHe|IL1ikhda{1gPr}os$w1uHBXSAM5XQop0t$NLg`u#AO=H0i?23x-B zh~Sd)yGg7Ccc^t9=&@8+&(e*HcydLY`ow+7iJ8@1QVj-GTm3V`j1nl`G1Upni2+mN zp~noy(zzdqt}g;xpcqd#z|ZAk=*h*G2O9khh6>+xd@!erelgVQcD8*Fm0mXwds*M! z(w7G5=-sW6s!4!M>+9j7ceFfu`%p`54 ze7aI$d~g{M^uX4OE98_5P8KPO^SS5qhI&pf#vt~3-id=hPB4p!E*;(941Yb47?QvNY&4+i?Wp!k8 z8=TLVNdbxH`C2cD#?*%bWY#kzRQf88q2L|!kHj6{$Z^kCKRg$4u)Kj_wY843d5E%! zAJM}gG!o(gf1xWfEP8KUt0U~?!}5HXRQ>{;q$q2|m6p0X1Ou%7e_Qz)`;+3!uVHM%G<+{Fwb|Gc(CLTu?Vp zH_&+-P1y*(1DkL_Z5Q**fgM0HR}|sj1pgm~VEzxlA+DGsP+I+$GxQ@N8*a3%UkLG3eGl(?=aj4d*i%%vtnJXXlX430eMT$F%~gcG@=_J+e;`K4(mN7}aY+g$qJO^^?YeuBs7z zwcEL2v}Axx@~*^@_z9#G;i*T{;G|)@$=uCITH7FRjbA9=e0BEQZiiDZhvO!I>Xp7b zFm?~YkrI0O5Ff>ZY&GiTYDJ8VdfFV_kTHu$_xG-dXG+xf3vM~@A^Rt=(H)=13#Q-E z8*CxRObK9Jc-+eKl{Y5#JLltio>dk}BoSz1%fa&bSqd=o@_$xWhVoMq?IX&GaY<;0 z2qAo{25fCBY#G7vBKsS59qE`}w%w_S^(`#KQIiKj`nzByvNxmLCuhHa8%;Z3ncVvOHhr=G4I<0Q2D{s&Gx`6v$9(f-wzUM2 zec*5;XH6lrP|3~=o=z*0tSgv!p(^44HHTGIRRrby55&j91{R74Z`-0ug1(zJU?P7I{D%eJuLHJq!aOS~BqLV6KT4rG*aYk_aGw=r zSxyfqEigz%yAF_s@7`cA5pwZR%=|hyD z$W{71nyu*2sga}KG~tyGa`>2taBp_);TX}F7_Cws9EmM>B=fh9@tBs6EU!(=ugT#^ zv>NA-V0;G>+_rmXm$PE5JOMboSt}S2T$x9#iSd{!V7{ECZ?P;OHX=KJ;U9ZPO}S}vEp=h;Ymna96s&GZdY%f;d$!L{C|L8}>nf}* z^vFLPPlqzX)r{(&Sa7G_-P~?(IzS`tY3-OYyRqSE{w-6Ie8Zz=b86XQ+9ak!<5{i$)_SJ|WCMsPr{ zU}zWBc9(w0RpD~)t*c|wt4sfnqUI}Y{I{r?Z4f05^TlkC0FUl{533QU!-8GCssG#$ zKsKPJ0XPP(U12zYq*o9Q=(jh*Dd94i%iG$W;;9j@=f|FghaH4LWTKU`I&Q-z#8GPA zA2LgQqcFQEhGUugT8e9Loj*0zkDEAFI1(IYjq0Q8kKHT}%QITVWJz=~CppAJdgk5= zX(V747bD7br%be2l`kLb#<4wXO+-Hxe<{qbgsP}Yx~tVotSw!Alx7vx5`-awS>}+Rb=o8x=plO$=*P91WH}9#b+iRWV6o*O@Y} zz=JsOy{b$AP0zddm-dcX7jSG1uo0y*IdJunc{b-f0v<6dZF=Lu)>E|SJG~(O?9voZ z2FLta*y*_G$+*DkkrZ2G&hFRn*E}R-p#oHPUm&mTVs@Sg7FeEQMOjy-)y7EOJr$ga zeS`wN$96b3MxNaFH$i?7bZq2YM8rTBIUc%7^wPWY$!lBdjOwQC!67em`4d=~O=)R19FmOf7qqO4Wq8&@)S$-5%yJDG z>i{o!-;$K%azUIVbw_4;9++89Cxr{Wz>@nIWZvM&kmOOgP>-^eQJ;pqk{O3U061NcB-^-v@_3pA3TMIyUPSDJX&>H4g?&H^IL z)81X@!@j*yl0SA!l}d{dWr0o|wG(MqO>|xyj7oaYm%)%?t?y|JMyc)R=Z|;|G8-iJ zKab^=D_NL~EH9i04XqBc9Z4AmAJEYzVEVPpWFZQ1<$HsX&PSYqD!lmpzhJ9B#?`x} zf=_iZ%R}etE+qcXFXT|UD8+SlHl=O|alQ2S*TEP6tB!_eu55EKk*1P02SS-&AEVOEhDCjF0dbSWB4SaCn{ z1+l~%VmfBcXv(S^UyUBik;?|M3m@w9?Q^ZHuTTQ@=_~ln$6RLWz6Dl{9N#J|Yt|bd zr>vIvnSfby@Az~JsJ5n93B)_n3(lK&Fq5^L!PcwDL<$ifqyQ|_$L?Op(TN#E?=>Ne5(HtCMDIo$z4zXNVU*~d z=$+q;`~IHydB69c&79fi?0wF;u63=o_MXu9Dssg4Y3^fSU=Sd+cz5S(>p2PLQVybc{V^3 z9q3B6&E*Tpent@0wEwB=YYmL5d`oTgD0B8WVe2_tfS_$;sjhK3tna=Pxw!}l9nl=& z77Wigprz2C?lrId)a;S%xVq{q%~^gc%R%R%y^`9sK@B%;ZEe-blC+%s%fzc=A-~AC zOwsb0Bbf^4ds+`eQ6DBr(%U$p+r6B|rKsYj6>Xyg+>QXj9 z;HB8!RYu)SS6bs1c9Yj+$=q$<-gUE|-%!cbg}wJ5ICAc6hU)6D=_p;O1%RF$F%igb zi7RU6RFctmdMx!MCZT>AVtln&)p%Ug#o)CaEyv)oKxllnomRilbu+aStIv>5uYels zwas26kL4(b0W+fhJ-*o+I&ts@d;-vJ}_00J8 zu;gaW*lRGWr`(vo<|ywtsHk0`Eq}T9=`#DWd+W+TWynqDjrX-&6V+pIAOx(|X;iI; zjuSCLN}Z z>|dx<41Lz$DwThn(ve+QOK$tmop!>@)lqj^e3{oHSqna>-Mjf>?7leZdwZGYv(Dc^ z9z#|C2lp6=Ow+t*3t{x#E15ri#B)s=+jO~j^%x3pCXW?R%m>>l=F-jQJ1~JV0(DHi z6?f&Mc}$qYX2)d_$0D$EvdVZ9mr{ywK|$1*Ju0f^xCj6ieDTHhmY?fE|D-Cnua)P} zqqK{oali91$?N*HS9=`B=e-F{S1YI?&kBsMH?L3UZ}mwTBoC>4ZB4Yz#pp8v)MZE( zFe>UH)25J+#>F?)Y`b3Fbl8vJ+LZ$M@Oq9i@dv9>-{hZh!rxRgK{Wp41Cf&T=R8dd zM@xQJw>NukjfU@cF6VD=tRyd|7WbB-ByWb-N(|3dLVS;iUv>4Ez7^p~t7>CH4r1x> z8K2=nZRp`uFxJF1UC;0VQ=|8>M(W&mk1*wSnXC(LYS%q>J3DkeEyO^j<@Baf)%RkP z*#3Hl(c{|6OBI7GvTGXeJ~8JTGA{{v840V36)r%4l9NMmMO&lKdBQZ=Y`L4U$?Kvu!>cwPpYrT!Qopmd)9cQ-oW{lCgPmx?eh|^Bfd*+h zg|*EB8Bq)it0ruxyiwxpqqC7dM$+s09TsEAQAy=z>GDH;zOZs_+K z`Dz$&&XzEDkhaTtv2X9QHe`1jWq%Ff@ix2|*&fNc8R9}cy@xhVHZ4_`^H+&EO((Nm zO_zCo$M(jznN|(n2h*y%4oFNi+R$Jk?5<~G?XH8GF4U{8yIpvat}f@NcHr2cXAeUK z?!(Yf7>a{Hx2Rh~w@h~@qS}Ap@_&Kmy?^>w2qRR;qzHbg5x|~)et-ocK(#<=REt3? zMeq~{@j!|I6F`IYe~&(GhO4CXpPsI8~GFF7D_37_kyJ*Dg~y8=Y`zwHC9Gh(s=BF<}d zo!LpRQwMPigcN>#8^BR!^xm#8VDvx&-Yrgb~SD^M4Rzv1w=88n)n*-q1fnLQEKIKG& z?VjCZwntvixm;!PlOI@z*(xk%v&T~#zC2CsRiIaC{M-M*hHrIJXh3d!+UK3D^!xju zh6V^10_!%@&5ZM`JkO8>akcL4dtQJCtsOeO_JZaWNAwHE){$pGURFzUO4t-nNsKCW z#A85bq}LV-X+itHP*F0`M^W<-R`al#mIfQq`etMOopn5Go&CZ>id#IP4e)2ErO!o*Isq&boZr6E;DSe`ULNse)k^=F`>5(95>S(Y!rcl5C&Gb%I_ zC0+_qrPC!225`N?7jf7M4d7_&OQ?@uo4R9 z4gwx#yVgN&0t*mC#V#tGe;wk|O8FC`BN-js&B5sC#sr|l+dm@yjXyE$KVMDgGv1zc z@fg+~p$fol;*huHe$|=5a`=Wp_zeaoDji^g7o9?lpDuT*P@u_kI~*c$R9WJ)gD-jZ z=B_9Cx$*7AWQZ@Nte-z>NC8n;%FexAp@t1*doLuC!S8CHO^QOq-tQ6#$&!{N%#duR zxOt44h&2lON$0=CMx-|cHWoT`HEdh(6o_5mGr0fhq_yW1cj=g4bV||XRIb_nP-5`P zwkbLMh06rCfM7qiQoRNP3_Pja?#LFTP5f&=K)I2j?&{0lUdbbn(7gAd&*`l8(H^P9 z*&n0aByh*5sc`SE?zM`~AAijgih}CqS8nfqhc)aK;A$WDCL1k@ z=K|h7*A6NdAAnHCPHHoUnf$SHjt?$%<9FAdEa*RGl z!L)W?;pN63i-%mtZfo7CExWNea8i(=QSHo8hO+IO?hUnK&EJFF{XZ2dFbkLO@g~jc z#H9^c^>9C#u`DgHD>t#7_=Fu}qGS)FA4r0!ivnnY5UfuwpSK+$OPvZ|j$?d)qJY%; ziEU9FZJ^J|BHflRe{p?&Jhi23Jy0x~*Gqk2!d&M~QzS6e?t?yV^X5&%-`DIg3K1D! z-tqJ^*xxMe$&MYvTiL>VnyOxj-S4}5hM0yW+HUwiMlnd=vc*$FinAz zlF%=NW*`_~MO%2!Y>Xkq;osEC9!&O!#!Nb7h>F7mi@p<=fn?X=CF3V-Tl_^QLP84T zPdzZFB;%j37Up|fx7(_Jx&l5@E55|(^dMBZ#c~~7@SFoBh zP7N?ufPkT-FC83Y+)DZQEFR7ARl5kX+fTIr?c#d*q*~-|3QNKOrce4`&J4SVtBPsI zTLK11Sa*|37{WvAePY}95HBP8Pxkl@$eU?+f|D+PmV8}DJsocc-D&+OT9D{#S5+9- z9AC%Z54`&g>+_Na(NWJ~vwpYNGQOq1X#(%t+kH6Id?nRmrOaYdBWoA*QP)kF)6M?{ z@h-*^hZwJ&ws*eWmnH6zE44(R{)rw^9HHfdJ<13Qm8!?Cj!h`2Q=^}Itk1xHT;eJL zHSf$CFe$CC6K+!IamtCY`VB7NrDtvp7{}ZR|{en;2%q ze=*v`-WvyA@K%^Z2TY^FKP7O^fHvP56-&Ni(_X%B|C$mDxq z?a3v(A}w#DNOZN$lvM~ST|aVnAH7E%1>CwESkKR2Rm(MXB?r|cO8C}~o{YLxOhQqd zeeqNAZ!@Eg(S8|wBFY|imdooSC3tKNuL--viHz_44AIvqlSbkDQ7wT#4bR_J9aoU zapwn)kUI=))KMTb0}%}U>SzW(Ye0+^bvXan5c^3@WaJaYaL3ev{oz=_$ z`r1E%>LCT$QXZq^U7N!3{Eeaa{8;0+`e1O8}{XTpU0VZ5)PtJM^7Y)~tfE^kseNJ>|Y!CtLU)26D z#Qqn|aS#}^G(ocTV-zrOT_owr2}vZ?^sj7kKy>?(5AxVH%F2 zjkx+Y@|E@bTH570KU{b4MyC}6iY^>p#!(tbhV4x{{oR?1U9k z2?!GUuihv4BNQy*o>*>~)&(2+?Qzu6xz=hA>A*v1VF31?5Z%l9InK#>{=4vdDT2LL zprGd9`l9h$XISi3LR!IbZ{;+ptA(kyIeb~LS_)Gio>N!{Sel!6(Wh|QB@V7mQsLj7 z_O>KUzbL33b1TRrWg9UPB_fZ0gaxj^tf6{ko0wcXvPk>&?0bh59Sjp*9#x7fp^!JR zs1_e@AZc4lpTlP+XFYVh^s&IjGoA=BK>`Q~_)^!cG)Y;@WTq$;#~8#lZn()VGj8`r zi;I?Pa?oLd5?_Bc92?N=dLlwa%`rf&`oa`z@HP<9)P6ya=v^Mk)wz8S6n>v)8bjLb{^_|q`Z^k;`NTdHMt*w>Ml znvKNpqodD}>^%&^g;P2gf9@_188q`LYwcmacnk3QtnI%8ioM4{YJB|a;JD@m~vSUi@--&|xS~qU;{=Br>+1_5CgmlYPD^Qe{8|GWj2?AaZ zt>S{9ShP_XB^ysor(Hp$)*)oQDy!ub$M3BoVFoUp z&D-Bck3Bn(nlyheRj$rqoaB{(t-qAvB4-^qK<_v!{z)ax)fWC$wPKzULX3K36)8a5 zH<`pg+2v?t52S^^QHBRi0X}!%3&>^;O!BcXkjh`C-}q?T=+VrkSJy~fBLp>rLror3 zv0d~RTQ=jNCxraU!PhvY-C#}x*NDm%o5Ne7Ka68$aIVV9T_A@6&5=c`CvzTPM<{ zmtyU=##=jq3nJV+1KRKXc?^rF8VSY+I6d@-S{e@mx=|E7=!t_-=mNFbf$u@^{ByJD z9%g1d{h9S*%&Qmb;K{Y{w>jxIET3cLj!H78nCoen5MjIHx9ssd)|!kd-0Ivml)rVy zq^kxOoX^8R1fVVJ3K)Vy;Prcjsb<@^oF=xS$&u@Yy<((fK!{jn8Ard1KcW8sd->J6 zw(YrQv3N=?ac_y27m^enC!{y^WcPBxIghD4PHFNXtOy+bwUGpc1c!L~Q&sSWw5EAd z&VuITm)j*uiDgTa1)6@ONUq*WQj%aCxTatdC!0kp?gQ{-lxtEG@@qah$WJzd3|(yC zL?DJ&CRRnY)s`kUjvo4)xB%^J6G{zS!Slt#{h!V7eA$A8tmI(ulrLjrbGr&LB z)p>E@)&1QzH5CJR=oCVlmnsM)yefG^666xV#m&DJMx@2?tpnaF%O70=u$Q3l0#(Oz zw2Qy6Ol(1eGT(AXw}s5b#i))?q1XDI|ubMUZTpmK1i0i!PlvNvxPTJTxt5#jF;!z@9RuBs!1 zpNA5LvU0&U_q;8;fF#oF+CI6ZjTTynHx-Ze+hP_{$Fg>0(~8Z?^B>`lqXbhO34m%x z{WOY;+u)mR6eAgeYV()BxJgx#w$yMi$_K%ayL>IN_YZwk*! z(pCO!$K-pBJ6sRaDFATc?gL-m(bmNPp&DBJ*63bv8shSECLrWhh%GKMdcDMr0VJZm zJSf;%>>rW0taNHsd)o@MWgT@1EZX4vV)haju-D>D(#l`UH2y4M)h48QtMF7Rb4=g6j^|(Opq;6m|G6{{rh zqi~86>44x0Yoh73_X-ePld1dODzt&(GSzu^vA!9eO-Tr~#Fb-A#?mZ5B166I;lEsf zdHRHFyh+sYjYlp^@}W1Epp8#nb&ANVOA#YN(j?fp;UYS~CHd(E*JMBCbw zBK|;>g+D?5OzyedznbjkB!V0Nwl*jRqhi7z+yFd$HCJ&~vXKKdQlHzPjT9WAVyhj& zunM+#A2+-V87gp%wD6o`X@(n)Do3f5)T#^{(o2ExU5Vk zEVvCet`Jjn8C!U+GR#8DY=eSx&y#G*0)}ISw~3~SDP^}vcAGujQ3~q9`oRsNf*%w$!Ib_% zcG=3M`nGQ8(fpIYKPA4o?D8@{Ads?l2XfRYNa{=bD!7dK_H!PO{IY8Q@1h(g9MGH))o`-N=W{d|VU+pkdhJN&1)Q@Xu^i`4q`J)N^N zHcPTkPF*hh#6bSs6J=mBW*|6*0;pf)TJ)t#kOApfp<~KHty{Eig^7#_zaKb;3;s|E zllnohyQ%Uz$=NH#sx)z(~gI@FNQ?NM{h`+x+6ffgWHA%_eW2 zwceB(=(v7iAX?R0^^f#`@Jxa(=Br5-;(e(!js92=D!(3|t&^B>Il{)#$BE6a>1Cc( zrH5EQr1r1Bo)G{Zz?a_EFs%&Wv7!;q8p#ECm9!|@s1Tx%3Fot47324cr=&3~; z(c|xBr!Opu#zAJ5d5bA=5Q4xESt$HURgj7miPsXW#Wd|23$9ZJLVVOlu@jGusTm4m zE945XLFc3SC34eOw)+5A*or~4O#uQ!Utskw{O`2j8yDwU^uj&N8*dr{)r|^nV+CXR|%2VZ_4}Q@kGS;?FQ&*dEBIP{k<4 ze`zA>J*wyM8Fui}g5~3)aMP zAww9PFFHx9S5ZN9T11Nya~}{QtZ_aAumFtOB4K5kvDp`10;iv3t(;_@K;$*&yeYr5 z|F%pQI`V#?7N8;Kn^&UqW~TPa((utp#)#6V0?Y7AThH726^#eQ4d>Q>ey5MT*;oIy z&$hs}pUBtIDucV3)H-tFU)1pD>m!IPF(8B=Tb1H4$$MY7$Of(t5A*tOz>r{-0|ZSK_)z-oqAhSVpd*3nHp^k( zH9z#LTjPKT{gq|-qB@DzJ{HZhAL5?84h~{ay1%=Hc!lK#?6`#!OwC)PV(%I z+QG63GbUxPzbuy;Ybd}d9(Xo0jBR4*Z%GLRZ;@wFRv{d1vEVlbx(lkF3&72XpI3HR zfYQ=1L?EN*APOf7{pu#bz+mY-+n>iC!3jnXq2_ou8CKar5KQJ!nFxma#Na+i2ULIy zb=woFN@y9#Te%|jxi$6GcF4#BBqXH$EqhC8;9kCY`E~U&OYw3s_)atAey`AtHfB` zxv|2~cWS_Kx;ze#;)dlBA3NXr3+0K4^Lk{OY|@vv*A6@zn8ilg2+uYpI^_;^_|Q{(R^@&CzLF%e=S#x{Px zd;`DG#0zRwOPJTvr=Z%I#kykYYK^S&K1!Qmf$B)$)wbbnUaX#$vtIU`mNqcvM-*x^T~3(L5&yFD z&7n_`)AhaI)jnfsFYl5(#X?m-41FpD-@+?Zb^GP0Kc$I3vhu=KCTA-8_gh(-S(EaZ zuTdypK!94?bqYB73=rK-GhHq z_eaGM6Ex)l^X2w3O=(HE0<9cj1e+hxX6Wy zFY0f&1K?OdudxjysJibgvY=&kA|_2u(y+!ci{A;wbQ)Y!7G5o7wGihTfg5-gnYm>f zH9peJLpF|&?w{N1HY(1sR95nE@R?{~B znzxBGfoi_C_jLH#qP1#T#`Uv6yTqv4Vc}q|qq zuCNz}1?PIDTRKm;9Ar#OQsTh80OmtCUswLLOaJYb>YAeFx(U-qY*pIu3XW( z@HmLrczFt8`2poCRw&=`v5gv~W9^mC-&JEg+c+6SJ1IQyU~w~L{ly3xF?c5eh8S!H z#C}B8xFSsbC1#@46a2xlp1v%@Q5p#FW(!nRLK9ueZlj%3Bg4JseFe;7K+ zFx^#8bU@!R{C|v@e??VrZFBHHeoXMNit!w@QN<(KnNaW~77LwnCJ9y34o3b1cC(>= zwjbPr7zg?j9Fq1f?cPv5TF*}UMhE5XedLU$;$@u8!2nTuiPwG6nxrlFNvmX{Z#q3DDIb%~>4plT?e_vJf z9z|(BY3t8G{zXeA^PfpC3!V5FEYIe|o8$Q=J(J)jIAY9^LpHQkj_LD%&8tPW#wgkY zXpw}AXa>*KB19pSu^X`$5ge*gn0!d8@ru)liXqnPu z_d0nPVZUURvga2zZrJUDG4#6%44g8=x&w8z3vJ7Zm9;ZJXG^%r?&|F0A>QL7+zC8$ z7=~3k1|H1X(+RZold<9zcZb(d3MqnyxUc}m>7RD7hW_?HhM*NI?AJ)Zz*i{Q(Bmq$ z;Ljr9Okzn7QkX8CdSeHkJQhgyDwYJbD%0e*@xgmnDq&e?EfNEr+sKVTm6rnMJnO=8 zDA9>VR#=PRoi($_(v5nhIEX=AO`^THu3d@b-m?W%JkaAIKhD2#i}5C&UTplnKJx9J z*$gFuUFrA7%j2>r)s?t;h%y~k{*^yp{_A}~Cb`P~m2um!GNp;{wt`z#Uz8UH6OsG#ceU zpOZc0E=q96(VQo>U?Cwn;hX8-7MLkeGqGs1kt$Y1VL^k#LhDLjf`#RNWj7}!DkkAr zpbL8EkGhwURHp}Jo9b62wclMR22K=SS*PjD>WmdF85d2QkJis(K=*z(KuSu3zE2jz zvmV;jS%UFtzC37(7Aj{QOlFtVNdEM^>>JJbD`pPGA}Vd+l_wEoHJ0!Ww7O5>M_{2m znRZeaz-I^}331*JEa>^V^?HTUG$@qsx&S6-oFrtYZ9Yhz&o2$h&Q^)``$iv~f38)> zH1HJepAq0S4E8Ld1zE0Sn1ynH>X;_&%f5j4^HBPFngk{SL@ZE*sm8I8^S>bdrPPf# z7QcBImXw{2m6(EhPLhZZ<*do&FDsgM?L2RbpT02hlEKyq=*e8otQNcsRHo6JD5aC5 zP!W-zv@cbFC;mHOzP+F7?TG`Hy(^Qra95Pt6Vi!CnBjpczgXdf$~Oww|1R!!&+S)k zu@-qi6r`ZlK}$v5doR!G*~K{|^~o`b=|}ptPDCVW_H>60>E*`8)6RAk+jTHDYTAI8 zup%2rN~cEaDkmKMZ5-zkc0#EZ8he7ua#VUd06I_ z12EtzxcV>M9>Vrlqv<^k<>{1n+9kIZ7sFW7+<6OQUAcdpD-DM3KZ)QT_bs*@9(-sk z&q`t(Ymc)Zd}GNe3pdsL;~noQ^&)KkW%>;&y~%PLKrU6o|sQvHB>$Hmfq6Inm4{B2nBYp;hy`chx%TSI*8_b*j-UgHbjfWT} z(FKjrE&Ywd@5C1QsP_7&!rwU@!TGaiL|e%(KIRsa@3|5&Xx#5ElV@(X8UV3m%zphz zjBtGjvhH&k1a6(b9<;egq{9Z845hMv%mqH`%AI#LZ&XZ|W9B3U5T>Ibo_DX-9!bhO@ulI?`_)qo1^;bHEs{$vHeaVDQl2Z8U0(mmzcCi78!Vf00XOb0p=dzp@B9GMcaa+*2U1TS1v&YkRUYq0u5*XEW>e-J57yZOAt-Y=kRu z8gQ{aibpLXfro4{L3$-zAGZYH>5oCW8g43W`vSOTGL07RMdyD=i;-!mMU)3|aT}6( z64ZJgZ+;=9;x=yNDJgvQ5CVVPE z>kVKsEjmw%1Mf4SSaIF9SwIEC>Bn|^1IGs^o*>4ik9Ex!+4I?3*3vOvjW@Ex00dUR;WP+P5Fa*p_n0jK*Cv8GGTni zM*u8+X*T;G9ZK)0L6{54adGsGWeQ_C}mi>0wtTciYrsv7rI$8$;q;% zR?ae=cw66ER#6lREM4543gqX0jhc~NI2W0S5$~V}`4`)fug~q{vZYg_S}3TGC*uhR zQ^iLIpKh#QXa)=ha@^z3tr*D#?e!H|8v;1~$sZERH* zumK}}qTB4saD^BU`dLrC`wRmlV>P{7ysgnODTP|onOo3U z+emg811{;Tbh@zZ3KcZ6alGepxNbCkt@^A&Q)>$lm*-X#ImHP;q+Bl2n8zSE)#R_9 z8hdR$6IfFj-?TgY{&ppI-ruLTZW;#`4ev7L_%?o&8u(t>GWk)!fPLdT*tkaRY4L=m zt+1Od%bPmUrHQ&-aFxfY;jwm8A?Yl<-&DU|c?biZ4s~q!y-=~{iTkZqUO?lJ`5ox#UN#?rJTz=%^=l1}^ za^&N^oWtxn12%*Do6BL3s<>($SKe8%qTWKQJH)9zQM-N+N;B9%OvhN|Ad%s{!+4w!CEQ2_SMH%rk2lYP~E_|vcMmr!fgDn+f zi(prB#^_?rs(ZPvi%C<$HT%?JZiWq>$E{xo6L^f{6FVkR8^h5`(;n7=>|AoN!iHLX zPy{ICC7GQklLaVOcwfJHSO7ZzD_#S>3@maHsku>h(|2KH^J>;m;c*(EVtg$6LfhQD zt|pxd4|?>-vmPfdx_?kdeBliw=(LVN=%dyP8$b$xwx<>QpfYPJ;(0?>C)tJ`OG8`q zq@c?r)4MYJ7w~YD{6gi%ma9ys{{1y`#xj?{fjY7jo=-U~69CYmF|49;A#kwZlJjw_ z+@{Kh8m0tn{Xv5NS;!X> zfg-F*)xhQV-c>@lv@@}w&n*#VAk9AbfNdbSg}0`?P~IdjxrHK;(QvFYKxDpU4G|o& z@Iapcv_GBC7x`$)RMCK5&j11_5MD|STIupnA`B{$czpRaP|rnB(b_KCuvuTyrQGsv z)QobbYp`$H#?7ZSWbs&u+YSa4Ucp{wNG59l%-!f=9(~I(A{5iZJRbV-K%=j!5$K~j zGDh)Yhd4;U*HLP|hk0tG^7EwPU_MdLv@_h~*FIfrqZ!E5dyr1opyE*pr^yd2+s8rUNw=aO{aL=44)2I)andeb}FA8SJJw2xk5kXkb{ z4CA3V17t_Mg)-cTc_#G;)Bq=+Hl z@5S%|pIzS-pf+MM4}UXoqu;QW6%-@{P)q$^rDE;MySaOO8XELVSpwFRXt#av>E7C zv^(s*TTDZrjIINB3!eU9eP_P;G$l(p+ZUJCfW++~RcrIluB4!lF@>y+r$8h*B7e7D zZR)sp@7%X>yYRA*?IiQ!1Zcd&SEE-Gc==(wgv~Y567cqIL`F=nVU5z(u(Naxr`q>F z+7%^C8Isej*6;Lm)?Q z+FOe4hOtU(ijaCD1eOE&yyfAej<~m0`GwF7-KfZZ9R22(a{k#Bj^{UxXQQ*_LMgDC z>=Fxu_^wC~YZK|pD|SfYzzIvtDb&8R5zCo-Mr+NsmnP?h9k>+qG>p087+8?IVB;#h zqYQWK!+q(_3KI#--Q1-?gzw6om=c?QrXO|w>)OPzyIqhqu6L;GbGu9RE@l_M!l5C( z+|yESQ4yvHHo0f+tp1em2CGG%(25Vj|J$s;2GLJ zr+&sIQR%Ld`cwUo+(JdYLW6tL-iW#48mM?QJSU(3{FMtFI1Moily3{kQG~ zXE&wwC)F1Uk2(7=pB*sdbM;G$Dg4Rrp-Kx9woMDDSp3QejdKjj=4B zb_n+_@4WXgPQ42%tW1gUe0)hjOag+BYq~DF*p(YhD->am9%i5asd~5IC*^t3G-?d_+=oRL^=IDLP8utcRciRWoYWOU&`7`gWF3vo>lDbqJo6D^5FI@5ba$~prP|QZ z{PLwH=^Q@j%)8#fn>;eUpiQ=aG<1>@_oe0qutzF-FKh9;@ z-=l2L#WAl{)E9GGC#0yr)llL3y*`bvXkMhpgez;+s!aKF@F;g9 z<`9ruT2ej`WXY2!jz;#K93aPs5n z9|4Ar%%nnPe7gdX_efZX8j9S1u(-a)hz`Ug1~Kl8!PGCM83`P7u@q=iXV}kwjlDKnkt><(|B^&JxY6T9(<_EqM$Gf9 zTTkc-29zU(QIg{Y6&Gucjc6uy`M2U*S-EO#ZGAaMp~OXO5rWFu1>#BROOh2MFH!~3 z6V~XU_@-1Ms8A$zY+JY-{~?4>#9EV;ZMYkc_c2Biw5tth77xG&gjHYam-*6y+c+XGwE!cuduY0)=)fE zyL-=hE4t`2Trs5_;-g5S)YoVw7+TMm|CAF8mu+hfJR~73t*@A{tg*J8ME^&gq5M02 zNWI3<_Nw#bWY{V~SW-;31e!l`4qX`KR9gqkWB?yRblAv4oBv%n&v)jYSUisk7;WKIuC1&vTCX3PI8+;>mi=;Xof5086|Vr7V9Q0Xg|0y4N*@q!A$Dib3RE2$^M2e4GacL{j~LFuyezYB-z#Z(zI_ z5tRH8ib*~J(>0vU)lbow7#Vv3+n*GC2IL<%#Z4cM=>rwyF5^|_5&H2H!6-J}AYh$9 zh^K{{_>#2|aG?(GE$)iAyWM4sAApm>v^S6I*@E`stDR%9N`U|fB4L6i!J8C5|MCo1 zEp$LM4+!Fa+Bm?zLFZHgz_%0`;|E=vR!MSDg~Y=P9t7G*nK1qyV|;aeE`#{9X&AvW z9d_vC?e6LBof$V4KG@dx@i;x}=l%F;Z_xLCw~Zw5`IT3@`zFqS4N+u>9v!H}1S>v3 zg$dn5_r5}y*YZ4Cco>I6dFiv(et!h41YAy&!1^m9iz%fs1`Zt92O6iu z!Ma9m8~%piPd8HEBOG?0g_IXf&nW&&3k(L5EKT7SW4a0wZM$L}`f7dc?{Nsg>a8A} zljfW{>`e9S>^`eWTC1S{C;tC*sds-o`C^yAsl+7Ybop9<`~ROioP3nblz8F%`FjcJ z1h||mzyJ^<56yk18Tn@wh%D)i`G@rv2pv_WKjhd-sj;_WB-%XR9eff20D_4Vb~sf` z@SsNR3YTj?Bz+=C2ZX%AHxEcD848FwVWdkRxZV~6O)aEKT|4aKyS~2;XT**^A02pi z33n&Bbgb`IamMbxKtYtlsRnNIc8G+LgIk^&2f3h>q$^r>1Pq%fM#C$W|9I^VTV`%- z8DXDz_+C&`P|-t_pi{l?h9QGK4d|tsy;_vF;F<&@bM9;1th*4HL_5d2J0lAr4_EwD zaGk*p5yFlh%+C*kx+Ny8O>zf_F_|FK!G>(*M`_$5bN|A`kP!%RrBcn_IQ}j@IzCot zTmi%I{{Ai(Vw9z)3+#%;lBHp&kc4uwJtFK1C;Of8bF_`8R)r(Gf>Jg`l zPG4+ywcr9vTu^+kp;kJ$H{Mw>C5K3=$m$lYRNFU{Kw{|kx(F;EzebZ$D)?YUWWGXJ zSWHa)A$6x%{Ql8VbG!zOV8eZwCqfdizRmgxb*X;_kDuH$m@HGi!Z!p73)%nfAT!ek z1N$ufAcmM`I+7O(a7=>9Ug^520t%F*Z8yb-w5wKdU18a$6rls&UO>8^$5SoRol})t zR}|Bf>%jsWK0)ivn$w@yM)yFWKx8pyw52g}~eP4h$i~{JWwQiWN_3OHt}V4a_H%(RT7*_>cKbN@QxQ+L)} zyuk>y2$E1&m7s@Y@@6TLpaTQrg~Aa@IjM8JA zg$FT_O*MnY{lh!E>QYnrr_by?lo)#O)rpVKHTN>B0XB#UIaCk4jF?|&d=K^fgo+b# z%Nqo0w|4fJPBOH!g@~}HL4*h6I*Z{vK!(`+x$Gs??~EP(Fzw2sENk26t z5If0v#!G=kRiBT+4y$r3UUP`4UY43!XX{z-x62~if*AiNuR>&H<%&y5NEM$fVB|+Z zrlj!clLWhqp2U%LCZ%%jo9@|rE-TUb1t(%MhKclq`FuGMS%ak6aW-``3W&IAP3;9T zXj!N2CUhMC?yWuZXd_)lz(MCmD?PsD^^|t44`ZOb+0hGWfU&f|PrhiqL3;-_`qCMt5lqa~hwj;Y zq1>o8u2a)o&TMQ^sZ>2mH++;TuS;oOvb)d2)dnTX6{@RuuARK=>?Y{pLR8`UbF{@x zkC0X*fi)@6UJ?B}{jAU&gyuxhjltW=UDJ7_-l4L-(BOp8k6eAwjU57QGYEc@U(%!r z;WM$Rx5l0~D$6dCZ=nJMaAe0_88f=#-B=yoz*6DSd(w1GjE26pV*|MCkLF8H|D7zj6vf3~-(@RuDlIi?|v zoR2&h-ItFj;>f-CE|sQ=r9#)}y*O4&$7k(|X zOdJUP1Wzoij3plb&P6dU_oCTowe=#v9#hIL9$zh44Ps{e=ABLFh4c%-0`-T_9HUOG zWYAdN5kA>@|H23nE^v4Va_8N>%%(>KBS8=L5)e&*hKG!y%Oq|ectRwXg9zK__*_V% z_>`j6`Nz*?1bA%BAmI@hS~7X+`F2xvq5T_u$DsD*?R?#)J!5_d?S9YxRN-R-wBfOdWp=>u( zM-^F^{O{OdqxR?1#Tuj_GAw9$Qe!9>XRsqQ?5~#?2#5lIyfHWqQ8W>V>7K~<;M9+y zy5z)+2G6%hC~-ukX=63e1_p$wwB5mu&qxLf`Wg&7IZ;*jQ);)RA(*v%VjJ_bX#r27a{ng~N5 z2HL6)jB06xvBDq#fIll^2`m`!99Fv2rCI>|?VrjD{I5RAEtLiySk}z+bS@PH{xQ6l z|KH~m-N2g{u$&IzV-IZDe5v2w<5>YmXNN*blD~$@b0j;#o1# zg#)Keo6hmIJMXAt^-YIs<%?$@WfSYlZJVFzUpFn9bm~>hV-bIF z8+UIWyFirCTeNG88`dn?&L7`?bALWS_P_`0f-tdunyp3~82J=3+9@HFRn9 zaMU+25D^ja@%BzlO>M66?CGtphCl2ZI5{aTDk3}U?(V+4xd{snj*f}>Y+2pj&H;Xw zDe=sg=H})W7ys#7>*{9n3T73Rl$7-K?H(yADpJwVNJ~m`^6?!9v-0s>U0zOcoqu-+ zqNAhtULfQZwowV^1MF(+2 zgqReor>6%30>Y_8sNM7U@e%#`@F1G@_~>$(lS7a`J~9%bV8csIO&t{#g-uLNZE0pU z;*Ae$Z)9Wy925lw1tmmitDzu`?D6q&Iob)Sd14{3lWfE5n;R0&N<~?80s?x|v52OI zhJ;IO2XAkDr1Y$;BKMP%lhnLCMly#Lat;lR)ukm>`RtQ{rRC-2m6c5V$;nAFGBQ$4 zYR`EJTG}WfQwHOI&(B2o`0()XM@qLHot=NWM@B{x5)v{pGN?FA6?Co!McJw{Wc6a=Rs>GVtrevD^rSZy~ zfBg9Igyf27TUtD;KbW_^zTPY@Ce|=E-gl?U$IBa@nqDLNC{~aUAkeC(wV7L5A{UpC zfciMRxY*p-h#d2V$bcR=Ck+WZ10@+A8>_3S+3#p?A0Hp@A0owY{bT~##W%mr)Ay_K zwH+E_IC5<%?|R3dhMSYKyt2|5Coem@UMo^o$nx>=QP04DEPCzTQcqJee<~<7Gb2Oj zm#)74AiA%w@8;$vrYD?}P!-7%F|LyRDS%;>kdW|Ycyx#&nJT)chmQ@!C_PMDMP+e& z8^L2hy3x6aglg#@*$>|spa$eViwg^sKYlRB`*d`4VC&{NHhOz|+t}M$&N6Xv;ee)e zP!XYW9Hy_fg@%Q77;bNDkTM;aJ2>2W;hg>EzV^TY`9ZRe-dkH+dy+CeJ1YaL-BTim z_Dfb4{tt$Ul@$#sXR&2O~Xucysho}Khii78(>$>p75SwEiak}1W>T;ejKl%DMTm9Ox@`!o! zgl4El|oQN>RUIqjUN-@iepk~P+)NgNZmrP$?UM>-|^!51xy+CK7Cmoh|L~G_ctgNhTv=;eKR1_Q-9zzj?b4-Q=4ic5r70dhE+t&vcGeI!M%3&k_2Dj%Ja7js< z5KB3Pu?w-m{513P6M(v1y3JSj{Qdj4pC3|oMmG5jg#&9KGI3ExR@M-7C}9X>TSqkk z*hv0FY#fDFV=>hLO5&)5H0~gQy8*abY+YRti&RsRGVCNUy7DebcvQbo8W0c=Mv`9^L||~SOf{oJ zfODG09b__t)EFYd(7Fr3Bn#%1$jL0^*Xg0KrvE~=Rye8HVTo1)M$$bS*hWaHYK8~b zez8h8+2?y^t;e-PO2|7zQI`@mBU^0<_dh2a)8FxgSrk!JB%M23TjL(WK@Z0)YEX5( zwu_g=yi~FK{D!GV63W4oSY8-+0)j*LJb_JgT6Kxr?-V^X={J^|iyW zMnu3rc{L~Bbo1C~U3uc#nE+r2sR89RxEiiC*BW*8pNY~AP-2fiu3KMxsGV1b`@o)<#JJEn;%=@W2*%F_8?42AMBelTB;-(uGu#!O1!= zvDn-tD4+bt)iCA@lD&O;dODqhpFcKj;Z)@<3iVvQUzZA*hB#cGHb$C?nO)jKO2su3 zDa69fA$n`RFxz_2#660+cbUX4Qw`u;?j;(VQ_xI`(u97ds*16+r@AYx86XCYqzx-0 zTWjVMFFVe`yo8rY0TwP~DVFPw{*nxF7ppJVzcWJ3Nq;LtVdw6?2Dae6l6|H2$W(|0 zjjaGbmvQwgzJ>Pj@}p4GP&>g7l9;Cl(LghGI*;b(bfOr1glAs+nBV-9F6D9O187}Q zaqX$lKK~V`r7RkAwuB9eq0GvhySfI1-P*}VeN9Hoe&U%_6(6&qjmv)l6ewp1w zt1ZC}Qt{TdwJ0{Li_r=x)gya@RMAbKjoXbSf>?wYdR-0mL zJc0{RYCUv-+vbp=pAoMhK(w#3E3maq^Bu^u7f-%#E(m`3hb1;RZ4E!vj0fDMT>}7v zlZuhA8`?@3iX0eGt6ekLhRzklE46`o|2k%0Vc%gin#Y&>rcqO-xJ2he#23hRq*-f; zB0Q7e3jRzil{i(ak*95G$PtOvqC+(3w41mF|5PAwgL%)fR6WVVOtN)%xFZ91+-T%l z;;Yon8SK*A-?qc={qFv)?UabM1IvPX>|voz)%8&VLlVA5BD-dHIk$8W2H{C zg`fzZ>Tt?N!_ zxpMagD@u&FWUAb?t7qHJx+PPzb@Y%KzfhM!f;7R9=@d5jLf>6rXy1Viw`B3mnF_0x zLRVo)1NHk@e{2K}BA))Eyhw=(eF>yTzi!!zJxi_*sB$wo z;mOL&Y~EL++ZeNsygh#Z-?mY4;IWo6($6Mh+1!LhT#`CM5!Nsez5o_mfJPbl4>|(8 zvSf&8yqpj#Q_{3K?1uT5@dabwtnaGt>h<>X`%Z4#^D}?lPHxlHcE_yqwR7Hk_J!{1 z^P4^pfi^W9izV=w*yO(-C#%}-{d&7F@cV2jwhBWcn!)*eSX79*g2H#`AAln2Hk(YX z(P`_1*Ks;62z!IlSr2pfyBonGm;PH6%Ux-DHTCP?$+Us*D@EF>>FGiCxeydV^Y_;~ z7LOM)p16exWf+00CN=55>7Tm}X>kHyFE);rw?;#u$H`N}0*9HXpC z@FBw+#zu{?Dn_f0VFX12--x>KmkaeN2%LOgGuLIS?Iym5Oub2uMzb~$| zgKvoNpLSc&x=$CYb<>D--S@C+9#8APzW>G5d%%L&rgd!wvq`8cA{BMdRqN(`5xez@ z#eWv5>v`JHYBJw;93w!Zl;wO{GwJ($+6?A#nCkeO`@Ugax9v1ZFA|36^SG?>Pw02~ zOq#yu8P82O*h3r+>&d@af!PXWg^~!5IT0kjWLDQHzwgiID2C3{!#II!sq|7cPWTbIU*qdd=JI=OyS_zwjyCM28xq{7rOquw ze9v3X6BKFbPdfHJ$AFm}o}bwz3^a9pUvGMD+mGX9adf)vx1ATYU3-CW*^L~_hWZ?Z zmd@0BBf632J^X=%HYzUE58150W?uj1^%;*uwpgz=W~s`hF+jAq{>^dY2O1U*lP+JG zQZ5sm(bY*7oDgDst8I1v{ibg$^qQd$YX0ai-`i;s$79B?T$sAdrysl6my--#)wG0R z+Iv4BT$nu{PJvqECEyXL*Jxv4Bs?ncznZ4Ok*yHdyv1?ja$n*IY#mSKxvXe;;3#&f z64OxV^{~$J{wvM0TVUm`(`l=9yV)5*>Bb_4SZ_~`6e3xOGtElOVKIvY0GE)r|Fe?^ zaK4HV6txO;NJw^aK`5L*?#77hx`7LCway@KodmLu!Ena(_)p3ko&Ys7Aoj3CQ(FDsU zwgwv2;?XML5DFeUeql|2Ug+nSZNzg3J%`O2Kr`GcnDtW9NqdI#FnUH5^@0bkY0Kw% zn`Vt5c3pE_}gCv(z{`S4ErO$7`l}g>Y=jOI~P|TjS z3mkh{ZTI~jc%yi(F)3`FoPK6rP;c0aacRq9l#|)KoBDl@jziPy=0$mt*IeJXGaFfW zP_Y=ipNQL$rHK`D#LVGdP=jmTRkfXw(kw}1M1H*7OYkyV8Etx?HflW#B}+TGW9mar zAqa{U)Lq=P;!m1bt!0kOkTNj@JgKZ$d;0riqiJ#F8q(Qw2eX60`2)oD6!|2{d*p9X=Ww4* zmWz~W-2Jr5W0jtC7~8(@R}%X=h3=kP;|C5h#E=C219`6#AzdHpF&-zkCP~_UF+52nsIM* z7P z6$uvrQ#3@Bq>U!Pei&bPE%;wERD&o98jY035$uU1Xtg$#8k+;z;)>i~V}&=OL$j}u zQ5AVEid4`=NSKIis9R8w44pQnZ+L+^NaW%Pxs>dvJ{~gJb`5iubW{hB+YpXAc6e=DP0lui*Z2W9C=|G(C0FaWnz{ck{RC5sL^x3 z9e{Gq7PS;a5;Fx~3LTE`+3F40>UPJWR{cxNcXy3DE8~)lo*WFf#R_;v2d}>h=e4RBKw3| z1je>~MR?DoPcW)~TgF~j1213)vtx;2&pG-}xR^XSI4S-POei%ZtZTB;-Ab&oAyE7d zU#S$*mgcjls(6mh6LYaknMw$}FG(tU7N-QsUqV?*GLhwobdMU1*oy*fVdC8gD1#2E znoFPZ*AevCF`77X$Y~iX1E|LcRYv>}hXC2@7Ic{+IdmH*35#DoMZR;?rYnbojL0bd z?L@^Q+u`L%dy536Q{!HEwG*LZ^V0#~3c&BhlvpbyxEEy2S2mV)7n=(2O%W{0MG|fq zb)JV@fE~i5@#jCR1Lbm-z(-nl%%K3F=z842mwqW(d80vqi${4?KU>Ddbcq6Dn^1TvdyX zgGgFzxk|`WkT}gNEABoC>^#2<9SJ8qL2s)$mW^KQ>2tG7=!>Vzrdj2<<_05}Tz1PF zxgK;+SqS3NHCr4H#dgdA>P+7C)RO`ftKtXV4byQExBZ&FuScxzWnLM}S;@rbw)}=( z#JJ_OW<0MUYDerft})0MbT_kV@UD1a%U5A^d>Z{U7ugcz@>$co{CMeLA!;Z%#?NrQo^q{XBSqJ%H` zg;EavCsMMQOMPluaeqdtKA;Vtcsdp=^FG;lVH5989bHjOTx3aSZfpv^xQGCOo&KY+ z_C$_VQKs^+%09FubUqgx*1ZN1_heAqt1X%D%gT-yCBD(tHCzI9T(yWkplEBp0=nd#J(2uCPh_MJHqBQvW4sstedTVcxBSZddiRs#8IX&pCwsk0ait=|+k){zg zERt67kS;PFP z$%j_Rn}6T81;w8KPX7FUkI271PBXavfL>k)z>)0i-zw6oht(@1Y_Sv@4Boy43W=#A z!=b{!nIIP2BYv8~2~1F@3`lf;xoZB}Im#G4395O+HddE5jM^^?C5G<=^hsu2<{Bj0 z*O%?Nv?z`G7wwpPRpgG?OCsU5e}CXsoN{uq%#ZoMy&$}!~{Ixl~hN2^sY5N6aV zTckhtr`Z~_r5K2ppraJ)HAR@v<&8%I=Mr&8+(13R_^k%~XiMtY217d4oMRhUoUr@Z z*-&+0LRpjpBSyzuLTZK^0zwZ9PlHAmOlPpip{A}`PR0pR@b-+R=4FXw) zL{AbgBM64_k@i)n_H9WR1B2I+=m=n{W>o}h-O}$Nci@2BpMovK=LH7e!9N7SZJCg* z=QodSJ(JL+iY>RP7_srjePMaQd-vedA!)Ff{^W5$sAK!~Lo|gi{@JR2 z$*KV5WOY;XlSIQ8qAJ9OSRxIi^y_chy1?@@Y;ZM%22qbuxln0I8K;N2VNppCKP8nl zg0aDY>N@L!KnXd@6QMadks#F+j7!3>!adJ8n{C`9ThN<2s7cT)|NTgghycyPQeg~t z3SVjBj|QVeK_- zi^Q~BqNf>f&PXe`Ava1iX5`{M5TW51XwXPW5KxBly+GJ@UI^WRGQ)~JNV{WotB#_= zcKdKROcX_MUBx>XP^BkuePnPHWYZKBa1@r$-b|Hc_7wTHoTrjslsDemdOzFj-4v8- zp7Xx5y=p56(Z!U|(J_nz4RIK-aK%IcPw=b+{P8^z#SfcJWx=8yk+&t;PUkRNj1fa? ze5gDpPIPQ4E)Iw7O#O7D5;gg7j@u3j*y1fp>I8JSL<1;5Ko*o=OZ>(2;<2G2cmh<_ z#^dLuNl3~OdBmnm?*H{R0$!as)FBmvU07aU=U^duMa&*47-?FBW;+aH^3`fBqG|zs zeN4W9G%v_fE4k0ot4Md>wh$Lde~YQ(OEb&31GObu?LiN`CFgIqg&4=rKb$!w`b$*_v@A2+2?q(-n zLZ}8bDFm3bQ=c4Z7G2mz%+AO!AQdu2gQa&|SQV@WF_*B`X}KDFcQ-=O(2JG1Qqyg61Wwz*W#mPtULg|xLHdcv zLvUrbMZK-XZN8oLPnO!??nwc*>$qz*#fFH_{=FMy8nSiT-ntP1INM%m&_d`b5-}>j z-nyHEVCcl2s}N(wQ9q;TEGkDnQ=WKOGx<}-uq(kMFchsew*v~Bu)@*}@y zBC}V=Y(3yu5F17s0_()flHZ+ZhZV3I*_N0R9wMfW;%Oy z(Myj^JM9>BJIXT)x*9nt<1_B${iPg9O{piERG}wd{c5>j$~O@5OPU5+F|lgFEL5I$ za=@$a({4S6W20IsvdJvMxG-cAV|ueM8$|aavD@s%;H-H} zYja8(zwK`#ah?PT4nsnfn6p?R>HE`URm)`>O9w}kBD$EPo$iIX9ajxw`95YE>O`@7 zVW!TGlCVTv)TonTVB(B*(|`7h6Gc?g;9qRTkEw2JM<z=Ugc5hcDZzwbgnbPwDy@Ppq)S zg3}Yd5qEqb;C5vs*!r#$S!m%;x_odSue)$V(_w`eiSh0;shvb!J_W1KG{_S*8R25n zrKdvKgv*@Kk5w>)se|u!^|8%e(zV$_KGGCKU4@e4`cpvJGzG+Nl~Ciky`*dOfDm^05u*6n>K=Wr1m4<;;UJMv+lhJB>4@09;vkWT|E^&|x$*Jsx|V zw><5>k14C+;$`##mEn~gckj*p5O{|!%oK50tP&#S3n9_OIqH$mt=cQs{)s4825nS> z5i3!))SREAMQ)>qSCgAe`H-jdVoGdUJE^)DzSYXA4d$lPv`P=DEpB-eHt2A`u++7$ z=U3(HQ>9S%m_+$)@<^jjmPo8XWF(qhQxnF{c(X{W)Yt16B_>|9lu&jZB#L2HrZyPP zslyv9M}xihv=!PA`icA0#?jYip@36`A{Aej#6&u?((tbRY`v5RvW~5wiY`{62tQbN z)aYf!AU&MlCM%w=pXOH9hWHQJh%ha!%_iYx)qi?qR}3pHU9Ae9%|7?kRoWx%kgk%; zJyX_ZTsov?H>n<1$&-pU?ofKfdVkpI#KZ&_v6TOENQ@Jn-rQc^hmMIlB~4@@zT+^;bk@(m zSwB2!)hyQ~z5C^yxKc8TP;~97f#APPQ(uatCMCM6Dg-v8M4s{FI!Nt&+HMAIz4 z%rA2>ywAV$Jo$??VIOj6q(BKY9Un;l@(BwG-h;ZV}xq*N> zkQRA0pUz}{0g?x0dg|)p)weS|H#WPyJyJ#=FLxm!A#K~Pc(2>P@m-dbw)TN@f+2SQ zau}zO!;OI!MSK{9#J|>TsRHBn-;C`75#<7)a3G_yNQN9MT5@Lu3k%E8^RVzAZaZ_+ z_w73xjdMD3zEgctm$XY;q|;_s`u3mw`M+LFWE{{vp>=1PN0)?_@vk-MM3w#{t{yK| zH536Fx{e`i$eNpN_C&1a@PpRl@gzW0yyLQQvK^dHv_FAV0i5*x@!}cCL?}i8K7%Df zw1vZf)P&1WD1t~;4{(|_^gWIr&KB|5EaEf$Ln_f4D0I_bOvYVImVp0N*Bq$=-PEyozxpG+yOYew4`N3{{UO_S;FdV20mdcOZzzJUTs;x+Z zetB1;yF~>7M|2g~+TJ&-%AZm__dv&b48hXRmz$P_uR$c>-qV<<=l6MwKNLFzvTJ3{ z6F~MvAuD$z3TyG@C`kdB=^TYv6mvc}ohjhQPj(entJn23#X8HDB4qj>uaTHlv~yH& zU=M`ApYnqc6DKFq(gtZJQ|Y~qQ#7a^BhI-GqghMkvO;${4`X@eev!6BJ8!R8MwkAXpKovU>QWMGWWlYM0aq7mq5)C+l2(PA>|E!G<; zJn`Ad603gA=Au*Ov0JB#KJ&j{vg#8Uhqzp!gR=`R>Lj0euyKnnpMClt$=+KjEEhM~C^f%lngq~48%eMsW9kR*x z-FKlAs_6Ownxw;2Ck1PprC$PJ}~^^14}wn2=1 zzTKZ@aBL9!uyx@du=j(2gqo1@!QR9fciu1HN{ARw$~;3&ZeGSKQ}k*d9&hYJV}|bz zh|9a`T)>b8hIXZRt)^eIlyV^)Qa$dlbhE}QhWbMm`RG>PU!Op>M|6fCsD*dK5A#5? zet5C?V3>rIcOKVE!#9&BlGMPPxgrT9bXrQEn zLpf5`Mj-rzAVJJ)R5ufqAJ^MmNlrnO??9F@!y8H9!$J8sH0k5jW*d;&qNGa>Z!qrQ zQbHpIPlrMxls!SafvSQSi@^(f^LRZ@^T=~oG27)kng`B=GZ3Q3Bf4cFIp6jB_6ZC< z+E6h(cw9BW`YW}^m&@r$%D8pAKjg9O{&&2h?renJe1T=yS8CuKp21L+fbGZM*ggoOsuF>`4$ zX_(mQPU;ksaCE+Bx5vViD|-XA9nN}PB7d4(??w<1|AU|LVf8ubhl&cl%xN}>coA}NQ%p5Pl6z4mY> z`fu!A@<6qCqFOtcK3oQ~L=L@|(N9hyt8u)k#B=^mk zoS-BkeeZi-5+H7hJClrO6X~XCO35=)R;sngCjU~fMjsn5!Td0lqG4^qLmHHb$IxSe zbAV;E{gX`X4X^bwi-6*qZHzfYE$F-7oNy8SF-XI@pRb5i$g5;GSYnTw`W1mK&0ct` z1an?e%YbfzIqWY-p9#BgLbKNC^56ZyKiHFw>N(7XM276GjEewqG zlap0dciOFnLztnzucQ0lUjDC&5j89WaY#yD3Pl1u-nkfmI}nfD31xHup6nU2LNtA( zJqX=|*Ec}cD4af;0cN`xg~AxM;VNQ7e4@Vbe#gCdR0mPE9e6pgF!Ru1LV+bOmi!&Z z=5gPK$)GD)J!h*`I93{ot@;95JRI*SMt}Wph9^!QpT!eev2-P!yamoVD%!NsTJuGW zAO4j~AA?F*!G$Lau&P(qlL)2PU@jfSy?1sr8ahEQr!wX4kE&9mIy)6CUNG1 z;j13=H5=X{+9wRr?H4E4{i7S(fum>Zwm9rbC=A3%h_nA+;iH;PNc54tUu@wNVGlSXw7}O-eZJpa!qDhGom4*C} z3JDT43{{n!e*7jzgZ^I!6Mo;5*o7+bT+1nLstpU`p;Zja;LNl}EXXmaZ;W^(oHs?r zGT(jn!lK{kZ(X#&JpN02Nzg7mZy{X57Yz+p9=yj?V=-CT5Qh!+)Ndnsu47&`xvx~u zq+}cO3k7M8roQS5?#pEX+YL5Xkzce5DmW&i(MDv5t}TV3BuK`#C_FhCf{NOig*;aq zElF4P_~5T=OD`}_6-Up7oQjL3a&qnN-_&dBDLH3r&9%Vnky1+Gky6Iqmq57$k@rd3 zODqjd&GA9ON~U7rf(QgEG{?zpD-j{`*OPOkxt2mX7-Z9#0^Whi6Np9< zBCb+M;=or{7E@DFaG(MNT=x_x`mi?B)6aqV;(n%GZxLue)E^a??Y7$cz6ba}A5?OC zO(znkws$M)XV0HMpLv2!UfGEP?S->q!iAE}J(9@o zW0WqW4YJQ`Fxbt5BNd<7bkQsZN@hFxR%}JZyQiAWCn0m|#f9t>O-Fs+O$r%Rl zUO*sP>?VsMg3v`9Zwne@x+XPMQAH6^M8PW};`L9#D|iJ<&H3^P;4yC+`4rOmLphyYj3ALbp5OA>+bI7Uwzfl(ec-omOGz)1}g5|z3Z$ow-CMh zb1V*prF=-3mV)iux5tmk#{9uRu3NeY6oqfyKHg4QFF3xS+wyCDIoNlMn>C>lutJ=x9 zo=6Lc3F_+VTCrk<^F~IG9=(43`e)CcCG}0EPL3Tr*3lxbUcE{;Md>_n-~j7sZO)uI z+?P?_($b=l+S=OjwA<9jyY<}l)TvYMb#_X@nPoSh0+-=wWg>luxrmlYZhmxzoqrx= z^x^pN-FWWYxhP<8Khn~uR?Mg!Y|`VL%9phab8XqOW%=^uW+BIz z*|kAnX2~~i-oz7qraY+I%$YMsjvU$0(7@oPEa{{tY9#nBy-*%e3nnUWbfE$|TV~X# zQH;;Labu5}%2q2oeJlIwE}Y6q8>=`JeO`W`Okssr<;TwFhi46B?b^GWpw-^icKh~i z9P8iTd^33PkTGM%OsTK`!zZ6KHZ@I~)(E!Y$F#=AsSOPiCQcN?^q=p)|I3$OqGhn~ z<#*o^#s;9S!YX)B(BitGRRM>JJ;DeJ@_TShHr0)&Q{hDyO3$H_32LoH${06DCa1!=Xcm zDtB&)Nf|U~5X-2bvd5t#X;WYTyLRoOp5h##{X_=@IImi@>cN8t;+#0O4aY4C3(l-Z zhlzYTyr!n6uCDI&>({EGM8Q$CqtMcoVR`()8QqSeVXkJ%?HE#e2K^yxgzGshEbq@e z7@oY}TEn=enO(PT9ma6z&>>`9g&s52OSLkH@yL6D=fD5UiHB9vuc=%A{Y7b~szSEj z{kH@E7#}?mm<8d04cb&yHF$De9ctwaS5c*y0U-ZPD#3V#U=m>XPr7c(6t_HXZTmGBtrtBaNM|Y13Hq;&YwSz zO}dc~(i@xn$;yuPfW-7d;N;k~Ku4J%5T2E7M;I2A1&8v81(7WB5ERqWTYM#I_SWrm zYhb>utqr3RkqyE_z6$(y#XK+oCD>uq4`QL`M2j$5TKL2#kOQqSAxq5uO^SNKV#A$31b9cEUkxS(iAzznAx?VKP(wM(&@;wRU}eZjRn~f-AJO2 zNslyR#thS^le*zoRwG8so=TKc#bOO_+_-VsvSk)kFj3bYGnG^AJxckn<AM!>DH)t5y+6$XtCo;v(tb{Y+D7cYE z5Mnpdz({2=eYlYfDK|P(uzeHZ6w;&P>diM0aQRHCfTk$r1fR|WUOGfwQ< zb47;uv(ly@`B->ilVWE!d3t?)J^M4l_3PI|j!Np7JH#uY5rWnF(mt^#lpgN3_+zo5 zl0>KT?2OY`4EdIka*Uau$gTnZ$BrGNT@fIKi+QLY)74OXbx=SgjAPVB6Rtq_2K5&i z7LjwtC>bOBWM(R-TDiU0f1d8bO8TXE`Tl&~!i5V#X<9JnO5g|xP$@RepFf{CUq<3q zVP}7FVO}LoSW$QP*D&n&wYBD#yNayBV~A$K4C+FB67X#*`H^-7hj?~WK)Dpgzj|&I zYF+c;hxRi9t&lnfNU{R?eUMAcgL??X>OX|*t$v6Z6d)l@3n!6b$y z*x*~34L6*o`o1lIVFh}N5Z8b6RV?X5Tu3IDFJDf+PbN&>ToWTrBC{aY$V7fq=%dgy z6KZtaYQl_+)VxPbJ#IloQ1w9gyh5uAM{D8w!Dm8J+$=!mh11}ivU zImXPlDt|F&EAKgKXq^E5kRdUu9(>D{0jE!&ZcxJi&U<*+oUQgiJ zExt@BIG6OTh4=^%`Pxe}y@$*8BJz8L?n?26MkocUebq48vn^7DFJ?gNSj9)yXY-LM z)fmYe9e?kjUhq?d01(^O&@5;KUwbi0cHPJ}=q|&w|3H7Nli2Tu z4nk|jJb3UR;WMe69gan1O95CC;wI84X9$AgF&l({YYbcE*Ndij#LyjNi0FkWhSyB$ z%glNyF&&R&?Bh#Ze%7tnGQ&@+YcyT)55{O0Cn{60{d9x+8Nbro-Me=ig{^;Fz?gRo zFl(8_&V`McNyJMg5^%<0jS1NdON0|O@9VW@JVMZtWEFY0%UFl55!1%+AFf+(W=tAE z#G=?4#S{dVd0UIlElcR`>+2aqjqNr9ip zmV1R>+7{$3ED{!z6B-g<1{Ycp5JiNijg=$-D|<*{HWSx$LOYUjc_}hVTqC7_#9ELQ zuSiDd|8?c*ot^(^Z)>0U@yB2oJp!3BI`%*I?$|}DEDHm8Y1g{LIvB0$Mq)7g2Pg<8 zGe$CkM*aaJIDsI>CW6s|fq@7b2&$=}8i^ocpe`5)?uh8>*fYy2YcS`@;j5 zN4@UX&$hezReMfQl(+ADbzj%?neTk(JLj~&35Wm+z}f58tt~-QAjU#_ z^Xc*18%RlWFGb7WY>|L&^ECz4TCF*SVu9KtM~=7&FofdLnNe+yKe2y|Dv8I3wCl7DgBg905Tc;A^ zOv8QnbeWFcQd<6ZN!I=6kHzE=Ic7_s|EWnp`vGMD3taPk6)NH-d--a^hK*hGDZr2e zx8ILHSoF>94IZMQhCILs`YjN7|Ni~$!4?a}bloWM7M7N+7tIL3J_(?={F>On7l9xb z$YGnf2rL(Dgi37x&6bbWts^?!b2|aHnxClo{>@L(9&DA5Uci@9&HN(&dY@s~?zY=j zoTa5f)cVU06>kAgQhopyM-M0QN&+rWZ*5?D|t6;I`@L3;(Qh+D&@iCD`i@% z074orx`2LBmV-d%b=T|*$t0#tf0*vi486pUU`qm#C=z}mH;K4bT*%WkT!kZ%b3~T# zjI<8KJymIE(Pl*(J%X*A-nG19`4DhG)n9+T)?v^F0d}JSMEhsK-)h3?P0^ZIdHeRw zqDba*wr)t0(`2tA3HX^t*ic`TT|%_?z8Fg*wXDviF0XB@o;Qrw>N;CkJ~55faJdd3 zXWXCZ4f~6se}{)u6iX=vUu`%YsjQqJGJ|-Qq6+~wfFU?6r9(uf_$~gc%ZJQ8q5a~&vw5DM3*ZNoAq0WD6|273(-Z;L!P1+7qF!eOui{()a|pA1#d+s zaj?6ykDr#7mZpxOD73tm_hAG7EQ|B%x9YF$@m88fGs`;8XQsbOK5^(KjY#?KwX_)4 z_fKdTCFO|yD%fY}E(%~N(f{eE=g*%#4vtlFK0X);758mt%{7%NrT3}~wgeyc;i zi1AB%LwIWx;r|GYmxrYwEvHhG2zWW2Xzx#J*D9NQF+Q#=ZsW!cn>PKWjZ+|A#&1=3 zPE&EMSu?c0YZ^NtO|@u3ulBlO8b@jH4Y?}X?RC%6($cC>iN#_=_Hfqqm4&y`R`r3d z?v!`2<~_|KR$!}b9n*@lPC+h}P%w046^Vrzc*F%bq`^MKb}#?^65eVD}PkWXIyamCVouH#tX>Qcsbj;U_9IZ>N-SQF`)R9!QbrWx;rKQ!A zhOts#w>a=7E?;qYD{ZDfvnq8k39S|%Izz^?!^lYQt6qTiZo~TZ?>~I-e%{A?^ZK4JgTovPk8oe$#6dgv?_ojZP&o(m+pLS@M{3tdXy}5Z&Ok;fR_TvyTdqPjH|-x0Y>UMuvXfXdvDZ%_HrN;(G|HN z5h1u1ph_lDm9ER9=+cu)!m6%4aNvMN?Fn=_S5_hwYYI&?(sX|;nyD<+%5%3xBI-it z0KE=aT3R~fxe5}i>#-ur;wobWmmfpVY6Mslzr_g{mtyqfV)0v!WIVZwa*?67y^E{B z;Tt1}bz6;vznu2A)AEVQZe`MNiOx?W&k=xJF`7ESR*a}aS=rFgPGVwm;@-W#kF6eC zzkUPXQP$nfZI|@qCPV>SDkxzoIL7ok-7n*bjCCXbhk?`qVDBzmxPYKC4#ChN`9xF} zjCJeQEe?gg-pB-3VV)Er^Dm}516!Pzv4ft-O?-;{qqzuho9?4AfKP6bYR$FiE(89I zW6~SN^g1(x{S@T#_;!L{aaxV&=*Hl%?trbdw6r!__%MIkqA%iO{w-!?nL)?@w8vX& zzPAp=5l4;0%nvjwU70_ynt@D6Z=M9&b>?g$43aU5C z_Tj@!zvJTZiR#7QtjH1d`v^OxKVwkD@0@7=w}^?)PQF>1h;G^M}K zC2e*JEqUFxZJYDQv`u&`vV@Ttgm22`M~@!WTOE3pYSg#Ax()vn^QOWT#>C&cnJVLz zzhh;^M+dPNSW`-|?1%iK4!1j&mX=m!wu;rcu2|s~1X@-&8AUKiasHt_-YR1m7X@z_ zGmkPC2Zr-83Qxo+fLuf*%DaYA!k~AMj;2E1Kt5rvOCCOa2$_vKR#~Ov=?s=@Wmytk z-GN-(0X7Rt;7}O(QGhMh1h($n!x)iI3H6HO061U^!0(G6I?5rdh)TZC0i;I( zGJN~fr%x4H7F5InQ*PO^CHjop!`#OhEzM|5fY8uew<99aG7lahg#U($qI9}?hcjo+ z5Q$>Eu3o)bogP6Wfdlh~8sXfzbAH4r*@=%IP|b2mn>TNc1sI5+f>VkZQonImq5Mfm z11)KUsiY}3W38wl;)LLuV`J_)x`yZF6^|c3?$z*^SaCKFOS&puz}<0f#H_#;PkZ?A z;rcN~OuyAj%k<*XQ*;rUct39%@$Q|waE4e1k5#~yQb%kP+-7B|@z(b3+c8N{j^v;u z9rnA-?o~y|i&0aVL&ZTnc<|ut*|U`O3(S-#G15qEMCyoc}%nWSa64HhNx_U_#aXV5lSlyu`#cnN+^XSwAko6LYuA+fkfK67rF9}=9*leZ`0=h? zyS8rK8d*FLP^l2;qwzQq1<=MLh185+0<$6!Nf*IC+rzo>ha{@5au}X-fcYy2lfl@z zb0>#s1*Rmo(6^kcbOw1=k~ZdmSN#}LlcR#c`>U~B%WG+g7Xxff{739E zKK?UYg-j}vFRF7sg>uu%5O60l38OB8ym8|OHjXQ~c=2Lv(3RH#_&$C?V++bH04Un+ zY6*e#28?(yfJrT(mZUawg*;>Qjnik#x>pb7aZu=?Xy|MWp9Zx1cB(dib(f^EtatSTGXi$)e>uO*S^!MTP zP+1Tj?!NQ zRy#3L)q$SOVmvj{i*Z1%E%G&NA8Jj^3R>Z@LS4ZiLXjwc6gxX*X=%xC)dyGC7mI$2 zg#7&Z^Qdk-I_U!N6s66j8b+}*RRf1(a||Q)dh_N@dqiR)RdR@O^Ek%9kt~Yw$~rV7 zpD?fulwrIa)J5CCC!^L7P7ql2Fm~?Qvq!>FN>NuD=uH^uz z)kv^a2rY?10az%dWC`O!z=*I(iy2z`U{iwkVlGDrl>>wfGz_B#?Nxt-K!TRsP#zE; zfBW`r9GFj`ZIG#yF?0arQ|z|~8HVD5w_qmKD?DQnZ}Jr3EA($fees_mg3i zNgUV=S=Np*GB%?=ae4c6r=@WOi0DWo0$bcfI<9CVPOTG`_)&NnZ~5e9|r$js`=I8+UVT*GehIJY_l4=#OJD=J?&Ya|f_% zI7avF!!&*?^;_A_c==4&M3nH4AAiI}3zaw***c3P2m}h#Y~_Njw6wIGSIy~x9b{5L ze#0wrYDjcSa7YCZ;R8*xpp?fO!6Fzh3>M|63z1=3S2i8SxesscZv$MrH3XKH9c&HzX5M&1oeB zLjR7YI(F=s(jR-A5cspRDq~VQ+{h+pAI7y3O=bWp^*Fa)wEPo6Z& z7I2*X7^7fo{xH^GJ(hSYQP;9%5+^4nkXuAZA&{3tj7F&f~zF)Vf}<%4^;S;Eumkt8K)QbPh| zXT3mM0V8hAM@SBWM{yV$Q!Adu-C_z^DKIn%qk0D@ikOVp)bSj0;QkOHvrso!Qz8;8 z23-1FHAAruZmLNH9Nn;XjFB;1T>t(1<@vu_S{nBFpU<9g2U7kh;t(Q4kJBbvD=mdD zBW`IqvU=V*qR^bYXLuc6~8$TT6qPdJ8hOMD@k~M=Qq|QKfP} zS%hS~mg{(LUcVlH@dDW56vQqvi5jAcV7d>s@NoK|;=pMs>he$01X>EHvHGxcHGNhD zB+w+wsMkZxbqQdqPmkC%`tHmNP?Tr8M2aCo)nZh)3eg=^@Y-cr~~-}^)(Mj1xgp{a;>)m$=Ii4Jb-+koICRv4+cuwJR=2Q-C^o%r8?e>9q0Rin2E5fw zr}4ML|GLxqt7UNhH&nc(9-dpQuITd?qfU^A^1eej1NEOwaLdz%jBzO}ZE|Yr{l|_8 zyo2WH&;v)%@vP|o*}H?>xN#r~ph(8EnG?+cCN~J+l>zT^fdIKn?vUM_AV5|Id?F{# zLq6~!NG+l<16y{QwP>{2l1Pzs)vsSglEszrps8{iq^U}nl$0k!caX$fw5&2M8ay#l1OeXivliQ1qT} z7aS|D9cr6$=i^GV)l`d~G*!ZfrY03bjk0l<+fpmZ3E7ab?@IwbK$BIWWlG&cU!_WN zb_Wq4P=HB~4f zX53@MCbTe+orLt8fd-TZgKHYgL;<67y)GROZWRuGR~C-(HOk^a{Yiqe9@8rLSnb_{ zoR|Yro`r!l+wCUOpbdIYy<54EQ=z7q!=~2kheOWuxq4>nX3YXJ(DG3ZZZ{vI3+TIX za&&h3r)}-7`#;-2A4#=4v$dk;*Vori(G}AXWHaPNB3Ez;*dTP#3kO>{X~#UIvm}Aa zTCje{$rzUTu#3nQQ;P)!!q6=;Bp7Uy=j5#R$~H~rYycnl5_zC*_cZiOuE(G-lh%7% zOk~?=IM2Zs7EWjPRJ%fBL6l21<*sa_23hItR~`HD<3|gEY?H&aWyl%V_wV21JhYRY zRyE+F(0-~;2mzt&pu_peGV&bvp}dcEmmzD&0BTI)MUOx8-KVEX#aJB#Zh5&VhDB8p zgtP42dEV!DzHP|>#BhPxQxUWUKF%cbQ(%9iB0^ci2I8C^b2hm=V&Kf?w0C!R2AXmJ zANN!ih-nT$sOqxAEiI?nP9PZ!E+R_pRGeOdN`WoQzThXBD`+h#J}%R%j(AeLuCRcM zqXKuDIa({>TEGQtl3eT>$;&6(VED56q#XzB+~(D?9YA=&rwRo$&o;B=p3Ka%?(Wq#Tkn8e zY(HkDkA*^(xgFuC7<&j{S-V~M;Q%`T*=;{17DllBUQpw~4!oMi+t$@yJM9yw!p=IX z&<5?1$pK=T9^S%KQGx;oO01TLINf4p76b+aw=vj99g;E1qNkO3DI5>v0V0DV=kyp* z0^5l#8Z09Y5wbzD_c5<%4O4suro<{*pyw&mx#9LDyzW+D?Z*fW4 z6{|fd%4PYdPoEfF3K!u|BT%U{HLF0$A_-^{$Hr09ICCC3MPsoj^&uC8F`#5ED~(>Z zrj(OMxyN>B^G1*_q=SogdRs>zxrc3s@c#71sGX@!r( z14$3!Mafu{N_qh9M`!+=*nM(fTA3p zSoI0Uk=y21z=ZVJ7}aJ_T_x^6HhXq$p*Y?Ep8H)9kd~dTu&-fFqhp$eRW!5 z3;Wr^?Y{6W*Rr^8S5T?l~YQY6So5!1F@VX%owqdqvD zbP(r{fHgdCggJj&b^^T#e!*mt7${#pA}|NyFhxL^{A(u4s#>grLiJ+N*p<{MG@}aT zte5RQ7)VWGMFx$xaR@I{2AGT%E+)JM6tc3CFz8~W9k)^yTzQ(bRcL@J@cERryQp#{ zY?T@>`Me8u>&@FYj4K=9^W~txlCMD1L{O-!=jIH)Av z2cnsTQn)}O*uq%oe~`j8AYJhm+wVrr@VSg9HW7qT3EncRv3-JrUfh$N7EnrTD_AHL z7q})uSGy9}0UY3;kUE|WFaZs|PzYJ{js?t>(wHa^S@YmU_C<_fhIl(1GpIK{&vvc5 zccdcFV*-l?2$hxWG_u!YfL9`z_%L3gw}aTI8Z6gdo>|7UCkm)Y;F3}r3~u%r60FSB zB6^7j*avpDP@5_2#N#Vcl2RcJ8O~1&2W@!j^qnbq?(Mlf+me13lU0hhej9#kN(TFY ziYYi~BLw(Kq2suZl&Nbpk_tu(2`qd`M6?zzxN>@mPb{9ohmIdP5OzhqS|#a0MOqjRz$g34fH4@X2%EjFLOGSK zinynA>!q*Pu=q_+ug6B9SfIi4>y`CC_x7udVf5~$B*8ocJB4C6GtWcUc zKn5{zFr+9klgD*kiO0QI20cDVUBr#3T(Ik&WYiWb`0{cQuofL3N z6(E!_mabdAtSL@1-$6`XykY> zmn?t%+SHU8Fnk93eyWNCUxx9YtnMkfj6gg$SfiI*moBTU0aZJ07;$`Sj^zkS3o93hw?xgE(8{SW6f zQ;6(@42B5Oi0a%sT^IuE37uSaI=ZJ0x180a;^Pz!#09;D_@0B!VXP+KKva8G(3O+S zU*_vb*A;kr_wFA^^yM_{?}e;Rt%eS zB4$1w6wL{ai)SH9JyS*7;G?IZF%VI*o*T;(Ji@*pS_IBo$dtCtfhJfPk41n9b_=wL zYj<@aE(EP*i6xpx1A?NKh$Jal{XP({k1a#YV2&|fLZWJyS9Fpa#*O8$CJCB?@4* z^QsEoswx~Z#pzUqybTSO9~0m7lBL;lujMczmRO*QRl^L0F12VQd53JIF=a1_66u41 zG7$`ry_ZUhGU3)ta1yX7*``tmlJ#9>V7Lrf1p#F12WeaIirQJ$Y{$ULhKAV+qZ>2q z-Y_4&i=c%-(o}32F*92p5qX#Sq#|&HdobP@lld1H6GBZ&nK*kE{cSURQ>kP?5Cs6Z$96UZA6t^lHk>qfdLWFZQW(uilGhcyN=L;QoGzT_d? z6)iDd)K19tEFj%&!vQj7$`oY$L-vnqGO)6NFtVN3mCkDffZf7s4_*HA=(UTO&+(Q1-hV++M zfJ_M17ys`k&G0&+By0l(D$hn?tB_KiD$o+DzyZiVWcuc?ZA`0>OYtESat8X$7lxHhQ{y{YRxnl4{lTkv?P^nFd0_0 z1A@Yc@GDFYP%ihE2m45ND=n|qpCB_80f>CjK^uOucLpg915p?r(^U7B6nhRui>02x zLx|uNyn!1p(5C(0M8eogjpu z);ha=eE$4+4~IfALC&bl<=Nbr|Mw&@L3v0)#lvZ|KVoAzQYH7VCh>2yzReS$zGN{Y zHf8xH8c9@U6j=V2i4VaPY*5x?`|N)W*E90jvG|^S@V~Hiq9d&0B&t|H!toJ82tja_ za-VX%fB8hgI!?|v9LmeGXa!yS}-hS4__IcfIakohpQKDne*KpDY`6 z-S!fyxA0C~O(vK)i1;DtAXJ5n3f=q?^KrR@^`I+fMjS9GSCIi^QiO@(U=4R5pi}dB$q}Q+OV2t!vWwU^>x2H#WhIW; zYq3rc01s^=gvc(=r5hGqhaOnE$mG*H^pp*W9xAXCdWDM^e^IhnEI8ns7~(@Bri%L; zB^!oY*CG^E&^pv#5@U)lyPN=QljmWDW*02FxA@`MuE&H=5$)f+`M4B41XD0FApFGj zMF*eq$TfRK6}MCs$@lo)W!S$^U07X+uou^f$>>`|2(jC4@{acj7UGY+ zyJwZ8+QITn`6D+GgbRv^U}!Rk$Q4W!!3%?_-oQ+}2xi7&;vlGjnczewMjAQ> zn#{k@IddO;VX<$0S?5%rKJA>nfnoT8YKOzx-1qA{ zl^Rs$E&pD*#P}D=8Y%_9yr$5MAb*(xhVNljgZKJv#4K0M^JFBMq#m zk@ktZ81?JCs;tQ=W18@gtZ8_u*_o~u?I?y;k?n?Oz9zf9)K3@8y(c9;y*&vxSL%lx zINAQKlewVIw`b0k10u&`>5@ltCE_9PsfQ!?+NJYb%!o;zInY?i)_CH=qNJ>fSX6ag zKKbO6HuVnoesE6e5AncChA_ald#SmLQ2bm73W&o?IqJ zxis!7smrk`OMU@@%WHglzp$p)1*?-lQ70#ma0a&TPfCRHr zOz+l77tHIV&Dw*$^88y}Y;3MFK5>5&zjbWK$u3>&uw~iyqDLnLY)Pn1vB{=(`h=^J zP&6f_h1Y4%GtgAUWjq#*h?b!63U4Vn_02cmU=ipxgTfjM3o-Jw$;M{yfgy!?q+0tkFaCLJWjR@W$J?amvRLP zE=lQ^lM6F#%aSU3W*9D00~=(_0E~*IQi6LUaT0DzY3}Bb)40KwsHTavmo_M^~<;L#D{`i3^UAj;_G_PalLDHcz`Фa4J>tx((C_j1;PN*neam?0 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

C?gWnxyBK*$t8Gzi@WBE@>0cK|_J_h6P7 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

lhUAQ_*e^afN~va&v#^I2S#oGWV0l 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 diff --git a/FlashGBX/DataTransfer.py b/FlashGBX/DataTransfer.py index 810617f..9076eb1 100644 --- a/FlashGBX/DataTransfer.py +++ b/FlashGBX/DataTransfer.py @@ -1,42 +1,38 @@ # -*- coding: utf-8 -*- # UTF-8 -import sys +import sys, traceback from PySide2.QtCore import QThread, Signal class DataTransfer(QThread): CONFIG = None - RUNNING = False + FINISHED = False - updateProgress = Signal(object, int, int, float, float, float) + updateProgress = Signal(object) def __init__(self, config=None): QThread.__init__(self) + if config is not None: + self.CONFIG = config + self.FINISHED = False + + def setConfig(self, config): self.CONFIG = config - + self.FINISHED = False + def isRunning(self): - return self.RUNNING + return not self.FINISHED def run(self): try: if self.CONFIG == None: pass - elif self.CONFIG['mode'] == 1: - self.RUNNING = True - self.CONFIG['port']._TransferData(1, self.updateProgress, [ self.CONFIG['path'], self.CONFIG['mbc'], self.CONFIG['rom_banks'], self.CONFIG['agb_rom_size'] ]) - self.RUNNING = False - elif self.CONFIG['mode'] == 2: - self.RUNNING = True - self.CONFIG['port']._TransferData(2, self.updateProgress, [ self.CONFIG['path'], self.CONFIG['mbc'], self.CONFIG['save_type'] ]) - self.RUNNING = False - elif self.CONFIG['mode'] == 3: - self.RUNNING = True - self.CONFIG['port']._TransferData(3, self.updateProgress, [ self.CONFIG['path'], self.CONFIG['mbc'], self.CONFIG['save_type'], self.CONFIG['erase'] ]) - self.RUNNING = False - elif self.CONFIG['mode'] == 4: - self.RUNNING = True - self.CONFIG['port']._TransferData(4, self.updateProgress, [ self.CONFIG['path'], self.CONFIG['cart_type'], self.CONFIG['trim_rom'], self.CONFIG['override_voltage'] ]) - self.RUNNING = False - + + else: + self.FINISHED = False + self.CONFIG['port']._TransferData(self.CONFIG, self.updateProgress) + self.FINISHED = True + except Exception as e: - self.updateProgress.emit({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"An error has occured!\nPlease try to reconnect the hardware and restart the application.\n\n" + str(e), "abortable":False}, 0, 0, 0, 0, 0) - self.RUNNING = False + traceback.print_exc() + self.updateProgress.emit({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"An error has occured!\nPlease try to reconnect the hardware and restart the application.\n\n{:s}: {:s}".format(type(e).__name__, str(e)), "abortable":False}) + self.FINISHED = True diff --git a/FlashGBX/FlashGBX.py b/FlashGBX/FlashGBX.py index 5b09c4a..308eb02 100644 --- a/FlashGBX/FlashGBX.py +++ b/FlashGBX/FlashGBX.py @@ -1,21 +1,23 @@ # -*- coding: utf-8 -*- # UTF-8 -import sys, threading, os, glob, importlib, time, re, json, platform, subprocess, zlib, argparse, math, struct +import sys, threading, os, glob, time, re, json, platform, subprocess, zlib, argparse, math, struct, statistics from PySide2 import QtCore, QtWidgets, QtGui from zipfile import * from datetime import datetime +from .RomFileDMG import * +from .RomFileAGB import * from . import hw_GBxCartRW hw_devices = [hw_GBxCartRW] APPNAME = "FlashGBX" -VERSION = "0.8β" +VERSION = "0.9β" class FlashGBX(QtWidgets.QWidget): global APPNAME, VERSION AGB_Header_ROM_Sizes = [ "4 MB", "8 MB", "16 MB", "32 MB" ] AGB_Header_ROM_Sizes_Map = [ 0x400000, 0x800000, 0x1000000, 0x2000000 ] - AGB_Header_Save_Types = [ "None", "4K EEPROM (512 Bytes)", "64K EEPROM (8 KB)", "256K SRAM (32 KB)", "512K SRAM (64 KB)", "512K FLASH (64 KB)", "1M FLASH (128 KB)" ] + AGB_Header_Save_Types = [ "None", "4K EEPROM (512 Bytes)", "64K EEPROM (8 KB)", "256K SRAM (32 KB)", "512K SRAM (64 KB)", "1M SRAM (128 KB)", "512K FLASH (64 KB)", "1M FLASH (128 KB)" ] AGB_Global_CRC32 = 0 DMG_Header_Features = { 0x00:'ROM ONLY', 0x01:'MBC1', 0x02:'MBC1+RAM', 0x03:'MBC1+RAM+BATTERY', 0x05:'MBC2', 0x06:'MBC2+BATTERY', 0x08:'ROM+RAM', 0x09:'ROM+RAM+BATTERY', 0x0B:'MMM01', 0x0C:'MMM01+RAM', 0x0D:'MMM01+RAM+BATTERY', 0x0F:'MBC3+TIMER+BATTERY', 0x10:'MBC3+TIMER+RAM+BATTERY', 0x11:'MBC3', 0x12:'MBC3+RAM', 0x13:'MBC3+RAM+BATTERY', 0x15:'MBC4', 0x16:'MBC4+RAM', 0x17:'MBC4+RAM+BATTERY', 0x19:'MBC5', 0x1A:'MBC5+RAM', 0x1B:'MBC5+RAM+BATTERY', 0x1C:'MBC5+RUMBLE', 0x1D:'MBC5+RUMBLE+RAM', 0x1E:'MBC5+RUMBLE+RAM+BATTERY', 0x20:'MBC6', 0x22:'MBC7+RAM+BATTERY', 0x55:'Game Genie', 0x56:'Game Genie v3.0', 0xFC:'POCKET CAMERA', 0xFD:'BANDAI TAMA5', 0xFE:'HuC3', 0xFF:'HuC1+RAM+BATTERY' } @@ -34,12 +36,30 @@ class FlashGBX(QtWidgets.QWidget): DEVICES = {} FLASHCARTS = { "DMG":{}, "AGB":{} } CONFIG_PATH = "" - TEMPFILE = "" TBPROG = None # Windows 7+ Taskbar Progress Bar + PROGRESS = {} + #DEBUG = [] + + def ReadConfig(self, reset=False): + self.SETTINGS = QtCore.QSettings(self.CONFIG_PATH + "/settings.ini", QtCore.QSettings.IniFormat) + config_version = self.SETTINGS.value("ConfigVersion") + if not os.path.exists(self.CONFIG_PATH): os.makedirs(self.CONFIG_PATH) + fc_files = glob.glob("{0:s}/fc_*.txt".format(self.CONFIG_PATH)) + if config_version is not None and len(fc_files) == 0: + print("FAIL: No flash cartridge type configuration files found in {:s}. Resetting configuration...\n".format(self.CONFIG_PATH)) + self.SETTINGS.clear() + os.rename(self.CONFIG_PATH + "/settings.ini", self.CONFIG_PATH + "/settings.ini_" + datetime.now().strftime("%Y%m%d%H%M%S") + ".bak") + config_version = False # extracts the config.zip again + elif reset: + self.SETTINGS.clear() + print("All configuration has been reset.\n") + + self.SETTINGS.setValue("ConfigVersion", VERSION) + return (config_version, fc_files) def __init__(self, args): app_path = args['app_path'] - config_path = args['config_path'] + self.CONFIG_PATH = args['config_path'] QtWidgets.QWidget.__init__(self) self.setStyleSheet("QMessageBox { messagebox-text-interaction-flags: 5; }") @@ -48,37 +68,24 @@ class FlashGBX(QtWidgets.QWidget): self.setWindowFlags(self.windowFlags() | QtGui.Qt.MSWindowsFixedSizeDialogHint); # Settings and Config - self.SETTINGS = QtCore.QSettings(config_path + "/config.ini", QtCore.QSettings.IniFormat) - config_version = self.SETTINGS.value("ConfigVersion") - if not os.path.exists(config_path): os.makedirs(config_path) - fc_files = glob.glob("{0:s}/fc_*.txt".format(config_path)) - if config_version is not None and len(fc_files) == 0: - print("FAIL: No flash cartridge type configuration files found. Resetting configuration...\n") - self.SETTINGS.clear() - elif args['argparsed'].reset: - self.SETTINGS.clear() - print("All configuration has been reset.\n") - + (config_version, fc_files) = self.ReadConfig(reset=args['argparsed'].reset) if config_version != VERSION: rf_list = "" if os.path.exists(app_path + "/res/config.zip"): with ZipFile(app_path + "/res/config.zip") as zip: for zfile in zip.namelist(): - if os.path.exists(config_path + "/" + zfile): + if os.path.exists(self.CONFIG_PATH + "/" + zfile): zfile_crc = zip.getinfo(zfile).CRC - with open(config_path + "/" + zfile, "rb") as ofile: buffer = ofile.read() + with open(self.CONFIG_PATH + "/" + zfile, "rb") as ofile: buffer = ofile.read() ofile_crc = zlib.crc32(buffer) & 0xffffffff if zfile_crc == ofile_crc: continue - os.rename(config_path + "/" + zfile, config_path + "/" + zfile + "_" + datetime.now().strftime("%Y%m%d%H%M%S") + ".bak") + os.rename(self.CONFIG_PATH + "/" + zfile, self.CONFIG_PATH + "/" + zfile + "_" + datetime.now().strftime("%Y%m%d%H%M%S") + ".bak") rf_list += zfile + "\n" - zip.extract(zfile, config_path + "/") + zip.extract(zfile, self.CONFIG_PATH + "/") if rf_list != "": QtWidgets.QMessageBox.information(self, APPNAME, "The application was recently updated and some config files have been updated as well. You will find backup copies of them in your configuration directory.\n\nUpdated files:\n" + rf_list[:-1], QtWidgets.QMessageBox.Ok) - fc_files = glob.glob("{0:s}/fc_*.txt".format(config_path)) + fc_files = glob.glob("{0:s}/fc_*.txt".format(self.CONFIG_PATH)) else: - print("ERROR: {:s} not found. This is required to read the flash cartridge type configuration\n".format(app_path + "/res/config.zip")) - - self.SETTINGS.setValue("ConfigVersion", VERSION) - self.CONFIG_PATH = config_path + print("ERROR: {:s} not found. This is required to read the flash cartridge type configuration.\n".format(app_path + "/res/config.zip")) # Read flash cart types for file in fc_files: @@ -88,7 +95,7 @@ class FlashGBX(QtWidgets.QWidget): try: specs = json.loads(specs_int) except: - print("WARNING: Flash chip config file “{:s}” is broken and needs to be fixed before it can be used.".format(os.path.basename(file))) + print("WARNING: Flash chip config file “{:s}” could not be parsed and needs to be fixed before it can be used.".format(os.path.basename(file))) continue for name in specs["names"]: if not specs["type"] in self.FLASHCARTS: continue # only DMG and AGB are supported right now @@ -144,14 +151,11 @@ class FlashGBX(QtWidgets.QWidget): rowActionsGeneral3 = QtWidgets.QHBoxLayout() self.btnFlashROM = QtWidgets.QPushButton("&Flash ROM") self.btnFlashROM.setStyleSheet("min-height: 17px;") - self.mnuFlashROM = QtWidgets.QMenu() - self.mnuFlashROM.addAction("&Complete ROM file", self.FlashROM) - self.mnuFlashROM.addAction("&Trimmed ROM file", lambda: self.FlashROM(trim_rom=True)) - self.btnFlashROM.setMenu(self.mnuFlashROM) + self.connect(self.btnFlashROM, QtCore.SIGNAL("clicked()"), self.FlashROM) rowActionsGeneral3.addWidget(self.btnFlashROM) self.btnRestoreRAM = QtWidgets.QPushButton("Writ&e Save Data") self.mnuRestoreRAM = QtWidgets.QMenu() - self.mnuRestoreRAM.addAction("&Restore save data file", self.WriteRAM) + self.mnuRestoreRAM.addAction("&Restore from save data file", self.WriteRAM) self.mnuRestoreRAM.addAction("&Erase cartridge save data", lambda: self.WriteRAM(erase=True)) self.btnRestoreRAM.setMenu(self.mnuRestoreRAM) self.btnRestoreRAM.setStyleSheet("min-height: 17px;") @@ -178,7 +182,7 @@ class FlashGBX(QtWidgets.QWidget): rowStatus1a.addWidget(self.lblStatus1aResult) grpStatusLayout.addLayout(rowStatus1a) rowStatus2a = QtWidgets.QHBoxLayout() - self.lblStatus2a = QtWidgets.QLabel("Speed:") + self.lblStatus2a = QtWidgets.QLabel("Transfer rate:") rowStatus2a.addWidget(self.lblStatus2a) self.lblStatus2aResult = QtWidgets.QLabel("–") rowStatus2a.addWidget(self.lblStatus2aResult) @@ -200,10 +204,11 @@ class FlashGBX(QtWidgets.QWidget): self.prgStatus = QtWidgets.QProgressBar() self.SetProgressBars(min=0, max=1, value=0) rowStatus2.addWidget(self.prgStatus) - btnText = "&Abort" + btnText = "Stop" self.btnCancel = QtWidgets.QPushButton(btnText) self.btnCancel.setEnabled(False) - btnWidth = self.btnCancel.fontMetrics().boundingRect(btnText).width() + 14 + btnWidth = self.btnCancel.fontMetrics().boundingRect(btnText).width() + 15 + if platform.system() == "Darwin": btnWidth += 12 self.btnCancel.setMaximumWidth(btnWidth) self.connect(self.btnCancel, QtCore.SIGNAL("clicked()"), self.AbortOperation) rowStatus2.addWidget(self.btnCancel) @@ -225,11 +230,25 @@ class FlashGBX(QtWidgets.QWidget): self.layout_devices.addWidget(self.cmbDevice) self.layout_devices.addStretch() - btnText = "C&onfig" + btnText = "C&onfig" self.btnConfig = QtWidgets.QPushButton(btnText) - btnWidth = self.btnConfig.fontMetrics().boundingRect(btnText).width() + 14 + btnWidth = self.btnConfig.fontMetrics().boundingRect(btnText).width() + 24 + if platform.system() == "Darwin": btnWidth += 12 self.btnConfig.setMaximumWidth(btnWidth) - self.connect(self.btnConfig, QtCore.SIGNAL("clicked()"), self.OpenConfigDir) + self.mnuConfig = QtWidgets.QMenu() + self.mnuConfig.addAction("&Append date && time to filename of save data backups", lambda: self.SETTINGS.setValue("SaveFileNameAddDateTime", str(self.mnuConfig.actions()[0].isChecked()).lower().replace("true", "enabled").replace("false", "disabled"))) + self.mnuConfig.addAction("Prefer §or erase over full chip erase when available", lambda: self.SETTINGS.setValue("PreferSectorErase", str(self.mnuConfig.actions()[1].isChecked()).lower().replace("true", "enabled").replace("false", "disabled"))) + self.mnuConfig.addAction("Enable &fast read mode (experimental)", lambda: self.SETTINGS.setValue("FastReadMode", str(self.mnuConfig.actions()[2].isChecked()).lower().replace("true", "enabled").replace("false", "disabled"))) # GBxCart RW + self.mnuConfig.addSeparator() + self.mnuConfig.addAction("Show &configuration directory", self.OpenConfigDir) + self.mnuConfig.actions()[0].setCheckable(True) + self.mnuConfig.actions()[0].setChecked(self.SETTINGS.value("SaveFileNameAddDateTime") == "enabled") + self.mnuConfig.actions()[1].setCheckable(True) + self.mnuConfig.actions()[1].setChecked(self.SETTINGS.value("PreferSectorErase") == "enabled") + self.mnuConfig.actions()[2].setCheckable(True) # GBxCart RW + self.mnuConfig.actions()[2].setChecked(self.SETTINGS.value("FastReadMode") == "enabled") # GBxCart RW + self.btnConfig.setMenu(self.mnuConfig) + self.btnScan = QtWidgets.QPushButton("&Device Scan") self.connect(self.btnScan, QtCore.SIGNAL("clicked()"), self.FindDevices) self.btnConnect = QtWidgets.QPushButton("&Connect") @@ -482,6 +501,7 @@ class FlashGBX(QtWidgets.QWidget): print("Disconnected from {:s}\n".format(devname)) except: pass + self.CONN = None self.btnScan.show() self.optAGB.setEnabled(False) @@ -564,6 +584,7 @@ class FlashGBX(QtWidgets.QWidget): print("Connected to " + dev.GetFullName()) self.grpDMGCartridgeInfo.setEnabled(True) self.grpAGBCartridgeInfo.setEnabled(True) + self.grpActions.setEnabled(True) self.btnCancel.setEnabled(False) self.SetProgressBars(min=0, max=1, value=0) @@ -633,6 +654,7 @@ class FlashGBX(QtWidgets.QWidget): self.CONN.CANCEL = True def FinishOperation(self): + if self.lblStatus2aResult.text() == "Pending...": self.lblStatus2aResult.setText("–") self.lblStatus4aResult.setText("") self.grpDMGCartridgeInfo.setEnabled(True) self.grpAGBCartridgeInfo.setEnabled(True) @@ -655,13 +677,14 @@ class FlashGBX(QtWidgets.QWidget): self.cmbAGBCartridgeTypeResult.setCurrentIndex(t5) msgbox = QtWidgets.QMessageBox(parent=self, icon=QtWidgets.QMessageBox.Information, windowTitle=APPNAME, text="ROM flashing complete!", standardButtons=QtWidgets.QMessageBox.Ok) msgbox.exec() + #self.CONN.FlashROM(fncSetProgress=self.DEBUG[0], path=self.DEBUG[1], cart_type=self.DEBUG[2], override_voltage=self.DEBUG[3]) elif self.CONN.INFO["last_action"] == 1: # Backup ROM self.CONN.INFO["last_action"] = 0 if self.CONN.GetMode() == "DMG": if self.CONN.INFO["rom_checksum"] == self.CONN.INFO["rom_checksum_calc"]: - self.lblHeaderROMChecksumResult.setText("OK (0x{:04X})".format(self.CONN.INFO["rom_checksum"])) + self.lblHeaderROMChecksumResult.setText("Valid (0x{:04X})".format(self.CONN.INFO["rom_checksum"])) self.lblHeaderROMChecksumResult.setStyleSheet("QLabel { color: green; }"); self.lblStatus4a.setText("Done!") msgbox = QtWidgets.QMessageBox(parent=self, icon=QtWidgets.QMessageBox.Information, windowTitle=APPNAME, text="The ROM was dumped successfully!", standardButtons=QtWidgets.QMessageBox.Ok) @@ -670,14 +693,15 @@ class FlashGBX(QtWidgets.QWidget): self.lblHeaderROMChecksumResult.setText("Invalid (0x{:04X}≠0x{:04X})".format(self.CONN.INFO["rom_checksum_calc"], self.CONN.INFO["rom_checksum"])) self.lblHeaderROMChecksumResult.setStyleSheet("QLabel { color: red; }"); self.lblStatus4a.setText("Done.") - QtWidgets.QMessageBox.warning(self, APPNAME, "The ROM dump is complete, but the checksum is not correct. This may indicate a bad dump, however this is normal for some bootleg cartridges, prototypes, patched games and trimmed ROM files.\nWhen dumping from a flash cartridge, manually selecting MBC5 before dumping may also help.", QtWidgets.QMessageBox.Ok) + QtWidgets.QMessageBox.warning(self, APPNAME, "The ROM was dumped, but the checksum is not correct. This may indicate a bad dump, however this can be normal for some reproduction cartridges, prototypes and patched games.\nWhen dumping from a flash cartridge, manually selecting MBC5 before dumping may also help.", QtWidgets.QMessageBox.Ok) elif self.CONN.GetMode() == "AGB": if self.AGB_Global_CRC32 == self.CONN.INFO["rom_checksum_calc"]: - self.lblAGBHeaderROMChecksumResult.setText("OK (0x{:06X})".format(self.AGB_Global_CRC32)) + self.lblAGBHeaderROMChecksumResult.setText("Valid (0x{:06X})".format(self.AGB_Global_CRC32)) self.lblAGBHeaderROMChecksumResult.setStyleSheet("QLabel { color: green; }"); self.lblStatus4a.setText("Done!") msgbox = QtWidgets.QMessageBox(parent=self, icon=QtWidgets.QMessageBox.Information, windowTitle=APPNAME, text="The ROM was dumped successfully!", standardButtons=QtWidgets.QMessageBox.Ok) msgbox.exec() + elif self.AGB_Global_CRC32 == 0: self.lblAGBHeaderROMChecksumResult.setText("0x{:06X}".format(self.CONN.INFO["rom_checksum_calc"])) self.lblAGBHeaderROMChecksumResult.setStyleSheet(self.lblHeaderCGBResult.styleSheet()) @@ -687,16 +711,16 @@ class FlashGBX(QtWidgets.QWidget): self.lblAGBHeaderROMChecksumResult.setText("Invalid (0x{:06X}≠0x{:06X})".format(self.CONN.INFO["rom_checksum_calc"], self.AGB_Global_CRC32)) self.lblAGBHeaderROMChecksumResult.setStyleSheet("QLabel { color: red; }"); self.lblStatus4a.setText("Done.") - QtWidgets.QMessageBox.warning(self, APPNAME, "The ROM dump is complete, but the checksum doesn’t match the known database entry. This may indicate a bad dump, however this is normal for some bootleg cartridges, prototypes, patched games and trimmed ROM files.", QtWidgets.QMessageBox.Ok) + QtWidgets.QMessageBox.warning(self, APPNAME, "The ROM was dumped, but the checksum doesn’t match the known database entry. This may indicate a bad dump, however this can be normal for some reproduction cartridges, prototypes and patched games.", QtWidgets.QMessageBox.Ok) elif self.CONN.INFO["last_action"] == 2: # Backup RAM self.lblStatus4a.setText("Done!") self.CONN.INFO["last_action"] = 0 - + elif self.CONN.INFO["last_action"] == 3: # Restore RAM self.lblStatus4a.setText("Done!") self.CONN.INFO["last_action"] = 0 - + else: self.lblStatus4a.setText("Ready.") self.CONN.INFO["last_action"] = 0 @@ -707,6 +731,10 @@ class FlashGBX(QtWidgets.QWidget): cart_type = 0 cart_text = "" + if self.CONN.CheckROMStable() is False: + QtWidgets.QMessageBox.critical(self, APPNAME, "Unstable ROM reading detected. Please make sure you selected the correct mode and that the cartridge contacts are clean.", QtWidgets.QMessageBox.Ok) + return 0 + if self.CONN.GetMode() in self.FLASHCARTS and len(self.FLASHCARTS[self.CONN.GetMode()]) == 0: QtWidgets.QMessageBox.critical(self, APPNAME, "No flash cartridge type configuration files found. Try to restart the application with the “--reset” switch to reset the configuration.", QtWidgets.QMessageBox.Ok) return 0 @@ -722,7 +750,7 @@ class FlashGBX(QtWidgets.QWidget): else: detected = self.CONN.AutoDetectFlash(limitVoltage) if len(detected) == 0: - msgbox = QtWidgets.QMessageBox(parent=self, icon=QtWidgets.QMessageBox.Question, windowTitle=APPNAME, text="No pre-configured flash cartridge type was detected. You can still try and manually select one from the list -- look for similar PCB text and/or flash chip markings. However, chances are this cartridge is currently not supported for flashing with " + APPNAME + ".\n\nWould you like " + APPNAME + " to run a Flash ID check? This may help adding support for your flash cartridge in the future.", standardButtons=QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) + msgbox = QtWidgets.QMessageBox(parent=self, icon=QtWidgets.QMessageBox.Question, windowTitle=APPNAME, text="No pre-configured flash cartridge type was detected. You can still try and manually select one from the list -- look for similar PCB text and/or flash chip markings. However, chances are this cartridge is currently not supported for flashing with " + APPNAME + ".\n\nWould you like " + APPNAME + " to run a flash chip query? This may help adding support for your flash cartridge in the future.", standardButtons=QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) if self.CONN.GetMode() == "DMG": msgbox.setCheckBox(cb) answer = msgbox.exec() @@ -732,30 +760,44 @@ class FlashGBX(QtWidgets.QWidget): limitVoltage = False if answer == QtWidgets.QMessageBox.Yes: - check = self.CONN.CheckFlashID(limitVoltage) - if check == "": - QtWidgets.QMessageBox.information(self, APPNAME, "There was no Flash ID response from the cartridge. There probably is no flash chip or it requires unique unlocking and handling.", QtWidgets.QMessageBox.Ok) + (flashid, cfi, cfi_raw) = self.CONN.CheckFlashChip(limitVoltage) + if cfi == "": + QtWidgets.QMessageBox.information(self, APPNAME, "There was no Common Flash Interface (CFI) response from the cartridge. If a flash chip exists on the cartridge PCB, it may be too old or require unique unlocking and handling.", QtWidgets.QMessageBox.Ok) else: - QtWidgets.QMessageBox.information(self, APPNAME, "Here is what the Flash ID check returned:

" + check + "
This information along with a good quality picture of the PCB with readable chip markings may help adding support for your flash cartridge. You should be able to copy & paste the text above.", QtWidgets.QMessageBox.Ok) + QtWidgets.QMessageBox.information(self, APPNAME, "Flash chip query result:
" + flashid + "
" + str(cfi) + "
This information along with a good quality picture of the PCB with readable chip markings may help adding support for your flash cartridge.", QtWidgets.QMessageBox.Ok) + with open(self.CONFIG_PATH + "/cfi.bin", "wb") as f: f.write(cfi_raw) return 0 else: cart_type = detected[0] if self.CONN.GetMode() == "DMG": cart_types = self.CONN.GetSupportedCartridgesDMG() for i in range(0, len(detected)): - cart_text += cart_types[0][detected[i]] + "\n" + cart_text += "- " + cart_types[0][detected[i]] + "\n" elif self.CONN.GetMode() == "AGB": cart_types = self.CONN.GetSupportedCartridgesAGB() for i in range(0, len(detected)): - cart_text += cart_types[0][detected[i]] + "\n" + cart_text += "- " + cart_types[0][detected[i]] + "\n" if len(detected) == 1: - msg_text = "The following flash cartridge type was detected:\n" + cart_text + "\nIt seems to have a storage capacity of up to {:d} MB.\nOther features (such as save type) have to be manually selected.".format(int(cart_types[1][detected[0]]['flash_size'] / 1024 / 1024)) + msg_text = "The following flash cartridge type was detected:\n" + cart_text + "\nThe supported ROM size is up to {:d} MB.".format(int(cart_types[1][detected[0]]['flash_size'] / 1024 / 1024)) else: - msg_text = "The following flash cartridge type variants were detected:\n" + cart_text + "\nAll from this list should behave identical. The flash chip seems to have a storage capacity of up to {:d} MB.\nOther features (such as save type) have to be manually selected.".format(int(cart_types[1][detected[0]]['flash_size'] / 1024 / 1024)) + msg_text = "The following flash cartridge type variants were detected:\n" + cart_text + "\nAll from this list should work the same. The first name/alias will now be auto-selected.\n\nThe supported ROM size is up to {:d} MB.".format(int(cart_types[1][detected[0]]['flash_size'] / 1024 / 1024)) - if QtWidgets.QMessageBox.Cancel == QtWidgets.QMessageBox.information(self, APPNAME, msg_text, QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel): - return 0 + msgbox = QtWidgets.QMessageBox(parent=self, icon=QtWidgets.QMessageBox.Question, windowTitle=APPNAME, text=msg_text) + button_ok = msgbox.addButton("&OK", QtWidgets.QMessageBox.ActionRole) + button_cancel = msgbox.addButton("&Cancel", QtWidgets.QMessageBox.RejectRole) + button_cfi = msgbox.addButton(" Run flash chip &query ", QtWidgets.QMessageBox.ActionRole) + msgbox.setDefaultButton(button_ok) + msgbox.setEscapeButton(button_cancel) + answer = msgbox.exec() + if msgbox.clickedButton() == button_cfi: + (flashid, cfi, cfi_raw) = self.CONN.CheckFlashChip(limitVoltage=limitVoltage, cart_type=cart_types[1][cart_type]) + if cfi == "": + QtWidgets.QMessageBox.information(self, APPNAME, "There was no Common Flash Interface (CFI) response from the cartridge. If a flash chip exists on the cartridge PCB, it may be too old or require unique unlocking and handling.", QtWidgets.QMessageBox.Ok) + else: + QtWidgets.QMessageBox.information(self, APPNAME, "Flash chip query result:
" + flashid + "
" + str(cfi) + "
", QtWidgets.QMessageBox.Ok) + with open(self.CONFIG_PATH + "/cfi.bin", "wb") as f: f.write(cfi_raw) + elif msgbox.clickedButton() == button_cancel: return 0 return cart_type @@ -766,19 +808,35 @@ class FlashGBX(QtWidgets.QWidget): cart_type = self.CartridgeTypeAutoDetect() if (cart_type == 1): cart_type = 0 self.cmbDMGCartridgeTypeResult.setCurrentIndex(cart_type) + elif cart_types[1][index] == "RETAIL": # special keyword + pass + else: + for i in range(0, len(self.DMG_Header_ROM_Sizes_Flasher_Map)): + if cart_types[1][index]["flash_size"] == (self.DMG_Header_ROM_Sizes_Flasher_Map[i] * 0x4000): + self.cmbHeaderROMSizeResult.setCurrentIndex(i) + elif self.CONN.GetMode() == "AGB": cart_types = self.CONN.GetSupportedCartridgesAGB() if cart_types[1][index] == "AUTODETECT": # special keyword cart_type = self.CartridgeTypeAutoDetect() if (cart_type == 1): cart_type = 0 self.cmbAGBCartridgeTypeResult.setCurrentIndex(cart_type) - else: - return + elif cart_types[1][index] == "RETAIL": # special keyword + pass + else: + self.cmbAGBHeaderROMSizeResult.setCurrentIndex(self.AGB_Header_ROM_Sizes_Map.index(cart_types[1][index]["flash_size"])) def BackupROM(self): if not self.CheckDeviceAlive(): return mbc = self.DMG_Header_Features_MBC[self.cmbHeaderFeaturesResult.currentIndex()] rom_banks = self.DMG_Header_ROM_Sizes_Flasher_Map[self.cmbHeaderROMSizeResult.currentIndex()] + + fast_read_mode = self.SETTINGS.value("FastReadMode") + if fast_read_mode and fast_read_mode.lower() == "enabled": + fast_read_mode = True + else: + fast_read_mode = False + rom_size = 0 if self.CONN.GetMode() == "DMG": if mbc == 1 and ("MOMOCOL" in self.lblHeaderTitleResult.text() or "BOMCOL" in self.lblHeaderTitleResult.text()): @@ -815,11 +873,18 @@ class FlashGBX(QtWidgets.QWidget): self.lblHeaderROMChecksumResult.setStyleSheet(self.lblHeaderCGBResult.styleSheet()) self.lblAGBHeaderROMChecksumResult.setStyleSheet(self.lblHeaderCGBResult.styleSheet()) - self.CONN.BackupROM(self.setProgress, path, mbc, rom_banks, rom_size) + #self.DEBUG = [ self.SetProgress, path, mbc, rom_banks, rom_size, fast_read_mode ] + self.CONN.BackupROM(fncSetProgress=self.SetProgress, path=path, mbc=mbc, rom_banks=rom_banks, agb_rom_size=rom_size, fast_read_mode=fast_read_mode) - def FlashROM(self, dpath="", trim_rom=False): + def FlashROM(self, dpath=""): if not self.CheckDeviceAlive(): return path = "" + if dpath != "": + text = "The following ROM file will now be written to the flash cartridge:\n" + dpath + answer = QtWidgets.QMessageBox.question(self, APPNAME, text, QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel) + if answer == QtWidgets.QMessageBox.Cancel: return + path = dpath + if self.CONN.GetMode() == "DMG": setting_name = "LastDirRomDMG" last_dir = self.SETTINGS.value(setting_name) @@ -844,11 +909,6 @@ class FlashGBX(QtWidgets.QWidget): self.cmbAGBCartridgeTypeResult.setCurrentIndex(cart_type) if cart_type == 0: return - if dpath != "": - answer = QtWidgets.QMessageBox.question(self, APPNAME, "The following ROM file will now be written to the flash cartridge:\n" + dpath, QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel) - if answer == QtWidgets.QMessageBox.Cancel: return - path = dpath - while path == "": if self.CONN.GetMode() == "DMG": path = QtWidgets.QFileDialog.getOpenFileName(self, "Flash ROM", last_dir, "Game Boy ROM File (*.gb *.gbc *.sgb *.bin);;All Files (*.*)")[0] @@ -878,7 +938,38 @@ class FlashGBX(QtWidgets.QWidget): override_voltage = 5 elif msgbox.clickedButton() == button_cancel: return - self.CONN.FlashROM(self.setProgress, path=path, cart_type=cart_type, trim_rom=trim_rom, override_voltage=override_voltage) + reverse_sectors = False + if 'sector_reversal' in carts[cart_type]: + msgbox = QtWidgets.QMessageBox(parent=self, icon=QtWidgets.QMessageBox.Question, windowTitle=APPNAME, text="The selected flash cartridge type is reported to sometimes have reversed sectors. If the cartridge is not working after flashing, try reversed sectors.") + button_normal = msgbox.addButton("Normal", QtWidgets.QMessageBox.ActionRole) + button_reversed = msgbox.addButton("Reversed", QtWidgets.QMessageBox.ActionRole) + button_cancel = msgbox.addButton("&Cancel", QtWidgets.QMessageBox.RejectRole) + msgbox.setDefaultButton(button_normal) + msgbox.setEscapeButton(button_cancel) + answer = msgbox.exec() + if msgbox.clickedButton() == button_reversed: + reverse_sectors = True + elif msgbox.clickedButton() == button_cancel: return + + prefer_sector_erase = False + if 'chip_erase' in carts[cart_type]['commands'] and 'sector_erase' in carts[cart_type]['commands']: + prefer_sector_erase = self.SETTINGS.value("PreferSectorErase") + if prefer_sector_erase and prefer_sector_erase.lower() == "enabled": + prefer_sector_erase = True + + if self.CONN.GetMode() == "DMG": + hdr = RomFileDMG(path).GetHeader() + elif self.CONN.GetMode() == "AGB": + hdr = RomFileAGB(path).GetHeader() + if not hdr["logo_correct"]: + answer = QtWidgets.QMessageBox.warning(self, APPNAME, "Warning: The ROM file you selected may not boot on actual hardware due to invalid logo data.", QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel) + if answer == QtWidgets.QMessageBox.Cancel: return + if not hdr["header_checksum_correct"]: + answer = QtWidgets.QMessageBox.warning(self, APPNAME, "Warning: The ROM file you selected may not boot on actual hardware due to an invalid header checksum (expected 0x{:02X} instead of 0x{:02X}).".format(hdr["header_checksum_calc"], hdr["header_checksum"]), QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel) + if answer == QtWidgets.QMessageBox.Cancel: return + + #self.DEBUG = [ self.SetProgress, path, cart_type, override_voltage ] + self.CONN.FlashROM(fncSetProgress=self.SetProgress, path=path, cart_type=cart_type, override_voltage=override_voltage, prefer_sector_erase=prefer_sector_erase, reverse_sectors=reverse_sectors) buffer = None def BackupRAM(self): @@ -904,18 +995,23 @@ class FlashGBX(QtWidgets.QWidget): features = 0 save_type = self.cmbAGBSaveTypeResult.currentIndex() if save_type == 0: - QtWidgets.QMessageBox.critical(self, APPNAME, "The save type was not selected or auto-detection failed.", QtWidgets.QMessageBox.Ok) + QtWidgets.QMessageBox.warning(self, APPNAME, "The save type was not selected or auto-detection failed.", QtWidgets.QMessageBox.Ok) return else: return - - path = re.sub(r"[<>:\"/\\|\?\*]", "_", path) + ".sav" + + add_date_time = self.SETTINGS.value("SaveFileNameAddDateTime") + if add_date_time and add_date_time.lower() == "enabled": + path = re.sub(r"[<>:\"/\\|\?\*]", "_", path) + "_" + datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + ".sav" + else: + path = re.sub(r"[<>:\"/\\|\?\*]", "_", path) + ".sav" + path = QtWidgets.QFileDialog.getSaveFileName(self, "Backup Save Data", last_dir + "/" + path, "Save Data File (*.sav);;All Files (*.*)")[0] if (path == ""): return self.SETTINGS.setValue(setting_name, os.path.dirname(path)) - self.CONN.BackupRAM(self.setProgress, path, features, save_type) + self.CONN.BackupRAM(fncSetProgress=self.SetProgress, path=path, mbc=features, save_type=save_type) def WriteRAM(self, dpath="", erase=False): if not self.CheckDeviceAlive(): return @@ -943,7 +1039,8 @@ class FlashGBX(QtWidgets.QWidget): return if dpath != "": - answer = QtWidgets.QMessageBox.question(self, APPNAME, "The following save data file will now be written to the cartridge:\n" + dpath, QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel) + text = "The following save data file will now be written to the cartridge:\n" + dpath + answer = QtWidgets.QMessageBox.question(self, APPNAME, text, QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel) if answer == QtWidgets.QMessageBox.Cancel: return path = dpath self.SETTINGS.setValue(setting_name, os.path.dirname(path)) @@ -954,10 +1051,9 @@ class FlashGBX(QtWidgets.QWidget): path = path + ".sav" path = QtWidgets.QFileDialog.getOpenFileName(self, "Restore Save Data", last_dir + "/" + path, "Save Data File (*.sav);;All Files (*.*)")[0] if not path == "": self.SETTINGS.setValue(setting_name, os.path.dirname(path)) + if (path == ""): return - if (path == ""): return - - self.CONN.RestoreRAM(self.setProgress, path, features, save_type, erase) + self.CONN.RestoreRAM(fncSetProgress=self.SetProgress, path=path, mbc=features, save_type=save_type, erase=erase) def CheckDeviceAlive(self, setMode=False): if self.CONN is not None: @@ -1075,7 +1171,7 @@ class FlashGBX(QtWidgets.QWidget): self.lblHeaderLogoValidResult.setText("Invalid") self.lblHeaderLogoValidResult.setStyleSheet("QLabel { color: red; }"); if data['header_checksum_correct']: - self.lblHeaderChecksumResult.setText("OK (0x{:02X})".format(data['header_checksum'])) + self.lblHeaderChecksumResult.setText("Valid (0x{:02X})".format(data['header_checksum'])) self.lblHeaderChecksumResult.setStyleSheet(self.lblHeaderCGBResult.styleSheet()) else: self.lblHeaderChecksumResult.setText("Invalid (0x{:02X})".format(data['header_checksum'])) @@ -1123,7 +1219,7 @@ class FlashGBX(QtWidgets.QWidget): self.lblAGBHeader96hResult.setStyleSheet("QLabel { color: red; }"); if data['header_checksum_correct']: - self.lblAGBHeaderChecksumResult.setText("OK (0x{:02X})".format(data['header_checksum'])) + self.lblAGBHeaderChecksumResult.setText("Valid (0x{:02X})".format(data['header_checksum'])) self.lblAGBHeaderChecksumResult.setStyleSheet(self.lblAGBHeaderCodeResult.styleSheet()) else: self.lblAGBHeaderChecksumResult.setText("Invalid (0x{:02X})".format(data['header_checksum'])) @@ -1172,6 +1268,8 @@ class FlashGBX(QtWidgets.QWidget): self.lblStatus3aResult.setText("–") self.lblStatus4a.setText("Ready.") self.FinishOperation() + if self.CONN.CheckROMStable() is False: + QtWidgets.QMessageBox.warning(self, APPNAME, "Unstable ROM reading detected. Please reconnect the device, make sure you selected the correct mode and that the cartridge contacts are clean.", QtWidgets.QMessageBox.Ok) def formatFileSize(self, size): size = size / 1024 @@ -1202,44 +1300,150 @@ class FlashGBX(QtWidgets.QWidget): s = s + "seconds" return s - def setProgress(self, error, cur, max, speed=0, elapsed=0, left=0): - if error != None and type(error) != type({}): + def SetProgress(self, args): + now = time.time() + if args["action"] == "INITIALIZE": + self.PROGRESS["method"] = args["method"] + self.PROGRESS["size"] = args["size"] + if "pos" in args: + self.PROGRESS["pos"] = args["pos"] + else: + self.PROGRESS["pos"] = 0 + if "time_start" in args: + self.PROGRESS["time_start"] = args["time_start"] + else: + self.PROGRESS["time_start"] = now + self.PROGRESS["time_last_emit"] = now + self.PROGRESS["time_last_update_speed"] = now + self.PROGRESS["time_left"] = 0 + self.PROGRESS["speed"] = 0 + self.PROGRESS["speeds"] = [] + self.PROGRESS["bytes_last_update_speed"] = 0 + self.UpdateProgress(self.PROGRESS) + + if args["action"] == "ABORT": + self.UpdateProgress(args) + self.PROGRESS = {} + + elif args["action"] in ("ERASE", "SECTOR_ERASE"): + if "time_start" in self.PROGRESS: + args["time_elapsed"] = now - self.PROGRESS["time_start"] + else: + args["time_elapsed"] = now - args["time_start"] + args["pos"] = 1 + args["size"] = 0 + self.UpdateProgress(args) + + elif self.PROGRESS == {}: + return + + elif args["action"] == "UPDATE_POS": + self.PROGRESS["pos"] = args["pos"] + + #elif args["action"] in ("UPDATE_SPEED"): # so that speed displayed won't drop right after sector erase + # self.PROGRESS["speed_updated"] = True + # self.PROGRESS["time_last_update_speed"] = now + # self.PROGRESS["bytes_last_update_speed"] = self.PROGRESS["pos"] + + elif args["action"] in ("READ", "WRITE"): + if "method" not in self.PROGRESS: return + elif args["action"] == "READ" and self.PROGRESS["method"] in ("SAVE_WRITE", "ROM_WRITE"): return + elif args["action"] == "WRITE" and self.PROGRESS["method"] in ("SAVE_READ", "ROM_READ"): return + + self.PROGRESS["pos"] += args["bytes_added"] + if (now - self.PROGRESS["time_last_emit"]) > 0.05: + self.PROGRESS["time_elapsed"] = now - self.PROGRESS["time_start"] + if (now - self.PROGRESS["time_last_update_speed"]) > 0.25: + time_delta = now - self.PROGRESS["time_last_update_speed"] + pos_delta = self.PROGRESS["pos"] - self.PROGRESS["bytes_last_update_speed"] + if time_delta > 0: + speed = (pos_delta / time_delta) / 1024 + self.PROGRESS["speeds"].append(speed) + if len(self.PROGRESS["speeds"]) > 32: self.PROGRESS["speeds"].pop(0) + self.PROGRESS["speed"] = statistics.median(self.PROGRESS["speeds"]) #(pos_delta / time_delta) / 1024 + self.PROGRESS["time_last_update_speed"] = now + self.PROGRESS["bytes_last_update_speed"] = self.PROGRESS["pos"] + + if "skipping" in args and args["skipping"] is True: + self.PROGRESS["speed"] = 0 + self.PROGRESS["skipping"] = True + else: + self.PROGRESS["skipping"] = False + + if self.PROGRESS["speed"] > 0: + self.PROGRESS["time_left"] = (self.PROGRESS["size"] - self.PROGRESS["pos"]) / 1024 / self.PROGRESS["speed"] + + self.UpdateProgress(self.PROGRESS) + self.PROGRESS["time_last_emit"] = now + + elif args["action"] == "FINISHED": + self.PROGRESS["pos"] = self.PROGRESS["size"] + self.PROGRESS["bytes_last_update_speed"] = self.PROGRESS["size"] + self.PROGRESS["time_elapsed"] = now - self.PROGRESS["time_start"] + self.PROGRESS["time_last_emit"] = now + self.PROGRESS["time_last_update_speed"] = now + self.PROGRESS["time_left"] = 0 + self.PROGRESS["speed"] = (self.PROGRESS["size"] / self.PROGRESS["time_elapsed"]) / 1024 + self.PROGRESS["bytes_last_emit"] = self.PROGRESS["size"] + + if self.PROGRESS["speed"] > self.PROGRESS["size"] / 1024: + self.PROGRESS["speed"] = self.PROGRESS["size"] / 1024 + + self.UpdateProgress(self.PROGRESS) + self.PROGRESS = {} + + def UpdateProgress(self, args): + if args is None: return + + if "error" in args: self.lblStatus4a.setText("Failed!") self.grpDMGCartridgeInfo.setEnabled(True) self.grpAGBCartridgeInfo.setEnabled(True) self.grpActions.setEnabled(True) self.btnCancel.setEnabled(False) - QtWidgets.QMessageBox.critical(self, APPNAME, str(error), QtWidgets.QMessageBox.Ok) + QtWidgets.QMessageBox.critical(self, APPNAME, str(args["error"]), QtWidgets.QMessageBox.Ok) return - + self.grpDMGCartridgeInfo.setEnabled(False) self.grpAGBCartridgeInfo.setEnabled(False) self.grpActions.setEnabled(False) - if (type(error) == type({})): - if error["action"] == "ERASE": + pos = 0 + size = 0 + speed = 0 + elapsed = 0 + left = 0 + if "pos" in args: pos = args["pos"] + if "size" in args: size = args["size"] + if "speed" in args: speed = args["speed"] + if "time_elapsed" in args: elapsed = args["time_elapsed"] + if "time_left" in args: left = args["time_left"] + + if "action" in args: + if args["action"] == "ERASE": self.lblStatus1aResult.setText("Pending...") self.lblStatus2aResult.setText("Pending...") self.lblStatus3aResult.setText(self.formatProgressTime(elapsed)) self.lblStatus4a.setText("Erasing flash...") self.lblStatus4aResult.setText("") - self.btnCancel.setEnabled(error["abortable"]) - self.SetProgressBars(min=0, max=max, value=cur) - elif error["action"] == "SECTOR_ERASE": - self.lblStatus3aResult.setText(self.formatProgressTime(elapsed)) + self.btnCancel.setEnabled(args["abortable"]) + self.SetProgressBars(min=0, max=size, value=pos) + elif args["action"] == "SECTOR_ERASE": + if elapsed >= 1: + self.lblStatus3aResult.setText(self.formatProgressTime(elapsed)) self.lblStatus4a.setText("Erasing sector...") self.lblStatus4aResult.setText("") - self.btnCancel.setEnabled(error["abortable"]) - self.SetProgressBars(min=0, max=max, value=cur, setPause=True) - elif error["action"] == "VERIFY": - self.lblStatus1aResult.setText("") - self.lblStatus2aResult.setText("") - self.lblStatus3aResult.setText(self.formatProgressTime(elapsed)) - self.lblStatus4a.setText("Verifying...") + self.btnCancel.setEnabled(args["abortable"]) + self.SetProgressBars(min=0, max=size, value=pos, setPause=True) + elif args["action"] == "ABORTING": + self.lblStatus1aResult.setText("–") + self.lblStatus2aResult.setText("–") + self.lblStatus3aResult.setText("–") + self.lblStatus4a.setText("Stopping... Please wait.") self.lblStatus4aResult.setText("") - self.btnCancel.setEnabled(error["abortable"]) - self.SetProgressBars(min=0, max=max, value=cur) - elif error["action"] == "ABORT": + self.btnCancel.setEnabled(args["abortable"]) + self.SetProgressBars(min=0, max=size, value=pos) + elif args["action"] == "ABORT": wd = 10 while self.CONN.WORKER.isRunning(): time.sleep(0.1) @@ -1253,36 +1457,42 @@ class FlashGBX(QtWidgets.QWidget): self.lblStatus1aResult.setText("–") self.lblStatus2aResult.setText("–") self.lblStatus3aResult.setText("–") - self.lblStatus4a.setText("Aborted.") + self.lblStatus4a.setText("Stopped.") self.lblStatus4aResult.setText("") self.btnCancel.setEnabled(False) self.SetProgressBars(min=0, max=1, value=0) self.btnCancel.setEnabled(False) - if "info_type" in error.keys() and "info_msg" in error.keys(): - if error["info_type"] == "msgbox_critical": - QtWidgets.QMessageBox.critical(self, APPNAME, error["info_msg"], QtWidgets.QMessageBox.Ok) - elif error["info_type"] == "msgbox_information": - QtWidgets.QMessageBox.information(self, APPNAME, error["info_msg"], QtWidgets.QMessageBox.Ok) - elif error["info_type"] == "label": - self.lblStatus4a.setText(error["info_msg"]) + if "info_type" in args.keys() and "info_msg" in args.keys(): + if args["info_type"] == "msgbox_critical": + QtWidgets.QMessageBox.critical(self, APPNAME, args["info_msg"], QtWidgets.QMessageBox.Ok) + elif args["info_type"] == "msgbox_information": + QtWidgets.QMessageBox.information(self, APPNAME, args["info_msg"], QtWidgets.QMessageBox.Ok) + elif args["info_type"] == "label": + self.lblStatus4a.setText(args["info_msg"]) return + else: - self.SetProgressBars(min=0, max=max, value=cur) + self.SetProgressBars(min=0, max=size, value=pos) self.btnCancel.setEnabled(True) - self.lblStatus1aResult.setText(self.formatFileSize(cur)) - if speed == 0: - self.lblStatus2aResult.setText("–") - self.lblStatus4aResult.setText("–") - pass - else: + self.lblStatus1aResult.setText(self.formatFileSize(pos)) + if speed > 0: self.lblStatus2aResult.setText("{:.2f} KB/s".format(speed)) - self.lblStatus3aResult.setText(self.formatProgressTime(elapsed)) - self.lblStatus4a.setText("Time left:") - if speed > 0 and left > 0: + else: + self.lblStatus2aResult.setText("Pending...") + if left > 0: self.lblStatus4aResult.setText(self.formatProgressTime(left)) - elif max == cur: + else: + self.lblStatus4aResult.setText("Pending...") + if elapsed > 0: + self.lblStatus3aResult.setText(self.formatProgressTime(elapsed)) + + if speed == 0 and "skipping" in args and args["skipping"] is True: + self.lblStatus4aResult.setText("Pending...") + self.lblStatus4a.setText("Time left:") + + if size == pos: wd = 10 while self.CONN.WORKER.isRunning(): time.sleep(0.1) @@ -1291,7 +1501,7 @@ class FlashGBX(QtWidgets.QWidget): pass self.FinishOperation() - def SetProgressBars(self, min=0, max=100, value=0, setPause=None, setStop=None): + def SetProgressBars(self, min=0, max=100, value=0, setPause=None): self.prgStatus.setMinimum(min) self.prgStatus.setMaximum(max) self.prgStatus.setValue(value) @@ -1374,7 +1584,7 @@ class FlashGBX(QtWidgets.QWidget): # Taskbar Progress on Windows only try: - from PySide2.QtWinExtras import QWinTaskbarProgress, QWinTaskbarButton, QtWin + from PySide2.QtWinExtras import QWinTaskbarButton, QtWin myappid = 'lesserkuma.flashgbx' QtWin.setCurrentProcessExplicitAppUserModelID(myappid) taskbar_button = QWinTaskbarButton() diff --git a/FlashGBX/Util.py b/FlashGBX/Util.py new file mode 100644 index 0000000..b5e906a --- /dev/null +++ b/FlashGBX/Util.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- +# UTF-8 +import math, time, datetime, copy + +# Utility functions +def bitswap(n, s): + p, q = s + if (((n & (1 << p)) >> p) ^ ((n & (1 << q)) >> q)) == 1: + n ^= (1 << p) + n ^= (1 << q) + return n + +def ParseCFI(buffer): + buffer = copy.copy(buffer) + info = {} + magic = "{:s}{:s}{:s}".format(chr(buffer[0x20]), chr(buffer[0x22]), chr(buffer[0x24])) + if magic != "QRY": # nothing swapped + return False + + try: + info["flash_id"] = buffer[0:8] + info["magic"] = "{:s}{:s}{:s}".format(chr(buffer[0x20]), chr(buffer[0x22]), chr(buffer[0x24])) + + if buffer[0x36] == 0xFF and buffer[0x48] == 0xFF: + print("FAIL: No information about the voltage range found in CFI data.") + try: + with open("./cfi_debug.bin", "wb") as f: f.write(buffer) + except: + pass + return False + + info["vdd_min"] = (buffer[0x36] >> 4) + ((buffer[0x36] & 0x0F) / 10) + info["vdd_max"] = (buffer[0x38] >> 4) + ((buffer[0x38] & 0x0F) / 10) + + if buffer[0x3E] > 0 and buffer[0x3E] < 0xFF: + info["single_write"] = True + info["single_write_time_avg"] = int(math.pow(2, buffer[0x3E])) + info["single_write_time_max"] = int(math.pow(2, buffer[0x46]) * info["single_write_time_avg"]) + else: + info["single_write"] = False + + if buffer[0x40] > 0 and buffer[0x40] < 0xFF: + info["buffer_write"] = True + info["buffer_write_time_avg"] = int(math.pow(2, buffer[0x40])) + info["buffer_write_time_max"] = int(math.pow(2, buffer[0x48]) * info["buffer_write_time_avg"]) + else: + info["buffer_write"] = False + + if buffer[0x42] > 0 and buffer[0x42] < 0xFF: + info["sector_erase"] = True + info["sector_erase_time_avg"] = int(math.pow(2, buffer[0x42])) + info["sector_erase_time_max"] = int(math.pow(2, buffer[0x4A]) * info["sector_erase_time_avg"]) + else: + info["sector_erase"] = False + + if buffer[0x44] > 0 and buffer[0x44] < 0xFF: + info["chip_erase"] = True + info["chip_erase_time_avg"] = int(math.pow(2, buffer[0x44])) + info["chip_erase_time_max"] = int(math.pow(2, buffer[0x4C]) * info["chip_erase_time_avg"]) + else: + info["chip_erase"] = False + + info["tb_boot_sector"] = False + if "{:s}{:s}{:s}".format(chr(buffer[0x80]), chr(buffer[0x82]), chr(buffer[0x84])) == "PRI": + if buffer[0x9E] != 0 and buffer[0x9E] != 0xFF: + temp = { 0x02: 'Bottom Boot Device', 0x03: 'Top Boot Device' } + try: + info["tb_boot_sector"] = "{:s} (0x{:02X})".format(temp[buffer[0x9E]], buffer[0x9E]) + except: + info["tb_boot_sector"] = "0x{:02X}".format(buffer[0x9E]) + elif "{:s}{:s}{:s}".format(chr(buffer[0x214]), chr(buffer[0x216]), chr(buffer[0x218])) == "PRI": + pass # todo + + info["device_size"] = int(math.pow(2, buffer[0x4E])) + info["buffer_size"] = buffer[0x56] << 8 | buffer[0x54] + if info["buffer_size"] > 1: + info["buffer_write"] = True + info["buffer_size"] = int(math.pow(2, info["buffer_size"])) + else: + del(info["buffer_size"]) + info["buffer_write"] = False + info["erase_sector_regions"] = buffer[0x58] + info["erase_sector_blocks"] = [] + total_blocks = 0 + pos = 0 + for i in range(0, min(4, info["erase_sector_regions"])): + b = (buffer[0x5C+(i*8)] << 8 | buffer[0x5A+(i*8)]) + 1 + t = (buffer[0x60+(i*8)] << 8 | buffer[0x5E+(i*8)]) * 256 + total_blocks += b + size = b * t + pos += size + info["erase_sector_blocks"].append([ t, b, size ]) + + except: + print("ERROR: Trying to parse CFI data resulted in an error.") + try: + with open("./cfi_debug.bin", "wb") as f: f.write(buffer) + except: + pass + return False + + return info + +def dprint(*args, **kwargs): + # uncomment for some debug prints + #print(" ".join(map(str, args)), **kwargs) + pass diff --git a/FlashGBX/config/db_AGB.json b/FlashGBX/config/db_AGB.json index f83be0d..9081e90 100644 --- a/FlashGBX/config/db_AGB.json +++ b/FlashGBX/config/db_AGB.json @@ -108,7 +108,7 @@ "rom_size": 16777216, "rom_crc32": 199926516, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BW9P" }, "efde0279cc7584ad184ff2f0413cde0a97044d05": { @@ -430,42 +430,42 @@ "rom_size": 16777216, "rom_crc32": 575183996, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BW3P" }, "7d8b9ea39fdedcf700635b4f5fa45c1f91458c9e": { "rom_size": 33554432, "rom_crc32": 2496617259, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BW4P" }, "b822d712d8ba6800a3e951c90acb5ad6350e8bc8": { "rom_size": 16777216, "rom_crc32": 287824905, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BW5P" }, "e500621012c741ecdb24e772ef3782e84f54ea05": { "rom_size": 33554432, "rom_crc32": 743957896, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BW7P" }, "03e9c825fce0a38e3e35d977afdf07523704b995": { "rom_size": 33554432, "rom_crc32": 2769150515, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BW6P" }, "96f128dcd144f198ad2953d56f2c392187a47a3b": { "rom_size": 16777216, "rom_crc32": 2239209472, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BW8P" }, "c4990ad789bb3d6e843bbec6b6fc406243803342": { @@ -920,35 +920,35 @@ "rom_size": 8388608, "rom_crc32": 1727736297, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AWRP" }, "8ea95333d61d058b6ae1c0dae6dd0eee2b183619": { "rom_size": 4194304, "rom_crc32": 654118857, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AWRE" }, "2bd92f45310e335522a7c7c621737257b81ffe4d": { "rom_size": 4194304, "rom_crc32": 3689877868, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AWRE" }, "5f683457960b5963da4e6f5a5fe65a75f96d6454": { "rom_size": 8388608, "rom_crc32": 1510583014, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AW2P" }, "f65375328f67f328a1c9a0d725038b7eaed397f6": { "rom_size": 8388608, "rom_crc32": 1523639665, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AW2E" }, "e1179c2537db6f49e08e7ae9af7bcbf59d264cf9": { @@ -2033,7 +2033,7 @@ "rom_size": 4194304, "rom_crc32": 1634770237, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "A8YJ" }, "38b849dcb4655fd3b944c78806274cb809881251": { @@ -2264,7 +2264,7 @@ "rom_size": 33554432, "rom_crc32": 2649083144, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BLEJ" }, "0c1eb48f59af56de00fe35a34b3ea3eac8376546": { @@ -2866,7 +2866,7 @@ "rom_size": 8388608, "rom_crc32": 1233404890, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BIXJ" }, "15d8d251505e14c0dd690193b0bad0d375c3769b": { @@ -2908,14 +2908,14 @@ "rom_size": 4194304, "rom_crc32": 2767146645, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "PEAJ" }, "76a27e2dda8bb3ab043296a7bb6b3f21237efac3": { "rom_size": 8388608, "rom_crc32": 1094313923, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "PSAJ" }, "6a7141231603a00a9fe7fa13f5618c22917527f7": { @@ -3356,21 +3356,21 @@ "rom_size": 4194304, "rom_crc32": 2327185344, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ACRP" }, "db67700ddd5348393c71341b137193d35480c5ac": { "rom_size": 4194304, "rom_crc32": 747379546, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ACRJ" }, "b50f162dcd8bcaff4ecb02278938b8de61603efa": { "rom_size": 4194304, "rom_crc32": 92254646, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ACRE" }, "9fd6bed0cfd8e4b5cf90b8dc6f6f34c193bbed40": { @@ -3566,7 +3566,7 @@ "rom_size": 16777216, "rom_crc32": 4222596664, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BW5E" }, "b51cbeb1518b0b82f3c6f2793728ee80184a87b8": { @@ -3965,7 +3965,7 @@ "rom_size": 8388608, "rom_crc32": 1029982534, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ADSJ" }, "253b30d9b70b3e65b824af4b576955434d3db3bb": { @@ -4259,7 +4259,7 @@ "rom_size": 4194304, "rom_crc32": 2538008338, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "A8PJ" }, "4bba99f563f243f718c40f35fa44f0542f62172e": { @@ -4553,7 +4553,7 @@ "rom_size": 33554432, "rom_crc32": 654750464, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BL4E" }, "04d6bacd2461bd5ce713ffc902ac96a5c2d822c4": { @@ -4896,35 +4896,35 @@ "rom_size": 16777216, "rom_crc32": 569332069, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BW3J" }, "fdf42901bc017ef20582ddf2ceb4c24c2eab7adf": { "rom_size": 33554432, "rom_crc32": 836178643, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BW4J" }, "fa9e9956c3e173dcd6cc362ea18ede82f39d6538": { "rom_size": 33554432, "rom_crc32": 234529778, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BW6J" }, "5a040dd1aa59c7803f878af8494c478d94794854": { "rom_size": 8388608, "rom_crc32": 3116457863, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "A8DJ" }, "8b8367e29ae016ea891bcc3bbf33c78d95c7b8d9": { "rom_size": 8388608, "rom_crc32": 3345271934, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "A8DJ" }, "b5974f5c7bbbf3c0ec8b6b34453718546dcba2f8": { @@ -5120,14 +5120,14 @@ "rom_size": 8388608, "rom_crc32": 721909649, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AT2J" }, "aa11560789f6b552d54d91d8bb465b961b5f38dc": { "rom_size": 16777216, "rom_crc32": 3364991648, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BD3J" }, "7276d57ce0cfe49acf9ab3a7205cd62a258b9e3c": { @@ -5365,7 +5365,7 @@ "rom_size": 8388608, "rom_crc32": 2334641511, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "PSAE" }, "e0bf2d5bd19eb96b9ae8836be2f0f120f9ea31a8": { @@ -5547,14 +5547,14 @@ "rom_size": 8388608, "rom_crc32": 1215871978, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGRP" }, "63bfd99df7b32af6c7a5eae7f6c13a1c5f82d3ce": { "rom_size": 8388608, "rom_crc32": 3384571301, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGRE" }, "f91c07931c050b8458489b87996d858c4e81f613": { @@ -5771,7 +5771,7 @@ "rom_size": 16777216, "rom_crc32": 3688657379, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BFTJ" }, "81cf9a21217b807b00c425fc53a6e34abe1e3122": { @@ -6310,21 +6310,21 @@ "rom_size": 16777216, "rom_crc32": 3126714439, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AFXP" }, "ecd0098be38419aa812681cc26bcca4f17d386b4": { "rom_size": 16777216, "rom_crc32": 2776301620, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AFXJ" }, "ac5e332a98c5038a72e0d3f2104616c71709ddc4": { "rom_size": 16777216, "rom_crc32": 1447421292, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AFXE" }, "4a4dafbcd1edd146b68304862843c9c813eda8ca": { @@ -6394,7 +6394,7 @@ "rom_size": 16777216, "rom_crc32": 2684958754, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AFWJ" }, "b093af59d8f3614da98141ce4eff9b47d5e4c747": { @@ -6520,21 +6520,21 @@ "rom_size": 8388608, "rom_crc32": 313152076, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AFPE" }, "42530d057753c2625cbc245bf06bbde59255a51f": { "rom_size": 8388608, "rom_crc32": 3117400531, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AFYE" }, "1b7f8ac8caa64d3ed79a8a23014ef95e61dfdb29": { "rom_size": 8388608, "rom_crc32": 196378243, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AFPJ" }, "b73a6d7027d08cd644d97668181300bdc2de9bd3": { @@ -6737,7 +6737,7 @@ "rom_size": 8388608, "rom_crc32": 3874864597, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AUSJ" }, "523a3765317937f9401700bfccde1ac2992e7aef": { @@ -6807,14 +6807,14 @@ "rom_size": 8388608, "rom_crc32": 3953094417, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ABIJ" }, "cc6693098390dc0379ae7a6751a6044f507dcc8b": { "rom_size": 8388608, "rom_crc32": 3718638686, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AAIJ" }, "2894bc67b2ef8dcd07aa8c8abd0a4944b3fc46b8": { @@ -7227,7 +7227,7 @@ "rom_size": 16777216, "rom_crc32": 1240342493, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BGWJ" }, "1c3162a5f4709ddae88e8affa6649d9ed6dd8c6d": { @@ -7353,7 +7353,7 @@ "rom_size": 16777216, "rom_crc32": 1477050533, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BGJJ" }, "5892f6754a7e2e044634ae270ef24331268c40a6": { @@ -7374,7 +7374,7 @@ "rom_size": 16777216, "rom_crc32": 2633402492, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BGIJ" }, "96061da3d9f9b4f9b239c180ca1ef38620e0246e": { @@ -7402,7 +7402,7 @@ "rom_size": 8388608, "rom_crc32": 2447037544, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "A8GJ" }, "a264d5d44616a575bdddd5dcb5fbb93ff8b43cb0": { @@ -7479,70 +7479,70 @@ "rom_size": 8388608, "rom_crc32": 4132573537, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGSF" }, "93acb70ddd068c802e7f6a298de05f983ab479f3": { "rom_size": 8388608, "rom_crc32": 273931492, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGSD" }, "5f8f9cc642860ed147a8362e885194237f1c8447": { "rom_size": 8388608, "rom_crc32": 4078077970, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGSI" }, "60676dd068d1263c6bd1fb5fd396e4986ebd388f": { "rom_size": 8388608, "rom_crc32": 3325036758, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGSS" }, "f56ebfd0de821b6693ee6e2729e0a5961afc4e7f": { "rom_size": 8388608, "rom_crc32": 3791349992, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGSE" }, "fe0a51dd66eb66e8ac51f6ac270d6fc0f379e92d": { "rom_size": 16777216, "rom_crc32": 3649165449, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGFD" }, "67f5ab731e0185ce26148407aeb2b11fa1489117": { "rom_size": 16777216, "rom_crc32": 277921075, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGFF" }, "91209c3fe5d8de35bf3ccb42d3dd8059c98497fa": { "rom_size": 16777216, "rom_crc32": 2749667139, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGFI" }, "a2d69ac459345272b075297443ff26c079ad556a": { "rom_size": 16777216, "rom_crc32": 3996695188, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGFS" }, "304742b2b49453595850f3843c6a7348dbf1b607": { "rom_size": 16777216, "rom_crc32": 1617566797, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGFE" }, "a10e028b16e9d4d2f383be4e464ca7752b1a3cf3": { @@ -7689,21 +7689,21 @@ "rom_size": 8388608, "rom_crc32": 3130361373, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGXP" }, "3096f813eef237c244f418d32eab7ca5562571be": { "rom_size": 8388608, "rom_crc32": 369689582, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGXJ" }, "cdaf93f1f6038305144cb059a19a8faaf4ef406f": { "rom_size": 8388608, "rom_crc32": 1893416854, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGXE" }, "544f36eea0e566442823aab7cd7b2ab30e1bdfaf": { @@ -7745,7 +7745,7 @@ "rom_size": 4194304, "rom_crc32": 818957017, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGCJ" }, "b00225bf1a120fc55c96749a153260420a6341fa": { @@ -7906,7 +7906,7 @@ "rom_size": 4194304, "rom_crc32": 389704778, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BHAJ" }, "00f9afb55c018786f2c43e5f5e33b5ad299dea99": { @@ -8851,14 +8851,14 @@ "rom_size": 8388608, "rom_crc32": 195395743, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGRJ" }, "d3b08308e192a3ad2afc86f168c474dfc0f13c79": { "rom_size": 8388608, "rom_crc32": 3093551841, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGMJ" }, "eb7cc17dc164f3451e918a80de1e248c43a2ce3a": { @@ -8907,7 +8907,7 @@ "rom_size": 4194304, "rom_crc32": 119099905, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AJUJ" }, "e2c74e2690aab78e0bf7706031d05f66f8ab8212": { @@ -9089,7 +9089,7 @@ "rom_size": 16777216, "rom_crc32": 2192897018, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AKZJ" }, "fe236457f2df5c2fd039d12f8be5fc8f12948f52": { @@ -9124,7 +9124,7 @@ "rom_size": 8388608, "rom_crc32": 1677606398, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AYKE" }, "afdaf47afe088ff9a3f2fed4ce690d62ab60bd61": { @@ -9187,14 +9187,14 @@ "rom_size": 8388608, "rom_crc32": 1155213326, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ATPJ" }, "e4c96c2d2366d42c7a77f5bada0758d68670bef5": { "rom_size": 8388608, "rom_crc32": 2408958547, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ATSJ" }, "f37413a0f76b1b9302fc60e0f0d98099f994d7c7": { @@ -9978,21 +9978,21 @@ "rom_size": 8388608, "rom_crc32": 2381936029, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BLJK" }, "0cf7b20bf2e1c7d5cf03e7196529366030337e32": { "rom_size": 16777216, "rom_crc32": 2554538513, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BLVJ" }, "687bb774170c7480748523f65feabc91354043e2": { "rom_size": 8388608, "rom_crc32": 865403432, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BLJJ" }, "4a40b79fe5c04da1470c711a25186c5a424d8030": { @@ -10559,7 +10559,7 @@ "rom_size": 8388608, "rom_crc32": 1880241488, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AJOJ" }, "8b5bce28d650077e1669ef75169e637698da6e1e": { @@ -10608,7 +10608,7 @@ "rom_size": 8388608, "rom_crc32": 1506535700, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AMVJ" }, "c00029f76e7333852fb000388d62b8ecf066658c": { @@ -10643,7 +10643,7 @@ "rom_size": 8388608, "rom_crc32": 999834257, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AMCJ" }, "cd1efa43615ae3624cd105f94f99b1e88f1efd09": { @@ -10804,21 +10804,21 @@ "rom_size": 4194304, "rom_crc32": 537024578, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AMKP" }, "0813b90ec2623886a1ad21f4b141573d9886c73a": { "rom_size": 4194304, "rom_crc32": 3979439671, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AMKE" }, "1df96ece8b773a8fc523f2485321663a34ce2f48": { "rom_size": 4194304, "rom_crc32": 820617165, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AMKJ" }, "06a39d45ff867fcc5efef7065d607e01600cba9d": { @@ -10874,21 +10874,21 @@ "rom_size": 16777216, "rom_crc32": 3389197665, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BM5P" }, "470794d23dc8864c2b3b51b01d0cf59c42e52c2b": { "rom_size": 16777216, "rom_crc32": 2083213929, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BM5J" }, "3620ce1ded7045358b144164474d288c67ec42b4": { "rom_size": 16777216, "rom_crc32": 633574609, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BM5E" }, "2c6caf3c5d3ec7c2d909637ed86a59b676630856": { @@ -11161,14 +11161,14 @@ "rom_size": 8388608, "rom_crc32": 356846435, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ANAJ" }, "e7f62f516f8c1905d788e2e5f1b17130aceb6370": { "rom_size": 8388608, "rom_crc32": 3896313814, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AVIJ" }, "6f5857fcd4bfbf4faa4663c5264a82e3b227c8c9": { @@ -11574,7 +11574,7 @@ "rom_size": 8388608, "rom_crc32": 1357149096, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BMKJ" }, "0c73cf2187929042bf8a74c80d6a868e347fa156": { @@ -11854,7 +11854,7 @@ "rom_size": 8388608, "rom_crc32": 2381881536, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AMBJ" }, "dcf72caf7848ea983b621021a9a92fa73d7df5c9": { @@ -12169,7 +12169,7 @@ "rom_size": 33554432, "rom_crc32": 1118608569, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "A3UJ" }, "52842630235eccf74d1965a9e70f1a70a0c94f78": { @@ -12547,7 +12547,7 @@ "rom_size": 8388608, "rom_crc32": 233354420, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AN2J" }, "978c3add8408279427ec8e7dc40589f3be7e499e": { @@ -12750,7 +12750,7 @@ "rom_size": 4194304, "rom_crc32": 4012099486, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ANBJ" }, "8a6abc8d04a4d69fddc3e2dfc1c0aa4b207d69cf": { @@ -12946,7 +12946,7 @@ "rom_size": 8388608, "rom_crc32": 3748200944, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AICJ" }, "7ddef563f53457341be11ac7035ad04254bc9c27": { @@ -12995,14 +12995,14 @@ "rom_size": 8388608, "rom_crc32": 4220967390, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGSJ" }, "8c354bed050cc53a46105f89bd194a8fa7c361be": { "rom_size": 16777216, "rom_crc32": 2198567263, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGFJ" }, "6cbc3a838f133ecdd612afa6b39da0945ffe7209": { @@ -13562,49 +13562,49 @@ "rom_size": 16777216, "rom_crc32": 1216476152, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPEJ" }, "f5a922fdf81768f73acc848e2a563266f949bf46": { "rom_size": 16777216, "rom_crc32": 3143896567, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPRJ" }, "e139f8003de78e59ebcab6cc83fd957bb8c56e1e": { "rom_size": 16777216, "rom_crc32": 991975145, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPRJ" }, "d7afa6e7e8f15df9dc871a65d9b900a2303f064a": { "rom_size": 16777216, "rom_crc32": 2376359962, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPGJ" }, "d2e246c82af32ecc46ee92813695dc337a27e031": { "rom_size": 16777216, "rom_crc32": 172512619, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPGJ" }, "ea91c7159643c8b4d1dc7318e7af59605ac61980": { "rom_size": 8388608, "rom_crc32": 3471394586, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXVJ" }, "d8025d0b015dce3bd949f2cb9ed3ecf7a8045e55": { "rom_size": 8388608, "rom_crc32": 4246662008, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXPJ" }, "85b5103ec947c18cab67c3648e7475f8f662071f": { @@ -13646,294 +13646,294 @@ "rom_size": 16777216, "rom_crc32": 3509526493, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPGD" }, "665c13faf471b2cae7a61f20d93b477e6eb73c55": { "rom_size": 16777216, "rom_crc32": 2353869064, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPES" }, "7584e1cefe1dd47026cbd38399e9b8260a1eb7bd": { "rom_size": 16777216, "rom_crc32": 2668103246, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPRS" }, "371f031b7612c8d296981ff8326d62bf52773f74": { "rom_size": 16777216, "rom_crc32": 3112239093, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXVS" }, "9927c4fd32f53c3802b7800c6fdd19bae454c85a": { "rom_size": 16777216, "rom_crc32": 3943115215, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXVS" }, "281ed96d5850ca56cf5af43115f9586eb93b0797": { "rom_size": 16777216, "rom_crc32": 748756313, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPGS" }, "3230710bb0c3b549e7478aa23bc287fa5aa4d246": { "rom_size": 16777216, "rom_crc32": 4073228593, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXPS" }, "e8fefcda0a725f23e1aec144c8aa1a07860c4cfb": { "rom_size": 16777216, "rom_crc32": 2689556235, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXPS" }, "e0618bd3b4c0986b7f710226d813f8a0de8a4e78": { "rom_size": 16777216, "rom_crc32": 521931003, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPEE" }, "da97b4134145f1bc41245f4be7e56ea7ddb2c9b5": { "rom_size": 16777216, "rom_crc32": 444722911, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPRD" }, "62f5e8cf2f83e65df7a5a0e4ab1a84886f2b4838": { "rom_size": 16777216, "rom_crc32": 3716707868, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPRE" }, "646d2e75e8e5fcd835bbe62b888595e957b228a4": { "rom_size": 16777216, "rom_crc32": 2230208374, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPRE" }, "ad4ce6033af10b253ae57a8aac48bf5fa4f6966f": { "rom_size": 16777216, "rom_crc32": 3600586444, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPGE" }, "e8f43d6c5286b626d039621ae3bef5103774329e": { "rom_size": 16777216, "rom_crc32": 3674205420, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPGE" }, "7362399e23d685a6fbeaaa989b25fc67b9bd114c": { "rom_size": 16777216, "rom_crc32": 3404239972, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXVD" }, "0f0542313b01552f79fe3793c2bed6f8e76f14dc": { "rom_size": 16777216, "rom_crc32": 367125120, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXVD" }, "ef59dc2dbbcc1caa4cc50a0155d0491a59d91076": { "rom_size": 16777216, "rom_crc32": 4035010279, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXVE" }, "4545c4e0aa9664f38800d881570f2504b7061f20": { "rom_size": 16777216, "rom_crc32": 1633949046, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXVE" }, "d8fc86baa6a0da0034ff22d3590ab79596fd866c": { "rom_size": 16777216, "rom_crc32": 2930537446, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXVE" }, "aa6d44b020143ea0439b251f6b45b1dfc9aca05e": { "rom_size": 16777216, "rom_crc32": 2965638268, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXPD" }, "b1a5c50656fd7f29036d934620515f9ce9e316e0": { "rom_size": 16777216, "rom_crc32": 1875737240, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXPD" }, "8155fd52f7b90ef4fe68851aedf95e0dc1d8cfc4": { "rom_size": 16777216, "rom_crc32": 1431170500, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXPE" }, "bff91c51da1e93df1661a3e507a8ffd9488b019b": { "rom_size": 16777216, "rom_crc32": 3137264357, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXPE" }, "fbd5059e024e18ba4dd8b0b827bdf1b2586ca80c": { "rom_size": 16777216, "rom_crc32": 2630107406, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXPE" }, "e3b6f29d1344332b911846e9b0e9f01b6e841340": { "rom_size": 16777216, "rom_crc32": 885645193, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPED" }, "1149712e89c009f49d9e3558f038b536e7c19218": { "rom_size": 16777216, "rom_crc32": 2751319217, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPEF" }, "89d09e60724be1e9ea5533a6cf7f204f09b58d25": { "rom_size": 16777216, "rom_crc32": 1573284086, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPRF" }, "860734e3ec2510021d85de67ff2f04e52ba8d735": { "rom_size": 16777216, "rom_crc32": 2677546866, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXVF" }, "2353cd6cfdb6eb946f97bc1d1da0e24d5e7ea896": { "rom_size": 16777216, "rom_crc32": 1762644752, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXVF" }, "266d59f6664a16a9795de36423a748fa4cb019e8": { "rom_size": 16777216, "rom_crc32": 719622470, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXPF" }, "af2873d365fe985449c12b2d69523fa21072e732": { "rom_size": 16777216, "rom_crc32": 897687647, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXPF" }, "b32f530c91a07028653afe4878880efaed5ca2e7": { "rom_size": 16777216, "rom_crc32": 3123873251, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPGF" }, "0074dc0c470e70829df4a519fb91fdbdba63ed9e": { "rom_size": 16777216, "rom_crc32": 1940332903, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPRI" }, "31a3bc40967c4274d6593342f7bea1dc203225bc": { "rom_size": 16777216, "rom_crc32": 2466637715, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXVI" }, "b7c6ed99b3bae979bb8e3a6f45cd8dd686e2b977": { "rom_size": 16777216, "rom_crc32": 3246535081, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXVI" }, "9e7e38766eb5264e0e3a1130653fff5441ca4c33": { "rom_size": 16777216, "rom_crc32": 2695809034, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPEI" }, "4f81d3d5e5a2807e0861eaa795b74609599a187d": { "rom_size": 16777216, "rom_crc32": 379012358, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BPGI" }, "322a018b0bb5060915a3fe2f1472304f7beedba3": { "rom_size": 16777216, "rom_crc32": 1593722003, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXPI" }, "f0ec8ae459a004dbd2b7787bd14a4fac1f685a81": { "rom_size": 16777216, "rom_crc32": 209293993, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AXPI" }, "fb62f31654590827a29c864b3e9b3ec89f202b79": { "rom_size": 33554432, "rom_crc32": 438020688, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "B24J" }, "7b39c9db54d636058ba85d808aa6db19528572f7": { "rom_size": 33554432, "rom_crc32": 3251736548, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "B24P" }, "6fa0c5f5b8072a607af212f14e90f9696d001101": { "rom_size": 33554432, "rom_crc32": 3708471404, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "B24E" }, "3410b936c4bf86261fdcea3bab522dca1d404260": { @@ -13975,14 +13975,14 @@ "rom_size": 4194304, "rom_crc32": 2402151352, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BIIP" }, "8723e3e1370df22c5ce843d53123f677a4a00a39": { "rom_size": 4194304, "rom_crc32": 47590633, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BIIE" }, "d7ab7617cc018b8e0c0c595d3d2402be39e04186": { @@ -14234,28 +14234,28 @@ "rom_size": 4194304, "rom_crc32": 3397991364, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BPMP" }, "8fce74ae035e146b48b2591176ef5e933535a495": { "rom_size": 4194304, "rom_crc32": 2841245240, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BPMP" }, "0cf932e6c14701381ca80d3bd5991fc6f63b10dc": { "rom_size": 4194304, "rom_crc32": 654761970, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BP4P" }, "7e191f1fc0aa2a274be59d8e8bae111363c8a6bc": { "rom_size": 4194304, "rom_crc32": 990144315, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BP5P" }, "c50fc7fa7ec0c2ce5963ccc16bef5ff9863a8859": { @@ -14794,28 +14794,28 @@ "rom_size": 8388608, "rom_crc32": 1758659130, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ACVE" }, "a58122e23085b7d1b5be8f5637c211a9c3ac1297": { "rom_size": 8388608, "rom_crc32": 3396591994, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ARPE" }, "8f0f3cc537c2334b517a037d450699873edff129": { "rom_size": 8388608, "rom_crc32": 208612123, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ACVJ" }, "09afe0c6126c28ff6f30820f6e93e62a1a6e10ab": { "rom_size": 8388608, "rom_crc32": 1610749340, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ARPJ" }, "32b1ab0a45d87cf45ead7b0b270e13272bec80d5": { @@ -14955,7 +14955,7 @@ "rom_size": 8388608, "rom_crc32": 2789629979, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BR4J" }, "2f6c13a0ac611560507b827abc28dd9005936cc0": { @@ -15039,7 +15039,7 @@ "rom_size": 8388608, "rom_crc32": 3892085200, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "A8TJ" }, "7b922bdc8492f805fe4295e6e78b9e6cb27b0dff": { @@ -15179,21 +15179,21 @@ "rom_size": 8388608, "rom_crc32": 4090741305, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ASXJ" }, "acb06d19af1ac57fe4bcf418b76921aff64390f9": { "rom_size": 4194304, "rom_crc32": 2762066262, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "B3EJ" }, "1cac3488a1b9b21a60c426d95a252fd40676ce10": { "rom_size": 8388608, "rom_crc32": 1984971775, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "B3QJ" }, "e96a28cb18b8ae0adaa3d492182fcfa54770502b": { @@ -15494,14 +15494,14 @@ "rom_size": 16777216, "rom_crc32": 3702186101, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BKAJ" }, "0c9f1a9ba635c3ca68a2ec52e7465a630ab893df": { "rom_size": 16777216, "rom_crc32": 2734069612, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "BKAJ" }, "fc8c25cce5ec65d50df16c7befc60e799496a852": { @@ -15830,49 +15830,49 @@ "rom_size": 8388608, "rom_crc32": 1958072425, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AHUP" }, "8ed879bac1b821f47ebe3d63f0ec1cf3ecf8a2fe": { "rom_size": 8388608, "rom_crc32": 1377063121, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AHUJ" }, "74d497de599ba0ddb3357334f609c87804ba9d34": { "rom_size": 8388608, "rom_crc32": 3915102732, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AHUE" }, "9c43149f56c492855e7f2bd1dda26e9d4803ee2e": { "rom_size": 16777216, "rom_crc32": 1441072065, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AU2P" }, "4b5351a7da02570d7d0d0d358a5313f5197656b6": { "rom_size": 16777216, "rom_crc32": 2067376050, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AU2J" }, "55f78ffa7e8e17de6d1935f2a59abc97e0dc55d4": { "rom_size": 16777216, "rom_crc32": 1077469826, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AU2E" }, "817d6cd431e1ced202dfe739e45fa3d5c2f0654e": { "rom_size": 16777216, "rom_crc32": 833757413, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AVSJ" }, "57c9b7bb1be6fe4decbd2558f807279b7d552e35": { @@ -16117,21 +16117,21 @@ "rom_size": 33554432, "rom_crc32": 2333853663, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "B46E" }, "e3b355e67ace40f28e613845ebdddb9fe9e43838": { "rom_size": 33554432, "rom_crc32": 2281200028, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "B4OX" }, "14a80327c4add4a9a60528baa6eea3c81bcfc2b2": { "rom_size": 33554432, "rom_crc32": 3961471017, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "B4OE" }, "8981a4eaae2710d081c2bdc082281ffc3e971f34": { @@ -16299,112 +16299,112 @@ "rom_size": 8388608, "rom_crc32": 1647477659, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ASOP" }, "4413c9397d7ab229500bbc4247156fb38246e4c8": { "rom_size": 8388608, "rom_crc32": 2241165860, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ASOJ" }, "372e1880a0dd1213422422a8e56aac7b8ed01d66": { "rom_size": 8388608, "rom_crc32": 1599152675, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ASOJ" }, "b37ebb42082531a8b19b4135b418b1a0f379777e": { "rom_size": 8388608, "rom_crc32": 1677135832, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ASOE" }, "6a7f68a89eb6949e631fc79f15d58be9c343ef76": { "rom_size": 16777216, "rom_crc32": 2303760529, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "A2NP" }, "8063f0416fa8b6c0308f16ca8b0b75a98f2b6e7b": { "rom_size": 16777216, "rom_crc32": 1362625791, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "A2NJ" }, "b86c0231782e6f5c94b97e75920950074bcd50c8": { "rom_size": 16777216, "rom_crc32": 2130634743, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "A2NE" }, "75ec7cfe6fd4e9715b753c8a9fcab3d0466a1450": { "rom_size": 16777216, "rom_crc32": 1542992982, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "B3SP" }, "54c6f80b4a54bb9af3086879a65a3ca33476109b": { "rom_size": 16777216, "rom_crc32": 1131803094, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "B3SJ" }, "87d0b8c6967ad71f1cfaf11d4a68ba2ca4efbf8d": { "rom_size": 16777216, "rom_crc32": 1239262694, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "B3SE" }, "9581bf4e75e5c410d716dfcb002e70a28af036f3": { "rom_size": 16777216, "rom_crc32": 3505803557, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BSBP" }, "ca289d003d6cf14882b9b0f6409ae929f89aef71": { "rom_size": 16777216, "rom_crc32": 1929751600, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BSBJ" }, "5425170401c21236ff5bb6e473be425bf2118d3e": { "rom_size": 16777216, "rom_crc32": 2664028271, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BSBE" }, "600900657db867a7b1dd7e02af6de839d69301e0": { "rom_size": 8388608, "rom_crc32": 1144361342, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "A3VP" }, "3a8b0121284aee9880877be82bc1190e2102ed2b": { "rom_size": 8388608, "rom_crc32": 1135997287, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "A86J" }, "6a4e23f1e3ddc9aed119b4fac1624e0ac3bb847a": { "rom_size": 8388608, "rom_crc32": 142165827, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "A3VE" }, "db78ad7cd77b4215f7be5683a07b397c2f4bc2bb": { @@ -17412,49 +17412,49 @@ "rom_size": 4194304, "rom_crc32": 1516725284, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AX4J" }, "264cd0336a8f4c657b5d2e8b9aedfd2017f64e16": { "rom_size": 4194304, "rom_crc32": 2065320994, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AX4J" }, "042a2fc1b3846798ce0549afa32a5a3e8313613e": { "rom_size": 4194304, "rom_crc32": 4090000134, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AX4J" }, "55c16e8dcab8c0c07fde1afa0ff996ec9ef64dbf": { "rom_size": 8388608, "rom_crc32": 2374282492, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AX4P" }, "3f8e097a2db67aac369cfdba6ff35faf22079179": { "rom_size": 8388608, "rom_crc32": 924065586, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AX4P" }, "0bde2155cd2ccd33327ad77491f90116587d210a": { "rom_size": 4194304, "rom_crc32": 2756421535, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AX4E" }, "d403fd1341f13106d47baa56a4f22e8380962041": { "rom_size": 4194304, "rom_crc32": 2296033919, "savesize": 131072, - "savetype": 6, + "savetype": 7, "code": "AX4E" }, "8d904c5caddcc4b8a4698477362b16a9fd7be742": { @@ -17531,63 +17531,63 @@ "rom_size": 16777216, "rom_crc32": 3182980266, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AOGP" }, "2e52ca55e7a2f54398b07c8e34f39c450f943497": { "rom_size": 8388608, "rom_crc32": 1964146372, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AOGJ" }, "db641133a065909dff04b7b8b2c44221c7c58852": { "rom_size": 16777216, "rom_crc32": 1491624550, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AOGE" }, "e2aff59f5a90503067ec8c9a76980abd141157c1": { "rom_size": 16777216, "rom_crc32": 2785574927, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "B2RJ" }, "18f7eb3d4e411eee51b00c371cf0a2ef6c756239": { "rom_size": 16777216, "rom_crc32": 720241536, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "B2RE" }, "55d018e29781c15aded399619c3540ee1a1708f7": { "rom_size": 8388608, "rom_crc32": 795776904, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ASRJ" }, "a4bb144d278b6a9ec0d5bec39ff11adb2f3c4b7a": { "rom_size": 8388608, "rom_crc32": 4021571863, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "A6SJ" }, "bced30c579c29b2b49fe8f163d30090fec83a906": { "rom_size": 16777216, "rom_crc32": 3377921335, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "B6JJ" }, "7972f2b5220d443bac5fc5a96dd9eee7002aa864": { "rom_size": 8388608, "rom_crc32": 3749679548, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AJ9J" }, "90b3f47c4786796dc677df692cf1bdb060b6bc5a": { @@ -17678,28 +17678,28 @@ "rom_size": 16777216, "rom_crc32": 295743305, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AVSY" }, "352da67011a8dbd93dc26bfd41bd467e1fd54cd8": { "rom_size": 16777216, "rom_crc32": 1591836369, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AVSX" }, "5cff665bd7d417b3b626a33e7f4d790a3ee91251": { "rom_size": 16777216, "rom_crc32": 2296793738, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AVSP" }, "dc9e56b67bfc972e49f963acecf96ed2f88f4c1a": { "rom_size": 16777216, "rom_crc32": 2132716661, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AVSE" }, "b54424b04c68dff800d4e3bed36fe9aa12c926ab": { @@ -17727,14 +17727,14 @@ "rom_size": 8388608, "rom_crc32": 1716114126, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ATOE" }, "db411340c20b2eaf91c602814b7273904094d692": { "rom_size": 8388608, "rom_crc32": 23570552, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ATOJ" }, "f30595d0c10c2991edbef187bebe6b369d1a7ca1": { @@ -18007,7 +18007,7 @@ "rom_size": 8388608, "rom_crc32": 3710143642, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "ATIJ" }, "052d411a16e5cd61e5f702ed5a97104a0a993cba": { @@ -18553,7 +18553,7 @@ "rom_size": 4194304, "rom_crc32": 3754462526, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "A2YE" }, "fb56c6cff2d21ecc0471cacf5e18f59f5a480b1d": { @@ -18644,14 +18644,14 @@ "rom_size": 8388608, "rom_crc32": 3962723474, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BTRJ" }, "8e26a7ba6c1687473f84f8be0256bdd5c0365af8": { "rom_size": 8388608, "rom_crc32": 2514507925, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BTRE" }, "eec0a1975c68ed9f18329c6e91c13b46d536882e": { @@ -18749,7 +18749,7 @@ "rom_size": 4194304, "rom_crc32": 1518237227, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BIIJ" }, "4a13a4198da97326c7d05146277bb17c55fde103": { @@ -18987,7 +18987,7 @@ "rom_size": 8388608, "rom_crc32": 3224864199, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BUTJ" }, "afced08761c65e939d8274b9ab96bb851133438f": { @@ -19043,14 +19043,14 @@ "rom_size": 33554432, "rom_crc32": 3150758653, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BOCJ" }, "ffb1229bf6d8c549e13e0f0af4e89ceed68be483": { "rom_size": 33554432, "rom_crc32": 2335387835, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "BOCE" }, "4de78b608d2dad0b08d0719f7daf6a6267f3f89b": { @@ -19449,21 +19449,21 @@ "rom_size": 4194304, "rom_crc32": 4128770805, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AWPJ" }, "d99e6c8498bb7b4e7706524a618a46134122bd73": { "rom_size": 4194304, "rom_crc32": 2679418634, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AWPJ" }, "4379f548feea37e96d360084215d39a407c4bffb": { "rom_size": 4194304, "rom_crc32": 1524261110, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AWPJ" }, "21a4580b592356d6f539e23add8be0ad5bcba542": { @@ -19841,21 +19841,21 @@ "rom_size": 8388608, "rom_crc32": 3996221289, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AYDP" }, "cb6c0e3dde6d76ffc21ee33e343beb9cfdc1c4dc": { "rom_size": 8388608, "rom_crc32": 1370709639, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AYDJ" }, "6fa5952ed82ced10cb525ed693c4a63b4c8a0f0e": { "rom_size": 8388608, "rom_crc32": 2338196007, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AYDE" }, "28685df31700adc7c7c1f0db3bd436eba00fdba6": { @@ -20072,7 +20072,7 @@ "rom_size": 8388608, "rom_crc32": 2683237997, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AZEJ" }, "714f2321b7fb6e6854e196edd3ec26eaa73348e6": { @@ -20114,14 +20114,14 @@ "rom_size": 4194304, "rom_crc32": 3542133093, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AGTJ" }, "60a0a115869886ed4973fad07975c7410fc29c64": { "rom_size": 8388608, "rom_crc32": 646945918, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "A2ZJ" }, "95b3a7696b8d1bcb21a2e341a818dcec3851db3a": { @@ -20142,7 +20142,7 @@ "rom_size": 4194304, "rom_crc32": 3732675304, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AZTJ" }, "a811e4f0b26f498f61f1a5241fd608755241afac": { @@ -20240,14 +20240,14 @@ "rom_size": 8388608, "rom_crc32": 2536806112, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AZEP" }, "ac4d50a5223e1905a281bdcf3c787794aac0adc6": { "rom_size": 8388608, "rom_crc32": 606356501, "savesize": 65536, - "savetype": 5, + "savetype": 6, "code": "AZEE" }, "b4fb4232bfb6a420bcc3c424b9cb5c33fdd97383": { diff --git a/FlashGBX/config/fc_AGB_29LV128DT.txt b/FlashGBX/config/fc_AGB_29LV128DT.txt new file mode 100644 index 0000000..94da201 --- /dev/null +++ b/FlashGBX/config/fc_AGB_29LV128DT.txt @@ -0,0 +1,53 @@ +{ + "type":"AGB", + "names":[ + "AGB-E08-09 with 29LV128DTMC-90Q" + ], + "flash_ids":[ + [ 0xC1, 0x00, 0x7D, 0x22 ] + ], + "voltage":3.3, + "flash_size":0x1000000, + "sector_size":[ + [0x10000, 255], + [0x02000, 8] + ], + "commands":{ + "reset":[ + [ 0, 0xF0 ] + ], + "read_identifier":[ + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ 0xAAA, 0x90 ] + ], + "sector_erase":[ + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ 0xAAA, 0x80 ], + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ "SA", 0x30 ] + ], + "sector_erase_wait_for":[ + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ "SA", 0xFFFF, 0xFFFF ] + ], + "single_write":[ + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ 0xAAA, 0xA0 ], + [ "PA", "PD" ] + ], + "single_write_wait_for":[ + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ] + ] + } +} diff --git a/FlashGBX/config/fc_AGB_M36L0R705.txt b/FlashGBX/config/fc_AGB_M36L0R7050T.txt similarity index 85% rename from FlashGBX/config/fc_AGB_M36L0R705.txt rename to FlashGBX/config/fc_AGB_M36L0R7050T.txt index c7bba8d..c96118f 100644 --- a/FlashGBX/config/fc_AGB_M36L0R705.txt +++ b/FlashGBX/config/fc_AGB_M36L0R7050T.txt @@ -1,9 +1,11 @@ { "type":"AGB", "names":[ - "4455_4400_4000_4350_36L0R_V3 with M36L0R705" + "4455_4400_4000_4350_36L0R_V3 with M36L0R7050T", + "4050_4400_4000_4350_36L0R_V5 with M36L0R7050T" ], "flash_ids":[ + [ 0x20, 0x00, 0xC4, 0x88 ], [ 0x20, 0x00, 0xC4, 0x88 ] ], "voltage":3.3, diff --git a/FlashGBX/config/fc_AGB_M36L0R8060B.txt b/FlashGBX/config/fc_AGB_M36L0R8060B.txt new file mode 100644 index 0000000..8bbb049 --- /dev/null +++ b/FlashGBX/config/fc_AGB_M36L0R8060B.txt @@ -0,0 +1,86 @@ +{ + "type":"AGB", + "names":[ + "36L0R8-39VF512 with M36L0R8060B", + "36L0R8-39VF512 with M36L0R8060B" + ], + "flash_ids":[ + [ 0x20, 0x00, 0x0D, 0x88 ], + [ 0x8A, 0x00, 0x10, 0x88 ] + ], + "voltage":3.3, + "flash_size":0x2000000, + "sector_size":[ + [0x08000, 4], + [0x20000, 255] + ], + "commands":{ + "reset":[ + [ 0, 0xFF ], + [ 0x100000, 0xFF ], + [ 0x200000, 0xFF ], + [ 0x300000, 0xFF ], + [ 0x400000, 0xFF ], + [ 0x500000, 0xFF ], + [ 0x600000, 0xFF ], + [ 0x700000, 0xFF ], + [ 0x800000, 0xFF ], + [ 0x900000, 0xFF ], + [ 0xA00000, 0xFF ], + [ 0xB00000, 0xFF ], + [ 0xC00000, 0xFF ], + [ 0xD00000, 0xFF ], + [ 0xE00000, 0xFF ], + [ 0xF00000, 0xFF ], + [ 0x1000000, 0xFF ], + [ 0x1100000, 0xFF ], + [ 0x1200000, 0xFF ], + [ 0x1300000, 0xFF ], + [ 0x1400000, 0xFF ], + [ 0x1500000, 0xFF ], + [ 0x1600000, 0xFF ], + [ 0x1700000, 0xFF ], + [ 0x1800000, 0xFF ], + [ 0x1900000, 0xFF ], + [ 0x1A00000, 0xFF ], + [ 0x1B00000, 0xFF ], + [ 0x1C00000, 0xFF ], + [ 0x1D00000, 0xFF ], + [ 0x1E00000, 0xFF ], + [ 0x1F00000, 0xFF ] + ], + "read_identifier":[ + [ 0, 0x90 ] + ], + "sector_erase":[ + [ "SA", 0x60 ], + [ "SA", 0xD0 ], + [ "SA", 0x20 ], + [ "SA", 0xD0 ] + ], + "sector_erase_wait_for":[ + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ "SA", 0x80, 0xFFFF ] + ], + "buffer_write":[ + [ "SA", 0x60 ], + [ "SA", 0xD0 ], + [ "SA", 0xE8 ], + [ "SA", "BS" ], + [ "PA", "PD" ], + [ "SA", 0xD0 ], + [ "SA", 0xFF ] + ], + "buffer_write_wait_for":[ + [ null, null, null ], + [ null, null, null ], + [ "SA", 0x80, 0xFFFF ], + [ null, null, null ], + [ null, null, null ], + [ "SA", 0x80, 0xFFFF ], + [ null, null, null ] + ] + } +} diff --git a/FlashGBX/config/fc_AGB_M36L0R8060T.txt b/FlashGBX/config/fc_AGB_M36L0R8060T.txt new file mode 100644 index 0000000..4c14c74 --- /dev/null +++ b/FlashGBX/config/fc_AGB_M36L0R8060T.txt @@ -0,0 +1,86 @@ +{ + "type":"AGB", + "names":[ + "4050_4400_4000_4350_36L0R_V5 with M36L0R8060T", + "36L0R8-39VF512 with M36L0R8060T" + ], + "flash_ids":[ + [ 0x20, 0x00, 0x0E, 0x88 ], + [ 0x20, 0x00, 0x0E, 0x88 ] + ], + "voltage":3.3, + "flash_size":0x2000000, + "sector_size":[ + [0x20000, 255], + [0x08000, 4] + ], + "commands":{ + "reset":[ + [ 0, 0xFF ], + [ 0x100000, 0xFF ], + [ 0x200000, 0xFF ], + [ 0x300000, 0xFF ], + [ 0x400000, 0xFF ], + [ 0x500000, 0xFF ], + [ 0x600000, 0xFF ], + [ 0x700000, 0xFF ], + [ 0x800000, 0xFF ], + [ 0x900000, 0xFF ], + [ 0xA00000, 0xFF ], + [ 0xB00000, 0xFF ], + [ 0xC00000, 0xFF ], + [ 0xD00000, 0xFF ], + [ 0xE00000, 0xFF ], + [ 0xF00000, 0xFF ], + [ 0x1000000, 0xFF ], + [ 0x1100000, 0xFF ], + [ 0x1200000, 0xFF ], + [ 0x1300000, 0xFF ], + [ 0x1400000, 0xFF ], + [ 0x1500000, 0xFF ], + [ 0x1600000, 0xFF ], + [ 0x1700000, 0xFF ], + [ 0x1800000, 0xFF ], + [ 0x1900000, 0xFF ], + [ 0x1A00000, 0xFF ], + [ 0x1B00000, 0xFF ], + [ 0x1C00000, 0xFF ], + [ 0x1D00000, 0xFF ], + [ 0x1E00000, 0xFF ], + [ 0x1F00000, 0xFF ] + ], + "read_identifier":[ + [ 0, 0x90 ] + ], + "sector_erase":[ + [ "SA", 0x60 ], + [ "SA", 0xD0 ], + [ "SA", 0x20 ], + [ "SA", 0xD0 ] + ], + "sector_erase_wait_for":[ + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ "SA", 0x80, 0xFFFF ] + ], + "buffer_write":[ + [ "SA", 0x60 ], + [ "SA", 0xD0 ], + [ "SA", 0xE8 ], + [ "SA", "BS" ], + [ "PA", "PD" ], + [ "SA", 0xD0 ], + [ "SA", 0xFF ] + ], + "buffer_write_wait_for":[ + [ null, null, null ], + [ null, null, null ], + [ "SA", 0x80, 0xFFFF ], + [ null, null, null ], + [ null, null, null ], + [ "SA", 0x80, 0xFFFF ], + [ null, null, null ] + ] + } +} diff --git a/FlashGBX/config/fc_AGB_MSP55LV128.txt b/FlashGBX/config/fc_AGB_MSP55LV128.txt index 4c1fe00..0eb1d04 100644 --- a/FlashGBX/config/fc_AGB_MSP55LV128.txt +++ b/FlashGBX/config/fc_AGB_MSP55LV128.txt @@ -9,7 +9,6 @@ "voltage":3.3, "flash_size":0x1000000, "sector_size":0x10000, - "chip_erase_timeout":75, "commands":{ "reset":[ [ 0, 0xF0 ] @@ -19,22 +18,6 @@ [ 0x555, 0x56 ], [ 0xAAA, 0x90 ] ], - "chip_erase":[ - [ 0xAAA, 0xA9 ], - [ 0x555, 0x56 ], - [ 0xAAA, 0x80 ], - [ 0xAAA, 0xA9 ], - [ 0x555, 0x56 ], - [ 0xAAA, 0x10 ] - ], - "chip_erase_wait_for":[ - [ null, null, null ], - [ null, null, null ], - [ null, null, null ], - [ null, null, null ], - [ null, null, null ], - [ 0, 0xFFFF, 0xFFFF ] - ], "sector_erase":[ [ 0xAAA, 0xA9 ], [ 0x555, 0x56 ], @@ -51,10 +34,26 @@ [ null, null, null ], [ "SA", 0xFFFF, 0xFFFF ] ], + "buffer_write":[ + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ "SA", 0x26 ], + [ "SA", "BS" ], + [ "PA", "PD" ], + [ "SA", 0x2A ] + ], + "buffer_write_wait_for":[ + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ "SA", "PD", 0xFFFF ] + ], "single_write":[ - [ 0x555, 0xA9 ], - [ 0x2AA, 0x56 ], - [ 0x555, 0xA0 ], + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ 0xAAA, 0xA0 ], [ "PA", "PD" ] ], "single_write_wait_for":[ diff --git a/FlashGBX/config/fc_AGB_MSP55LV128M.txt b/FlashGBX/config/fc_AGB_MSP55LV128M.txt index df78372..8da6dd3 100644 --- a/FlashGBX/config/fc_AGB_MSP55LV128M.txt +++ b/FlashGBX/config/fc_AGB_MSP55LV128M.txt @@ -2,11 +2,19 @@ "type":"AGB", "names":[ "AGB-E05-01 with MSP55LV128M", - "BX2006_0106_NEW with S29GL128N10TFI01" + "AGB-E05-01 with GL128S", + "BX2006_0106_NEW with S29GL128N10TFI01", + "BX2006_TSOP_64BALL with GL128S", + "BX2006_TSOPBGA_0106 with M29W640GB6AZA6", + "AGB-E05-02 with M29W128GH" ], "flash_ids":[ [ 0x02, 0x00, 0x7D, 0x22 ], - [ 0x02, 0x00, 0x7D, 0x22 ] + [ 0x02, 0x00, 0x7D, 0x22 ], + [ 0x02, 0x00, 0x7D, 0x22 ], + [ 0x02, 0x00, 0x7D, 0x22 ], + [ 0x20, 0x00, 0x7D, 0x22 ], + [ 0x20, 0x00, 0x7D, 0x22 ] ], "voltage":3.3, "flash_size":0x1000000, @@ -21,22 +29,6 @@ [ 0x555, 0x56 ], [ 0xAAA, 0x90 ] ], - "chip_erase":[ - [ 0xAAA, 0xA9 ], - [ 0x555, 0x56 ], - [ 0xAAA, 0x80 ], - [ 0xAAA, 0xA9 ], - [ 0x555, 0x56 ], - [ 0xAAA, 0x10 ] - ], - "chip_erase_wait_for":[ - [ null, null, null ], - [ null, null, null ], - [ null, null, null ], - [ null, null, null ], - [ null, null, null ], - [ 0, 0xFFFF, 0xFFFF ] - ], "sector_erase":[ [ 0xAAA, 0xA9 ], [ 0x555, 0x56 ], @@ -53,10 +45,26 @@ [ null, null, null ], [ "SA", 0xFFFF, 0xFFFF ] ], + "buffer_write":[ + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ "SA", 0x26 ], + [ "SA", "BS" ], + [ "PA", "PD" ], + [ "SA", 0x2A ] + ], + "buffer_write_wait_for":[ + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ "SA", "PD", 0xFFFF ] + ], "single_write":[ - [ 0x555, 0xA9 ], - [ 0x2AA, 0x56 ], - [ 0x555, 0xA0 ], + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ 0xAAA, 0xA0 ], [ "PA", "PD" ] ], "single_write_wait_for":[ diff --git a/FlashGBX/config/fc_AGB_Nintendo_E201850.txt b/FlashGBX/config/fc_AGB_Nintendo_E201850.txt index 3064190..3ee23be 100644 --- a/FlashGBX/config/fc_AGB_Nintendo_E201850.txt +++ b/FlashGBX/config/fc_AGB_Nintendo_E201850.txt @@ -12,7 +12,10 @@ "wait_read_status_register":true, "commands":{ "reset":[ - [ 0, 0xFF ] + [ 0, 0xFF ], + [ 0x400000, 0xFF ], + [ 0x800000, 0xFF ], + [ 0xC00000, 0xFF ] ], "read_status_register":[ [ 0, 0x70 ] diff --git a/FlashGBX/config/fc_DMG_29DL161TD-90.txt b/FlashGBX/config/fc_DMG_29DL161TD-90.txt index 902c4e7..264ea0e 100644 --- a/FlashGBX/config/fc_DMG_29DL161TD-90.txt +++ b/FlashGBX/config/fc_DMG_29DL161TD-90.txt @@ -1,20 +1,20 @@ { "type":"DMG", "names":[ - "SD007_48BALL_64M_V3 with 29DL161TD-90", - "SD007_48BALL_64M_V5 with 29DL163BD-90", - "SD007_48BALL_64M_V6 with 29DL163BD-90" + "SD007_48BALL_64M_V3 with 29DL161TD-90" ], "flash_ids":[ - [ 0x04, 0x04, 0x35, 0x35 ], - [ 0x04, 0x04, 0x2B, 0x2B ], - [ 0x04, 0x04, 0x2B, 0x2B ] + [ 0x04, 0x04, 0x35, 0x35 ] ], "voltage":3.3, "flash_size":0x200000, "start_addr":0, "first_bank":1, "write_pin":"WR", + "sector_size":[ + [0x10000, 31], + [0x2000, 8] + ], "chip_erase_timeout":120, "commands":{ "reset":[ @@ -41,6 +41,22 @@ [ null, null, null ], [ 0, 0xFF, 0xFF ] ], + "sector_erase":[ + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ 0xAAA, 0x80 ], + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ "SA", 0x30 ] + ], + "sector_erase_wait_for":[ + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ 0, 0xFF, 0xFF ] + ], "single_write":[ [ 0xAAA, 0xA9 ], [ 0x555, 0x56 ], diff --git a/FlashGBX/config/fc_DMG_29DL163BD-90.txt b/FlashGBX/config/fc_DMG_29DL163BD-90.txt new file mode 100644 index 0000000..add6f96 --- /dev/null +++ b/FlashGBX/config/fc_DMG_29DL163BD-90.txt @@ -0,0 +1,75 @@ +{ + "type":"DMG", + "names":[ + "SD007_48BALL_64M_V5 with 29DL163BD-90", + "SD007_48BALL_64M_V6 with 29DL163BD-90" + ], + "flash_ids":[ + [ 0x04, 0x04, 0x2B, 0x2B ], + [ 0x04, 0x04, 0x2B, 0x2B ] + ], + "voltage":3.3, + "flash_size":0x200000, + "start_addr":0, + "first_bank":1, + "write_pin":"WR", + "sector_size":[ + [0x2000, 8], + [0x10000, 31] + ], + "chip_erase_timeout":120, + "commands":{ + "reset":[ + [ 0, 0xF0 ] + ], + "read_identifier":[ + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ 0xAAA, 0x90 ] + ], + "chip_erase":[ + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ 0xAAA, 0x80 ], + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ 0xAAA, 0x10 ] + ], + "chip_erase_wait_for":[ + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ 0, 0xFF, 0xFF ] + ], + "sector_erase":[ + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ 0xAAA, 0x80 ], + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ "SA", 0x30 ] + ], + "sector_erase_wait_for":[ + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ 0, 0xFF, 0xFF ] + ], + "single_write":[ + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ 0xAAA, 0xA0 ], + [ "PA", "PD" ] + ], + "single_write_wait_for":[ + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ] + ] + } +} diff --git a/FlashGBX/config/fc_DMG_29DL32TF-70.txt b/FlashGBX/config/fc_DMG_29DL32TF-70.txt index 5b6cdd7..23f444c 100644 --- a/FlashGBX/config/fc_DMG_29DL32TF-70.txt +++ b/FlashGBX/config/fc_DMG_29DL32TF-70.txt @@ -11,6 +11,11 @@ "start_addr":0, "first_bank":1, "write_pin":"WR", + "sector_size":[ + [0x2000, 8], + [0x10000, 31] + ], + "sector_reversal":true, "chip_erase_timeout":50, "commands":{ "reset":[ @@ -37,6 +42,22 @@ [ null, null, null ], [ 0, 0xFF, 0xFF ] ], + "sector_erase":[ + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ 0xAAA, 0x80 ], + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ "SA", 0x30 ] + ], + "sector_erase_wait_for":[ + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ "SA", 0xFF, 0xFF ] + ], "single_write":[ [ 0xAAA, 0xA9 ], [ 0x555, 0x56 ], diff --git a/FlashGBX/config/fc_DMG_36VF3204.txt b/FlashGBX/config/fc_DMG_36VF3204.txt index 6604abf..1447f0e 100644 --- a/FlashGBX/config/fc_DMG_36VF3204.txt +++ b/FlashGBX/config/fc_DMG_36VF3204.txt @@ -1,10 +1,16 @@ { "type":"DMG", "names":[ - "SD007_48BALL_64M_V5 with 36VF3204" + "SD007_48BALL_64M_V5 with 36VF3204", + "SD007_48BALL_64M_V6 with 36VF3204", + "SD007_TSOP_48BALL with 36VF3204", + "SD007_48BALL_64M_V5 with 36VF3203" ], "flash_ids":[ - [ 0xBF, 0x00, 0x53, 0x73 ] + [ 0xBF, 0x00, 0x53, 0x73 ], + [ 0xBF, 0x00, 0x53, 0x73 ], + [ 0xBF, 0x00, 0x53, 0x73 ], + [ 0xBF, 0x00, 0x54, 0x73 ] ], "voltage":3.3, "voltage_variants":true, diff --git a/FlashGBX/config/fc_DMG_AM29F016_AUDIO.txt b/FlashGBX/config/fc_DMG_AM29F016_AUDIO.txt index 1212349..0f15d7f 100644 --- a/FlashGBX/config/fc_DMG_AM29F016_AUDIO.txt +++ b/FlashGBX/config/fc_DMG_AM29F016_AUDIO.txt @@ -1,7 +1,7 @@ { "type":"DMG", "names":[ - "AM29F016/AM29F016B (DIY cart) @ AUDIO" + "DIY cart with AM29F016/AM29F016B @ AUDIO" ], "flash_ids":[ [ 0x01, 0xAD, 0x00, 0x00 ] diff --git a/FlashGBX/config/fc_DMG_AM29F016_WR.txt b/FlashGBX/config/fc_DMG_AM29F016_WR.txt index 7c5f6e5..9fc42c8 100644 --- a/FlashGBX/config/fc_DMG_AM29F016_WR.txt +++ b/FlashGBX/config/fc_DMG_AM29F016_WR.txt @@ -1,7 +1,7 @@ { "type":"DMG", "names":[ - "AM29F016/AM29F016B (DIY cart) @ WR" + "DIY cart with AM29F016/AM29F016B @ WR" ], "flash_ids":[ [ 0x01, 0xAD, 0x00, 0x00 ] diff --git a/FlashGBX/config/fc_DMG_AM29F032_AUDIO.txt b/FlashGBX/config/fc_DMG_AM29F032_AUDIO.txt index 03b8833..9033175 100644 --- a/FlashGBX/config/fc_DMG_AM29F032_AUDIO.txt +++ b/FlashGBX/config/fc_DMG_AM29F032_AUDIO.txt @@ -1,7 +1,7 @@ { "type":"DMG", "names":[ - "AM29F032/AM29F032B (DIY cart) @ AUDIO" + "DIY cart with AM29F032/AM29F032B @ AUDIO" ], "flash_ids":[ [ 0x04, 0xD4, 0x00, 0x00 ] diff --git a/FlashGBX/config/fc_DMG_AM29F032_WR.txt b/FlashGBX/config/fc_DMG_AM29F032_WR.txt index fa420d8..dd2c258 100644 --- a/FlashGBX/config/fc_DMG_AM29F032_WR.txt +++ b/FlashGBX/config/fc_DMG_AM29F032_WR.txt @@ -1,7 +1,7 @@ { "type":"DMG", "names":[ - "AM29F032/AM29F032B (DIY cart) @ WR" + "DIY cart with AM29F032/AM29F032B @ WR" ], "flash_ids":[ [ 0x04, 0xD4, 0x00, 0x00 ] diff --git a/FlashGBX/config/fc_DMG_AM29LV160MB.txt b/FlashGBX/config/fc_DMG_AM29LV160MB.txt index 0dc1436..1e07be1 100644 --- a/FlashGBX/config/fc_DMG_AM29LV160MB.txt +++ b/FlashGBX/config/fc_DMG_AM29LV160MB.txt @@ -1,10 +1,14 @@ { "type":"DMG", "names":[ - "SD007_BV5_V3 with AM29LV160MB" + "SD007_BV5_V3 with AM29LV160MB", + "SD007_TSOP_48BALL with L160DB12VI", + "SD007_TSOP_48BALL with AM29LV160DT" ], "flash_ids":[ - [ 0x02, 0x02, 0x4A, 0x4A ] + [ 0x02, 0x02, 0x4A, 0x4A ], + [ 0x02, 0x02, 0x4A, 0x4A ], + [ 0x02, 0x02, 0xC4, 0xC4 ] ], "voltage":5, "flash_size":0x200000, diff --git a/FlashGBX/config/fc_DMG_GL032M11BAIR4.txt b/FlashGBX/config/fc_DMG_GL032M11BAIR4.txt index bb124dd..116c55f 100644 --- a/FlashGBX/config/fc_DMG_GL032M11BAIR4.txt +++ b/FlashGBX/config/fc_DMG_GL032M11BAIR4.txt @@ -2,9 +2,11 @@ "type":"DMG", "names":[ "SD007_48BALL_64M with GL032M11BAIR4", - "S29GL032 (no PCB text)" + "SD007_48BALL_64M_V2 with GL032M11BAIR4", + "S29GL032N90T and ALTERA CPLD (no PCB text)" ], "flash_ids":[ + [ 0x02, 0x02, 0x7D, 0x7D ], [ 0x02, 0x02, 0x7D, 0x7D ], [ 0x02, 0x02, 0x7D, 0x7D ] ], @@ -13,23 +15,27 @@ "start_addr":0x4000, "first_bank":0, "write_pin":"WR", + "sector_size":[ + [0x2000, 8], + [0x10000, 63] + ], "chip_erase_timeout":60, "commands":{ "reset":[ - [ 0x7000, 0xF0 ] + [ 0x4000, 0xF0 ] ], "read_identifier":[ - [ 0x7AAA, 0xA9 ], - [ 0x7555, 0x56 ], - [ 0x7AAA, 0x90 ] + [ 0x4AAA, 0xA9 ], + [ 0x4555, 0x56 ], + [ 0x4AAA, 0x90 ] ], "chip_erase":[ - [ 0x7AAA, 0xA9 ], - [ 0x7555, 0x56 ], - [ 0x7AAA, 0x80 ], - [ 0x7AAA, 0xA9 ], - [ 0x7555, 0x56 ], - [ 0x7AAA, 0x10 ] + [ 0x4AAA, 0xA9 ], + [ 0x4555, 0x56 ], + [ 0x4AAA, 0x80 ], + [ 0x4AAA, 0xA9 ], + [ 0x4555, 0x56 ], + [ 0x4AAA, 0x10 ] ], "chip_erase_wait_for":[ [ null, null, null ], @@ -39,10 +45,26 @@ [ null, null, null ], [ 0, 0xFF, 0xFF ] ], + "sector_erase":[ + [ 0x4AAA, 0xA9 ], + [ 0x4555, 0x56 ], + [ 0x4AAA, 0x80 ], + [ 0x4AAA, 0xA9 ], + [ 0x4555, 0x56 ], + [ "SA", 0x30 ] + ], + "sector_erase_wait_for":[ + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ 0, 0xFF, 0xFF ] + ], "single_write":[ - [ 0x7AAA, 0xA9 ], - [ 0x7555, 0x56 ], - [ 0x7AAA, 0xA0 ], + [ 0x4AAA, 0xA9 ], + [ 0x4555, 0x56 ], + [ 0x4AAA, 0xA0 ], [ "PA", "PD" ] ], "single_write_wait_for":[ diff --git a/FlashGBX/config/fc_DMG_HY29LV160TT.txt b/FlashGBX/config/fc_DMG_HY29LV160TT.txt index 7da0494..988dbeb 100644 --- a/FlashGBX/config/fc_DMG_HY29LV160TT.txt +++ b/FlashGBX/config/fc_DMG_HY29LV160TT.txt @@ -1,10 +1,16 @@ { "type":"DMG", "names":[ - "SD007_BV5_V2 with HY29LV160TT" + "SD007_BV5_V2 with HY29LV160TT", + "SD007_BV5_V3 with HY29LV160BT", + "SD007_BV5_V3 with 29LV160BE-90PFTN", + "SD007_TSOP_48BALL with M29W160ET70ZA6" ], "flash_ids":[ - [ 0xAE, 0xAE, 0xC4, 0xC4 ] + [ 0xAE, 0xAE, 0xC4, 0xC4 ], + [ 0xAE, 0xAE, 0x4A, 0x4A ], + [ 0x04, 0x04, 0x4A, 0x4A ], + [ 0x20, 0x20, 0xC4, 0xC4 ] ], "voltage":3.3, "flash_size":0x200000, diff --git a/FlashGBX/config/fc_DMG_M29W160EB.txt b/FlashGBX/config/fc_DMG_M29W160EB.txt index 40be9d7..4b43a5d 100644 --- a/FlashGBX/config/fc_DMG_M29W160EB.txt +++ b/FlashGBX/config/fc_DMG_M29W160EB.txt @@ -11,6 +11,12 @@ "start_addr":0, "first_bank":1, "write_pin":"WR", + "sector_size":[ + [0x4000, 1], + [0x2000, 2], + [0x8000, 1], + [0x10000, 31] + ], "chip_erase_timeout":30, "commands":{ "reset":[ @@ -37,6 +43,22 @@ [ null, null, null ], [ 0, 0xFF, 0xFF ] ], + "sector_erase":[ + [ 0xAAA, 0xAA ], + [ 0x555, 0x55 ], + [ 0xAAA, 0x80 ], + [ 0xAAA, 0xAA ], + [ 0x555, 0x55 ], + [ "SA", 0x30 ] + ], + "sector_erase_wait_for":[ + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ "SA", 0xFF, 0xFF ] + ], "single_write":[ [ 0xAAA, 0xAA ], [ 0x555, 0x55 ], diff --git a/FlashGBX/config/fc_DMG_M29W640.txt b/FlashGBX/config/fc_DMG_M29W640.txt index 7cc8ef8..b05d343 100644 --- a/FlashGBX/config/fc_DMG_M29W640.txt +++ b/FlashGBX/config/fc_DMG_M29W640.txt @@ -11,6 +11,10 @@ "start_addr":0, "first_bank":1, "write_pin":"WR", + "sector_size":[ + [0x02000, 8], + [0x10000, 127] + ], "chip_erase_timeout":70, "commands":{ "reset":[ @@ -37,6 +41,22 @@ [ null, null, null ], [ 0, 0xFF, 0xFF ] ], + "sector_erase":[ + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ 0xAAA, 0x80 ], + [ 0xAAA, 0xA9 ], + [ 0x555, 0x56 ], + [ "SA", 0x30 ] + ], + "sector_erase_wait_for":[ + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ "SA", 0xFF, 0xFF ] + ], "single_write":[ [ 0xAAA, 0xA9 ], [ 0x555, 0x56 ], diff --git a/FlashGBX/config/fc_DMG_MX29LV320ABTC.txt b/FlashGBX/config/fc_DMG_MX29LV320ABTC.txt index 330b9e2..cddd06a 100644 --- a/FlashGBX/config/fc_DMG_MX29LV320ABTC.txt +++ b/FlashGBX/config/fc_DMG_MX29LV320ABTC.txt @@ -1,10 +1,12 @@ { "type":"DMG", "names":[ - "GB-M968 with MX29LV320ABTC" + "GB-M968 with MX29LV320ABTC", + "SD007_BV5_DRV with M29W320DT" ], "flash_ids":[ - [ 0xC2, 0xC2, 0xA8, 0xA8 ] + [ 0xC2, 0xC2, 0xA8, 0xA8 ], + [ 0x20, 0x20, 0xCA, 0xCA ] ], "voltage":3.3, "flash_size":0x400000, diff --git a/FlashGBX/hw_GBxCartRW.py b/FlashGBX/hw_GBxCartRW.py index 561e597..9dd5fa9 100644 --- a/FlashGBX/hw_GBxCartRW.py +++ b/FlashGBX/hw_GBxCartRW.py @@ -2,15 +2,16 @@ # UTF-8 import serial, os, serial.tools.list_ports from serial import SerialException -import sys, time, re, glob, math, struct, json, statistics, traceback, zlib, random +import sys, time, re, glob, math, struct, json, traceback, zlib, copy from .DataTransfer import * from .RomFileDMG import * from .RomFileAGB import * +from .Util import * class GbxDevice: DEVICE_NAME = "GBxCart RW" - DEVICE_MIN_FW = 17 - DEVICE_MAX_FW = 19 + DEVICE_MIN_FW = 19 + DEVICE_MAX_FW = 23 DEVICE_CMD = { "CART_MODE":'C', @@ -19,6 +20,7 @@ class GbxDevice: # GB/GBC defines/commands "SET_START_ADDRESS":'A', "READ_ROM_RAM":'R', + "READ_ROM_4000H":'Q', "WRITE_RAM":'W', "SET_BANK":'B', "GB_CART_MODE":'G', @@ -36,6 +38,7 @@ class GbxDevice: "FLASH_FOUND_ATMEL":3, "GBA_READ_ROM":'r', "GBA_READ_ROM_256BYTE":'j', + "GBA_READ_ROM_8000H":'Z', "GBA_READ_SRAM":'m', "GBA_WRITE_SRAM":'w', "GBA_WRITE_ONE_BYTE_SRAM":'o', @@ -70,6 +73,8 @@ class GbxDevice: "GBA_FLASH_WRITE_64BYTE_SWAPPED_D0D1":'q', "GBA_FLASH_WRITE_256BYTE_SWAPPED_D0D1":'t', "GBA_FLASH_WRITE_256BYTE":'f', + "GBA_FLASH_WRITE_BUFFERED_256BYTE":'c', + "GBA_FLASH_WRITE_BUFFERED_256BYTE_SWAPPED_D0D1":'d', "GBA_FLASH_WRITE_INTEL_64BYTE":'l', "GBA_FLASH_WRITE_INTEL_64BYTE_WORD":'u', "GBA_FLASH_WRITE_INTEL_INTERLEAVED_256BYTE":'v', @@ -86,6 +91,7 @@ class GbxDevice: "READ_PCB_VERSION":'h', "VOLTAGE_3_3V":'3', "VOLTAGE_5V":'5', + "SET_PINS_AS_INPUTS":':', "RESET_AVR":'*', "RESET_VALUE":0x7E5E1, "XMAS_LEDS":'#', @@ -93,10 +99,7 @@ class GbxDevice: "READ_BUFFER":0 } PCB_VERSIONS = {1:'v1.0', 2:'v1.1', 4:'v1.3', 90:'XMAS', 100:'Mini'} - SUPPORTED_CARTS = { - "DMG":{ "Generic ROM Cartridge":"RETAIL", "● Auto-Detect Flash Cartridge ●":"AUTODETECT" }, - "AGB":{ "Generic ROM Cartridge":"RETAIL", "● Auto-Detect Flash Cartridge ●":"AUTODETECT" } - } + SUPPORTED_CARTS = {} FW = [] MODE = None @@ -105,6 +108,9 @@ class GbxDevice: WORKER = None INFO = { "last_action":None } CANCEL = False + CANCEL_ARGS = {} + SIGNAL = None + POS = 0 def __init__(self): pass @@ -150,9 +156,7 @@ class GbxDevice: self.PORT = ports[i] # Load Flash Cartridge Handlers - for mode in flashcarts.keys(): - for key in sorted(flashcarts[mode].keys(), key=str.casefold): - self.SUPPORTED_CARTS[mode][key] = flashcarts[mode][key] + self.UpdateFlashCarts(flashcarts) # Stop after first found device break @@ -164,13 +168,27 @@ class GbxDevice: conn_msg.append([3, "A critical error occured while trying to access the GBxCart RW device on port " + ports[i] + ".\n\n" + str(e)]) continue - conn_msg.append([0, "NOTE: This is an unofficial tool for GBxCart RW. Visit https://www.gbxcart.com/ for officially supported options."]) + #conn_msg.append([0, "NOTE: This is a third party tool for GBxCart RW by insideGadgets. Visit https://www.gbxcart.com/ for more information."]) return conn_msg + def UpdateFlashCarts(self, flashcarts): + self.SUPPORTED_CARTS = { + "DMG":{ "Generic ROM Cartridge":"RETAIL", "● Auto-Detect Flash Cartridge ●":"AUTODETECT" }, + "AGB":{ "Generic ROM Cartridge":"RETAIL", "● Auto-Detect Flash Cartridge ●":"AUTODETECT" } + } + for mode in flashcarts.keys(): + for key in sorted(flashcarts[mode].keys(), key=str.casefold): + self.SUPPORTED_CARTS[mode][key] = flashcarts[mode][key] + def IsConnected(self): if self.DEVICE is None: return False if not self.DEVICE.isOpen(): return False try: + while self.DEVICE.in_waiting > 0: + print("Clearing input buffer... ({:d})".format(self.DEVICE.in_waiting)) + self.DEVICE.reset_input_buffer() + time.sleep(1) + self.DEVICE.reset_output_buffer() self.LoadFirmwareVersion() return True except SerialException as e: @@ -237,6 +255,11 @@ class GbxDevice: def GetSupportedCartridgesAGB(self): return (list(self.SUPPORTED_CARTS['AGB'].keys()), list(self.SUPPORTED_CARTS['AGB'].values())) + def SetProgress(self, args): + if self.CANCEL and args["action"] != "ABORT": return + if args["action"] == "UPDATE_POS": self.POS = args["pos"] + if self.SIGNAL: self.SIGNAL.emit(args) + def wait_for_ack(self): buffer = self.read(1) timeout = 5 @@ -250,7 +273,7 @@ class GbxDevice: return False else: print("Retrying...") - time.sleep(0.2) + time.sleep(0.5) buffer = self.read(1) return True @@ -262,12 +285,16 @@ class GbxDevice: if length <= 64: buffer = self.DEVICE.read(readlen) if len(buffer) != readlen: - print("read(): Failed to receive {:d} byte(s) from the device. Discarding {:d} byte(s).".format(readlen, len(buffer))) + dprint("read(): Received {:d} byte(s) instead of the expected {:d} bytes.".format(len(buffer), readlen)) self.write('0') - self.DEVICE.reset_input_buffer() + time.sleep(1) + while self.DEVICE.in_waiting > 0: + self.DEVICE.reset_input_buffer() + time.sleep(1) self.DEVICE.reset_output_buffer() return False + self.SetProgress({"action":"READ", "bytes_added":len(buffer)}) if length == 1: return buffer else: @@ -277,18 +304,42 @@ class GbxDevice: self.write('1') return buffer[:length] + elif length == 0x10000 or length == 0x4000: + mbuffer = bytearray() + for i in range(0, length, 64): + buffer = self.DEVICE.read(readlen) + if len(buffer) != readlen: + dprint("read(): Received {:d} byte(s) instead of the expected {:d} bytes during iteration {:d}.".format(len(buffer), readlen, i)) + self.write('0') + time.sleep(1) + while self.DEVICE.in_waiting > 0: + self.DEVICE.reset_input_buffer() + time.sleep(1) + self.DEVICE.reset_output_buffer() + return False + + mbuffer += buffer + self.SetProgress({"action":"READ", "bytes_added":len(buffer)}) + + self.write('0') + return mbuffer + else: # length > 64 mbuffer = bytearray() for i in range(0, length, 64): buffer = self.DEVICE.read(readlen) if len(buffer) != readlen: - print("read(): Failed to receive {:d} byte(s) from the device during iteration {:d}. Discarding {:d} byte(s).".format(readlen, i, len(buffer))) + dprint("read(): Received {:d} byte(s) instead of the expected {:d} bytes during iteration {:d}.".format(len(buffer), readlen, i)) self.write('0') - self.DEVICE.reset_input_buffer() + time.sleep(1) + while self.DEVICE.in_waiting > 0: + self.DEVICE.reset_input_buffer() + time.sleep(1) self.DEVICE.reset_output_buffer() return False mbuffer += buffer + self.SetProgress({"action":"READ", "bytes_added":len(buffer)}) if not (i + 64 >= length): self.write('1') @@ -302,33 +353,49 @@ class GbxDevice: data = bytearray(data, 'ascii') self.DEVICE.write(data) self.DEVICE.flush() - if wait_for_ack: return self.wait_for_ack() def ReadROM(self, offset, length, set_address=True): buffer = False - lives = 10 + lives = 5 + dprint("ReadROM(offset=0x{:X}, length=0x{:X}, set_address={:s})".format(offset, length, str(set_address))) while buffer == False: if self.MODE == "DMG": - if set_address: - self.set_number(offset, self.DEVICE_CMD['SET_START_ADDRESS']) - self.set_mode(self.DEVICE_CMD['READ_ROM_RAM']) + if length == 0x4000: + if set_address: + self.set_number(offset, self.DEVICE_CMD['SET_START_ADDRESS']) + self.set_mode(self.DEVICE_CMD['READ_ROM_4000H']) + else: + if set_address: + self.set_number(offset, self.DEVICE_CMD['SET_START_ADDRESS']) + self.set_mode(self.DEVICE_CMD['READ_ROM_RAM']) buffer = self.read(length, last=True) elif self.MODE == "AGB": - if set_address: - self.set_number(math.floor(offset / 2), self.DEVICE_CMD['SET_START_ADDRESS']) - self.set_mode(self.DEVICE_CMD['GBA_READ_ROM']) + if length == 0x10000: + if set_address: + self.set_number(math.floor(offset / 2), self.DEVICE_CMD['SET_START_ADDRESS']) + self.set_mode(self.DEVICE_CMD['GBA_READ_ROM_8000H']) + else: + if set_address: + self.set_number(math.floor(offset / 2), self.DEVICE_CMD['SET_START_ADDRESS']) + self.set_mode(self.DEVICE_CMD['GBA_READ_ROM']) buffer = self.read(length, last=True) if buffer == False: - lives -= 1 if lives == 0: self.CANCEL = True - print("\nCouldn’t recover from the error. Please try again from the beginning.") + self.CANCEL_ARGS = {"info_type":"msgbox_critical", "info_msg":"A critical error occured while trying to read the cartridge ROM. Please try again from the beginning."} + print(" Giving up.", flush=True) return False - print("\nStarting over segment at 0x{:06X}...".format(offset)) + elif lives != 5: + print("", flush=True) + print("Failed to receive data at 0x{:X}. Retrying...".format(self.POS), end="", flush=True) set_address = True + lives -= 1 + + if lives < 5: + print(" OK!", flush=True) return buffer @@ -350,8 +417,8 @@ class GbxDevice: time.sleep(0.001) ack = self.wait_for_ack() if ack == False: - print("Can’t continue. Please try again.") self.CANCEL = True + self.CANCEL_ARGS = {"info_type":"msgbox_critical", "info_msg":"A critical error occured while trying to write the ROM. Please try again from the beginning."} return False def gb_flash_write_address_byte(self, address, data): @@ -362,8 +429,8 @@ class GbxDevice: self.write(buffer) ack = self.wait_for_ack() if ack == False: - print("Can’t continue. Please try again.") self.CANCEL = True + self.CANCEL_ARGS = {"info_type":"msgbox_critical", "info_msg":"A critical error occured while trying to write a byte. Please try again from the beginning."} return False def gbx_flash_write_data_bytes(self, command, data): @@ -382,6 +449,7 @@ class GbxDevice: time.sleep(0.005) def set_mode(self, command): + dprint("set_mode(command={:s})".format(str(command))) buffer = format(command, 's') self.write(buffer) @@ -394,13 +462,12 @@ class GbxDevice: time.sleep(0.3) def EnableRAM(self, mbc=1, enable=True): - #self.ReadROM(0, 64) if enable: - if mbc <= 4: - self.set_bank(0x6000, 1) + if mbc <= 4: self.set_bank(0x6000, 1) self.set_bank(0x0000, 0x0A) else: self.set_bank(0x0000, 0x00) + if mbc <= 4: self.set_bank(0x6000, 0) time.sleep(0.2) def SetBankROM(self, bank, mbc=5): @@ -422,7 +489,7 @@ class GbxDevice: def SetBankRAM(self, bank): self.set_bank(0x4000, (bank & 0xFF)) - def ReadFlashSaveID(self): + def ReadFlashSaveMakerID(self): makers = { 0x1F:"ATMEL", 0xBF:"SST/SANYO", 0xC2:"MACRONIX", 0x32:"PANASONIC", 0x62:"SANYO" } self.set_mode(self.DEVICE_CMD['GBA_FLASH_READ_ID']) time.sleep(0.02) @@ -440,10 +507,11 @@ class GbxDevice: self.set_mode(self.DEVICE_CMD['VOLTAGE_3_3V']) self.MODE = "AGB" self.set_number(0, self.DEVICE_CMD['SET_START_ADDRESS']) - + def AutoDetectFlash(self, limitVoltage=False): flash_types = [] flash_type = 0 + flash_id = None if limitVoltage: self.set_mode(self.DEVICE_CMD['VOLTAGE_3_3V']) @@ -451,6 +519,9 @@ class GbxDevice: supported_carts = list(self.SUPPORTED_CARTS['DMG'].values()) for f in range(2, len(supported_carts)): flashcart_meta = supported_carts[f] + if flash_id is not None: + if flash_id not in flashcart_meta["flash_ids"]: + continue self.set_mode(self.DEVICE_CMD['GB_CART_MODE']) if "flash_commands_on_bank_1" in flashcart_meta: @@ -477,14 +548,17 @@ class GbxDevice: for i in range(0, len(flashcart_meta["commands"]["reset"])): self.gbx_flash_write_address_byte(flashcart_meta["commands"]["reset"][i][0], flashcart_meta["commands"]["reset"][i][1]) - # Read Identifier + # Read Flash ID / Electronic Signature if "read_identifier" in flashcart_meta["commands"]: for i in range(0, len(flashcart_meta["commands"]["read_identifier"])): self.gbx_flash_write_address_byte(flashcart_meta["commands"]["read_identifier"][i][0], flashcart_meta["commands"]["read_identifier"][i][1]) + buffer = self.ReadROM(0, 64) flash_id_found = False for i in range(0, len(flashcart_meta["flash_ids"])): - flash_id = list(self.ReadROM(0, 64)[0:len(flashcart_meta["flash_ids"][i])]) - if not len(flashcart_meta["flash_ids"][i]) == 0 and flash_id in flashcart_meta["flash_ids"]: flash_id_found = True + id = list(buffer[0:len(flashcart_meta["flash_ids"][i])]) + if id in flashcart_meta["flash_ids"]: + flash_id = id + flash_id_found = True if not flash_id_found and len(flashcart_meta["flash_ids"]) > 0: pass @@ -504,6 +578,9 @@ class GbxDevice: supported_carts = list(self.SUPPORTED_CARTS['AGB'].values()) for f in range(2, len(supported_carts)): flashcart_meta = supported_carts[f] + if flash_id is not None: + if flash_id not in flashcart_meta["flash_ids"]: + continue # Unlock Flash if "unlock" in flashcart_meta["commands"]: @@ -519,14 +596,17 @@ class GbxDevice: for i in range(0, len(flashcart_meta["commands"]["reset"])): self.gbx_flash_write_address_byte(flashcart_meta["commands"]["reset"][i][0], flashcart_meta["commands"]["reset"][i][1]) - # Read Identifier + # Read Flash ID / Electronic Signature if "read_identifier" in flashcart_meta["commands"]: for i in range(0, len(flashcart_meta["commands"]["read_identifier"])): self.gbx_flash_write_address_byte(flashcart_meta["commands"]["read_identifier"][i][0], flashcart_meta["commands"]["read_identifier"][i][1]) + buffer = self.ReadROM(0, 64) flash_id_found = False for i in range(0, len(flashcart_meta["flash_ids"])): - flash_id = list(self.ReadROM(0, 64)[0:len(flashcart_meta["flash_ids"][i])]) - if flash_id in flashcart_meta["flash_ids"]: flash_id_found = True + id = list(buffer[0:len(flashcart_meta["flash_ids"][i])]) + if id in flashcart_meta["flash_ids"]: + flash_id = id + flash_id_found = True if not flash_id_found and len(flashcart_meta["flash_ids"]) > 0: pass @@ -541,92 +621,155 @@ class GbxDevice: return flash_types - def CheckFlashID(self, limitVoltage=False): + def CheckFlashChip(self, limitVoltage=False, cart_type=None): if limitVoltage: self.set_mode(self.DEVICE_CMD['VOLTAGE_3_3V']) flash_id_lines = [] + flash_commands = [ + { 'read_cfi':[[0x555, 0x98]], 'read_identifier':[[ 0x555, 0xAA ], [ 0x2AA, 0x55 ], [ 0x555, 0x90 ]], 'reset':[[ 0x0, 0xF0 ]] }, + { 'read_cfi':[[0x5555, 0x98]], 'read_identifier':[[ 0x5555, 0xAA ], [ 0x2AAA, 0x55 ], [ 0x5555, 0x90 ]], 'reset':[[ 0x0, 0xF0 ]] }, + { 'read_cfi':[[0xAA, 0x98]], 'read_identifier':[[ 0xAAA, 0xAA ], [ 0x555, 0x55 ], [ 0xAAA, 0x90 ]], 'reset':[[ 0x0, 0xF0 ]] }, + { 'read_cfi':[[0xAAA, 0x98]], 'read_identifier':[[ 0xAAA, 0xAA ], [ 0x555, 0x55 ], [ 0xAAA, 0x90 ]], 'reset':[[ 0x0, 0xF0 ]] }, + { 'read_cfi':[[0xAAAA, 0x98]], 'read_identifier':[[ 0xAAAA, 0xAA ], [ 0x5555, 0x55 ], [ 0xAAAA, 0x90 ]], 'reset':[[ 0x0, 0xF0 ]] }, + { 'read_cfi':[[0x4555, 0x98]], 'read_identifier':[[ 0x4555, 0xAA ], [ 0x4AAA, 0x55 ], [ 0x4555, 0x90 ]], 'reset':[[ 0x4000, 0xF0 ]] }, + { 'read_cfi':[[0x7555, 0x98]], 'read_identifier':[[ 0x7555, 0xAA ], [ 0x7AAA, 0x55 ], [ 0x7555, 0x90 ]], 'reset':[[ 0x7000, 0xF0 ]] }, + { 'read_cfi':[[0x4AAA, 0x98]], 'read_identifier':[[ 0x4AAA, 0xAA ], [ 0x4555, 0x55 ], [ 0x4AAA, 0x90 ]], 'reset':[[ 0x4000, 0xF0 ]] }, + { 'read_cfi':[[0x7AAA, 0x98]], 'read_identifier':[[ 0x7AAA, 0xAA ], [ 0x7555, 0x55 ], [ 0x7AAA, 0x90 ]], 'reset':[[ 0x7000, 0xF0 ]] }, + { 'read_cfi':[[0, 0x98]], 'read_identifier':[[ 0, 0x90 ]], 'reset':[[ 0, 0xFF ]] }, + ] + + check_buffer = self.ReadROM(0, 0x200) + d_swap = None + cfi_info = "" + rom_string = "" + for j in range(0, 8): + rom_string += "{:02X} ".format(check_buffer[j]) + rom_string += "\n" + cfi = {'raw':b''} + if self.MODE == "DMG": - ret_rom = "[ ROM ] " - methods = [ - {'we':'WR', 'read_identifier':[[0x555, 0xAA], [0x2AA, 0x55], [0x555, 0x90]], 'reset':[[0, 0xF0]]}, - {'we':'WR', 'read_identifier':[[0x555, 0xA9], [0x2AA, 0x56], [0x555, 0x90]], 'reset':[[0, 0xF0]]}, - {'we':'WR', 'read_identifier':[[0xAAA, 0xAA], [0x555, 0x55], [0xAAA, 0x90]], 'reset':[[0, 0xF0]]}, - {'we':'WR', 'read_identifier':[[0xAAA, 0xA9], [0x555, 0x56], [0xAAA, 0x90]], 'reset':[[0, 0xF0]]}, - {'we':'WR', 'read_identifier':[[0xAA, 0x98]], 'reset':[[0, 0xF0]]}, - {'we':'WR', 'read_identifier':[[0x5555, 0xAA], [0x2AAA, 0x55], [0x5555, 0x90]], 'reset':[[0, 0xF0]]}, - {'we':'WR', 'read_identifier':[[0x5555, 0xA9], [0x2AAA, 0x56], [0x5555, 0x90]], 'reset':[[0, 0xF0]]}, - {'we':'WR', 'read_identifier':[[0x7AAA, 0xA9], [0x7555, 0x56], [0x7AAA, 0x90]], 'reset':[[0x7000, 0xF0]]}, - {'we':'AUDIO', 'read_identifier':[[0x555, 0xAA], [0x2AA, 0x55], [0x555, 0x90]], 'reset':[[0, 0xF0]]}, - {'we':'AUDIO', 'read_identifier':[[0x555, 0xA9], [0x2AA, 0x56], [0x555, 0x90]], 'reset':[[0, 0xF0]]}, - {'we':'AUDIO', 'read_identifier':[[0xAAA, 0xAA], [0x555, 0x55], [0xAAA, 0x90]], 'reset':[[0, 0xF0]]}, - {'we':'AUDIO', 'read_identifier':[[0xAAA, 0xA9], [0x555, 0x56], [0xAAA, 0x90]], 'reset':[[0, 0xF0]]}, - {'we':'AUDIO', 'read_identifier':[[0x5555, 0xAA], [0x2AAA, 0x55], [0x5555, 0x90]], 'reset':[[0, 0xF0]]}, - {'we':'AUDIO', 'read_identifier':[[0x5555, 0xA9], [0x2AAA, 0x56], [0x5555, 0x90]], 'reset':[[0, 0xF0]]}, - ] - - self.set_mode(self.DEVICE_CMD['GB_CART_MODE']) - if not limitVoltage: self.set_mode(self.DEVICE_CMD['VOLTAGE_5V']) - rom = self.ReadROM(0, 64)[0:8] - for i in range(0, len(methods)): - method = methods[i] - self.set_mode(self.DEVICE_CMD['GB_FLASH_WE_PIN']) - self.set_mode(self.DEVICE_CMD['WE_AS_' + method['we'] + '_PIN']) - for i in range(0, len(method['read_identifier'])): - self.gbx_flash_write_address_byte(method['read_identifier'][i][0], method["read_identifier"][i][1]) - flash_id = self.ReadROM(0, 64)[0:8] + rom_string = "[ ROM ] " + rom_string + we_pins = [ "WR", "AUDIO" ] + else: + rom_string = "[ ROM ] " + rom_string + we_pins = [ False ] + + for we in we_pins: + if "method" in cfi: break + for method in flash_commands: + if self.MODE == "DMG": + self.set_mode(self.DEVICE_CMD['GB_FLASH_WE_PIN']) + self.set_mode(self.DEVICE_CMD['WE_AS_' + we + '_PIN']) + for i in range(0, len(method['reset'])): self.gbx_flash_write_address_byte(method['reset'][i][0], method['reset'][i][1]) - if rom == flash_id: continue - - method_string = "[" + method['we'].ljust(5) + "/{:4X}/{:2X}]".format(method['read_identifier'][0][0], method['read_identifier'][0][1]) - flash_id_lines.append([method_string, flash_id]) - - elif self.MODE == "AGB": - ret_rom = "[ ROM ] " - methods = [ - {'read_identifier':[[0x555, 0xAA], [0x2AA, 0x55], [0x555, 0x90]], 'reset':[[0, 0xF0]]}, - {'read_identifier':[[0x555, 0xA9], [0x2AA, 0x56], [0x555, 0x90]], 'reset':[[0, 0xF0]]}, - {'read_identifier':[[0xAAA, 0xAA], [0x555, 0x55], [0xAAA, 0x90]], 'reset':[[0, 0xF0]]}, - {'read_identifier':[[0xAAA, 0xA9], [0x555, 0x56], [0xAAA, 0x90]], 'reset':[[0, 0xF0]]}, - {'read_identifier':[[0, 0x90]], 'reset':[[0, 0xFF]]}, - ] - - self.set_mode(self.DEVICE_CMD['GBA_CART_MODE']) - self.set_mode(self.DEVICE_CMD['VOLTAGE_3_3V']) - rom = self.ReadROM(0, 64)[0:8] - for i in range(0, len(methods)): - method = methods[i] - for i in range(0, len(method['read_identifier'])): - self.gbx_flash_write_address_byte(method['read_identifier'][i][0], method["read_identifier"][i][1]) - flash_id = self.ReadROM(0, 64)[0:8] + for i in range(0, len(method['read_cfi'])): + self.gbx_flash_write_address_byte(method['read_cfi'][i][0], method["read_cfi"][i][1]) + buffer = self.ReadROM(0, 0x400) for i in range(0, len(method['reset'])): self.gbx_flash_write_address_byte(method['reset'][i][0], method['reset'][i][1]) - if rom == flash_id: continue + if buffer == check_buffer: continue - method_string = "[{:6X}/{:2X}]".format(method['read_identifier'][0][0], method['read_identifier'][0][1]) - flash_id_lines.append([method_string, flash_id]) + magic = "{:s}{:s}{:s}".format(chr(buffer[0x20]), chr(buffer[0x22]), chr(buffer[0x24])) + if magic == "QRY": # nothing swapped + d_swap = ( 0, 0 ) + elif magic == "RQZ": # D0D1 swapped + d_swap = ( 0, 1 ) + if d_swap is not None: + for i in range(0, len(buffer)): + buffer[i] = bitswap(buffer[i], d_swap) + + cfi_parsed = ParseCFI(buffer) + dprint(cfi_parsed) + if cfi_parsed != False: + cfi = cfi_parsed + cfi["raw"] = buffer + #cfi["sha1"] = hashlib.sha1(buffer).hexdigest() + cfi["bytes"] = "" + for i in range(0, 0x400): + cfi["bytes"] += "{:02X}".format(buffer[i]) + if self.MODE == "DMG": cfi["we"] = we + cfi["method_id"] = flash_commands.index(method) + + if d_swap is not None: + for k, v in method.items(): + for c in range(0, len(method[k])): + if isinstance(method[k][c][1], int): + method[k][c][1] = bitswap(method[k][c][1], d_swap) + + # Flash ID + for i in range(0, len(method['read_identifier'])): + self.gbx_flash_write_address_byte(method['read_identifier'][i][0], method["read_identifier"][i][1]) + flash_id = self.ReadROM(0, 64)[0:8] + if self.MODE == "DMG": + method_string = "[" + we.ljust(5) + "/{:4X}/{:2X}]".format(method['read_identifier'][0][0], method['read_identifier'][0][1]) + else: + method_string = "[{:6X}/{:2X}]".format(method['read_identifier'][0][0], method['read_identifier'][0][1]) + line_exists = False + for i in range(0, len(flash_id_lines)): + if method_string == flash_id_lines[i][0]: line_exists = True + if not line_exists: flash_id_lines.append([method_string, flash_id]) + for i in range(0, len(method['reset'])): + self.gbx_flash_write_address_byte(method['reset'][i][0], method['reset'][i][1]) + + cfi["method"] = method + + if cart_type is not None: # reset cartridge if method is known + flashcart_meta = copy.deepcopy(cart_type) + if "reset" in flashcart_meta["commands"]: + for i in range(0, len(flashcart_meta["commands"]["reset"])): + self.gbx_flash_write_address_byte(flashcart_meta["commands"]["reset"][i][0], flashcart_meta["commands"]["reset"][i][1]) - ret = "" + if "method" in cfi: + s = "" + if d_swap is not None and d_swap != ( 0, 0 ): s += "Swapped pins: {:s}\n".format(str(d_swap)) + s += "Device size: 0x{:07X} ({:.2f} MB)\n".format(cfi["device_size"], cfi["device_size"] / 1024 / 1024) + s += "Voltage: {:.1f}–{:.1f} V\n".format(cfi["vdd_min"], cfi["vdd_max"]) + s += "Single write: {:s}\n".format(str(cfi["single_write"])) + if "buffer_size" in cfi: + s += "Buffered write: {:s} ({:d} Bytes)\n".format(str(cfi["buffer_write"]), cfi["buffer_size"]) + else: + s += "Buffered write: {:s}\n".format(str(cfi["buffer_write"])) + if cfi["chip_erase"]: s += "Chip erase: {:d}–{:d} ms\n".format(cfi["chip_erase_time_avg"], cfi["chip_erase_time_max"]) + if cfi["sector_erase"]: s += "Sector erase: {:d}–{:d} ms\n".format(cfi["sector_erase_time_avg"], cfi["sector_erase_time_max"]) + if cfi["tb_boot_sector"] is not False: s += "Top/Bottom flags: {:s}\n".format(str(cfi["tb_boot_sector"])) + pos = 0 + oversize = False + s = s[:-1] + for i in range(0, cfi['erase_sector_regions']): + esb = cfi['erase_sector_blocks'][i] + s += "\nRegion {:d}: 0x{:07X}–0x{:07X} @ 0x{:X} Bytes × {:d}".format(i+1, pos, pos+esb[2]-1, esb[0], esb[1]) + if oversize: s += " (alt)" + pos += esb[2] + if pos >= cfi['device_size']: + pos = 0 + oversize = True + #s += "\nSHA-1: {:s}".format(cfi["sha1"]) + cfi_info = s + + flash_id = "" for i in range(0, len(flash_id_lines)): - ret += flash_id_lines[i][0] + " " + flash_id += flash_id_lines[i][0] + " " for j in range(0, 8): - ret += "{:02X} ".format(flash_id_lines[i][1][j]) - ret += "\n" + flash_id += "{:02X} ".format(flash_id_lines[i][1][j]) + flash_id += "\n" - if ret != "": - for j in range(0, 8): - ret_rom += "{:02X} ".format(rom[j]) - ret_rom += "\n" - ret = ret_rom + ret + if flash_id != "": + flash_id = rom_string + flash_id - if limitVoltage and self.MODE == "DMG": - self.set_mode(self.DEVICE_CMD['VOLTAGE_5V']) - - return ret + return (flash_id, cfi_info, cfi["raw"]) + + def CheckROMStable(self): + self.ReadROM(0, 64) + buffer = self.ReadROM(0, 0x180) + time.sleep(0.1) + if buffer != self.ReadROM(0, 0x180): + return False + return True def ReadInfo(self): - if not self.IsConnected() and not self.Initialize(): raise Exception("Couldn’t access the the device.") + if not self.IsConnected(): raise Exception("Couldn’t access the the device.") data = {} header = self.ReadROM(0x000000, 0x000180) @@ -647,51 +790,70 @@ class GbxDevice: self.INFO["flash_type"] = 0 self.INFO["last_action"] = 0 + self.set_mode(self.DEVICE_CMD['SET_PINS_AS_INPUTS']) return data - - def BackupROM(self, fncSetProgress, path="ROM.gb", mbc=0x00, rom_banks=512, agb_rom_size=0): - config = { 'mode':1, 'port':self, 'path':path, 'mbc':mbc, 'rom_banks':rom_banks, 'agb_rom_size':agb_rom_size } - self.WORKER = DataTransfer(config) - self.WORKER.updateProgress.connect(fncSetProgress) - self.WORKER.start() - - def BackupRAM(self, fncSetProgress, path="ROM.sav", mbc=0x00, save_type=0): - config = { 'mode':2, 'port':self, 'path':path, 'mbc':mbc, 'save_type':save_type } - self.WORKER = DataTransfer(config) - self.WORKER.updateProgress.connect(fncSetProgress) - self.WORKER.start() - - def RestoreRAM(self, fncSetProgress, path="ROM.sav", mbc=0x00, save_type=0, erase=False): - config = { 'mode':3, 'port':self, 'path':path, 'mbc':mbc, 'save_type':save_type, 'erase':erase } - self.WORKER = DataTransfer(config) - self.WORKER.updateProgress.connect(fncSetProgress) - self.WORKER.start() - - def FlashROM(self, fncSetProgress, path="ROM.gb", cart_type=0, trim_rom=False, override_voltage=False): - config = { 'mode':4, 'port':self, 'path':path, 'cart_type':cart_type, 'trim_rom':trim_rom, 'override_voltage':override_voltage } - self.WORKER = DataTransfer(config) - self.WORKER.updateProgress.connect(fncSetProgress) + + def BackupROM(self, fncSetProgress=None, path="ROM.gb", mbc=0x00, rom_banks=512, agb_rom_size=0, start_addr=0, fast_read_mode=False): + config = { 'mode':1, 'port':self, 'path':path, 'mbc':mbc, 'rom_banks':rom_banks, 'agb_rom_size':agb_rom_size, 'start_addr':start_addr, 'fast_read_mode':fast_read_mode } + if self.WORKER is None: + self.WORKER = DataTransfer(config) + self.WORKER.updateProgress.connect(fncSetProgress) + else: + self.WORKER.setConfig(config) self.WORKER.start() - def _TransferData(self, mode, signal, args): # called by thread - if not self.IsConnected() and not self.Initialize(): raise Exception("Couldn’t access the the device.") - - path = args[0] + def BackupRAM(self, fncSetProgress=None, path="ROM.sav", mbc=0x00, save_type=0): + config = { 'mode':2, 'port':self, 'path':path, 'mbc':mbc, 'save_type':save_type } + if self.WORKER is None: + self.WORKER = DataTransfer(config) + self.WORKER.updateProgress.connect(fncSetProgress) + else: + self.WORKER.setConfig(config) + self.WORKER.start() + + def RestoreRAM(self, fncSetProgress=None, path="", mbc=0x00, save_type=0, erase=False): + config = { 'mode':3, 'port':self, 'path':path, 'mbc':mbc, 'save_type':save_type, 'erase':erase } + if self.WORKER is None: + self.WORKER = DataTransfer(config) + self.WORKER.updateProgress.connect(fncSetProgress) + else: + self.WORKER.setConfig(config) + self.WORKER.start() + + def FlashROM(self, fncSetProgress=None, path="", cart_type=0, override_voltage=False, buffer=bytearray(), start_addr=0, prefer_sector_erase=False, reverse_sectors=False): + config = { 'mode':4, 'port':self, 'path':path, 'cart_type':cart_type, 'override_voltage':override_voltage, 'start_addr':start_addr, 'buffer':buffer, 'prefer_sector_erase':prefer_sector_erase, 'reverse_sectors':reverse_sectors } + if self.WORKER is None: + self.WORKER = DataTransfer(config) + self.WORKER.updateProgress.connect(fncSetProgress) + else: + self.WORKER.setConfig(config) + self.WORKER.start() + + def _TransferData(self, args, signal): # called by thread + if not self.IsConnected(): raise Exception("Couldn’t access the the device.") + self.SIGNAL = signal + mode = args["mode"] if self.INFO == None: self.ReadInfo() + path = args["path"] self.INFO["last_path"] = path self.INFO["last_action"] = mode - measure_points = [] time_start = time.time() bank_size = 0x4000 # main work if mode == 1: # Backup ROM + fast_read_mode = args["fast_read_mode"] + buffer_len = 0x1000 if self.MODE == "DMG": - mbc = args[1] - bank_count = args[2] + mbc = args["mbc"] + bank_count = args["rom_banks"] + if fast_read_mode: + buffer_len = 0x4000 rom_size = bank_count * bank_size elif self.MODE == "AGB": - rom_size = args[3] + rom_size = args["agb_rom_size"] + if fast_read_mode: + buffer_len = 0x10000 if rom_size == 0: rom_size = 32 * 1024 * 1024 @@ -700,16 +862,11 @@ class GbxDevice: startAddr = 0 currAddr = 0 recvBytes = 0 - speed = 0 - time_left = 0 - - signal.emit(None, 0, rom_size, 0, 0, 0) - last_emit = time.time() try: file = open(path, "wb") except PermissionError as e: - signal.emit({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"FlashGBX doesn’t have permission to access this file for writing:\n" + path, "abortable":False}, 0, 0, 0, 0, 0) + self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"FlashGBX doesn’t have permission to access this file for writing:\n" + path, "abortable":False}) return False if self.MODE == "DMG": @@ -718,17 +875,29 @@ class GbxDevice: endAddr = rom_size bank_count = 1 + # Read a bit before actually dumping (fixes some bootlegs) + self.ReadROM(0, 64) + + self.SetProgress({"action":"INITIALIZE", "method":"ROM_READ", "size":rom_size}) + for bank in range(0, bank_count): if self.MODE == "DMG": if bank > 0: startAddr = bank_size endAddr = startAddr + bank_size self.SetBankROM(bank, mbc) + #self.SetProgress({"action":"UPDATE_SPEED", "abortable":False}) - buffer_len = 0x1000 # debug todo for currAddr in range(startAddr, endAddr, buffer_len): if self.CANCEL: - signal.emit({"action":"ABORT", "abortable":False}, 0, 0, 0, 0, 0) + cancel_args = {"action":"ABORT", "abortable":False} + cancel_args.update(self.CANCEL_ARGS) + self.CANCEL_ARGS = {} + self.SetProgress(cancel_args) + try: + file.close() + except: + pass return if currAddr == startAddr: @@ -737,37 +906,13 @@ class GbxDevice: buffer = self.ReadROM(currAddr, buffer_len, False) if buffer == False: - signal.emit({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"An I/O error occured. Please try again from the beginning.", "abortable":False}, 0, 0, 0, 0, 0) - return False + self.CANCEL = True + continue data_dump.extend(buffer) file.write(buffer) recvBytes += buffer_len - - # Report back to GUI - if recvBytes % buffer_len == 0: - now = time.time() - measure_points.append(now - last_emit) - last_emit = now - if len(measure_points) >= 16: - time_delta = statistics.mean(measure_points) - speed = buffer_len / time_delta - time_elapsed = time.time() - time_start - time_left = (time_elapsed / (recvBytes/rom_size)) - time_elapsed - if len(measure_points) >= 512: - measure_points = measure_points[-512:] - - if not recvBytes == rom_size: signal.emit(None, recvBytes, rom_size, speed/1024, time.time()-time_start, time_left) - - # check for flashgbx trimmed rom - if not os.path.splitext(path)[0].endswith("_notrimfix"): # debug - rom_size = len(data_dump) - trm_index = data_dump.find(b'TRIMFLASHGBX') - if trm_index != -1: - free_byte = data_dump[trm_index-4] - data_dump = data_dump[0:trm_index-4] + bytes([free_byte] * (rom_size - (trm_index-4))) - file.seek(0) - file.write(data_dump) + self.SetProgress({"action":"UPDATE_POS", "pos":recvBytes}) file.close() @@ -783,7 +928,7 @@ class GbxDevice: chk = zlib.crc32(data_dump) & 0xffffffff self.INFO["rom_checksum_calc"] = chk - signal.emit(None, recvBytes, rom_size, speed/1024, time.time()-time_start, time_left) + self.SetProgress({"action":"FINISHED"}) ######################################### @@ -795,8 +940,8 @@ class GbxDevice: startAddr = 0 if self.MODE == "DMG": bank_size = 0x2000 - mbc = args[1] - save_size = args[2] + mbc = args["mbc"] + save_size = args["save_type"] bank_count = int(max(save_size, bank_size) / bank_size) self.EnableRAM(mbc=mbc, enable=True) transfer_size = 64 @@ -804,7 +949,7 @@ class GbxDevice: elif self.MODE == "AGB": bank_size = 0x10000 - save_type = args[2] + save_type = args["save_type"] bank_count = 1 transfer_size = 64 eeprom_size = 0 @@ -831,10 +976,15 @@ class GbxDevice: save_size = 64 * 1024 read_command = 'GBA_READ_SRAM' write_command = 'GBA_WRITE_SRAM' - elif save_type == 5: # FLASH 64 KB + elif save_type == 5: # SRAM 128 KB + save_size = 128 * 1024 + read_command = 'GBA_READ_SRAM' + write_command = 'GBA_WRITE_SRAM' + bank_count = 2 + elif save_type == 6: # FLASH 64 KB save_size = 64 * 1024 read_command = 'GBA_READ_SRAM' - elif save_type == 6: # FLASH 128 KB + elif save_type == 7: # FLASH 128 KB save_size = 128 * 1024 read_command = 'GBA_READ_SRAM' bank_count = 2 @@ -842,11 +992,11 @@ class GbxDevice: return # Get Save Flash Manufacturer - flash_id = None - if save_type == 5 or save_type == 6: - flash_id = self.ReadFlashSaveID() - if flash_id == "ATMEL": - print("NOTE: For save data this cartridge uses an ATMEL chip which is untested.") + maker_id = None + if save_type == 6 or save_type == 7: + maker_id = self.ReadFlashSaveMakerID() + if maker_id == "ATMEL": + print("NOTE: For save data, this cartridge uses an ATMEL chip which is untested.") transfer_size = 128 # Prepare some stuff @@ -854,36 +1004,37 @@ class GbxDevice: try: file = open(path, "wb") except PermissionError as e: - signal.emit({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"FlashGBX doesn’t have permission to access this file for writing:\n" + path, "abortable":False}, 0, 0, 0, 0, 0) + self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"FlashGBX doesn’t have permission to access this file for writing:\n" + path, "abortable":False}) return False + self.SetProgress({"action":"INITIALIZE", "method":"SAVE_READ", "size":save_size}) elif mode == 3: # Restore - if args[3]: # Erase + if args["erase"]: # Erase data_import = save_size * b'\xFF' else: with open(path, "rb") as file: data_import = file.read() if save_size > len(data_import): data_import += b'\xFF' * (save_size - len(data_import)) + self.SetProgress({"action":"INITIALIZE", "method":"SAVE_WRITE", "size":save_size}) currAddr = 0 pos = 0 - speed = 0 - time_left = 0 - signal.emit(None, 0, save_size, 0, 0, 0) for bank in range(0, bank_count): if self.MODE == "DMG": endAddr = startAddr + bank_size if endAddr > (startAddr + save_size): endAddr = startAddr + save_size self.SetBankRAM(bank) - + elif self.MODE == "AGB": endAddr = startAddr + min(save_size, bank_size) if endAddr > (startAddr + save_size): endAddr = startAddr + save_size if save_type == 1 or save_type == 2: # EEPROM self.set_number(eeprom_size, self.DEVICE_CMD['GBA_SET_EEPROM_SIZE']) - elif (save_type == 5 or save_type == 6) and bank > 0: # FLASH + elif (save_type == 5) and bank > 0: # 1M SRAM + self.gbx_flash_write_address_byte(0x1000000, bank) + elif (save_type == 6 or save_type == 7) and bank > 0: # FLASH self.set_number(bank, self.DEVICE_CMD['GBA_FLASH_SET_BANK']) self.set_number(startAddr, self.DEVICE_CMD['SET_START_ADDRESS']) @@ -898,7 +1049,10 @@ class GbxDevice: if bank > 0: self.set_number(0, self.DEVICE_CMD['GBA_FLASH_SET_BANK']) self.set_mode(self.DEVICE_CMD['READ_ROM_RAM']) self.ReadInfo() - signal.emit({"action":"ABORT", "abortable":False}, 0, 0, 0, 0, 0) + cancel_args = {"action":"ABORT", "abortable":False} + cancel_args.update(self.CANCEL_ARGS) + self.CANCEL_ARGS = {} + self.SetProgress(cancel_args) return if mode == 2: # Backup @@ -912,7 +1066,7 @@ class GbxDevice: self.set_mode(self.DEVICE_CMD[read_command]) buffer = self.read(buffer_len, last) if buffer == False: - signal.emit({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"Backup failed, please try again.", "abortable":False}, 0, 0, 0, 0, 0) + self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"Backup failed, please try again.", "abortable":False}) return False data_dump.extend(buffer) @@ -924,20 +1078,25 @@ class GbxDevice: self.gbx_flash_write_data_bytes("WRITE_RAM", data) elif self.MODE == "AGB": - if save_type == 5 or save_type == 6: # FLASH - if flash_id == "ATMEL": + if save_type == 6 or save_type == 7: # FLASH + if maker_id == "ATMEL": self.gbx_flash_write_data_bytes("GBA_FLASH_WRITE_ATMEL", data) else: if (currAddr % 4096 == 0): self.set_number(sector, self.DEVICE_CMD['GBA_FLASH_4K_SECTOR_ERASE']) self.wait_for_ack() sector += 1 + lives = 50 while True: # wait for 0xFF (= erase done) self.set_number(currAddr, self.DEVICE_CMD['SET_START_ADDRESS']) self.set_mode(self.DEVICE_CMD[read_command]) buffer = self.read(buffer_len, last=True) if buffer[0] == 0xFF: break time.sleep(0.01) + lives -= 1 + if lives == 0: + self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"Writing the flash save data failed. Please make sure you selected the correct save type.", "abortable":False}) + return False self.set_number(currAddr, self.DEVICE_CMD['SET_START_ADDRESS']) self.gbx_flash_write_data_bytes("GBA_FLASH_WRITE_BYTE", data) @@ -945,125 +1104,146 @@ class GbxDevice: else: # EEPROM / SRAM self.gbx_flash_write_data_bytes(write_command, data) + self.SetProgress({"action":"WRITE", "bytes_added":len(data)}) self.wait_for_ack() pos += buffer_len + self.SetProgress({"action":"UPDATE_POS", "pos":pos}) - if not pos == save_size: signal.emit(None, pos, save_size, speed/1024, time.time()-time_start, 0) + #if not pos == save_size: signal.emit(None, pos, save_size, speed/1024, time.time()-time_start, 0) self.INFO["transfered"] = pos if self.MODE == "DMG": self.EnableRAM(mbc=mbc, enable=False) elif self.MODE == "AGB": - if bank > 0: self.set_number(0, self.DEVICE_CMD['GBA_FLASH_SET_BANK']) + if bank > 0: + if (save_type == 5) and bank > 0: # 1M SRAM + self.gbx_flash_write_address_byte(0x1000000, 0) + elif (save_type == 6 or save_type == 7) and bank > 0: # FLASH + self.set_number(0, self.DEVICE_CMD['GBA_FLASH_SET_BANK']) if mode == 2: file.close() self.INFO["last_action"] = mode - signal.emit(None, pos, pos, speed/1024, time.time()-time_start, 0) + self.SetProgress({"action":"FINISHED"}) ######################################### elif mode == 4: # Flash ROM - with open(path, "rb") as file: data_import = file.read() - - if len(data_import) < 0x8000: # smallest flashable ROM is 32 KB - data_import += b'\xFF' * (0x8000 - len(data_import)) - - if args[2]: # trim_rom - free_byte = data_import[len(data_import)-1] - if free_byte == 0xFF: # or free_byte == 0x00: - marker = bytes([free_byte] * 4) + b'TRIMFLASHGBX' # a trim marker, so dumps will still be valid - for i in range(len(data_import)-1, -1, -1): - if data_import[i] != free_byte: break - rom_size_trimmed = i - rom_size_trimmed += len(marker) - rom_size_trimmed = 0x1000 * (math.ceil(rom_size_trimmed / 0x1000)) - if rom_size_trimmed < len(data_import): - data_import = data_import[0:rom_size_trimmed-len(marker)] + marker - if self.MODE == "DMG": supported_carts = list(self.SUPPORTED_CARTS['DMG'].values()) elif self.MODE == "AGB": supported_carts = list(self.SUPPORTED_CARTS['AGB'].values()) + + if not isinstance(args["cart_type"], dict): + cart_type = "RETAIL" + for i in range(0, len(supported_carts)): + if i == args["cart_type"]: cart_type = supported_carts[i] + if cart_type == "RETAIL" or cart_type == "AUTODETECT": return False # Generic ROM Cartridge is not flashable + else: + cart_type = args["cart_type"] + + if path != "": + with open(path, "rb") as file: data_import = file.read() + else: + data_import = args["buffer"] + self._FlashROM(buffer=data_import, cart_type=cart_type, voltage=args["override_voltage"], start_addr=args["start_addr"], signal=signal, prefer_sector_erase=args["prefer_sector_erase"], reverse_sectors=args["reverse_sectors"]) + + # Reset pins to avoid save data loss + self.set_mode(self.DEVICE_CMD['SET_PINS_AS_INPUTS']) + + ####################################################################################################################################### + + def _FlashROM(self, buffer=bytearray(), start_addr=0, cart_type=None, voltage=3.3, signal=None, prefer_sector_erase=False, reverse_sectors=False): + if not self.IsConnected(): raise Exception("Couldn’t access the the device.") + if self.INFO == None: self.ReadInfo() + self.INFO["last_action"] = 4 + bank_size = 0x4000 + time_start = time.time() + + data_import = copy.copy(buffer) + if start_addr > 0: + data_import = (b'\xFF' * start_addr) + data_import + + if self.MODE == "DMG": + supported_carts = list(self.SUPPORTED_CARTS['DMG'].values()) + elif self.MODE == "AGB": + supported_carts = list(self.SUPPORTED_CARTS['AGB'].values()) - cart_type = "RETAIL" - for i in range(0, len(supported_carts)): - if i == args[1]: cart_type = supported_carts[i] - if cart_type == "RETAIL" or cart_type == "AUTODETECT": return False # Generic ROM Cartridge is not flashable + if cart_type == "RETAIL" or cart_type == "AUTODETECT": return False # Generic ROM Cartridge is not flashable + flashcart_meta = copy.deepcopy(cart_type) + + # Reverse sectors if requested + if reverse_sectors: flashcart_meta['sector_size'].reverse() + + # Firmware check R23+ + if (int(self.FW[0]) < 23) and self.MODE == "AGB" and "buffer_write" in flashcart_meta["commands"] and flashcart_meta["commands"]["buffer_write"] == [[0xAAA, 0xA9], [0x555, 0x56], ['SA', 0x26], ['SA', 'BS'], ['PA', 'PD'], ['SA', 0x2A]]: + print("NOTE: Update your GBxCart RW firmware to version R23 or higher for a better transfer rate with this cartridge.") + del flashcart_meta["commands"]["buffer_write"] + # Firmware check R23+ + + # Set Voltage + if voltage == 3.3: + self.set_mode(self.DEVICE_CMD['VOLTAGE_3_3V']) + elif voltage == 5: + self.set_mode(self.DEVICE_CMD['VOLTAGE_5V']) + elif flashcart_meta["voltage"] == 3.3: + self.set_mode(self.DEVICE_CMD['VOLTAGE_3_3V']) + elif flashcart_meta["voltage"] == 5: + self.set_mode(self.DEVICE_CMD['VOLTAGE_5V']) + + if self.MODE == "DMG": + self.set_mode(self.DEVICE_CMD['GB_CART_MODE']) + if "flash_commands_on_bank_1" in flashcart_meta and flashcart_meta["flash_commands_on_bank_1"]: + self.set_mode(self.DEVICE_CMD['GB_FLASH_BANK_1_COMMAND_WRITES']) + dprint("Setting GB_FLASH_BANK_1_COMMAND_WRITES...") - flashcart_meta = cart_type.copy() - - signal.emit(None, 0, len(data_import), 0, 0, 0) - time_start = time.time() - speed = 0 - time_left = 0 - - # Set Voltage - if args[3] == 3.3: - self.set_mode(self.DEVICE_CMD['VOLTAGE_3_3V']) - elif args[3] == 5: - self.set_mode(self.DEVICE_CMD['VOLTAGE_5V']) - elif flashcart_meta["voltage"] == 3.3: - self.set_mode(self.DEVICE_CMD['VOLTAGE_3_3V']) - elif flashcart_meta["voltage"] == 5: - self.set_mode(self.DEVICE_CMD['VOLTAGE_5V']) - - if self.MODE == "DMG": - self.set_mode(self.DEVICE_CMD['GB_CART_MODE']) - if "flash_commands_on_bank_1" in flashcart_meta: - self.set_mode(self.DEVICE_CMD['GB_FLASH_BANK_1_COMMAND_WRITES']) - - self.set_mode(self.DEVICE_CMD['GB_FLASH_WE_PIN']) - if flashcart_meta["write_pin"] == "WR": - self.set_mode(self.DEVICE_CMD['WE_AS_WR_PIN']) - elif flashcart_meta["write_pin"] in ("AUDIO", "VIN"): - self.set_mode(self.DEVICE_CMD['WE_AS_AUDIO_PIN']) + self.set_mode(self.DEVICE_CMD['GB_FLASH_WE_PIN']) + if flashcart_meta["write_pin"] == "WR": + self.set_mode(self.DEVICE_CMD['WE_AS_WR_PIN']) + dprint("Setting WE_AS_WR_PIN...") + elif flashcart_meta["write_pin"] in ("AUDIO", "VIN"): + self.set_mode(self.DEVICE_CMD['WE_AS_AUDIO_PIN']) + dprint("Setting WE_AS_AUDIO_PIN...") - if "single_write" in flashcart_meta["commands"] and len(flashcart_meta["commands"]["single_write"]) == 4: - # Submit flash program commands to firmware - self.set_mode(self.DEVICE_CMD['GB_FLASH_PROGRAM_METHOD']) - for i in range(0, 3): - self.write(bytearray(format(flashcart_meta["commands"]["single_write"][i][0], "x"), "ascii") + b'\x00', True) - self.write(bytearray(format(flashcart_meta["commands"]["single_write"][i][1], "x"), "ascii") + b'\x00', True) - - elif self.MODE == "AGB": - # Read a bit of ROM before starting - self.ReadROM(0, 64) - - # Unlock Flash - if "unlock" in flashcart_meta["commands"]: - for i in range(0, len(flashcart_meta["commands"]["unlock"])): - addr = flashcart_meta["commands"]["unlock"][i][0] - data = flashcart_meta["commands"]["unlock"][i][1] - count = flashcart_meta["commands"]["unlock"][i][2] - for j in range(0, count): - self.gbx_flash_write_address_byte(addr, data) - - # Reset Flash - if "reset" in flashcart_meta["commands"]: - for i in range(0, len(flashcart_meta["commands"]["reset"])): - self.gbx_flash_write_address_byte(flashcart_meta["commands"]["reset"][i][0], flashcart_meta["commands"]["reset"][i][1]) - - # Read Identifier - if "read_identifier" in flashcart_meta["commands"]: - for i in range(0, len(flashcart_meta["commands"]["read_identifier"])): - self.gbx_flash_write_address_byte(flashcart_meta["commands"]["read_identifier"][i][0], flashcart_meta["commands"]["read_identifier"][i][1]) - flash_id_found = False - for i in range(0, len(flashcart_meta["flash_ids"])): - flash_id = list(self.ReadROM(0, 64)[0:len(flashcart_meta["flash_ids"][i])]) - if flash_id in flashcart_meta["flash_ids"]: flash_id_found = True - if not flash_id_found and len(flashcart_meta["flash_ids"]) > 0: - pass - - # Reset Flash - if "reset" in flashcart_meta["commands"]: - for i in range(0, len(flashcart_meta["commands"]["reset"])): - self.gbx_flash_write_address_byte(flashcart_meta["commands"]["reset"][i][0], flashcart_meta["commands"]["reset"][i][1]) - - # Chip Erase - if "chip_erase" in flashcart_meta["commands"] and "sector_erase" not in flashcart_meta["commands"]: - signal.emit({"action":"ERASE", "abortable":False}, 1, 0, 0, time.time()-time_start, 0) + if "single_write" in flashcart_meta["commands"] and len(flashcart_meta["commands"]["single_write"]) == 4: + # Submit flash program commands to firmware + dprint("Setting GB_FLASH_PROGRAM_METHOD...") + self.set_mode(self.DEVICE_CMD['GB_FLASH_PROGRAM_METHOD']) + for i in range(0, 3): + dprint("single_write_command(",i,"):", hex(flashcart_meta["commands"]["single_write"][i][0]), "=", hex(flashcart_meta["commands"]["single_write"][i][1])) + self.write(bytearray(format(flashcart_meta["commands"]["single_write"][i][0], "x"), "ascii") + b'\x00', True) + self.write(bytearray(format(flashcart_meta["commands"]["single_write"][i][1], "x"), "ascii") + b'\x00', True) + + elif self.MODE == "AGB": + # Read a bit of ROM before starting + self.ReadROM(0, 64) + + # Unlock Flash + if "unlock" in flashcart_meta["commands"]: + for i in range(0, len(flashcart_meta["commands"]["unlock"])): + addr = flashcart_meta["commands"]["unlock"][i][0] + data = flashcart_meta["commands"]["unlock"][i][1] + count = flashcart_meta["commands"]["unlock"][i][2] + for j in range(0, count): + self.gbx_flash_write_address_byte(addr, data) + + # Reset Flash + if "reset" in flashcart_meta["commands"]: + for i in range(0, len(flashcart_meta["commands"]["reset"])): + self.gbx_flash_write_address_byte(flashcart_meta["commands"]["reset"][i][0], flashcart_meta["commands"]["reset"][i][1]) + + # Chip Erase + chip_erase = False + if "chip_erase" in flashcart_meta["commands"]: + if "sector_erase" in flashcart_meta["commands"] and prefer_sector_erase is True: + chip_erase = False + elif "chip_erase_treshold" in flashcart_meta: + if len(data_import) > flashcart_meta["chip_erase_treshold"] or "sector_erase" not in flashcart_meta["commands"]: + chip_erase = True + else: + chip_erase = True + self.SetProgress({"action":"ERASE", "time_start":time_start, "abortable":False}) for i in range(0, len(flashcart_meta["commands"]["chip_erase"])): addr = flashcart_meta["commands"]["chip_erase"][i][0] data = flashcart_meta["commands"]["chip_erase"][i][1] @@ -1074,8 +1254,8 @@ class GbxDevice: data = flashcart_meta["commands"]["chip_erase_wait_for"][i][1] timeout = flashcart_meta["chip_erase_timeout"] while True: - signal.emit({"action":"ERASE", "abortable":False}, 1, 0, 0, time.time()-time_start, 0) - if "wait_read_status_register" in flashcart_meta and flashcart_meta["wait_read_status_register"] == True: + self.SetProgress({"action":"ERASE", "time_start":time_start, "abortable":False}) + if "wait_read_status_register" in flashcart_meta and flashcart_meta["wait_read_status_register"]: for j in range(0, len(flashcart_meta["commands"]["read_status_register"])): sr_addr = flashcart_meta["commands"]["read_status_register"][j][0] sr_data = flashcart_meta["commands"]["read_status_register"][j][1] @@ -1083,241 +1263,327 @@ class GbxDevice: wait_for = self.ReadROM(addr, 64) wait_for = ((wait_for[1] << 8 | wait_for[0]) & flashcart_meta["commands"]["chip_erase_wait_for"][i][2]) if wait_for == data: break - time.sleep(1) - timeout -= 1 - if timeout < 1: - signal.emit({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"Erasing the flash chip timed out. Please make sure the correct flash cartridge type is selected.", "abortable":False}, 0, 0, 0, 0, 0) + time.sleep(0.5) + timeout -= 0.5 + if timeout <= 0: + self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"Erasing the flash chip timed out. Please make sure the correct flash cartridge type is selected.", "abortable":False}) return False - - # Reset Flash - if "reset" in flashcart_meta["commands"]: - for i in range(0, len(flashcart_meta["commands"]["reset"])): - self.gbx_flash_write_address_byte(flashcart_meta["commands"]["reset"][i][0], flashcart_meta["commands"]["reset"][i][1]) - self.set_number(0, self.DEVICE_CMD['SET_START_ADDRESS']) + # Reset Flash + if "reset" in flashcart_meta["commands"]: + for i in range(0, len(flashcart_meta["commands"]["reset"])): + self.gbx_flash_write_address_byte(flashcart_meta["commands"]["reset"][i][0], flashcart_meta["commands"]["reset"][i][1]) - # Write Flash - pos = 0 + dprint("Chip erase took {:d} seconds".format(math.ceil(time.time() - time_start))) + + self.set_number(0, self.DEVICE_CMD['SET_START_ADDRESS']) + + # Write Flash + pos = 0 + currAddr = 0 + skipping = False # skips if block is full of 0xFF + if self.MODE == "DMG": + if "first_bank" in flashcart_meta: first_bank = flashcart_meta["first_bank"] + if "start_addr" in flashcart_meta: currAddr = flashcart_meta["start_addr"] + endAddr = 0x7FFF + bank_count = math.ceil(len(data_import) / bank_size) + if start_addr == 0: self.SetBankROM(0) + elif self.MODE == "AGB": currAddr = 0 - if self.MODE == "DMG": - if "first_bank" in flashcart_meta: first_bank = flashcart_meta["first_bank"] - if "start_addr" in flashcart_meta: currAddr = flashcart_meta["start_addr"] - endAddr = 0x7FFF - bank_count = math.ceil(len(data_import) / bank_size) - self.SetBankROM(0) - elif self.MODE == "AGB": - currAddr = 0 - endAddr = len(data_import) - first_bank = 0 - bank_count = 1 - - time_start = time.time() - last_emit = time.time() - - sectCount = None - currSect = 0 + endAddr = len(data_import) + first_bank = 0 + bank_count = 1 + + self.SetProgress({"action":"INITIALIZE", "time_start":time_start, "method":"ROM_WRITE", "size":len(data_import)}) + + currSect = 0 + + # Fast Forward + if start_addr > 0: + first_bank = math.floor(start_addr / bank_size) + self.SetBankROM(first_bank) + offset = start_addr % bank_size + currAddr = bank_size + offset if "sector_erase" in flashcart_meta["commands"]: - if isinstance(flashcart_meta["sector_size"], list): - sector_size = flashcart_meta["sector_size"][currSect][0] - else: - sector_size = flashcart_meta["sector_size"] + while pos < start_addr: + dprint("* currSect:",currSect) + dprint("sector_size:", hex(flashcart_meta["sector_size"][currSect][0])) + dprint("start_addr:",hex(start_addr),", pos:",hex(pos)) + pos += flashcart_meta["sector_size"][currSect][0] + flashcart_meta["sector_size"][currSect][1] -= 1 + if flashcart_meta["sector_size"][currSect][1] == 0: + currSect += 1 + dprint("currSect:", currSect, end=", ") + dprint(flashcart_meta["sector_size"]) + dprint(flashcart_meta["sector_size"][currSect][1]) + + sector_count = None + if "sector_erase" in flashcart_meta["commands"]: + if isinstance(flashcart_meta["sector_size"], list): + sector_size = flashcart_meta["sector_size"][currSect][0] + else: + sector_size = flashcart_meta["sector_size"] + dprint("sector_size:", sector_size) + + dprint("start_addr:", hex(start_addr)) + dprint("first_bank:", first_bank, ", bank_count:", bank_count) + dprint("currAddr:", hex(currAddr), ", endAddr:", hex(endAddr)) + dprint("pos:", hex(pos)) + + if first_bank == bank_count: first_bank -= 1 # dirty hack so that <32 KB works too + for bank in range(first_bank, bank_count): + dprint("BANK {:d}".format(bank)) + if self.MODE == "DMG": + if bank > first_bank: currAddr = bank_size + self.set_number(currAddr, self.DEVICE_CMD['SET_START_ADDRESS']) - for bank in range(first_bank, bank_count): - if self.MODE == "DMG": - if bank > first_bank: currAddr = bank_size - self.set_number(currAddr, self.DEVICE_CMD['SET_START_ADDRESS']) + while (currAddr < endAddr): + if pos >= len(data_import): break + if self.CANCEL: + # Reset Flash + if "reset" in flashcart_meta["commands"]: + for i in range(0, len(flashcart_meta["commands"]["reset"])): + self.gbx_flash_write_address_byte(flashcart_meta["commands"]["reset"][i][0], flashcart_meta["commands"]["reset"][i][1]) + cancel_args = {"action":"ABORT", "abortable":False} + cancel_args.update(self.CANCEL_ARGS) + self.CANCEL_ARGS = {} + self.SetProgress(cancel_args) + return - while (currAddr < endAddr): - if pos == len(data_import): break - if self.CANCEL: + if self.MODE == "DMG": + # Change Bank + if (currAddr == bank_size): # Reset Flash if "reset" in flashcart_meta["commands"]: for i in range(0, len(flashcart_meta["commands"]["reset"])): self.gbx_flash_write_address_byte(flashcart_meta["commands"]["reset"][i][0], flashcart_meta["commands"]["reset"][i][1]) - signal.emit({"action":"ABORT", "abortable":False}, 0, 0, 0, 0, 0) - return + self.SetBankROM(bank) + time.sleep(0.05) + #self.SetProgress({"action":"UPDATE_SPEED", "abortable":False}) + + # Sector Erase (if supported) + if "sector_erase" in flashcart_meta["commands"] and not chip_erase: + if isinstance(flashcart_meta["sector_size"], list): + if sector_count == None: + sector_count = flashcart_meta["sector_size"][currSect][1] + if sector_count == 0: + if ((currSect+1) != len(flashcart_meta["sector_size"])): + currSect += 1 + sector_count = flashcart_meta["sector_size"][currSect][1] - if self.MODE == "DMG": - # Change Bank - if (currAddr == bank_size): - # Reset Flash - if "reset" in flashcart_meta["commands"]: - for i in range(0, len(flashcart_meta["commands"]["reset"])): - self.gbx_flash_write_address_byte(flashcart_meta["commands"]["reset"][i][0], flashcart_meta["commands"]["reset"][i][1]) - self.SetBankROM(bank) - time.sleep(0.05) - - # Sector Erase (if supported) - if "sector_erase" in flashcart_meta["commands"]: - if isinstance(flashcart_meta["sector_size"], list): - if sectCount == None: - sectCount = flashcart_meta["sector_size"][currSect][1] - if sectCount == 0: - if ((currSect+1) != len(flashcart_meta["sector_size"])): - currSect += 1 - sectCount = flashcart_meta["sector_size"][currSect][1] + if pos % sector_size == 0: + self.SetProgress({"action":"SECTOR_ERASE", "time_start":time.time(), "abortable":True}) - if pos % sector_size == 0: - signal.emit({"action":"SECTOR_ERASE", "abortable":False}, 1, 0, 0, time.time()-time_start, 0) - - # Update sector size if required - if "sector_erase" in flashcart_meta["commands"]: - if isinstance(flashcart_meta["sector_size"], list): - sector_size = flashcart_meta["sector_size"][currSect][0] - - for i in range(0, len(flashcart_meta["commands"]["sector_erase"])): - addr = flashcart_meta["commands"]["sector_erase"][i][0] - data = flashcart_meta["commands"]["sector_erase"][i][1] + # Update sector size if changed + if "sector_erase" in flashcart_meta["commands"]: + if isinstance(flashcart_meta["sector_size"], list): + sector_size = flashcart_meta["sector_size"][currSect][0] + dprint("\n* sector_count:", sector_count, "sector_size:", hex(sector_size), "pos:",hex(pos)) + + for i in range(0, len(flashcart_meta["commands"]["sector_erase"])): + addr = flashcart_meta["commands"]["sector_erase"][i][0] + data = flashcart_meta["commands"]["sector_erase"][i][1] + if addr == "SA": addr = currAddr + if addr == "SA+1": addr = currAddr + 1 + if addr == "SA+2": addr = currAddr + 2 + if addr == "SA+0x4000": addr = currAddr + 0x4000 + if addr == "SA+0x7000": addr = currAddr + 0x7000 + if not addr == None: + self.gbx_flash_write_address_byte(addr, data) + dprint("SE {:08X}={:X}".format(addr, data)) + if flashcart_meta["commands"]["sector_erase_wait_for"][i][0] != None: + addr = flashcart_meta["commands"]["sector_erase_wait_for"][i][0] + data = flashcart_meta["commands"]["sector_erase_wait_for"][i][1] if addr == "SA": addr = currAddr if addr == "SA+1": addr = currAddr + 1 if addr == "SA+2": addr = currAddr + 2 - if not addr == None: - self.gbx_flash_write_address_byte(addr, data) - if flashcart_meta["commands"]["sector_erase_wait_for"][i][0] != None: - addr = flashcart_meta["commands"]["sector_erase_wait_for"][i][0] - data = flashcart_meta["commands"]["sector_erase_wait_for"][i][1] - if addr == "SA": addr = currAddr - if addr == "SA+1": addr = currAddr + 1 - if addr == "SA+2": addr = currAddr + 2 - time.sleep(0.05) - timeout = 50 - while True: - if "wait_read_status_register" in flashcart_meta and flashcart_meta["wait_read_status_register"] == True: - for j in range(0, len(flashcart_meta["commands"]["read_status_register"])): - sr_addr = flashcart_meta["commands"]["read_status_register"][j][0] - sr_data = flashcart_meta["commands"]["read_status_register"][j][1] - self.gbx_flash_write_address_byte(sr_addr, sr_data) - wait_for = self.ReadROM(currAddr, 64) - wait_for = ((wait_for[1] << 8 | wait_for[0]) & flashcart_meta["commands"]["sector_erase_wait_for"][i][2]) - time.sleep(0.1) - timeout -= 1 - if timeout < 1: - signal.emit({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"Erasing a flash chip sector timed out. Please make sure the correct flash cartridge type is selected.", "abortable":False}, 0, 0, 0, 0, 0) - return False - if wait_for == data: break - - # Reset Flash - if "reset" in flashcart_meta["commands"]: - for i in range(0, len(flashcart_meta["commands"]["reset"])): - self.gbx_flash_write_address_byte(flashcart_meta["commands"]["reset"][i][0], flashcart_meta["commands"]["reset"][i][1]) - - if self.MODE == "DMG": - self.set_number(currAddr, self.DEVICE_CMD['SET_START_ADDRESS']) - elif self.MODE == "AGB": - self.set_number(currAddr / 2, self.DEVICE_CMD['SET_START_ADDRESS']) - - if sectCount is not None: - sectCount -= 1 - - # Write data (with special firmware acceleration if available) - if "buffer_write" in flashcart_meta["commands"]: + if addr == "SA+0x4000": addr = currAddr + 0x4000 + if addr == "SA+0x7000": addr = currAddr + 0x7000 + time.sleep(0.05) + timeout = 50 + while True: + if "wait_read_status_register" in flashcart_meta and flashcart_meta["wait_read_status_register"] == True: + for j in range(0, len(flashcart_meta["commands"]["read_status_register"])): + sr_addr = flashcart_meta["commands"]["read_status_register"][j][0] + sr_data = flashcart_meta["commands"]["read_status_register"][j][1] + self.gbx_flash_write_address_byte(sr_addr, sr_data) + dprint("SE_SR {:08X}={:X}".format(addr, data)) + wait_for = self.ReadROM(currAddr, 64) + wait_for = ((wait_for[1] << 8 | wait_for[0]) & flashcart_meta["commands"]["sector_erase_wait_for"][i][2]) + dprint("SE_SR {:X}=={:X}?".format(wait_for, data)) + time.sleep(0.1) + timeout -= 1 + if timeout < 1: + self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"Erasing a flash chip sector timed out. Please make sure the correct flash cartridge type is selected.", "abortable":False}) + return False + if wait_for == data: break + + # Reset Flash + if "reset" in flashcart_meta["commands"]: + for i in range(0, len(flashcart_meta["commands"]["reset"])): + self.gbx_flash_write_address_byte(flashcart_meta["commands"]["reset"][i][0], flashcart_meta["commands"]["reset"][i][1]) + if self.MODE == "DMG": - # BUNG Doctor GB Card 64M - if flashcart_meta["commands"]["buffer_write"] == [['SA', 232], ['SA', 'BS'], ['PA', 'PD'], ['SA', 208]]: - data = data_import[pos:pos+32] + self.set_number(currAddr, self.DEVICE_CMD['SET_START_ADDRESS']) + elif self.MODE == "AGB": + self.set_number(currAddr / 2, self.DEVICE_CMD['SET_START_ADDRESS']) + + if sector_count is not None: + sector_count -= 1 + + #self.SetProgress({"action":"UPDATE_SPEED", "abortable":False}) + + # Write data (with special firmware acceleration if available) + if "buffer_write" in flashcart_meta["commands"]: + if self.MODE == "DMG": + # BUNG Doctor GB Card 64M + if flashcart_meta["commands"]["buffer_write"] == [['SA', 0xE8], ['SA', 'BS'], ['PA', 'PD'], ['SA', 0xD0]]: + data = data_import[pos:pos+32] + if data == bytearray([0xFF] * len(data)): + skipping = True + else: + if skipping: + self.set_number(currAddr, self.DEVICE_CMD['SET_START_ADDRESS']) + skipping = False self.gbx_flash_write_data_bytes("GB_FLASH_WRITE_INTEL_BUFFERED_32BYTE", data) self.wait_for_ack() - currAddr += 32 - pos += 32 - - else: - signal.emit({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"Buffer writing for this flash chip is not implemented yet.", "abortable":False}, 0, 0, 0, 0, 0) - return False - # TODO + currAddr += 32 + pos += 32 - elif self.MODE == "AGB": - # Flash2Advance 256M - if flashcart_meta["commands"]["buffer_write"] == [['SA', 232], ['SA+2', 232], ['SA', 'BS'], ['SA+2', 'BS'], ['PA', 'PD'], ['SA', 208], ['SA+2', 208], [None, None], [None, None]]: - data = data_import[pos:pos+256] + else: + self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"Buffer writing for this flash chip is not implemented yet.", "abortable":False}) + return False + # TODO + + elif self.MODE == "AGB": + # Flash2Advance 256M + if flashcart_meta["commands"]["buffer_write"] == [['SA', 0xE8], ['SA+2', 0xE8], ['SA', 'BS'], ['SA+2', 'BS'], ['PA', 'PD'], ['SA', 0xD0], ['SA+2', 0xD0], [None, None], [None, None]]: + data = data_import[pos:pos+256] + if data == bytearray([0xFF] * len(data)): + skipping = True + else: + if skipping: + self.set_number(currAddr / 2, self.DEVICE_CMD['SET_START_ADDRESS']) + skipping = False self.gbx_flash_write_data_bytes("GBA_FLASH_WRITE_INTEL_INTERLEAVED_256BYTE", data) self.wait_for_ack() - currAddr += 256 - pos += 256 - - # 256L30B - elif flashcart_meta["commands"]["buffer_write"] == [['SA', 96], ['SA', 208], ['SA', 232], ['SA', 'BS'], ['PA', 'PD'], ['SA', 208], ['SA', 255]]: - if "single_write_7FC0_to_7FFF" in flashcart_meta and int(currAddr % 0x8000) in range(0x7FC0, 0x7FFF): - for i in range(0, len(flashcart_meta["commands"]["single_write"])): - addr = flashcart_meta["commands"]["single_write"][i][0] - data = flashcart_meta["commands"]["single_write"][i][1] - if addr == "PA": addr = int(currAddr) - if data == "PD": data = struct.unpack('H', data_import[pos:pos+2])[0] - self.gbx_flash_write_address_byte(addr, data) - currAddr += 2 - pos += 2 - - if int(currAddr % 0x8000) == 0: - self.set_number(currAddr / 2, self.DEVICE_CMD['SET_START_ADDRESS']) - - else: - data = data_import[pos:pos+64] - self.gbx_flash_write_data_bytes("GBA_FLASH_WRITE_INTEL_64BYTE", data) - self.wait_for_ack() - currAddr += 64 - pos += 64 - - else: - signal.emit({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"Buffer writing for this flash chip is not implemented yet.", "abortable":False}, 0, 0, 0, 0, 0) - return False - # TODO - - elif "single_write" in flashcart_meta["commands"]: - if self.MODE == "DMG": - data = data_import[pos:pos+64] - if "pulse_reset_after_write" in flashcart_meta: - self.gbx_flash_write_data_bytes("GB_FLASH_WRITE_64BYTE_PULSE_RESET", data) - else: - self.gbx_flash_write_data_bytes("GB_FLASH_WRITE_64BYTE", data) - self.wait_for_ack() - currAddr += 64 - pos += 64 + currAddr += 256 + pos += 256 - elif self.MODE == "AGB": - # MSP55LV128M - if flashcart_meta["commands"]["single_write"] == [[1365, 169], [682, 86], [1365, 160], ['PA', 'PD']]: - data = data_import[pos:pos+256] - self.gbx_flash_write_data_bytes("GBA_FLASH_WRITE_256BYTE_SWAPPED_D0D1", data) - self.wait_for_ack() - currAddr += 256 - pos += 256 - - # E201850 and E201868 - elif flashcart_meta["commands"]["single_write"] == [[0, 112], [0, 16], ['PA', 'PD']] and (([ 0xB0, 0x00, 0xE2, 0x00 ] in flashcart_meta["flash_ids"]) or ([ 0xB0, 0x00, 0xB0, 0x00 ] in flashcart_meta["flash_ids"])): - data = data_import[pos:pos+64] - self.gbx_flash_write_data_bytes("GBA_FLASH_WRITE_SHARP_64BYTE", data) - self.wait_for_ack() - currAddr += 64 - pos += 64 - - else: # super slow + # 256L30B etc. + elif flashcart_meta["commands"]["buffer_write"] == [['SA', 0x60], ['SA', 0xD0], ['SA', 0xE8], ['SA', 'BS'], ['PA', 'PD'], ['SA', 0xD0], ['SA', 0xFF]]: + if "single_write_7FC0_to_7FFF" in flashcart_meta and flashcart_meta["single_write_7FC0_to_7FFF"] and int(currAddr % 0x8000) in range(0x7FC0, 0x7FFF): for i in range(0, len(flashcart_meta["commands"]["single_write"])): addr = flashcart_meta["commands"]["single_write"][i][0] data = flashcart_meta["commands"]["single_write"][i][1] if addr == "PA": addr = int(currAddr) if data == "PD": data = struct.unpack('H', data_import[pos:pos+2])[0] self.gbx_flash_write_address_byte(addr, data) - currAddr += 2 pos += 2 + data = bytearray([0] * 2) + + if int(currAddr % 0x8000) == 0: + self.set_number(currAddr / 2, self.DEVICE_CMD['SET_START_ADDRESS']) + + else: + data = data_import[pos:pos+64] + if data == bytearray([0xFF] * len(data)): + skipping = True + else: + if skipping: + self.set_number(currAddr / 2, self.DEVICE_CMD['SET_START_ADDRESS']) + skipping = False + self.gbx_flash_write_data_bytes("GBA_FLASH_WRITE_INTEL_64BYTE", data) + self.wait_for_ack() + + currAddr += 64 + pos += 64 + + # MSP55LV128M etc. + elif flashcart_meta["commands"]["buffer_write"] == [[0xAAA, 0xA9], [0x555, 0x56], ['SA', 0x26], ['SA', 'BS'], ['PA', 'PD'], ['SA', 0x2A]]: + data = data_import[pos:pos+256] + if data == bytearray([0xFF] * len(data)): + skipping = True + else: + if skipping: + self.set_number(currAddr / 2, self.DEVICE_CMD['SET_START_ADDRESS']) + skipping = False + self.gbx_flash_write_data_bytes("GBA_FLASH_WRITE_BUFFERED_256BYTE_SWAPPED_D0D1", data) + self.wait_for_ack() + currAddr += 256 + pos += 256 + + else: + dprint(flashcart_meta["commands"]["buffer_write"]) + self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"Buffer writing for this flash chip is not implemented yet.", "abortable":False}) + return False + # TODO + + elif "single_write" in flashcart_meta["commands"]: + if self.MODE == "DMG": + data = data_import[pos:pos+64] + if data == bytearray([0xFF] * len(data)): + skipping = True + else: + if skipping: + self.set_number(currAddr, self.DEVICE_CMD['SET_START_ADDRESS']) + skipping = False + if "pulse_reset_after_write" in flashcart_meta and flashcart_meta["pulse_reset_after_write"]: + self.gbx_flash_write_data_bytes("GB_FLASH_WRITE_64BYTE_PULSE_RESET", data) + else: + self.gbx_flash_write_data_bytes("GB_FLASH_WRITE_64BYTE", data) + if not self.wait_for_ack(): + self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"Timeout error.", "abortable":False}) + return False + currAddr += 64 + pos += 64 - # Report back to GUI - if pos % 4096 == 0: - now = time.time() - measure_points.append(now - last_emit) - last_emit = now - if len(measure_points) >= 16: - time_delta = statistics.median(measure_points) - speed = 4096 / time_delta - time_elapsed = time.time() - time_start - time_left = (time_elapsed / (pos/len(data_import))) - time_elapsed - if len(measure_points) >= 512: - measure_points = measure_points[-512:] - - if not pos == len(data_import): signal.emit(None, pos, len(data_import), speed/1024, time.time()-time_start, time_left) - - # Reset Flash - if "reset" in flashcart_meta["commands"]: - for i in range(0, len(flashcart_meta["commands"]["reset"])): - self.gbx_flash_write_address_byte(flashcart_meta["commands"]["reset"][i][0], flashcart_meta["commands"]["reset"][i][1]) - - signal.emit(None, pos, len(data_import), speed/1024, time.time()-time_start, time_left) + elif self.MODE == "AGB": + # MSP55LV128 etc. + if flashcart_meta["commands"]["single_write"] == [[0xAAA, 0xA9], [0x555, 0x56], [0xAAA, 0xA0], ['PA', 'PD']]: + data = data_import[pos:pos+256] + if data == bytearray([0xFF] * len(data)): + skipping = True + else: + if skipping: + self.set_number(currAddr / 2, self.DEVICE_CMD['SET_START_ADDRESS']) + skipping = False + self.gbx_flash_write_data_bytes("GBA_FLASH_WRITE_256BYTE_SWAPPED_D0D1", data) + self.wait_for_ack() + currAddr += 256 + pos += 256 + + # E201850 and E201868 + elif flashcart_meta["commands"]["single_write"] == [[0, 0x70], [0, 0x10], ['PA', 'PD']] and (([ 0xB0, 0x00, 0xE2, 0x00 ] in flashcart_meta["flash_ids"]) or ([ 0xB0, 0x00, 0xB0, 0x00 ] in flashcart_meta["flash_ids"])): + data = data_import[pos:pos+64] + if data == bytearray([0xFF] * len(data)): + skipping = True + else: + if skipping: + self.set_number(currAddr / 2, self.DEVICE_CMD['SET_START_ADDRESS']) + skipping = False + self.gbx_flash_write_data_bytes("GBA_FLASH_WRITE_SHARP_64BYTE", data) + self.wait_for_ack() + currAddr += 64 + pos += 64 + + else: # super slow + for i in range(0, len(flashcart_meta["commands"]["single_write"])): + addr = flashcart_meta["commands"]["single_write"][i][0] + data = flashcart_meta["commands"]["single_write"][i][1] + if addr == "PA": addr = int(currAddr) + if data == "PD": data = struct.unpack('H', data_import[pos:pos+2])[0] + self.gbx_flash_write_address_byte(addr, data) + + currAddr += 2 + pos += 2 + + self.SetProgress({"action":"WRITE", "bytes_added":len(data), "skipping":skipping}) + + # Reset Flash + if "reset" in flashcart_meta["commands"]: + for i in range(0, len(flashcart_meta["commands"]["reset"])): + self.gbx_flash_write_address_byte(flashcart_meta["commands"]["reset"][i][0], flashcart_meta["commands"]["reset"][i][1]) + + self.SetProgress({"action":"FINISHED"}) diff --git a/FlashGBX/res/config.zip b/FlashGBX/res/config.zip index b5ea9447a78e68ccfad5f368233167dc8a2137d9..2a6b0befc02fefc85fe946575c16a74e713dc4a5 100644 GIT binary patch delta 11069 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 delta 8545 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 diff --git a/README.md b/README.md index 479cc21..25c6325 100644 --- a/README.md +++ b/README.md @@ -15,12 +15,12 @@ by Lesserkuma - Backup, restore and erase save data from Game Boy and Game Boy Advance game cartridges - Backup ROM data from Game Boy and Game Boy Advance game cartridges - Write new ROMs to a wide variety of Game Boy and Game Boy Advance flash cartridges -- Many flash cartridges can be auto-detected -- A Flash ID check can be performed for unsupported flash cartridges +- Many reproduction cartridges and flash cartridges can be auto-detected +- A flash chip query can be performed for unsupported flash cartridges ### Confirmed working reader/writer hardware -- [insideGadgets GBxCart RW v1.3 and v1.3 Pro](https://www.gbxcart.com/) with firmware versions from R17 up to R19 (other hardware revisions and firmware versions may also work, but are untested) +- [insideGadgets GBxCart RW v1.3 and v1.3 Pro](https://www.gbxcart.com/) with firmware versions from R19 up to R23 (other hardware revisions and firmware versions may also work, but are untested) ### Currently supported flash cartridges @@ -38,44 +38,63 @@ by Lesserkuma - Game Boy Advance - - Flash2Advance 256M (non-ultra variant) + - Flash2Advance 256M (non-ultra variant, with 2× 28F128J3A150) - Nintendo AGB Cartridge 128M Flash S, E201850 - Nintendo AGB Cartridge 256M Flash S, E201868 -### Currently supported bootleg cartridges +### Currently supported and tested reproduction cartridges - Game Boy - ES29LV160_DRV with 29DL32TF-70 - GB-M968 with M29W160EB *(thanks RevZ)* - GB-M968 with MX29LV320ABTC - - S29GL032 (no PCB text) + - ALTERA CPLD and S29GL032N90T (no PCB text) - SD007_48BALL_64M with GL032M11BAIR4 *(thanks RevZ)* - SD007_48BALL_64M with M29W640 + - SD007_48BALL_64M_V2 with GL032M11BAIR4 - SD007_48BALL_64M_V3 with 29DL161TD-90 + - SD007_48BALL_64M_V5 with 36VF3203 - SD007_48BALL_64M_V5 with 36VF3204 + - SD007_48BALL_64M_V6 with 36VF3204 - SD007_48BALL_64M_V6 with 29DL163BD-90 *(thanks LovelyA72)* + - SD007_BV5_DRV with M29W320DT *(thanks Frost Clock)* + - SD007_BV5_V3 with 29LV160BE-90PFTN *(thanks LucentW)* + - SD007_BV5_V3 with HY29LV160BT-70 *(thanks LucentW)* - SD007_BV5_V2 with HY29LV160TT *(thanks RevZ)* - SD007_BV5_V2 with MX29LV320BTC *(thanks RevZ)* - SD007_BV5_V3 with AM29LV160MB *(thanks RevZ)* + - SD007_TSOP_48BALL with 36VF3204 + - SD007_TSOP_48BALL with AM29LV160DT *(thanks marv17)* + - SD007_TSOP_48BALL with L160DB12VI *(thanks marv17)* - Game Boy Advance - 28F256L03B-DRV with 256L30B - - 4455_4400_4000_4350_36L0R_V3 with M36L0R705 + - 36L0R8-39VF512 with M36L0R8060B *(thanks LucentW)* + - 36L0R8-39VF512 with M36L0R8060T *(thanks AndehX)* + - 4050_4400_4000_4350_36L0R_V5 with M36L0R7050T + - 4050_4400_4000_4350_36L0R_V5 with M36L0T8060T + - 4050_4400_4000_4350_36L0R_V5 with M36L0R8060T + - 4455_4400_4000_4350_36L0R_V3 with M36L0R7050T + - AGB-E05-01 with GL128S - AGB-E05-01 with MSP55LV128M + - AGB-E05-02 with M29W128GH *(thanks marv17)* + - AGB-E08-09 with 29LV128DTMC-90Q *(thanks LucentW)* - AGB-SD-E05 with MSP55LV128 *(thanks RevZ)* - BX2006_0106_NEW with S29GL128N10TFI01 *(thanks litlemoran)* + - BX2006_TSOP_64BALL with GL128S + - BX2006_TSOPBGA_0106 with M29W640GB6AZA6 -Many different bootleg cartridges share their flash chip command set, so even if yours is not on this list, it may still work fine or even be detected as another one. Support for more cartridges can also be added by creating external config files that include the necessary flash chip commands. +Many different reproduction cartridges share their flash chip command set, so even if yours is not on this list, it may still work fine or even be auto-detected as another one. Support for more cartridges can also be added by creating external config files that include the necessary flash chip commands. ## Installing and running The application should work on pretty much every operating system that supports Qt-GUI applications built using [Python 3](https://www.python.org/downloads/) with [PySide2](https://pypi.org/project/PySide2/) and [pyserial](https://pypi.org/project/pyserial/) packages. -If you have Python and pip installed, you can use `pip install FlashGBX` to download and install the application. +If you have Python and pip installed, you can use `pip install FlashGBX` to download and install the application. Then use `python -m FlashGBX` to run it. -To run it in portable mode, you can also download the source code archive and call `python run.py` after installing the prerequisites yourself. +To run FlashGBX in portable mode, you can also download the source code archive and call `python run.py` after installing the prerequisites yourself. ### Windows binaries @@ -88,12 +107,16 @@ These executables have been created using *PyInstaller* and *Inno Setup*. ### Troubleshooting -* If something doesn’t work as expected during data transfer, first try to clean the game cartridge contacts, wiggle the cartridge a bit and reconnect the USB device. +* If something doesn’t work as expected, first try to clean the game cartridge contacts (best with IPA 99%+ on a Q-tip) and reconnect the device. * On Linux systems, you may run into a *Permission Error* problem when trying to connect to USB devices without *sudo* privileges. To grant yourself the necessary permissions temporarily, you can run `sudo chmod 0666 /dev/ttyUSB0` (replace with actual device path) before running the app. For a permanent solution, add yourself to the usergroup that has access to serial devices by default (e.g. *dialout* on Debian-based distros; `sudo adduser $USER dialout`) and then reboot the system. * On some Linux systems, you may need the *XCB Xinerama package* if you see an error regarding failed Qt platform plugin initialization. You can install it with `sudo apt install libxcb-xinerama0` etc. +* For save data backup/restore on Game Boy Advance reproduction cartridges, depending on how it was built, you may have to manually select the save type for it to work properly. + +* The save data backup/restore feature may not work on certain reproduction cartridges with batteryless-patched ROMs. As those cartridges use the same flash chip for both ROM and save data storage, a full ROM backup will usually include the save data. Also, when flashing a new unpatched ROM to a cartridge like this, the game may not be able to save progress without soldering in a battery. + ## DISCLAIMER This software is provided as-is and the developer is not responsible for any damage that is caused by the use of it. Use at your own risk! @@ -103,16 +126,20 @@ This software is provided as-is and the developer is not responsible for any dam The author would like to thank the following very kind people for their help and contributions (in alphabetical order): - AlexiG (GBxCart RW hardware, bug reports, flash chip info) -- AndehX (app icon) +- AndehX (app icon, flash chip info) +- easthighNerd (feature suggestions) +- Frost Clock (flash chip info) - JFox (help with properly packaging the app for pip) - julgr (macOS help, testing) - litlemoran (flash chip info) - LovelyA72 (flash chip info) +- LucentW (flash chip info, testing) +- marv17 (flash chip info, testing) - RevZ (Linux help, testing, bug reports, flash chip info) ## Changes -### v0.7β (2020-09-25) +### v0.7β (released 2020-09-25) - First started tracking changes - Added a way to launch the flash cartridge type auto-detection process from the type list @@ -121,24 +148,24 @@ The author would like to thank the following very kind people for their help and - Fixed config file for 4455_4400_4000_4350_36L0R_V3 with M36L0R705 (sector size map was incomplete) - Renamed some labels of flash cartridge types - Made config files UTF-8 compatible -- File open and save dialogs will now remember the last used directory for ROM files and save data files respectively (stored in config.ini in AppData/Roaming), clearable with the `--reset` switch or by editing/deleting config.ini +- File open and save dialogs will now remember the last used directory for ROM files and save data files respectively (stored in settings.ini in AppData/Roaming), clearable with the `--reset` switch or by editing/deleting settings.ini - Added CRC32 checksum comparison for Game Boy Advance games by using a database based on header SHA1 hashes - Fixed a bug with save data restore and improved save data backup speed - Fixed a few status message errors - Added a warning when changing platforms -- Made some messages suppressible (stored in config.ini) +- Made some messages suppressible (stored in settings.ini) - Added detection of ungraceful device disconnects when starting a new task, with optional automatic reconnect - First public beta release -### v0.8β (2020-10-03) +### v0.8β (released 2020-10-03) - Added support for the DIY cart with AM29F016/AM29F016B with AUDIO as WE *(thanks AndehX)* - Renamed `VIN` to `AUDIO` in config files and the command line switch `--resetconfig` to `--reset` - Added experimental support for GBxCart RW revisions other than v1.3 and fixed a crash when connecting to unknown revisions of the GBxCart RW - The app is now available as a package and can be installed directly through *pip* *(thanks JFox)* - Changed the way configuration files are stored (for details call with `--help` command line switch) -- Added the option to write an automatically trimmed ROM file which can reduce flashing time, especially in Game Boy Advance mode (note that not all ROMs can be trimmed) -- When dumping a flash cartridge that has been flashed with a trimmed ROM, the ROM will be fixed so checksums will still match up (can be disabled for debugging by adding `_notrimfix` to the file name) +- ~~Added the option to write an automatically trimmed ROM file which can reduce flashing time, especially in Game Boy Advance mode (note that not all ROMs can be trimmed)~~ +- ~~When dumping a flash cartridge that has been flashed with a trimmed ROM, the ROM will be fixed so checksums will still match up (can be disabled for debugging by adding `_notrimfix` to the file name)~~ - Added a button that opens a file browser to the currently used config directory for easy access - Added the option to erase/wipe the save data on a cartridge - Rearranged some buttons on the main window so that the newly added button popup menus don’t block anything @@ -146,9 +173,45 @@ The author would like to thank the following very kind people for their help and - Rewrote some of the save data handling for Game Boy Advance cartridges to speed transfers up a bit - Fixed a couple of instability issues that used to caused timeouts on macOS *(thanks julgr)* - Confirmed support for SD007_48BALL_64M_V5 with 29DL163BD-90 *(thanks julgr)* -- Added an option for flashing at 5V for a few flash cartridge types that sometimes require this; if you think your cartridge is affected, you can add `"voltage_variants":true,` to the config file +- Added an option for flashing at 5V for a few flash cartridge types that sometimes require this; if you think your cartridge is affected, you can add `"voltage_variants":true,` to the config file for it - Fixed support for Windows 7 when using pre-compiled exe file packages - Reduced size and decompression time of the pre-compiled exe file packages by excluding unnecessary DLL files - Fixed a timing issue that could sometimes cause a loss of save data when hot-swapping Game Boy cartridges - Added some warnings that help with troubleshooting, for example that manually setting the feature box to a MBC5 option may be necessary for a clean dump when dumping ROMs from flash cartridges - Added taskbar progress visualization on Windows systems + +### v0.9β (released 2020-12-17) + +- Confirmed support for BX2006_TSOP_64BALL with GL128S +- Confirmed support for SD007_48BALL_64M_V2 with GL032M11BAIR4 +- Added support for 4050_4400_4000_4350_36L0R_V5 with M36L0R8060T/M36L0T8060T +- Rewrote parts of the GBxCart RW interface code +- Removed the option to trim ROM files and will now instead just skip writing empty chunks of data +- Fixed config files for MSP55LV128 and MSP55LV128M flash chips +- Confirmed support for SD007_48BALL_64M_V6 with 36VF3204 +- Confirmed support for SD007_TSOP_48BALL with 36VF3204 +- Added the option to add date and time to suggested filenames for save data backups *(thanks easthighNerd)* +- Added a check and warning for unstable ROM readings +- Added Common Flash Interface query for both unknown and known flash cartridge types +- Added support for 36L0R8-39VF512 with M36L0R8060B *(thanks LucentW)* +- Added support for another version of 36L0R8-39VF512 with M36L0R8060B/M36L0R8060T *(thanks AndehX)* +- Added support for AGB-E05-02 with M29W128GH *(thanks marv17)* +- Added backup and restore of 1M SRAM save data in GBA mode +- Confirmed support for BX2006_TSOPBGA_0106 with M29W640GB6AZA6 *(thanks LucentW)* +- Confirmed support for AGB-E05-01 with GL128S +- Improved writing speed for MSP55LV128M, S29GL128 and similar flash chips (requires GBxCart RW firmware R23 or higher) +- Before flashing a ROM it will now be checked if its logo data and header checksum are valid and a warning will be shown if not +- Added support for SD007_BV5_V3 with 29LV160BE-90PFTN *(thanks LucentW)* +- Added support for SD007_BV5_V3 with HY29LV160BT *(thanks LucentW)* +- Added support for SD007_48BALL_64M_V5 with 36VF3203 *(thanks LucentW)* +- Added support for SD007_TSOP_48BALL with M29W160ET70ZA6 *(thanks LucentW)* +- Added support for AGB-E08-09 with 29LV128DTMC-90Q *(thanks LucentW)* +- Confirmed support for SD007_TSOP_48BALL with L160DB12VI *(thanks marv17)* +- Added support for SD007_TSOP_48BALL with AM29LV160DT *(thanks marv17)* +- Added support for SD007_BV5_DRV with M29W320DT *(thanks Frost Clock)* +- Added experimental *fast read mode* support for GBxCart RW v1.3 with firmware R19+ (about 20% faster) +- Bumped the required minimum firmware version of GBxCart RW v1.3 to R19 +- Confirmed support for 4050_4400_4000_4350_36L0R_V5 with M36L0R7050T +- Added the option to enable the preference of sector erase over chip erase when flashing a ROM (this can improve flashing speed for ROMs smaller than the flash chip capacity) +- Some flash chips may have reversed sectors despite shared flash ID; if you think your cartridge is affected, you can add `"sector_reversal":true,` to its config file for a prompt upon flashing +- Renamed config.ini to settings.ini to avoid confusion with the term “config file” diff --git a/run.py b/run.py index b971c51..03875a3 100644 --- a/run.py +++ b/run.py @@ -1,4 +1,4 @@ -# Note: This file runs FlashGBX in portable mode and is also used to build the portable Windows archive. +# Note: This file runs FlashGBX in portable mode. from FlashGBX import FlashGBX FlashGBX.main(portableMode=True) diff --git a/setup.py b/setup.py index 5a72bb0..f00901f 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ with open("README.md", "r", encoding="utf-8") as fh: long_description = fh.read( setuptools.setup( name="FlashGBX", - version="0.8b0", + version="0.9b0", author="Lesserkuma", description="A GUI application that can read and write Game Boy and Game Boy Advance cartridge data. Currently supports the GBxCart RW hardware device by insideGadgets.", url="https://github.com/lesserkuma/FlashGBX",