Re-integrated the Amstrad machines.

This commit is contained in:
waltje
2017-11-08 16:29:54 -05:00
parent b8d75f4f5a
commit 354b49d354
12 changed files with 1003 additions and 155 deletions

View File

@@ -11,7 +11,7 @@
* This is intended to be used by another SVGA driver,
* and not as a card in it's own right.
*
* Version: @(#)vid_svga.c 1.0.10 2017/11/04
* Version: @(#)vid_svga.c 1.0.11 2017/11/05
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -186,6 +186,9 @@ void svga_out(uint16_t addr, uint8_t val, void *p)
}
svga_recalctimings(svga);
break;
case 0x3C3:
svga->enabled = (val & 0x01);
break;
case 0x3C4:
svga->seqaddr = val;
break;
@@ -264,7 +267,8 @@ void svga_out(uint16_t addr, uint8_t val, void *p)
svga->vgapal[svga->dac_write].g &= 0x3f;
svga->vgapal[svga->dac_write].b &= 0x3f;
if ((romset == ROM_IBMPS1_2011) || (romset == ROM_IBMPS1_2121) || (romset == ROM_IBMPS2_M30_286))
// if ((romset == ROM_IBMPS1_2011) || (romset == ROM_IBMPS1_2121) || (romset == ROM_IBMPS2_M30_286))
if (romset == ROM_IBMPS1_2011)
{
svga->pallook[svga->dac_write] = makecol32((svga->vgapal[svga->dac_write].r & 0x3f) * 4, (svga->vgapal[svga->dac_write].g & 0x3f) * 4, (svga->vgapal[svga->dac_write].b & 0x3f) * 4);
}
@@ -273,6 +277,10 @@ void svga_out(uint16_t addr, uint8_t val, void *p)
svga->pallook[svga->dac_write] = makecol32(video_6to8[svga->vgapal[svga->dac_write].r], video_6to8[svga->vgapal[svga->dac_write].g], video_6to8[svga->vgapal[svga->dac_write].b]);
}
}
#if 1
// FIXME: temp to see if this fixes 2401 on PS/1.
svga->sense = (svga->vgapal[svga->dac_write].r & svga->vgapal[svga->dac_write].g & svga->vgapal[svga->dac_write].b) & 0x10;
#endif
svga->dac_pos = 0;
svga->dac_write = (svga->dac_write + 1) & 255;
break;
@@ -414,7 +422,8 @@ uint8_t svga_in(uint16_t addr, void *p)
case 0x3C1:
return svga->attrregs[svga->attraddr];
case 0x3c2:
if ((romset == ROM_IBMPS1_2011) || (romset == ROM_IBMPS1_2121) || (romset == ROM_IBMPS1_2121_ISA) || (romset == ROM_IBMPS1_2133) || (romset == ROM_IBMPS2_M30_286) || (romset == ROM_IBMPS2_M50) || (romset == ROM_IBMPS2_M55SX) || (romset == ROM_IBMPS2_M80))
// if ((romset == ROM_IBMPS1_2011) || (romset == ROM_IBMPS1_2121) || (romset == ROM_IBMPS1_2121_ISA) || (romset == ROM_IBMPS1_2133) || (romset == ROM_IBMPS2_M30_286) || (romset == ROM_IBMPS2_M50) || (romset == ROM_IBMPS2_M55SX) || (romset == ROM_IBMPS2_M80))
if (romset == ROM_IBMPS1_2011)
{
if ((svga->vgapal[0].r + svga->vgapal[0].g + svga->vgapal[0].b) >= 0x50)
{
@@ -450,7 +459,11 @@ uint8_t svga_in(uint16_t addr, void *p)
}
}
}
temp = svga->sense;
pclog("SVGAread = %02x\n", temp);
return temp;
case 0x3C3:
return svga->enabled & 0x01;
case 0x3C4:
return svga->seqaddr;
case 0x3C5:

View File

