Video card can now be changed on Amstrad MegaPC.
This commit is contained in:
parent
78adae497f
commit
d28a908839
6 changed files with 52 additions and 5 deletions
|
|
@ -159,7 +159,7 @@ MODEL models[] =
|
||||||
|
|
||||||
{"[386SX] Acer 386SX25/N", ROM_ACER386, "acer386", { {"Intel", cpus_acer}, {"", NULL}, {"", NULL}}, MODEL_GFX_DISABLE_SW|MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 16, 1, at_acer386sx_init, NULL},
|
{"[386SX] Acer 386SX25/N", ROM_ACER386, "acer386", { {"Intel", cpus_acer}, {"", NULL}, {"", NULL}}, MODEL_GFX_DISABLE_SW|MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 16, 1, at_acer386sx_init, NULL},
|
||||||
{"[386SX] AMI 386SX clone", ROM_AMI386SX, "ami386", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 512,16384, 128, at_headland_init, NULL},
|
{"[386SX] AMI 386SX clone", ROM_AMI386SX, "ami386", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 512,16384, 128, at_headland_init, NULL},
|
||||||
{"[386SX] Amstrad MegaPC", ROM_MEGAPC, "megapc", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_FIXED|MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 16, 1, at_wd76c10_init, NULL},
|
{"[386SX] Amstrad MegaPC", ROM_MEGAPC, "megapc", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_DISABLE_SW|MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 16, 1, at_wd76c10_init, NULL},
|
||||||
{"[386SX] DTK 386SX clone", ROM_DTK386, "dtk386", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 512,16384, 128, at_neat_init, NULL},
|
{"[386SX] DTK 386SX clone", ROM_DTK386, "dtk386", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 512,16384, 128, at_neat_init, NULL},
|
||||||
{"[386SX] Epson PC AX3", ROM_EPSON_PCAX3, "epson_pcax3", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_NONE|MODEL_AT, 256,15872, 128, at_init, NULL},
|
{"[386SX] Epson PC AX3", ROM_EPSON_PCAX3, "epson_pcax3", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_NONE|MODEL_AT, 256,15872, 128, at_init, NULL},
|
||||||
{"[386SX] IBM PS/1 model 2121", ROM_IBMPS1_2121, "ibmps1_2121", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_FIXED|MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 16, 1, ps1_m2121_init, NULL},
|
{"[386SX] IBM PS/1 model 2121", ROM_IBMPS1_2121, "ibmps1_2121", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_FIXED|MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 16, 1, ps1_m2121_init, NULL},
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
#ifndef _ROM_H_
|
||||||
|
#define _ROM_H_
|
||||||
|
|
||||||
FILE *romfopen(char *fn, char *mode);
|
FILE *romfopen(char *fn, char *mode);
|
||||||
int rom_present(char *fn);
|
int rom_present(char *fn);
|
||||||
|
|
||||||
|
|
@ -14,3 +17,5 @@ int rom_init_interleaved(rom_t *rom, char *fn_low, char *fn_high, uint32_t addre
|
||||||
uint8_t rom_read(uint32_t addr, void *p);
|
uint8_t rom_read(uint32_t addr, void *p);
|
||||||
uint16_t rom_readw(uint32_t addr, void *p);
|
uint16_t rom_readw(uint32_t addr, void *p);
|
||||||
uint32_t rom_readl(uint32_t addr, void *p);
|
uint32_t rom_readl(uint32_t addr, void *p);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@
|
||||||
#include "vid_svga.h"
|
#include "vid_svga.h"
|
||||||
#include "vid_svga_render.h"
|
#include "vid_svga_render.h"
|
||||||
#include "vid_unk_ramdac.h"
|
#include "vid_unk_ramdac.h"
|
||||||
|
#include "wd76c10.h"
|
||||||
|
|
||||||
typedef struct paradise_t
|
typedef struct paradise_t
|
||||||
{
|
{
|
||||||
|
|
@ -32,6 +33,9 @@ typedef struct paradise_t
|
||||||
|
|
||||||
void paradise_remap(paradise_t *paradise);
|
void paradise_remap(paradise_t *paradise);
|
||||||
|
|
||||||
|
void paradise_out(uint16_t addr, uint8_t val, void *p);
|
||||||
|
uint8_t paradise_in(uint16_t addr, void *p);
|
||||||
|
|
||||||
void paradise_out(uint16_t addr, uint8_t val, void *p)
|
void paradise_out(uint16_t addr, uint8_t val, void *p)
|
||||||
{
|
{
|
||||||
paradise_t *paradise = (paradise_t *)p;
|
paradise_t *paradise = (paradise_t *)p;
|
||||||
|
|
@ -132,6 +136,16 @@ void paradise_out(uint16_t addr, uint8_t val, void *p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 0x46e8:
|
||||||
|
io_removehandler(0x03c0, 0x0020, paradise_in, NULL, NULL, paradise_out, NULL, NULL, paradise);
|
||||||
|
mem_mapping_disable(¶dise->svga.mapping);
|
||||||
|
if (val & 8)
|
||||||
|
{
|
||||||
|
io_sethandler(0x03c0, 0x0020, paradise_in, NULL, NULL, paradise_out, NULL, NULL, paradise);
|
||||||
|
mem_mapping_enable(¶dise->svga.mapping);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
svga_out(addr, val, svga);
|
svga_out(addr, val, svga);
|
||||||
}
|
}
|
||||||
|
|
@ -356,6 +370,8 @@ static void *paradise_wd90c11_megapc_init()
|
||||||
"megapc/211253-bios hi.u19",
|
"megapc/211253-bios hi.u19",
|
||||||
0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
|
0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
|
||||||
|
|
||||||
|
wd76c10_set_bios_rom(¶dise->bios_rom);
|
||||||
|
|
||||||
return paradise;
|
return paradise;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -368,6 +384,9 @@ static void *paradise_pvga1a_oli_go481_init()
|
||||||
"oli_go481_lo.bin",
|
"oli_go481_lo.bin",
|
||||||
"oli_go481_hi.bin",
|
"oli_go481_hi.bin",
|
||||||
0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
|
0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
|
||||||
|
|
||||||
|
io_sethandler(0x46e8, 0x0001, paradise_in, NULL, NULL, paradise_out, NULL, NULL, paradise);
|
||||||
|
|
||||||
return paradise;
|
return paradise;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -663,12 +663,13 @@ void video_init()
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ROM_MEGAPC:
|
case ROM_MEGAPC:
|
||||||
if (gfxcard == GFX_BUILTIN)
|
device_add(¶dise_wd90c11_megapc_device);
|
||||||
|
if (gfxcard != GFX_BUILTIN)
|
||||||
{
|
{
|
||||||
device_add(¶dise_wd90c11_megapc_device);
|
svga_set_override(svga_get_pri(), 1);
|
||||||
return;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
return;
|
||||||
|
|
||||||
case ROM_ACER386:
|
case ROM_ACER386:
|
||||||
device_add(&oti067_acer386_device);
|
device_add(&oti067_acer386_device);
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
#include "fdc.h"
|
#include "fdc.h"
|
||||||
#include "io.h"
|
#include "io.h"
|
||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
|
#include "rom.h"
|
||||||
#include "serial.h"
|
#include "serial.h"
|
||||||
#include "wd76c10.h"
|
#include "wd76c10.h"
|
||||||
|
|
||||||
|
|
@ -9,6 +10,13 @@ static uint16_t wd76c10_0092;
|
||||||
static uint16_t wd76c10_2072;
|
static uint16_t wd76c10_2072;
|
||||||
static uint16_t wd76c10_2872;
|
static uint16_t wd76c10_2872;
|
||||||
static uint16_t wd76c10_5872;
|
static uint16_t wd76c10_5872;
|
||||||
|
static uint16_t wd76c10_6072;
|
||||||
|
static rom_t *video_bios_rom = NULL;
|
||||||
|
|
||||||
|
void wd76c10_set_bios_rom(rom_t *rom)
|
||||||
|
{
|
||||||
|
video_bios_rom = rom;
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t wd76c10_read(uint16_t port, void *priv)
|
uint16_t wd76c10_read(uint16_t port, void *priv)
|
||||||
{
|
{
|
||||||
|
|
@ -25,6 +33,9 @@ uint16_t wd76c10_read(uint16_t port, void *priv)
|
||||||
|
|
||||||
case 0x5872:
|
case 0x5872:
|
||||||
return wd76c10_5872;
|
return wd76c10_5872;
|
||||||
|
|
||||||
|
case 0x6072:
|
||||||
|
return wd76c10_6072;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -81,6 +92,13 @@ void wd76c10_write(uint16_t port, uint16_t val, void *priv)
|
||||||
case 0x5872:
|
case 0x5872:
|
||||||
wd76c10_5872 = val;
|
wd76c10_5872 = val;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 0x6072:
|
||||||
|
wd76c10_6072 = val;
|
||||||
|
mem_mapping_disable(&video_bios_rom->mapping);
|
||||||
|
if ((val & 0xc) == 8)
|
||||||
|
mem_mapping_enable(&video_bios_rom->mapping);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -106,4 +124,5 @@ void wd76c10_init()
|
||||||
io_sethandler(0x2072, 0x0002, wd76c10_readb, wd76c10_read, NULL, wd76c10_writeb, wd76c10_write, NULL, NULL);
|
io_sethandler(0x2072, 0x0002, wd76c10_readb, wd76c10_read, NULL, wd76c10_writeb, wd76c10_write, NULL, NULL);
|
||||||
io_sethandler(0x2872, 0x0002, wd76c10_readb, wd76c10_read, NULL, wd76c10_writeb, wd76c10_write, NULL, NULL);
|
io_sethandler(0x2872, 0x0002, wd76c10_readb, wd76c10_read, NULL, wd76c10_writeb, wd76c10_write, NULL, NULL);
|
||||||
io_sethandler(0x5872, 0x0002, wd76c10_readb, wd76c10_read, NULL, wd76c10_writeb, wd76c10_write, NULL, NULL);
|
io_sethandler(0x5872, 0x0002, wd76c10_readb, wd76c10_read, NULL, wd76c10_writeb, wd76c10_write, NULL, NULL);
|
||||||
|
io_sethandler(0x6072, 0x0002, wd76c10_readb, wd76c10_read, NULL, wd76c10_writeb, wd76c10_write, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1 +1,4 @@
|
||||||
|
#include "rom.h"
|
||||||
|
|
||||||
void wd76c10_init();
|
void wd76c10_init();
|
||||||
|
void wd76c10_set_bios_rom(rom_t *rom);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue