Additional fixes to ET4000AX and ET4000/W32p - fixes segment bank messup when exiting from Windows;

The internal video cards of the Trigem 286M and the Packard Bell PB640 now have the correct timings.
This commit is contained in:
OBattler
2018-08-26 08:16:22 +02:00
parent 8453a88223
commit 66225bced8
4 changed files with 39 additions and 6 deletions

View File

@@ -10,7 +10,7 @@
# settings, so we can avoid changing the main one for all of
# our local setups.
#
# Version: @(#)Makefile.local 1.0.15 2018/07/19
# Version: @(#)Makefile.local 1.0.16 2018/08/01
#
# Author: Fred N. van Kempen, <decwiz@yahoo.com>
#
@@ -62,6 +62,7 @@ STUFF :=
# -DENABLE_386_LOG=N sets logging level at N.
# -DENABLE_386_DYNAREC_LOG=N sets logging level at N.
# -DENABLE_808X_LOG=N sets logging level at N.
# -DENABLE_FPU_LOG=N sets logging level at N.
# -DENABLE_X86SEG_LOG=N sets logging level at N.
# disk/ logging:
# -DENABLE_ESDI_AT_LOG=N sets logging level at N.

View File

@@ -8,7 +8,7 @@
*
* Emulation of the Tseng Labs ET4000.
*
* Version: @(#)vid_et4000.c 1.0.14 2018/08/25
* Version: @(#)vid_et4000.c 1.0.15 2018/08/26
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -98,6 +98,15 @@ void et4000_out(uint16_t addr, uint8_t val, void *p)
}
et4000->banking = val;
return;
case 0x3cf:
if ((svga->gdcaddr & 15) == 6) {
if (!(svga->crtc[0x36] & 0x10) && !(val & 0x08)) {
svga->write_bank = (et4000->banking & 0xf) * 0x10000;
svga->read_bank = ((et4000->banking >> 4) & 0xf) * 0x10000;
} else
svga->write_bank = svga->read_bank = 0;
}
break;
case 0x3D4:
svga->crtcreg = val & 0x3f;
return;
@@ -112,6 +121,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 (!(val & 0x10) && !(svga->gdcreg[6] & 0x08)) {
svga->write_bank = (et4000->banking & 0xf) * 0x10000;
svga->read_bank = ((et4000->banking >> 4) & 0xf) * 0x10000;
} else
svga->write_bank = svga->read_bank = 0;
}
if (old != val)
{
if (svga->crtcreg < 0xE || svga->crtcreg > 0x10)

View File

@@ -10,7 +10,7 @@
*
* Known bugs: Accelerator doesn't work in planar modes
*
* Version: @(#)vid_et4000w32.c 1.0.15 2018/08/25
* Version: @(#)vid_et4000w32.c 1.0.16 2018/08/26
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -223,6 +223,12 @@ void et4000w32p_out(uint16_t addr, uint8_t val, void *p)
switch (svga->gdcaddr & 15)
{
case 6:
if (!(svga->crtc[0x36] & 0x10) && !(val & 0x08)) {
svga->write_bank = ((et4000->banking2 & 1) << 20) | ((et4000->banking & 0xf) * 65536);
svga->read_bank = ((et4000->banking2 & 0x10) << 16) | (((et4000->banking >> 4) & 0xf) * 65536);
} else
svga->write_bank = svga->read_bank = 0;
svga->gdcreg[svga->gdcaddr & 15] = val;
et4000w32p_recalcmapping(et4000);
return;
@@ -241,10 +247,11 @@ void et4000w32p_out(uint16_t addr, uint8_t val, void *p)
old = svga->crtc[svga->crtcreg];
svga->crtc[svga->crtcreg] = val;
if (svga->crtcreg == 0x36) {
if (!(val & 0x10)) {
if (!(val & 0x10) && !(svga->gdcreg[6] & 0x08)) {
svga->write_bank = ((et4000->banking2 & 1) << 20) | ((et4000->banking & 0xf) * 65536);
svga->read_bank = ((et4000->banking2 & 0x10) << 16) | (((et4000->banking >> 4) & 0xf) * 65536);
}
} else
svga->write_bank = svga->read_bank = 0;
}
if (old != val)
{

View File

@@ -40,7 +40,7 @@
* W = 3 bus clocks
* L = 4 bus clocks
*
* Version: @(#)video.c 1.0.24 2018/08/16
* Version: @(#)video.c 1.0.25 2018/08/26
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -411,8 +411,10 @@ 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_tg286m = {VIDEO_ISA, 3, 3, 6, 5, 5,10};
static video_timings_t timing_t3100e = {VIDEO_ISA, 8,16,32, 8,16,32};
static video_timings_t timing_endeavor = {VIDEO_BUS, 3, 2, 4,25,25,40};
static video_timings_t timing_pb640 = {VIDEO_BUS, 4, 4, 8,10,10,20};
void
video_update_timing(void)
@@ -467,12 +469,18 @@ video_update_timing(void)
case ROM_IBMPS1_2133:
timing = &timing_ps1_svga;
break;
case ROM_TG286M:
timing = &timing_tg286m;
break;
case ROM_T3100E:
timing = &timing_t3100e;
break;
case ROM_ENDEAVOR:
timing = &timing_endeavor;
break;
case ROM_PB640:
timing = &timing_pb640;
break;
default:
new_gfxcard = video_old_to_new(gfxcard);
timing = video_card_gettiming(new_gfxcard);