diff --git a/src/video/vid_et4000.c b/src/video/vid_et4000.c
index a3146ef6e..794feba7b 100644
--- a/src/video/vid_et4000.c
+++ b/src/video/vid_et4000.c
@@ -8,7 +8,7 @@
*
* Emulation of the Tseng Labs ET4000.
*
- * Version: @(#)vid_et4000.c 1.0.10 2018/08/22
+ * Version: @(#)vid_et4000.c 1.0.11 2018/08/23
*
* Authors: Sarah Walker,
* Miran Grca,
@@ -87,10 +87,13 @@ void et4000_out(uint16_t addr, uint8_t val, void *p)
case 0x3C6: case 0x3C7: case 0x3C8: case 0x3C9:
sc1502x_ramdac_out(addr, val, &et4000->ramdac, svga);
return;
-
+
case 0x3CD: /*Banking*/
- svga->write_bank = (val & 0xf) * 0x10000;
- svga->read_bank = ((val >> 4) & 0xf) * 0x10000;
+ if (!(svga->crtc[0x36] & 0x10)) {
+ svga->write_bank = ((val & 0xf) * 0x10000) & svga->vram_display_mask;
+ svga->read_bank = (((val >> 4) & 0xf) * 0x10000) & svga->vram_display_mask;
+ pclog("write bank: %08X, read bank: %08X\n", svga->write_bank, svga->read_bank);
+ }
et4000->banking = val;
return;
case 0x3D4:
@@ -105,8 +108,14 @@ void et4000_out(uint16_t addr, uint8_t val, void *p)
val &= crtc_mask[svga->crtcreg];
svga->crtc[svga->crtcreg] = val;
- if (svga->crtcreg == 0x36)
+ if (svga->crtcreg == 0x36) {
svga->vram_display_mask = (val & 0x20) ? et4000->vram_mask : 0x3ffff;
+ if (!(val & 0x10)) {
+ svga->write_bank = ((et4000->banking & 0xf) * 0x10000) & svga->vram_display_mask;
+ svga->read_bank = (((et4000->banking >> 4) & 0xf) * 0x10000) & svga->vram_display_mask;
+ } else
+ svga->write_bank = svga->read_bank = 0;
+ }
if (old != val)
{
@@ -118,7 +127,7 @@ void et4000_out(uint16_t addr, uint8_t val, void *p)
}
/*Note - Silly hack to determine video memory size automatically by ET4000 BIOS.*/
- if (svga->crtcreg == 0x37 && !et4000->is_mca)
+ if ((svga->crtcreg == 0x37) && !et4000->is_mca)
{
switch(val & 0x0B)
{
@@ -501,7 +510,11 @@ static device_config_t et4000_config[] =
.description = "Memory size",
.type = CONFIG_SELECTION,
.selection =
- {
+ {
+ {
+ .description = "256 kB",
+ .value = 256
+ },
{
.description = "512 kB",
.value = 512
diff --git a/src/video/vid_et4000w32.c b/src/video/vid_et4000w32.c
index 2ed8837bf..bcc723d66 100644
--- a/src/video/vid_et4000w32.c
+++ b/src/video/vid_et4000w32.c
@@ -10,7 +10,7 @@
*
* Known bugs: Accelerator doesn't work in planar modes
*
- * Version: @(#)vid_et4000w32.c 1.0.11 2018/07/16
+ * Version: @(#)vid_et4000w32.c 1.0.12 2018/08/23
*
* Authors: Sarah Walker,
* Miran Grca,
@@ -96,6 +96,7 @@ typedef struct et4000w32p_t
int pci;
uint8_t regs[256];
uint32_t linearbase, linearbase_old;
+ uint32_t vram_mask;
uint8_t banking, banking2;
@@ -201,13 +202,17 @@ void et4000w32p_out(uint16_t addr, uint8_t val, void *p)
return;
case 0x3CB: /*Banking extension*/
- svga->write_bank = (svga->write_bank & 0xfffff) | ((val & 1) << 20);
- svga->read_bank = (svga->read_bank & 0xfffff) | ((val & 0x10) << 16);
+ if (!(svga->crtc[0x36] & 0x10)) {
+ svga->write_bank = ((svga->write_bank & 0xfffff) | ((val & 1) << 20)) & svga->vram_display_mask;
+ svga->read_bank = ((svga->read_bank & 0xfffff) | ((val & 0x10) << 16)) & svga->vram_display_mask;
+ }
et4000->banking2 = val;
return;
case 0x3CD: /*Banking*/
- svga->write_bank = (svga->write_bank & 0x100000) | ((val & 0xf) * 65536);
- svga->read_bank = (svga->read_bank & 0x100000) | (((val >> 4) & 0xf) * 65536);
+ if (!(svga->crtc[0x36] & 0x10)) {
+ svga->write_bank = ((svga->write_bank & 0x100000) | ((val & 0xf) * 65536)) & svga->vram_display_mask;
+ svga->read_bank = ((svga->read_bank & 0x100000) | (((val >> 4) & 0xf) * 65536)) & svga->vram_display_mask;
+ }
et4000->banking = val;
return;
case 0x3CF:
@@ -229,6 +234,14 @@ void et4000w32p_out(uint16_t addr, uint8_t val, void *p)
val = (svga->crtc[7] & ~0x10) | (val & 0x10);
old = svga->crtc[svga->crtcreg];
svga->crtc[svga->crtcreg] = val;
+ if (svga->crtcreg == 0x36) {
+ svga->vram_display_mask = (val & 0x28) ? et4000->vram_mask : 0x3ffff; /* Both bits 5 and 3 must be off for 256k wraparound. */
+ if (!(val & 0x10)) {
+ svga->write_bank = (((et4000->banking2 & 1) << 20) | ((et4000->banking & 0xf) * 65536)) & svga->vram_display_mask;
+ svga->read_bank = (((et4000->banking2 & 0x10) << 16) | (((et4000->banking >> 4) & 0xf) * 65536)) & svga->vram_display_mask;
+ } else
+ svga->write_bank = svga->read_bank = 0;
+ }
if (old != val)
{
if (svga->crtcreg < 0xe || svga->crtcreg > 0x10)
@@ -1238,6 +1251,7 @@ void *et4000w32p_init(const device_t *info)
et4000w32p_in, et4000w32p_out,
et4000w32p_hwcursor_draw,
NULL);
+ et4000->vram_mask = (vram_size << 20) - 1;
et4000->type = info->local;