/* IPS module for Rom Patcher JS v20200502 - Marc Robledo 2016-2020 - http://www.marcrobledo.com/license */ /* File format specification: http://www.smwiki.net/wiki/IPS_file_format */ const IPS_MAGIC='PATCH'; const IPS_MAX_SIZE=0x1000000; //16 megabytes const IPS_RECORD_RLE=0x0000; const IPS_RECORD_SIMPLE=0x01; function IPS(){ this.records=[]; this.truncate=false; } IPS.prototype.addSimpleRecord=function(o, d){ this.records.push({offset:o, type:IPS_RECORD_SIMPLE, length:d.length, data:d}) } IPS.prototype.addRLERecord=function(o, l, b){ this.records.push({offset:o, type:IPS_RECORD_RLE, length:l, byte:b}) } IPS.prototype.toString=function(){ nSimpleRecords=0; nRLERecords=0; for(var i=0; inewFileSize){ newFileSize=rec.offset+rec.length; } }else{ if(rec.offset+rec.data.length>newFileSize){ newFileSize=rec.offset+rec.data.length; } } } if(newFileSize===romFile.fileSize){ tempFile=romFile.slice(0, romFile.fileSize); }else{ tempFile=new MarcFile(newFileSize); romFile.copyToFile(tempFile,0); } } romFile.seek(0); for(var i=0; i6){ // separate a potential RLE record original.seek(startOffset); modified.seek(startOffset); previousRecord={type:0xdeadbeef,startOffset:0,length:0}; }else{ // merge both records while(distance--){ previousRecord.data.push(modified._u8array[previousRecord.offset+previousRecord.length]); previousRecord.length++; } previousRecord.data=previousRecord.data.concat(differentData); previousRecord.length=previousRecord.data.length; } }else{ if(startOffset>=IPS_MAX_SIZE){ throw new Error('files are too big for IPS format'); return null; } if(RLEmode && differentData.length>2){ patch.addRLERecord(startOffset, differentData.length, differentData[0]); }else{ patch.addSimpleRecord(startOffset, differentData); } previousRecord=patch.records[patch.records.length-1]; } } } if(modified.fileSize>original.fileSize){ var lastRecord=patch.records[patch.records.length-1]; var lastOffset=lastRecord.offset+lastRecord.length; if(lastOffset