Major changes to video code - no more ROM set checks, and type and timings are set in a card's device init function;

Added the ExpertColor DSV3868P CF55 (S3 Vision868).
This commit is contained in:
OBattler
2018-09-19 20:13:32 +02:00
parent d3c24b9d1b
commit 69b57c49b0
45 changed files with 737 additions and 901 deletions

View File

@@ -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, <mgrca8@gmail.com>
@@ -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;

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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)
device_add(&fdc_at_actlow_device);
break;
}
if (gfxcard == VID_INTERNAL) switch(romset) {
case ROM_PC1512:
loadfont(L"roms/machines/pc1512/40078", 2);

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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);
}

View File

@@ -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);
}

View File

@@ -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, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com>
@@ -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;

View File

@@ -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. */

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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;

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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. */

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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);

View File

@@ -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, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com>
@@ -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);
}

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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);

View File

@@ -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, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com>
@@ -918,7 +918,7 @@ machine_xt_t1000_init(const machine_t *model)
t1000_nvr_load();
nvr_set_ven_save(t1000_nvr_save);
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 == VID_INTERNAL)
device_add(&t1200_video_device);
}

View File

@@ -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, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com>
@@ -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;

View File

@@ -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);
}

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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 },

View File

@@ -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, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com>
@@ -1691,15 +1691,7 @@ mem_reset(void)
rom = NULL;
}
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;
if (ram != NULL) {
free(ram);
@@ -1776,15 +1768,6 @@ mem_log("MEM: reset: new pages=%08lx, pages_sz=%i\n", pages, pages_sz);
pages[c].write_b = mem_write_ramb_page;
pages[c].write_w = mem_write_ramw_page;
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));
@@ -1878,6 +1861,7 @@ mem_init(void)
void
mem_remap_top(int kb)
{
int c;
uint32_t start = (mem_size >= 1024) ? mem_size : 1024;
@@ -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_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));

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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<GFX_MAX; c++)
for (c=0; c<VID_MAX; c++)
gfx_present[c] = video_card_available(video_old_to_new(c));
again2:
if (! video_card_available(video_old_to_new(gfxcard))) {
if (romset != -1) {
ui_msgbox(MBX_INFO, (wchar_t *)IDS_2064);
}
for (c=GFX_MAX-1; 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();

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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:

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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,

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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;

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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);

View File

@@ -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, <http://pcem-emulator.co.uk/>
* 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);

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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");

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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");

View File

@@ -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, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com>
@@ -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);
}

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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,

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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);

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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);

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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 */

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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 */

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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);

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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);
}

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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, &paradise->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 = &paradise->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(&paradise->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(&paradise->svga.mapping, paradise_read, paradise_readw, NULL, paradise_write, paradise_writew, NULL);
mem_mapping_set_p(&paradise->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 = &paradise->svga;
memset(paradise, 0, sizeof(paradise_t));
io_sethandler(0x03c0, 0x0020, paradise_in, NULL, NULL, paradise_out, NULL, NULL, paradise);
svga_init(&paradise->svga, paradise, 1 << 19, /*512kb*/
paradise_recalctimings,
paradise_in, paradise_out,
NULL,
NULL);
switch(info->local) {
case PVGA1A:
svga_init(&paradise->svga, paradise, memsize, /*256kb*/
NULL,
paradise_in, paradise_out,
NULL,
NULL);
break;
case WD90C11:
svga_init(&paradise->svga, paradise, 1 << 19, /*512kb*/
paradise_recalctimings,
paradise_in, paradise_out,
NULL,
NULL);
break;
case WD90C30:
svga_init(&paradise->svga, paradise, memsize,
paradise_recalctimings,
paradise_in, paradise_out,
NULL,
NULL);
break;
}
mem_mapping_set_handler(&paradise->svga.mapping, paradise_read, paradise_readw, NULL, paradise_write, paradise_writew, NULL);
mem_mapping_set_p(&paradise->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 = &paradise->svga;
memset(paradise, 0, sizeof(paradise_t));
io_sethandler(0x03c0, 0x0020, paradise_in, NULL, NULL, paradise_out, NULL, NULL, paradise);
svga_init(&paradise->svga, paradise, memsize,
paradise_recalctimings,
paradise_in, paradise_out,
NULL,
NULL);
mem_mapping_set_handler(&paradise->svga.mapping, paradise_read, paradise_readw, NULL, paradise_write, paradise_writew, NULL);
mem_mapping_set_p(&paradise->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(&paradise->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(&paradise->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(&paradise->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(&paradise->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(&paradise->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(&paradise->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,

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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
};

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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;

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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,

View File

@@ -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, <mgrca8@gmail.com>
* Fred N. van Kempen, <decwiz@yahoo.com>
@@ -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", &paradise_pvga1a_device, GFX_PVGA1A, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
{ "[ISA] Paradise WD90C11-LR", "wd90c11", &paradise_wd90c11_device, GFX_WD90C11, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
{ "[ISA] Paradise WD90C30-LR", "wd90c30", &paradise_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", &paradise_pvga1a_device, VID_PVGA1A },
{ "[ISA] Paradise WD90C11-LR", "wd90c11", &paradise_wd90c11_device, VID_WD90C11 },
{ "[ISA] Paradise WD90C30-LR", "wd90c30", &paradise_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);
}

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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,

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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,

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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;

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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,

View File

@@ -3,3 +3,4 @@
*/
extern const device_t vga_device;
extern const device_t ps1vga_device;
extern const device_t ps1vga_mca_device;

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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);

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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) {

View File

@@ -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, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -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);