Video timing improvements :

- Separated read and write timings
- Added timings for onboard video chips
- Updated timings based on VIDSPEED testing
This commit is contained in:
SarahW 2018-01-31 21:09:11 +00:00
commit 475f51ba0f
5 changed files with 178 additions and 81 deletions

View file

@ -333,8 +333,8 @@ void gd5429_write_linear(uint32_t addr, uint8_t val, void *p)
uint8_t vala, valb, valc, vald, wm = svga->writemask;
int writemask2 = svga->writemask;
cycles -= video_timing_b;
cycles_lost += video_timing_b;
cycles -= video_timing_write_b;
cycles_lost += video_timing_write_b;
egawrites++;

View file

@ -696,8 +696,8 @@ void ega_write(uint32_t addr, uint8_t val, void *p)
int writemask2 = ega->writemask;
egawrites++;
cycles -= video_timing_b;
cycles_lost += video_timing_b;
cycles -= video_timing_write_b;
cycles_lost += video_timing_write_b;
if (addr >= 0xB0000) addr &= 0x7fff;
else addr &= 0xffff;
@ -835,8 +835,8 @@ uint8_t ega_read(uint32_t addr, void *p)
int readplane = ega->readplane;
egareads++;
cycles -= video_timing_b;
cycles_lost += video_timing_b;
cycles -= video_timing_read_b;
cycles_lost += video_timing_read_b;
// pclog("Readega %06X ",addr);
if (addr >= 0xb0000) addr &= 0x7fff;
else addr &= 0xffff;

View file

@ -773,8 +773,8 @@ void svga_write(uint32_t addr, uint8_t val, void *p)
egawrites++;
cycles -= video_timing_b;
cycles_lost += video_timing_b;
cycles -= video_timing_write_b;
cycles_lost += video_timing_write_b;
if (svga_output) pclog("Writeega %06X ",addr);
addr &= svga->banked_mask;
@ -959,8 +959,8 @@ uint8_t svga_read(uint32_t addr, void *p)
uint32_t latch_addr;
int readplane = svga->readplane;
cycles -= video_timing_b;
cycles_lost += video_timing_b;
cycles -= video_timing_read_b;
cycles_lost += video_timing_read_b;
egareads++;
// pclog("Readega %06X ",addr);
@ -1035,8 +1035,8 @@ void svga_write_linear(uint32_t addr, uint8_t val, void *p)
uint8_t vala, valb, valc, vald, wm = svga->writemask;
int writemask2 = svga->writemask;
cycles -= video_timing_b;
cycles_lost += video_timing_b;
cycles -= video_timing_write_b;
cycles_lost += video_timing_write_b;
egawrites++;
@ -1217,8 +1217,8 @@ uint8_t svga_read_linear(uint32_t addr, void *p)
uint8_t temp, temp2, temp3, temp4;
int readplane = svga->readplane;
cycles -= video_timing_b;
cycles_lost += video_timing_b;
cycles -= video_timing_read_b;
cycles_lost += video_timing_read_b;
egareads++;
@ -1311,8 +1311,8 @@ void svga_writew(uint32_t addr, uint16_t val, void *p)
egawrites += 2;
cycles -= video_timing_w;
cycles_lost += video_timing_w;
cycles -= video_timing_write_w;
cycles_lost += video_timing_write_w;
if (svga_output) pclog("svga_writew: %05X ", addr);
addr = (addr & svga->banked_mask) + svga->write_bank;
@ -1340,8 +1340,8 @@ void svga_writel(uint32_t addr, uint32_t val, void *p)
egawrites += 4;
cycles -= video_timing_l;
cycles_lost += video_timing_l;
cycles -= video_timing_write_l;
cycles_lost += video_timing_write_l;
if (svga_output) pclog("svga_writel: %05X ", addr);
addr = (addr & svga->banked_mask) + svga->write_bank;
@ -1364,8 +1364,8 @@ uint16_t svga_readw(uint32_t addr, void *p)
egareads += 2;
cycles -= video_timing_w;
cycles_lost += video_timing_w;
cycles -= video_timing_read_w;
cycles_lost += video_timing_read_w;
// pclog("Readw %05X ", addr);
addr = (addr & svga->banked_mask) + svga->read_bank;
@ -1386,8 +1386,8 @@ uint32_t svga_readl(uint32_t addr, void *p)
egareads += 4;
cycles -= video_timing_l;
cycles_lost += video_timing_l;
cycles -= video_timing_read_l;
cycles_lost += video_timing_read_l;
// pclog("Readl %05X ", addr);
addr = (addr & svga->banked_mask) + svga->read_bank;
@ -1412,8 +1412,8 @@ void svga_writew_linear(uint32_t addr, uint16_t val, void *p)
egawrites += 2;
cycles -= video_timing_w;
cycles_lost += video_timing_w;
cycles -= video_timing_write_w;
cycles_lost += video_timing_write_w;
if (svga_output) pclog("Write LFBw %08X %04X\n", addr, val);
addr &= svga->decode_mask;
@ -1439,8 +1439,8 @@ void svga_writel_linear(uint32_t addr, uint32_t val, void *p)
egawrites += 4;
cycles -= video_timing_l;
cycles_lost += video_timing_l;
cycles -= video_timing_write_l;
cycles_lost += video_timing_write_l;
if (svga_output) pclog("Write LFBl %08X %08X\n", addr, val);
addr &= svga->decode_mask;
@ -1460,8 +1460,8 @@ uint16_t svga_readw_linear(uint32_t addr, void *p)
egareads += 2;
cycles -= video_timing_w;
cycles_lost += video_timing_w;
cycles -= video_timing_read_w;
cycles_lost += video_timing_read_w;
addr &= svga->decode_mask;
if (addr >= svga->vram_max)
@ -1479,8 +1479,8 @@ uint32_t svga_readl_linear(uint32_t addr, void *p)
egareads += 4;
cycles -= video_timing_l;
cycles_lost += video_timing_l;
cycles -= video_timing_read_l;
cycles_lost += video_timing_read_l;
addr &= svga->decode_mask;
if (addr >= svga->vram_max)

