From 9bdfc9348feda3bd63345e9518b67f964a9c6309 Mon Sep 17 00:00:00 2001 From: SarahW Date: Sat, 24 Feb 2018 22:27:32 +0000 Subject: [PATCH] Video card can now be changed on Amstrad PC1640, PC2086, PC3086, and Sinclair PC200. --- src/amstrad.c | 36 +++++++++- src/amstrad.h | 10 +++ src/ibm.h | 1 + src/io.c | 8 +++ src/model.c | 146 +++++++++++++++++++++----------------- src/model.h | 13 +++- src/mouse.h | 5 ++ src/video.c | 183 ++++++++++++++++++++++++++++++++++++++++-------- src/wx-config.c | 43 ++++++++---- 9 files changed, 333 insertions(+), 112 deletions(-) diff --git a/src/amstrad.c b/src/amstrad.c index ca2861a..8817229 100644 --- a/src/amstrad.c +++ b/src/amstrad.c @@ -4,10 +4,12 @@ #include "keyboard.h" #include "lpt.h" #include "mouse.h" +#include "video.h" #include "amstrad.h" static uint8_t amstrad_dead; +int amstrad_latch = 0; uint8_t amstrad_read(uint16_t port, void *priv) { @@ -23,8 +25,38 @@ uint8_t amstrad_read(uint16_t port, void *priv) case 0x37a: temp = lpt1_read(port, NULL) & 0x1f; if (romset == ROM_PC1512) return temp | 0x20; - if (romset == ROM_PC200) return temp | 0x80; + if (romset == ROM_PC200) + { + if (video_is_cga()) + temp |= 0x80; + else if (video_is_mda()) + temp |= 0xc0; + return temp; + } + if (romset == ROM_PC1640) + { + if (video_is_cga()) + temp |= 0x80; + else if (video_is_mda()) + temp |= 0xc0; + + switch (amstrad_latch) + { + case AMSTRAD_NOLATCH: + temp &= ~0x20; + break; + case AMSTRAD_SW9: + temp &= ~0x20; + break; + case AMSTRAD_SW10: + temp |= 0x20; + break; + } + } return temp; + case 0x3de: + return 0x20; /*PC200 - use external video. If internal video is being used + then this port is handled in vid_pc200.c*/ case 0xdead: return amstrad_dead; } @@ -121,4 +153,6 @@ void amstrad_init() io_sethandler(0x007a, 0x0001, amstrad_mouse_read, NULL, NULL, amstrad_mouse_write, NULL, NULL, NULL); io_sethandler(0x0378, 0x0003, amstrad_read, NULL, NULL, amstrad_write, NULL, NULL, NULL); io_sethandler(0xdead, 0x0001, amstrad_read, NULL, NULL, amstrad_write, NULL, NULL, NULL); + if (romset == ROM_PC200 && gfxcard != GFX_BUILTIN) + io_sethandler(0x03de, 0x0001, amstrad_read, NULL, NULL, amstrad_write, NULL, NULL, NULL); } diff --git a/src/amstrad.h b/src/amstrad.h index a4250d3..bc13c37 100644 --- a/src/amstrad.h +++ b/src/amstrad.h @@ -1,3 +1,13 @@ +#include "mouse.h" + void amstrad_init(); extern mouse_t mouse_amstrad; +extern int amstrad_latch; + +enum +{ + AMSTRAD_NOLATCH, + AMSTRAD_SW9, + AMSTRAD_SW10 +}; diff --git a/src/ibm.h b/src/ibm.h index eadd91b..97b661c 100644 --- a/src/ibm.h +++ b/src/ibm.h @@ -465,6 +465,7 @@ int romset; enum { + GFX_BUILTIN = -1, GFX_CGA = 0, GFX_MDA, GFX_HERCULES, diff --git a/src/io.c b/src/io.c index 318575c..3c6cfd9 100644 --- a/src/io.c +++ b/src/io.c @@ -1,4 +1,5 @@ #include "ibm.h" +#include "amstrad.h" #include "ide.h" #include "io.h" #include "video.h" @@ -135,6 +136,13 @@ uint8_t inb(uint16_t port) if (port_inb[port][1]) temp &= port_inb[port][1](port, port_priv[port][1]); + if (port & 0x80) + amstrad_latch = AMSTRAD_NOLATCH; + else if (port & 0x4000) + amstrad_latch = AMSTRAD_SW10; + else + amstrad_latch = AMSTRAD_SW9; + /* if (!port_inb[port][0] && !port_inb[port][1]) pclog("Bad INB %04X %04X:%04X\n", port, CS, pc);*/ diff --git a/src/model.c b/src/model.c index a4b3ca9..cff18ee 100644 --- a/src/model.c +++ b/src/model.c @@ -111,80 +111,80 @@ int AMSTRAD, AT, PCI, TANDY; MODEL models[] = { - {"[8088] AMI XT clone", ROM_AMIXT, "amixt", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 0, 0, 64, 640, 64, xt_init, NULL}, - {"[8088] Atari PC3", ROM_ATARIPC3, "ataripc3", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 0, 0, 64, 640, 64, xt_init, NULL}, - {"[8088] Compaq Portable Plus", ROM_COMPAQ_PIP, "compaq_pip", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 0, 0, 128, 640, 64, compaq_pip_init, NULL}, - {"[8088] DTK XT clone", ROM_DTKXT, "dtk", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 0, 0, 64, 640, 64, xt_init, NULL}, - {"[8088] Generic XT clone", ROM_GENXT, "genxt", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 0, 0, 64, 640, 64, xt_init, NULL}, - {"[8088] IBM PC", ROM_IBMPC, "ibmpc", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 0, 0, 64, 640, 32, xt_init, NULL}, - {"[8088] IBM PCjr", ROM_IBMPCJR, "ibmpcjr", { {"", cpus_pcjr}, {"", NULL}, {"", NULL}}, 1, 0, 128, 640, 64, pcjr_init, &pcjr_device}, - {"[8088] IBM XT", ROM_IBMXT, "ibmxt", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 0, 0, 64, 640, 64, xt_init, NULL}, - {"[8088] Juko XT clone", ROM_JUKOPC, "jukopc", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 0, 0, 64, 640, 64, xt_init, NULL}, - {"[8088] NCR PC4i", ROM_NCR_PC4I, "ncr_pc4i", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 0, 0, 64, 640, 64, xt_init, NULL}, - {"[8088] Phoenix XT clone", ROM_PXXT, "pxxt", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 0, 0, 64, 640, 64, xt_init, NULL}, - {"[8088] Schneider EuroPC", ROM_EUROPC, "europc", { {"", cpus_europc}, {"", NULL}, {"", NULL}}, 0, 0, 512, 640, 128, europc_init, NULL}, - {"[8088] Tandy 1000", ROM_TANDY, "tandy", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 1, 0, 128, 640, 128, tandy1k_init, &tandy1000_device}, - {"[8088] Tandy 1000 HX", ROM_TANDY1000HX, "tandy1000hx", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 1, 0, 256, 640, 128, tandy1k_init, &tandy1000hx_device}, - {"[8088] Thomson TO16 PC", ROM_TO16_PC, "to16_pc", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 0, 0, 512, 640, 128, xt_init, NULL}, - {"[8088] Toshiba 1000", ROM_T1000, "t1000", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 1, 0, 512,1280, 768, xt_t1000_init, &t1000_device}, - {"[8088] VTech Laser Turbo XT", ROM_LTXT, "ltxt", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 0, 0, 64,1152, 64, xt_laserxt_init, NULL}, - {"[8088] Xi8088", ROM_XI8088, "xi8088", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 0, MODEL_AT|MODEL_PS2, 64,1024, 128, xt_xi8088_init, NULL}, + {"[8088] AMI XT clone", ROM_AMIXT, "amixt", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 64, 640, 64, xt_init, NULL}, + {"[8088] Atari PC3", ROM_ATARIPC3, "ataripc3", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 64, 640, 64, xt_init, NULL}, + {"[8088] Compaq Portable Plus", ROM_COMPAQ_PIP, "compaq_pip", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 128, 640, 64, compaq_pip_init, NULL}, + {"[8088] DTK XT clone", ROM_DTKXT, "dtk", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 64, 640, 64, xt_init, NULL}, + {"[8088] Generic XT clone", ROM_GENXT, "genxt", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 64, 640, 64, xt_init, NULL}, + {"[8088] IBM PC", ROM_IBMPC, "ibmpc", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 64, 640, 32, xt_init, NULL}, + {"[8088] IBM PCjr", ROM_IBMPCJR, "ibmpcjr", { {"", cpus_pcjr}, {"", NULL}, {"", NULL}}, MODEL_GFX_FIXED, 128, 640, 64, pcjr_init, &pcjr_device}, + {"[8088] IBM XT", ROM_IBMXT, "ibmxt", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 64, 640, 64, xt_init, NULL}, + {"[8088] Juko XT clone", ROM_JUKOPC, "jukopc", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 64, 640, 64, xt_init, NULL}, + {"[8088] NCR PC4i", ROM_NCR_PC4I, "ncr_pc4i", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 64, 640, 64, xt_init, NULL}, + {"[8088] Phoenix XT clone", ROM_PXXT, "pxxt", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 64, 640, 64, xt_init, NULL}, + {"[8088] Schneider EuroPC", ROM_EUROPC, "europc", { {"", cpus_europc}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 512, 640, 128, europc_init, NULL}, + {"[8088] Tandy 1000", ROM_TANDY, "tandy", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_FIXED, 128, 640, 128, tandy1k_init, &tandy1000_device}, + {"[8088] Tandy 1000 HX", ROM_TANDY1000HX, "tandy1000hx", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_FIXED, 256, 640, 128, tandy1k_init, &tandy1000hx_device}, + {"[8088] Thomson TO16 PC", ROM_TO16_PC, "to16_pc", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 512, 640, 128, xt_init, NULL}, + {"[8088] Toshiba 1000", ROM_T1000, "t1000", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_FIXED, 512, 1280, 768, xt_t1000_init, &t1000_device}, + {"[8088] VTech Laser Turbo XT", ROM_LTXT, "ltxt", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 64, 1152, 64, xt_laserxt_init, NULL}, + {"[8088] Xi8088", ROM_XI8088, "xi8088", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE|MODEL_AT|MODEL_PS2, 64, 1024, 128, xt_xi8088_init, NULL}, - {"[8086] Amstrad PC1512", ROM_PC1512, "pc1512", { {"", cpus_pc1512}, {"", NULL}, {"", NULL}}, 1, MODEL_AMSTRAD, 512, 640, 128, ams_init, NULL}, - {"[8086] Amstrad PC1640", ROM_PC1640, "pc1640", { {"", cpus_8086}, {"", NULL}, {"", NULL}}, 1, MODEL_AMSTRAD, 640, 640, 0, ams_init, NULL}, - {"[8086] Amstrad PC2086", ROM_PC2086, "pc2086", { {"", cpus_8086}, {"", NULL}, {"", NULL}}, 1, MODEL_AMSTRAD, 640, 640, 0, ams_init, NULL}, - {"[8086] Amstrad PC3086", ROM_PC3086, "pc3086", { {"", cpus_8086}, {"", NULL}, {"", NULL}}, 1, MODEL_AMSTRAD, 640, 640, 0, ams_init, NULL}, - {"[8086] Olivetti M24", ROM_OLIM24, "olivetti_m24", { {"", cpus_8086}, {"", NULL}, {"", NULL}}, 1, MODEL_OLIM24, 128, 640, 128, olim24_init, NULL}, - {"[8086] Sinclair PC200", ROM_PC200, "pc200", { {"", cpus_8086}, {"", NULL}, {"", NULL}}, 1, MODEL_AMSTRAD, 512, 640, 128, ams_init, NULL}, - {"[8086] Tandy 1000 SL/2", ROM_TANDY1000SL2, "tandy1000sl2", { {"", cpus_8086}, {"", NULL}, {"", NULL}}, 1, 0, 512, 768, 128, tandy1ksl2_init, NULL}, - {"[8088] Toshiba 1200", ROM_T1200, "t1200", { {"", cpus_8086}, {"", NULL}, {"", NULL}}, 1, 0, 1024,2048,1024, xt_t1200_init, &t1000_device}, - {"[8086] VTech Laser XT3", ROM_LXT3, "lxt3", { {"", cpus_8086}, {"", NULL}, {"", NULL}}, 0, 0, 512,1152, 128, xt_laserxt_init, NULL}, + {"[8086] Amstrad PC1512", ROM_PC1512, "pc1512", { {"", cpus_pc1512}, {"", NULL}, {"", NULL}}, MODEL_GFX_FIXED|MODEL_AMSTRAD, 512, 640, 128, ams_init, NULL}, + {"[8086] Amstrad PC1640", ROM_PC1640, "pc1640", { {"", cpus_8086}, {"", NULL}, {"", NULL}}, MODEL_GFX_DISABLE_HW|MODEL_AMSTRAD, 640, 640, 0, ams_init, NULL}, + {"[8086] Amstrad PC2086", ROM_PC2086, "pc2086", { {"", cpus_8086}, {"", NULL}, {"", NULL}}, MODEL_GFX_DISABLE_HW|MODEL_AMSTRAD, 640, 640, 0, ams_init, NULL}, + {"[8086] Amstrad PC3086", ROM_PC3086, "pc3086", { {"", cpus_8086}, {"", NULL}, {"", NULL}}, MODEL_GFX_DISABLE_HW|MODEL_AMSTRAD, 640, 640, 0, ams_init, NULL}, + {"[8086] Olivetti M24", ROM_OLIM24, "olivetti_m24", { {"", cpus_8086}, {"", NULL}, {"", NULL}}, MODEL_GFX_FIXED|MODEL_OLIM24, 128, 640, 128, olim24_init, NULL}, + {"[8086] Sinclair PC200", ROM_PC200, "pc200", { {"", cpus_8086}, {"", NULL}, {"", NULL}}, MODEL_GFX_DISABLE_HW|MODEL_AMSTRAD, 512, 640, 128, ams_init, NULL}, + {"[8086] Tandy 1000 SL/2", ROM_TANDY1000SL2, "tandy1000sl2", { {"", cpus_8086}, {"", NULL}, {"", NULL}}, MODEL_GFX_DISABLE_SW, 512, 768, 128, tandy1ksl2_init, NULL}, + {"[8088] Toshiba 1200", ROM_T1200, "t1200", { {"", cpus_8086}, {"", NULL}, {"", NULL}}, MODEL_GFX_FIXED, 1024, 2048,1024, xt_t1200_init, &t1000_device}, + {"[8086] VTech Laser XT3", ROM_LXT3, "lxt3", { {"", cpus_8086}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 512, 1152, 128, xt_laserxt_init, NULL}, - {"[286] AMI 286 clone", ROM_AMI286, "ami286", { {"", cpus_286}, {"", NULL}, {"", NULL}}, 0, MODEL_AT|MODEL_HAS_IDE, 512,16384,128, at_neat_init, NULL}, - {"[286] Award 286 clone", ROM_AWARD286, "award286", { {"", cpus_286}, {"", NULL}, {"", NULL}}, 0, MODEL_AT|MODEL_HAS_IDE, 512,16384,128, at_scat_init, NULL}, - {"[286] Commodore PC 30 III", ROM_CMDPC30, "cmdpc30", { {"", cpus_286}, {"", NULL}, {"", NULL}}, 0, MODEL_AT|MODEL_HAS_IDE, 640,16384,128, at_cbm_init, NULL}, - {"[286] Compaq Portable II", ROM_COMPAQ_PII, "compaq_pii", { {"", cpus_286}, {"", NULL}, {"", NULL}}, 0, MODEL_AT|MODEL_HAS_IDE, 256,15872,128, ibm_at_init, NULL}, - {"[286] DELL System 200", ROM_DELL200, "dells200", { {"", cpus_286}, {"", NULL}, {"", NULL}}, 0, MODEL_AT, 640,16384,128, dells200_init, NULL}, - {"[286] Epson PC AX", ROM_EPSON_PCAX, "epson_pcax", { {"", cpus_286}, {"", NULL}, {"", NULL}}, 0, MODEL_AT, 256,15872,128, at_init, NULL}, - {"[286] Epson PC AX2e", ROM_EPSON_PCAX2E, "epson_pcax2e", { {"", cpus_286}, {"", NULL}, {"", NULL}}, 0, MODEL_AT, 256,15872,128, at_init, NULL}, - {"[286] GW-286CT GEAR", ROM_GW286CT, "gw286ct", { {"", cpus_286}, {"", NULL}, {"", NULL}}, 0, MODEL_AT , 512,16384,128, at_scat_init, NULL}, - {"[286] IBM AT", ROM_IBMAT, "ibmat", { {"", cpus_ibmat}, {"", NULL}, {"", NULL}}, 0, MODEL_AT, 256,15872,128, ibm_at_init, NULL}, - {"[286] IBM PS/1 model 2011", ROM_IBMPS1_2011, "ibmps1es", { {"", cpus_ps1_m2011}, {"", NULL}, {"", NULL}}, 1, MODEL_AT|MODEL_PS2, 512,16384,512, ps1_m2011_init, NULL}, - {"[286] IBM PS/2 Model 30-286", ROM_IBMPS2_M30_286, "ibmps2_m30_286", { {"", cpus_ps2_m30_286}, {"", NULL}, {"", NULL}}, 1, MODEL_AT|MODEL_PS2, 1, 16, 1, ps2_m30_286_init, NULL}, - {"[286] IBM PS/2 Model 50", ROM_IBMPS2_M50, "ibmps2_m50", { {"", cpus_ps2_m30_286}, {"", NULL}, {"", NULL}}, 1, MODEL_AT|MODEL_PS2|MODEL_MCA, 1, 16, 1, ps2_model_50_init, NULL}, - {"[286] IBM XT Model 286", ROM_IBMXT286, "ibmxt286", { {"", cpus_ibmxt286}, {"", NULL}, {"", NULL}}, 0, MODEL_AT, 256,15872,128, ibm_at_init, NULL}, - {"[286] Samsung SPC-4200P", ROM_SPC4200P, "spc4200p", { {"", cpus_286}, {"", NULL}, {"", NULL}}, 0, MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 512,2048, 128, at_scat_init, NULL}, - {"[286] Samsung SPC-4216P", ROM_SPC4216P, "spc4216p", { {"", cpus_286}, {"", NULL}, {"", NULL}}, 0, MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 5, 1, at_scat_init, NULL}, - {"[286] Toshiba 3100e", ROM_T3100E, "t3100e", { {"", cpus_286}, {"", NULL}, {"", NULL}}, 1, MODEL_AT|MODEL_HAS_IDE, 1024,5120,256, at_t3100e_init, NULL}, + {"[286] AMI 286 clone", ROM_AMI286, "ami286", { {"", cpus_286}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 512,16384, 128, at_neat_init, NULL}, + {"[286] Award 286 clone", ROM_AWARD286, "award286", { {"", cpus_286}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 512,16384, 128, at_scat_init, NULL}, + {"[286] Commodore PC 30 III", ROM_CMDPC30, "cmdpc30", { {"", cpus_286}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 640,16384, 128, at_cbm_init, NULL}, + {"[286] Compaq Portable II", ROM_COMPAQ_PII, "compaq_pii", { {"", cpus_286}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 256,15872, 128, ibm_at_init, NULL}, + {"[286] DELL System 200", ROM_DELL200, "dells200", { {"", cpus_286}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE|MODEL_AT, 640,16384, 128, dells200_init, NULL}, + {"[286] Epson PC AX", ROM_EPSON_PCAX, "epson_pcax", { {"", cpus_286}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE|MODEL_AT, 256,15872, 128, at_init, NULL}, + {"[286] Epson PC AX2e", ROM_EPSON_PCAX2E, "epson_pcax2e", { {"", cpus_286}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE|MODEL_AT, 256,15872, 128, at_init, NULL}, + {"[286] GW-286CT GEAR", ROM_GW286CT, "gw286ct", { {"", cpus_286}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE|MODEL_AT, 512,16384, 128, at_scat_init, NULL}, + {"[286] IBM AT", ROM_IBMAT, "ibmat", { {"", cpus_ibmat}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE|MODEL_AT, 256,15872, 128, ibm_at_init, NULL}, + {"[286] IBM PS/1 model 2011", ROM_IBMPS1_2011, "ibmps1es", { {"", cpus_ps1_m2011}, {"", NULL}, {"", NULL}}, MODEL_GFX_FIXED|MODEL_AT|MODEL_PS2, 512,16384, 512, ps1_m2011_init, NULL}, + {"[286] IBM PS/2 Model 30-286", ROM_IBMPS2_M30_286, "ibmps2_m30_286", { {"", cpus_ps2_m30_286}, {"", NULL}, {"", NULL}}, MODEL_GFX_FIXED|MODEL_AT|MODEL_PS2, 1, 16, 1, ps2_m30_286_init, NULL}, + {"[286] IBM PS/2 Model 50", ROM_IBMPS2_M50, "ibmps2_m50", { {"", cpus_ps2_m30_286}, {"", NULL}, {"", NULL}}, MODEL_GFX_FIXED|MODEL_AT|MODEL_PS2|MODEL_MCA, 1, 16, 1, ps2_model_50_init, NULL}, + {"[286] IBM XT Model 286", ROM_IBMXT286, "ibmxt286", { {"", cpus_ibmxt286}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE|MODEL_AT, 256,15872, 128, ibm_at_init, NULL}, + {"[286] Samsung SPC-4200P", ROM_SPC4200P, "spc4200p", { {"", cpus_286}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE|MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 512, 2048, 128, at_scat_init, NULL}, + {"[286] Samsung SPC-4216P", ROM_SPC4216P, "spc4216p", { {"", cpus_286}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE|MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 5, 1, at_scat_init, NULL}, + {"[286] Toshiba 3100e", ROM_T3100E, "t3100e", { {"", cpus_286}, {"", NULL}, {"", NULL}}, MODEL_GFX_FIXED|MODEL_AT|MODEL_HAS_IDE, 1024, 5120, 256, at_t3100e_init, NULL}, - {"[386SX] Acer 386SX25/N", ROM_ACER386, "acer386", { {"Intel", cpus_acer}, {"", NULL}, {"", NULL}}, 1, MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 16, 1, at_acer386sx_init, NULL}, - {"[386SX] AMI 386SX clone", ROM_AMI386SX, "ami386", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, 0, MODEL_AT|MODEL_HAS_IDE, 512,16384,128, at_headland_init, NULL}, - {"[386SX] Amstrad MegaPC", ROM_MEGAPC, "megapc", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, 1, MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 16, 1, at_wd76c10_init, NULL}, - {"[386SX] DTK 386SX clone", ROM_DTK386, "dtk386", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, 0, MODEL_AT|MODEL_HAS_IDE, 512,16384,128, at_neat_init, NULL}, - {"[386SX] Epson PC AX3", ROM_EPSON_PCAX3, "epson_pcax3", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, 0, MODEL_AT, 256,15872,128, at_init, NULL}, - {"[386SX] IBM PS/1 model 2121", ROM_IBMPS1_2121, "ibmps1_2121", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, 1, MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 16, 1, ps1_m2121_init, NULL}, - {"[386SX] IBM PS/2 Model 55SX", ROM_IBMPS2_M55SX, "ibmps2_m55sx", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, 1, MODEL_AT|MODEL_PS2|MODEL_MCA, 1, 8, 1, ps2_model_55sx_init, NULL}, - {"[386SX] KMX-C-02", ROM_KMXC02, "kmxc02", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, 0, MODEL_AT , 512,16384,512, at_scatsx_init, NULL}, - {"[386SX] Packard Bell Legend 300SX", ROM_PB_L300SX, "pb_l300sx", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, 0, MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 16, 1, pb_l300sx_init, NULL}, + {"[386SX] Acer 386SX25/N", ROM_ACER386, "acer386", { {"Intel", cpus_acer}, {"", NULL}, {"", NULL}}, MODEL_GFX_DISABLE_SW|MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 16, 1, at_acer386sx_init, NULL}, + {"[386SX] AMI 386SX clone", ROM_AMI386SX, "ami386", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 512,16384, 128, at_headland_init, NULL}, + {"[386SX] Amstrad MegaPC", ROM_MEGAPC, "megapc", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_FIXED|MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 16, 1, at_wd76c10_init, NULL}, + {"[386SX] DTK 386SX clone", ROM_DTK386, "dtk386", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 512,16384, 128, at_neat_init, NULL}, + {"[386SX] Epson PC AX3", ROM_EPSON_PCAX3, "epson_pcax3", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_NONE|MODEL_AT, 256,15872, 128, at_init, NULL}, + {"[386SX] IBM PS/1 model 2121", ROM_IBMPS1_2121, "ibmps1_2121", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_FIXED|MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 16, 1, ps1_m2121_init, NULL}, + {"[386SX] IBM PS/2 Model 55SX", ROM_IBMPS2_M55SX, "ibmps2_m55sx", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_FIXED|MODEL_AT|MODEL_PS2|MODEL_MCA, 1, 8, 1, ps2_model_55sx_init, NULL}, + {"[386SX] KMX-C-02", ROM_KMXC02, "kmxc02", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_NONE|MODEL_AT, 512,16384, 512, at_scatsx_init, NULL}, + {"[386SX] Packard Bell Legend 300SX", ROM_PB_L300SX, "pb_l300sx", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_NONE|MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 16, 1, pb_l300sx_init, NULL}, - {"[386DX] AMI 386DX clone", ROM_AMI386DX_OPTI495, "ami386dx", { {"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}}, 0, MODEL_AT|MODEL_HAS_IDE, 1, 256, 1, at_opti495_init, NULL}, - {"[386DX] Compaq Deskpro 386", ROM_DESKPRO_386, "deskpro386", { {"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}}, 0, MODEL_AT, 1, 15, 1, deskpro386_init, NULL}, - {"[386DX] IBM PS/2 Model 80", ROM_IBMPS2_M80, "ibmps2_m80", { {"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}}, 1, MODEL_AT|MODEL_PS2|MODEL_MCA, 1, 12, 1, ps2_model_80_init, NULL}, - {"[386DX] MR 386DX clone", ROM_MR386DX_OPTI495, "mr386dx", { {"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}}, 0, MODEL_AT|MODEL_HAS_IDE, 1, 256, 1, at_opti495_init, NULL}, + {"[386DX] AMI 386DX clone", ROM_AMI386DX_OPTI495, "ami386dx", { {"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 1, 256, 1, at_opti495_init, NULL}, + {"[386DX] Compaq Deskpro 386", ROM_DESKPRO_386, "deskpro386", { {"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}}, MODEL_GFX_NONE|MODEL_AT, 1, 15, 1, deskpro386_init, NULL}, + {"[386DX] IBM PS/2 Model 80", ROM_IBMPS2_M80, "ibmps2_m80", { {"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}}, MODEL_GFX_FIXED|MODEL_AT|MODEL_PS2|MODEL_MCA, 1, 12, 1, ps2_model_80_init, NULL}, + {"[386DX] MR 386DX clone", ROM_MR386DX_OPTI495, "mr386dx", { {"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 1, 256, 1, at_opti495_init, NULL}, - {"[486] AMI 486 clone", ROM_AMI486, "ami486", { {"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}}, 0, MODEL_AT|MODEL_HAS_IDE, 1, 256, 1, at_ali1429_init, NULL}, - {"[486] AMI WinBIOS 486", ROM_WIN486, "win486", { {"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}}, 0, MODEL_AT|MODEL_HAS_IDE, 1, 256, 1, at_ali1429_init, NULL}, - {"[486] Award SiS 496/497", ROM_SIS496, "sis496", { {"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}}, 0, MODEL_AT|MODEL_PCI|MODEL_HAS_IDE, 1, 256, 1, at_sis496_init, NULL}, - {"[486] Elonex PC-425X", ROM_ELX_PC425X, "elx_pc425x", { {"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}}, 1, MODEL_AT|MODEL_HAS_IDE, 1, 256, 1, at_sl82c460_init, NULL}, + {"[486] AMI 486 clone", ROM_AMI486, "ami486", { {"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 1, 256, 1, at_ali1429_init, NULL}, + {"[486] AMI WinBIOS 486", ROM_WIN486, "win486", { {"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 1, 256, 1, at_ali1429_init, NULL}, + {"[486] Award SiS 496/497", ROM_SIS496, "sis496", { {"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}}, MODEL_GFX_NONE|MODEL_AT|MODEL_PCI|MODEL_HAS_IDE, 1, 256, 1, at_sis496_init, NULL}, + {"[486] Elonex PC-425X", ROM_ELX_PC425X, "elx_pc425x", { {"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}}, MODEL_GFX_FIXED|MODEL_AT|MODEL_HAS_IDE, 1, 256, 1, at_sl82c460_init, NULL}, - {"[Socket 4] Intel Premiere/PCI", ROM_REVENGE, "revenge", { {"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}}, 0, MODEL_AT|MODEL_PCI|MODEL_PS2|MODEL_HAS_IDE, 1, 128, 1, at_batman_init, NULL}, - {"[Socket 4] Packard Bell PB520R",ROM_PB520R, "pb520r", { {"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}}, 1, MODEL_AT|MODEL_PCI|MODEL_PS2|MODEL_HAS_IDE, 1, 128, 1, at_pb520r_init, NULL}, + {"[Socket 4] Intel Premiere/PCI", ROM_REVENGE, "revenge", { {"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE|MODEL_AT|MODEL_PCI|MODEL_PS2|MODEL_HAS_IDE, 1, 128, 1, at_batman_init, NULL}, + {"[Socket 4] Packard Bell PB520R",ROM_PB520R, "pb520r", { {"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}}, MODEL_GFX_DISABLE_SW|MODEL_AT|MODEL_PCI|MODEL_PS2|MODEL_HAS_IDE, 1, 128, 1, at_pb520r_init, NULL}, - {"[Socket 5] Intel Advanced/EV", ROM_ENDEAVOR, "endeavor", { {"Intel", cpus_PentiumS5}, {"IDT", cpus_WinChip}, {"Cyrix", cpus_6x86}}, 0, MODEL_AT|MODEL_PCI|MODEL_PS2|MODEL_HAS_IDE, 1, 128, 1, at_endeavor_init, NULL}, - {"[Socket 5] Intel Advanced/ZP", ROM_ZAPPA, "zappa", { {"Intel", cpus_PentiumS5}, {"IDT", cpus_WinChip}, {"Cyrix", cpus_6x86}}, 0, MODEL_AT|MODEL_PCI|MODEL_PS2|MODEL_HAS_IDE, 1, 128, 1, at_zappa_init, NULL}, - {"[Socket 5] Packard Bell PB570", ROM_PB570, "pb570", { {"Intel", cpus_PentiumS5}, {"IDT", cpus_WinChip}, {"Cyrix", cpus_6x86}}, 1, MODEL_AT|MODEL_PCI|MODEL_PS2|MODEL_HAS_IDE, 1, 128, 1, at_pb570_init, NULL}, + {"[Socket 5] Intel Advanced/EV", ROM_ENDEAVOR, "endeavor", { {"Intel", cpus_PentiumS5}, {"IDT", cpus_WinChip}, {"Cyrix", cpus_6x86}}, MODEL_GFX_NONE|MODEL_AT|MODEL_PCI|MODEL_PS2|MODEL_HAS_IDE, 1, 128, 1, at_endeavor_init, NULL}, + {"[Socket 5] Intel Advanced/ZP", ROM_ZAPPA, "zappa", { {"Intel", cpus_PentiumS5}, {"IDT", cpus_WinChip}, {"Cyrix", cpus_6x86}}, MODEL_GFX_NONE|MODEL_AT|MODEL_PCI|MODEL_PS2|MODEL_HAS_IDE, 1, 128, 1, at_zappa_init, NULL}, + {"[Socket 5] Packard Bell PB570", ROM_PB570, "pb570", { {"Intel", cpus_PentiumS5}, {"IDT", cpus_WinChip}, {"Cyrix", cpus_6x86}}, MODEL_GFX_DISABLE_SW|MODEL_AT|MODEL_PCI|MODEL_PS2|MODEL_HAS_IDE, 1, 128, 1, at_pb570_init, NULL}, - {"[Socket 7] Award 430VX PCI", ROM_430VX, "430vx", { {"Intel", cpus_Pentium}, {"IDT", cpus_WinChip}, {"Cyrix", cpus_6x86}}, 0, MODEL_AT|MODEL_PCI|MODEL_PS2|MODEL_HAS_IDE, 1, 256, 1, at_i430vx_init, NULL}, + {"[Socket 7] Award 430VX PCI", ROM_430VX, "430vx", { {"Intel", cpus_Pentium}, {"IDT", cpus_WinChip}, {"Cyrix", cpus_6x86}}, MODEL_GFX_NONE|MODEL_AT|MODEL_PCI|MODEL_PS2|MODEL_HAS_IDE, 1, 256, 1, at_i430vx_init, NULL}, {"", -1, "", {{"", 0}, {"", 0}, {"", 0}}, 0,0,0, 0} }; @@ -242,6 +242,20 @@ int model_get_model_from_internal_name(char *s) return 0; } +int model_has_fixed_gfx(int model) +{ + int gfx_flags = models[model].flags & MODEL_GFX_MASK; + + return (gfx_flags == MODEL_GFX_FIXED || gfx_flags == MODEL_GFX_DISABLE_SW); +} + +int model_has_optional_gfx(int model) +{ + int gfx_flags = models[model].flags & MODEL_GFX_MASK; + + return (gfx_flags == MODEL_GFX_DISABLE_HW); +} + void common_init() { dma_init(); diff --git a/src/model.h b/src/model.h index 6c94345..11c442d 100644 --- a/src/model.h +++ b/src/model.h @@ -6,6 +6,16 @@ #define MODEL_MCA 0x20 #define MODEL_PCI 0x40 +/*Machine has no integrated graphics*/ +#define MODEL_GFX_NONE 0x000 +/*Machine has integrated graphics that can not be disabled*/ +#define MODEL_GFX_FIXED 0x100 +/*Machine has integrated graphics that can be disabled by jumpers or switches*/ +#define MODEL_GFX_DISABLE_HW 0x200 +/*Machine has integrated graphics that can be disabled through software*/ +#define MODEL_GFX_DISABLE_SW 0x300 +#define MODEL_GFX_MASK 0x300 + typedef struct { char name[64]; @@ -16,7 +26,6 @@ typedef struct char name[8]; CPU *cpus; } cpu[5]; - int fixed_gfxcard; int flags; int min_ram, max_ram; int ram_granularity; @@ -36,3 +45,5 @@ char *model_get_internal_name(); int model_get_model_from_internal_name(char *s); void model_init(); struct device_t *model_getdevice(int model); +int model_has_fixed_gfx(int model); +int model_has_optional_gfx(int model); diff --git a/src/mouse.h b/src/mouse.h index 216ed73..d39f539 100644 --- a/src/mouse.h +++ b/src/mouse.h @@ -1,3 +1,6 @@ +#ifndef _MOUSE_H_ +#define _MOUSE_H_ + void mouse_emu_init(); void mouse_emu_close(); void mouse_poll(int x, int y, int z, int b); @@ -24,3 +27,5 @@ typedef struct } mouse_t; extern int mouse_type; + +#endif diff --git a/src/video.c b/src/video.c index eb0aae6..e0d85f2 100644 --- a/src/video.c +++ b/src/video.c @@ -129,6 +129,9 @@ static video_timings_t timing_pb520r = {VIDEO_BUS, 4, 4, 8, 10,10,20}; int video_card_available(int card) { + if (card == GFX_BUILTIN) + return 1; + if (video_cards[card].device) return device_available(video_cards[card].device); @@ -137,16 +140,90 @@ int video_card_available(int card) char *video_card_getname(int card) { + if (card == GFX_BUILTIN) + return "Built-in video"; return video_cards[card].name; } device_t *video_card_getdevice(int card) { + switch (romset) + { + case ROM_IBMPCJR: + return &pcjr_video_device; + + case ROM_TANDY: + case ROM_TANDY1000HX: + return &tandy_device; + + case ROM_TANDY1000SL2: + return &tandysl_device; + + case ROM_PC1512: + return &pc1512_device; + + case ROM_PC1640: + if (gfxcard == GFX_BUILTIN) + return &pc1640_device; + break; + + case ROM_PC200: + if (gfxcard == GFX_BUILTIN) + return &pc200_device; + break; + + case ROM_OLIM24: + return &m24_device; + + case ROM_PC2086: + if (gfxcard == GFX_BUILTIN) + return ¶dise_pvga1a_pc2086_device; + break; + + case ROM_PC3086: + if (gfxcard == GFX_BUILTIN) + return ¶dise_pvga1a_pc3086_device; + break; + + case ROM_MEGAPC: + return ¶dise_wd90c11_megapc_device; + + case ROM_ACER386: + return &oti067_acer386_device; + + case ROM_IBMPS1_2011: + case ROM_IBMPS2_M30_286: + case ROM_IBMPS2_M50: + case ROM_IBMPS2_M55SX: + case ROM_IBMPS2_M80: + return &ps1vga_device; + + case ROM_IBMPS1_2121: + return &ps1_m2121_svga_device; + + case ROM_T3100E: + return &t3100e_device; + + case ROM_T1000: + case ROM_T1200: + return &t1000_device; + + case ROM_ELX_PC425X: + return &tgui9400cxi_elx_device; + + case ROM_PB570: + return &gd5430_pb570_device; + + case ROM_PB520R: + return &gd5434_pb520r_device; + } return video_cards[card].device; } int video_card_has_config(int card) { + if (card == GFX_BUILTIN) + return 0; return video_cards[card].device->config ? 1 : 0; } @@ -161,6 +238,9 @@ int video_card_getid(char *s) c++; } + if (!strcmp(s, "Built-in video")) + return GFX_BUILTIN; + return 0; } @@ -168,6 +248,9 @@ int video_old_to_new(int card) { int c = 0; + if (card == GFX_BUILTIN) + return GFX_BUILTIN; + while (video_cards[c].device) { if (video_cards[c].legacy_id == card) @@ -180,11 +263,17 @@ int video_old_to_new(int card) int video_new_to_old(int card) { + if (card == GFX_BUILTIN) + return GFX_BUILTIN; + return video_cards[card].legacy_id; } char *video_get_internal_name(int card) { + if (card == GFX_BUILTIN) + return "builtin"; + return video_cards[card].internal_name; } @@ -192,6 +281,9 @@ int video_get_video_from_internal_name(char *s) { int c = 0; + if (!strcmp(s, "builtin")) + return GFX_BUILTIN; + while (video_cards[c].legacy_id != -1) { if (!strcmp(video_cards[c].internal_name, s)) @@ -206,18 +298,20 @@ int video_is_mda() { switch (romset) { + case ROM_PC1640: + case ROM_PC200: + case ROM_PC2086: + case ROM_PC3086: + case ROM_MEGAPC: + case ROM_ACER386: + if (gfxcard != GFX_BUILTIN) + break; case ROM_IBMPCJR: case ROM_TANDY: case ROM_TANDY1000HX: case ROM_TANDY1000SL2: case ROM_PC1512: - case ROM_PC1640: - case ROM_PC200: case ROM_OLIM24: - case ROM_PC2086: - case ROM_PC3086: - case ROM_MEGAPC: - case ROM_ACER386: case ROM_IBMPS1_2011: case ROM_IBMPS2_M30_286: case ROM_IBMPS2_M50: @@ -237,12 +331,14 @@ int video_is_cga() { switch (romset) { + case ROM_PC200: + if (gfxcard != GFX_BUILTIN) + break; case ROM_IBMPCJR: case ROM_TANDY: case ROM_TANDY1000HX: case ROM_TANDY1000SL2: case ROM_PC1512: - case ROM_PC200: case ROM_OLIM24: case ROM_T3100E: case ROM_T1000: @@ -253,6 +349,8 @@ int video_is_cga() case ROM_PC3086: case ROM_MEGAPC: case ROM_ACER386: + if (gfxcard != GFX_BUILTIN) + break; case ROM_IBMPS1_2011: case ROM_IBMPS2_M30_286: case ROM_IBMPS2_M50: @@ -370,6 +468,9 @@ void video_updatetiming() video_timings_t *timing; int new_gfxcard = 0; + new_gfxcard = video_old_to_new(gfxcard); + timing = &video_cards[new_gfxcard].timing; + switch (romset) { case ROM_IBMPCJR: @@ -384,11 +485,13 @@ void video_updatetiming() break; case ROM_PC1640: - timing = &timing_pc1640; + if (gfxcard == GFX_BUILTIN) + timing = &timing_pc1640; break; case ROM_PC200: - timing = &timing_pc200; + if (gfxcard == GFX_BUILTIN) + timing = &timing_pc200; break; case ROM_OLIM24: @@ -397,15 +500,18 @@ void video_updatetiming() case ROM_PC2086: case ROM_PC3086: - timing = &timing_pvga1a; + if (gfxcard == GFX_BUILTIN) + timing = &timing_pvga1a; break; case ROM_MEGAPC: - timing = &timing_wd90c11; + if (gfxcard == GFX_BUILTIN) + timing = &timing_wd90c11; break; case ROM_ACER386: - timing = &timing_oti067; + if (gfxcard == GFX_BUILTIN) + timing = &timing_oti067; break; case ROM_IBMPS1_2011: @@ -439,11 +545,6 @@ void video_updatetiming() case ROM_PB520R: timing = &timing_pb520r; break; - - default: - new_gfxcard = video_old_to_new(gfxcard); - timing = &video_cards[new_gfxcard].timing; - break; } @@ -526,32 +627,56 @@ void video_init() return; case ROM_PC1640: - device_add(&pc1640_device); - return; + if (gfxcard == GFX_BUILTIN) + { + device_add(&pc1640_device); + return; + } + break; case ROM_PC200: - device_add(&pc200_device); - return; + if (gfxcard == GFX_BUILTIN) + { + device_add(&pc200_device); + return; + } + break; case ROM_OLIM24: device_add(&m24_device); return; case ROM_PC2086: - device_add(¶dise_pvga1a_pc2086_device); - return; + if (gfxcard == GFX_BUILTIN) + { + device_add(¶dise_pvga1a_pc2086_device); + return; + } + break; case ROM_PC3086: - device_add(¶dise_pvga1a_pc3086_device); - return; + if (gfxcard == GFX_BUILTIN) + { + device_add(¶dise_pvga1a_pc3086_device); + return; + } + break; case ROM_MEGAPC: - device_add(¶dise_wd90c11_megapc_device); - return; + if (gfxcard == GFX_BUILTIN) + { + device_add(¶dise_wd90c11_megapc_device); + return; + } + break; case ROM_ACER386: - device_add(&oti067_acer386_device); - return; + if (gfxcard == GFX_BUILTIN) + { + device_add(&oti067_acer386_device); + return; + } + break; case ROM_IBMPS1_2011: case ROM_IBMPS2_M30_286: diff --git a/src/wx-config.c b/src/wx-config.c index bfcb75f..30b2dc7 100644 --- a/src/wx-config.c +++ b/src/wx-config.c @@ -73,16 +73,17 @@ static int mouse_valid(int type, int model) return FALSE; }*/ -static void recalc_vid_list(void* hdlg, int model) +static void recalc_vid_list(void* hdlg, int model, int force_builtin_video) { void* h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOVID")); int c = 0, d = 0; int found_card = 0; + int cur_gfxcard = gfxcard; wx_sendmessage(h, WX_CB_RESETCONTENT, 0, 0); wx_sendmessage(h, WX_CB_SETCURSEL, 0, 0); - if (models[model].fixed_gfxcard) + if (model_has_fixed_gfx(model)) { wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"Built-in video"); wx_sendmessage(h, WX_CB_SETCURSEL, 0, 0); @@ -92,6 +93,18 @@ static void recalc_vid_list(void* hdlg, int model) return; } + if (model_has_optional_gfx(model)) + { + wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"Built-in video"); + if (gfxcard == GFX_BUILTIN || force_builtin_video) + { + wx_sendmessage(h, WX_CB_SETCURSEL, d, 0); + found_card = 1; + cur_gfxcard = GFX_BUILTIN; + } + d++; + } + while (1) { char *s = video_card_getname(c); @@ -103,7 +116,7 @@ static void recalc_vid_list(void* hdlg, int model) ((models[model].flags & MODEL_PCI) || !(video_card_getdevice(c)->flags & DEVICE_PCI))) { wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)s); - if (video_new_to_old(c) == gfxcard) + if (video_new_to_old(c) == gfxcard && !found_card) { wx_sendmessage(h, WX_CB_SETCURSEL, d, 0); found_card = 1; @@ -119,7 +132,7 @@ static void recalc_vid_list(void* hdlg, int model) wx_enablewindow(h, TRUE); h = wx_getdlgitem(hdlg, WX_ID("IDC_CONFIGUREVID")); - if (video_card_has_config(video_old_to_new(gfxcard))) + if (video_card_has_config(video_old_to_new(cur_gfxcard))) wx_enablewindow(h, TRUE); else wx_enablewindow(h, FALSE); @@ -551,7 +564,7 @@ int config_dlgproc(void* hdlg, int message, INT_PARAM wParam, LONG_PARAM lParam) wx_sendmessage(h, WX_CB_SETCURSEL, modeltolist[model], 0); prev_model = model; - recalc_vid_list(hdlg, romstomodel[romset]); + recalc_vid_list(hdlg, romstomodel[romset], 0); h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOCPUM")); c = 0; @@ -634,12 +647,6 @@ int config_dlgproc(void* hdlg, int message, INT_PARAM wParam, LONG_PARAM lParam) else wx_enablewindow(h, FALSE); - h = wx_getdlgitem(hdlg, WX_ID("IDC_CONFIGUREVID")); - if (video_card_has_config(video_old_to_new(gfxcard)) && !models[romstomodel[romset]].fixed_gfxcard) - wx_enablewindow(h, TRUE); - else - wx_enablewindow(h, FALSE); - h = wx_getdlgitem(hdlg, WX_ID("IDC_CONFIGURESND")); if (sound_card_has_config(sound_card_current)) wx_enablewindow(h, TRUE); @@ -818,14 +825,20 @@ int config_dlgproc(void* hdlg, int message, INT_PARAM wParam, LONG_PARAM lParam) { if (wParam == WX_ID("IDC_COMBO1")) { - int force_ide = 0; + int force_ide = 0; + int force_builtin_video = 0; h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO1")); temp_model = listtomodel[wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0)]; + if (temp_model == prev_model) + break; + if ((models[temp_model].flags & MODEL_HAS_IDE) && !(models[prev_model].flags & MODEL_HAS_IDE)) force_ide = 1; - + if (model_has_optional_gfx(temp_model)) + force_builtin_video = 1; + prev_model = temp_model; /*Rebuild manufacturer list*/ @@ -940,7 +953,7 @@ int config_dlgproc(void* hdlg, int message, INT_PARAM wParam, LONG_PARAM lParam) else wx_sendmessage(h, WX_CB_SETCURSEL, 0, 0); - recalc_vid_list(hdlg, temp_model); + recalc_vid_list(hdlg, temp_model, force_builtin_video); recalc_hdd_list(hdlg, temp_model, 1, force_ide); @@ -1052,7 +1065,7 @@ int config_dlgproc(void* hdlg, int message, INT_PARAM wParam, LONG_PARAM lParam) gfx = video_card_getid(temp_str); h = wx_getdlgitem(hdlg, WX_ID("IDC_CONFIGUREVID")); - if (video_card_has_config(gfx) && !models[temp_model].fixed_gfxcard) + if (video_card_has_config(gfx) && !model_has_fixed_gfx(temp_model)) wx_enablewindow(h, TRUE); else wx_enablewindow(h, FALSE);