diff --git a/src/dos/dos_programs.cpp b/src/dos/dos_programs.cpp index 621b9bfc..feba30e3 100644 --- a/src/dos/dos_programs.cpp +++ b/src/dos/dos_programs.cpp @@ -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(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); + }