View file

@ -50,50 +50,66 @@ enum
VIDEO_BUS
};
typedef struct
{
int type;
int write_b, write_w, write_l;
int read_b, read_w, read_l;
} video_timings_t;
typedef struct
{
char name[64];
char internal_name[24];
device_t *device;
int legacy_id;
struct
{
int type;
int b, w, l;
} timing;
video_timings_t timing;
} VIDEO_CARD;
static VIDEO_CARD video_cards[] =
{
{"ATI Graphics Pro Turbo (Mach64 GX)", "mach64gx", &mach64gx_device, GFX_MACH64GX, {VIDEO_BUS, 4, 8, 16}},
{"ATI Video Xpression (Mach64 VT2)", "mach64vt2", &mach64vt2_device, GFX_MACH64VT2, {VIDEO_BUS, 3, 3, 4}},
{"ATI VGA Charger (ATI-28800)", "ati28800", &ati28800_device, GFX_VGACHARGER, {VIDEO_ISA, 3, 3, 6}},
{"ATI VGA Edge-16 (ATI-18800)", "ati18800", &ati18800_device, GFX_VGAEDGE16, {VIDEO_ISA, 3, 3, 6}},
{"CGA", "cga", &cga_device, GFX_CGA, {VIDEO_ISA, 8, 16, 32}},
{"Cirrus Logic CL-GD5429", "cl_gd5429", &gd5429_device, GFX_CL_GD5429, {VIDEO_ISA, 3, 3, 6}},
{"Diamond Stealth 32 (Tseng ET4000/w32p)", "stealth32", &et4000w32p_device, GFX_ET4000W32, {VIDEO_BUS, 4, 5, 10}},
{"Diamond Stealth 3D 2000 (S3 ViRGE)", "stealth3d_2000", &s3_virge_device, GFX_VIRGE, {VIDEO_BUS, 3, 5, 10}},
{"EGA", "ega", &ega_device, GFX_EGA, {VIDEO_ISA, 8, 16, 32}},
{"Hercules", "hercules", &hercules_device, GFX_HERCULES, {VIDEO_ISA, 8, 16, 32}},
{"Hercules InColor", "incolor", &incolor_device, GFX_INCOLOR, {VIDEO_ISA, 8, 16, 32}},
{"MDA", "mda", &mda_device, GFX_MDA, {VIDEO_ISA, 8, 16, 32}},
{"MDSI Genius", "genius", &genius_device, GFX_GENIUS, {VIDEO_ISA, 8, 16, 32}},
{"Number Nine 9FX (S3 Trio64)", "n9_9fx", &s3_9fx_device, GFX_N9_9FX, {VIDEO_BUS, 3, 5, 10}},
{"OAK OTI-067", "oti067", &oti067_device, GFX_OTI067, {VIDEO_ISA, 6, 8, 16}},
{"Olivetti GO481 (Paradise PVGA1A)", "olivetti_go481", &paradise_pvga1a_oli_go481_device, GFX_OLIVETTI_GO481, {VIDEO_ISA, 6, 8, 16}},
{"Paradise Bahamas 64 (S3 Vision864)", "bahamas64", &s3_bahamas64_device, GFX_BAHAMAS64, {VIDEO_BUS, 4, 5, 10}},
{"Phoenix S3 Trio32", "px_trio32", &s3_phoenix_trio32_device, GFX_PHOENIX_TRIO32, {VIDEO_BUS, 4, 5, 10}},
{"Phoenix S3 Trio64", "px_trio64", &s3_phoenix_trio64_device, GFX_PHOENIX_TRIO64, {VIDEO_BUS, 3, 5, 10}},
{"Plantronics ColorPlus", "plantronics", &colorplus_device, GFX_COLORPLUS, {VIDEO_ISA, 8, 16, 32}},
{"S3 ViRGE/DX", "virge375", &s3_virge_375_device, GFX_VIRGEDX, {VIDEO_BUS, 2, 3, 4}},
{"Trident TVGA8900D", "tvga8900d", &tvga8900d_device, GFX_TVGA, {VIDEO_ISA, 3, 3, 6}},
{"Tseng ET4000AX", "et4000ax", &et4000_device, GFX_ET4000, {VIDEO_ISA, 3, 3, 6}},
{"Trident TGUI9440", "tgui9440", &tgui9440_device, GFX_TGUI9440, {VIDEO_BUS, 4, 8, 16}},
{"VGA", "vga", &vga_device, GFX_VGA, {VIDEO_ISA, 8, 16, 32}},
{"Wyse 700", "wy700", &wy700_device, GFX_WY700, {VIDEO_ISA, 8, 16, 32}},
{"ATI Graphics Pro Turbo (Mach64 GX)", "mach64gx", &mach64gx_device, GFX_MACH64GX, {VIDEO_BUS, 2, 2, 1, 20, 20, 21}},
{"ATI Video Xpression (Mach64 VT2)", "mach64vt2", &mach64vt2_device, GFX_MACH64VT2, {VIDEO_BUS, 2, 2, 1, 20, 20, 21}},
{"ATI VGA Charger (ATI-28800)", "ati28800", &ati28800_device, GFX_VGACHARGER, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}},
{"ATI VGA Edge-16 (ATI-18800)", "ati18800", &ati18800_device, GFX_VGAEDGE16, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
{"CGA", "cga", &cga_device, GFX_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
{"Cirrus Logic CL-GD5429", "cl_gd5429", &gd5429_device, GFX_CL_GD5429, {VIDEO_ISA, 3, 3, 6, 3, 3, 6}},
{"Diamond Stealth 32 (Tseng ET4000/w32p)", "stealth32", &et4000w32p_device, GFX_ET4000W32, {VIDEO_BUS, 4, 4, 4, 10, 10, 10}},
{"Diamond Stealth 3D 2000 (S3 ViRGE)", "stealth3d_2000", &s3_virge_device, GFX_VIRGE, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}},
{"EGA", "ega", &ega_device, GFX_EGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
{"Hercules", "hercules", &hercules_device, GFX_HERCULES, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
{"Hercules InColor", "incolor", &incolor_device, GFX_INCOLOR, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
{"MDA", "mda", &mda_device, GFX_MDA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
{"MDSI Genius", "genius", &genius_device, GFX_GENIUS, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
{"Number Nine 9FX (S3 Trio64)", "n9_9fx", &s3_9fx_device, GFX_N9_9FX, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}},
{"OAK OTI-067", "oti067", &oti067_device, GFX_OTI067, {VIDEO_ISA, 6, 8, 16, 6, 8, 16}},
{"Olivetti GO481 (Paradise PVGA1A)", "olivetti_go481", &paradise_pvga1a_oli_go481_device, GFX_OLIVETTI_GO481, {VIDEO_ISA, 6, 8, 16, 6, 8, 16}},
{"Paradise Bahamas 64 (S3 Vision864)", "bahamas64", &s3_bahamas64_device, GFX_BAHAMAS64, {VIDEO_BUS, 4, 4, 5, 20, 20, 35}},
{"Phoenix S3 Trio32", "px_trio32", &s3_phoenix_trio32_device, GFX_PHOENIX_TRIO32, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}},
{"Phoenix S3 Trio64", "px_trio64", &s3_phoenix_trio64_device, GFX_PHOENIX_TRIO64, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}},
{"Plantronics ColorPlus", "plantronics", &colorplus_device, GFX_COLORPLUS, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
{"S3 ViRGE/DX", "virge375", &s3_virge_375_device, GFX_VIRGEDX, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}},
{"Trident TVGA8900D", "tvga8900d", &tvga8900d_device, GFX_TVGA, {VIDEO_ISA, 3, 3, 6, 8, 8, 12}},
{"Tseng ET4000AX", "et4000ax", &et4000_device, GFX_ET4000, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}},
{"Trident TGUI9440", "tgui9440", &tgui9440_device, GFX_TGUI9440, {VIDEO_BUS, 4, 8, 16, 4, 8, 16}},
{"VGA", "vga", &vga_device, GFX_VGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
{"Wyse 700", "wy700", &wy700_device, GFX_WY700, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
{"", "", NULL, 0}
};
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_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_t3100e = {VIDEO_ISA, 8,16,32, 8,16,32};
static video_timings_t timing_t1000 = {VIDEO_ISA, 8,16,32, 8,16,32};
int video_card_available(int card)
{
if (video_cards[card].device)
@ -236,43 +252,123 @@ void video_updatetiming()
{
if (video_speed == -1)
{
int new_gfxcard = video_old_to_new(gfxcard);
video_timings_t *timing;
int new_gfxcard = 0;
if (video_cards[new_gfxcard].timing.type == VIDEO_ISA)
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_MEGAPC:
timing = &timing_wd90c11;
break;
case ROM_ACER386:
timing = &timing_oti067;
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:
timing = &timing_ps1_svga;
break;
case ROM_T3100E:
timing = &timing_t3100e;
break;
case ROM_T1000:
timing = &timing_t1000;
break;
default:
new_gfxcard = video_old_to_new(gfxcard);
timing = &video_cards[new_gfxcard].timing;
break;
}
if (timing->type == VIDEO_ISA)
{
video_timing_b = (int)(isa_timing * video_cards[new_gfxcard].timing.b);
video_timing_w = (int)(isa_timing * video_cards[new_gfxcard].timing.w);
video_timing_l = (int)(isa_timing * video_cards[new_gfxcard].timing.l);
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);
}
else
{
video_timing_b = (int)(bus_timing * video_cards[new_gfxcard].timing.b);
video_timing_w = (int)(bus_timing * video_cards[new_gfxcard].timing.w);
video_timing_l = (int)(bus_timing * video_cards[new_gfxcard].timing.l);
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);
}
if (cpu_16bitbus)
video_timing_l = video_timing_w * 2;
}
else
{
if (video_timing[video_speed][0] == VIDEO_ISA)
{
video_timing_b = (int)(isa_timing * video_timing[video_speed][1]);
video_timing_w = (int)(isa_timing * video_timing[video_speed][2]);
video_timing_l = (int)(isa_timing * video_timing[video_speed][3]);
video_timing_read_b = ISA_CYCLES(video_timing[video_speed][1]);
video_timing_read_w = ISA_CYCLES(video_timing[video_speed][2]);
video_timing_read_l = ISA_CYCLES(video_timing[video_speed][3]);
video_timing_write_b = ISA_CYCLES(video_timing[video_speed][1]);
video_timing_write_w = ISA_CYCLES(video_timing[video_speed][2]);
video_timing_write_l = ISA_CYCLES(video_timing[video_speed][3]);
}
else
{
video_timing_b = (int)(bus_timing * video_timing[video_speed][1]);
video_timing_w = (int)(bus_timing * video_timing[video_speed][2]);
video_timing_l = (int)(bus_timing * video_timing[video_speed][3]);
video_timing_read_b = (int)(bus_timing * video_timing[video_speed][1]);
video_timing_read_w = (int)(bus_timing * video_timing[video_speed][2]);
video_timing_read_l = (int)(bus_timing * video_timing[video_speed][3]);
video_timing_write_b = (int)(bus_timing * video_timing[video_speed][1]);
video_timing_write_w = (int)(bus_timing * video_timing[video_speed][2]);
video_timing_write_l = (int)(bus_timing * video_timing[video_speed][3]);
}
if (cpu_16bitbus)
video_timing_l = video_timing_w * 2;
}
if (cpu_16bitbus)
{
video_timing_read_l = video_timing_read_w * 2;
video_timing_write_l = video_timing_write_w * 2;
}
}
int video_timing_b, video_timing_w, video_timing_l;
int video_timing_read_b, video_timing_read_w, video_timing_read_l;
int video_timing_write_b, video_timing_write_w, video_timing_write_l;
int video_res_x, video_res_y, video_bpp;

View file

@ -67,7 +67,8 @@ void video_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h);
extern void (*video_blit_memtoscreen_func)(int x, int y, int y1, int y2, int w, int h);
extern int video_timing_b, video_timing_w, video_timing_l;
extern int video_timing_read_b, video_timing_read_w, video_timing_read_l;
extern int video_timing_write_b, video_timing_write_w, video_timing_write_l;
extern int video_speed;
extern int video_res_x, video_res_y, video_bpp;