1
0
Fork 0

Add simple program that allows you to boot into a bios image for running cpu tester bios

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@4257
This commit is contained in:
Sjoerd van der Berg 2019-09-08 12:48:57 +00:00
parent bca40f5561
commit 766a63ac33

View file

@ -1005,6 +1005,61 @@ static void LOADROM_ProgramStart(Program * * make) {
*make=new LOADROM;
}
class BIOS : public Program {
public:
void Run(void) {
if (!(cmd->FindCommand(1, temp_line))) {
WriteOut("Must specify BIOS file to load.\n");
return;
}
Bit8u drive;
char fullname[DOS_PATHLENGTH];
localDrive* ldp = 0;
if (!DOS_MakeName((char *)temp_line.c_str(), fullname, &drive)) return;
try {
/* try to read ROM file into buffer */
ldp = dynamic_cast<localDrive*>(Drives[drive]);
if (!ldp) return;
FILE *tmpfile = ldp->GetSystemFilePtr(fullname, "rb");
if (tmpfile == NULL) {
WriteOut("Can't open a file");
return;
}
fseek(tmpfile, 0L, SEEK_END);
if (ftell(tmpfile) > 64 * 1024) {
WriteOut("BIOS File too large");
fclose(tmpfile);
return;
}
fseek(tmpfile, 0L, SEEK_SET);
Bit8u buffer[64*1024];
Bitu data_read = fread(buffer, 1, sizeof( buffer), tmpfile);
fclose(tmpfile);
Bit32u rom_base = PhysMake(0xf000, 0); // override regular dosbox bios
/* write buffer into ROM */
for (Bitu i = 0; i < data_read; i++) phys_writeb(rom_base + i, buffer[i]);
//Start executing this bios
memset(&cpu_regs, 0, sizeof(cpu_regs));
memset(&Segs, 0, sizeof(Segs));
SegSet16(cs, 0xf000);
reg_eip = 0xfff0;
}
catch (...) {
return;
}
}
};
static void BIOS_ProgramStart(Program * * make) {
*make = new BIOS;
}
// LOADFIX
@ -1767,7 +1822,9 @@ void DOS_SetupPrograms(void) {
PROGRAMS_MakeFile("RESCAN.COM",RESCAN_ProgramStart);
PROGRAMS_MakeFile("INTRO.COM",INTRO_ProgramStart);
PROGRAMS_MakeFile("BOOT.COM",BOOT_ProgramStart);
PROGRAMS_MakeFile("BIOS.COM", BIOS_ProgramStart);
PROGRAMS_MakeFile("LOADROM.COM", LOADROM_ProgramStart);
PROGRAMS_MakeFile("IMGMOUNT.COM", IMGMOUNT_ProgramStart);
PROGRAMS_MakeFile("KEYB.COM", KEYB_ProgramStart);
}