Re-organisation of video emulation.
This commit is contained in:
parent
b9062a1d0c
commit
58085bcc87
86 changed files with 8087 additions and 7229 deletions
145
src/vid_pc200.c
145
src/vid_pc200.c
|
|
@ -1,104 +1,139 @@
|
|||
/*PC200 video emulation.
|
||||
CGA with some NMI stuff. But we don't need that as it's only used for TV and
|
||||
LCD displays, and we're emulating a CRT*/
|
||||
#include <stdlib.h>
|
||||
#include "ibm.h"
|
||||
#include "device.h"
|
||||
#include "io.h"
|
||||
#include "mem.h"
|
||||
#include "timer.h"
|
||||
#include "video.h"
|
||||
#include "vid_cga.h"
|
||||
#include "vid_pc200.h"
|
||||
|
||||
uint8_t pc200_3dd, pc200_3de, pc200_3df;
|
||||
|
||||
void pc200_out(uint16_t addr, uint8_t val, void *priv)
|
||||
typedef struct pc200_t
|
||||
{
|
||||
cga_t cga;
|
||||
|
||||
uint8_t reg_3dd, reg_3de, reg_3df;
|
||||
} pc200_t;
|
||||
|
||||
static uint8_t crtcmask[32] =
|
||||
{
|
||||
0xff, 0xff, 0xff, 0xff, 0x7f, 0x1f, 0x7f, 0x7f, 0xf3, 0x1f, 0x7f, 0x1f, 0x3f, 0xff, 0x3f, 0xff,
|
||||
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
void pc200_out(uint16_t addr, uint8_t val, void *p)
|
||||
{
|
||||
pc200_t *pc200 = (pc200_t *)p;
|
||||
cga_t *cga = &pc200->cga;
|
||||
uint8_t old;
|
||||
|
||||
switch (addr)
|
||||
{
|
||||
case 0x3D5:
|
||||
if (!(pc200_3de&0x40) && crtcreg<=11)
|
||||
case 0x3d5:
|
||||
if (!(pc200->reg_3de & 0x40) && cga->crtcreg <= 11)
|
||||
{
|
||||
if (pc200_3de&0x80) nmi=1;
|
||||
pc200_3dd=0x20|(crtcreg&0x1F);
|
||||
pc200_3df=val;
|
||||
if (pc200->reg_3de & 0x80)
|
||||
nmi = 1;
|
||||
|
||||
pc200->reg_3dd = 0x20 | (cga->crtcreg & 0x1f);
|
||||
pc200->reg_3df = val;
|
||||
return;
|
||||
}
|
||||
old=crtc[crtcreg];
|
||||
crtc[crtcreg]=val&crtcmask[crtcreg];
|
||||
if (old!=val)
|
||||
old = cga->crtc[cga->crtcreg];
|
||||
cga->crtc[cga->crtcreg] = val & crtcmask[cga->crtcreg];
|
||||
if (old != val)
|
||||
{
|
||||
if (crtcreg<0xE || crtcreg>0x10)
|
||||
if (cga->crtcreg < 0xe || cga->crtcreg > 0x10)
|
||||
{
|
||||
fullchange=changeframecount;
|
||||
cga_recalctimings();
|
||||
fullchange = changeframecount;
|
||||
cga_recalctimings(cga);
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
||||
case 0x3D8:
|
||||
old = cgamode;
|
||||
cgamode=val;
|
||||
if ((cgamode ^ old) & 3)
|
||||
cga_recalctimings();
|
||||
pc200_3dd|=0x80;
|
||||
if (pc200_3de&0x80)
|
||||
nmi=1;
|
||||
case 0x3d8:
|
||||
old = cga->cgamode;
|
||||
cga->cgamode = val;
|
||||
if ((cga->cgamode ^ old) & 3)
|
||||
cga_recalctimings(cga);
|
||||
pc200->reg_3dd |= 0x80;
|
||||
if (pc200->reg_3de & 0x80)
|
||||
nmi = 1;
|
||||
return;
|
||||
|
||||
case 0x3DE:
|
||||
pc200_3de=val;
|
||||
pc200_3dd=0x1F;
|
||||
if (val&0x80) pc200_3dd|=0x40;
|
||||
case 0x3de:
|
||||
pc200->reg_3de = val;
|
||||
pc200->reg_3dd = 0x1f;
|
||||
if (val & 0x80)
|
||||
pc200->reg_3dd |= 0x40;
|
||||
return;
|
||||
}
|
||||
cga_out(addr, val, NULL);
|
||||
cga_out(addr, val, cga);
|
||||
}
|
||||
|
||||
uint8_t pc200_in(uint16_t addr, void *priv)
|
||||
uint8_t pc200_in(uint16_t addr, void *p)
|
||||
{
|
||||
pc200_t *pc200 = (pc200_t *)p;
|
||||
cga_t *cga = &pc200->cga;
|
||||
uint8_t temp;
|
||||
|
||||
switch (addr)
|
||||
{
|
||||
case 0x3D8:
|
||||
return cgamode;
|
||||
return cga->cgamode;
|
||||
|
||||
case 0x3DD:
|
||||
temp = pc200_3dd;
|
||||
pc200_3dd &= 0x1F;
|
||||
temp = pc200->reg_3dd;
|
||||
pc200->reg_3dd &= 0x1f;
|
||||
return temp;
|
||||
|
||||
case 0x3DE:
|
||||
return (pc200_3de&0xC7)| 0x18; /*External CGA*/
|
||||
return (pc200->reg_3de & 0xc7) | 0x18; /*External CGA*/
|
||||
|
||||
case 0x3DF:
|
||||
return pc200_3df;
|
||||
return pc200->reg_3df;
|
||||
}
|
||||
return cga_in(addr, NULL);
|
||||
return cga_in(addr, cga);
|
||||
}
|
||||
|
||||
int pc200_init()
|
||||
void *pc200_init()
|
||||
{
|
||||
mem_sethandler(0xb8000, 0x08000, cga_read, NULL, NULL, cga_write, NULL, NULL, NULL);
|
||||
return cga_init();
|
||||
pc200_t *pc200 = malloc(sizeof(pc200_t));
|
||||
cga_t *cga = &pc200->cga;
|
||||
memset(pc200, 0, sizeof(pc200_t));
|
||||
|
||||
pc200->cga.vram = malloc(0x4000);
|
||||
cga_init(&pc200->cga);
|
||||
|
||||
timer_add(cga_poll, &cga->vidtime, TIMER_ALWAYS_ENABLED, cga);
|
||||
mem_sethandler(0xb8000, 0x08000, cga_read, NULL, NULL, cga_write, NULL, NULL, cga);
|
||||
io_sethandler(0x03d0, 0x0010, pc200_in, NULL, NULL, pc200_out, NULL, NULL, pc200);
|
||||
return cga;
|
||||
}
|
||||
|
||||
GFXCARD vid_pc200 =
|
||||
void pc200_close(void *p)
|
||||
{
|
||||
pc200_t *pc200 = (pc200_t *)p;
|
||||
|
||||
free(pc200->cga.vram);
|
||||
free(pc200);
|
||||
}
|
||||
|
||||
void pc200_speed_changed(void *p)
|
||||
{
|
||||
pc200_t *pc200 = (pc200_t *)p;
|
||||
|
||||
cga_recalctimings(&pc200->cga);
|
||||
}
|
||||
|
||||
device_t pc200_device =
|
||||
{
|
||||
"Amstrad PC200 (video)",
|
||||
pc200_init,
|
||||
/*IO at 3Cx/3Dx*/
|
||||
pc200_out,
|
||||
pc200_in,
|
||||
/*IO at 3Ax/3Bx*/
|
||||
video_out_null,
|
||||
video_in_null,
|
||||
|
||||
cga_poll,
|
||||
cga_recalctimings,
|
||||
|
||||
video_write_null,
|
||||
video_write_null,
|
||||
cga_write,
|
||||
|
||||
video_read_null,
|
||||
video_read_null,
|
||||
cga_read
|
||||
pc200_close,
|
||||
pc200_speed_changed,
|
||||
NULL
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue