From e807f5ede0f610d3da130a45ffa9fac9699cd538 Mon Sep 17 00:00:00 2001 From: Marc Robledo Date: Sat, 22 Jul 2017 19:57:15 +0200 Subject: [PATCH] updated everything to match the new style and features --- RomPatcher.js | 40 ++++++++++++++++------ index.html | 92 ++++++++++++++++++++++++++++++--------------------- ips.js | 7 ++-- ups.js | 9 ++--- 4 files changed, 92 insertions(+), 56 deletions(-) diff --git a/RomPatcher.js b/RomPatcher.js index ed3ab96..1a5725f 100644 --- a/RomPatcher.js +++ b/RomPatcher.js @@ -13,10 +13,11 @@ addEvent(window,'load',function(){ el('input-file-patch').value=''; el('input-file-rom1').value=''; el('input-file-rom2').value=''; + el('input-file-flip').value=''; addEvent(el('input-file-rom'), 'change', function(){ romFile=new MarcBinFile(this, function(){ - el('rom-info').value=''; + el('rom-info').innerHTML=''; sha1(romFile); romHashes.crc32=crc32(romFile); romHashes.md5=md5(romFile); @@ -24,8 +25,8 @@ addEvent(window,'load',function(){ var crc32str=romHashes.crc32.toString(16); while(crc32str.length<8) crc32str='0'+crc32str; - el('rom-info').value+='CRC32: '+crc32str+'\n'; - el('rom-info').value+='MD5: '+romHashes.md5+'\n'; + el('rom-info').innerHTML+='CRC32: '+crc32str+'
'; + el('rom-info').innerHTML+='MD5: '+romHashes.md5+'
'; }); }); addEvent(el('input-file-patch'), 'change', function(){ @@ -57,9 +58,13 @@ function _readPatchFile(){ } function openPatchFile(f){tempFile=new MarcBinFile(f, _readPatchFile)} function applyPatchFile(p,r){ - var patchedROM=p.apply(r); - patchedROM.fileName=r.fileName.replace(/\.(.*?)$/, ' (patched).$1'); - patchedROM.save() + if(p && r){ + var patchedROM=p.apply(r); + patchedROM.fileName=r.fileName.replace(/\.(.*?)$/, ' (patched).$1'); + patchedROM.save() + }else{ + MarcDialogs.alert('No ROM/patch selected'); + } } @@ -71,11 +76,22 @@ function createPatchFile(){ if(el('radio-'+MODES[i]).checked) mode=MODES[i]; - if(mode==='ips'){ - createIPSFromFiles(romFile1, romFile2).export().save(); - }else if(mode==='ups'){ - createUPSFromFiles(romFile1, romFile2).export().save(); + if(!romFile1 || !romFile2){ + MarcDialogs.alert('No original/modified ROM file specified'); + return false; + }else if(mode==='ips' && (romFile1.fileSize>MAX_IPS_SIZE || romFile2.fileSize>MAX_IPS_SIZE)){ + MarcDialogs.alert('Files are too big for IPS format'); + return false; } + + + var newPatch; + if(mode==='ips'){ + newPatch=createIPSFromFiles(romFile1, romFile2); + }else if(mode==='ups'){ + newPatch=createUPSFromFiles(romFile1, romFile2); + } + newPatch.export().save(); } @@ -101,7 +117,7 @@ function sha1(file){ else hexString+=bytes[i].toString(16); romHashes.sha1=hexString; - el('rom-info').value+='SHA-1: '+romHashes.sha1+'\n'; + el('rom-info').innerHTML+='SHA-1: '+romHashes.sha1+'
'; }).catch(function(error){ console.error(error); }); @@ -168,6 +184,8 @@ function crc32(file,ignoreLast4Bytes){ } +/* MarcDialogs.js */ +MarcDialogs=function(){function e(e,t,n){a?e.attachEvent("on"+t,n):e.addEventListener(t,n,!1)}function t(){s&&(o?history.go(-1):(c.className="dialog-overlay",s.className=s.className.replace(/ active/g,""),s=null))}function n(e){for(var t=0;t0;e++)d+=String.fromCharCode(c[e]);return d},MarcBinFile.prototype.writeByte=function(a,b){this.fileReader.dataView.setUint8(a,b,this.littleEndian)},MarcBinFile.prototype.writeByteSigned=function(a,b){this.fileReader.dataView.setInt8(a,b,this.littleEndian)},MarcBinFile.prototype.writeBytes=function(a,b){for(var c=0;c - ROMPatcher.js + RomPatcher.js - + - + + + - - -
-
- This small web app allows you to apply a IPS/UPS patch to your favorite retro games. -
- - - - - -
-

Apply patch

+ +
+

Apply patch

+
Apply an IPS/UPS patch to your ROM
+
-
-
+
+
- +
-
-
+
+
- +
-
- - -
-

Create patch

+

Create patch

+
Create an IPS/UPS patch from two different ROMs
+
-
+
-
+
-
Patch type
+
Patch type
@@ -87,13 +84,32 @@
- +
+
+ + +

Byte flipper

+
This tool can flip bytes on a file in order to change its endianness
+
+
+
+
+
+
+
Bytes to flip
+
+ + +
+
+
+ +
- \ No newline at end of file diff --git a/ips.js b/ips.js index c3302af..e7d3374 100644 --- a/ips.js +++ b/ips.js @@ -1,5 +1,6 @@ -/* IPS module for RomPatcher.js v20170721 - Marc Robledo 2016-2017 - http://www.marcrobledo.com/license */ +/* IPS module for RomPatcher.js v20170722 - Marc Robledo 2016-2017 - http://www.marcrobledo.com/license */ /* File format specification: http://www.smwiki.net/wiki/IPS_file_format */ + var MAX_IPS_SIZE=16777216; var RECORD_RLE=0x0000; var RECORD_SIMPLE=1; @@ -79,12 +80,12 @@ IPS.prototype.apply=function(romFile){ var rec=this.records[i]; if(rec.type===RECORD_RLE){ if(rec.offset+rec.length>romFile.fileSize){ - alert('Invalid ROM file (too big?).'); + MarcDialogs.alert('Invalid ROM file (too big?).'); return false; } }else{ if(rec.offset+rec.data.length>romFile.fileSize){ - alert('Invalid ROM file (too big?).'); + MarcDialogs.alert('Invalid ROM file (too big?).'); return false; } } diff --git a/ups.js b/ups.js index 10c3485..e61d3b1 100644 --- a/ups.js +++ b/ups.js @@ -1,7 +1,8 @@ /* UPS module for RomPatcher.js v20170721 - Marc Robledo 2017 - http://www.marcrobledo.com/license */ /* File format specification: http://www.romhacking.net/documents/392/ */ -/* https://github.com/btimofeev/UniPatcher/blob/master/app/src/main/java/org/emunix/unipatcher/patcher/UPS.java */ + var UPS_MAGIC='UPS1'; + function UPS(){ this.records=[]; this.sizeInput=0; @@ -63,7 +64,7 @@ UPS.prototype.export=function(){ } UPS.prototype.apply=function(romFile){ if(crc32(romFile)!==this.checksumInput){ - alert('Invalid input ROM.'); + MarcDialogs.alert('Invalid input ROM'); return false; } @@ -84,7 +85,7 @@ UPS.prototype.apply=function(romFile){ } if(crc32(tempFile)!==this.checksumOutput){ - alert('Invalid output ROM.'); + MarcDialogs.alert('Invalid output ROM'); return false; } @@ -161,7 +162,7 @@ function readUPSFile(file){ patchFile.checksumPatch=tempFile.readInt(seek+8); if(patchFile.checksumPatch!==crc32(file, true)){ - alert('Invalid patch checksum.'); + MarcDialogs.alert('Invalid patch checksum'); } return patchFile; }