From d76982bbebed5625cf2b1d4fb5f216ee97dbb690 Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Mon, 27 Mar 2023 16:57:48 +0200 Subject: [PATCH] naomi,aw: embed default flash for some games Needed to configure network on first run. --- CMakeLists.txt | 13 +++++ core/archive/ZipArchive.cpp | 20 +++++++ core/archive/ZipArchive.h | 3 + core/hw/flashrom/flashrom.cpp | 6 ++ core/hw/flashrom/flashrom.h | 3 + core/hw/flashrom/nvmem.cpp | 84 +++++++++++++++++++++++++++- core/network/naomi_network.cpp | 3 - resources/flash/dirtypig.nvmem.zip | Bin 0 -> 843 bytes resources/flash/dirtypig.nvmem2.zip | Bin 0 -> 379 bytes resources/flash/f355.nvmem.zip | Bin 0 -> 1745 bytes resources/flash/f355twin.nvmem.zip | Bin 0 -> 1734 bytes resources/flash/f355twn2.nvmem.zip | Bin 0 -> 1333 bytes resources/flash/gunsur2.nvmem.zip | Bin 0 -> 328 bytes resources/flash/otrigger.nvmem.zip | Bin 0 -> 750 bytes resources/flash/wldkicks.nvmem.zip | Bin 0 -> 461 bytes resources/flash/wldkicksj.nvmem.zip | Bin 0 -> 447 bytes resources/flash/wldkicksu.nvmem.zip | Bin 0 -> 461 bytes 17 files changed, 126 insertions(+), 6 deletions(-) create mode 100644 resources/flash/dirtypig.nvmem.zip create mode 100644 resources/flash/dirtypig.nvmem2.zip create mode 100644 resources/flash/f355.nvmem.zip create mode 100644 resources/flash/f355twin.nvmem.zip create mode 100644 resources/flash/f355twn2.nvmem.zip create mode 100644 resources/flash/gunsur2.nvmem.zip create mode 100644 resources/flash/otrigger.nvmem.zip create mode 100644 resources/flash/wldkicks.nvmem.zip create mode 100644 resources/flash/wldkicksj.nvmem.zip create mode 100644 resources/flash/wldkicksu.nvmem.zip diff --git a/CMakeLists.txt b/CMakeLists.txt index 788c7991b..8dad0965f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -922,6 +922,19 @@ target_sources(${PROJECT_NAME} PRIVATE core/hw/sh4/sh4_sched.h core/hw/sh4/storeq.cpp) +cmrc_add_resources(flycast-resources + WHENCE resources + resources/flash/gunsur2.nvmem.zip + resources/flash/otrigger.nvmem.zip + resources/flash/wldkicks.nvmem.zip # free play + resources/flash/wldkicksj.nvmem.zip # free play + resources/flash/wldkicksu.nvmem.zip # free play + resources/flash/f355.nvmem.zip # printer on + resources/flash/f355twin.nvmem.zip + resources/flash/f355twn2.nvmem.zip + resources/flash/dirtypig.nvmem.zip # 4 players + resources/flash/dirtypig.nvmem2.zip) + cmrc_add_resources(flycast-resources fonts/printer_ascii8x16.bin fonts/printer_ascii12x24.bin diff --git a/core/archive/ZipArchive.cpp b/core/archive/ZipArchive.cpp index 394f919ac..70b08c31b 100644 --- a/core/archive/ZipArchive.cpp +++ b/core/archive/ZipArchive.cpp @@ -88,3 +88,23 @@ u32 ZipArchiveFile::Read(void* buffer, u32 length) { return zip_fread(zip_file, buffer, length); } + +bool ZipArchive::Open(const void *data, size_t size) +{ + zip_error_t error; + zip_source_t *source = zip_source_buffer_create(data, size, 0, &error); + if (source == nullptr) + return false; + zip = zip_open_from_source(source, 0, NULL); + if (zip == nullptr) + zip_source_free(source); + return zip != nullptr; +} + +ArchiveFile *ZipArchive::OpenFirstFile() +{ + zip_file *zipFile = zip_fopen_index(zip, 0, 0); + if (zipFile == nullptr) + return nullptr; + return new ZipArchiveFile(zipFile); +} diff --git a/core/archive/ZipArchive.h b/core/archive/ZipArchive.h index d14dca812..697fd6a48 100644 --- a/core/archive/ZipArchive.h +++ b/core/archive/ZipArchive.h @@ -32,6 +32,9 @@ public: ArchiveFile* OpenFile(const char* name) override; ArchiveFile* OpenFileByCrc(u32 crc) override; + bool Open(const void *data, size_t size); + ArchiveFile *OpenFirstFile(); + private: bool Open(const char* path) override; diff --git a/core/hw/flashrom/flashrom.cpp b/core/hw/flashrom/flashrom.cpp index f407fc48c..f848af3de 100644 --- a/core/hw/flashrom/flashrom.cpp +++ b/core/hw/flashrom/flashrom.cpp @@ -33,6 +33,12 @@ bool MemChip::Load(const std::string& file) return false; } +void MemChip::Load(const u8 *data, size_t size) +{ + verify(size == this->size - write_protect_size); + memcpy(this->data + write_protect_size, data, this->size - write_protect_size); +} + void WritableChip::Save(const std::string& file) { FILE *f = nowide::fopen(file.c_str(), "wb"); diff --git a/core/hw/flashrom/flashrom.h b/core/hw/flashrom/flashrom.h index 30cf0e396..1fd7d7c90 100644 --- a/core/hw/flashrom/flashrom.h +++ b/core/hw/flashrom/flashrom.h @@ -64,6 +64,7 @@ public: virtual bool Reload() { return true; } bool Load(const std::string &prefix, const std::string &names_ro, const std::string &title); + void Load(const u8 *data, size_t size); void digest(u8 md5Digest[16]); virtual void Reset() {} @@ -82,6 +83,8 @@ public: bool Reload() override { + if (load_filename.empty()) + return false; return Load(this->load_filename); } void Save(const std::string& file); diff --git a/core/hw/flashrom/nvmem.cpp b/core/hw/flashrom/nvmem.cpp index d1317b712..52dde4b34 100644 --- a/core/hw/flashrom/nvmem.cpp +++ b/core/hw/flashrom/nvmem.cpp @@ -22,6 +22,9 @@ #include "hw/aica/aica_if.h" #include "reios/reios.h" #include "oslib/oslib.h" +#include "archive/ZipArchive.h" +#include +CMRC_DECLARE(flycast); extern bool bios_loaded; @@ -193,13 +196,81 @@ static void fixUpDCFlash() } } +static std::unique_ptr loadFlashResource(const std::string& name, size_t& size) +{ + try { + cmrc::embedded_filesystem fs = cmrc::flycast::get_filesystem(); + std::string fname = "flash/" + name + ".zip"; + if (fs.exists(fname)) + { + cmrc::file zipFile = fs.open(fname); + ZipArchive zip; + if (zip.Open(zipFile.cbegin(), zipFile.size())) + { + std::unique_ptr flashFile; + flashFile.reset(zip.OpenFirstFile()); + if (flashFile != nullptr) + { + std::unique_ptr buffer = std::make_unique(size); + size = flashFile->Read(buffer.get(), size); + + return buffer; + } + } + } + else + { + cmrc::file flashFile = fs.open("flash/" + name); + size = flashFile.size(); + std::unique_ptr buffer = std::make_unique(size); + + return buffer; + } + DEBUG_LOG(FLASHROM, "Default flash not found"); + } catch (const std::system_error& e) { + DEBUG_LOG(FLASHROM, "Default flash not found: %s", e.what()); + } + size = 0; + return nullptr; +} + +static void loadDefaultAWBiosFlash() +{ + std::string flashName = get_game_basename() + ".nvmem2"; + size_t lastindex = get_last_slash_pos(flashName); + if (lastindex != std::string::npos) + flashName = flashName.substr(lastindex + 1); + + size_t size = settings.platform.bios_size / 2; + std::unique_ptr buffer = loadFlashResource(flashName, size); + if (buffer) + sys_rom->Load(buffer.get(), size); +} + static bool loadFlash() { bool rc = true; if (settings.platform.isConsole()) rc = sys_nvmem->Load(getRomPrefix(), "%nvmem.bin", "nvram"); else if (!settings.naomi.slave) + { rc = sys_nvmem->Load(hostfs::getArcadeFlashPath() + ".nvmem"); + if (!rc) + { + std::string flashName = get_game_basename() + ".nvmem"; + size_t lastindex = get_last_slash_pos(flashName); + if (lastindex != std::string::npos) + flashName = flashName.substr(lastindex + 1); + + size_t size = settings.platform.flash_size; + std::unique_ptr buffer = loadFlashResource(flashName, size); + if (buffer) + { + sys_nvmem->Load(buffer.get(), size); + rc = true; + } + } + } if (!rc) INFO_LOG(FLASHROM, "flash/nvmem is missing, will create new file..."); fixUpDCFlash(); @@ -208,7 +279,10 @@ static bool loadFlash() if (settings.platform.isAtomiswave()) { - sys_rom->Load(hostfs::getArcadeFlashPath() + ".nvmem2"); + rc = sys_rom->Load(hostfs::getArcadeFlashPath() + ".nvmem2"); + // TODO default AW .nvmem2 + if (!rc) + loadDefaultAWBiosFlash(); if (config::GGPOEnable) sys_nvmem->digest(settings.network.md5.nvmem2); } @@ -281,10 +355,14 @@ u8 *getBiosData() { return sys_rom->data; } + void reloadAWBios() { - if (settings.platform.isAtomiswave()) - sys_rom->Reload(); + if (!settings.platform.isAtomiswave()) + return; + if (sys_rom->Reload()) + return; + loadDefaultAWBiosFlash(); } void init() diff --git a/core/network/naomi_network.cpp b/core/network/naomi_network.cpp index 6812a54d0..a5e39e59f 100644 --- a/core/network/naomi_network.cpp +++ b/core/network/naomi_network.cpp @@ -307,7 +307,6 @@ void SetNaomiNetworkConfig(int node) } else if (gameId == " BIOHAZARD GUN SURVIVOR2") { - // FIXME need default flash write_naomi_flash(0x21c, node == 0 ? 0 : 1); // CPU ID - 1 write_naomi_flash(0x22a, node == -1 ? 0 : 1); // comm link on } @@ -317,7 +316,6 @@ void SetNaomiNetworkConfig(int node) } else if (gameId == "OUTTRIGGER JAPAN") { - // FIXME need default flash write_naomi_flash(0x21a, node == -1 ? 0 : 1); // network on write_naomi_flash(0x21b, node); // node id } @@ -349,7 +347,6 @@ void SetNaomiNetworkConfig(int node) } else if (gameId == "WORLD KICKS") { - // FIXME need default flash write_naomi_flash(0x224, node == -1 ? 0 : 1); // network on write_naomi_flash(0x220, node == 0 ? 0 : 1); // node id } diff --git a/resources/flash/dirtypig.nvmem.zip b/resources/flash/dirtypig.nvmem.zip new file mode 100644 index 0000000000000000000000000000000000000000..40cf98ecf58a144038b2b2075a83234d6a7c4716 GIT binary patch literal 843 zcmWIWW@Zs#U|`^2P_HTvo56fneKix1%fQ6I${@p#SC*Ta8ydpNz?>N`lM)BSr4`%^ zj4Ush85qFC+uPP1BIPm%KHh)x?y1Kj4#$rVnpj+Nj_9?{Nc;Hh%&WKW9`^MIpAd@^ zPm)}tGJ2x)s5=C zC$b__PQRL7torx){=0Qi{W|~F{=fU-(DnQGex*kL_b8t5{nN7}3i;(xg4g4A)qTG7 zE_i*MzKN9J*D9B_VRNQz&zG0~w_{KK`NnGz*79#&mL3l;y1z=Ro^N{n{>uD!h1GB0 zEvVk`+3LHl=IJD7!?bJX=jccOU0HYU70<7=Hu>e>^&bDyI(cbh4F9rvyWJmlSAD+w zR4aO}^WT%7)_<<3|MB~}{&*9zpYOl< zcjfhITOU9D-m&vMYwJbnc>9=Fwn?h<{_~jodS$UHNcqVv*Y7Ueaz5bdO^cAyx}1=?oo-im#;>Tjv)4CACU#g)`@S{C2sep0qId-PiiEXWzjo4D1;?5e?;M?E}0SndF#p krF99oOSUwEn9!8Z3Q75BsXoA)l?|kb5eU73^eeE301Yo%VE_OC literal 0 HcmV?d00001 diff --git a/resources/flash/dirtypig.nvmem2.zip b/resources/flash/dirtypig.nvmem2.zip new file mode 100644 index 0000000000000000000000000000000000000000..2a270ee31269827f59bc2803d75c690388b64bc2 GIT binary patch literal 379 zcmWIWW@Zs#U|`^2P_HTvJ7n>5!c8ELfq{{MjX{PXuPiq;*C;fElYu!iUM3|Dh)XND z85mh!Ff%ZKiMQtry$%O3G&~G9PAS{?+PdKdW6QKDK@*fTSr*Pdq9o-Le1Y#-fNgmH z#~g9~2a^`w-~Q)y{MzowNWIHX40w;*NViWe76#jhn~0gP>R#UOA2FieS8sdw`10*% zi{H(ffBVOc+;>SmpPyylKOXw|-`|@hg&S|bjeotZx4!KkJJhfsso3=J${m#wds_^? za6<(@*k9c>W9m~QU%tx)XEqmFSeC!gN3(o~%KiXvMkYCCTtOoN*RZ7##DoPDDl2LS4Fb65ZX literal 0 HcmV?d00001 diff --git a/resources/flash/f355.nvmem.zip b/resources/flash/f355.nvmem.zip new file mode 100644 index 0000000000000000000000000000000000000000..7341e8fce8378b7585b74f082cdad11352999c4c GIT binary patch literal 1745 zcmb7FdpML?82@TW6Pes1Ba_OiJkn5oM&-Vf63NQ4xl|J>HDj7_i)kxii|Jxh(IBgb ztqes&^X1ZYkoCcT&w0-Kp7%ZPd(Q8D&mTW;4~&{V z006UrwnH&~nJ>%N5@)H*qX3`|m;lu1gP{kv`(gpiH6N2blPfA#6PTffVgTTi7`PO& zHzU-fHrICJ(N>4uEM3(*t}JyQ!LV=jG~9Uevf=>3uUhe3+!CCY>|*we zU}K&)_UgyrT`nJ8O|{|i4T`?|wIf@gAiwp(9_>048B8*h?>x&LE^G51uH8{4Ie(Ai z`}9&nJp~LC2CN#;OJzA6;qSlOGD4NL1}dP-q)_Ek6PAMo_%7C*u>Sld8K=E4`ZuZl zxE8nKV#C6r9#YCU-ODsbZq@OztL8n@FYQisd`8h5ZLq23d^BG@gkvOt7P7{ivInLy z8Lew73L2ND=F$Q~C~rw6bn7N5tK9`x*6bhnyI zsw>zbJ$}HRzr3zIK%+4%ePz2SUAr{%oxN>wz&fR6WDX$l_nb1nWR63^SLook%<#Or~on+ z-zjLAyo5g!(n+SeUBPcd1uiIAow-B{`N;|VMZ``LvFD&fgO`#1QBNpn_#giWWrFMsAiwhkZ{+P!*6Hbhtf@F}Mci zulwo;89s!zVWa|GfAGQsXq%=~u-hNpzZ3DFDHZsrcDoRNEh%|!5#B@Pns7W0`ld12V!04A>EWk?hKKZ6 zjbjPo%FsCsabVT!!$YiC!KBPW8YbiaOB z4vM>*g<{_k#mPYGxf(@_hj{RbWw4BA@WLvhW1Yqa|9+fI)Ez%6@6fgB=S4jVZH+MB zQ>jcS-;_+uZ8jty`#Gpd(l2rhDLffd{r0hlVxgPMb;w3h)ZI5{fx9owLI0v8FnZ+C z<^_U~=0*AaZ*Vzjv2D-$hMuw;*q(*T{muCa*5PNW2Nes8N5QJY?d!yEc`*~sbXl`3 zzS0t`_+ubrqqN;ONIG;%Fw;C<9qahyfr^`6Y}w*JR`l3g8qz2SsCk9N~qNrYNYrH-}IH+He3 z_h84EJPWHZ!)D?KT@Mj_;5)c_mU~pM!%~GAe{wtNO`kaXDy4gx3#Jj$=ef)_JMllo yU`EXhZ;u%>O)>w)I7TY!nHsl`P3ph+M}3Na{>44s9_o`+1+{N>n)j literal 0 HcmV?d00001 diff --git a/resources/flash/f355twin.nvmem.zip b/resources/flash/f355twin.nvmem.zip new file mode 100644 index 0000000000000000000000000000000000000000..9393990023ccb0c3967d24560a2d983ad3478cf4 GIT binary patch literal 1734 zcmb7Fdo+|=6d!p-UX{mWu`(MIKYSQ6dV(l@dxmG03AKS4MUF(!C=i%@~#z zSGgt?@)?g&hSg(cRLJ8~8JUStjf^qkj+EuL*8St2v)0-B?6c3=zrFWa>*wh%ub_=W zp_Zbq6HXs^*q$1;UP-n+i$W=)3{YTvdd#4OZl&D5x#}*TsdY(d$H=;p;lFkya-{hqCnIR91ytRYDx?a>mcO&tp9j>} z0-47Pow0vvtE|K~xe;db@bH$G`xAms@7Nx!RdbJN=g>eCCDR$tot77Ukg{6DNSBDn z4I8W9mM^v_Zq)N41jRJW^ipQ6i$lGFdxwUbe{a&X+2LDWRzB9vJSOcJ3h6vdVH(~^ zeUDbna2u>&b8b4>RFy-r7Z26%{JeW+SB?&sP*Z2wQk&?}YOfV?>&r>o?8!IX(>P;u z>^1YjGyNZ~N(j17B-@MVduWWlq0jYJ=83n&&v4f+uxfDhb6~!AJf^dThD%DlT$laP ztuNI)rJ7Lw)2n#j&bH+6y1IbT0y8nr`W)fYDLO+kVK&P16kXt6t^c1|M<@ z-=*gAYjKHDGt~VP_aAIVO1m}4CiQ(ag&i;SxIMOIfO@m2n4Ls6&BtQA*=G4AD}Q#j zt+ZGjvNg}!IUc{${mP!ocI7UgBS)`{+}6n3gAJ&vu+a&5UivxI?QZ;x?`wN?j-WA7 ziE6Wnlcy8*^y1ynX8*hW224g=N10v3fqA=NcPXK7-w;*mP7^tm5>hH(;JzQtU%@2= z4VU>xk7|~`yVEaIQUW}5wW)MVj=$r&3nEoM)mL8-pw~;zS@W+jGS7u5B{mTPx}3m_ zB{8+jN}GqVaGox%Tnvwifi2V!bQ<_R4ZP$6#Nz={A;yRYIq)DaAsZC3&0~)$z!l1{ zg(~tgB5U{}lJMA0KxE^_0FES*PZcYPZy2|J%XJ~h_Y#PP`UT$6moumY`vGd*6~Y9b zBP+>bH{6d4~(I}5a z(7vOV;Yd`2Ei{nav*2zQptt~Ylm|r%*$S~oSHKpE2s$0Sga_6aV8}dZgV43aVbr7? zvx-lxMhkkQsG_sc93so%xXRb|Ei`4(mtbmlKnMMR92Q(*&;f0cX-%-#vSGHROnU%( zDG#&v`2i<_5kIA2c8nh|bQlqmz;P!asSrctL29u@7`ROy5oUnn&VVHk0)?)cu|;}t zn=;bs1XT6#MaHv?S?@=M7#$vD9$T~mUY-VK;}@6DBop*;0-AV`o6uDO{^K|Bo(u4d z2ifo-TcN8e+@^~Bf(JUBfbIf}EWu5&M(T*4JQAJ`Y8#>lR*Bga_+L{_-ZrLluLHZI zJ&? zm$+@JwQaH_V(-J++FJg8Y$o64`b5jXHcFs9e30~!V*SXZcCrp@bRa$&WS)9^##?lu zA#dEo@o_1hAxT$0F%2;S#Fwp8MgkpE9&VlK**wl`b2~yF%KnaBuTJM&n0hSW(Qw&(jE}^xy&S=qGwBQ#IT9`M#(p= z#Jg(tKAKZw=B&Ngx7#)>GL83*kyp4ZU3*UJe=RYNp8!vHxh013|3x!s8Q;v0duem> c8|f&{lgso5V_$dw0DiwwP5=M^ literal 0 HcmV?d00001 diff --git a/resources/flash/f355twn2.nvmem.zip b/resources/flash/f355twn2.nvmem.zip new file mode 100644 index 0000000000000000000000000000000000000000..6816edc24850d4895a258a59a4fabb2017316f2d GIT binary patch literal 1333 zcmbu9e^irI7{}km51HsdAR)&Yr-L%h1Pjr3Zq9x{Q7c4~(DKKv*U zG<}Jjm+UoCO;bdyZeRMxUJX+cg=Q80spMTlnlvA*%gR z+r&k+N>eT^9e;3!QM6W<{(664>1y`^~*6ejyoJ*v1PPOBksK>x)o6HX+RWFYIgCF6fi@(k8_{f#6`?t z3sOf7mYm|MZ4vMoZXr|by%p3flmZ;Mm>4xmDk(7}K`36>H{R*GTOld1>#Nzh@TQDg zsZrVWKNvEGn>!57;pTES#;v-*EO(cVRJ!MW*JoI}qPOv<+1!#HrjmR(=Dlm9#OaL> zrLlb_9J>MT`!k3u!o_4tA842Cy;wzspfI=<#N(PrMRo?#Y6pNtJrivON z7jCu7swoj#1kRAUHaY}71J05SZS-99Iyg%-wA23R9k7^eFw*nTJg|)vnbeVp55y#N z$SPSJhT?1by-jB!5{RdpHg$3LB#?@SOYp}2-bzXeJMcz(Zw)1cBlrqO?;dI~%*PuY znPpTMdI{7LvF$X57QzZVyf5=(iU-$%Kr+@yM<5ltl7O;-n}Gemn&6jy^qfXmEg(x4FU)uQW)|FWbj1h0!t&(|EnvU>cSh4L-xt{cNyX zaFGdcA0~7Pi8T+P9gy-v^gcH8syfyo(^9&{xOD+Q>!A1R(16YClQT@)Mt}&NMa@G= zKuPLMY7z1S;iT@eT7c9boX9rQ0#pQqgvw0w(MsSXRo~NdPz-Pq4HlY*UIAbBqE%KY z&h+c6SUH@5Gj@F~D}ru3%C6tb#zGCwIEu@tASi;bfw%B8`~Uy| literal 0 HcmV?d00001 diff --git a/resources/flash/gunsur2.nvmem.zip b/resources/flash/gunsur2.nvmem.zip new file mode 100644 index 0000000000000000000000000000000000000000..0db597228f45c0459cf699b4d99cfe393568fc46 GIT binary patch literal 328 zcmWIWW@Zs#U|`^22wqSY)~R^dZv~LY(7?dJ${@p#SC*Ta8ydpNzPJ6)iCbn^FZ>(5C>Qkne zwx#mNFBvVlP%O8-qI_0mdxwR|&ArEhtFG-f-!FJvW9Rn$XO0~f(TqB~B-*_Hd&coi zGv`Nq{r`Rc%UL3&re|MozvR2m?sHkdy?yDW_r81CuM+!tMYlG#_DS*c!h9x>lW~K8 t=U4;08JXmmad}h%u6Ii#hza#JE5zGqUJmePWdkW<1VV2h{T#$$004fKX9)lR literal 0 HcmV?d00001 diff --git a/resources/flash/otrigger.nvmem.zip b/resources/flash/otrigger.nvmem.zip new file mode 100644 index 0000000000000000000000000000000000000000..eff167b43c42cdaec06a668dfcef0170006dc66e GIT binary patch literal 750 zcmWIWW@Zs#U|`^22=y-yd$&0t$&U%hZD3$vWsqUWE6YvI4GrOBU_K}!lOifAlTup2 z&A`a=f|-Ef@_ zS&GYxi*JIrLSR9|lsgU6mZwc<^x`PZ*AcTdpE zx@&*@T}W@HS#aKQCYrDv+(_&g0-Fc&&676M41kk zJ5tXlWU+J7fke_fY(eqYd|Z-1_b@A~%W%OtP=b=kVI_3yX*i@ohLshHi# z&Zhof;;ia=x0iqOIV)H1ubla8zV^op|BwABEqb?d!uDU^%V$5ivuc9< zy8XWMZ`dm4f0gIC^e-QzpJe_DP1XBVWl;LM-GB}dL%*6+OcCo|9X%CG+C`I~<&u!;Y= zPyX4_zn}hm{I341Zsy+IPb;tguAB9}yrts(?_4|G>Cbcj9DU7RT(Q|E{`)okXSct8 z+S9u~as7Y!LrllgujQZmlN#Rf`CjJz_a8pbjry=eOZ$YOfCe$ndSBY-i%Cg%(#-H1l))%jUXm8ak4@ZCtAV` T@MdKLDPjadZy?#+Rjqss{7HZU--GRQFGmF1@9hK6u5Fdr0^N%;rFr4`%^ zj4Ush85qFC+Z*=YhaDu2e~kYZa>bE-_YMz70deaWZzg1WRUa`?^weCpk0Jg3jPAwj z&m31<*)1Z|lC^*ShY5E+KYsA;M9KH8z4tQp-@e{=|K8H+o44(gwr350xb0`53_I5% zg`Or29%aoRZ$-V&f1C1c-&QHUTlX?TS5$dS{n@#xYKin~-d$78BUhe06ls6iX6~z7 zRe{rgMk>wMeJZp($>!S9uYJ30O^(I{pWeLmvQ}nE;@)Pv;{H{Wow)C>IsQCMJ$Bj; zr^-<6@2kI7WR%`mYa4qeB=Vm1)$0?d+65Y)GrzepwEl-)>8fRQlWX&=-|fquuf2Zu ze7VQ_w|!mC3Jf0xh8v7`b{D??CSLfS4a_G*+)$Sf@MdI^W5yNQ5^xi?G=iAWuxEvY YJzBU2c(a17Wn^Gv@CGW*0Yw@E01dLH;s5{u literal 0 HcmV?d00001 diff --git a/resources/flash/wldkicksj.nvmem.zip b/resources/flash/wldkicksj.nvmem.zip new file mode 100644 index 0000000000000000000000000000000000000000..698f7dbc02f4a0e7c4071e94116d6c87448946d0 GIT binary patch literal 447 zcmWIWW@Zs#U|`^2V2UUY3tatvhCCyX+rYrU${@p#SC*Ta8ydpNz^tq+lLEq}72FJr zEH9WD7{J8a8wb5!JBYA7nEXvETzuDsUTHzS4u!J9+NL97vPrWpxpZ02Kk&77U+(>P6+5~^qPP2_ z2LJrM_tN`+Mn3s|Kc+qU^}Um;dY`^Ec~v4>S}r8MbGzx9J?q5_P1hIg@0~ zP0Gt%Jt6m9L&GlmseM%cUe*@-<*o0TqPY8^8?}C0oZI`>H|(x^_%=iTzo-9bT)#JA z>dM}K&p0<4K5 zE{PJJ2lLlQRBcMnd@sHF;exll*OspO?Xz>f#(MW%+wLuhuAHoI8fo$R`K+Vzex0#h;peSevsrR}^xTrjSKgwb zYY(kAf4uN&;`VPjhQXw|!YTYsrnY<6(av?mn|}*00=e``+&Oy{>lQqP%_8 zJ^yd<)j0!$2N*!|5AXF>Z{OchZ4TxWA`aM9G6#4wGRZOH3T+9v5nCETOla7%Lc$&` V+ylH>*+7aIfzTUB=YS%O0RXAxrkVf% literal 0 HcmV?d00001