From cd0f34422191a365cc3010ccccbaf1db5d636993 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 18 Feb 2021 21:55:39 +0100 Subject: [PATCH] Video fixes and added the Tseng ET2000. --- src/video/CMakeLists.txt | 4 -- src/video/vid_cga.c | 2 - src/video/vid_colorplus.c | 2 - src/video/vid_ega.c | 78 +++++++++++++++++++++++++++------- src/video/vid_genius.c | 2 - src/video/vid_ht216.c | 4 -- src/video/vid_mda.c | 2 - src/video/vid_mga.c | 12 ------ src/video/vid_nga.c | 2 - src/video/vid_ogc.c | 2 - src/video/vid_sigma.c | 2 - src/video/vid_table.c | 1 + src/video/vid_vga.c | 9 +++- src/video/vid_voodoo_banshee.c | 9 ---- src/video/vid_wy700.c | 2 - src/video/video.c | 4 +- 16 files changed, 71 insertions(+), 66 deletions(-) diff --git a/src/video/CMakeLists.txt b/src/video/CMakeLists.txt index 9419e3e4a..f05efe9ab 100644 --- a/src/video/CMakeLists.txt +++ b/src/video/CMakeLists.txt @@ -33,10 +33,6 @@ if(NOT MSVC) target_compile_options(vid PRIVATE "-msse2") endif() -if(CL5422) - target_compile_definitions(vid PRIVATE USE_CL5422) -endif() - if(MGA) target_compile_definitions(vid PRIVATE USE_MGA) target_sources(vid PRIVATE vid_mga.c) diff --git a/src/video/vid_cga.c b/src/video/vid_cga.c index 60a662490..51e0ac6af 100644 --- a/src/video/vid_cga.c +++ b/src/video/vid_cga.c @@ -138,7 +138,6 @@ cga_write(uint32_t addr, uint8_t val, void *p) cga->charbuffer[offset] = cga->vram[addr & 0x3fff]; cga->charbuffer[offset | 1] = cga->vram[addr & 0x3fff]; } - egawrites++; cga_waitstates(cga); } @@ -154,7 +153,6 @@ cga_read(uint32_t addr, void *p) cga->charbuffer[offset] = cga->vram[addr & 0x3fff]; cga->charbuffer[offset | 1] = cga->vram[addr & 0x3fff]; } - egareads++; return cga->vram[addr & 0x3fff]; } diff --git a/src/video/vid_colorplus.c b/src/video/vid_colorplus.c index 223c4d1c6..ed5cd6f00 100644 --- a/src/video/vid_colorplus.c +++ b/src/video/vid_colorplus.c @@ -99,7 +99,6 @@ void colorplus_write(uint32_t addr, uint8_t val, void *p) colorplus->cga.charbuffer[offset] = colorplus->cga.vram[addr & 0x7fff]; colorplus->cga.charbuffer[offset | 1] = colorplus->cga.vram[addr & 0x7fff]; } - egawrites++; cycles -= 4; } @@ -124,7 +123,6 @@ uint8_t colorplus_read(uint32_t addr, void *p) colorplus->cga.charbuffer[offset] = colorplus->cga.vram[addr & 0x7fff]; colorplus->cga.charbuffer[offset | 1] = colorplus->cga.vram[addr & 0x7fff]; } - egareads++; return colorplus->cga.vram[addr & 0x7fff]; } diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c index bbd8e7da9..094425430 100644 --- a/src/video/vid_ega.c +++ b/src/video/vid_ega.c @@ -43,6 +43,7 @@ void ega_doblit(int y1, int y2, int wx, int wy, ega_t *ega); #define BIOS_SEGA_PATH L"roms/video/ega/lega.vbi" #define BIOS_ATIEGA_PATH L"roms/video/ega/ATI EGA Wonder 800+ N1.00.BIN" #define BIOS_ISKRA_PATH L"roms/video/ega/143-02.bin", L"roms/video/ega/143-03.bin" +#define BIOS_TSENG_PATH L"roms/video/ega/EGA ET2000.BIN" enum { @@ -50,14 +51,15 @@ enum { EGA_COMPAQ, EGA_SUPEREGA, EGA_ATI, - EGA_ISKRA + EGA_ISKRA, + EGA_TSENG }; static video_timings_t timing_ega = {VIDEO_ISA, 8, 16, 32, 8, 16, 32}; static uint8_t ega_rotate[8][256]; static uint32_t pallook16[256], pallook64[256]; -static int old_overscan_color = 0; +static int ega_type = 0, old_overscan_color = 0; extern uint8_t edatlookup[4][4]; @@ -256,38 +258,48 @@ uint8_t ega_in(uint16_t addr, void *p) break; case 0x3c0: - ret = ega->attraddr | ega->attr_palette_enable; + if (ega_type) + ret = ega->attraddr | ega->attr_palette_enable; break; case 0x3c1: - ret = ega->attrregs[ega->attraddr]; + if (ega_type) + ret = ega->attrregs[ega->attraddr]; break; case 0x3c2: ret = (egaswitches & (8 >> egaswitchread)) ? 0x10 : 0x00; break; case 0x3c4: - ret = ega->seqaddr; + if (ega_type) + ret = ega->seqaddr; break; case 0x3c5: - ret = ega->seqregs[ega->seqaddr & 0xf]; + if (ega_type) + ret = ega->seqregs[ega->seqaddr & 0xf]; break; case 0x3c8: - ret = 2; + if (ega_type) + ret = 2; break; case 0x3cc: - ret = ega->miscout; + if (ega_type) + ret = ega->miscout; break; case 0x3ce: - ret = ega->gdcaddr; + if (ega_type) + ret = ega->gdcaddr; break; case 0x3cf: - ret = ega->gdcreg[ega->gdcaddr & 0xf]; + if (ega_type) + ret = ega->gdcreg[ega->gdcaddr & 0xf]; break; case 0x3d0: case 0x3d4: - ret = ega->crtcreg; + if (ega_type) + ret = ega->crtcreg; break; case 0x3d1: case 0x3d5: - ret = ega->crtc[ega->crtcreg]; + if (ega_type) + ret = ega->crtc[ega->crtcreg]; break; case 0x3da: ega->attrff = 0; @@ -731,7 +743,6 @@ ega_write(uint32_t addr, uint8_t val, void *p) uint8_t vala, valb, valc, vald; int writemask2 = ega->writemask; - egawrites++; cycles -= video_timing_write_b; if (addr >= 0xB0000) addr &= 0x7fff; @@ -858,7 +869,6 @@ ega_read(uint32_t addr, void *p) uint8_t temp, temp2, temp3, temp4; int readplane = ega->readplane; - egareads++; cycles -= video_timing_read_b; if (addr >= 0xb0000) addr &= 0x7fff; else addr &= 0xffff; @@ -1021,6 +1031,12 @@ ega_standalone_init(const device_t *info) ega->x_add = 8; ega->y_add = 14; + if ((info->local == EGA_IBM) || (info->local == EGA_ISKRA) || + (info->local == EGA_TSENG)) + ega_type = 0; + else + ega_type = 1; + switch(info->local) { case EGA_IBM: default: @@ -1043,6 +1059,10 @@ ega_standalone_init(const device_t *info) rom_init_interleaved(&ega->bios_rom, BIOS_ISKRA_PATH, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); break; + case EGA_TSENG: + rom_init(&ega->bios_rom, BIOS_TSENG_PATH, + 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); + break; } if ((ega->bios_rom.rom[0x3ffe] == 0xaa) && (ega->bios_rom.rom[0x3fff] == 0x55)) { @@ -1101,6 +1121,20 @@ atiega_standalone_available(void) } +static int +iskra_ega_standalone_available(void) +{ + return rom_present(L"roms/video/ega/143-02.bin") && rom_present(L"roms/video/ega/143-03.bin"); +} + + +static int +et2000_standalone_available(void) +{ + return rom_present(BIOS_TSENG_PATH); +} + + static void ega_close(void *p) { @@ -1250,8 +1284,20 @@ const device_t iskra_ega_device = DEVICE_ISA, EGA_ISKRA, ega_standalone_init, ega_close, NULL, - { ega_standalone_available }, + { iskra_ega_standalone_available }, ega_speed_changed, NULL, ega_config -}; \ No newline at end of file +}; + +const device_t et2000_device = +{ + "Tseng Labs ET2000", + DEVICE_ISA, + EGA_TSENG, + ega_standalone_init, ega_close, NULL, + { et2000_standalone_available }, + ega_speed_changed, + NULL, + ega_config +}; diff --git a/src/video/vid_genius.c b/src/video/vid_genius.c index d6afc1863..b3807acf5 100644 --- a/src/video/vid_genius.c +++ b/src/video/vid_genius.c @@ -261,7 +261,6 @@ void genius_write(uint32_t addr, uint8_t val, void *p) { genius_t *genius = (genius_t *)p; - egawrites++; genius_waitstates(); if (genius->genius_control & 1) { @@ -288,7 +287,6 @@ genius_read(uint32_t addr, void *p) { genius_t *genius = (genius_t *)p; uint8_t ret; - egareads++; genius_waitstates(); if (genius->genius_control & 1) { diff --git a/src/video/vid_ht216.c b/src/video/vid_ht216.c index b3393aed4..4c11f2527 100644 --- a/src/video/vid_ht216.c +++ b/src/video/vid_ht216.c @@ -904,8 +904,6 @@ ht216_write_common(ht216_t *ht216, uint32_t addr, uint8_t val) cycles -= video_timing_write_b; - egawrites++; - addr &= 0xfffff; val = ((val >> (svga->gdcreg[3] & 7)) | (val << (8 - (svga->gdcreg[3] & 7)))); @@ -1084,8 +1082,6 @@ ht216_read_common(ht216_t *ht216, uint32_t addr) cycles -= video_timing_read_b; - egareads++; - addr &= 0xfffff; count = 2; diff --git a/src/video/vid_mda.c b/src/video/vid_mda.c index 7220346bd..c05744b01 100644 --- a/src/video/vid_mda.c +++ b/src/video/vid_mda.c @@ -79,14 +79,12 @@ uint8_t mda_in(uint16_t addr, void *p) void mda_write(uint32_t addr, uint8_t val, void *p) { mda_t *mda = (mda_t *)p; - egawrites++; mda->vram[addr & 0xfff] = val; } uint8_t mda_read(uint32_t addr, void *p) { mda_t *mda = (mda_t *)p; - egareads++; return mda->vram[addr & 0xfff]; } diff --git a/src/video/vid_mga.c b/src/video/vid_mga.c index 3433b7539..16e0b390c 100644 --- a/src/video/vid_mga.c +++ b/src/video/vid_mga.c @@ -2130,8 +2130,6 @@ mystique_readb_linear(uint32_t addr, void *p) { svga_t *svga = (svga_t *)p; - egareads++; - cycles -= video_timing_read_b; addr &= svga->decode_mask; @@ -2147,8 +2145,6 @@ mystique_readw_linear(uint32_t addr, void *p) { svga_t *svga = (svga_t *)p; - egareads += 2; - cycles -= video_timing_read_w; addr &= svga->decode_mask; @@ -2164,8 +2160,6 @@ mystique_readl_linear(uint32_t addr, void *p) { svga_t *svga = (svga_t *)p; - egareads += 4; - cycles -= video_timing_read_l; addr &= svga->decode_mask; @@ -2181,8 +2175,6 @@ mystique_writeb_linear(uint32_t addr, uint8_t val, void *p) { svga_t *svga = (svga_t *)p; - egawrites++; - cycles -= video_timing_write_b; addr &= svga->decode_mask; @@ -2199,8 +2191,6 @@ mystique_writew_linear(uint32_t addr, uint16_t val, void *p) { svga_t *svga = (svga_t *)p; - egawrites += 2; - cycles -= video_timing_write_w; addr &= svga->decode_mask; @@ -2217,8 +2207,6 @@ mystique_writel_linear(uint32_t addr, uint32_t val, void *p) { svga_t *svga = (svga_t *)p; - egawrites += 4; - cycles -= video_timing_write_l; addr &= svga->decode_mask; diff --git a/src/video/vid_nga.c b/src/video/vid_nga.c index 6b1b60dcb..cdd72ecb2 100644 --- a/src/video/vid_nga.c +++ b/src/video/vid_nga.c @@ -118,7 +118,6 @@ nga_write(uint32_t addr, uint8_t val, void *priv) nga->cga.charbuffer[offset] = nga->cga.vram[addr & 0x7fff]; nga->cga.charbuffer[offset | 1] = nga->cga.vram[addr & 0x7fff]; } - egawrites++; nga_waitstates(&nga->cga); } @@ -144,7 +143,6 @@ nga_read(uint32_t addr, void *priv) nga->cga.charbuffer[offset | 1] = nga->cga.vram[addr & 0x7fff]; } - egareads++; return(ret); } diff --git a/src/video/vid_ogc.c b/src/video/vid_ogc.c index b15565718..65630653c 100644 --- a/src/video/vid_ogc.c +++ b/src/video/vid_ogc.c @@ -166,7 +166,6 @@ ogc_write(uint32_t addr, uint8_t val, void *priv) ogc->cga.charbuffer[offset] = ogc->cga.vram[addr & 0x7fff]; ogc->cga.charbuffer[offset | 1] = ogc->cga.vram[addr & 0x7fff]; } - egawrites++; ogc_waitstates(&ogc->cga); } @@ -186,7 +185,6 @@ ogc_read(uint32_t addr, void *priv) ogc->cga.charbuffer[offset | 1] = ogc->cga.vram[addr & 0x7fff]; } - egareads++; return(ogc->cga.vram[addr & 0x7FFF]); } diff --git a/src/video/vid_sigma.c b/src/video/vid_sigma.c index 78812d27d..777389ce6 100644 --- a/src/video/vid_sigma.c +++ b/src/video/vid_sigma.c @@ -343,7 +343,6 @@ sigma_write(uint32_t addr, uint8_t val, void *p) sigma_t *sigma = (sigma_t *)p; sigma->vram[sigma->plane * 0x8000 + (addr & 0x7fff)] = val; - egawrites++; cycles -= 4; } @@ -354,7 +353,6 @@ sigma_read(uint32_t addr, void *p) sigma_t *sigma = (sigma_t *)p; cycles -= 4; - egareads++; return sigma->vram[sigma->plane * 0x8000 + (addr & 0x7fff)]; } diff --git a/src/video/vid_table.c b/src/video/vid_table.c index 065988089..d81e19147 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -108,6 +108,7 @@ video_cards[] = { { "tvga8900d", &tvga8900d_device }, { "tvga9000b", &tvga9000b_device }, { "tgkorvga", &et4000k_isa_device }, + { "et2000", &et2000_device }, { "et4000ax", &et4000_isa_device }, { "vga", &vga_device }, { "v7_vga_1024i", &v7_vga_1024i_device }, diff --git a/src/video/vid_vga.c b/src/video/vid_vga.c index f4e38e7fd..978a154c4 100644 --- a/src/video/vid_vga.c +++ b/src/video/vid_vga.c @@ -69,8 +69,13 @@ void vga_out(uint16_t addr, uint8_t val, void *p) { if (svga->crtcreg < 0xe || svga->crtcreg > 0x10) { - svga->fullchange = changeframecount; - svga_recalctimings(svga); + if ((svga->crtcreg == 0xc) || (svga->crtcreg == 0xd)) { + svga->fullchange = 3; + svga->ma_latch = ((svga->crtc[0xc] << 8) | svga->crtc[0xd]) + ((svga->crtc[8] & 0x60) >> 5); + } else { + svga->fullchange = changeframecount; + svga_recalctimings(svga); + } } } break; diff --git a/src/video/vid_voodoo_banshee.c b/src/video/vid_voodoo_banshee.c index b749e0cf2..bb9f00de3 100644 --- a/src/video/vid_voodoo_banshee.c +++ b/src/video/vid_voodoo_banshee.c @@ -1424,7 +1424,6 @@ static uint8_t banshee_read_linear(uint32_t addr, void *p) if (addr >= svga->vram_max) return 0xff; - egareads++; cycles -= video_timing_read_b; // banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); @@ -1457,7 +1456,6 @@ static uint16_t banshee_read_linear_w(uint32_t addr, void *p) if (addr >= svga->vram_max) return 0xff; - egareads++; cycles -= video_timing_read_w; // banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); @@ -1491,7 +1489,6 @@ static uint32_t banshee_read_linear_l(uint32_t addr, void *p) if (addr >= svga->vram_max) return 0xff; - egareads++; cycles -= video_timing_read_l; // banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); @@ -1523,8 +1520,6 @@ static void banshee_write_linear(uint32_t addr, uint8_t val, void *p) if (addr >= svga->vram_max) return; - egawrites++; - cycles -= video_timing_write_b; svga->changedvram[addr >> 12] = changeframecount; @@ -1561,8 +1556,6 @@ static void banshee_write_linear_w(uint32_t addr, uint16_t val, void *p) if (addr >= svga->vram_max) return; - egawrites++; - cycles -= video_timing_write_w; svga->changedvram[addr >> 12] = changeframecount; @@ -1607,8 +1600,6 @@ static void banshee_write_linear_l(uint32_t addr, uint32_t val, void *p) if (addr >= svga->vram_max) return; - egawrites += 4; - cycles -= video_timing_write_l; svga->changedvram[addr >> 12] = changeframecount; diff --git a/src/video/vid_wy700.c b/src/video/vid_wy700.c index 44aacc277..404958d98 100644 --- a/src/video/vid_wy700.c +++ b/src/video/vid_wy700.c @@ -459,7 +459,6 @@ void wy700_checkchanges(wy700_t *wy700) void wy700_write(uint32_t addr, uint8_t val, void *p) { wy700_t *wy700 = (wy700_t *)p; - egawrites++; if (wy700->wy700_mode & 0x80) /* High-res mode. */ { @@ -483,7 +482,6 @@ void wy700_write(uint32_t addr, uint8_t val, void *p) uint8_t wy700_read(uint32_t addr, void *p) { wy700_t *wy700 = (wy700_t *)p; - egareads++; if (wy700->wy700_mode & 0x80) /* High-res mode. */ { addr &= 0xFFFF; diff --git a/src/video/video.c b/src/video/video.c index 7d9c85def..da5e89f8d 100644 --- a/src/video/video.c +++ b/src/video/video.c @@ -92,9 +92,7 @@ uint32_t *video_6to8 = NULL, *video_8to32 = NULL, *video_15to32 = NULL, *video_16to32 = NULL; -int egareads = 0, - egawrites = 0, - changeframecount = 2; +int changeframecount = 2; int frames = 0; int fullchange = 0; uint8_t edatlookup[4][4];