mirror of https://github.com/rusefi/RomRaider.git
Add Nissan checksum ALT & ALT2 calculator Class
This commit is contained in:
parent
49c912cd0b
commit
c8acdee563
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
* RomRaider Open-Source Tuning, Logging and Reflashing
|
||||||
|
* Copyright (C) 2006-2019 RomRaider.com
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.romraider.maps.checksum;
|
||||||
|
|
||||||
|
import static com.romraider.maps.checksum.ChecksumALT2.SKIPLOC;
|
||||||
|
import static com.romraider.maps.checksum.NissanChecksum.END;
|
||||||
|
import static com.romraider.maps.checksum.NissanChecksum.START;
|
||||||
|
import static com.romraider.maps.checksum.NissanChecksum.SUMLOC;
|
||||||
|
import static com.romraider.maps.checksum.NissanChecksum.SUMT;
|
||||||
|
import static com.romraider.maps.checksum.NissanChecksum.XORLOC;
|
||||||
|
import static com.romraider.maps.checksum.NissanChecksum.XORT;
|
||||||
|
import static com.romraider.xml.RomAttributeParser.parseByteValue;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.romraider.Settings;
|
||||||
|
|
||||||
|
public final class CalculateALT2 implements Calculator {
|
||||||
|
|
||||||
|
public CalculateALT2() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void calculate(
|
||||||
|
Map<String, Integer> range,
|
||||||
|
byte[] binData,
|
||||||
|
Map<String, Integer> results) {
|
||||||
|
|
||||||
|
int sumt = 0;
|
||||||
|
int xort = 0;
|
||||||
|
int dw = 0;
|
||||||
|
for (int i = range.get(START); i < range.get(END); i += 4) {
|
||||||
|
if ((i == range.get(SUMLOC))
|
||||||
|
|| (i == range.get(XORLOC)
|
||||||
|
|| (i == range.get(SKIPLOC)))) continue;
|
||||||
|
dw = (int)parseByteValue(binData, Settings.Endian.BIG, i, 4, true);
|
||||||
|
sumt += dw;
|
||||||
|
xort ^= dw;
|
||||||
|
}
|
||||||
|
results.put(SUMT, sumt);
|
||||||
|
results.put(XORT, xort);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* RomRaider Open-Source Tuning, Logging and Reflashing
|
||||||
|
* Copyright (C) 2006-2019 RomRaider.com
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.romraider.maps.checksum;
|
||||||
|
|
||||||
|
import static com.romraider.maps.checksum.NissanChecksum.END;
|
||||||
|
import static com.romraider.maps.checksum.NissanChecksum.START;
|
||||||
|
import static com.romraider.maps.checksum.NissanChecksum.SUMLOC;
|
||||||
|
import static com.romraider.maps.checksum.NissanChecksum.SUMT;
|
||||||
|
import static com.romraider.maps.checksum.NissanChecksum.XORLOC;
|
||||||
|
import static com.romraider.maps.checksum.NissanChecksum.XORT;
|
||||||
|
import static com.romraider.xml.RomAttributeParser.parseByteValue;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.romraider.Settings;
|
||||||
|
|
||||||
|
public final class CalculateSTD implements Calculator {
|
||||||
|
|
||||||
|
public CalculateSTD() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void calculate(
|
||||||
|
Map<String, Integer> range,
|
||||||
|
byte[] binData,
|
||||||
|
Map<String, Integer> results) {
|
||||||
|
|
||||||
|
int sumt = 0;
|
||||||
|
int xort = 0;
|
||||||
|
int dw = 0;
|
||||||
|
for (int i = range.get(START); i < range.get(END); i += 4) {
|
||||||
|
if ((i == range.get(SUMLOC)) || (i == range.get(XORLOC))) continue;
|
||||||
|
dw = (int)parseByteValue(binData, Settings.Endian.BIG, i, 4, true);
|
||||||
|
sumt += dw;
|
||||||
|
xort ^= dw;
|
||||||
|
}
|
||||||
|
results.put(SUMT, sumt);
|
||||||
|
results.put(XORT, xort);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* RomRaider Open-Source Tuning, Logging and Reflashing
|
||||||
|
* Copyright (C) 2006-2019 RomRaider.com
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.romraider.maps.checksum;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Calculator interface is implemented by CalculateXXX classes
|
||||||
|
* which perform the actual checksum calculation.
|
||||||
|
*/
|
||||||
|
public interface Calculator {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the sum and xor total over the address range provided.
|
||||||
|
* @param range - a map of with the address ranges use.
|
||||||
|
* @param binData - the binary data t calculate over.
|
||||||
|
* @param results - a map containing the keys for sumt and xort
|
||||||
|
*/
|
||||||
|
void calculate(
|
||||||
|
Map<String, Integer> range, byte[] binData, Map<String, Integer> results);
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* RomRaider Open-Source Tuning, Logging and Reflashing
|
||||||
|
* Copyright (C) 2006-2019 RomRaider.com
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.romraider.maps.checksum;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class implements the "alt" checksum validation and calculations
|
||||||
|
* for Nissan ROMs.
|
||||||
|
*/
|
||||||
|
public final class ChecksumALT extends NissanChecksum {
|
||||||
|
|
||||||
|
public ChecksumALT() {
|
||||||
|
calculator = new CalculateSTD();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* RomRaider Open-Source Tuning, Logging and Reflashing
|
||||||
|
* Copyright (C) 2006-2019 RomRaider.com
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.romraider.maps.checksum;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.romraider.util.HexUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class implements the "alt2" checksum validation and calculations
|
||||||
|
* for Nissan ROMs.
|
||||||
|
*/
|
||||||
|
public final class ChecksumALT2 extends NissanChecksum {
|
||||||
|
protected static final String SKIPLOC = "skiploc";
|
||||||
|
|
||||||
|
public ChecksumALT2() {
|
||||||
|
calculator = new CalculateALT2();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void configure(Map<String, String> vars) {
|
||||||
|
super.configure(vars);
|
||||||
|
if (vars.containsKey(SKIPLOC)) {
|
||||||
|
range.put(SKIPLOC, HexUtil.hexToInt(vars.get(SKIPLOC)));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
range.put(SKIPLOC, 0x20000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* RomRaider Open-Source Tuning, Logging and Reflashing
|
* RomRaider Open-Source Tuning, Logging and Reflashing
|
||||||
* Copyright (C) 2006-2018 RomRaider.com
|
* Copyright (C) 2006-2019 RomRaider.com
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -19,66 +19,13 @@
|
||||||
|
|
||||||
package com.romraider.maps.checksum;
|
package com.romraider.maps.checksum;
|
||||||
|
|
||||||
import static com.romraider.xml.RomAttributeParser.parseByteValue;
|
|
||||||
import static com.romraider.xml.RomAttributeParser.parseIntegerValue;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import com.romraider.Settings;
|
|
||||||
import com.romraider.util.HexUtil;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class implements the "std" checksum validation and calculations
|
* This class implements the "std" checksum validation and calculations
|
||||||
* for Nissan ROMs.
|
* for Nissan ROMs.
|
||||||
*/
|
*/
|
||||||
public final class ChecksumSTD implements ChecksumManager {
|
public final class ChecksumSTD extends NissanChecksum {
|
||||||
private static final String START = "start";
|
|
||||||
private static final String END = "end";
|
|
||||||
private static final String SUMLOC = "sumloc";
|
|
||||||
private static final String XORLOC = "xorloc";
|
|
||||||
private int start;
|
|
||||||
private int end;
|
|
||||||
private int sumloc;
|
|
||||||
private int xorloc;
|
|
||||||
private int sumt;
|
|
||||||
private int xort;
|
|
||||||
|
|
||||||
public ChecksumSTD() {
|
public ChecksumSTD() {
|
||||||
}
|
calculator = new CalculateSTD();
|
||||||
|
|
||||||
@Override
|
|
||||||
public void configure(Map<String, String> vars) {
|
|
||||||
this.start = HexUtil.hexToInt(vars.get(START));
|
|
||||||
this.end = HexUtil.hexToInt(vars.get(END));
|
|
||||||
this.sumloc = HexUtil.hexToInt(vars.get(SUMLOC));
|
|
||||||
this.xorloc = HexUtil.hexToInt(vars.get(XORLOC));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean validate(byte[] binData) {
|
|
||||||
calculate(binData);
|
|
||||||
final boolean valid =
|
|
||||||
(sumt == (int)parseByteValue(binData, Settings.Endian.BIG, sumloc, 4, true)) &&
|
|
||||||
(xort == (int)parseByteValue(binData, Settings.Endian.BIG, xorloc, 4, true));
|
|
||||||
return valid;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void update(byte[] binData) {
|
|
||||||
calculate(binData);
|
|
||||||
System.arraycopy(parseIntegerValue(sumt, Settings.Endian.BIG, 4), 0, binData, sumloc, 4);
|
|
||||||
System.arraycopy(parseIntegerValue(xort, Settings.Endian.BIG, 4), 0, binData, xorloc, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void calculate(byte[] binData) {
|
|
||||||
sumt = 0;
|
|
||||||
xort = 0;
|
|
||||||
int dw = 0;
|
|
||||||
for (int i = start; i < end; i += 4) {
|
|
||||||
if ((i == sumloc) || (i == xorloc)) continue;
|
|
||||||
dw = (int)parseByteValue(binData, Settings.Endian.BIG, i, 4, true);
|
|
||||||
sumt += dw;
|
|
||||||
xort ^= dw;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
* RomRaider Open-Source Tuning, Logging and Reflashing
|
||||||
|
* Copyright (C) 2006-2019 RomRaider.com
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.romraider.maps.checksum;
|
||||||
|
|
||||||
|
import static com.romraider.xml.RomAttributeParser.parseByteValue;
|
||||||
|
import static com.romraider.xml.RomAttributeParser.parseIntegerValue;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.romraider.Settings;
|
||||||
|
import com.romraider.util.HexUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class provides common methods implemented by different
|
||||||
|
* checksum calculation type classes.
|
||||||
|
*/
|
||||||
|
abstract class NissanChecksum implements ChecksumManager {
|
||||||
|
public static final String START = "start";
|
||||||
|
public static final String END = "end";
|
||||||
|
public static final String SUMLOC = "sumloc";
|
||||||
|
public static final String XORLOC = "xorloc";
|
||||||
|
public static final String SUMT = "sumt";
|
||||||
|
public static final String XORT = "xort";
|
||||||
|
protected final Map<String, Integer> range = new HashMap<String, Integer>();
|
||||||
|
protected final Map<String, Integer> results = new HashMap<String, Integer>();
|
||||||
|
protected Calculator calculator;
|
||||||
|
|
||||||
|
public void configure(Map<String, String> vars) {
|
||||||
|
range.put(START, HexUtil.hexToInt(vars.get(START)));
|
||||||
|
range.put(END, HexUtil.hexToInt(vars.get(END)));
|
||||||
|
range.put(SUMLOC, HexUtil.hexToInt(vars.get(SUMLOC)));
|
||||||
|
range.put(XORLOC, HexUtil.hexToInt(vars.get(XORLOC)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean validate(byte[] binData) {
|
||||||
|
calculator.calculate(range, binData, results);
|
||||||
|
final boolean valid =
|
||||||
|
(results.get(SUMT) == (int)parseByteValue(binData, Settings.Endian.BIG, range.get(SUMLOC), 4, true)) &&
|
||||||
|
(results.get(XORT) == (int)parseByteValue(binData, Settings.Endian.BIG, range.get(XORLOC), 4, true));
|
||||||
|
return valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update(byte[] binData) {
|
||||||
|
calculator.calculate(range, binData, results);
|
||||||
|
System.arraycopy(parseIntegerValue(results.get(SUMT), Settings.Endian.BIG, 4), 0, binData, range.get(SUMLOC), 4);
|
||||||
|
System.arraycopy(parseIntegerValue(results.get(XORT), Settings.Endian.BIG, 4), 0, binData, range.get(XORLOC), 4);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue