mirror of
https://github.com/jpluimers/macrompatcher.git
synced 2024-09-25 00:54:38 +00:00
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) {
|
void usage(char *progname) {
|
||||||
fprintf(stderr, "Usage: %s [OPTION]\n", progname);
|
fprintf(stderr, "Usage: %s [OPTION]\n", progname);
|
||||||
fprintf(stderr, "Options:\n");
|
fprintf(stderr, "Options:\n");
|
||||||
fprintf(stderr, " -f, --infile=FILE Specify the ROM file to operate on\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, " -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, " -c, --checksum Compute and print the checksum\n");
|
||||||
fprintf(stderr, " -r, --romdiskdrvr Install the ROMdisk driver\n");
|
fprintf(stderr, " -r, --romdiskdrvr Install the ROMdisk driver\n");
|
||||||
|
fprintf(stderr, " --romdiskimage=FILE Install the ROMdisk image file\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -30,12 +31,15 @@ int main(int argc, char *argv[]) {
|
|||||||
char *romname = NULL;
|
char *romname = NULL;
|
||||||
int romfd;
|
int romfd;
|
||||||
char *outname = NULL;
|
char *outname = NULL;
|
||||||
|
uint8_t *diskimage = NULL;
|
||||||
|
uint32_t diskimagelen = 0;
|
||||||
RomErr err = 0;
|
RomErr err = 0;
|
||||||
struct option o[] = {
|
struct option o[] = {
|
||||||
{"checksum", 0, 0, 'c'},
|
{"checksum", 0, 0, 'c'},
|
||||||
{"infile", 1, 0, 'f'},
|
{"infile", 1, 0, 'f'},
|
||||||
{"outfile", 1, 0, 'o'},
|
{"outfile", 1, 0, 'o'},
|
||||||
{"romdiskdrvr", 0, 0, 'r'},
|
{"romdiskdrvr", 0, 0, 'r'},
|
||||||
|
{"romdiskimage", 1, 0, 1},
|
||||||
{"help", 0, 0, 'h'},
|
{"help", 0, 0, 'h'},
|
||||||
{0, 0, 0, 0}
|
{0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
@ -53,6 +57,30 @@ int main(int argc, char *argv[]) {
|
|||||||
case 'f': romname = optarg; break;
|
case 'f': romname = optarg; break;
|
||||||
case 'o': outname = optarg; break;
|
case 'o': outname = optarg; break;
|
||||||
case 'r': apply_romdisk = 1; 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':
|
case 'h':
|
||||||
default:
|
default:
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
@ -121,6 +149,14 @@ int main(int argc, char *argv[]) {
|
|||||||
fprintf(stderr, "Error installing ROMdisk driver: %s\n", GetROMErrString(err));
|
fprintf(stderr, "Error installing ROMdisk driver: %s\n", GetROMErrString(err));
|
||||||
exit(1);
|
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) {
|
if(print_checksum) {
|
||||||
|
@ -65,6 +65,7 @@ RomErr UpdateChecksum(RomCtx *rom);
|
|||||||
const char *GetROMErrString(RomErr err);
|
const char *GetROMErrString(RomErr err);
|
||||||
RomErr GetDRVROffset(RomCtx *rom, uint16_t drvrid, uint32_t *offset);
|
RomErr GetDRVROffset(RomCtx *rom, uint16_t drvrid, uint32_t *offset);
|
||||||
RomErr InstallRomdiskDrvr(RomCtx *rom);
|
RomErr InstallRomdiskDrvr(RomCtx *rom);
|
||||||
|
RomErr InstallRomdiskImage(RomCtx *rom, uint8_t *image, uint32_t imagesize);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
};
|
};
|
||||||
|
@ -27,3 +27,21 @@ RomErr InstallRomdiskDrvr(RomCtx *rom) {
|
|||||||
|
|
||||||
return eSuccess;
|
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->addSeparator();
|
||||||
fileMenu->addAction(exitAction);
|
fileMenu->addAction(exitAction);
|
||||||
|
|
||||||
int mywidth = 200;
|
int mywidth = 300;
|
||||||
int myheight = 300;
|
int myheight = 300;
|
||||||
int yoffset = 25;
|
int yoffset = 25;
|
||||||
int xoffset = 5;
|
int xoffset = 5;
|
||||||
@ -29,9 +29,22 @@ RomPatcher::RomPatcher()
|
|||||||
|
|
||||||
applyRomdisk = new QRadioButton("Apply ROMdisk Driver", this);
|
applyRomdisk = new QRadioButton("Apply ROMdisk Driver", this);
|
||||||
applyRomdisk->move(xoffset, yoffset);
|
applyRomdisk->move(xoffset, yoffset);
|
||||||
|
yoffset += 25;
|
||||||
applyRomdisk->setMinimumSize(mywidth, 10);
|
applyRomdisk->setMinimumSize(mywidth, 10);
|
||||||
applyRomdisk->setEnabled(false);
|
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"));
|
setWindowTitle(tr("RomPatcher"));
|
||||||
setMinimumSize(mywidth, myheight);
|
setMinimumSize(mywidth, myheight);
|
||||||
|
|
||||||
@ -63,6 +76,8 @@ void RomPatcher::open()
|
|||||||
|
|
||||||
updateChecksumUI();
|
updateChecksumUI();
|
||||||
applyRomdisk->setEnabled(true);
|
applyRomdisk->setEnabled(true);
|
||||||
|
romdiskFile->setEnabled(true);
|
||||||
|
romdiskSelect->setEnabled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,9 +93,35 @@ void RomPatcher::save()
|
|||||||
|
|
||||||
// save the RomCtx structure here
|
// save the RomCtx structure here
|
||||||
applyMods();
|
applyMods();
|
||||||
|
|
||||||
RomErr err = UpdateChecksum(rom);
|
RomErr err = UpdateChecksum(rom);
|
||||||
if(err != eSuccess) {
|
if(err != eSuccess) {
|
||||||
fprintf(stderr, "Error updating checksum: %d %s\n", err, GetROMErrString(err));
|
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);
|
QDataStream stream(&file);
|
||||||
@ -116,3 +157,9 @@ void RomPatcher::applyMods()
|
|||||||
|
|
||||||
updateChecksumUI();
|
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 save();
|
||||||
void quit();
|
void quit();
|
||||||
void applyMods();
|
void applyMods();
|
||||||
|
void selectDiskImage();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void updateChecksumUI();
|
void updateChecksumUI();
|
||||||
@ -25,6 +26,8 @@ private:
|
|||||||
|
|
||||||
QLabel *checksum;
|
QLabel *checksum;
|
||||||
QRadioButton *applyRomdisk;
|
QRadioButton *applyRomdisk;
|
||||||
|
QLineEdit *romdiskFile;
|
||||||
|
QPushButton *romdiskSelect;
|
||||||
|
|
||||||
RomCtx *rom;
|
RomCtx *rom;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user