@@ -8,7 +8,7 @@
*
* Generic SVGA handling.
*
* Version: @(#)vid_svga.h 1.0.1 2017/11/04
* Version: @(#)vid_svga.h 1.0.2 2017/11/05
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -20,6 +20,9 @@
typedef struct svga_t
{
mem_mapping_t mapping;
int enabled;
uint8_t crtcreg;
uint8_t crtc[128];
@@ -81,6 +84,7 @@ typedef struct svga_t
double clock;
uint32_t ma_latch;
int bpp;
int sense;
int64_t dispontime, dispofftime;
int64_t vidtime;

View File

@@ -60,9 +60,10 @@
#include "vid_s3.h"
#include "vid_s3_virge.h"
#include "vid_tgui9440.h"
#include "vid_ti_cf62011.h"
#include "vid_tvga.h"
#include "vid_vga.h"
#include "vid_ti_cf62011.h"
#include "vid_voodoo.h"
#include "vid_wy700.h"
@@ -161,36 +162,25 @@ video_cards[] = {
void
video_reset_card(int card)
video_reset(int card)
{
/* Nothing to do if this is their internal video card. */
if (card == GFX_NONE) return;
if ((machines[machine].flags & MACHINE_VIDEO) &&
(card == GFX_INTERNAL)) return;
pclog("VIDEO: reset (romset=%d, gfxcard=%d, internal=%d)\n",
romset, card, (machines[machine].flags & MACHINE_VIDEO)?1:0);
pclog("Video_reset_card(gfx=%i)\n", card);
/* Reset the CGA palette. */
cga_palette = 0;
cgapal_rebuild();
/* Do not initialize internal cards here. */
if ((card == GFX_NONE) || \
(card == GFX_INTERNAL) || machines[machine].fixed_gfxcard) return;
/* Initialize the video card. */
device_add(video_cards[video_old_to_new(card)].device);
#if 0
case ROM_PC1512:
device_add(&pc1512_device);
case ROM_PC1640:
device_add(&pc1640_device);
case ROM_PC200:
device_add(&pc200_device);
case ROM_PC2086:
device_add(&paradise_pvga1a_pc2086_device);
case ROM_PC3086:
device_add(&paradise_pvga1a_pc3086_device);
case ROM_MEGAPC:
device_add(&paradise_wd90c11_megapc_device);
case ROM_TANDY:
case ROM_TANDY1000HX:
device_add(&tandy_device);
case ROM_TANDY1000SL2:
device_add(&tandysl_device);
#endif
/* Enable the Voodoo if configured. */
if (voodoo_enabled)
device_add(&voodoo_device);
}

View File

@@ -74,6 +74,8 @@ typedef struct {
rom_t bios_rom;
int enabled;
uint32_t vram_size;
uint8_t banking;
@@ -89,15 +91,22 @@ vid_out(uint16_t addr, uint8_t val, void *priv)
svga_t *svga = &ti->svga;
uint8_t old;
if (((addr & 0xfff0) == 0x3d0 ||
(addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1)) addr ^= 0x60;
#if 0
if (((addr & 0xfff0) == 0x03d0 || (addr & 0xfff0) == 0x03b0) &&
!(svga->miscout & 1)) addr ^= 0x60;
#endif
pclog("TISVGA_out(%04x, %02x)\n", addr, val);
switch (addr) {
case 0x3D4:
case 0x0102:
ti->enabled = (val & 0x01);
return;
case 0x03d4:
svga->crtcreg = val & 0x1f;
return;
case 0x3D5:
case 0x03d5:
if ((svga->crtcreg < 7) && (svga->crtc[0x11] & 0x80))
return;
if ((svga->crtcreg == 7) && (svga->crtc[0x11] & 0x80))
@@ -115,16 +124,14 @@ vid_out(uint16_t addr, uint8_t val, void *priv)
case 0x2100:
ti->reg_2100 = val;
if ((val & 7) < 4)
svga->write_bank = 0;
svga->read_bank = svga->write_bank = 0;
else
svga->write_bank = (ti->banking & 0x7) * 0x10000;
svga->read_bank = svga->write_bank;
svga->read_bank = svga->write_bank = (ti->banking & 0x7) * 0x10000;
break;
case 0x2108:
if ((ti->reg_2100 & 7) >= 4)
svga->write_bank = (val & 0x7) * 0x10000;
svga->read_bank = svga->write_bank;
svga->read_bank = svga->write_bank = (val & 0x7) * 0x10000;
ti->banking = val;
break;
@@ -144,26 +151,36 @@ vid_in(uint16_t addr, void *priv)
svga_t *svga = &ti->svga;
uint8_t ret;
if (((addr & 0xfff0) == 0x3d0 ||
(addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1)) addr ^= 0x60;
#if 0
if (((addr & 0xfff0) == 0x03d0 || (addr & 0xfff0) == 0x03b0) &&
!(svga->miscout & 1)) addr ^= 0x60;
#endif
switch (addr) {
case 0x100:
case 0x0100:
ret = 0xfe;
break;
case 0x101:
case 0x0101:
ret = 0xe8;
break;
case 0x3D4:
case 0x0102:
ret = ti->enabled;
break;
case 0x03d4:
ret = svga->crtcreg;
break;
case 0x3D5:
case 0x03d5:
ret = svga->crtc[svga->crtcreg];
break;
case 0x2100:
ret = ti->reg_2100;
break;
case 0x2108:
ret = ti->banking;
break;
@@ -177,6 +194,8 @@ vid_in(uint16_t addr, void *priv)
break;
}
pclog("TISVGA_in(%04x) = %02x\n", addr, ret);
return(ret);
}
@@ -236,9 +255,11 @@ vid_init(device_t *info)
pclog("VIDEO: initializing %s, %dK VRAM\n", info->name, ti->vram_size);
svga_init(&ti->svga, ti, ti->vram_size<<10, NULL, vid_in, vid_out, NULL, NULL);
svga_init(&ti->svga, ti,
ti->vram_size<<10,
NULL, vid_in, vid_out, NULL, NULL);
io_sethandler(0x0100, 2, vid_in, NULL, NULL, vid_out, NULL, NULL, ti);
io_sethandler(0x0100, 2, vid_in, NULL, NULL, NULL, NULL, NULL, ti);
io_sethandler(0x03c0, 32, vid_in, NULL, NULL, vid_out, NULL, NULL, ti);
io_sethandler(0x2100, 16, vid_in, NULL, NULL, vid_out, NULL, NULL, ti);
@@ -290,7 +311,7 @@ device_t ti_cf62011_device = {
device_t ibm_ps1_2121_device = {
"IBM PS/1 Model 2121 SVGA",
0,
256,
512,
vid_init, vid_close, NULL,
NULL,
vid_speed_changed,

View File

@@ -554,17 +554,6 @@ video_close(void)
}
void
video_reset(void)
{
pclog("VIDEO: reset(rom=%d, gfx=%d, internal=%d)\n",
romset, gfxcard, (machines[machine].flags & MACHINE_VIDEO)?1:0);
cga_palette = 0;
cgapal_rebuild();
}
uint8_t
video_force_resize_get(void)
{

View File

@@ -32,79 +32,81 @@ enum {
GFX_CGA,
GFX_MDA,
GFX_HERCULES,
GFX_EGA, /* Using IBM EGA BIOS */
GFX_TVGA, /* Using Trident TVGA8900D BIOS */
GFX_ET4000, /* Tseng ET4000 */
GFX_ET4000W32_VLB, /* Tseng ET4000/W32p (Diamond Stealth 32) VLB */
GFX_ET4000W32_PCI, /* Tseng ET4000/W32p (Diamond Stealth 32) PCI */
GFX_BAHAMAS64_VLB, /* S3 Vision864 (Paradise Bahamas 64) VLB */
GFX_BAHAMAS64_PCI, /* S3 Vision864 (Paradise Bahamas 64) PCI */
GFX_N9_9FX_VLB, /* S3 764/Trio64 (Number Nine 9FX) VLB */
GFX_N9_9FX_PCI, /* S3 764/Trio64 (Number Nine 9FX) PCI */
GFX_VIRGE_VLB, /* S3 Virge VLB */
GFX_VIRGE_PCI, /* S3 Virge PCI */
GFX_TGUI9440_VLB, /* Trident TGUI9440 VLB */
GFX_TGUI9440_PCI, /* Trident TGUI9440 PCI */
GFX_VGA, /* IBM VGA */
GFX_VGAEDGE16, /* ATI VGA Edge-16 (18800-1) */
GFX_VGACHARGER, /* ATI VGA Charger (28800-5) */
GFX_OTI067, /* Oak OTI-067 */
GFX_MACH64GX_VLB, /* ATI Graphics Pro Turbo (Mach64) VLB */
GFX_MACH64GX_PCI, /* ATI Graphics Pro Turbo (Mach64) PCI */
GFX_CL_GD5429, /* Cirrus Logic CL-GD5429 */
GFX_VIRGEDX_VLB, /* S3 Virge/DX VLB */
GFX_VIRGEDX_PCI, /* S3 Virge/DX PCI */
GFX_PHOENIX_TRIO32_VLB, /* S3 732/Trio32 (Phoenix) VLB */
GFX_PHOENIX_TRIO32_PCI, /* S3 732/Trio32 (Phoenix) PCI */
GFX_PHOENIX_TRIO64_VLB, /* S3 764/Trio64 (Phoenix) VLB */
GFX_PHOENIX_TRIO64_PCI, /* S3 764/Trio64 (Phoenix) PCI */
GFX_INCOLOR, /* Hercules InColor */
GFX_COLORPLUS, /* Plantronics ColorPlus */
GFX_WY700, /* Wyse 700 */
GFX_GENIUS, /* MDSI Genius */
GFX_MACH64VT2, /* ATI Mach64 VT2 */
GFX_COMPAQ_EGA, /* Compaq EGA */
GFX_SUPER_EGA, /* Using Chips & Technologies SuperEGA BIOS */
GFX_COMPAQ_VGA, /* Compaq/Paradise VGA */
GFX_CL_GD5446, /* Cirrus Logic CL-GD5446 */
GFX_VGAWONDERXL, /* Compaq ATI VGA Wonder XL (28800-5) */
GFX_WD90C11, /* Paradise WD90C11 Standalone */
GFX_OTI077, /* Oak OTI-077 */
GFX_VGAWONDERXL24, /* Compaq ATI VGA Wonder XL24 (28800-6) */
GFX_STEALTH64_VLB, /* S3 Vision864 (Diamond Stealth 64) VLB */
GFX_STEALTH64_PCI, /* S3 Vision864 (Diamond Stealth 64) PCI */
GFX_PHOENIX_VISION864_VLB, /* S3 Vision864 (Phoenix) VLB */
GFX_PHOENIX_VISION864_PCI, /* S3 Vision864 (Phoenix) PCI */
GFX_RIVATNT, /* nVidia Riva TNT */
GFX_RIVATNT2, /* nVidia Riva TNT2 */
GFX_RIVA128, /* nVidia Riva 128 */
GFX_EGA, /* Using IBM EGA BIOS */
GFX_TVGA, /* Using Trident TVGA8900D BIOS */
GFX_ET4000, /* Tseng ET4000 */
GFX_ET4000W32_VLB, /* Tseng ET4000/W32p (Diamond Stealth 32) VLB */
GFX_ET4000W32_PCI, /* Tseng ET4000/W32p (Diamond Stealth 32) PCI */
GFX_BAHAMAS64_VLB, /* S3 Vision864 (Paradise Bahamas 64) VLB */
GFX_BAHAMAS64_PCI, /* S3 Vision864 (Paradise Bahamas 64) PCI */
GFX_N9_9FX_VLB, /* S3 764/Trio64 (Number Nine 9FX) VLB */
GFX_N9_9FX_PCI, /* S3 764/Trio64 (Number Nine 9FX) PCI */
GFX_VIRGE_VLB, /* S3 Virge VLB */
GFX_VIRGE_PCI, /* S3 Virge PCI */
GFX_TGUI9440_VLB, /* Trident TGUI9440 VLB */
GFX_TGUI9440_PCI, /* Trident TGUI9440 PCI */
GFX_VGA, /* IBM VGA */
GFX_VGAEDGE16, /* ATI VGA Edge-16 (18800-1) */
GFX_VGACHARGER, /* ATI VGA Charger (28800-5) */
GFX_OTI067, /* Oak OTI-067 */
GFX_MACH64GX_VLB, /* ATI Graphics Pro Turbo (Mach64) VLB */
GFX_MACH64GX_PCI, /* ATI Graphics Pro Turbo (Mach64) PCI */
GFX_CL_GD5429, /* Cirrus Logic CL-GD5429 */
GFX_VIRGEDX_VLB, /* S3 Virge/DX VLB */
GFX_VIRGEDX_PCI, /* S3 Virge/DX PCI */
GFX_PHOENIX_TRIO32_VLB, /* S3 732/Trio32 (Phoenix) VLB */
GFX_PHOENIX_TRIO32_PCI, /* S3 732/Trio32 (Phoenix) PCI */
GFX_PHOENIX_TRIO64_VLB, /* S3 764/Trio64 (Phoenix) VLB */
GFX_PHOENIX_TRIO64_PCI, /* S3 764/Trio64 (Phoenix) PCI */
GFX_INCOLOR, /* Hercules InColor */
GFX_COLORPLUS, /* Plantronics ColorPlus */
GFX_WY700, /* Wyse 700 */
GFX_GENIUS, /* MDSI Genius */
GFX_MACH64VT2, /* ATI Mach64 VT2 */
GFX_COMPAQ_EGA, /* Compaq EGA */
GFX_SUPER_EGA, /* Using Chips & Technologies SuperEGA BIOS */
GFX_COMPAQ_VGA, /* Compaq/Paradise VGA */
GFX_CL_GD5446, /* Cirrus Logic CL-GD5446 */
GFX_VGAWONDERXL, /* Compaq ATI VGA Wonder XL (28800-5) */
GFX_WD90C11, /* Paradise WD90C11 Standalone */
GFX_OTI077, /* Oak OTI-077 */
GFX_VGAWONDERXL24, /* Compaq ATI VGA Wonder XL24 (28800-6) */
GFX_STEALTH64_VLB, /* S3 Vision864 (Diamond Stealth 64) VLB */
GFX_STEALTH64_PCI, /* S3 Vision864 (Diamond Stealth 64) PCI */
GFX_PHOENIX_VISION864_VLB, /* S3 Vision864 (Phoenix) VLB */
GFX_PHOENIX_VISION864_PCI, /* S3 Vision864 (Phoenix) PCI */
GFX_RIVATNT, /* nVidia Riva TNT */
GFX_RIVATNT2, /* nVidia Riva TNT2 */
GFX_RIVA128, /* nVidia Riva 128 */
GFX_HERCULESPLUS,
GFX_VIRGEVX_VLB, /* S3 Virge/VX VLB */
GFX_VIRGEVX_PCI, /* S3 Virge/VX PCI */
GFX_VIRGEDX4_VLB, /* S3 Virge/DX (VBE 2.0) VLB */
GFX_VIRGEDX4_PCI, /* S3 Virge/DX (VBE 2.0) PCI */
GFX_OTI037, /* Oak OTI-037 */
GFX_TRIGEM_UNK, /* Unknown TriGem graphics card w/Hangeul ROM */
GFX_MIRO_VISION964, /* S3 Vision964 (Miro Crystal) */
GFX_CL_GD5422, /* Cirrus Logic CL-GD5422 */
GFX_CL_GD5430, /* Cirrus Logic CL-GD5430 */
GFX_CL_GD5434, /* Cirrus Logic CL-GD5434 */
GFX_CL_GD5436, /* Cirrus Logic CL-GD5436 */
GFX_CL_GD5440, /* Cirrus Logic CL-GD5440 */
GFX_TICF62011, /* TI CF62011 */
GFX_VIRGEVX_VLB, /* S3 Virge/VX VLB */
GFX_VIRGEVX_PCI, /* S3 Virge/VX PCI */
GFX_VIRGEDX4_VLB, /* S3 Virge/DX (VBE 2.0) VLB */
GFX_VIRGEDX4_PCI, /* S3 Virge/DX (VBE 2.0) PCI */
GFX_OTI037, /* Oak OTI-037 */
GFX_TRIGEM_UNK, /* Unknown TriGem graphics card w/Hangeul ROM */
GFX_MIRO_VISION964, /* S3 Vision964 (Miro Crystal) */
GFX_CL_GD5422, /* Cirrus Logic CL-GD5422 */
GFX_CL_GD5430, /* Cirrus Logic CL-GD5430 */
GFX_CL_GD5434, /* Cirrus Logic CL-GD5434 */
GFX_CL_GD5436, /* Cirrus Logic CL-GD5436 */
GFX_CL_GD5440, /* Cirrus Logic CL-GD5440 */
GFX_TICF62011, /* TI CF62011 */
GFX_MAX
};
#define MDA ((gfxcard==GFX_MDA || gfxcard==GFX_HERCULES || \
gfxcard==GFX_HERCULESPLUS || gfxcard==GFX_INCOLOR || \
gfxcard==GFX_GENIUS) && (romset<ROM_TANDY || romset>=ROM_IBMAT))
gfxcard==GFX_GENIUS) && \
(romset<ROM_TANDY || romset>=ROM_IBMAT))
#define VGA ((gfxcard>=GFX_TVGA) && gfxcard!=GFX_COLORPLUS && \
gfxcard!=GFX_INCOLOR && gfxcard!=GFX_WY700 && gfxcard!=GFX_GENIUS && \
gfxcard!=GFX_COMPAQ_EGA && gfxcard!=GFX_SUPER_EGA && \
gfxcard!=GFX_HERCULESPLUS && romset!=ROM_PC1640 && \
romset!=ROM_PC1512 && romset!=ROM_TANDY && romset!=ROM_PC200)
#define VGA (((gfxcard>=GFX_TVGA) && gfxcard!=GFX_COLORPLUS && \
gfxcard!=GFX_INCOLOR && gfxcard!=GFX_WY700 && \
gfxcard!=GFX_GENIUS && gfxcard!=GFX_COMPAQ_EGA && \
gfxcard!=GFX_SUPER_EGA && gfxcard!=GFX_HERCULESPLUS) && \
(romset!=ROM_PC1640 && romset!=ROM_PC1512 && \
romset!=ROM_TANDY && romset!=ROM_PC200))
enum {
FULLSCR_SCALE_FULL = 0,
@@ -209,8 +211,7 @@ extern void updatewindowsize(int x, int y);
extern void video_init(void);
extern void video_close(void);
extern void video_reset(void);
extern void video_reset_card(int);
extern void video_reset(int card);
extern uint8_t video_force_resize_get(void);
extern void video_force_resize_set(uint8_t res);
extern void video_update_timing(void);