From 179719adc6b19fa1f151cd66700093b00c8d67f6 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 9 Dec 2019 22:21:05 +0100 Subject: [PATCH] release tool now supports Mega65 full ROM --- Makefile | 4 +- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_mega65.rom | Bin 8192 -> 8192 bytes bin/basic_testing.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_mega65.rom | Bin 8192 -> 8192 bytes bin/kernal_testing.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes bin/newc65.rom | Bin 0 -> 131072 bytes src/release.cc | 159 ++++++++++++++++++++++++++++---------- 11 files changed, 120 insertions(+), 43 deletions(-) create mode 100644 bin/newc65.rom diff --git a/Makefile b/Makefile index 338def52..4f22c87b 100644 --- a/Makefile +++ b/Makefile @@ -84,8 +84,8 @@ clean: @rm -rf build c64/basic/combined.s c64/kernal/combined.s updatebin: - $(MAKE) -j64 --output-sync=target $(STD_TARGET_LIST) $(TOOL_RELEASE) - $(TOOL_RELEASE) -i ./build -o ./bin basic_generic.rom kernal_generic.rom basic_testing.rom kernal_testing.rom basic_mega65.rom kernal_mega65.rom basic_ultimate64.rom kernal_ultimate64.rom + $(MAKE) -j64 --output-sync=target $(STD_TARGET_LIST) $(EXT_TARGET_LIST) $(TOOL_RELEASE) + $(TOOL_RELEASE) -i ./build -o ./bin basic_generic.rom kernal_generic.rom basic_testing.rom kernal_testing.rom basic_mega65.rom kernal_mega65.rom basic_ultimate64.rom kernal_ultimate64.rom newc65.rom cp build/chargen.rom bin/chargen.rom # Rules - tools diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index b05583c6af43dc061fc9a55c7a73f2b4df5f570a..f35100af88e2d6c7313311859012e95170594896 100644 GIT binary patch delta 167 zcmZp0XmFU|p?U1fN_&M%|1(x8%wMbU^z9-=AidP;p4`+0nyo}wDGxGh?4GNL(72GC2 gV0Q+pP~nJR0aCR*Zj3;Mn~(C&6l64;9525R07#`9J^%m! diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index dfcaafab36c811449f796e15463db6598a88b851..6583b51e0fa07e6096664b8ea1558fc2522fec70 100644 GIT binary patch delta 34 qcmZp0XmHpd!p^?oozLX=3<;AJ*=;5pu(NHBWoMLNw459-zYqY@0}BEG delta 34 qcmZp0XmHpd!p^?yozJxQ3<;AJ*=;5pu(NHBWoMLNG@BeRzYqY^Jqru~ diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index 16b3cd5e362d5211ba5ca01ecb09687fde7599ec..458494d42ff2c2b34b24f2a0dd45c63bedd2340d 100644 GIT binary patch delta 2222 zcmZ8iYfuzd7VZbkOJRCcU_c(%KokN>@JTjhd}Jj<>MCn$HToypu3KizN|{ahgKVvf z?mA{-GU0KF3%+VHOk0dwm_g%%Y_Xys%dlmojYuE@nyd_(TDp69&cMLz>Cvj)+OF!` z=iYPgckVgoJExCqJhIW-!!jM?q?aAZcx6S=>njQ?4~S9ag+7%2%g6UKSt=b^7?vsu!f4 zHC3@kDry$RJ(b;OPFHSzt*n&a`KtW*?^lQ;cJq9I@ zlV3J=aow#EMTepgN~UL{?Ka;?_vaX$Y~QbBCC1JL`Q~?J+eGtkW!q%)Ub&(Dw(^T( zw>^oDPZ^=(&c}>*AF=9=(^?|y%=8YT(=Xp(l7(9~w;7pabal>2HMKpTK#0bKuhBO{ zFdQBA{1D9}WHGvC=6SR-0O{CD4(Yeih_vbd7~cm;v9&5%p;ctjLsDW$q0e1@&+t2z z48<9B=;uTD@G#m!=y;Okkt{-u5>tpOLRP+!8qjk&-#MrO;*4LE_G1XYA8`G$@jRn2 zt`e*Tix6+t6XAtQo(#mlnzV9;o60H2-$ryoy^mI6vT;Qy8?Pn#Ml(|_kz(UgE#^50bjY}4rWPc4lAq#bAPy$9W!@{YkgufXge>E;k%9p`i{)DC0qANqk zLx>Nd@Ce-asqtWWwFJ)9SR1StaB;BK;;vN;_U7FTYK!1^6>9@pHHP;D)uU*A2*u2T zPaKQiRsh3{PXZ;{uPLUczjd}>GmCT~#L^_=S_KR{UsSiwvx`BYo}1^Plvt#bfQj|| zvBEVKD_5^8Se(1u5l6n`RXqkZhVy0K$5m>4yuuXn zW*&zo$tF`eJxF*{;v3)%_@t9uCNTOEXY3NE(7qrl4WUU@=%Z24BmDW80gQXI!3r8A zrx&ba!Xu=6!EWZp1j%2R`o^9hsb^E%=;`PB+3YUzzYg-L~@Jdj)UbmYOzOLKL z2+eh+Oy{v$Ab8X_I$-AiYwB|K!gPAoo*3ow))eXj;!^8_xAc;bMI!aXjbqlb$D zn)IN|33pF(AH}gKlRQ~uNyD#4@D@0$HpP;N^_j3HC|m=m9b}1SxwdPLS@cIkrmv$)rwb49Q*S4#S2$x+pQ~< z?dE}%EW{GvzbE4fOQFseCno1>Wf%1s5}$ChE)9Ht5)~dU*=_5!{R4k8_57mv?6l`d zT_1(ck-dp06NNgs+2#O#C*XIA8vhq!tlx!;2$z&dhsd&|n#`-y`1ivI$-WZN(9m?( zhZGjd+qvwSh~An+hzusZK<5$KoDdJaY+kgN?cdaZb4ZrC>StS|^SyB91L^!dk#qMb z1sy#AC)~H)dj{;j*M46~v3EAzwO8HkY#Osyjdix)7iGYe%_;E1F(m&QT54%>_Uc`s zG9Y!O1~C$R(RP*2F0H5)>J=7w6~Xsu{6t0O@Krk7PR9re+IhE4z*1$U0|Ld%Azpjgh=ARXDA@>=5lfKY>vPV>UJ?|~Q+ z#(b@c0inx{DYZB(6t6>WmGhUMkc-2)g^Hh?$wGq#&KW<`Da|kpodO<34I&sgx}mG`YP*amP3ckebxYl|@rR6}JG4%y%6@n%ORR?c!52U&sS4 zN{Z~l>mwlT0+N>Xx+160FnO9ftFM;YZrv$-8U2&UY46a(WLx^jz^&f&bPaGT2Wd$- z{e?KKjM<2Amb>X%0xP*0$%bf=tEIl1Y|BWaKO_e-a=b@9f(=8?eiy}4)Is^j IF#FSg06~8%_y7O^ delta 2184 zcmZ8idr(x@8NZKxupsUQ1G~Hr@dZ*7P@^lHo3_d!O&d^LP zn7VeOZUP=^K%?0#dmYvUvuGnB9Y$2NEHh3o0TBa4(+DV2?!7E5?DE=vcjb>xcV^H1 z&iT&yzWe>o@Aut`%@v!yJuEXZN_yGRjPaZh5zMfF0rwpY>A z;N#?}CZAqT(zIEYKLpV^sreA&<3%01E#uGq+9x(QI;MD8RG?0IymE{zi83ty=xlu2 z#keZA;^XRZy7XP6%@{cvdF@U5DsBy4?QtPcuJB8ztuOTub>-H`1nsv9DIO2|lTki2Kn#d)s- zeKjv!&CU=PowA@p(wLAO4=#gHnY~$L1vhWCV*L=gq5Cy`j%f7n(PzjX^+(I!lKw;Y zixy#0DR73-^ps2AvQctS{Vh3CEZy%5D@m|Bs)Y-sZ=AU6NpzfH zgnRctWW4VXYt%{FMC2$ly_-ZCRu^Q-!fl(|j51|(W8O(M-dUL3oEOIdh)xNH<9^SN z5$pl^$eNkw(V8)Uub8}ND5i7C9mAg&e?Q})Y^{o3XcbxXgp@=l)1O^`H~RN1Im$+p zzF1?dCl-GfM!y`y$A-}^;*TXe8YGKQt!VO5Wys2VC`T0oK2L=>Db)FBK>w!@K04;w z)o__n7*`24L3$q}vYs$6RPsO&PuN!HDNvbkfAL1s+8J&tyBu;vsmB#f7Oo6s;SD6i zXl6o_*BnQNd1 zI2OODKnyefB;=&pnv}T4f3&wXnMFDuFwK;4jRJ|C%hjzhb}=Z_aWNiB(IS)Np>1{i ziTu|-UbAjPUP{htM=W{Bty^Cd6q-?*3V#uZM8PM=7cL`cP!=SD3uNBMRqA}a!sPR2 z9^acFTjJ7biSTiWg-{LDWRhHQkaQJi>=38Wfgm~@LR!`1(t9WilpJwRTi>-flOkrc zJ+jY=Z;f?ukI`Y$5|^%1A;bgZ$GE(5C>&{J^|k!X`x(Xf0@TNYK2}kM25YujK+ep= zfQy4LqQgO`L7i?5s+j#>1k;NM2dDlg!g;*juO8T`_6P7sP%t3;xAAC5?#+TMNFo>F zH!v|0>5kva)C`eVm!uZ%3&LG->RsLaMr84(U@L`7#@#io(GcPFpzuxYUPkz~c0VID z*B)ZpPt*X>Bel_EW|e6Rsji=0l1}IEgJ$8=LzvtE8c_jA8NxflLM^Op9m8*r30+*m zy&g^jTc&wYMgSjFW2R zL-^bz1) zVJC~e2-wBx4lw|R%K*oGi~mkypIq5>+lb=!Jv|HNme7V5&6racw4k0|sR*`IjM1Y9w2 z*$*Am06*jubwi(v+94M%Bt}yrJxx}as`X9N`2As&OKzD`pmz+IUZyvmH76{Fju#W@ zcn7!C<5gs-x$5;@(&b)-#mA+~T_Wf1QS$Efpj=saVC#xRklkHv50qqkdt;})scf(mrUsrAb-q_J+!U@|8LiC&3f#RLSnri+Z6>VUbr6+(kCG zR|g`%Z4t>I978)vdlJ(9R#wG8q@)dN4+K^9tFp8@5=78JStWC?E+Tj66R=TmXB)4y zltc{0a=99r$e!d)iCRgh#ve@c!i29+3<=}DRwWwcUjH&Vhc1Wj3~fN7Mxe7F+h`tr zKO=nVKq5XOH6YRUDN38ePiD%%%PDED*N{o}P|nm^s@u*@qrxdPI_YgzouVIJs})U* zV*d;po^kDfozTv&q3^=&K&VOd_gQZx`efF--N`jxv)yWk;WiB9&D3=U{|s<^VifsF zb?VYJg;PQm7Z3Rsxhjxut^@vd@wu7L=OHjMh4IlQEz&>4p@{8NX(|c9BYy>8x}5dw_KU9l9Q1X9cck-Blry| z&Pb!*C#4xVS%af^`8-yh;lB*yGjsT~gg=lmGYpLqANOPXIKC_4Gzl*wH#5?fl}Y#= isWgi%UB#CEjK!KMJTi)-2c7*cil?X}^1o-yo diff --git a/bin/kernal_testing.rom b/bin/kernal_testing.rom index a83f643a2faf3c62210e13a8d67b1ae535f8ec53..fc7df33b984c6010b7048ca8c011d290d326abca 100644 GIT binary patch delta 2279 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 bU&)g?oorW0>ahEtA|o(NqxSGW{OErHQ$l9> diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index 5792dd5e3aa0390c93d101346a23483792a24398..cc82b2e144ce8593d5e35634244e7d7ca93aa7d7 100644 GIT binary patch delta 2612 zcmZ8j4^R}>8Q;6*I1WS>P&h#0DH=Hc6}39FAqg4(aCTlaZPSc)I@7H>&6&}*PA3!E z)Bqiqq74dpI0cExx!y7?20fE$6`e~#6yy?h^$0=%HCFB*iR?R&y91Q#w};JiI&<^( zd+&YUyzk%d_g!gWX`%B58{JPOC+a8NtbfN3R&Cy}YBj^~Jnoj6!(!t7IAuuW3W1n2R-FIXgcWdH1zPu zK7{WMkxWC*mXAZ|rSX=1`Yv9HMtdkeIcB&oI8dD5$s$JE^7v?wB*&QM9(g}$;fcg* zw)AMty!hK+Opn)By|Jr!AOHHC=kwM)+D?ubo==tPQ1v)i>V4Ajh=ku!d3iOtpStK5 zZ9bW)Gz`i!l~IG}u@8lPsLE^S(CgmnPp-AjSM+wKl~bs8l|AhIx6BCj=!93hZr@Z7 z@;_&kG1xVM!ozxn#a+YLGc4-_7uxM5hZf{+-tB$PCAqrv$^^zE&k{4q(nMQnO9yHMic`qhgKNBG5V$$O7`cP_kJANUI?vgKK z)|6C+PXyXv9E11Dor}_9W3qM}CaImHPB2nk&#??>5a~`1wLs1tetX#ZvTB@Q^ za=e+xAE|KFE%XYVxHBl1Dtg#<;(D?_A+_jeP`U_B#L8h_s^Z1hnj7>~FK)wbRXWwB zgT_mr!oTxNcTi&(n#AwN5B#FR#g-0AqY4Y{#zUosT_?%SgmjA(!et>_qYeKd6r)+w zs9fARnTu~s9k$k5(Y;Yr6o3`ClO%23Ky4n1lQ<7R4WL~F-!T?nG8f!CX$ONs*j-QY6P z&#ljUYZ660ZDs~J7GJ0Eh8f=gbX+-46VF|`cICWT(d9#p{VIOW45CS^fY1ij+yCVDT^OyXF?r>V&=7M3ZyV;-b?>yk~(Yh z$Nx1sj@OTA28T43`z~<^ixhPelC(Cykb;92qflcHqdwwE`gy^XC-^jFP}dOTt4?Nx z;~EFhsC?8pY2#5{2r|uSnZ9~KVewm`Rt9eycht7Vg6sRqp5zSO9wH=XC;e8fWCmJ( zuddV$D5mC0ecIdPVscK&-$%cNgH2L^7TCk0(e-o`)LaHNUN_JcrfIEVWr^L`_jFV- z)tV1Xj5gx5#}%BKm*D2QTf;O4MeJ#|Tqs=Sn{@-01UuW8M`=_A7vfv;sW8z}K!rfd z_i5vmt2FE2RXL^dJ-yU%{gB?dPG&0!KkwD#x)3zD5xi%-s1n#37d`p3ecp1Nu8yel zmuI+D8%?!}db=LY8M0YXKea*I8^m8DH(8gm)U?7Um)7+$XeHT|^0pqZHITBnL@tFm zz@aT+p;|7Pl?~NGHE&-E3FhJ|l#q0ai<22@fc61~JH<;LlTq+!*q+6DOovDESV9pd zc-H*qCdF{1fsD{-xzMK?1RUq-d>}K(cUeek0X_pMqbvlRhReslqapfih+&4DO-)Og z2}mcq(v_ejc5PGqP+CzqNk@oc_?~f-#y03TL~mZAGm#uK($y2IITzOb=F$ZzYC|t& zVazso6wc8@S9kQFm&c?pH8)9oT22zM%%CtKKNbQ|Ws9-N^@wav+o@|Oa$4?=s>xyq zw<;R7jlvfl(r_Xg6{B>DvM4nuIesKKoY8WQ4r$H1V zFOHA~q5v_nEIr@yVFch>GHsRf6#$py;pTVra8VFn59*k5^tALb9E&>0U(~CYmJ+;^ zyp~a9>9=#`+;g>F6(&cH%`7M-=_Bh~pnIx*v{L}zEDGnOo6&SC4b8Tn^hlT>9X zr2R1DW?zFr2l^)MRAD8DHj&ppDee`+$I%5cvS5vFoGe)QE|jx=;V*NbTBS+=;2UA` z=f{9oz?rHD#q7|Vcy!*YZOEd`6}k&#Yvv1cfqNnsZwy5)>M~!13DldJxz4SM7MRT% zmT0VW7H}e+!LVG`q&7`D!Ce>gKn1g5klVyXfS~1BX|a*1fMBgATeG&OZdGxr59@sz z&6bVfV-){I#okfk%F0@@TE$uF-duL?GIs9@7B>X(H^Vq~$UY!4Ji{z}`rrxs^?v|G C{3WOW delta 2640 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 ROM_DEFINITIONS = { { "BASIC", - 8192, // file size - 0x1F52, // signature offset - true, // whether to require BASIC ID - false // whether to require KERNAL ID + 8192, // file size + 0x1F52, // signature offset 1 + 0, // signature offset 2 + 0x0004, // BASIC ID offset + 0 // KERNAL ID offset }, { "KERNAL", - 8192, // file size - 0x04B9, // signature offset - false, // whether to require BASIC ID - false // whether to require KERNAL ID + 8192, // file size + 0x04B9, // signature offset 1 + 0, // signature offset 2 + 0, // BASIC ID offset + 0x1F80 // KERNAL ID offset + }, + + { + "MEGA65", + 128 * 1024, // file size + 0xBF52, // signature offset 1 + 0xE4B9, // signature offset 2 + 0xA004, // BASIC ID offset + 0xFF80 // KERNAL ID offset }, }; -const uint16_t MAX_FILE_SIZE = 8192; +const uint32_t MAX_FILE_SIZE = 128 * 1024; const std::vector STR_MEGABAS = { 0x4D, 0x45, 0x47, 0x41, 0x42, 0x41, 0x53, 0x32 }; const std::vector STR_OR = { 0x4F, 0x52 }; @@ -365,33 +377,49 @@ void ROMFile::recognizeSrcFile() { // Recognize source file type - for (auto &SPEC : ROM_DEFINITIONS) + auto checkSignature = [this](size_t signatureOffset) -> bool { - if (srcFileContent.size() != SPEC.fileSize) continue; - - if (SPEC.requireIdBASIC && memcmp(&srcFileContent[0x0004], STR_MEGABAS.data(), STR_MEGABAS.size()) != 0) + if (signatureOffset == 0) { - continue; + return true; } - if (SPEC.requireIdKERNAL && srcFileContent[0x1F80] != 0xF0) + if (memcmp(&srcFileContent[signatureOffset], STR_OR.data(), STR_OR.size()) != 0) { - continue; + return false; } - if (memcmp(&srcFileContent[SPEC.signatureOffset], STR_OR.data(), STR_OR.size()) != 0) - { - continue; - } - - auto snapshotStrOffset = SPEC.signatureOffset + STR_OR.size() + 1; + auto snapshotStrOffset = signatureOffset + STR_OR.size() + 1; if (memcmp(&srcFileContent[snapshotStrOffset], STR_SNAPSHOT.data(), STR_SNAPSHOT.size()) != 0) { - continue; + return false; } auto zeroByteoffset = snapshotStrOffset + 0x10; if (srcFileContent[zeroByteoffset] != 0) + { + return false; + } + + return true; + }; + + for (auto &SPEC : ROM_DEFINITIONS) + { + if (srcFileContent.size() != SPEC.fileSize) continue; + + if ((SPEC.idBasicOffset != 0) && + memcmp(&srcFileContent[SPEC.idBasicOffset], STR_MEGABAS.data(), STR_MEGABAS.size()) != 0) + { + continue; + } + + if ((SPEC.idKernalOffset != 0) && srcFileContent[SPEC.idKernalOffset] != 0xF0) + { + continue; + } + + if (!checkSignature(SPEC.signatureOffset1) || !checkSignature(SPEC.signatureOffset2)) { continue; } @@ -411,19 +439,26 @@ void ROMFile::dropUnmatchingDst() { // Drop unmatching destination file data - if (!dstFileContent.empty() && descPtr->requireIdBASIC && - memcmp(&dstFileContent[0x0004], STR_MEGABAS.data(), STR_MEGABAS.size()) != 0) + if (!dstFileContent.empty() && (descPtr->idBasicOffset != 0) && + memcmp(&dstFileContent[descPtr->idBasicOffset], STR_MEGABAS.data(), STR_MEGABAS.size()) != 0) { dstFileContent.clear(); } - if (!dstFileContent.empty() && descPtr->requireIdKERNAL && dstFileContent[0x1F80] != 0xF0) + if (!dstFileContent.empty() && (descPtr->idKernalOffset != 0) && + dstFileContent[descPtr->idKernalOffset] != 0xF0) { dstFileContent.clear(); } - if (!dstFileContent.empty() && - memcmp(&dstFileContent[descPtr->signatureOffset], STR_OR.data(), STR_OR.size()) != 0) + if (!dstFileContent.empty() && (descPtr->signatureOffset1 != 0) && + memcmp(&dstFileContent[descPtr->signatureOffset1], STR_OR.data(), STR_OR.size()) != 0) + { + dstFileContent.clear(); + } + + if (!dstFileContent.empty() && (descPtr->signatureOffset2 != 0) && + memcmp(&dstFileContent[descPtr->signatureOffset2], STR_OR.data(), STR_OR.size()) != 0) { dstFileContent.clear(); } @@ -431,21 +466,54 @@ void ROMFile::dropUnmatchingDst() void ROMFile::analyzeContent() { - auto revOffset = descPtr->signatureOffset + 3; + auto revOffset1 = (descPtr->signatureOffset1 != 0) ? (descPtr->signatureOffset1 + 3) : 0; + auto revOffset2 = (descPtr->signatureOffset2 != 0) ? (descPtr->signatureOffset2 + 3) : 0; + + if (revOffset1 == 0) + { + revOffset1 = revOffset2; + revOffset2 = 0; + } + + if (revOffset1 == 0) + { + return; + } if (dstFileContent.empty()) { return; } + // If two ID strings are present, they should be the same + + if (0 != revOffset1 && 0 != revOffset2 && + memcmp(&dstFileContent[revOffset1], &dstFileContent[revOffset2], 0x10) != 0) + { + return; + } + // Check if meaningful file content is really different - if ((memcmp(&srcFileContent[0x0000], &dstFileContent[0x0000], revOffset) == 0) && - (memcmp(&srcFileContent[revOffset + 0x10], &dstFileContent[revOffset + 0x10], - descPtr->fileSize - revOffset - 0x10) == 0)) + sameContent = true; + for (uint32_t idx = 0; idx < descPtr->fileSize; idx++) { - sameContent = true; - } + if (revOffset1 != 0 && idx - revOffset1 < 0x10) + { + continue; + } + + if (revOffset2 != 0 && idx - revOffset2 < 0x10) + { + continue; + } + + if (srcFileContent[idx] != dstFileContent[idx]) + { + sameContent = false; + break; + } + } // Determine expected length of developer ID @@ -453,12 +521,12 @@ void ROMFile::analyzeContent() // Determine if old version is a devel version compatible with this tool - if (memcmp(&dstFileContent[revOffset], STR_DEV.data(), STR_DEV.size()) != 0) + if (memcmp(&dstFileContent[revOffset1], STR_DEV.data(), STR_DEV.size()) != 0) { return; } - uint16_t idxDate = revOffset + STR_DEV.size(); + uint16_t idxDate = revOffset1 + STR_DEV.size(); uint16_t idxLimit = idxDate + ENV_dateString.length(); uint16_t idx = idxDate; @@ -503,8 +571,17 @@ void ROMFile::embedRevisionStr(const std::string &newRevisionStr) while (revStr.length() < 16) revStr = revStr + '\0'; - memcpy(&srcFileContent[descPtr->signatureOffset + 3], - revStr.data(), revStr.size()); + if (descPtr->signatureOffset1 != 0) + { + memcpy(&srcFileContent[descPtr->signatureOffset1 + 3], + revStr.data(), revStr.size()); + } + + if (descPtr->signatureOffset2 != 0) + { + memcpy(&srcFileContent[descPtr->signatureOffset2 + 3], + revStr.data(), revStr.size()); + } } void ROMFile::save()