Add the ability to add a romdisk image
This commit is contained in:
parent
875de91fce
commit
df15d0fbe7
44
cli/main.c
44
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) {
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue