diff --git a/cli/main.c b/cli/main.c index 75dee07..925157d 100644 --- a/cli/main.c +++ b/cli/main.c @@ -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) { diff --git a/lib/macrompatcher.h b/lib/macrompatcher.h index 052fce6..f4f0d4d 100644 --- a/lib/macrompatcher.h +++ b/lib/macrompatcher.h @@ -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 }; diff --git a/lib/romdisk.c b/lib/romdisk.c index 48f8108..87c3ff6 100644 --- a/lib/romdisk.c +++ b/lib/romdisk.c @@ -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; +} diff --git a/qtgui/RomPatcher.cpp b/qtgui/RomPatcher.cpp index ca3d6a1..527e37d 100644 --- a/qtgui/RomPatcher.cpp +++ b/qtgui/RomPatcher.cpp @@ -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); +} diff --git a/qtgui/RomPatcher.h b/qtgui/RomPatcher.h index 3a7beb7..dd8ef39 100644 --- a/qtgui/RomPatcher.h +++ b/qtgui/RomPatcher.h @@ -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; };