diff --git a/src/Makefile.mingw b/src/Makefile.mingw index 3b3c23cf8..a91fe441d 100644 --- a/src/Makefile.mingw +++ b/src/Makefile.mingw @@ -6,7 +6,7 @@ CFLAGS = -O3 -march=native -mtune=native -fbranch-probabilities -fvpt -fpeel-loo DFLAGS = -O3 -march=i686 -fomit-frame-pointer -msse2 -mstackrealign OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o acerm3a.o ali1429.o amstrad.o buslogic.o cdrom.o cdrom-ioctl.o cdrom-iso.o \ cdrom-null.o codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86.o compaq.o config.o cpu.o dac.o \ - device.o disc.o disc_86f.o disc_fdi.o disc_imd.o disc_img.o disc_random.o disc_td0.o dma.o fdc.o fdc37c665.o fdc37c932fr.o fdd.o fdi2raw.o gameport.o headland.o i430hx.o i430lx.o i430fx.o \ + device.o disc.o disc_86f.o disc_fdi.o disc_imd.o disc_img.o disc_random.o disc_td0.o dma.o fdc.o fdc37c665.o fdc37c932fr.o fdd.o fdi2raw.o gameport.o headland.o i82335.o i430hx.o i430lx.o i430fx.o \ i430nx.o i430vx.o i440fx.o ide.o intel.o intel_flash.o io.o jim.o joystick_ch_flightstick_pro.o joystick_standard.o joystick_sw_pad.o joystick_tm_fcs.o keyboard.o keyboard_amstrad.o keyboard_at.o \ keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o lpt.o mcr.o mem.o memregs.o model.o mouse.o mouse_ps2.o \ mouse_serial.o ne2000.o neat.o nethandler.o nmi.o nvr.o olivetti_m24.o opti495.o pc.o pc87306.o pci.o pic.o piix.o pit.o ppi.o ps1.o rom.o rtc.o \ diff --git a/src/Makefile.mingw64 b/src/Makefile.mingw64 index 7cd949b1a..277ffadcb 100644 --- a/src/Makefile.mingw64 +++ b/src/Makefile.mingw64 @@ -6,7 +6,7 @@ CFLAGS = -O3 -march=native -mtune=native -fbranch-probabilities -fvpt -fpeel-loo DFLAGS = -O3 -fomit-frame-pointer -msse2 -mstackrealign OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o acerm3a.o ali1429.o amstrad.o buslogic.o cdrom.o cdrom-ioctl.o cdrom-iso.o \ cdrom-null.o codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86-64.o compaq.o config.o cpu.o dac.o \ - device.o disc.o disc_86f.o disc_fdi.o disc_imd.o disc_img.o disc_random.o disc_td0.o dma.o fdc.o fdc37c665.o fdc37c932fr.o fdd.o fdi2raw.o gameport.o headland.o i430hx.o i430lx.o i430fx.o \ + device.o disc.o disc_86f.o disc_fdi.o disc_imd.o disc_img.o disc_random.o disc_td0.o dma.o fdc.o fdc37c665.o fdc37c932fr.o fdd.o fdi2raw.o gameport.o headland.o i82335.o i430hx.o i430lx.o i430fx.o \ i430nx.o i430vx.o i440fx.o ide.o intel.o intel_flash.o io.o jim.o joystick_ch_flightstick_pro.o joystick_standard.o joystick_sw_pad.o joystick_tm_fcs.o keyboard.o keyboard_amstrad.o keyboard_at.o \ keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o lpt.o mcr.o mem.o memregs.o model.o mouse.o mouse_ps2.o \ mouse_serial.o ne2000.o neat.o nethandler.o nmi.o nvr.o olivetti_m24.o opti495.o pc.o pc87306.o pci.o pic.o piix.o pit.o ppi.o ps1.o rom.o rtc.o \ diff --git a/src/cpu.c b/src/cpu.c index fc811f532..af49feb4d 100644 --- a/src/cpu.c +++ b/src/cpu.c @@ -228,28 +228,20 @@ CPU cpus_ps1_m2011[] = {"", -1, 0, 0, 0, 0} }; -CPU cpus_i386[] = +CPU cpus_i386SX[] = { - /*i386*/ + /*i386SX*/ {"i386SX/16", CPU_386SX, 0, 16000000, 1, 0, 0x2308, 0, 0, 0, 3,3,3,3}, {"i386SX/20", CPU_386SX, 1, 20000000, 1, 0, 0x2308, 0, 0, 0, 4,4,3,3}, {"i386SX/25", CPU_386SX, 2, 25000000, 1, 0, 0x2308, 0, 0, 0, 4,4,3,3}, {"i386SX/33", CPU_386SX, 3, 33333333, 1, 0, 0x2308, 0, 0, 0, 6,6,3,3}, {"i386SX/40", CPU_386SX, 4, 40000000, 1, 0, 0x2308, 0, 0, 0, 7,7,3,3}, - {"i386DX/16", CPU_386DX, 0, 16000000, 1, 0, 0x0308, 0, 0, 0, 3,3,3,3}, - {"i386DX/20", CPU_386DX, 1, 20000000, 1, 0, 0x0308, 0, 0, 0, 4,4,3,3}, - {"i386DX/25", CPU_386DX, 2, 25000000, 1, 0, 0x0308, 0, 0, 0, 4,4,3,3}, - {"i386DX/33", CPU_386DX, 3, 33333333, 1, 0, 0x0308, 0, 0, 0, 6,6,3,3}, - {"i386DX/40", CPU_386DX, 4, 40000000, 1, 0, 0x0308, 0, 0, 0, 7,7,3,3}, - {"RapidCAD/25", CPU_RAPIDCAD, 2, 25000000, 1, 0, 0x430, 0, 0, 0, 4,4,3,3}, - {"RapidCAD/33", CPU_RAPIDCAD, 3, 33333333, 1, 0, 0x430, 0, 0, 0, 6,6,3,3}, - {"RapidCAD/40", CPU_RAPIDCAD, 4, 40000000, 1, 0, 0x430, 0, 0, 0, 7,7,3,3}, {"", -1, 0, 0, 0} }; CPU cpus_i386DX[] = { - /*i386*/ + /*i386DX*/ {"i386DX/16", CPU_386DX, 0, 16000000, 1, 0, 0x0308, 0, 0, 0, 3,3,3,3}, {"i386DX/20", CPU_386DX, 1, 20000000, 1, 0, 0x0308, 0, 0, 0, 4,4,3,3}, {"i386DX/25", CPU_386DX, 2, 25000000, 1, 0, 0x0308, 0, 0, 0, 4,4,3,3}, @@ -263,12 +255,12 @@ CPU cpus_i386DX[] = CPU cpus_acer[] = { - /*i386*/ + /*i386SX*/ {"i386SX/25", CPU_386SX, 2, 25000000, 1, 0, 0x2308, 0, 0, 0, 4,4,4,4}, {"", -1, 0, 0, 0} }; -CPU cpus_Am386[] = +CPU cpus_Am386SX[] = { /*Am386*/ {"Am386SX/16", CPU_386SX, 0, 16000000, 1, 0, 0x2308, 0, 0, 0, 3,3,3,3}, @@ -276,9 +268,6 @@ CPU cpus_Am386[] = {"Am386SX/25", CPU_386SX, 2, 25000000, 1, 0, 0x2308, 0, 0, 0, 4,4,3,3}, {"Am386SX/33", CPU_386SX, 3, 33333333, 1, 0, 0x2308, 0, 0, 0, 6,6,3,3}, {"Am386SX/40", CPU_386SX, 4, 40000000, 1, 0, 0x2308, 0, 0, 0, 7,7,3,3}, - {"Am386DX/25", CPU_386DX, 2, 25000000, 1, 0, 0x0308, 0, 0, 0, 4,4,3,3}, - {"Am386DX/33", CPU_386DX, 3, 33333333, 1, 0, 0x0308, 0, 0, 0, 6,6,3,3}, - {"Am386DX/40", CPU_386DX, 4, 40000000, 1, 0, 0x0308, 0, 0, 0, 7,7,3,3}, {"", -1, 0, 0, 0} }; @@ -292,22 +281,15 @@ CPU cpus_Am386DX[] = {"", -1, 0, 0, 0} }; -CPU cpus_486SDLC[] = +CPU cpus_486SLC[] = { - /*Cx486SLC/DLC*/ + /*Cx486SLC*/ {"Cx486SLC/20", CPU_486SLC, 1, 20000000, 1, 0, 0x400, 0, 0x0000, 0, 4,4,3,3}, {"Cx486SLC/25", CPU_486SLC, 2, 25000000, 1, 0, 0x400, 0, 0x0000, 0, 4,4,3,3}, {"Cx486SLC/33", CPU_486SLC, 3, 33333333, 1, 0, 0x400, 0, 0x0000, 0, 6,6,3,3}, {"Cx486SRx2/32", CPU_486SLC, 3, 32000000, 2, 0, 0x406, 0, 0x0006, 0, 6,6,6,6}, {"Cx486SRx2/40", CPU_486SLC, 4, 40000000, 2, 0, 0x406, 0, 0x0006, 0, 8,8,6,6}, {"Cx486SRx2/50", CPU_486SLC, 5, 50000000, 2, 0, 0x406, 0, 0x0006, 0, 8,8,6,6}, - {"Cx486DLC/25", CPU_486DLC, 2, 25000000, 1, 0, 0x401, 0, 0x0001, 0, 4,4,3,3}, - {"Cx486DLC/33", CPU_486DLC, 3, 33333333, 1, 0, 0x401, 0, 0x0001, 0, 6,6,3,3}, - {"Cx486DLC/40", CPU_486DLC, 4, 40000000, 1, 0, 0x401, 0, 0x0001, 0, 7,7,3,3}, - {"Cx486DRx2/32", CPU_486DLC, 3, 32000000, 2, 0, 0x407, 0, 0x0007, 0, 6,6,6,6}, - {"Cx486DRx2/40", CPU_486DLC, 4, 40000000, 2, 0, 0x407, 0, 0x0007, 0, 8,8,6,6}, - {"Cx486DRx2/50", CPU_486DLC, 5, 50000000, 2, 0, 0x407, 0, 0x0007, 0, 8,8,6,6}, - {"Cx486DRx2/66", CPU_486DLC, 6, 66666666, 2, 0, 0x407, 0, 0x0007, 0, 12,12,6,6}, {"", -1, 0, 0, 0} }; diff --git a/src/cpu.h b/src/cpu.h index b75ee35b5..a1775ecac 100644 --- a/src/cpu.h +++ b/src/cpu.h @@ -85,11 +85,11 @@ typedef struct extern CPU cpus_8088[]; extern CPU cpus_8086[]; extern CPU cpus_286[]; -extern CPU cpus_i386[]; +extern CPU cpus_i386SX[]; extern CPU cpus_i386DX[]; -extern CPU cpus_Am386[]; +extern CPU cpus_Am386SX[]; extern CPU cpus_Am386DX[]; -extern CPU cpus_486SDLC[]; +extern CPU cpus_486SLC[]; extern CPU cpus_486DLC[]; extern CPU cpus_i486[]; extern CPU cpus_Am486[]; diff --git a/src/i82335.c b/src/i82335.c new file mode 100644 index 000000000..361b1bd0d --- /dev/null +++ b/src/i82335.c @@ -0,0 +1,56 @@ +/* Intel 82335 SX emulation, used by the Phoenix 386 clone. */ + +#include +#include "ibm.h" + +typedef struct +{ + uint8_t reg_22; +} i82335_t; + +i82335_t i82335; + +void i82335_write(uint16_t addr, uint8_t val, void *priv) +{ + int i = 0; + + switch (addr) + { + case 0x22: + i82335_t.reg_22 = val | 0xd8; + if (val & 1) + { + for (i = 0; i < 8; i++) + { + mem_mapping_enable(&bios_mapping[i]); + } + } + else + { + for (i = 0; i < 8; i++) + { + mem_mapping_disable(&bios_mapping[i]); + } + } + break; + case 0x23: + if (val & 0x80) + { + io_removehandler(0x0022, 0x0001, i82335_read, NULL, NULL, i82335_write, NULL, NULL, NULL); + } + break; + } +} + +uint8_t i82335_read(uint16_t addr, void *priv) +{ +} + +void i82335_init() +{ + memset(i82335_t, 0, sizeof(i82335_t)); + + i82335_t.reg_22 = 0xd9; + + io_sethandler(0x0022, 0x0014, i82335_read, NULL, NULL, i82335_write, NULL, NULL, NULL); +} diff --git a/src/i82335.h b/src/i82335.h new file mode 100644 index 000000000..048730b80 --- /dev/null +++ b/src/i82335.h @@ -0,0 +1 @@ +void i82335_init(); diff --git a/src/ibm.h b/src/ibm.h index 5626ea263..e88b108d3 100644 --- a/src/ibm.h +++ b/src/ibm.h @@ -418,7 +418,10 @@ enum ROM_POWERMATE_V,/*NEC PowerMate V / 430FX / Phoenix BIOS / SMC FDC37C665*/ ROM_IBMPS1_2121_ISA,/*IBM PS/1 Model 2121 with ISA expansion bus*/ - + + ROM_SPC4200P, /*Samsung SPC-4200P / SCAT / Phoenix BIOS*/ + ROM_MEGAPCDX, /*386DX mdoel of the Mega PC - Note by Tohka: The documentation (that I have in German) clearly says such a model exists.*/ + ROM_MAX }; @@ -469,6 +472,7 @@ enum GFX_RIVATNT2, GFX_TRIGEM_UNK, + GFX_CHIPS_VGA, GFX_MAX }; @@ -496,8 +500,7 @@ float VGACONST1,VGACONST2; float RTCCONST; int gated,speakval,speakon; -// #define SOUNDBUFLEN (48000/40) -#define SOUNDBUFLEN (32000/20) +#define SOUNDBUFLEN (48000/20) /*Sound Blaster*/ diff --git a/src/mem.c b/src/mem.c index 460a4b204..def1e8c71 100644 --- a/src/mem.c +++ b/src/mem.c @@ -324,7 +324,6 @@ int loadbios() fclose(ff); fclose(f); biosmask = 0x7fff; - mem_load_atide_bios(); return 1; case ROM_DELL200: f=romfopen("roms/dells200/dell0.bin","rb"); @@ -428,6 +427,7 @@ int loadbios() return 1; case ROM_MEGAPC: + case ROM_MEGAPCDX: f = romfopen("roms/megapc/41651-bios lo.u18", "rb"); ff = romfopen("roms/megapc/211253-bios hi.u19", "rb"); if (!f || !ff) break; @@ -592,6 +592,13 @@ int loadbios() mem_load_xtide_bios(); return 1; + case ROM_SPC4200P: /*Samsung SPC-4200P*/ + f = romfopen("roms/spc4200p/U8.01", "rb"); + if (!f) break; + fread(rom, 65536, 1, f); + fclose(f); + return 1; + case ROM_PX386: /*Phoenix 80386 BIOS*/ f=romfopen("roms/px386/3iip001l.bin","rb"); ff=romfopen("roms/px386/3iip001h.bin","rb"); @@ -603,7 +610,6 @@ int loadbios() } fclose(ff); fclose(f); - mem_load_atide_bios(); return 1; case ROM_DTK386: /*Uses NEAT chipset*/ @@ -611,7 +617,6 @@ int loadbios() if (!f) break; fread(rom, 65536, 1, f); fclose(f); - mem_load_atide_bios(); return 1; case ROM_PXXT: diff --git a/src/model.c b/src/model.c index 174fe63e0..a2518f2b2 100644 --- a/src/model.c +++ b/src/model.c @@ -32,6 +32,7 @@ #include "i430nx.h" #include "i430vx.h" #include "i440fx.h" +#include "i82335.h" #include "ide.h" #include "intel.h" #include "intel_flash.h" @@ -86,6 +87,7 @@ void ps1_m2121_init(); void at_neat_init(); void at_scat_init(); void at_acer386sx_init(); +void at_82335_init(); void at_wd76c10_init(); void at_ali1429_init(); void at_headland_init(); @@ -146,15 +148,18 @@ MODEL models[] = {"AMI 286 clone", ROM_AMI286, { "", cpus_286, "", NULL, "", NULL}, 0, MODEL_AT, 1, 16, 1, at_neat_init, NULL}, {"Award 286 clone", ROM_AWARD286, { "", cpus_286, "", NULL, "", NULL}, 0, MODEL_AT, 1, 16, 1, at_scat_init, NULL}, {"DELL System 200", ROM_DELL200, { "", cpus_286, "", NULL, "", NULL}, 0, MODEL_AT, 1, 16, 1, at_init, NULL}, + {"Samsung SPC-4200P", ROM_SPC4200P, { "", cpus_286, "", NULL, "", NULL}, 0, MODEL_AT, 1, 16, 1, at_scat_init, NULL}, {"IBM PS/1 model 2011", ROM_IBMPS1_2011, { "", cpus_ps1_m2011,"", NULL, "", NULL}, 1, MODEL_AT|MODEL_PS2, 1, 16, 1, ps1_m2011_init, NULL}, - {"IBM PS/1 model 2121", ROM_IBMPS1_2121, { "Intel", cpus_i386, "", NULL, "", NULL}, 1, MODEL_AT|MODEL_PS2, 1, 16, 1, ps1_m2121_init, NULL}, - {"IBM PS/1 m.2121+ISA", ROM_IBMPS1_2121_ISA, { "Intel", cpus_i386, "", NULL, "", NULL}, 1, MODEL_AT|MODEL_PS2, 1, 16, 1, ps1_m2121_init, NULL}, - {"Compaq Deskpro 386", ROM_DESKPRO_386, { "Intel", cpus_i386, "AMD", cpus_Am386, "Cyrix", cpus_486SDLC}, 0, MODEL_AT, 1, 15, 1, deskpro386_init, NULL}, + {"IBM PS/1 model 2121", ROM_IBMPS1_2121, { "Intel", cpus_i386SX, "AMD", cpus_Am386SX, "Cyrix", cpus_486SLC}, 1, MODEL_AT|MODEL_PS2, 1, 16, 1, ps1_m2121_init, NULL}, + {"IBM PS/1 m.2121+ISA", ROM_IBMPS1_2121_ISA, { "Intel", cpus_i386DX, "AMD", cpus_Am386DX, "Cyrix", cpus_486DLC}, 1, MODEL_AT|MODEL_PS2, 1, 16, 1, ps1_m2121_init, NULL}, + {"Compaq Deskpro 386", ROM_DESKPRO_386, { "Intel", cpus_i386DX, "AMD", cpus_Am386DX, "Cyrix", cpus_486DLC}, 0, MODEL_AT, 1, 15, 1, deskpro386_init, NULL}, {"Acer 386SX25/N", ROM_ACER386, { "Intel", cpus_acer, "", NULL, "", NULL}, 1, MODEL_AT|MODEL_PS2, 1, 16, 1, at_acer386sx_init, NULL}, - {"DTK 386SX clone", ROM_DTK386, { "Intel", cpus_i386, "AMD", cpus_Am386, "Cyrix", cpus_486SDLC}, 0, MODEL_AT, 1, 16, 1, at_neat_init, NULL}, - {"Phoenix 386 clone", ROM_PX386, { "Intel", cpus_i386, "AMD", cpus_Am386, "Cyrix", cpus_486SDLC}, 0, MODEL_AT, 1, 16, 1, at_init, NULL}, - {"Amstrad MegaPC", ROM_MEGAPC, { "Intel", cpus_i386, "AMD", cpus_Am386, "Cyrix", cpus_486SDLC}, 1, MODEL_AT|MODEL_PS2, 1, 16, 1, at_wd76c10_init, NULL}, - {"AMI 386SX clone", ROM_AMI386SX, { "Intel", cpus_i386, "AMD", cpus_Am386, "Cyrix", cpus_486SDLC}, 0, MODEL_AT, 1, 256, 1, at_headland_init, NULL}, + {"DTK 386SX clone", ROM_DTK386, { "Intel", cpus_i386SX, "AMD", cpus_Am386SX, "Cyrix", cpus_486SLC}, 0, MODEL_AT, 1, 16, 1, at_neat_init, NULL}, + {"Phoenix 386 clone", ROM_PX386, { "Intel", cpus_i386SX, "AMD", cpus_Am386SX, "Cyrix", cpus_486SLC}, 0, MODEL_AT, 1, 16, 1, at_82335_init, NULL}, + {"Amstrad MegaPC", ROM_MEGAPC, { "Intel", cpus_i386SX, "AMD", cpus_Am386SX, "Cyrix", cpus_486SLC}, 1, MODEL_AT|MODEL_PS2, 1, 16, 1, at_wd76c10_init, NULL}, +/* The MegaPC manual says 386DX model of the Amstrad PC70386 exists, but Sarah Walker just *had* to remove 386DX CPU's from some boards. */ + {"Amstrad MegaPC 386DX",ROM_MEGAPCDX, { "Intel", cpus_i386DX, "AMD", cpus_Am386DX, "Cyrix", cpus_486DLC}, 1, MODEL_AT|MODEL_PS2, 1, 16, 1, at_wd76c10_init, NULL}, + {"AMI 386SX clone", ROM_AMI386SX, { "Intel", cpus_i386SX "AMD", cpus_Am386SX, "Cyrix", cpus_486SLC}, 0, MODEL_AT, 1, 256, 1, at_headland_init, NULL}, {"MR 386DX clone", ROM_MR386DX_OPTI495, { "Intel", cpus_i386DX, "AMD", cpus_Am386DX, "Cyrix", cpus_486DLC}, 0, MODEL_AT, 1, 256, 1, at_opti495_init, NULL}, {"AMI 386DX clone", ROM_AMI386DX_OPTI495, { "Intel", cpus_i386DX, "AMD", cpus_Am386DX, "Cyrix", cpus_486DLC}, 0, MODEL_AT, 1, 256, 1, at_opti495_init, NULL}, {"AMI 486 clone", ROM_AMI486, { "Intel", cpus_i486, "AMD", cpus_Am486, "Cyrix", cpus_Cx486}, 0, MODEL_AT, 1, 256, 1, at_ali1429_init, NULL}, @@ -392,6 +397,12 @@ void at_acer386sx_init() acer386sx_init(); } +void at_82335_init() +{ + at_init(); + i82335_init(); +} + void at_wd76c10_init() { at_init(); diff --git a/src/nvr.c b/src/nvr.c index 450d6faa2..7e4e4223e 100644 --- a/src/nvr.c +++ b/src/nvr.c @@ -212,10 +212,12 @@ void loadnvr() case ROM_AMI286: f = romfopen(nvr_concat("ami286.nvr"), "rb"); nvrmask = 127; break; case ROM_AWARD286: f = romfopen(nvr_concat("award286.nvr"), "rb"); nvrmask = 127; break; case ROM_DELL200: f = romfopen(nvr_concat("dell200.nvr"), "rb"); nvrmask = 127; break; + case ROM_SPC4200P: f = romfopen(nvr_concat("spc4200p.nvr"), "rb"); nvrmask = 127; break; case ROM_IBMAT386: f = romfopen(nvr_concat("at386.nvr"), "rb"); nvrmask = 127; break; case ROM_DESKPRO_386: f = romfopen(nvr_concat("deskpro386.nvr"), "rb"); break; case ROM_ACER386: f = romfopen(nvr_concat("acer386.nvr"), "rb"); nvrmask = 127; break; case ROM_MEGAPC: f = romfopen(nvr_concat("megapc.nvr"), "rb"); nvrmask = 127; break; + case ROM_MEGAPCDX: f = romfopen(nvr_concat("megapcdx.nvr"), "rb"); nvrmask = 127; break; case ROM_AMI386SX: f = romfopen(nvr_concat("ami386.nvr"), "rb"); nvrmask = 127; break; case ROM_AMI486: f = romfopen(nvr_concat("ami486.nvr"), "rb"); nvrmask = 127; break; case ROM_WIN486: f = romfopen(nvr_concat("win486.nvr"), "rb"); nvrmask = 127; break; @@ -291,10 +293,12 @@ void savenvr() case ROM_AMI286: f = romfopen(nvr_concat("ami286.nvr"), "wb"); break; case ROM_AWARD286: f = romfopen(nvr_concat("award286.nvr"), "wb"); break; case ROM_DELL200: f = romfopen(nvr_concat("dell200.nvr"), "wb"); break; + case ROM_SPC4200P: f = romfopen(nvr_concat("spc4200p.nvr"), "wb"); break; case ROM_IBMAT386: f = romfopen(nvr_concat("at386.nvr"), "wb"); break; case ROM_DESKPRO_386: f = romfopen(nvr_concat("deskpro386.nvr"), "wb"); break; case ROM_ACER386: f = romfopen(nvr_concat("acer386.nvr"), "wb"); break; case ROM_MEGAPC: f = romfopen(nvr_concat("megapc.nvr"), "wb"); break; + case ROM_MEGAPCDX: f = romfopen(nvr_concat("megapcdx.nvr"), "wb"); break; case ROM_AMI386SX: f = romfopen(nvr_concat("ami386.nvr"), "wb"); break; case ROM_AMI486: f = romfopen(nvr_concat("ami486.nvr"), "wb"); break; case ROM_WIN486: f = romfopen(nvr_concat("win486.nvr"), "wb"); break; diff --git a/src/vid_vga.c b/src/vid_vga.c index 3ad87e4bc..501643cf2 100644 --- a/src/vid_vga.c +++ b/src/vid_vga.c @@ -105,6 +105,27 @@ void *vga_init() return vga; } +void *vga_chips_init() +{ + vga_t *vga = malloc(sizeof(vga_t)); + memset(vga, 0, sizeof(vga_t)); + + rom_init(&vga->bios_rom, "roms/SD620.04M", 0xc0000, 0x8000, 0x7fff, 0x2000, MEM_MAPPING_EXTERNAL); + + svga_init(&vga->svga, vga, 1 << 18, /*256kb*/ + NULL, + vga_in, vga_out, + NULL, + NULL); + + io_sethandler(0x03c0, 0x0020, vga_in, NULL, NULL, vga_out, NULL, NULL, vga); + + vga->svga.bpp = 8; + vga->svga.miscout = 1; + + return vga; +} + void *trigem_unk_init() { vga_t *vga = malloc(sizeof(vga_t)); @@ -155,6 +176,11 @@ static int vga_available() return rom_present("roms/ibm_vga.bin"); } +static int vga_chips_available() +{ + return rom_present("roms/SD620.04M"); +} + void vga_close(void *p) { vga_t *vga = (vga_t *)p; @@ -196,6 +222,17 @@ device_t vga_device = vga_force_redraw, vga_add_status_info }; +device_t vga_chips_device = +{ + "Chips VGA", + 0, + vga_chips_init, + vga_close, + vga_chips_available, + vga_speed_changed, + vga_force_redraw, + vga_add_status_info +}; device_t trigem_unk_device = { "VGA", diff --git a/src/vid_vga.h b/src/vid_vga.h index 5ee66fc0b..77aff5056 100644 --- a/src/vid_vga.h +++ b/src/vid_vga.h @@ -2,5 +2,6 @@ see COPYING for more details */ extern device_t vga_device; +extern device_t vga_chips_device; extern device_t trigem_unk_device; extern device_t ps1vga_device; diff --git a/src/vid_voodoo.c b/src/vid_voodoo.c index ca7c64359..deb9e69e7 100644 --- a/src/vid_voodoo.c +++ b/src/vid_voodoo.c @@ -5922,6 +5922,8 @@ static void voodoo_writel(uint32_t addr, uint32_t val, void *p) happen here on a real Voodoo*/ voodoo->disp_buffer = 0; voodoo->draw_buffer = 1; + voodoo_recalc(voodoo); + voodoo->front_offset = voodoo->params.front_offset; } } break; diff --git a/src/video.c b/src/video.c index 9211ac742..6e86633ca 100644 --- a/src/video.c +++ b/src/video.c @@ -69,6 +69,7 @@ static VIDEO_CARD video_cards[] = {"Diamond Stealth 3D 2000 (S3 ViRGE)", &s3_virge_device, GFX_VIRGE}, {"EGA", &ega_device, GFX_EGA}, {"Chips & Technologies SuperEGA", &sega_device, GFX_SUPER_EGA}, + {"Chips & Technologies VGA 451", &vga_chips_device, GFX_CHIPS_VGA}, {"Compaq ATI VGA Wonder XL (ATI-28800-5)", &compaq_ati28800_device, GFX_VGAWONDERXL}, {"Compaq EGA", &cpqega_device, GFX_COMPAQ_EGA}, {"Compaq/Paradise VGA", &cpqvga_device, GFX_COMPAQ_VGA},