Add the ability to add a romdisk image

This commit is contained in:
bbraun 2011-12-05 04:15:45 +00:00
parent 875de91fce
commit df15d0fbe7
5 changed files with 110 additions and 5 deletions

View File

@ -15,10 +15,11 @@
void usage(char *progname) {
fprintf(stderr, "Usage: %s [OPTION]\n", progname);
fprintf(stderr, "Options:\n");
fprintf(stderr, " -f, --infile=FILE Specify the ROM file to operate on\n");
fprintf(stderr, " -o, --outfile=FILE Specify the filename to write the modified ROM to\n");
fprintf(stderr, " -c, --checksum Compute and print the checksum\n");
fprintf(stderr, " -r, --romdiskdrvr Install the ROMdisk driver\n");
fprintf(stderr, " -f, --infile=FILE Specify the ROM file to operate on\n");
fprintf(stderr, " -o, --outfile=FILE Specify the filename to write the modified ROM to\n");
fprintf(stderr, " -c, --checksum Compute and print the checksum\n");
fprintf(stderr, " -r, --romdiskdrvr Install the ROMdisk driver\n");
fprintf(stderr, " --romdiskimage=FILE Install the ROMdisk image file\n");
return;
}
@ -30,12 +31,15 @@ int main(int argc, char *argv[]) {
char *romname = NULL;
int romfd;
char *outname = NULL;
uint8_t *diskimage = NULL;
uint32_t diskimagelen = 0;
RomErr err = 0;
struct option o[] = {
{"checksum", 0, 0, 'c'},
{"infile", 1, 0, 'f'},
{"outfile", 1, 0, 'o'},
{"romdiskdrvr", 0, 0, 'r'},
{"romdiskimage", 1, 0, 1},
{"help", 0, 0, 'h'},
{0, 0, 0, 0}
};
@ -53,6 +57,30 @@ int main(int argc, char *argv[]) {
case 'f': romname = optarg; break;
case 'o': outname = optarg; break;
case 'r': apply_romdisk = 1; break;
case 1 : /* romdisk image */
romfd = open(optarg, O_RDONLY);
if(!romfd < 0) {
fprintf(stderr, "Could not open romdisk image %s: %d %s\n", optarg, errno, strerror(errno));
exit(1);
}
if(fstat(romfd, &sb) < 0) {
fprintf(stderr, "Could not stat romdisk image %s: %d %s\n", optarg, errno, strerror(errno));
exit(1);
}
diskimagelen = sb.st_size;
diskimage = calloc(1, diskimagelen);
if(!diskimage) {
fprintf(stderr, "Could not allocate romdisk image memory\n");
exit(1);
}
if(read(romfd, diskimage, diskimagelen) < diskimagelen) {
fprintf(stderr, "Could not read entire romdisk image into memory: %d %s\n", errno, strerror(errno));
exit(1);
}
close(romfd);
break;
case 'h':
default:
usage(argv[0]);
@ -121,6 +149,14 @@ int main(int argc, char *argv[]) {
fprintf(stderr, "Error installing ROMdisk driver: %s\n", GetROMErrString(err));
exit(1);
}
if(diskimage) {
err = InstallRomdiskImage(rom, diskimage, diskimagelen);
if(err != eSuccess) {
fprintf(stderr, "Error installing ROMdisk image: %d %s\n", err, GetROMErrString(err));
exit(1);
}
}
}
if(print_checksum) {

View File

@ -65,6 +65,7 @@ RomErr UpdateChecksum(RomCtx *rom);
const char *GetROMErrString(RomErr err);
RomErr GetDRVROffset(RomCtx *rom, uint16_t drvrid, uint32_t *offset);
RomErr InstallRomdiskDrvr(RomCtx *rom);
RomErr InstallRomdiskImage(RomCtx *rom, uint8_t *image, uint32_t imagesize);
#ifdef __cplusplus
};

View File

@ -27,3 +27,21 @@ RomErr InstallRomdiskDrvr(RomCtx *rom) {
return eSuccess;
}
RomErr InstallRomdiskImage(RomCtx *rom, uint8_t *image, uint32_t imagesize) {
if(!rom || !rom->data) return eParmErr;
if(imagesize != (512*1024)) {
return eParmErr;
}
rom->datasize = (512*1024) + imagesize;
rom->data = realloc(rom->data, rom->datasize);
if(!rom->data) {
rom->datasize = 0;
return eParmErr;
}
memcpy(rom->data+(512*1024), image, imagesize);
return eSuccess;
}

View File

@ -16,7 +16,7 @@ RomPatcher::RomPatcher()
fileMenu->addSeparator();
fileMenu->addAction(exitAction);
int mywidth = 200;
int mywidth = 300;
int myheight = 300;
int yoffset = 25;
int xoffset = 5;
@ -29,9 +29,22 @@ RomPatcher::RomPatcher()
applyRomdisk = new QRadioButton("Apply ROMdisk Driver", this);
applyRomdisk->move(xoffset, yoffset);
yoffset += 25;
applyRomdisk->setMinimumSize(mywidth, 10);
applyRomdisk->setEnabled(false);
romdiskFile = new QLineEdit(this);
romdiskFile->move(xoffset, yoffset);
romdiskFile->setMinimumSize(mywidth-110, 5);
romdiskFile->setEnabled(false);
romdiskSelect = new QPushButton("ROMdisk Image", this);
romdiskSelect->move(mywidth-105, yoffset);
romdiskSelect->setMinimumSize(100, 5);
yoffset += 25;
connect(romdiskSelect, SIGNAL(clicked()), this, SLOT(selectDiskImage()));
romdiskSelect->setEnabled(false);
setWindowTitle(tr("RomPatcher"));
setMinimumSize(mywidth, myheight);
@ -63,6 +76,8 @@ void RomPatcher::open()
updateChecksumUI();
applyRomdisk->setEnabled(true);
romdiskFile->setEnabled(true);
romdiskSelect->setEnabled(true);
}
}
@ -78,9 +93,35 @@ void RomPatcher::save()
// save the RomCtx structure here
applyMods();
RomErr err = UpdateChecksum(rom);
if(err != eSuccess) {
fprintf(stderr, "Error updating checksum: %d %s\n", err, GetROMErrString(err));
QMessageBox::critical(this, "Error", "Could not update checksum");
}
QString romdiskimagename = romdiskFile->text();
if(romdiskimagename != "") {
QFile imagefile(romdiskimagename);
if(!imagefile.open(QIODevice::ReadOnly)) {
QMessageBox::critical(this, "Error", "Could not open ROMdisk Image");
return;
}
if(imagefile.size() != (512*1024)) {
QMessageBox::critical(this, "Error", "ROMdisk Image is the wrong size");
return;
}
uint8_t *image = (uint8_t*)calloc(1, imagefile.size());
QDataStream imagestream(&imagefile);
imagestream.readRawData((char*)image, (int)imagefile.size());
imagefile.close();
err = InstallRomdiskImage(rom, image, (uint32_t)imagefile.size());
if(err) {
QMessageBox::critical(this, "Error", "ROMdisk Image couldn't be installed");
return;
}
}
QDataStream stream(&file);
@ -116,3 +157,9 @@ void RomPatcher::applyMods()
updateChecksumUI();
}
void RomPatcher::selectDiskImage()
{
QString s = QFileDialog::getOpenFileName(this, "Select ROMdisk Image", "./", "All Files (*.*)");
romdiskFile->setText(s);
}

View File

@ -13,6 +13,7 @@ private slots:
void save();
void quit();
void applyMods();
void selectDiskImage();
private:
void updateChecksumUI();
@ -25,6 +26,8 @@ private:
QLabel *checksum;
QRadioButton *applyRomdisk;
QLineEdit *romdiskFile;
QPushButton *romdiskSelect;
RomCtx *rom;
};