Added initial (and a bit buggy on OS/2, so use 8514/A on it instead) emulation of XGA for both MCA and ISA buses.

This commit is contained in:
TC1995
2022-06-17 21:26:26 +02:00
parent dce5055d9c
commit 9e44719f13
9 changed files with 3254 additions and 4 deletions

View File

@@ -24,7 +24,8 @@ add_library(vid OBJECT agpgart.c video.c vid_table.c vid_cga.c vid_cga_comp.c
vid_stg_ramdac.c vid_ht216.c vid_oak_oti.c vid_paradise.c vid_rtg310x.c
vid_f82c425.c vid_ti_cf62011.c vid_tvga.c vid_tgui9440.c vid_tkd8001_ramdac.c
vid_att20c49x_ramdac.c vid_s3.c vid_s3_virge.c vid_ibm_rgb528_ramdac.c
vid_sdac_ramdac.c vid_ogc.c vid_nga.c vid_tvp3026_ramdac.c vid_att2xc498_ramdac.c)
vid_sdac_ramdac.c vid_ogc.c vid_nga.c vid_tvp3026_ramdac.c vid_att2xc498_ramdac.c
vid_xga.c)
if(MGA)
target_compile_definitions(vid PRIVATE USE_MGA)

View File

@@ -560,6 +560,8 @@ svga_recalctimings(svga_t *svga)
} else {
if (ibm8514_on && ibm8514_enabled)
ibm8514_recalctimings(svga);
if (xga_enabled)
xga_recalctimings(svga);
}
svga->y_add = (overscan_y >> 1) - (svga->crtc[8] & 0x1f);
@@ -660,6 +662,9 @@ svga_poll(void *p)
if (!vga_on && ibm8514_enabled && ibm8514_on) {
ibm8514_poll(&svga->dev8514, svga);
return;
} else if (!vga_on && xga_enabled && svga->xga.on) {
xga_poll(&svga->xga, svga);
return;
}
if (!svga->linepos) {
@@ -1070,6 +1075,23 @@ svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *p)
cycles -= video_timing_write_b;
if (!linear) {
if (xga_enabled) {
if (((svga->xga.op_mode & 7) == 4) && (svga->xga.aperture_cntl == 1)) {
if (val == 0xa5) { /*Memory size test of XGA*/
svga->xga.test = val;
return;
} else if (val == 0x5a) {
svga->xga.test = val;
return;
} else if (val == 0x12 || val == 0x34) {
addr += svga->xga.write_bank;
svga->xga.vram[addr & svga->xga.vram_mask] = val;
svga->xga.op_mode_reset = 1;
return;
}
} else
svga->xga.on = 0;
}
addr = svga_decode_addr(svga, addr, 1);
if (addr == 0xffffffff)
@@ -1254,6 +1276,21 @@ svga_read_common(uint32_t addr, uint8_t linear, void *p)
cycles -= video_timing_read_b;
if (!linear) {
if (xga_enabled) {
if (((svga->xga.op_mode & 7) == 4) && (svga->xga.aperture_cntl == 1)) {
if (svga->xga.test == 0xa5) { /*Memory size test of XGA*/
svga->xga.on = 1;
return svga->xga.test;
} else if (svga->xga.test == 0x5a) {
svga->xga.on = 1;
return svga->xga.test;
} else if (addr == 0xa0000 || addr == 0xa0010) {
addr += svga->xga.read_bank;
return svga->xga.vram[addr & svga->xga.vram_mask];
}
} else
svga->xga.on = 0;
}
addr = svga_decode_addr(svga, addr, 0);
if (addr == 0xffffffff)

3026
src/video/vid_xga.c Normal file

File diff suppressed because it is too large Load Diff