0da1c5dcca
First commit of the 4.5 version (latest version available)
75 lines
3.0 KiB
Java
75 lines
3.0 KiB
Java
package mars.mips.dump;
|
|
|
|
import mars.Globals;
|
|
import mars.mips.hardware.*;
|
|
import java.io.*;
|
|
|
|
/**
|
|
* Intel's Hex memory initialization format
|
|
* @author Leo Alterman
|
|
* @version July 2011
|
|
*/
|
|
|
|
public class IntelHexDumpFormat extends AbstractDumpFormat {
|
|
|
|
/**
|
|
* Constructor. File extention is "hex".
|
|
*/
|
|
public IntelHexDumpFormat() {
|
|
super("Intel hex format", "HEX", "Written as Intel Hex Memory File", "hex");
|
|
}
|
|
|
|
/**
|
|
* Write MIPS memory contents according to the Memory Initialization File
|
|
* (MIF) specification.
|
|
*
|
|
* @param file File in which to store MIPS memory contents.
|
|
* @param firstAddress first (lowest) memory address to dump. In bytes but
|
|
* must be on word boundary.
|
|
* @param lastAddress last (highest) memory address to dump. In bytes but
|
|
* must be on word boundary. Will dump the word that starts at this address.
|
|
* @throws AddressErrorException if firstAddress is invalid or not on a word boundary.
|
|
* @throws IOException if error occurs during file output.
|
|
*/
|
|
public void dumpMemoryRange(File file, int firstAddress, int lastAddress)
|
|
throws AddressErrorException, IOException {
|
|
PrintStream out = new PrintStream(new FileOutputStream(file));
|
|
String string = null;
|
|
try {
|
|
for (int address = firstAddress; address <= lastAddress; address += Memory.WORD_LENGTH_BYTES) {
|
|
Integer temp = Globals.memory.getRawWordOrNull(address);
|
|
if (temp == null)
|
|
break;
|
|
string = Integer.toHexString(temp.intValue());
|
|
while (string.length() < 8) {
|
|
string = '0' + string;
|
|
}
|
|
String addr = Integer.toHexString(address-firstAddress);
|
|
while (addr.length() < 4) {
|
|
addr = '0' + addr;
|
|
}
|
|
String chksum;
|
|
int tmp_chksum = 0;
|
|
tmp_chksum += 4;
|
|
tmp_chksum += 0xFF & (address-firstAddress);
|
|
tmp_chksum += 0xFF & ((address-firstAddress)>>8);
|
|
tmp_chksum += 0xFF & temp.intValue();
|
|
tmp_chksum += 0xFF & (temp.intValue()>>8);
|
|
tmp_chksum += 0xFF & (temp.intValue()>>16);
|
|
tmp_chksum += 0xFF & (temp.intValue()>>24);
|
|
tmp_chksum = tmp_chksum % 256;
|
|
tmp_chksum = ~tmp_chksum + 1;
|
|
chksum = Integer.toHexString(0xFF & tmp_chksum);
|
|
if(chksum.length()==1) chksum = '0' + chksum;
|
|
String finalstr = ":04"+addr+"00"+string+chksum;
|
|
out.println(finalstr.toUpperCase());
|
|
}
|
|
out.println(":00000001FF");
|
|
}
|
|
finally {
|
|
out.close();
|
|
}
|
|
|
|
}
|
|
}
|