diff --git a/src/config.c b/src/config.c index 733666e3e..110d93b9c 100644 --- a/src/config.c +++ b/src/config.c @@ -8,7 +8,7 @@ * * Configuration file handler. * - * Version: @(#)config.c 1.0.52 2018/09/06 + * Version: @(#)config.c 1.0.53 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -566,7 +566,7 @@ load_video(void) if (machines[machine].fixed_gfxcard) { config_delete_var(cat, "gfxcard"); - gfxcard = GFX_INTERNAL; + gfxcard = VID_INTERNAL; } else { p = config_get_string(cat, "gfxcard", NULL); if (p == NULL) { @@ -1310,7 +1310,7 @@ config_load(void) #endif scale = 1; machine = machine_get_machine_from_internal_name("ibmpc"); - gfxcard = GFX_CGA; + gfxcard = VID_CGA; vid_api = plat_vidapi("default"); time_sync = TIME_SYNC_ENABLED; joystick_type = 7; diff --git a/src/machine/m_amstrad.c b/src/machine/m_amstrad.c index 62614afee..f29a2c59c 100644 --- a/src/machine/m_amstrad.c +++ b/src/machine/m_amstrad.c @@ -32,7 +32,7 @@ * in alpha mode, but in highres ("ECD350") mode, it displays * some semi-random junk. Video-memory pointer maybe? * - * Version: @(#)m_amstrad.c 1.0.14 2018/04/29 + * Version: @(#)m_amstrad.c 1.0.15 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -151,6 +151,10 @@ static uint8_t crtc_mask[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +static video_timings_t timing_pc1512 = {VIDEO_BUS, 0,0,0, 0,0,0}; /*PC1512 video code handles waitstates itself*/ +static video_timings_t timing_pc1640 = {VIDEO_ISA, 8,16,32, 8,16,32}; +static video_timings_t timing_pc200 = {VIDEO_ISA, 8,16,32, 8,16,32}; + #ifdef ENABLE_AMSTRAD_LOG int amstrad_do_log = ENABLE_AMSTRAD_LOG; @@ -543,6 +547,8 @@ vid_init_1512(amstrad_t *ams) vid = (amsvid_t *)malloc(sizeof(amsvid_t)); memset(vid, 0x00, sizeof(amsvid_t)); + video_inform(VIDEO_FLAG_TYPE_CGA, &timing_pc1512); + vid->vram = malloc(0x10000); vid->cgacol = 7; vid->cgamode = 0x12; @@ -700,6 +706,8 @@ vid_init_1640(amstrad_t *ams) vid = (amsvid_t *)malloc(sizeof(amsvid_t)); memset(vid, 0x00, sizeof(amsvid_t)); + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_pc1640); + rom_init(&vid->bios_rom, L"roms/machines/pc1640/40100", 0xc0000, 0x8000, 0x7fff, 0, 0); @@ -840,6 +848,8 @@ vid_init_200(amstrad_t *ams) vid = (amsvid_t *)malloc(sizeof(amsvid_t)); memset(vid, 0x00, sizeof(amsvid_t)); + video_inform(VIDEO_FLAG_TYPE_CGA, &timing_pc200); + cga = &vid->cga; cga->vram = malloc(0x4000); cga_init(cga); @@ -1247,7 +1257,7 @@ machine_amstrad_init(const machine_t *model) break; } - if (gfxcard == GFX_INTERNAL) switch(romset) { + if (gfxcard == VID_INTERNAL) switch(romset) { case ROM_PC1512: loadfont(L"roms/machines/pc1512/40078", 2); vid_init_1512(ams); diff --git a/src/machine/m_at_4x0.c b/src/machine/m_at_4x0.c index 3895170dd..3efaa2be7 100644 --- a/src/machine/m_at_4x0.c +++ b/src/machine/m_at_4x0.c @@ -8,7 +8,7 @@ * * Implementation of the Intel PCISet chips from 430LX to 440FX. * - * Version: @(#)m_at_430lx_nx.c 1.0.2 2018/09/15 + * Version: @(#)m_at_430lx_nx.c 1.0.3 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -573,7 +573,7 @@ machine_at_endeavor_init(const machine_t *model) device_add(&intel_flash_bxt_ami_device); - if (gfxcard == GFX_INTERNAL) + if (gfxcard == VID_INTERNAL) device_add(&s3_phoenix_trio64_onboard_pci_device); } @@ -693,7 +693,7 @@ machine_at_pb640_init(const machine_t *model) device_add(&intel_flash_bxt_ami_device); - if (gfxcard == GFX_INTERNAL) + if (gfxcard == VID_INTERNAL) device_add(&gd5440_onboard_pci_device); } diff --git a/src/machine/m_at_headland.c b/src/machine/m_at_headland.c index b9634f0ed..dd49b3332 100644 --- a/src/machine/m_at_headland.c +++ b/src/machine/m_at_headland.c @@ -554,7 +554,7 @@ machine_at_tg286m_init(const machine_t *model) machine_at_headland_common_init(0); - if (gfxcard == GFX_INTERNAL) + if (gfxcard == VID_INTERNAL) device_add(&et4000k_tg286_isa_device); } @@ -573,6 +573,6 @@ machine_at_ama932j_init(const machine_t *model) machine_at_headland_common_init(1); - if (gfxcard == GFX_INTERNAL) + if (gfxcard == VID_INTERNAL) device_add(&oti067_ama932j_device); } diff --git a/src/machine/m_at_t3100e_vid.c b/src/machine/m_at_t3100e_vid.c index 55abf3149..3b7dd8e48 100644 --- a/src/machine/m_at_t3100e_vid.c +++ b/src/machine/m_at_t3100e_vid.c @@ -22,7 +22,7 @@ * 61 50 52 0F 19 06 19 19 02 0D 0B 0C MONO * 2D 28 22 0A 67 00 64 67 02 03 06 07 640x400 * - * Version: @(#)m_at_t3100e_vid.c 1.0.6 2018/04/29 + * Version: @(#)m_at_t3100e_vid.c 1.0.7 2018/09/19 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -128,6 +128,8 @@ typedef struct t3100e_t uint8_t *vram; } t3100e_t; +static video_timings_t timing_t3100e = {VIDEO_ISA, 8,16,32, 8,16,32}; + void t3100e_recalctimings(t3100e_t *t3100e); void t3100e_write(uint32_t addr, uint8_t val, void *p); @@ -708,6 +710,7 @@ void *t3100e_init(const device_t *info) t3100e_t *t3100e = malloc(sizeof(t3100e_t)); memset(t3100e, 0, sizeof(t3100e_t)); cga_init(&t3100e->cga); + video_inform(VIDEO_FLAG_TYPE_CGA, &timing_t3100e); t3100e->internal = 1; diff --git a/src/machine/m_europc.c b/src/machine/m_europc.c index 6ef985396..4b1e58e3c 100644 --- a/src/machine/m_europc.c +++ b/src/machine/m_europc.c @@ -590,22 +590,13 @@ europc_boot(const device_t *info) * with values set by the user. */ b = (sys->nvr.regs[MRTC_CONF_D] & ~0x17); - switch(gfxcard) { - case GFX_CGA: /* Color, CGA */ - case GFX_COLORPLUS: /* Color, Hercules ColorPlus */ - b |= 0x12; /* external video, CGA80 */ - break; + if (video_is_cga()) + b |= 0x12; /* external video, CGA80 */ + else if (video_is_mda()) + b |= 0x03; /* external video, mono */ + else + b |= 0x10; /* external video, special */ - case GFX_MDA: /* Monochrome, MDA */ - case GFX_HERCULES: /* Monochrome, Hercules */ - case GFX_INCOLOR: /* Color, ? */ - b |= 0x03; /* external video, mono */ - break; - - default: /* EGA, VGA etc */ - b |= 0x10; /* external video, special */ - - } sys->nvr.regs[MRTC_CONF_D] = b; /* Update the memory size. */ diff --git a/src/machine/m_olivetti_m24.c b/src/machine/m_olivetti_m24.c index 57a28d7ea..1121bb2b2 100644 --- a/src/machine/m_olivetti_m24.c +++ b/src/machine/m_olivetti_m24.c @@ -8,7 +8,7 @@ * * Emulation of the Olivetti M24. * - * Version: @(#)m_olivetti_m24.c 1.0.14 2018/04/26 + * Version: @(#)m_olivetti_m24.c 1.0.19 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -95,6 +95,8 @@ typedef struct { int x, y, b; } olim24_t; +static video_timings_t timing_m24 = {VIDEO_ISA, 8,16,32, 8,16,32}; + static uint8_t crtcmask[32] = { 0xff, 0xff, 0xff, 0xff, 0x7f, 0x1f, 0x7f, 0x7f, @@ -860,6 +862,8 @@ void machine_olim24_video_init(void) { m24 = (olim24_t *)malloc(sizeof(olim24_t)); memset(m24, 0x00, sizeof(olim24_t)); + video_inform(VIDEO_FLAG_TYPE_CGA, &timing_m24); + /* Initialize the video adapter. */ m24->vram = malloc(0x8000); overscan_x = overscan_y = 16; diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 52979f72e..156471176 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -8,7 +8,7 @@ * * Emulation of the IBM PCjr. * - * Version: @(#)m_pcjr.c 1.0.8 2018/04/29 + * Version: @(#)m_pcjr.c 1.0.9 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -92,6 +92,8 @@ typedef struct { uint8_t pb; } pcjr_t; +static video_timings_t timing_dram = {VIDEO_BUS, 0,0,0, 0,0,0}; /*No additional waitstates*/ + static uint8_t crtcmask[32] = { 0xff, 0xff, 0xff, 0xff, 0x7f, 0x1f, 0x7f, 0x7f, @@ -757,6 +759,7 @@ machine_pcjr_init(const machine_t *model) io_sethandler(0x03d0, 16, vid_in, NULL, NULL, vid_out, NULL, NULL, pcjr); timer_add(vid_poll, &pcjr->vidtime, TIMER_ALWAYS_ENABLED, pcjr); + video_inform(VIDEO_FLAG_TYPE_CGA, &timing_dram); device_add_ex(&pcjr_device, pcjr); /* Initialize the keyboard. */ diff --git a/src/machine/m_ps1.c b/src/machine/m_ps1.c index 4e7a555ae..2e5413d0c 100644 --- a/src/machine/m_ps1.c +++ b/src/machine/m_ps1.c @@ -28,7 +28,7 @@ * boot. Sometimes, they do, and then it shows an "Incorrect * DOS" error message?? --FvK * - * Version: @(#)m_ps1.c 1.0.11 2018/09/15 + * Version: @(#)m_ps1.c 1.0.12 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -493,7 +493,7 @@ ps1_setup(int model) #endif /* Initialize the video controller. */ - if (gfxcard == GFX_INTERNAL) + if (gfxcard == VID_INTERNAL) device_add(&ibm_ps1_2121_device); device_add(&fdc_at_ps1_device); diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c index 68c5f6dee..b40e4712a 100644 --- a/src/machine/m_ps2_mca.c +++ b/src/machine/m_ps2_mca.c @@ -8,7 +8,7 @@ * * Implementation of MCA-based PS/2 machines. * - * Version: @(#)m_ps2_mca.c 1.0.1 2018/09/12 + * Version: @(#)m_ps2_mca.c 1.0.2 2018/09/19 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -880,8 +880,8 @@ static void ps2_mca_board_model_50_init() ps2_mca_mem_fffc_init(2); } - if (gfxcard == GFX_INTERNAL) - device_add(&ps1vga_device); + if (gfxcard == VID_INTERNAL) + device_add(&ps1vga_mca_device); } static void ps2_mca_board_model_55sx_init() @@ -945,8 +945,8 @@ static void ps2_mca_board_model_55sx_init() ps2.planar_read = model_55sx_read; ps2.planar_write = model_55sx_write; - if (gfxcard == GFX_INTERNAL) - device_add(&ps1vga_device); + if (gfxcard == VID_INTERNAL) + device_add(&ps1vga_mca_device); } static void mem_encoding_update() @@ -1156,8 +1156,8 @@ static void ps2_mca_board_model_70_type34_init(int is_type4) ps2_mca_mem_fffc_init(8); } - if (gfxcard == GFX_INTERNAL) - device_add(&ps1vga_device); + if (gfxcard == VID_INTERNAL) + device_add(&ps1vga_mca_device); } static void ps2_mca_board_model_80_type2_init(int is486) @@ -1226,8 +1226,8 @@ static void ps2_mca_board_model_80_type2_init(int is486) ps2_mca_mem_fffc_init(4); } - if (gfxcard == GFX_INTERNAL) - device_add(&ps1vga_device); + if (gfxcard == VID_INTERNAL) + device_add(&ps1vga_mca_device); } diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index d159d63c8..7188f7faf 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -8,7 +8,7 @@ * * Emulation of Tandy models 1000, 1000HX and 1000SL2. * - * Version: @(#)m_tandy.c 1.0.7 2018/04/29 + * Version: @(#)m_tandy.c 1.0.8 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -122,6 +122,8 @@ typedef struct { t1kvid_t *vid; } tandy_t; +static video_timings_t timing_dram = {VIDEO_BUS, 0,0,0, 0,0,0}; /*No additional waitstates*/ + static const scancode scancode_tandy[512] = { { {-1}, {-1} }, { {0x01, -1}, {0x81, -1} }, @@ -1352,6 +1354,8 @@ vid_init(tandy_t *dev) vid->memctrl = -1; dev->vid = vid; + video_inform(VIDEO_FLAG_TYPE_CGA, &timing_dram); + display_type = machine_get_config_int("display_type"); vid->composite = (display_type != TANDY_RGB); diff --git a/src/machine/m_xt_t1000.c b/src/machine/m_xt_t1000.c index 29149a498..73e2ea7b6 100644 --- a/src/machine/m_xt_t1000.c +++ b/src/machine/m_xt_t1000.c @@ -51,7 +51,7 @@ * NOTE: Still need to figure out a way to load/save ConfigSys and * HardRAM stuff. Needs to be linked in to the NVR code. * - * Version: @(#)m_xt_t1000.c 1.0.11 2018/09/15 + * Version: @(#)m_xt_t1000.c 1.0.12 2018/09/19 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -918,7 +918,7 @@ machine_xt_t1000_init(const machine_t *model) t1000_nvr_load(); nvr_set_ven_save(t1000_nvr_save); - if (gfxcard == GFX_INTERNAL) + if (gfxcard == VID_INTERNAL) device_add(&t1000_video_device); } @@ -976,7 +976,7 @@ machine_xt_t1200_init(const machine_t *model) t1200_nvr_load(); nvr_set_ven_save(t1200_nvr_save); - if (gfxcard == GFX_INTERNAL) + if (gfxcard == VID_INTERNAL) device_add(&t1200_video_device); } diff --git a/src/machine/m_xt_t1000_vid.c b/src/machine/m_xt_t1000_vid.c index 1eb7e3d24..336d9a846 100644 --- a/src/machine/m_xt_t1000_vid.c +++ b/src/machine/m_xt_t1000_vid.c @@ -9,7 +9,7 @@ * Implementation of the Toshiba T1000 plasma display, which * has a fixed resolution of 640x200 pixels. * - * Version: @(#)m_xt_t1000_vid.c 1.0.8 2018/08/15 + * Version: @(#)m_xt_t1000_vid.c 1.0.9 2018/09/19 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -64,6 +64,8 @@ static uint32_t blinkcols[256][2]; static uint32_t normcols[256][2]; static uint8_t language; +static video_timings_t timing_t1000 = {VIDEO_ISA, 8,16,32, 8,16,32}; + /* Video options set by the motherboard; they will be picked up by the card * on the next poll. @@ -674,6 +676,7 @@ static void *t1000_init(const device_t *info) t1000_t *t1000 = malloc(sizeof(t1000_t)); memset(t1000, 0, sizeof(t1000_t)); cga_init(&t1000->cga); + video_inform(VIDEO_FLAG_TYPE_CGA, &timing_t1000); t1000->internal = 1; diff --git a/src/machine/machine.c b/src/machine/machine.c index 9396de0ba..f0a14a136 100644 --- a/src/machine/machine.c +++ b/src/machine/machine.c @@ -34,6 +34,7 @@ #include "../lpt.h" #include "../serial.h" #include "../cpu/cpu.h" +#include "../video/video.h" #include "machine.h" @@ -66,11 +67,13 @@ machine_log(const char *fmt, ...) void machine_init(void) { + int MCA; machine_log("Initializing as \"%s\"\n", machine_getname()); /* Set up the architecture flags. */ AT = IS_ARCH(machine, MACHINE_AT); PCI = IS_ARCH(machine, MACHINE_PCI); + MCA = IS_ARCH(machine, MACHINE_MCA); /* Resize the memory. */ mem_reset(); @@ -79,8 +82,18 @@ machine_init(void) rom_load_bios(romset); mem_add_bios(); + /* If it's not a PCI or MCA machine, reset the video card + before initializing the machine, to please the EuroPC. */ + if (!PCI && !MCA) + video_reset(gfxcard); + /* All good, boot the machine! */ machines[machine].init(&machines[machine]); + + /* If it's a PCI or MCA machine, reset the video card + after initializing the machine, so the slots work correctly. */ + if (PCI || MCA) + video_reset(gfxcard); } diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 0b47c525b..b58aa9a71 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -11,7 +11,7 @@ * NOTES: OpenAT wip for 286-class machine with open BIOS. * PS2_M80-486 wip, pending receipt of TRM's for machine. * - * Version: @(#)machine_table.c 1.0.39 2018/09/15 + * Version: @(#)machine_table.c 1.0.40 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -36,14 +36,14 @@ const machine_t machines[] = { { "[8088] AMI XT clone", ROM_AMIXT, "amixt", {{"Intel", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA, 64, 640, 64, 0, machine_xt_init, NULL }, { "[8088] Compaq Portable", ROM_PORTABLE, "portable", {{"Intel", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_VIDEO, 128, 640, 128, 0, machine_xt_compaq_init, NULL }, - { "[8088] DTK XT clone", ROM_DTKXT, "dtk", {{"Intel", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA, 64, 640, 64, 0, machine_xt_init, NULL }, + { "[8088] DTK XT clone", ROM_DTKXT, "dtk", {{"Intel", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA, 64, 640, 64, 0, machine_xt_init, NULL }, { "[8088] IBM PC", ROM_IBMPC, "ibmpc", {{"Intel", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA, 64, 640, 32, 0, machine_pc_init, NULL }, - { "[8088] IBM PCjr", ROM_IBMPCJR, "ibmpcjr", {{"Intel", cpus_pcjr}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_VIDEO, 128, 640, 128, 0, machine_pcjr_init, pcjr_get_device }, + { "[8088] IBM PCjr", ROM_IBMPCJR, "ibmpcjr", {{"Intel", cpus_pcjr}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_VIDEO, 128, 640, 128, 0, machine_pcjr_init, pcjr_get_device }, { "[8088] IBM XT", ROM_IBMXT, "ibmxt", {{"Intel", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA, 64, 640, 64, 0, machine_xt_init, NULL }, { "[8088] Generic XT clone", ROM_GENXT, "genxt", {{"Intel", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA, 64, 640, 64, 0, machine_xt_init, NULL }, { "[8088] Juko XT clone", ROM_JUKOPC, "jukopc", {{"Intel", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA, 64, 640, 64, 0, machine_xt_init, NULL }, { "[8088] Phoenix XT clone", ROM_PXXT, "pxxt", {{"Intel", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA, 64, 640, 64, 0, machine_xt_init, NULL }, - { "[8088] Schneider EuroPC", ROM_EUROPC, "europc", {{"Siemens", cpus_europc}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_HDC | MACHINE_VIDEO | MACHINE_MOUSE, 512, 640, 128, 15, machine_europc_init, NULL }, + { "[8088] Schneider EuroPC", ROM_EUROPC, "europc", {{"Siemens", cpus_europc}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_HDC | MACHINE_MOUSE, 512, 640, 128, 15, machine_europc_init, NULL }, { "[8088] Tandy 1000", ROM_TANDY, "tandy", {{"Intel", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA, 128, 640, 128, 0, machine_tandy1k_init, tandy1k_get_device }, { "[8088] Tandy 1000 HX", ROM_TANDY1000HX, "tandy1000hx", {{"Intel", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA, 256, 640, 128, 0, machine_tandy1k_init, tandy1k_hx_get_device }, { "[8088] Toshiba T1000", ROM_T1000, "t1000", {{"Intel", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_VIDEO, 512, 1280, 768, 63, machine_xt_t1000_init, t1000_get_device }, @@ -93,7 +93,7 @@ const machine_t machines[] = { { "[386SX ISA] IBM PS/1 m.2121+ISA", ROM_IBMPS1_2121_ISA, "ibmps1_2121_isa", {{"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC | MACHINE_VIDEO, 1, 6, 1, 63, machine_ps1_m2121_init, NULL }, { "[386SX ISA] KMX-C-02", ROM_KMXC02, "kmxc02", {{"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_AT, 512,16384, 512, 127, machine_at_scatsx_init, NULL }, - { "[386SX MCA] IBM PS/2 model 55SX", ROM_IBMPS2_M55SX, "ibmps2_m55sx", {{"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}, {"", NULL}, {"", NULL}}, 0, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC_PS2 | MACHINE_VIDEO, 1, 8, 1, 63, machine_ps2_model_55sx_init, NULL }, + { "[386SX MCA] IBM PS/2 model 55SX", ROM_IBMPS2_M55SX, "ibmps2_m55sx", {{"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}, {"", NULL}, {"", NULL}}, 0, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC_PS2 | MACHINE_VIDEO, 1, 8, 1, 63, machine_ps2_model_55sx_init, NULL }, { "[386DX ISA] AMI 386DX clone", ROM_AMI386DX_OPTI495, "ami386dx", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 1, 64, 1, 127, machine_at_opti495_ami_init, NULL }, { "[386DX ISA] Amstrad MegaPC 386DX", ROM_MEGAPCDX, "megapcdx", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC | MACHINE_VIDEO, 1, 32, 1, 127, machine_at_wd76c10_init, NULL }, @@ -103,8 +103,8 @@ const machine_t machines[] = { { "[386DX ISA] Compaq Portable III (386)", ROM_PORTABLEIII386, "portableiii386", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_AT | MACHINE_HDC | MACHINE_VIDEO, 1, 14, 1, 127, machine_at_compaq_init, NULL }, #endif - { "[386DX MCA] IBM PS/2 model 70 (type 3)", ROM_IBMPS2_M70_TYPE3, "ibmps2_m70_type3", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, 0, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC_PS2 | MACHINE_VIDEO, 2, 16, 2, 63, machine_ps2_model_70_type3_init, NULL }, - { "[386DX MCA] IBM PS/2 model 80", ROM_IBMPS2_M80, "ibmps2_m80", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, 0, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC_PS2 | MACHINE_VIDEO, 1, 12, 1, 63, machine_ps2_model_80_init, NULL }, + { "[386DX MCA] IBM PS/2 model 70 (type 3)", ROM_IBMPS2_M70_TYPE3, "ibmps2_m70_type3", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, 0, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC_PS2 | MACHINE_VIDEO, 2, 16, 2, 63, machine_ps2_model_70_type3_init, NULL }, + { "[386DX MCA] IBM PS/2 model 80", ROM_IBMPS2_M80, "ibmps2_m80", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, 0, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC_PS2 | MACHINE_VIDEO, 1, 12, 1, 63, machine_ps2_model_80_init, NULL }, { "[486 ISA] AMI 486 clone", ROM_AMI486, "ami486", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 64, 1, 127, machine_at_ali1429_init, NULL }, { "[486 ISA] AMI WinBIOS 486", ROM_WIN486, "win486", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 64, 1, 127, machine_at_ali1429_init, NULL }, @@ -113,7 +113,7 @@ const machine_t machines[] = { { "[486 ISA] IBM PS/1 model 2133", ROM_IBMPS1_2133, "ibmps1_2133", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC | MACHINE_NONMI, 1, 64, 1, 127, machine_ps1_m2133_init, NULL }, #if defined(DEV_BRANCH) && defined(USE_PS2M70T4) - { "[486 MCA] IBM PS/2 model 70 (type 4)", ROM_IBMPS2_M70_TYPE4, "ibmps2_m70_type4", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, 0, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC_PS2 | MACHINE_VIDEO, 2, 16, 2, 63, machine_ps2_model_70_type4_init, NULL }, + { "[486 MCA] IBM PS/2 model 70 (type 4)", ROM_IBMPS2_M70_TYPE4, "ibmps2_m70_type4", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, 0, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC_PS2 | MACHINE_VIDEO, 2, 16, 2, 63, machine_ps2_model_70_type4_init, NULL }, #endif { "[486 PCI] Rise Computer R418", ROM_R418, "r418", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, 0, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 255, 1, 127, machine_at_r418_init, NULL }, diff --git a/src/mem.c b/src/mem.c index a85905a28..8718c96b1 100644 --- a/src/mem.c +++ b/src/mem.c @@ -12,7 +12,7 @@ * the DYNAMIC_TABLES=1 enables this. Will eventually go * away, either way... * - * Version: @(#)mem.c 1.0.13 2018/09/15 + * Version: @(#)mem.c 1.0.14 2018/09/19 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -1691,15 +1691,7 @@ mem_reset(void) } biosmask = 0xffff; - /* - * Always allocate the full 16 MB memory space if memory size - * is smaller, we'll need this for stupid things like the PS/2 - * split mapping. - */ - if (mem_size < 16384) - m = 1024UL * 16384; - else - m = 1024UL * mem_size; + m = 1024UL * mem_size; if (ram != NULL) { free(ram); ram = NULL; @@ -1776,15 +1768,6 @@ mem_log("MEM: reset: new pages=%08lx, pages_sz=%i\n", pages, pages_sz); pages[c].write_l = mem_write_raml_page; } - if (pages_sz > 256) { - for (c = ((mem_size * 1024) >> 12); c < (((mem_size + 256) * 1024) >> 12); c++) { - pages[c].mem = &ram[0xA0000 + ((c - ((mem_size * 1024) >> 12)) << 12)]; - pages[c].write_b = mem_write_ramb_page; - pages[c].write_w = mem_write_ramw_page; - pages[c].write_l = mem_write_raml_page; - } - } - memset(_mem_read_b, 0x00, sizeof(_mem_read_b)); memset(_mem_read_w, 0x00, sizeof(_mem_read_w)); memset(_mem_read_l, 0x00, sizeof(_mem_read_l)); @@ -1878,6 +1861,7 @@ mem_init(void) void mem_remap_top(int kb) { + int c; uint32_t start = (mem_size >= 1024) ? mem_size : 1024; int size = mem_size - 640; @@ -1894,10 +1878,17 @@ pclog("MEM: remapping top %iKB (mem=%i)\n", kb, mem_size); if (size > kb) size = kb; + for (c = ((start * 1024) >> 12); c < (((start + size) * 1024) >> 12); c++) { + pages[c].mem = &ram[0xA0000 + ((c - ((start * 1024) >> 12)) << 12)]; + pages[c].write_b = mem_write_ramb_page; + pages[c].write_w = mem_write_ramw_page; + pages[c].write_l = mem_write_raml_page; + } + mem_set_mem_state(start * 1024, size * 1024, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); mem_mapping_set_addr(&ram_remapped_mapping, start * 1024, size * 1024); - mem_mapping_set_exec(&ram_remapped_mapping, ram + (start * 1024)); + mem_mapping_set_exec(&ram_remapped_mapping, ram + (start * 1024)); flushmmucache(); } diff --git a/src/pc.c b/src/pc.c index 5f302cd4e..f3dafd4fe 100644 --- a/src/pc.c +++ b/src/pc.c @@ -8,7 +8,7 @@ * * Main emulator module where most things are controlled. * - * Version: @(#)pc.c 1.0.76 2018/09/02 + * Version: @(#)pc.c 1.0.77 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -139,7 +139,7 @@ int atfullspeed; int cpuspeed2; int clockrate; -int gfx_present[GFX_MAX]; /* should not be here */ +int gfx_present[VID_MAX]; /* should not be here */ wchar_t exe_path[1024]; /* path (dir) of executable */ wchar_t usr_path[1024]; /* path (dir) of user data */ @@ -619,14 +619,14 @@ again: } /* Make sure we have a usable video card. */ - for (c=0; c=0; c--) { + for (c=VID_MAX-1; c>=0; c--) { if (gfx_present[c]) { gfxcard = c; config_save(); @@ -770,7 +770,6 @@ pc_reset_hard_init(void) scsi_disk_hard_reset(); /* Initialize the actual machine and its basic modules. */ - video_font_reset(); /* Reset (deallocate) the video font arrays. */ machine_init(); /* Reset any ISA memory cards. */ @@ -803,9 +802,6 @@ pc_reset_hard_init(void) */ mouse_reset(); - /* Reset the video card. */ - video_reset(gfxcard); - /* Reset the Hard Disk Controller module. */ hdc_reset(); diff --git a/src/video/vid_ati18800.c b/src/video/vid_ati18800.c index 01614c299..f63238fd0 100644 --- a/src/video/vid_ati18800.c +++ b/src/video/vid_ati18800.c @@ -8,7 +8,7 @@ * * ATI 18800 emulation (VGA Edge-16) * - * Version: @(#)vid_ati18800.c 1.0.12 2018/04/29 + * Version: @(#)vid_ati18800.c 1.0.13 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -63,6 +63,8 @@ typedef struct ati18800_t int index; } ati18800_t; +static video_timings_t timing_ati18800 = {VIDEO_ISA, 8, 16, 32, 8, 16, 32}; + static void ati18800_out(uint16_t addr, uint8_t val, void *p) { @@ -190,6 +192,8 @@ static void *ati18800_init(const device_t *info) ati18800_t *ati18800 = malloc(sizeof(ati18800_t)); memset(ati18800, 0, sizeof(ati18800_t)); + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_ati18800); + switch (info->local) { #if defined(DEV_BRANCH) && defined(USE_VGAWONDER) case ATI18800_WONDER: diff --git a/src/video/vid_ati28800.c b/src/video/vid_ati28800.c index d2dc8c067..355261bd5 100644 --- a/src/video/vid_ati28800.c +++ b/src/video/vid_ati28800.c @@ -8,7 +8,7 @@ * * ATI 28800 emulation (VGA Charger and Korean VGA) * - * Version: @(#)vid_ati28800.c 1.0.20 2018/08/14 + * Version: @(#)vid_ati28800.c 1.0.21 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -78,6 +78,8 @@ typedef struct ati28800_t int ksc5601_mode_enabled; } ati28800_t; +static video_timings_t timing_ati28800 = {VIDEO_ISA, 3, 3, 6, 5, 5, 10}; + #ifdef ENABLE_ATI28800_LOG int ati28800_do_log = ENABLE_ATI28800_LOG; @@ -449,6 +451,8 @@ ati28800k_init(const device_t *info) ati28800_t *ati28800 = malloc(sizeof(ati28800_t)); memset(ati28800, 0, sizeof(ati28800_t)); + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_ati28800); + ati28800->memory = device_get_config_int("memory"); ati28800->port_03dd_val = 0; @@ -486,10 +490,12 @@ ati28800_init(const device_t *info) ati28800 = malloc(sizeof(ati28800_t)); memset(ati28800, 0x00, sizeof(ati28800_t)); + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_ati28800); + ati28800->memory = device_get_config_int("memory"); - + switch(info->local) { - case GFX_VGAWONDERXL: + case VID_VGAWONDERXL: ati28800->id = 6; rom_init_interleaved(&ati28800->bios_rom, BIOS_VGAXL_EVEN_PATH, @@ -499,7 +505,7 @@ ati28800_init(const device_t *info) break; #if defined(DEV_BRANCH) && defined(USE_XL24) - case GFX_VGAWONDERXL24: + case VID_VGAWONDERXL24: ati28800->id = 6; rom_init_interleaved(&ati28800->bios_rom, BIOS_XL24_EVEN_PATH, @@ -535,12 +541,12 @@ ati28800_init(const device_t *info) switch (info->local) { - case GFX_VGAWONDERXL: + case VID_VGAWONDERXL: ati_eeprom_load(&ati28800->eeprom, L"ati28800xl.nvr", 0); break; #if defined(DEV_BRANCH) && defined(USE_XL24) - case GFX_VGAWONDERXL24: + case VID_VGAWONDERXL24: ati_eeprom_load(&ati28800->eeprom, L"ati28800xl24.nvr", 0); break; #endif @@ -692,7 +698,7 @@ const device_t compaq_ati28800_device = { "Compaq ATI-28800", DEVICE_ISA, - GFX_VGAWONDERXL, + VID_VGAWONDERXL, ati28800_init, ati28800_close, NULL, compaq_ati28800_available, ati28800_speed_changed, @@ -705,7 +711,7 @@ const device_t ati28800_wonderxl24_device = { "ATI-28800 (VGA Wonder XL24)", DEVICE_ISA, - GFX_VGAWONDERXL24, + VID_VGAWONDERXL24, ati28800_init, ati28800_close, NULL, ati28800_wonderxl24_available, ati28800_speed_changed, diff --git a/src/video/vid_ati_mach64.c b/src/video/vid_ati_mach64.c index cac55a2e8..496d12626 100644 --- a/src/video/vid_ati_mach64.c +++ b/src/video/vid_ati_mach64.c @@ -8,7 +8,7 @@ * * ATi Mach64 graphics card emulation. * - * Version: @(#)vid_ati_mach64.c 1.0.22 2018/07/16 + * Version: @(#)vid_ati_mach64.c 1.0.23 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -256,6 +256,9 @@ typedef struct mach64_t int overlay_v_acc; } mach64_t; +static video_timings_t timing_mach64_isa = {VIDEO_ISA, 3, 3, 6, 5, 5, 10}; +static video_timings_t timing_mach64_vlb_pci = {VIDEO_BUS, 2, 2, 1, 20, 20, 21}; + enum { SRC_BG = 0, @@ -3333,6 +3336,11 @@ static void *mach64gx_init(const device_t *info) { mach64_t *mach64 = mach64_common_init(info); + if (info->flags & DEVICE_ISA) + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_mach64_isa); + else + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_mach64_vlb_pci); + mach64->type = MACH64_GX; mach64->pci = !!(info->flags & DEVICE_PCI); mach64->pci_id = (int)'X' | ((int)'G' << 8); @@ -3360,6 +3368,8 @@ static void *mach64vt2_init(const device_t *info) mach64_t *mach64 = mach64_common_init(info); svga_t *svga = &mach64->svga; + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_mach64_vlb_pci); + mach64->type = MACH64_VT2; mach64->pci = 1; mach64->pci_id = 0x5654; diff --git a/src/video/vid_cga.c b/src/video/vid_cga.c index 6f12a01a5..70ad65a5f 100644 --- a/src/video/vid_cga.c +++ b/src/video/vid_cga.c @@ -8,7 +8,7 @@ * * Emulation of the old and new IBM CGA graphics cards. * - * Version: @(#)vid_cga.c 1.0.16 2018/04/29 + * Version: @(#)vid_cga.c 1.0.17 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -47,6 +47,8 @@ static uint8_t crtcmask[32] = 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +static video_timings_t timing_cga = {VIDEO_ISA, 8, 16, 32, 8, 16, 32}; + void cga_recalctimings(cga_t *cga); void cga_out(uint16_t addr, uint8_t val, void *p) @@ -486,6 +488,7 @@ void *cga_standalone_init(const device_t *info) int display_type; cga_t *cga = malloc(sizeof(cga_t)); memset(cga, 0, sizeof(cga_t)); + video_inform(VIDEO_FLAG_TYPE_CGA, &timing_cga); display_type = device_get_config_int("display_type"); cga->composite = (display_type != CGA_RGB); diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index 6e501e4ae..2290794f0 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -9,7 +9,7 @@ * Emulation of select Cirrus Logic cards (CL-GD 5428, * CL-GD 5429, CL-GD 5430, CL-GD 5434 and CL-GD 5436 are supported). * - * Version: @(#)vid_cl_54xx.c 1.0.20 2018/07/16 + * Version: @(#)vid_cl_54xx.c 1.0.21 2018/09/19 * * Authors: Sarah Walker, * Barry Rodewald, @@ -181,6 +181,11 @@ typedef struct gd54xx_t PALETTE extpal; } gd54xx_t; + +static video_timings_t timing_gd54xx_isa = {VIDEO_ISA, 3, 3, 6, 8, 8, 12}; +static video_timings_t timing_gd54xx_vlb_pci = {VIDEO_BUS, 4, 4, 8, 10, 10, 20}; + + static void gd543x_mmio_write(uint32_t addr, uint8_t val, void *p); static void @@ -2249,6 +2254,11 @@ static void if (romfn) rom_init(&gd54xx->bios_rom, romfn, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); + if (info->flags & DEVICE_ISA) + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_gd54xx_isa); + else + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_gd54xx_vlb_pci); + svga_init(&gd54xx->svga, gd54xx, gd54xx->vram_size << 20, gd54xx_recalctimings, gd54xx_in, gd54xx_out, gd54xx_hwcursor_draw, NULL); diff --git a/src/video/vid_colorplus.c b/src/video/vid_colorplus.c index 95d82c70f..fbea870a4 100644 --- a/src/video/vid_colorplus.c +++ b/src/video/vid_colorplus.c @@ -8,7 +8,7 @@ * * Plantronics ColorPlus emulation. * - * Version: @(#)vid_colorplus.c 1.0.9 2018/04/26 + * Version: @(#)vid_colorplus.c 1.0.10 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -52,6 +52,9 @@ #define COMPOSITE_NEW 1 +video_timings_t timing_colorplus = {VIDEO_ISA, 8, 16, 32, 8, 16, 32}; + + void cga_recalctimings(cga_t *cga); void colorplus_out(uint16_t addr, uint8_t val, void *p) @@ -392,6 +395,8 @@ void *colorplus_standalone_init(const device_t *info) colorplus_t *colorplus = malloc(sizeof(colorplus_t)); memset(colorplus, 0, sizeof(colorplus_t)); + video_inform(VIDEO_FLAG_TYPE_CGA, &timing_colorplus); + /* Copied from the CGA init. Ideally this would be done by * calling a helper function rather than duplicating code */ display_type = device_get_config_int("display_type"); diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c index 426d23957..df05ccd13 100644 --- a/src/video/vid_ega.c +++ b/src/video/vid_ega.c @@ -9,7 +9,7 @@ * Emulation of the EGA, Chips & Technologies SuperEGA, and * AX JEGA graphics cards. * - * Version: @(#)vid_ega.c 1.0.17 2018/04/26 + * Version: @(#)vid_ega.c 1.0.18 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -48,6 +48,8 @@ enum { }; +static video_timings_t timing_ega = {VIDEO_ISA, 8, 16, 32, 8, 16, 32}; + extern uint8_t edatlookup[4][4]; static uint8_t ega_rotate[8][256]; @@ -994,6 +996,8 @@ static void *ega_standalone_init(const device_t *info) memset(ega, 0, sizeof(ega_t)); + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_ega); + overscan_x = 16; overscan_y = 28; @@ -1134,7 +1138,7 @@ static void LoadFontxFile(wchar_t *fname) void *jega_standalone_init(const device_t *info) { - ega_t *ega = (ega_t *)ega_standalone_init(info); + ega_t *ega = (ega_t *) ega_standalone_init(info); LoadFontxFile(L"roms/video/ega/JPNHN19X.FNT"); LoadFontxFile(L"roms/video/ega/JPNZN16X.FNT"); diff --git a/src/video/vid_et4000.c b/src/video/vid_et4000.c index c2ea40a2a..3292b774c 100644 --- a/src/video/vid_et4000.c +++ b/src/video/vid_et4000.c @@ -8,7 +8,7 @@ * * Emulation of the Tseng Labs ET4000. * - * Version: @(#)vid_et4000.c 1.0.17 2018/09/15 + * Version: @(#)vid_et4000.c 1.0.19 2018/09/19 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -94,6 +94,9 @@ static const uint8_t crtc_mask[0x40] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +static video_timings_t timing_et4000_isa = {VIDEO_ISA, 3, 3, 6, 5, 5, 10}; +static video_timings_t timing_et4000_mca = {VIDEO_MCA, 4, 5, 10, 5, 5, 10}; + static uint8_t et4000_in(uint16_t addr, void *priv) @@ -490,6 +493,7 @@ et4000_init(const device_t *info) switch(dev->type) { case 0: /* ISA ET4000AX */ dev->vram_size = device_get_config_int("memory") << 10; + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_et4000_isa); svga_init(&dev->svga, dev, dev->vram_size, et4000_recalctimings, et4000_in, et4000_out, NULL, NULL); @@ -499,6 +503,7 @@ et4000_init(const device_t *info) case 1: /* MCA ET4000AX */ dev->vram_size = 1024 << 10; + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_et4000_mca); svga_init(&dev->svga, dev, dev->vram_size, et4000_recalctimings, et4000_in, et4000_out, NULL, NULL); @@ -515,6 +520,7 @@ et4000_init(const device_t *info) dev->port_22cb_val = 0x60; dev->port_32cb_val = 0; dev->svga.ksc5601_sbyte_mask = 0x80; + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_et4000_isa); svga_init(&dev->svga, dev, dev->vram_size, et4000_recalctimings, et4000k_in, et4000k_out, NULL, NULL); @@ -536,7 +542,7 @@ et4000_init(const device_t *info) rom_init(&dev->bios_rom, (wchar_t *) fn, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); - pclog("VIDEO: %s (vram=%dKB)\n", dev->name, dev->vram_size>>10); + /* pclog("VIDEO: %s (vram=%dKB)\n", dev->name, dev->vram_size>>10); */ return(dev); } diff --git a/src/video/vid_et4000w32.c b/src/video/vid_et4000w32.c index 10328ce5f..35ba8ba09 100644 --- a/src/video/vid_et4000w32.c +++ b/src/video/vid_et4000w32.c @@ -10,7 +10,7 @@ * * Known bugs: Accelerator doesn't work in planar modes * - * Version: @(#)vid_et4000w32.c 1.0.16 2018/08/26 + * Version: @(#)vid_et4000w32.c 1.0.17 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -152,6 +152,8 @@ typedef struct et4000w32p_t uint32_t key; } et4000w32p_t; +static video_timings_t timing_et4000w32 = {VIDEO_BUS, 4, 4, 4, 10, 10, 10}; + void et4000w32p_recalcmapping(et4000w32p_t *et4000); uint8_t et4000w32p_mmu_read(uint32_t addr, void *p); @@ -1256,7 +1258,9 @@ void *et4000w32p_init(const device_t *info) vram_size = device_get_config_int("memory"); et4000->interleaved = (vram_size == 2) ? 1 : 0; - + + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_et4000w32); + svga_init(&et4000->svga, et4000, vram_size << 20, et4000w32p_recalctimings, et4000w32p_in, et4000w32p_out, diff --git a/src/video/vid_genius.c b/src/video/vid_genius.c index 91d1bce61..9eb978e6d 100644 --- a/src/video/vid_genius.c +++ b/src/video/vid_genius.c @@ -8,7 +8,7 @@ * * MDSI Genius VHR emulation. * - * Version: @(#)vid_genius.c 1.0.10 2018/05/20 + * Version: @(#)vid_genius.c 1.0.11 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -40,7 +40,9 @@ #define GENIUS_YSIZE 1008 -extern uint8_t fontdat8x12[256][16]; +extern uint8_t fontdat8x12[256][16]; + +static video_timings_t timing_genius = {VIDEO_ISA, 8, 16, 32, 8, 16, 32}; /* I'm at something of a disadvantage writing this emulation: I don't have an @@ -573,6 +575,7 @@ void *genius_init(const device_t *info) int c; genius_t *genius = malloc(sizeof(genius_t)); memset(genius, 0, sizeof(genius_t)); + video_inform(VIDEO_FLAG_TYPE_MDA, &timing_genius); /* 160k video RAM */ genius->vram = malloc(0x28000); diff --git a/src/video/vid_hercules.c b/src/video/vid_hercules.c index 0724fb433..f852469c6 100644 --- a/src/video/vid_hercules.c +++ b/src/video/vid_hercules.c @@ -8,7 +8,7 @@ * * Hercules emulation. * - * Version: @(#)vid_hercules.c 1.0.11 2018/04/29 + * Version: @(#)vid_hercules.c 1.0.12 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -58,6 +58,8 @@ typedef struct hercules_t uint8_t *vram; } hercules_t; +static video_timings_t timing_hercules = {VIDEO_ISA, 8, 16, 32, 8, 16, 32}; + static int mdacols[256][2][2]; void hercules_recalctimings(hercules_t *hercules); @@ -332,6 +334,7 @@ void *hercules_init(const device_t *info) int c; hercules_t *hercules = malloc(sizeof(hercules_t)); memset(hercules, 0, sizeof(hercules_t)); + video_inform(VIDEO_FLAG_TYPE_MDA, &timing_hercules); hercules->vram = malloc(0x10000); diff --git a/src/video/vid_herculesplus.c b/src/video/vid_herculesplus.c index 1bf4118fc..2a91e554b 100644 --- a/src/video/vid_herculesplus.c +++ b/src/video/vid_herculesplus.c @@ -8,7 +8,7 @@ * * Hercules InColor emulation. * - * Version: @(#)vid_herculesplus.c 1.0.9 2018/04/29 + * Version: @(#)vid_herculesplus.c 1.0.10 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -74,7 +74,7 @@ typedef struct herculesplus_t int64_t dispontime, dispofftime; int64_t vidtime; - + int firstline, lastline; int linepos, displine; @@ -88,6 +88,8 @@ typedef struct herculesplus_t uint8_t *vram; } herculesplus_t; +static video_timings_t timing_herculesplus = {VIDEO_ISA, 8, 16, 32, 8, 16, 32}; + void herculesplus_recalctimings(herculesplus_t *herculesplus); void herculesplus_write(uint32_t addr, uint8_t val, void *p); uint8_t herculesplus_read(uint32_t addr, void *p); @@ -681,6 +683,7 @@ void *herculesplus_init(const device_t *info) int c; herculesplus_t *herculesplus = malloc(sizeof(herculesplus_t)); memset(herculesplus, 0, sizeof(herculesplus_t)); + video_inform(VIDEO_FLAG_TYPE_MDA, &timing_herculesplus); herculesplus->vram = malloc(0x10000); /* 64k VRAM */ diff --git a/src/video/vid_incolor.c b/src/video/vid_incolor.c index f1cf1c1a1..8e1988a40 100644 --- a/src/video/vid_incolor.c +++ b/src/video/vid_incolor.c @@ -8,7 +8,7 @@ * * Hercules InColor emulation. * - * Version: @(#)vid_incolor.c 1.0.10 2018/04/29 + * Version: @(#)vid_incolor.c 1.0.11 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -189,6 +189,8 @@ typedef struct incolor_t uint8_t *vram; } incolor_t; +static video_timings_t timing_incolor = {VIDEO_ISA, 8, 16, 32, 8, 16, 32}; + void incolor_recalctimings(incolor_t *incolor); void incolor_write(uint32_t addr, uint8_t val, void *p); uint8_t incolor_read(uint32_t addr, void *p); @@ -1028,6 +1030,7 @@ void *incolor_init(const device_t *info) int c; incolor_t *incolor = malloc(sizeof(incolor_t)); memset(incolor, 0, sizeof(incolor_t)); + video_inform(VIDEO_FLAG_TYPE_MDA, &timing_incolor); incolor->vram = malloc(0x40000); /* 4 planes of 64k */ diff --git a/src/video/vid_mda.c b/src/video/vid_mda.c index 51921bd78..c28155492 100644 --- a/src/video/vid_mda.c +++ b/src/video/vid_mda.c @@ -8,7 +8,7 @@ * * MDA emulation. * - * Version: @(#)vid_mda.c 1.0.11 2018/04/26 + * Version: @(#)vid_mda.c 1.0.12 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -60,6 +60,8 @@ typedef struct mda_t static int mdacols[256][2][2]; +static video_timings_t timing_mda = {VIDEO_ISA, 8, 16, 32, 8, 16, 32}; + void mda_recalctimings(mda_t *mda); void mda_out(uint16_t addr, uint8_t val, void *p) @@ -285,6 +287,7 @@ void *mda_init(const device_t *info) int c; mda_t *mda = malloc(sizeof(mda_t)); memset(mda, 0, sizeof(mda_t)); + video_inform(VIDEO_FLAG_TYPE_MDA, &timing_mda); mda->vram = malloc(0x1000); diff --git a/src/video/vid_oak_oti.c b/src/video/vid_oak_oti.c index 93a6aa8f7..48271fd5b 100644 --- a/src/video/vid_oak_oti.c +++ b/src/video/vid_oak_oti.c @@ -8,7 +8,7 @@ * * Oak OTI037C/67/077 emulation. * - * Version: @(#)vid_oak_oti.c 1.0.12 2018/08/14 + * Version: @(#)vid_oak_oti.c 1.0.13 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -54,6 +54,8 @@ typedef struct { uint8_t chip_id; } oti_t; +static video_timings_t timing_oti = {VIDEO_ISA, 6, 8,16, 6, 8,16}; + static void oti_out(uint16_t addr, uint8_t val, void *p) @@ -288,18 +290,20 @@ oti_init(const device_t *info) oti->vram_size = device_get_config_int("memory"); oti->vram_mask = (oti->vram_size << 10) - 1; - + + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_oti); + svga_init(&oti->svga, oti, oti->vram_size << 10, oti_recalctimings, oti_in, oti_out, NULL, NULL); io_sethandler(0x03c0, 32, oti_in, NULL, NULL, oti_out, NULL, NULL, oti); - io_sethandler(0x46e8, 1, oti_pos_in,NULL,NULL, oti_pos_out,NULL,NULL, oti); - - oti->svga.miscout = 1; + io_sethandler(0x46e8, 1, oti_pos_in,NULL,NULL, oti_pos_out,NULL,NULL, oti); + + oti->svga.miscout = 1; + + oti->regs[0] = 0x08; /* fixme: bios wants to read this at index 0? this index is undocumented */ - oti->regs[0] = 0x08; /* fixme: bios wants to read this at index 0? this index is undocumented */ - return(oti); } diff --git a/src/video/vid_paradise.c b/src/video/vid_paradise.c index 2342c353a..e785c2624 100644 --- a/src/video/vid_paradise.c +++ b/src/video/vid_paradise.c @@ -10,7 +10,7 @@ * PC2086, PC3086 use PVGA1A * MegaPC uses W90C11A * - * Version: @(#)vid_paradise.c 1.0.7 2018/04/26 + * Version: @(#)vid_paradise.c 1.0.8 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -50,6 +50,9 @@ typedef struct paradise_t uint32_t read_bank[4], write_bank[4]; } paradise_t; +static video_timings_t timing_paradise_pvga1a = {VIDEO_ISA, 6, 8, 16, 6, 8, 16}; +static video_timings_t timing_paradise_wd90c = {VIDEO_ISA, 3, 3, 6, 5, 5, 10}; + void paradise_remap(paradise_t *paradise); @@ -280,7 +283,7 @@ static uint16_t paradise_readw(uint32_t addr, void *p) return svga_readw_linear(addr, ¶dise->svga); } -void *paradise_pvga1a_init(const device_t *info, uint32_t memsize) +void *paradise_init(const device_t *info, uint32_t memsize) { paradise_t *paradise = malloc(sizeof(paradise_t)); svga_t *svga = ¶dise->svga; @@ -288,98 +291,67 @@ void *paradise_pvga1a_init(const device_t *info, uint32_t memsize) io_sethandler(0x03c0, 0x0020, paradise_in, NULL, NULL, paradise_out, NULL, NULL, paradise); - svga_init(¶dise->svga, paradise, memsize, /*256kb*/ - NULL, - paradise_in, paradise_out, - NULL, - NULL); + if (info->local == PVGA1A) + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_paradise_pvga1a); + else + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_paradise_wd90c); - mem_mapping_set_handler(¶dise->svga.mapping, paradise_read, paradise_readw, NULL, paradise_write, paradise_writew, NULL); - mem_mapping_set_p(¶dise->svga.mapping, paradise); - - svga->crtc[0x31] = 'W'; - svga->crtc[0x32] = 'D'; - svga->crtc[0x33] = '9'; - svga->crtc[0x34] = '0'; - svga->crtc[0x35] = 'C'; - - svga->bpp = 8; - svga->miscout = 1; - - paradise->type = PVGA1A; - - return paradise; -} - -void *paradise_wd90c11_init(const device_t *info) -{ - paradise_t *paradise = malloc(sizeof(paradise_t)); - svga_t *svga = ¶dise->svga; - memset(paradise, 0, sizeof(paradise_t)); - - io_sethandler(0x03c0, 0x0020, paradise_in, NULL, NULL, paradise_out, NULL, NULL, paradise); - - svga_init(¶dise->svga, paradise, 1 << 19, /*512kb*/ - paradise_recalctimings, - paradise_in, paradise_out, - NULL, - NULL); + switch(info->local) { + case PVGA1A: + svga_init(¶dise->svga, paradise, memsize, /*256kb*/ + NULL, + paradise_in, paradise_out, + NULL, + NULL); + break; + case WD90C11: + svga_init(¶dise->svga, paradise, 1 << 19, /*512kb*/ + paradise_recalctimings, + paradise_in, paradise_out, + NULL, + NULL); + break; + case WD90C30: + svga_init(¶dise->svga, paradise, memsize, + paradise_recalctimings, + paradise_in, paradise_out, + NULL, + NULL); + break; + } mem_mapping_set_handler(¶dise->svga.mapping, paradise_read, paradise_readw, NULL, paradise_write, paradise_writew, NULL); mem_mapping_set_p(¶dise->svga.mapping, paradise); - svga->crtc[0x31] = 'W'; - svga->crtc[0x32] = 'D'; - svga->crtc[0x33] = '9'; - svga->crtc[0x34] = '0'; - svga->crtc[0x35] = 'C'; - svga->crtc[0x36] = '1'; - svga->crtc[0x37] = '1'; + /* Common to all three types. */ + svga->crtc[0x31] = 'W'; + svga->crtc[0x32] = 'D'; + svga->crtc[0x33] = '9'; + svga->crtc[0x34] = '0'; + svga->crtc[0x35] = 'C'; + + switch(info->local) { + case WD90C11: + svga->crtc[0x36] = '1'; + svga->crtc[0x37] = '1'; + break; + case WD90C30: + svga->crtc[0x36] = '3'; + svga->crtc[0x37] = '0'; + break; + } svga->bpp = 8; svga->miscout = 1; - paradise->type = WD90C11; - - return paradise; -} - -void *paradise_wd90c30_init(const device_t *info, uint32_t memsize) -{ - paradise_t *paradise = malloc(sizeof(paradise_t)); - svga_t *svga = ¶dise->svga; - memset(paradise, 0, sizeof(paradise_t)); - - io_sethandler(0x03c0, 0x0020, paradise_in, NULL, NULL, paradise_out, NULL, NULL, paradise); - - svga_init(¶dise->svga, paradise, memsize, - paradise_recalctimings, - paradise_in, paradise_out, - NULL, - NULL); - - mem_mapping_set_handler(¶dise->svga.mapping, paradise_read, paradise_readw, NULL, paradise_write, paradise_writew, NULL); - mem_mapping_set_p(¶dise->svga.mapping, paradise); - - svga->crtc[0x31] = 'W'; - svga->crtc[0x32] = 'D'; - svga->crtc[0x33] = '9'; - svga->crtc[0x34] = '0'; - svga->crtc[0x35] = 'C'; - svga->crtc[0x36] = '3'; - svga->crtc[0x37] = '0'; - - svga->bpp = 8; - svga->miscout = 1; - - paradise->type = WD90C11; + paradise->type = info->local; return paradise; } static void *paradise_pvga1a_pc2086_init(const device_t *info) { - paradise_t *paradise = paradise_pvga1a_init(info, 1 << 18); + paradise_t *paradise = paradise_init(info, 1 << 18); if (paradise) rom_init(¶dise->bios_rom, L"roms/machines/pc2086/40186.ic171", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); @@ -388,7 +360,7 @@ static void *paradise_pvga1a_pc2086_init(const device_t *info) } static void *paradise_pvga1a_pc3086_init(const device_t *info) { - paradise_t *paradise = paradise_pvga1a_init(info, 1 << 18); + paradise_t *paradise = paradise_init(info, 1 << 18); if (paradise) rom_init(¶dise->bios_rom, L"roms/machines/pc3086/c000.bin", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); @@ -404,7 +376,7 @@ static void *paradise_pvga1a_standalone_init(const device_t *info) memory = device_get_config_int("memory"); memory <<= 10; - paradise = paradise_pvga1a_init(info, memory); + paradise = paradise_init(info, memory); if (paradise) rom_init(¶dise->bios_rom, L"roms/video/pvga1a/BIOS.BIN", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); @@ -419,7 +391,7 @@ static int paradise_pvga1a_standalone_available(void) static void *paradise_wd90c11_megapc_init(const device_t *info) { - paradise_t *paradise = paradise_wd90c11_init(info); + paradise_t *paradise = paradise_init(info, 0); if (paradise) rom_init_interleaved(¶dise->bios_rom, @@ -432,7 +404,7 @@ static void *paradise_wd90c11_megapc_init(const device_t *info) static void *paradise_wd90c11_standalone_init(const device_t *info) { - paradise_t *paradise = paradise_wd90c11_init(info); + paradise_t *paradise = paradise_init(info, 0); if (paradise) rom_init(¶dise->bios_rom, L"roms/video/wd90c11/WD90C11.VBI", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); @@ -453,7 +425,7 @@ static void *paradise_wd90c30_standalone_init(const device_t *info) memory = device_get_config_int("memory"); memory <<= 10; - paradise = paradise_wd90c30_init(info, memory); + paradise = paradise_init(info, memory); if (paradise) rom_init(¶dise->bios_rom, L"roms/video/wd90c30/90C30-LR.VBI", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); @@ -494,7 +466,7 @@ const device_t paradise_pvga1a_pc2086_device = { "Paradise PVGA1A (Amstrad PC2086)", 0, - 0, + PVGA1A, paradise_pvga1a_pc2086_init, paradise_close, NULL, @@ -507,7 +479,7 @@ const device_t paradise_pvga1a_pc3086_device = { "Paradise PVGA1A (Amstrad PC3086)", 0, - 0, + PVGA1A, paradise_pvga1a_pc3086_init, paradise_close, NULL, @@ -545,7 +517,7 @@ const device_t paradise_pvga1a_device = { "Paradise PVGA1A", DEVICE_ISA, - 0, + PVGA1A, paradise_pvga1a_standalone_init, paradise_close, NULL, @@ -558,7 +530,7 @@ const device_t paradise_wd90c11_megapc_device = { "Paradise WD90C11 (Amstrad MegaPC)", 0, - 0, + WD90C11, paradise_wd90c11_megapc_init, paradise_close, NULL, @@ -571,7 +543,7 @@ const device_t paradise_wd90c11_device = { "Paradise WD90C11-LR", DEVICE_ISA, - 0, + WD90C11, paradise_wd90c11_standalone_init, paradise_close, NULL, @@ -606,7 +578,7 @@ const device_t paradise_wd90c30_device = { "Paradise WD90C30-LR", DEVICE_ISA, - 0, + WD90C30, paradise_wd90c30_standalone_init, paradise_close, NULL, diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 5f9c8c5cc..4ff5f7632 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -8,7 +8,7 @@ * * S3 emulation. * - * Version: @(#)vid_s3.c 1.0.12 2018/09/15 + * Version: @(#)vid_s3.c 1.0.13 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -34,17 +34,19 @@ #include "vid_svga_render.h" #include "vid_sdac_ramdac.h" -#define ROM_PARADISE_BAHAMAS64 L"roms/video/s3/bahamas64.bin" -#define ROM_PHOENIX_VISION864 L"roms/video/s3/86c864p.bin" -#define ROM_PHOENIX_TRIO32 L"roms/video/s3/86c732p.bin" -#define ROM_NUMBER9_9FX L"roms/video/s3/s3_764.bin" -#define ROM_PHOENIX_TRIO64 L"roms/video/s3/86c764x1.bin" -#define ROM_DIAMOND_STEALTH64 L"roms/video/s3/stealt64.bin" +#define ROM_PARADISE_BAHAMAS64 L"roms/video/s3/bahamas64.bin" +#define ROM_PHOENIX_VISION864 L"roms/video/s3/86c864p.bin" +#define ROM_EXPERTCOLOR_DSV3868P_CF55 L"roms/video/s3/1-DSV3868.BIN" +#define ROM_PHOENIX_TRIO32 L"roms/video/s3/86c732p.bin" +#define ROM_NUMBER9_9FX L"roms/video/s3/s3_764.bin" +#define ROM_PHOENIX_TRIO64 L"roms/video/s3/86c764x1.bin" +#define ROM_DIAMOND_STEALTH64 L"roms/video/s3/stealt64.bin" enum { - S3_PARADISE_BAHAMAS64, + S3_EXPERTCOLOR_DSV3868P_CF55, S3_NUMBER9_9FX, + S3_PARADISE_BAHAMAS64, S3_PHOENIX_TRIO32, S3_PHOENIX_TRIO64, S3_PHOENIX_TRIO64_ONBOARD, @@ -59,6 +61,12 @@ enum S3_TRIO64 }; +static video_timings_t timing_s3_stealth64 = {VIDEO_BUS, 2, 2, 4, 26, 26, 42}; +static video_timings_t timing_s3_vision864 = {VIDEO_BUS, 4, 4, 5, 20, 20, 35}; +static video_timings_t timing_s3_vision868 = {VIDEO_BUS, 2, 2, 4, 20, 20, 35}; +static video_timings_t timing_s3_trio32 = {VIDEO_BUS, 4, 3, 5, 26, 26, 42}; +static video_timings_t timing_s3_trio64 = {VIDEO_BUS, 3, 2, 4, 25, 25, 40}; + enum { VRAM_4MB = 0, @@ -2721,30 +2729,42 @@ static void *s3_init(const device_t *info) case S3_PARADISE_BAHAMAS64: bios_fn = ROM_PARADISE_BAHAMAS64; chip = S3_VISION864; + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_s3_vision864); break; case S3_PHOENIX_VISION864: bios_fn = ROM_PHOENIX_VISION864; chip = S3_VISION864; + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_s3_vision864); + break; + case S3_EXPERTCOLOR_DSV3868P_CF55: + bios_fn = ROM_EXPERTCOLOR_DSV3868P_CF55; + chip = S3_VISION864; + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_s3_vision868); break; case S3_PHOENIX_TRIO32: bios_fn = ROM_PHOENIX_TRIO32; chip = S3_TRIO32; + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_s3_trio32); break; case S3_PHOENIX_TRIO64: bios_fn = ROM_PHOENIX_TRIO64; chip = S3_TRIO64; + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_s3_trio64); break; case S3_PHOENIX_TRIO64_ONBOARD: bios_fn = NULL; chip = S3_TRIO64; + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_s3_trio64); break; case S3_DIAMOND_STEALTH64: bios_fn = ROM_DIAMOND_STEALTH64; chip = S3_TRIO64; + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_s3_stealth64); break; case S3_NUMBER9_9FX: bios_fn = ROM_NUMBER9_9FX; chip = S3_TRIO64; + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_s3_trio64); break; default: return NULL; @@ -2853,6 +2873,17 @@ static void *s3_init(const device_t *info) sdac_init(&s3->ramdac); break; + case S3_EXPERTCOLOR_DSV3868P_CF55: + s3->id = 0xe1; /*Vision868*/ + s3->id_ext = 0x90; + s3->id_ext_pci = 0x80; + s3->packed_mmio = 0; + + s3->getclock = sdac_getclock; + s3->getclock_p = &s3->ramdac; + sdac_init(&s3->ramdac); + break; + case S3_PHOENIX_TRIO32: s3->id = 0xe1; /*Trio32*/ s3->id_ext = 0x10; @@ -2896,6 +2927,11 @@ static int s3_phoenix_vision864_available(void) return rom_present(ROM_PHOENIX_VISION864); } +static int s3_expertcolor_dsv3868p_cf55_available(void) +{ + return rom_present(ROM_EXPERTCOLOR_DSV3868P_CF55); +} + static int s3_phoenix_trio32_available(void) { return rom_present(ROM_PHOENIX_TRIO32); @@ -2943,31 +2979,6 @@ static void s3_force_redraw(void *p) s3->svga.fullchange = changeframecount; } -static const device_config_t s3_bahamas64_config[] = -{ - { - "memory", "Memory size", CONFIG_SELECTION, "", 4, - { - { - "1 MB", 1 - }, - { - "2 MB", 2 - }, - { - "4 MB", 4 - }, - /*Vision864 also supports 8 MB, however the Paradise BIOS is buggy (VESA modes don't work correctly)*/ - { - "" - } - } - }, - { - "", "", -1 - } -}; - static const device_config_t s3_9fx_config[] = { { @@ -3052,7 +3063,7 @@ static const device_config_t s3_phoenix_trio64_onboard_config[] = } }; -static const device_config_t s3_phoenix_trio64_config[] = +static const device_config_t s3_config[] = { { "memory", "Memory size", CONFIG_SELECTION, "", 4, @@ -3087,7 +3098,7 @@ const device_t s3_bahamas64_vlb_device = s3_bahamas64_available, s3_speed_changed, s3_force_redraw, - s3_bahamas64_config + s3_config }; const device_t s3_bahamas64_pci_device = @@ -3101,7 +3112,35 @@ const device_t s3_bahamas64_pci_device = s3_bahamas64_available, s3_speed_changed, s3_force_redraw, - s3_bahamas64_config + s3_config +}; + +const device_t s3_expertcolor_vlb_device = +{ + "ExpertColor DSV3868P CF55 (S3 Vision868) VLB", + DEVICE_VLB, + S3_EXPERTCOLOR_DSV3868P_CF55, + s3_init, + s3_close, + NULL, + s3_expertcolor_dsv3868p_cf55_available, + s3_speed_changed, + s3_force_redraw, + s3_config +}; + +const device_t s3_expertcolor_pci_device = +{ + "ExpertColor DSV3868P CF55 (S3 Vision868) PCI", + DEVICE_PCI, + S3_EXPERTCOLOR_DSV3868P_CF55, + s3_init, + s3_close, + NULL, + s3_expertcolor_dsv3868p_cf55_available, + s3_speed_changed, + s3_force_redraw, + s3_config }; const device_t s3_9fx_vlb_device = @@ -3171,7 +3210,7 @@ const device_t s3_phoenix_trio64_vlb_device = s3_phoenix_trio64_available, s3_speed_changed, s3_force_redraw, - s3_phoenix_trio64_config + s3_config }; const device_t s3_phoenix_trio64_onboard_pci_device = @@ -3199,7 +3238,7 @@ const device_t s3_phoenix_trio64_pci_device = s3_phoenix_trio64_available, s3_speed_changed, s3_force_redraw, - s3_phoenix_trio64_config + s3_config }; const device_t s3_phoenix_vision864_vlb_device = @@ -3213,7 +3252,7 @@ const device_t s3_phoenix_vision864_vlb_device = s3_phoenix_vision864_available, s3_speed_changed, s3_force_redraw, - s3_bahamas64_config + s3_config }; const device_t s3_phoenix_vision864_pci_device = @@ -3227,7 +3266,7 @@ const device_t s3_phoenix_vision864_pci_device = s3_phoenix_vision864_available, s3_speed_changed, s3_force_redraw, - s3_bahamas64_config + s3_config }; const device_t s3_diamond_stealth64_vlb_device = @@ -3241,7 +3280,7 @@ const device_t s3_diamond_stealth64_vlb_device = s3_diamond_stealth64_available, s3_speed_changed, s3_force_redraw, - s3_phoenix_trio64_config + s3_config }; const device_t s3_diamond_stealth64_pci_device = @@ -3255,5 +3294,5 @@ const device_t s3_diamond_stealth64_pci_device = s3_diamond_stealth64_available, s3_speed_changed, s3_force_redraw, - s3_phoenix_trio64_config + s3_config }; diff --git a/src/video/vid_s3.h b/src/video/vid_s3.h index 04888acdb..2f4b6bd0d 100644 --- a/src/video/vid_s3.h +++ b/src/video/vid_s3.h @@ -9,7 +9,7 @@ * Emulation of the S3 Trio32, S3 Trio64, and S3 Vision864 * graphics cards. * - * Version: @(#)vid_s3.h 1.0.2 2018/03/18 + * Version: @(#)vid_s3.h 1.0.3 2018/09/19 * * Author: Sarah Walker, * Miran Grca, @@ -19,6 +19,8 @@ const device_t s3_bahamas64_vlb_device; const device_t s3_bahamas64_pci_device; +const device_t s3_expertcolor_vlb_device; +const device_t s3_expertcolor_pci_device; const device_t s3_9fx_vlb_device; const device_t s3_9fx_pci_device; const device_t s3_phoenix_trio32_vlb_device; diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 59a20b2bf..24506534f 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -8,7 +8,7 @@ * * S3 ViRGE emulation. * - * Version: @(#)vid_s3_virge.c 1.0.12 2018/07/16 + * Version: @(#)vid_s3_virge.c 1.0.13 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -65,6 +65,26 @@ static int dither[4][4] = #define FIFO_TYPE 0xff000000 #define FIFO_ADDR 0x00ffffff +#define ROM_DIAMOND_STEALTH3D_2000 L"roms/video/s3virge/s3virge.bin" +#define ROM_DIAMOND_STEALTH3D_3000 L"roms/video/s3virge/diamondstealth3000.vbi" +#define ROM_VIRGE_DX L"roms/video/s3virge/86c375_1.bin" +#define ROM_VIRGE_DX_VBE20 L"roms/video/s3virge/86c375_4.bin" + +enum +{ + S3_DIAMOND_STEALTH3D_2000, + S3_DIAMOND_STEALTH3D_3000, + S3_VIRGE_DX, + S3_VIRGE_DX_VBE20 +}; + +enum +{ + S3_VIRGE, + S3_VIRGEVX, + S3_VIRGEDX +}; + enum { FIFO_INVALID = (0x00 << 24), @@ -141,7 +161,7 @@ typedef struct virge_t int card; int pci; - int is_375; + int chip; int bilinear_enabled; int dithering_enabled; @@ -251,6 +271,10 @@ typedef struct virge_t uint8_t subsys_stat, subsys_cntl; } virge_t; +static video_timings_t timing_diamond_stealth3d_2000 = {VIDEO_BUS, 2, 2, 3, 28, 28, 45}; +static video_timings_t timing_diamond_stealth3d_3000 = {VIDEO_BUS, 2, 2, 4, 26, 26, 42}; +static video_timings_t timing_virge_dx = {VIDEO_BUS, 2, 2, 3, 28, 28, 45}; + static __inline void wake_fifo_thread(virge_t *virge) { thread_set_event(virge->wake_fifo_thread); /*Wake up FIFO thread if moving from idle*/ @@ -481,7 +505,7 @@ static void s3_virge_out(uint16_t addr, uint8_t val, void *p) case 2: case 3: svga->bpp = 15; break; case 4: case 5: svga->bpp = 16; break; case 7: svga->bpp = 24; break; - case 13: svga->bpp = ((gfxcard == GFX_VIRGEVX_VLB) || (gfxcard == GFX_VIRGEVX_PCI)) ? 24 : 32; break; + case 13: svga->bpp = (virge->chip == S3_VIRGEVX) ? 24 : 32; break; default: svga->bpp = 8; break; } break; @@ -596,7 +620,7 @@ static void s3_virge_recalctimings(svga_t *svga) } } - if ((gfxcard != GFX_VIRGEVX_VLB) && (gfxcard != GFX_VIRGEVX_PCI)) + if (virge->chip == S3_VIRGEVX) { if ((svga->bpp == 15) || (svga->bpp == 16)) { @@ -660,7 +684,7 @@ static void s3_virge_recalctimings(svga_t *svga) if (((svga->miscout >> 2) & 3) == 3) { int n = svga->seqregs[0x12] & 0x1f; - int r = (svga->seqregs[0x12] >> 5) & ((virge->is_375 || ((gfxcard == GFX_VIRGEVX_VLB) || (gfxcard == GFX_VIRGEVX_PCI))) ? 7 : 3); + int r = (svga->seqregs[0x12] >> 5) & (((virge->chip == S3_VIRGEVX) || (virge->chip == S3_VIRGEDX)) ? 7 : 3); int m = svga->seqregs[0x13] & 0x7f; double freq = (((double)m + 2) / (((double)n + 2) * (double)(1 << r))) * 14318184.0; @@ -3277,25 +3301,25 @@ static void s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri) tex_sample = virge->bilinear_enabled ? tex_sample_normal_filter : tex_sample_normal; break; case (0 | 8): case (1 | 8): - if (virge->is_375) + if (virge->chip == S3_VIRGEDX) tex_sample = tex_sample_persp_mipmap_375; else tex_sample = tex_sample_persp_mipmap; break; case (2 | 8): case (3 | 8): - if (virge->is_375) + if (virge->chip == S3_VIRGEDX) tex_sample = virge->bilinear_enabled ? tex_sample_persp_mipmap_filter_375 : tex_sample_persp_mipmap_375; else tex_sample = virge->bilinear_enabled ? tex_sample_persp_mipmap_filter : tex_sample_persp_mipmap; break; case (4 | 8): case (5 | 8): - if (virge->is_375) + if (virge->chip == S3_VIRGEDX) tex_sample = tex_sample_persp_normal_375; else tex_sample = tex_sample_persp_normal; break; case (6 | 8): case (7 | 8): - if (virge->is_375) + if (virge->chip == S3_VIRGEDX) tex_sample = virge->bilinear_enabled ? tex_sample_persp_normal_filter_375 : tex_sample_persp_normal_375; else tex_sample = virge->bilinear_enabled ? tex_sample_persp_normal_filter : tex_sample_persp_normal; @@ -3826,13 +3850,33 @@ static void s3_virge_pci_write(int func, int addr, uint8_t val, void *p) static void *s3_virge_init(const device_t *info) { + const wchar_t *bios_fn; virge_t *virge = malloc(sizeof(virge_t)); + memset(virge, 0, sizeof(virge_t)); virge->bilinear_enabled = device_get_config_int("bilinear"); virge->dithering_enabled = device_get_config_int("dithering"); virge->memory_size = device_get_config_int("memory"); + switch(info->local) { + case S3_DIAMOND_STEALTH3D_2000: + bios_fn = ROM_DIAMOND_STEALTH3D_2000; + break; + case S3_DIAMOND_STEALTH3D_3000: + bios_fn = ROM_DIAMOND_STEALTH3D_3000; + break; + case S3_VIRGE_DX: + bios_fn = ROM_VIRGE_DX; + break; + case S3_VIRGE_DX_VBE20: + bios_fn = ROM_VIRGE_DX_VBE20; + break; + default: + free(virge); + return NULL; + } + svga_init(&virge->svga, virge, virge->memory_size << 20, s3_virge_recalctimings, s3_virge_in, s3_virge_out, @@ -3842,7 +3886,7 @@ static void *s3_virge_init(const device_t *info) virge->pci = !!(info->flags & DEVICE_PCI); - rom_init(&virge->bios_rom, L"roms/video/s3virge/s3virge.bin", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); + rom_init(&virge->bios_rom, (wchar_t *) bios_fn, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); if (info->flags & DEVICE_PCI) mem_mapping_disable(&virge->bios_rom.mapping); @@ -3885,8 +3929,6 @@ static void *s3_virge_init(const device_t *info) virge->pci_regs[0x3e] = 4; virge->pci_regs[0x3f] = 0xff; - virge->virge_id_high = 0x56; - virge->virge_id_low = 0x31; virge->virge_rev = 0; virge->virge_id = 0xe1; @@ -3900,18 +3942,37 @@ static void *s3_virge_init(const device_t *info) virge->svga.crtc[0x36] = 2 | (0 << 2) | (1 << 4) | (0 << 5); break; } - + virge->svga.crtc[0x37] = 1; virge->svga.crtc[0x53] = 1 << 3; virge->svga.crtc[0x59] = 0x70; - virge->is_375 = 0; - - if (info->flags & DEVICE_PCI) - { - virge->card = pci_add_card(PCI_ADD_VIDEO, s3_virge_pci_read, s3_virge_pci_write, virge); + switch(info->local) { + case S3_DIAMOND_STEALTH3D_2000: + virge->svga.vblank_start = s3_virge_vblank_start; + virge->virge_id_high = 0x56; + virge->virge_id_low = 0x31; + virge->chip = S3_VIRGE; + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_diamond_stealth3d_2000); + break; + case S3_DIAMOND_STEALTH3D_3000: + virge->virge_id_high = 0x88; + virge->virge_id_low = 0x3d; + virge->chip = S3_VIRGEVX; + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_diamond_stealth3d_3000); + break; + default: + virge->svga.crtc[0x6c] = 0x01; + virge->virge_id_high = 0x8a; + virge->virge_id_low = 0x01; + virge->chip = S3_VIRGEDX; + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_virge_dx); + break; } - + + if (info->flags & DEVICE_PCI) + virge->card = pci_add_card(PCI_ADD_VIDEO, s3_virge_pci_read, s3_virge_pci_write, virge); + virge->wake_render_thread = thread_create_event(); virge->wake_main_thread = thread_create_event(); virge->not_full_event = thread_create_event(); @@ -3924,223 +3985,9 @@ static void *s3_virge_init(const device_t *info) return virge; } -static void *s3_virge_988_init(const device_t *info) -{ - virge_t *virge = malloc(sizeof(virge_t)); - memset(virge, 0, sizeof(virge_t)); - - virge->bilinear_enabled = device_get_config_int("bilinear"); - virge->dithering_enabled = device_get_config_int("dithering"); - virge->memory_size = device_get_config_int("memory"); - - svga_init(&virge->svga, virge, virge->memory_size << 20, - s3_virge_recalctimings, - s3_virge_in, s3_virge_out, - s3_virge_hwcursor_draw, - s3_virge_overlay_draw); - - virge->pci = !!(info->flags & DEVICE_PCI); - - rom_init(&virge->bios_rom, L"roms/video/s3virge/diamondstealth3000.vbi", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); - if (info->flags & DEVICE_PCI) - mem_mapping_disable(&virge->bios_rom.mapping); - - mem_mapping_add(&virge->mmio_mapping, 0, 0, s3_virge_mmio_read, - s3_virge_mmio_read_w, - s3_virge_mmio_read_l, - s3_virge_mmio_write, - s3_virge_mmio_write_w, - s3_virge_mmio_write_l, - NULL, - 0, - virge); - mem_mapping_add(&virge->new_mmio_mapping, 0, 0, s3_virge_mmio_read, - s3_virge_mmio_read_w, - s3_virge_mmio_read_l, - s3_virge_mmio_write, - s3_virge_mmio_write_w, - s3_virge_mmio_write_l, - NULL, - 0, - virge); - mem_mapping_add(&virge->linear_mapping, 0, 0, svga_read_linear, - svga_readw_linear, - svga_readl_linear, - svga_write_linear, - svga_writew_linear, - svga_writel_linear, - NULL, - 0, - &virge->svga); - - io_sethandler(0x03c0, 0x0020, s3_virge_in, NULL, NULL, s3_virge_out, NULL, NULL, virge); - - virge->pci_regs[4] = 3; - virge->pci_regs[5] = 0; - virge->pci_regs[6] = 0; - virge->pci_regs[7] = 2; - virge->pci_regs[0x32] = 0x0c; - virge->pci_regs[0x3d] = 1; - virge->pci_regs[0x3e] = 4; - virge->pci_regs[0x3f] = 0xff; - - virge->virge_id_high = 0x88; - virge->virge_id_low = 0x3d; - virge->virge_rev = 0; - virge->virge_id = 0xe1; - - switch (virge->memory_size) - { - case 2: - virge->svga.crtc[0x36] = 2 | (0 << 2) | (1 << 4) | (4 << 5); - break; - case 4: - default: - virge->svga.crtc[0x36] = 2 | (0 << 2) | (1 << 4) | (0 << 5); - break; - } - - virge->svga.crtc[0x37] = 1; - virge->svga.crtc[0x53] = 1 << 3; - virge->svga.crtc[0x59] = 0x70; - - virge->is_375 = 0; - - if (info->flags & DEVICE_PCI) - { - virge->card = pci_add_card(PCI_ADD_VIDEO, s3_virge_pci_read, s3_virge_pci_write, virge); - } - - virge->wake_render_thread = thread_create_event(); - virge->wake_main_thread = thread_create_event(); - virge->not_full_event = thread_create_event(); - virge->render_thread = thread_create(render_thread, virge); - - virge->wake_fifo_thread = thread_create_event(); - virge->fifo_not_full_event = thread_create_event(); - virge->fifo_thread = thread_create(fifo_thread, virge); - - return virge; -} - -static void *s3_virge_375_init(const device_t *info, wchar_t *romfn) -{ - virge_t *virge = malloc(sizeof(virge_t)); - memset(virge, 0, sizeof(virge_t)); - - virge->bilinear_enabled = device_get_config_int("bilinear"); - virge->dithering_enabled = device_get_config_int("dithering"); - virge->memory_size = device_get_config_int("memory"); - - svga_init(&virge->svga, virge, virge->memory_size << 20, - s3_virge_recalctimings, - s3_virge_in, s3_virge_out, - s3_virge_hwcursor_draw, - s3_virge_overlay_draw); - - virge->pci = !!(info->flags & DEVICE_PCI); - - rom_init(&virge->bios_rom, romfn, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); - if (info->flags & DEVICE_PCI) - mem_mapping_disable(&virge->bios_rom.mapping); - - mem_mapping_add(&virge->mmio_mapping, 0, 0, s3_virge_mmio_read, - s3_virge_mmio_read_w, - s3_virge_mmio_read_l, - s3_virge_mmio_write, - s3_virge_mmio_write_w, - s3_virge_mmio_write_l, - NULL, - 0, - virge); - mem_mapping_add(&virge->new_mmio_mapping, 0, 0, s3_virge_mmio_read, - s3_virge_mmio_read_w, - s3_virge_mmio_read_l, - s3_virge_mmio_write, - s3_virge_mmio_write_w, - s3_virge_mmio_write_l, - NULL, - 0, - virge); - mem_mapping_add(&virge->linear_mapping, 0, 0, svga_read_linear, - svga_readw_linear, - svga_readl_linear, - svga_write_linear, - svga_writew_linear, - svga_writel_linear, - NULL, - 0, - &virge->svga); - - io_sethandler(0x03c0, 0x0020, s3_virge_in, NULL, NULL, s3_virge_out, NULL, NULL, virge); - - virge->pci_regs[4] = 3; - virge->pci_regs[5] = 0; - virge->pci_regs[6] = 0; - virge->pci_regs[7] = 2; - virge->pci_regs[0x32] = 0x0c; - virge->pci_regs[0x3d] = 1; - virge->pci_regs[0x3e] = 4; - virge->pci_regs[0x3f] = 0xff; - - virge->virge_id_high = 0x8a; - virge->virge_id_low = 0x01; - virge->virge_rev = 0; - virge->virge_id = 0xe1; - - switch (virge->memory_size) - { - case 2: - virge->svga.crtc[0x36] = 2 | (0 << 2) | (1 << 4) | (4 << 5); - break; - case 4: - default: - virge->svga.crtc[0x36] = 2 | (0 << 2) | (1 << 4) | (0 << 5); - break; - } - virge->svga.crtc[0x37] = 1; - virge->svga.crtc[0x53] = 1 << 3; - virge->svga.crtc[0x59] = 0x70; - - virge->svga.crtc[0x6c] = 0x01; - - virge->is_375 = 1; - - if (info->flags & DEVICE_PCI) - { - virge->card = pci_add_card(PCI_ADD_VIDEO, s3_virge_pci_read, s3_virge_pci_write, virge); - } - - virge->wake_render_thread = thread_create_event(); - virge->wake_main_thread = thread_create_event(); - virge->not_full_event = thread_create_event(); - virge->render_thread = thread_create(render_thread, virge); - - virge->wake_fifo_thread = thread_create_event(); - virge->fifo_not_full_event = thread_create_event(); - virge->fifo_thread = thread_create(fifo_thread, virge); - - return virge; -} - -static void *s3_virge_375_1_init(const device_t *info) -{ - return s3_virge_375_init(info, L"roms/video/s3virge/86c375_1.bin"); -} - -static void *s3_virge_375_4_init(const device_t *info) -{ - return s3_virge_375_init(info, L"roms/video/s3virge/86c375_4.bin"); -} - static void s3_virge_close(void *p) { virge_t *virge = (virge_t *)p; -#if 0 - FILE *f = fopen("vram.dmp", "wb"); - fwrite(virge->svga.vram, 4 << 20, 1, f); - fclose(f); -#endif thread_kill(virge->render_thread); thread_destroy_event(virge->not_full_event); @@ -4158,22 +4005,22 @@ static void s3_virge_close(void *p) static int s3_virge_available(void) { - return rom_present(L"roms/video/s3virge/s3virge.bin"); + return rom_present(ROM_DIAMOND_STEALTH3D_2000); } static int s3_virge_988_available(void) { - return rom_present(L"roms/video/s3virge/diamondstealth3000.vbi"); + return rom_present(ROM_DIAMOND_STEALTH3D_3000); } static int s3_virge_375_1_available(void) { - return rom_present(L"roms/video/s3virge/86c375_1.bin"); + return rom_present(ROM_VIRGE_DX); } static int s3_virge_375_4_available(void) { - return rom_present(L"roms/video/s3virge/86c375_4.bin"); + return rom_present(ROM_VIRGE_DX_VBE20); } static void s3_virge_speed_changed(void *p) @@ -4221,7 +4068,7 @@ const device_t s3_virge_vlb_device = { "Diamond Stealth 3D 2000 (S3 ViRGE) VLB", DEVICE_VLB, - 0, + S3_DIAMOND_STEALTH3D_2000, s3_virge_init, s3_virge_close, NULL, @@ -4235,7 +4082,7 @@ const device_t s3_virge_pci_device = { "Diamond Stealth 3D 2000 (S3 ViRGE) PCI", DEVICE_PCI, - 0, + S3_DIAMOND_STEALTH3D_2000, s3_virge_init, s3_virge_close, NULL, @@ -4249,8 +4096,8 @@ const device_t s3_virge_988_vlb_device = { "Diamond Stealth 3D 3000 (S3 ViRGE/VX) VLB", DEVICE_VLB, - 0, - s3_virge_988_init, + S3_DIAMOND_STEALTH3D_3000, + s3_virge_init, s3_virge_close, NULL, s3_virge_988_available, @@ -4263,8 +4110,8 @@ const device_t s3_virge_988_pci_device = { "Diamond Stealth 3D 3000 (S3 ViRGE/VX) PCI", DEVICE_PCI, - 0, - s3_virge_988_init, + S3_DIAMOND_STEALTH3D_3000, + s3_virge_init, s3_virge_close, NULL, s3_virge_988_available, @@ -4277,8 +4124,8 @@ const device_t s3_virge_375_vlb_device = { "S3 ViRGE/DX VLB", DEVICE_VLB, - 0, - s3_virge_375_1_init, + S3_VIRGE_DX, + s3_virge_init, s3_virge_close, NULL, s3_virge_375_1_available, @@ -4291,8 +4138,8 @@ const device_t s3_virge_375_pci_device = { "S3 ViRGE/DX PCI", DEVICE_PCI, - 0, - s3_virge_375_1_init, + S3_VIRGE_DX, + s3_virge_init, s3_virge_close, NULL, s3_virge_375_1_available, @@ -4305,8 +4152,8 @@ const device_t s3_virge_375_4_vlb_device = { "S3 ViRGE/DX (VBE 2.0) VLB", DEVICE_VLB, - 0, - s3_virge_375_4_init, + S3_VIRGE_DX_VBE20, + s3_virge_init, s3_virge_close, NULL, s3_virge_375_4_available, @@ -4319,8 +4166,8 @@ const device_t s3_virge_375_4_pci_device = { "S3 ViRGE/DX (VBE 2.0) PCI", DEVICE_PCI, - 0, - s3_virge_375_4_init, + S3_VIRGE_DX_VBE20, + s3_virge_init, s3_virge_close, NULL, s3_virge_375_4_available, diff --git a/src/video/vid_table.c b/src/video/vid_table.c index 72fdbb530..19123815a 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -8,7 +8,7 @@ * * Define all known video cards. * - * Version: @(#)vid_table.c 1.0.36 2018/09/12 + * Version: @(#)vid_table.c 1.0.37 2018/09/19 * * Authors: Miran Grca, * Fred N. van Kempen, @@ -60,119 +60,110 @@ #include "vid_wy700.h" -enum { - VIDEO_ISA = 0, - VIDEO_MCA, - VIDEO_BUS -}; - -#define VIDEO_FLAG_TYPE_CGA 0 -#define VIDEO_FLAG_TYPE_MDA 1 -#define VIDEO_FLAG_TYPE_SPECIAL 2 -#define VIDEO_FLAG_TYPE_MASK 3 - typedef struct { const char *name; const char *internal_name; const device_t *device; int legacy_id; - int flags; - video_timings_t timing; } VIDEO_CARD; +static video_timings_t timing_default = {VIDEO_ISA, 8, 16, 32, 8, 16, 32}; + static const VIDEO_CARD video_cards[] = { - { "None", "none", NULL, GFX_NONE }, - { "Internal", "internal", NULL, GFX_INTERNAL, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, - { "[ISA] ATI Graphics Pro Turbo (Mach64 GX)", "mach64gx_isa", &mach64gx_isa_device, GFX_MACH64GX_ISA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}}, - { "[ISA] ATI Korean VGA (ATI-28800-5)", "ati28800k", &ati28800k_device, GFX_ATIKOREANVGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}}, - { "[ISA] ATI VGA-88 (ATI-18800-1)", "ati18800v", &ati18800_vga88_device, GFX_VGA88, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, - { "[ISA] ATI VGA Charger (ATI-28800-5)", "ati28800", &ati28800_device, GFX_VGACHARGER, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}}, - { "[ISA] ATI VGA Edge-16 (ATI-18800-5)", "ati18800", &ati18800_device, GFX_VGAEDGE16, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, + { "None", "none", NULL, VID_NONE }, + { "Internal", "internal", NULL, VID_INTERNAL }, + { "[ISA] ATI Graphics Pro Turbo (Mach64 GX)", "mach64gx_isa", &mach64gx_isa_device, VID_MACH64GX_ISA }, + { "[ISA] ATI Korean VGA (ATI-28800-5)", "ati28800k", &ati28800k_device, VID_ATIKOREANVGA }, + { "[ISA] ATI VGA-88 (ATI-18800-1)", "ati18800v", &ati18800_vga88_device, VID_VGA88 }, + { "[ISA] ATI VGA Charger (ATI-28800-5)", "ati28800", &ati28800_device, VID_VGACHARGER }, + { "[ISA] ATI VGA Edge-16 (ATI-18800-5)", "ati18800", &ati18800_device, VID_VGAEDGE16 }, #if defined(DEV_BRANCH) && defined(USE_VGAWONDER) - { "[ISA] ATI VGA Wonder (ATI-18800)", "ati18800w", &ati18800_wonder_device, GFX_VGAWONDER, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, + { "[ISA] ATI VGA Wonder (ATI-18800)", "ati18800w", &ati18800_wonder_device, VID_VGAWONDER }, #endif #if defined(DEV_BRANCH) && defined(USE_XL24) - { "[ISA] ATI VGA Wonder XL24 (ATI-28800-6)", "ati28800w", &ati28800_wonderxl24_device, GFX_VGAWONDERXL24, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}}, + { "[ISA] ATI VGA Wonder XL24 (ATI-28800-6)", "ati28800w", &ati28800_wonderxl24_device, VID_VGAWONDERXL24 }, #endif - { "[ISA] CGA", "cga", &cga_device, GFX_CGA, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, - { "[ISA] Chips & Technologies SuperEGA", "superega", &sega_device, GFX_SUPER_EGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, - { "[ISA] Cirrus Logic CL-GD 5428", "cl_gd5428_isa", &gd5428_isa_device, GFX_CL_GD5428_ISA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 8, 8, 12}}, - { "[ISA] Cirrus Logic CL-GD 5429", "cl_gd5429_isa", &gd5429_isa_device, GFX_CL_GD5429_ISA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 8, 8, 12}}, - { "[ISA] Cirrus Logic CL-GD 5434", "cl_gd5434_isa", &gd5434_isa_device, GFX_CL_GD5434_ISA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 8, 8, 12}}, - { "[ISA] Compaq ATI VGA Wonder XL (ATI-28800-5)", "compaq_ati28800", &compaq_ati28800_device, GFX_VGAWONDERXL, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}}, - { "[ISA] Compaq CGA", "compaq_cga", &compaq_cga_device, GFX_COMPAQ_CGA, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, - { "[ISA] Compaq CGA 2", "compaq_cga_2", &compaq_cga_2_device, GFX_COMPAQ_CGA_2, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, - { "[ISA] Compaq EGA", "compaq_ega", &cpqega_device, GFX_COMPAQ_EGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, - { "[ISA] EGA", "ega", &ega_device, GFX_EGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, - { "[ISA] Hercules", "hercules", &hercules_device, GFX_HERCULES, VIDEO_FLAG_TYPE_MDA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, - { "[ISA] Hercules Plus", "hercules_plus", &herculesplus_device, GFX_HERCULESPLUS, VIDEO_FLAG_TYPE_MDA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, - { "[ISA] Hercules InColor", "incolor", &incolor_device, GFX_INCOLOR, VIDEO_FLAG_TYPE_MDA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, - { "[ISA] MDA", "mda", &mda_device, GFX_MDA, VIDEO_FLAG_TYPE_MDA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, - { "[ISA] MDSI Genius", "genius", &genius_device, GFX_GENIUS, VIDEO_FLAG_TYPE_MDA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, - { "[ISA] OAK OTI-037C", "oti037c", &oti037c_device, GFX_OTI037C, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 6, 8, 16, 6, 8, 16}}, - { "[ISA] OAK OTI-067", "oti067", &oti067_device, GFX_OTI067, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 6, 8, 16, 6, 8, 16}}, - { "[ISA] OAK OTI-077", "oti077", &oti077_device, GFX_OTI077, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 6, 8, 16, 6, 8, 16}}, - { "[ISA] Paradise PVGA1A", "pvga1a", ¶dise_pvga1a_device, GFX_PVGA1A, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, - { "[ISA] Paradise WD90C11-LR", "wd90c11", ¶dise_wd90c11_device, GFX_WD90C11, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, - { "[ISA] Paradise WD90C30-LR", "wd90c30", ¶dise_wd90c30_device, GFX_WD90C30, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 6, 8, 16, 6, 8, 16}}, - { "[ISA] Plantronics ColorPlus", "plantronics", &colorplus_device, GFX_COLORPLUS, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, + { "[ISA] CGA", "cga", &cga_device, VID_CGA }, + { "[ISA] Chips & Technologies SuperEGA", "superega", &sega_device, VID_SUPER_EGA }, + { "[ISA] Cirrus Logic CL-GD 5428", "cl_gd5428_isa", &gd5428_isa_device, VID_CL_GD5428_ISA }, + { "[ISA] Cirrus Logic CL-GD 5429", "cl_gd5429_isa", &gd5429_isa_device, VID_CL_GD5429_ISA }, + { "[ISA] Cirrus Logic CL-GD 5434", "cl_gd5434_isa", &gd5434_isa_device, VID_CL_GD5434_ISA }, + { "[ISA] Compaq ATI VGA Wonder XL (ATI-28800-5)", "compaq_ati28800", &compaq_ati28800_device, VID_VGAWONDERXL }, + { "[ISA] Compaq CGA", "compaq_cga", &compaq_cga_device, VID_COMPAQ_CGA }, + { "[ISA] Compaq CGA 2", "compaq_cga_2", &compaq_cga_2_device, VID_COMPAQ_CGA_2 }, + { "[ISA] Compaq EGA", "compaq_ega", &cpqega_device, VID_COMPAQ_EGA }, + { "[ISA] EGA", "ega", &ega_device, VID_EGA }, + { "[ISA] Hercules", "hercules", &hercules_device, VID_HERCULES }, + { "[ISA] Hercules Plus", "hercules_plus", &herculesplus_device, VID_HERCULESPLUS }, + { "[ISA] Hercules InColor", "incolor", &incolor_device, VID_INCOLOR }, + { "[ISA] MDA", "mda", &mda_device, VID_MDA }, + { "[ISA] MDSI Genius", "genius", &genius_device, VID_GENIUS }, + { "[ISA] OAK OTI-037C", "oti037c", &oti037c_device, VID_OTI037C }, + { "[ISA] OAK OTI-067", "oti067", &oti067_device, VID_OTI067 }, + { "[ISA] OAK OTI-077", "oti077", &oti077_device, VID_OTI077 }, + { "[ISA] Paradise PVGA1A", "pvga1a", ¶dise_pvga1a_device, VID_PVGA1A }, + { "[ISA] Paradise WD90C11-LR", "wd90c11", ¶dise_wd90c11_device, VID_WD90C11 }, + { "[ISA] Paradise WD90C30-LR", "wd90c30", ¶dise_wd90c30_device, VID_WD90C30 }, + { "[ISA] Plantronics ColorPlus", "plantronics", &colorplus_device, VID_COLORPLUS }, #if defined(DEV_BRANCH) && defined(USE_TI) - { "[ISA] TI CF62011 SVGA", "ti_cf62011", &ti_cf62011_device, GFX_TICF62011, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, + { "[ISA] TI CF62011 SVGA", "ti_cf62011", &ti_cf62011_device, VID_TICF62011 }, #endif - {"[ISA] Trident TVGA8900D", "tvga8900d", &tvga8900d_device, GFX_TVGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 8, 8, 12}}, - {"[ISA] Trigem Korean VGA (ET4000AX)", "tgkorvga", &et4000k_isa_device, GFX_TGKOREANVGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}}, - {"[ISA] Tseng ET4000AX", "et4000ax", &et4000_isa_device, GFX_ET4000_ISA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}}, - {"[ISA] VGA", "vga", &vga_device, GFX_VGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, - {"[ISA] Wyse 700", "wy700", &wy700_device, GFX_WY700, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}}, - {"[MCA] Tseng ET4000AX", "et4000mca", &et4000_mca_device, GFX_ET4000_MCA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_MCA, 4, 5, 10, 5, 5, 10}}, - {"[PCI] ATI Graphics Pro Turbo (Mach64 GX)", "mach64gx_pci", &mach64gx_pci_device, GFX_MACH64GX_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 1, 20, 20, 21}}, - {"[PCI] ATI Video Xpression (Mach64 VT2)", "mach64vt2", &mach64vt2_device, GFX_MACH64VT2, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 1, 20, 20, 21}}, - {"[PCI] Cardex Tseng ET4000/w32p", "et4000w32p_pci", &et4000w32p_cardex_pci_device, GFX_ET4000W32_CARDEX_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 4, 10, 10, 10}}, - {"[PCI] Cirrus Logic CL-GD 5430", "cl_gd5430_pci", &gd5430_pci_device, GFX_CL_GD5430_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}}, - {"[PCI] Cirrus Logic CL-GD 5434", "cl_gd5434_pci", &gd5434_pci_device, GFX_CL_GD5434_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}}, - {"[PCI] Cirrus Logic CL-GD 5436", "cl_gd5436_pci", &gd5436_pci_device, GFX_CL_GD5436_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}}, - {"[PCI] Cirrus Logic CL-GD 5440", "cl_gd5440_pci", &gd5440_pci_device, GFX_CL_GD5440_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}}, - {"[PCI] Cirrus Logic CL-GD 5446", "cl_gd5446_pci", &gd5446_pci_device, GFX_CL_GD5446_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}}, - {"[PCI] Cirrus Logic CL-GD 5480", "cl_gd5480_pci", &gd5480_pci_device, GFX_CL_GD5480_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}}, + {"[ISA] Trident TVGA8900D", "tvga8900d", &tvga8900d_device, VID_TVGA }, + {"[ISA] Trigem Korean VGA (ET4000AX)", "tgkorvga", &et4000k_isa_device, VID_TGKOREANVGA }, + {"[ISA] Tseng ET4000AX", "et4000ax", &et4000_isa_device, VID_ET4000_ISA }, + {"[ISA] VGA", "vga", &vga_device, VID_VGA }, + {"[ISA] Wyse 700", "wy700", &wy700_device, VID_WY700 }, + {"[MCA] Tseng ET4000AX", "et4000mca", &et4000_mca_device, VID_ET4000_MCA }, + {"[PCI] ATI Graphics Pro Turbo (Mach64 GX)", "mach64gx_pci", &mach64gx_pci_device, VID_MACH64GX_PCI }, + {"[PCI] ATI Video Xpression (Mach64 VT2)", "mach64vt2", &mach64vt2_device, VID_MACH64VT2 }, + {"[PCI] Cardex Tseng ET4000/w32p", "et4000w32p_pci", &et4000w32p_cardex_pci_device, VID_ET4000W32_CARDEX_PCI }, + {"[PCI] Cirrus Logic CL-GD 5430", "cl_gd5430_pci", &gd5430_pci_device, VID_CL_GD5430_PCI }, + {"[PCI] Cirrus Logic CL-GD 5434", "cl_gd5434_pci", &gd5434_pci_device, VID_CL_GD5434_PCI }, + {"[PCI] Cirrus Logic CL-GD 5436", "cl_gd5436_pci", &gd5436_pci_device, VID_CL_GD5436_PCI }, + {"[PCI] Cirrus Logic CL-GD 5440", "cl_gd5440_pci", &gd5440_pci_device, VID_CL_GD5440_PCI }, + {"[PCI] Cirrus Logic CL-GD 5446", "cl_gd5446_pci", &gd5446_pci_device, VID_CL_GD5446_PCI }, + {"[PCI] Cirrus Logic CL-GD 5480", "cl_gd5480_pci", &gd5480_pci_device, VID_CL_GD5480_PCI }, #if defined(DEV_BRANCH) && defined(USE_STEALTH32) - {"[PCI] Diamond Stealth 32 (Tseng ET4000/w32p)", "stealth32_pci", &et4000w32p_pci_device, GFX_ET4000W32_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 4, 10, 10, 10}}, + {"[PCI] Diamond Stealth 32 (Tseng ET4000/w32p)", "stealth32_pci", &et4000w32p_pci_device, VID_ET4000W32_PCI }, #endif - {"[PCI] Diamond Stealth 3D 2000 (S3 ViRGE)", "stealth3d_2000_pci", &s3_virge_pci_device, GFX_VIRGE_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}}, - {"[PCI] Diamond Stealth 3D 3000 (S3 ViRGE/VX)", "stealth3d_3000_pci", &s3_virge_988_pci_device, GFX_VIRGEVX_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 4, 26, 26, 42}}, - {"[PCI] Diamond Stealth 64 DRAM (S3 Trio64)", "stealth64d_pci", &s3_diamond_stealth64_pci_device, GFX_STEALTH64_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 4, 26, 26, 42}}, - {"[PCI] Number Nine 9FX (S3 Trio64)", "n9_9fx_pci", &s3_9fx_pci_device, GFX_N9_9FX_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}}, - {"[PCI] Paradise Bahamas 64 (S3 Vision864)", "bahamas64_pci", &s3_bahamas64_pci_device, GFX_BAHAMAS64_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 5, 20, 20, 35}}, - {"[PCI] Phoenix S3 Vision864", "px_vision864_pci", &s3_phoenix_vision864_pci_device, GFX_PHOENIX_VISION864_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 5, 20, 20, 35}}, - {"[PCI] Phoenix S3 Trio32", "px_trio32_pci", &s3_phoenix_trio32_pci_device, GFX_PHOENIX_TRIO32_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}}, - {"[PCI] Phoenix S3 Trio64", "px_trio64_pci", &s3_phoenix_trio64_pci_device, GFX_PHOENIX_TRIO64_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}}, - {"[PCI] S3 ViRGE/DX", "virge375_pci", &s3_virge_375_pci_device, GFX_VIRGEDX_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}}, - {"[PCI] S3 ViRGE/DX (VBE 2.0)", "virge375_vbe20_pci", &s3_virge_375_4_pci_device, GFX_VIRGEDX4_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}}, - {"[PCI] STB Nitro 64V (CL-GD 5446)", "cl_gd5446_stb_pci", &gd5446_stb_pci_device, GFX_CL_GD5446_STB_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}}, - {"[PCI] Trident TGUI9440", "tgui9440_pci", &tgui9440_pci_device, GFX_TGUI9440_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 8, 16, 4, 8, 16}}, - {"[VLB] ATI Graphics Pro Turbo (Mach64 GX)", "mach64gx_vlb", &mach64gx_vlb_device, GFX_MACH64GX_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 1, 20, 20, 21}}, - {"[VLB] Cardex Tseng ET4000/w32p", "et4000w32p_vlb", &et4000w32p_cardex_vlb_device, GFX_ET4000W32_CARDEX_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 4, 10, 10, 10}}, - {"[VLB] Cirrus Logic CL-GD 5428", "cl_gd5428_vlb", &gd5428_vlb_device, GFX_CL_GD5428_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}}, - {"[VLB] Cirrus Logic CL-GD 5429", "cl_gd5429_vlb", &gd5429_vlb_device, GFX_CL_GD5429_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}}, - {"[VLB] Cirrus Logic CL-GD 5434", "cl_gd5434_vlb", &gd5434_vlb_device, GFX_CL_GD5434_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}}, + {"[PCI] Diamond Stealth 3D 2000 (S3 ViRGE)", "stealth3d_2000_pci", &s3_virge_pci_device, VID_VIRGE_PCI }, + {"[PCI] Diamond Stealth 3D 3000 (S3 ViRGE/VX)", "stealth3d_3000_pci", &s3_virge_988_pci_device, VID_VIRGEVX_PCI }, + {"[PCI] Diamond Stealth 64 DRAM (S3 Trio64)", "stealth64d_pci", &s3_diamond_stealth64_pci_device, VID_STEALTH64_PCI }, + {"[PCI] ExpertColor DSV3868P CF55 (S3 Vision868)", "expertcolor_pci", &s3_expertcolor_pci_device, VID_EXPERTCOLOR_PCI }, + {"[PCI] Number Nine 9FX (S3 Trio64)", "n9_9fx_pci", &s3_9fx_pci_device, VID_N9_9FX_PCI }, + {"[PCI] Paradise Bahamas 64 (S3 Vision864)", "bahamas64_pci", &s3_bahamas64_pci_device, VID_BAHAMAS64_PCI }, + {"[PCI] Phoenix S3 Vision864", "px_vision864_pci", &s3_phoenix_vision864_pci_device, VID_PHOENIX_VISION864_PCI }, + {"[PCI] Phoenix S3 Trio32", "px_trio32_pci", &s3_phoenix_trio32_pci_device, VID_PHOENIX_TRIO32_PCI }, + {"[PCI] Phoenix S3 Trio64", "px_trio64_pci", &s3_phoenix_trio64_pci_device, VID_PHOENIX_TRIO64_PCI }, + {"[PCI] S3 ViRGE/DX", "virge375_pci", &s3_virge_375_pci_device, VID_VIRGEDX_PCI }, + {"[PCI] S3 ViRGE/DX (VBE 2.0)", "virge375_vbe20_pci", &s3_virge_375_4_pci_device, VID_VIRGEDX4_PCI }, + {"[PCI] STB Nitro 64V (CL-GD 5446)", "cl_gd5446_stb_pci", &gd5446_stb_pci_device, VID_CL_GD5446_STB_PCI }, + {"[PCI] Trident TGUI9440", "tgui9440_pci", &tgui9440_pci_device, VID_TGUI9440_PCI }, + {"[VLB] ATI Graphics Pro Turbo (Mach64 GX)", "mach64gx_vlb", &mach64gx_vlb_device, VID_MACH64GX_VLB }, + {"[VLB] Cardex Tseng ET4000/w32p", "et4000w32p_vlb", &et4000w32p_cardex_vlb_device, VID_ET4000W32_CARDEX_VLB }, + {"[VLB] Cirrus Logic CL-GD 5428", "cl_gd5428_vlb", &gd5428_vlb_device, VID_CL_GD5428_VLB }, + {"[VLB] Cirrus Logic CL-GD 5429", "cl_gd5429_vlb", &gd5429_vlb_device, VID_CL_GD5429_VLB }, + {"[VLB] Cirrus Logic CL-GD 5434", "cl_gd5434_vlb", &gd5434_vlb_device, VID_CL_GD5434_VLB }, #if defined(DEV_BRANCH) && defined(USE_STEALTH32) - {"[VLB] Diamond Stealth 32 (Tseng ET4000/w32p)", "stealth32_vlb", &et4000w32p_vlb_device, GFX_ET4000W32_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 4, 10, 10, 10}}, + {"[VLB] Diamond Stealth 32 (Tseng ET4000/w32p)", "stealth32_vlb", &et4000w32p_vlb_device, VID_ET4000W32_VLB }, #endif - {"[VLB] Diamond SpeedStar PRO (CL-GD 5426)", "cl_gd5426_vlb", &gd5426_vlb_device, GFX_CL_GD5426_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}}, - {"[VLB] Diamond SpeedStar PRO SE (CL-GD 5430)", "cl_gd5430_vlb", &gd5430_vlb_device, GFX_CL_GD5430_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}}, - {"[VLB] Diamond Stealth 3D 2000 (S3 ViRGE)", "stealth3d_2000_vlb", &s3_virge_vlb_device, GFX_VIRGE_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}}, - {"[VLB] Diamond Stealth 3D 3000 (S3 ViRGE/VX)", "stealth3d_3000_vlb", &s3_virge_988_vlb_device, GFX_VIRGEVX_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 4, 26, 26, 42}}, - {"[VLB] Diamond Stealth 64 DRAM (S3 Trio64)", "stealth64d_vlb", &s3_diamond_stealth64_vlb_device, GFX_STEALTH64_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 4, 26, 26, 42}}, - {"[VLB] Number Nine 9FX (S3 Trio64)", "n9_9fx_vlb", &s3_9fx_vlb_device, GFX_N9_9FX_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}}, - {"[VLB] Paradise Bahamas 64 (S3 Vision864)", "bahamas64_vlb", &s3_bahamas64_vlb_device, GFX_BAHAMAS64_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 5, 20, 20, 35}}, - {"[VLB] Phoenix S3 Vision864", "px_vision864_vlb", &s3_phoenix_vision864_vlb_device, GFX_PHOENIX_VISION864_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 5, 20, 20, 35}}, - {"[VLB] Phoenix S3 Trio32", "px_trio32_vlb", &s3_phoenix_trio32_vlb_device, GFX_PHOENIX_TRIO32_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}}, - {"[VLB] Phoenix S3 Trio64", "px_trio64_vlb", &s3_phoenix_trio64_vlb_device, GFX_PHOENIX_TRIO64_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}}, - {"[VLB] S3 ViRGE/DX", "virge375_vlb", &s3_virge_375_vlb_device, GFX_VIRGEDX_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}}, - {"[VLB] S3 ViRGE/DX (VBE 2.0)", "virge375_vbe20_vlb", &s3_virge_375_4_vlb_device, GFX_VIRGEDX4_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}}, - {"[VLB] Trident TGUI9400CXi", "tgui9400cxi_vlb", &tgui9400cxi_device, GFX_TGUI9400CXI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 8, 16, 4, 8, 16}}, - {"[VLB] Trident TGUI9440", "tgui9440_vlb", &tgui9440_vlb_device, GFX_TGUI9440_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 8, 16, 4, 8, 16}}, + {"[VLB] Diamond SpeedStar PRO (CL-GD 5426)", "cl_gd5426_vlb", &gd5426_vlb_device, VID_CL_GD5426_VLB }, + {"[VLB] Diamond SpeedStar PRO SE (CL-GD 5430)", "cl_gd5430_vlb", &gd5430_vlb_device, VID_CL_GD5430_VLB }, + {"[VLB] Diamond Stealth 3D 2000 (S3 ViRGE)", "stealth3d_2000_vlb", &s3_virge_vlb_device, VID_VIRGE_VLB }, + {"[VLB] Diamond Stealth 3D 3000 (S3 ViRGE/VX)", "stealth3d_3000_vlb", &s3_virge_988_vlb_device, VID_VIRGEVX_VLB }, + {"[VLB] Diamond Stealth 64 DRAM (S3 Trio64)", "stealth64d_vlb", &s3_diamond_stealth64_vlb_device, VID_STEALTH64_VLB }, + {"[VLB] ExpertColor DSV3868P CF55 (S3 Vision868)", "expertcolor_vlb", &s3_expertcolor_vlb_device, VID_EXPERTCOLOR_VLB }, + {"[VLB] Number Nine 9FX (S3 Trio64)", "n9_9fx_vlb", &s3_9fx_vlb_device, VID_N9_9FX_VLB }, + {"[VLB] Paradise Bahamas 64 (S3 Vision864)", "bahamas64_vlb", &s3_bahamas64_vlb_device, VID_BAHAMAS64_VLB }, + {"[VLB] Phoenix S3 Vision864", "px_vision864_vlb", &s3_phoenix_vision864_vlb_device, VID_PHOENIX_VISION864_VLB }, + {"[VLB] Phoenix S3 Trio32", "px_trio32_vlb", &s3_phoenix_trio32_vlb_device, VID_PHOENIX_TRIO32_VLB }, + {"[VLB] Phoenix S3 Trio64", "px_trio64_vlb", &s3_phoenix_trio64_vlb_device, VID_PHOENIX_TRIO64_VLB }, + {"[VLB] S3 ViRGE/DX", "virge375_vlb", &s3_virge_375_vlb_device, VID_VIRGEDX_VLB }, + {"[VLB] S3 ViRGE/DX (VBE 2.0)", "virge375_vbe20_vlb", &s3_virge_375_4_vlb_device, VID_VIRGEDX4_VLB }, + {"[VLB] Trident TGUI9400CXi", "tgui9400cxi_vlb", &tgui9400cxi_device, VID_TGUI9400CXI }, + {"[VLB] Trident TGUI9440", "tgui9440_vlb", &tgui9440_vlb_device, VID_TGUI9440_VLB }, {"", "", NULL, -1 } }; @@ -197,31 +188,31 @@ vid_table_log(const char *fmt, ...) } -void -video_font_reset(void) -{ - if (fontdatksc5601) { - free(fontdatksc5601); - fontdatksc5601 = NULL; - } -} - - void video_reset(int card) { vid_table_log("VIDEO: reset (romset=%d, gfxcard=%d, internal=%d)\n", romset, card, (machines[machine].flags & MACHINE_VIDEO)?1:0); + /* Reset (deallocate) the video font arrays. */ + if (fontdatksc5601) { + free(fontdatksc5601); + fontdatksc5601 = NULL; + } + /* Reset the CGA palette. */ cga_palette = 0; cgapal_rebuild(); /* Do not initialize internal cards here. */ - if (!(card == GFX_NONE) && \ - !(card == GFX_INTERNAL) && !machines[machine].fixed_gfxcard) { + if (!(card == VID_NONE) && \ + !(card == VID_INTERNAL) && !machines[machine].fixed_gfxcard) { vid_table_log("VIDEO: initializing '%s'\n", video_cards[video_old_to_new(card)].name); + /* Do an inform on the default values, so that that there's some sane values initialized + even if the device init function does not do an inform of its own. */ + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_default); + /* Initialize the video card. */ device_add(video_cards[video_old_to_new(card)].device); } @@ -265,13 +256,6 @@ video_card_has_config(int card) } -video_timings_t * -video_card_gettiming(int card) -{ - return((void *) &video_cards[card].timing); -} - - int video_card_getid(char *s) { @@ -330,105 +314,23 @@ video_get_video_from_internal_name(char *s) return(0); } -int video_is_mda(void) + +int +video_is_mda(void) { - switch (romset) - { - 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_AMA932J: - case ROM_MEGAPC: - case ROM_MEGAPCDX: - case ROM_IBMPS1_2011: - case ROM_IBMPS2_M30_286: - case ROM_IBMPS2_M50: - case ROM_IBMPS2_M55SX: - case ROM_IBMPS2_M70_TYPE3: -#if defined(DEV_BRANCH) && defined(USE_PS2M70T4) - case ROM_IBMPS2_M70_TYPE4: -#endif - case ROM_IBMPS2_M80: - case ROM_IBMPS1_2121: - case ROM_T3100E: - return 0; - } - return (video_cards[video_old_to_new(gfxcard)].flags & VIDEO_FLAG_TYPE_MASK) == VIDEO_FLAG_TYPE_MDA; + return (video_get_type() == VIDEO_FLAG_TYPE_MDA); } -int video_is_cga(void) + +int +video_is_cga(void) { - switch (romset) - { - case ROM_IBMPCJR: - case ROM_TANDY: - case ROM_TANDY1000HX: - case ROM_TANDY1000SL2: - case ROM_PC1512: - case ROM_PC200: - case ROM_OLIM24: - case ROM_T3100E: - return 1; - - case ROM_PC1640: - case ROM_PC2086: - case ROM_PC3086: - case ROM_AMA932J: - case ROM_MEGAPC: - case ROM_MEGAPCDX: - case ROM_IBMPS1_2011: - case ROM_IBMPS2_M30_286: - case ROM_IBMPS2_M50: - case ROM_IBMPS2_M55SX: - case ROM_IBMPS2_M70_TYPE3: -#if defined(DEV_BRANCH) && defined(USE_PS2M70T4) - case ROM_IBMPS2_M70_TYPE4: -#endif - case ROM_IBMPS2_M80: - case ROM_IBMPS1_2121: - return 0; - } - return (video_cards[video_old_to_new(gfxcard)].flags & VIDEO_FLAG_TYPE_MASK) == VIDEO_FLAG_TYPE_CGA; + return (video_get_type() == VIDEO_FLAG_TYPE_CGA); } -int video_is_ega_vga(void) + +int +video_is_ega_vga(void) { - switch (romset) - { - case ROM_IBMPCJR: - case ROM_TANDY: - case ROM_TANDY1000HX: - case ROM_TANDY1000SL2: - case ROM_PC1512: - case ROM_PC200: - case ROM_OLIM24: - case ROM_T3100E: - return 0; - - case ROM_PC1640: - case ROM_PC2086: - case ROM_PC3086: - case ROM_AMA932J: - case ROM_MEGAPC: - case ROM_MEGAPCDX: - case ROM_IBMPS1_2011: - case ROM_IBMPS2_M30_286: - case ROM_IBMPS2_M50: - case ROM_IBMPS2_M55SX: - case ROM_IBMPS2_M70_TYPE3: -#if defined(DEV_BRANCH) && defined(USE_PS2M70T4) - case ROM_IBMPS2_M70_TYPE4: -#endif - case ROM_IBMPS2_M80: - case ROM_IBMPS1_2121: - return 1; - } - return (video_cards[video_old_to_new(gfxcard)].flags & VIDEO_FLAG_TYPE_MASK) == VIDEO_FLAG_TYPE_SPECIAL; + return (video_get_type() == VIDEO_FLAG_TYPE_SPECIAL); } diff --git a/src/video/vid_tgui9440.c b/src/video/vid_tgui9440.c index 9b01d5661..e95780796 100644 --- a/src/video/vid_tgui9440.c +++ b/src/video/vid_tgui9440.c @@ -47,7 +47,7 @@ * access size or host data has any affect, but the Windows 3.1 * driver always reads bytes and write words of 0xffff. * - * Version: @(#)vid_tgui9440.c 1.0.7 2018/07/16 + * Version: @(#)vid_tgui9440.c 1.0.8 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -210,6 +210,8 @@ typedef struct tgui_t volatile int write_blitter; } tgui_t; +video_timings_t timing_tgui = {VIDEO_BUS, 4, 8, 16, 4, 8, 16}; + void tgui_recalcmapping(tgui_t *tgui); static void fifo_thread(void *param); @@ -789,6 +791,8 @@ static void *tgui_init(const device_t *info, wchar_t *bios_fn, int type) rom_init(&tgui->bios_rom, bios_fn, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_tgui); + svga_init(&tgui->svga, tgui, tgui->vram_size, tgui_recalctimings, tgui_in, tgui_out, diff --git a/src/video/vid_ti_cf62011.c b/src/video/vid_ti_cf62011.c index d3ec979f1..fecbf2a03 100644 --- a/src/video/vid_ti_cf62011.c +++ b/src/video/vid_ti_cf62011.c @@ -42,7 +42,7 @@ * which are the same as the XGA. It supports up to 1MB of VRAM, * but we lock it down to 512K. The PS/1 2122 had 256K. * - * Version: @(#)vid_ti_cf62011.c 1.0.7 2018/04/29 + * Version: @(#)vid_ti_cf62011.c 1.0.8 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -83,6 +83,8 @@ typedef struct { uint8_t reg_210a; } tivga_t; +static video_timings_t timing_ti_cf62011 = {VIDEO_ISA, 6, 8,16, 6, 8,16}; + static void vid_out(uint16_t addr, uint8_t val, void *priv) @@ -243,9 +245,11 @@ vid_init(const device_t *info) /* Set amount of VRAM in KB. */ if (info->local == 0) ti->vram_size = device_get_config_int("vram_size"); - else + else ti->vram_size = info->local; + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_ti_cf62011); + svga_init(&ti->svga, ti, ti->vram_size<<10, NULL, vid_in, vid_out, NULL, NULL); @@ -289,7 +293,7 @@ static const device_config_t vid_config[] = const device_t ti_cf62011_device = { "TI CF62011 SVGA", - 0, + DEVICE_ISA, 0, vid_init, vid_close, NULL, NULL, @@ -302,7 +306,7 @@ const device_t ti_cf62011_device = { const device_t ibm_ps1_2121_device = { "IBM PS/1 Model 2121 SVGA", - 0, + DEVICE_ISA, 512, vid_init, vid_close, NULL, NULL, diff --git a/src/video/vid_tvga.c b/src/video/vid_tvga.c index 84bc2421e..199d140e4 100644 --- a/src/video/vid_tvga.c +++ b/src/video/vid_tvga.c @@ -8,7 +8,7 @@ * * Trident TVGA (8900D) emulation. * - * Version: @(#)vid_tvga.c 1.0.6 2018/04/26 + * Version: @(#)vid_tvga.c 1.0.7 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -52,6 +52,8 @@ typedef struct tvga_t uint32_t vram_mask; } tvga_t; +video_timings_t timing_tvga = {VIDEO_ISA, 3, 3, 6, 8, 8, 12}; + static uint8_t crtc_mask[0x40] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, @@ -296,6 +298,8 @@ static void *tvga8900d_init(const device_t *info) { tvga_t *tvga = malloc(sizeof(tvga_t)); memset(tvga, 0, sizeof(tvga_t)); + + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_tvga); tvga->vram_size = device_get_config_int("memory") << 10; tvga->vram_mask = tvga->vram_size - 1; diff --git a/src/video/vid_vga.c b/src/video/vid_vga.c index 617ba1539..fd86fa4b6 100644 --- a/src/video/vid_vga.c +++ b/src/video/vid_vga.c @@ -8,7 +8,7 @@ * * IBM VGA emulation. * - * Version: @(#)vid_vga.c 1.0.6 2018/08/16 + * Version: @(#)vid_vga.c 1.0.6 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -38,6 +38,10 @@ typedef struct vga_t rom_t bios_rom; } vga_t; +static video_timings_t timing_vga = {VIDEO_ISA, 8, 16, 32, 8, 16, 32}; +static video_timings_t timing_ps1_svga_isa = {VIDEO_ISA, 6, 8, 16, 6, 8, 16}; +static video_timings_t timing_ps1_svga_mca = {VIDEO_MCA, 6, 8, 16, 6, 8, 16}; + void vga_out(uint16_t addr, uint8_t val, void *p) { vga_t *vga = (vga_t *)p; @@ -109,6 +113,8 @@ static void *vga_init(const device_t *info) rom_init(&vga->bios_rom, L"roms/video/vga/ibm_vga.bin", 0xc0000, 0x8000, 0x7fff, 0x2000, MEM_MAPPING_EXTERNAL); + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_vga); + svga_init(&vga->svga, vga, 1 << 18, /*256kb*/ NULL, vga_in, vga_out, @@ -130,6 +136,11 @@ void *ps1vga_init(const device_t *info) vga_t *vga = malloc(sizeof(vga_t)); memset(vga, 0, sizeof(vga_t)); + if (info->flags & DEVICE_MCA) + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_ps1_svga_mca); + else + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_ps1_svga_isa); + svga_init(&vga->svga, vga, 1 << 18, /*256kb*/ NULL, vga_in, vga_out, @@ -189,7 +200,21 @@ const device_t vga_device = const device_t ps1vga_device = { "PS/1 VGA", - 0, + DEVICE_ISA, + 0, + ps1vga_init, + vga_close, + NULL, + vga_available, + vga_speed_changed, + vga_force_redraw, + NULL +}; + +const device_t ps1vga_mca_device = +{ + "PS/1 VGA", + DEVICE_MCA, 0, ps1vga_init, vga_close, diff --git a/src/video/vid_vga.h b/src/video/vid_vga.h index 1cb031acf..533fdbb9a 100644 --- a/src/video/vid_vga.h +++ b/src/video/vid_vga.h @@ -3,3 +3,4 @@ */ extern const device_t vga_device; extern const device_t ps1vga_device; +extern const device_t ps1vga_mca_device; diff --git a/src/video/vid_wy700.c b/src/video/vid_wy700.c index 814da2cca..c13fd4f78 100644 --- a/src/video/vid_wy700.c +++ b/src/video/vid_wy700.c @@ -8,7 +8,7 @@ * * Wyse-700 emulation. * - * Version: @(#)vid_wy700.c 1.0.9 2018/05/20 + * Version: @(#)vid_wy700.c 1.0.10 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -233,6 +233,8 @@ void wy700_write(uint32_t addr, uint8_t val, void *p); uint8_t wy700_read(uint32_t addr, void *p); void wy700_checkchanges(wy700_t *wy700); +static video_timings_t timing_wy700 = {VIDEO_ISA, 8, 16, 32, 8, 16, 32}; + void wy700_out(uint16_t addr, uint8_t val, void *p) { @@ -902,6 +904,7 @@ void *wy700_init(const device_t *info) int c; wy700_t *wy700 = malloc(sizeof(wy700_t)); memset(wy700, 0, sizeof(wy700_t)); + video_inform(VIDEO_FLAG_TYPE_CGA, &timing_wy700); /* 128k video RAM */ wy700->vram = malloc(0x20000); diff --git a/src/video/video.c b/src/video/video.c index 3bfef69d9..f35c02d2e 100644 --- a/src/video/video.c +++ b/src/video/video.c @@ -40,7 +40,7 @@ * W = 3 bus clocks * L = 4 bus clocks * - * Version: @(#)video.c 1.0.25 2018/08/26 + * Version: @(#)video.c 1.0.26 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -67,11 +67,6 @@ #include "vid_svga.h" -enum { - VIDEO_ISA = 0, - VIDEO_BUS -}; - bitmap_t *screen = NULL, *buffer = NULL, *buffer32 = NULL; @@ -110,6 +105,8 @@ static int video_force_resize; int invert_display = 0; int video_grayscale = 0; int video_graytype = 0; +static int vid_type; +static const video_timings_t *vid_timings; PALETTE cgapal = { @@ -400,107 +397,41 @@ cgapal_rebuild(void) } -static video_timings_t timing_dram = {VIDEO_BUS, 0,0,0, 0,0,0}; /*No additional waitstates*/ -static video_timings_t timing_pc1512 = {VIDEO_BUS, 0,0,0, 0,0,0}; /*PC1512 video code handles waitstates itself*/ -static video_timings_t timing_pc1640 = {VIDEO_ISA, 8,16,32, 8,16,32}; -static video_timings_t timing_pc200 = {VIDEO_ISA, 8,16,32, 8,16,32}; -static video_timings_t timing_m24 = {VIDEO_ISA, 8,16,32, 8,16,32}; -static video_timings_t timing_t1000 = {VIDEO_ISA, 8,16,32, 8,16,32}; -static video_timings_t timing_pvga1a = {VIDEO_ISA, 6, 8,16, 6, 8,16}; -static video_timings_t timing_wd90c11 = {VIDEO_ISA, 3, 3, 6, 5, 5,10}; -static video_timings_t timing_oti067 = {VIDEO_ISA, 6, 8,16, 6, 8,16}; -static video_timings_t timing_vga = {VIDEO_ISA, 8,16,32, 8,16,32}; -static video_timings_t timing_ps1_svga = {VIDEO_ISA, 6, 8,16, 6, 8,16}; -static video_timings_t timing_tg286m = {VIDEO_ISA, 3, 3, 6, 5, 5,10}; -static video_timings_t timing_t3100e = {VIDEO_ISA, 8,16,32, 8,16,32}; -static video_timings_t timing_endeavor = {VIDEO_BUS, 3, 2, 4,25,25,40}; -static video_timings_t timing_pb640 = {VIDEO_BUS, 4, 4, 8,10,10,20}; +void +video_inform(int type, const video_timings_t *ptr) +{ + vid_type = type; + vid_timings = ptr; +} + + +int +video_get_type(void) +{ + return vid_type; +} + void video_update_timing(void) { - video_timings_t *timing; - int new_gfxcard; + if (!vid_timings) + return; - new_gfxcard = 0; - - switch(romset) { - case ROM_IBMPCJR: - case ROM_TANDY: - case ROM_TANDY1000HX: - case ROM_TANDY1000SL2: - timing = &timing_dram; - break; - case ROM_PC1512: - timing = &timing_pc1512; - break; - case ROM_PC1640: - timing = &timing_pc1640; - break; - case ROM_PC200: - timing = &timing_pc200; - break; - case ROM_OLIM24: - timing = &timing_m24; - break; - case ROM_PC2086: - case ROM_PC3086: - timing = &timing_pvga1a; - break; - case ROM_T1000: - case ROM_T1200: - timing = &timing_t1000; - break; - case ROM_AMA932J: - timing = &timing_oti067; - break; - case ROM_MEGAPC: - case ROM_MEGAPCDX: - timing = &timing_wd90c11; - break; - case ROM_IBMPS1_2011: - case ROM_IBMPS2_M30_286: - case ROM_IBMPS2_M50: - case ROM_IBMPS2_M55SX: - case ROM_IBMPS2_M80: - timing = &timing_vga; - break; - case ROM_IBMPS1_2121: - case ROM_IBMPS1_2133: - timing = &timing_ps1_svga; - break; - case ROM_TG286M: - timing = &timing_tg286m; - break; - case ROM_T3100E: - timing = &timing_t3100e; - break; - case ROM_ENDEAVOR: - timing = &timing_endeavor; - break; - case ROM_PB640: - timing = &timing_pb640; - break; - default: - new_gfxcard = video_old_to_new(gfxcard); - timing = video_card_gettiming(new_gfxcard); - break; - } - - if (timing->type == VIDEO_ISA) { - video_timing_read_b = ISA_CYCLES(timing->read_b); - video_timing_read_w = ISA_CYCLES(timing->read_w); - video_timing_read_l = ISA_CYCLES(timing->read_l); - video_timing_write_b = ISA_CYCLES(timing->write_b); - video_timing_write_w = ISA_CYCLES(timing->write_w); - video_timing_write_l = ISA_CYCLES(timing->write_l); + if (vid_timings->type == VIDEO_ISA) { + video_timing_read_b = ISA_CYCLES(vid_timings->read_b); + video_timing_read_w = ISA_CYCLES(vid_timings->read_w); + video_timing_read_l = ISA_CYCLES(vid_timings->read_l); + video_timing_write_b = ISA_CYCLES(vid_timings->write_b); + video_timing_write_w = ISA_CYCLES(vid_timings->write_w); + video_timing_write_l = ISA_CYCLES(vid_timings->write_l); } else { - video_timing_read_b = (int)(bus_timing * timing->read_b); - video_timing_read_w = (int)(bus_timing * timing->read_w); - video_timing_read_l = (int)(bus_timing * timing->read_l); - video_timing_write_b = (int)(bus_timing * timing->write_b); - video_timing_write_w = (int)(bus_timing * timing->write_w); - video_timing_write_l = (int)(bus_timing * timing->write_l); + video_timing_read_b = (int)(bus_timing * vid_timings->read_b); + video_timing_read_w = (int)(bus_timing * vid_timings->read_w); + video_timing_read_l = (int)(bus_timing * vid_timings->read_l); + video_timing_write_b = (int)(bus_timing * vid_timings->write_b); + video_timing_write_w = (int)(bus_timing * vid_timings->write_w); + video_timing_write_l = (int)(bus_timing * vid_timings->write_l); } if (cpu_16bitbus) { diff --git a/src/video/video.h b/src/video/video.h index 4d481998c..263a800e6 100644 --- a/src/video/video.h +++ b/src/video/video.h @@ -8,7 +8,7 @@ * * Definitions for the video controller module. * - * Version: @(#)video.h 1.0.33 2018/08/16 + * Version: @(#)video.h 1.0.35 2018/09/19 * * Authors: Sarah Walker, * Miran Grca, @@ -27,98 +27,100 @@ enum { - GFX_NONE = 0, - GFX_INTERNAL, - GFX_CGA, - GFX_COMPAQ_CGA, /* Compaq CGA */ - GFX_COMPAQ_CGA_2, /* Compaq CGA 2 */ - GFX_COLORPLUS, /* Plantronics ColorPlus */ - GFX_WY700, /* Wyse 700 */ - GFX_MDA, - GFX_GENIUS, /* MDSI Genius */ - GFX_HERCULES, - GFX_HERCULESPLUS, - GFX_INCOLOR, /* Hercules InColor */ - GFX_EGA, /* Using IBM EGA BIOS */ - GFX_COMPAQ_EGA, /* Compaq EGA */ - GFX_SUPER_EGA, /* Using Chips & Technologies SuperEGA BIOS */ - GFX_VGA, /* IBM VGA */ - GFX_TVGA, /* Using Trident TVGA8900D BIOS */ - GFX_ET4000_ISA, /* Tseng ET4000 */ - GFX_ET4000_MCA, /* Tseng ET4000 */ - GFX_TGKOREANVGA, /*Trigem Korean VGA(Tseng ET4000AX)*/ - GFX_ET4000W32_CARDEX_VLB, /* Tseng ET4000/W32p (Cardex) VLB */ - GFX_ET4000W32_CARDEX_PCI, /* Tseng ET4000/W32p (Cardex) PCI */ + VID_NONE = 0, + VID_INTERNAL, + VID_CGA, + VID_COMPAQ_CGA, /* Compaq CGA */ + VID_COMPAQ_CGA_2, /* Compaq CGA 2 */ + VID_COLORPLUS, /* Plantronics ColorPlus */ + VID_WY700, /* Wyse 700 */ + VID_MDA, + VID_GENIUS, /* MDSI Genius */ + VID_HERCULES, + VID_HERCULESPLUS, + VID_INCOLOR, /* Hercules InColor */ + VID_EGA, /* Using IBM EGA BIOS */ + VID_COMPAQ_EGA, /* Compaq EGA */ + VID_SUPER_EGA, /* Using Chips & Technologies SuperEGA BIOS */ + VID_VGA, /* IBM VGA */ + VID_TVGA, /* Using Trident TVGA8900D BIOS */ + VID_ET4000_ISA, /* Tseng ET4000 */ + VID_ET4000_MCA, /* Tseng ET4000 */ + VID_TGKOREANVGA, /*Trigem Korean VGA(Tseng ET4000AX)*/ + VID_ET4000W32_CARDEX_VLB, /* Tseng ET4000/W32p (Cardex) VLB */ + VID_ET4000W32_CARDEX_PCI, /* Tseng ET4000/W32p (Cardex) PCI */ #if defined(DEV_BRANCH) && defined(USE_STEALTH32) - GFX_ET4000W32_VLB, /* Tseng ET4000/W32p (Diamond Stealth 32) VLB */ - GFX_ET4000W32_PCI, /* Tseng ET4000/W32p (Diamond Stealth 32) PCI */ + VID_ET4000W32_VLB, /* Tseng ET4000/W32p (Diamond Stealth 32) VLB */ + VID_ET4000W32_PCI, /* Tseng ET4000/W32p (Diamond Stealth 32) PCI */ #endif - GFX_BAHAMAS64_VLB, /* S3 Vision864 (Paradise Bahamas 64) VLB */ - GFX_BAHAMAS64_PCI, /* S3 Vision864 (Paradise Bahamas 64) PCI */ - GFX_N9_9FX_VLB, /* S3 764/Trio64 (Number Nine 9FX) VLB */ - GFX_N9_9FX_PCI, /* S3 764/Trio64 (Number Nine 9FX) PCI */ - GFX_TGUI9400CXI, /* Trident TGUI9400CXi VLB */ - GFX_TGUI9440_VLB, /* Trident TGUI9440AGi VLB */ - GFX_TGUI9440_PCI, /* Trident TGUI9440AGi PCI */ - GFX_ATIKOREANVGA, /*ATI Korean VGA (28800-5)*/ - GFX_VGA88, /* ATI VGA-88 (18800-1) */ - GFX_VGAEDGE16, /* ATI VGA Edge-16 (18800-1) */ - GFX_VGACHARGER, /* ATI VGA Charger (28800-5) */ + VID_BAHAMAS64_VLB, /* S3 Vision864 (Paradise Bahamas 64) VLB */ + VID_BAHAMAS64_PCI, /* S3 Vision864 (Paradise Bahamas 64) PCI */ + VID_N9_9FX_VLB, /* S3 764/Trio64 (Number Nine 9FX) VLB */ + VID_N9_9FX_PCI, /* S3 764/Trio64 (Number Nine 9FX) PCI */ + VID_TGUI9400CXI, /* Trident TGUI9400CXi VLB */ + VID_TGUI9440_VLB, /* Trident TGUI9440AGi VLB */ + VID_TGUI9440_PCI, /* Trident TGUI9440AGi PCI */ + VID_ATIKOREANVGA, /*ATI Korean VGA (28800-5)*/ + VID_VGA88, /* ATI VGA-88 (18800-1) */ + VID_VGAEDGE16, /* ATI VGA Edge-16 (18800-1) */ + VID_VGACHARGER, /* ATI VGA Charger (28800-5) */ #if defined(DEV_BRANCH) && defined(USE_VGAWONDER) - GFX_VGAWONDER, /* Compaq ATI VGA Wonder (18800) */ + VID_VGAWONDER, /* Compaq ATI VGA Wonder (18800) */ #endif - GFX_VGAWONDERXL, /* Compaq ATI VGA Wonder XL (28800-5) */ + VID_VGAWONDERXL, /* Compaq ATI VGA Wonder XL (28800-5) */ #if defined(DEV_BRANCH) && defined(USE_XL24) - GFX_VGAWONDERXL24, /* Compaq ATI VGA Wonder XL24 (28800-6) */ + VID_VGAWONDERXL24, /* Compaq ATI VGA Wonder XL24 (28800-6) */ #endif - GFX_MACH64GX_ISA, /* ATI Graphics Pro Turbo (Mach64) ISA */ - GFX_MACH64GX_VLB, /* ATI Graphics Pro Turbo (Mach64) VLB */ - GFX_MACH64GX_PCI, /* ATI Graphics Pro Turbo (Mach64) PCI */ - GFX_MACH64VT2, /* ATI Mach64 VT2 */ - GFX_CL_GD5424_ISA, /* Cirrus Logic CL-GD 5424 ISA */ - GFX_CL_GD5424_VLB, /* Cirrus Logic CL-GD 5424 VLB */ - GFX_CL_GD5426_VLB, /* Diamond SpeedStar PRO (Cirrus Logic CL-GD 5426) VLB */ - GFX_CL_GD5428_ISA, /* Cirrus Logic CL-GD 5428 ISA */ - GFX_CL_GD5428_VLB, /* Cirrus Logic CL-GD 5428 VLB */ - GFX_CL_GD5429_ISA, /* Cirrus Logic CL-GD 5429 ISA */ - GFX_CL_GD5429_VLB, /* Cirrus Logic CL-GD 5429 VLB */ - GFX_CL_GD5430_VLB, /* Diamond SpeedStar PRO SE (Cirrus Logic CL-GD 5430) VLB */ - GFX_CL_GD5430_PCI, /* Cirrus Logic CL-GD 5430 PCI */ - GFX_CL_GD5434_ISA, /* Cirrus Logic CL-GD 5434 ISA */ - GFX_CL_GD5434_VLB, /* Cirrus Logic CL-GD 5434 VLB */ - GFX_CL_GD5434_PCI, /* Cirrus Logic CL-GD 5434 PCI */ - GFX_CL_GD5436_PCI, /* Cirrus Logic CL-GD 5436 PCI */ - GFX_CL_GD5440_PCI, /* Cirrus Logic CL-GD 5440 PCI */ - GFX_CL_GD5446_PCI, /* Cirrus Logic CL-GD 5446 PCI */ - GFX_CL_GD5446_STB_PCI, /* STB Nitro 64V (Cirrus Logic CL-GD 5446) PCI */ - GFX_CL_GD5480_PCI, /* Cirrus Logic CL-GD 5480 PCI */ - GFX_OTI037C, /* Oak OTI-037C */ - GFX_OTI067, /* Oak OTI-067 */ - GFX_OTI077, /* Oak OTI-077 */ - GFX_PVGA1A, /* Paradise PVGA1A Standalone */ - GFX_WD90C11, /* Paradise WD90C11-LR Standalone */ - GFX_WD90C30, /* Paradise WD90C30-LR Standalone */ - GFX_PHOENIX_TRIO32_VLB, /* S3 732/Trio32 (Phoenix) VLB */ - GFX_PHOENIX_TRIO32_PCI, /* S3 732/Trio32 (Phoenix) PCI */ - GFX_PHOENIX_TRIO64_VLB, /* S3 764/Trio64 (Phoenix) VLB */ - GFX_PHOENIX_TRIO64_PCI, /* S3 764/Trio64 (Phoenix) PCI */ - GFX_VIRGE_VLB, /* S3 Virge VLB */ - GFX_VIRGE_PCI, /* S3 Virge PCI */ - GFX_VIRGEDX_VLB, /* S3 Virge/DX VLB */ - GFX_VIRGEDX_PCI, /* S3 Virge/DX PCI */ - GFX_VIRGEDX4_VLB, /* S3 Virge/DX (VBE 2.0) VLB */ - GFX_VIRGEDX4_PCI, /* S3 Virge/DX (VBE 2.0) PCI */ - GFX_VIRGEVX_VLB, /* S3 Virge/VX VLB */ - GFX_VIRGEVX_PCI, /* S3 Virge/VX PCI */ - GFX_STEALTH64_VLB, /* S3 Vision864 (Diamond Stealth 64) VLB */ - GFX_STEALTH64_PCI, /* S3 Vision864 (Diamond Stealth 64) PCI */ - GFX_PHOENIX_VISION864_VLB, /* S3 Vision864 (Phoenix) VLB */ - GFX_PHOENIX_VISION864_PCI, /* S3 Vision864 (Phoenix) PCI */ + VID_MACH64GX_ISA, /* ATI Graphics Pro Turbo (Mach64) ISA */ + VID_MACH64GX_VLB, /* ATI Graphics Pro Turbo (Mach64) VLB */ + VID_MACH64GX_PCI, /* ATI Graphics Pro Turbo (Mach64) PCI */ + VID_MACH64VT2, /* ATI Mach64 VT2 */ + VID_CL_GD5424_ISA, /* Cirrus Logic CL-GD 5424 ISA */ + VID_CL_GD5424_VLB, /* Cirrus Logic CL-GD 5424 VLB */ + VID_CL_GD5426_VLB, /* Diamond SpeedStar PRO (Cirrus Logic CL-GD 5426) VLB */ + VID_CL_GD5428_ISA, /* Cirrus Logic CL-GD 5428 ISA */ + VID_CL_GD5428_VLB, /* Cirrus Logic CL-GD 5428 VLB */ + VID_CL_GD5429_ISA, /* Cirrus Logic CL-GD 5429 ISA */ + VID_CL_GD5429_VLB, /* Cirrus Logic CL-GD 5429 VLB */ + VID_CL_GD5430_VLB, /* Diamond SpeedStar PRO SE (Cirrus Logic CL-GD 5430) VLB */ + VID_CL_GD5430_PCI, /* Cirrus Logic CL-GD 5430 PCI */ + VID_CL_GD5434_ISA, /* Cirrus Logic CL-GD 5434 ISA */ + VID_CL_GD5434_VLB, /* Cirrus Logic CL-GD 5434 VLB */ + VID_CL_GD5434_PCI, /* Cirrus Logic CL-GD 5434 PCI */ + VID_CL_GD5436_PCI, /* Cirrus Logic CL-GD 5436 PCI */ + VID_CL_GD5440_PCI, /* Cirrus Logic CL-GD 5440 PCI */ + VID_CL_GD5446_PCI, /* Cirrus Logic CL-GD 5446 PCI */ + VID_CL_GD5446_STB_PCI, /* STB Nitro 64V (Cirrus Logic CL-GD 5446) PCI */ + VID_CL_GD5480_PCI, /* Cirrus Logic CL-GD 5480 PCI */ + VID_EXPERTCOLOR_VLB, /* S3 Vision868 (ExpertColor DSV3868P CF55) VLB */ + VID_EXPERTCOLOR_PCI, /* S3 Vision868 (ExpertColor DSV3868P CF55) PCI */ + VID_OTI037C, /* Oak OTI-037C */ + VID_OTI067, /* Oak OTI-067 */ + VID_OTI077, /* Oak OTI-077 */ + VID_PVGA1A, /* Paradise PVGA1A Standalone */ + VID_WD90C11, /* Paradise WD90C11-LR Standalone */ + VID_WD90C30, /* Paradise WD90C30-LR Standalone */ + VID_PHOENIX_VISION864_VLB, /* S3 Vision864 (Phoenix) VLB */ + VID_PHOENIX_VISION864_PCI, /* S3 Vision864 (Phoenix) PCI */ + VID_PHOENIX_TRIO32_VLB, /* S3 732/Trio32 (Phoenix) VLB */ + VID_PHOENIX_TRIO32_PCI, /* S3 732/Trio32 (Phoenix) PCI */ + VID_PHOENIX_TRIO64_VLB, /* S3 764/Trio64 (Phoenix) VLB */ + VID_PHOENIX_TRIO64_PCI, /* S3 764/Trio64 (Phoenix) PCI */ + VID_STEALTH64_VLB, /* S3 Trio64 (Diamond Stealth 64) VLB */ + VID_STEALTH64_PCI, /* S3 Trio64 (Diamond Stealth 64) PCI */ #if defined(DEV_BRANCH) && defined(USE_TI) - GFX_TICF62011, /* TI CF62011 */ + VID_TICF62011, /* TI CF62011 */ #endif + VID_VIRGE_VLB, /* S3 Virge VLB */ + VID_VIRGE_PCI, /* S3 Virge PCI */ + VID_VIRGEDX_VLB, /* S3 Virge/DX VLB */ + VID_VIRGEDX_PCI, /* S3 Virge/DX PCI */ + VID_VIRGEDX4_VLB, /* S3 Virge/DX (VBE 2.0) VLB */ + VID_VIRGEDX4_PCI, /* S3 Virge/DX (VBE 2.0) PCI */ + VID_VIRGEVX_VLB, /* S3 Virge/VX VLB */ + VID_VIRGEVX_PCI, /* S3 Virge/VX PCI */ - GFX_MAX + VID_MAX }; enum { @@ -135,6 +137,17 @@ extern "C" { #endif +enum { + VIDEO_ISA = 0, + VIDEO_MCA, + VIDEO_BUS +}; + +#define VIDEO_FLAG_TYPE_CGA 0 +#define VIDEO_FLAG_TYPE_MDA 1 +#define VIDEO_FLAG_TYPE_SPECIAL 2 +#define VIDEO_FLAG_TYPE_MASK 3 + typedef struct { int type; int write_b, write_w, write_l; @@ -158,7 +171,7 @@ typedef struct { typedef rgb_t PALETTE[256]; -extern int gfx_present[GFX_MAX]; +extern int gfx_present[VID_MAX]; extern int egareads, egawrites; extern int changeframecount; @@ -217,7 +230,6 @@ extern char *video_card_getname(int card); extern const device_t *video_card_getdevice(int card); #endif extern int video_card_has_config(int card); -extern video_timings_t *video_card_gettiming(int card); extern int video_card_getid(char *s); extern int video_old_to_new(int card); extern int video_new_to_old(int card); @@ -226,6 +238,8 @@ extern int video_get_video_from_internal_name(char *s); extern int video_is_mda(void); extern int video_is_cga(void); extern int video_is_ega_vga(void); +extern void video_inform(int type, const video_timings_t *ptr); +extern int video_get_type(void); extern void video_setblit(void(*blit)(int,int,int,int,int,int)); @@ -243,7 +257,6 @@ extern void updatewindowsize(int x, int y); extern void video_init(void); extern void video_close(void); -extern void video_font_reset(void); extern void video_reset(int card); extern uint8_t video_force_resize_get(void); extern void video_force_resize_set(uint8_t res);