Video fixes and added the Tseng ET2000.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
};
|
||||
};
|
||||
|
||||
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
|
||||
};
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
|
||||
|
||||
@@ -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)];
|
||||
}
|
||||
|
||||
|
||||
@@ -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 },
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user