Small fixes here and there.

Updated 808x.c to properly handle MUL/IMUL (false detection of V20
More changes in video block.
Partly applied upstream patches for Amstrad machines.
This commit is contained in:
waltje
2019-03-07 16:02:28 -05:00
parent 60b5979e41
commit 145fbaf0f3
13 changed files with 291 additions and 231 deletions

View File

@@ -8,7 +8,7 @@
* *
* 808x CPU emulation. * 808x CPU emulation.
* *
* Version: @(#)808x.c 1.0.14 2019/02/28 * Version: @(#)808x.c 1.0.15 2019/03/05
* *
* Authors: Miran Grca, <mgrca8@gmail.com> * Authors: Miran Grca, <mgrca8@gmail.com>
* Andrew Jenner (reenigne), <andrew@reenigne.org> * Andrew Jenner (reenigne), <andrew@reenigne.org>
@@ -2657,6 +2657,8 @@ opcodestart:
do_mul(AL, cpu_data); do_mul(AL, cpu_data);
AL = (uint8_t)cpu_data; AL = (uint8_t)cpu_data;
AH = (uint8_t)cpu_dest; AH = (uint8_t)cpu_dest;
if (! is_nec)
cpu_data |= AH;
set_co_do_mul(AH != (((AL & 0x80) == 0) || ((rmdat & 0x38) == 0x20) ? 0 : 0xff)); set_co_do_mul(AH != (((AL & 0x80) == 0) || ((rmdat & 0x38) == 0x20) ? 0 : 0xff));
} }
set_zf(bits); set_zf(bits);

View File

@@ -9,13 +9,13 @@
* Implementation of the generic device interface to handle * Implementation of the generic device interface to handle
* all devices attached to the emulator. * all devices attached to the emulator.
* *
* Version: @(#)device.c 1.0.18 2018/11/13 * Version: @(#)device.c 1.0.19 2019/03/05
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
* Sarah Walker, <tommowalker@tommowalker.co.uk> * Sarah Walker, <tommowalker@tommowalker.co.uk>
* *
* Copyright 2017,2018 Fred N. van Kempen. * Copyright 2017-2019 Fred N. van Kempen.
* Copyright 2016-2018 Miran Grca. * Copyright 2016-2018 Miran Grca.
* Copyright 2008-2018 Sarah Walker. * Copyright 2008-2018 Sarah Walker.
* *
@@ -213,6 +213,13 @@ device_add_ex(const device_t *d, void *priv)
devices[c] = (device_t *)d; devices[c] = (device_t *)d;
device_priv[c] = priv; device_priv[c] = priv;
/*
* Do set the 'current' pointer, so we can do configuration
* right after adding our device. Obviously, this will only
* be valid until the next device is added.
*/
device_current = (device_t *)d;
} }

View File

@@ -120,8 +120,8 @@ CDROM_Interface_Image::BinaryFile::getLength(void)
if (file == NULL) return 0; if (file == NULL) return 0;
fseeko64(file, 0, SEEK_END); fseeko64(file, 0, SEEK_END);
len = ftello64(file); len = (off64_t)ftello64(file);
DEBUG("CDROM: binary_length(%08lx) = %" PRIu64 "\n", file, len); DEBUG("CDROM: binary_length(%08lx) = %" PRIu64 "\n", file, (uint64_t)len);
return len; return len;
} }
@@ -586,7 +586,7 @@ CDROM_Interface_Image::CueLoadSheet(const wchar_t *cuefile)
currPregap = 0; currPregap = 0;
prestart = 0; prestart = 0;
track.number = CueGetNumber(&line); track.number = (int)CueGetNumber(&line);
track.track_number = track.number; track.track_number = track.number;
string type; string type;
success = CueGetKeyword(type, &line); success = CueGetKeyword(type, &line);

View File

@@ -8,11 +8,11 @@
* *
* Implementation of the network module. * Implementation of the network module.
* *
* Version: @(#)network.c 1.0.18 2018/11/12 * Version: @(#)network.c 1.0.19 2019/03/06
* *
* Author: Fred N. van Kempen, <decwiz@yahoo.com> * Author: Fred N. van Kempen, <decwiz@yahoo.com>
* *
* Copyright 2017,2018 Fred N. van Kempen. * Copyright 2017-2019 Fred N. van Kempen.
* *
* Redistribution and use in source and binary forms, with * Redistribution and use in source and binary forms, with
* or without modification, are permitted provided that the * or without modification, are permitted provided that the
@@ -50,9 +50,6 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h> #include <stdarg.h>
#include <wchar.h> #include <wchar.h>
#ifdef _DEBUG
# include <ctype.h>
#endif
#define HAVE_STDARG_H #define HAVE_STDARG_H
#define dbglog network_log #define dbglog network_log
#include "../../emu.h" #include "../../emu.h"
@@ -150,48 +147,6 @@ network_available(int net)
} }
#ifdef _DEBUG
/* Dump a buffer in hex to output buffer. */
void
hexdump_p(char *ptr, uint8_t *bufp, int len)
{
# define is_print(c) (isalnum((int)(c)) || ((c) == ' '))
char asci[20];
uint8_t c;
int addr;
addr = 0;
while (len-- > 0) {
c = bufp[addr];
if ((addr % 16) == 0) {
sprintf(ptr, "%06X %02X", addr, c);
} else {
sprintf(ptr, " %02X", c);
}
ptr += strlen(ptr);
asci[(addr & 15)] = (char)((is_print(c) ? c : '.') & 0xff);
if ((++addr % 16) == 0) {
asci[16] = '\0';
sprintf(ptr, " | %s |\n", asci);
ptr += strlen(ptr);
}
}
if (addr % 16) {
while (addr % 16) {
sprintf(ptr, " ");
ptr += strlen(ptr);
asci[(addr & 15)] = ' ';
addr++;
}
asci[16] = '\0';
sprintf(ptr, " | %s |\n", asci);
ptr += strlen(ptr);
}
}
#endif
#ifdef _LOGGING #ifdef _LOGGING
void void
network_log(int level, const char *fmt, ...) network_log(int level, const char *fmt, ...)
@@ -416,7 +371,7 @@ network_tx(uint8_t *bufp, int len)
{ {
ui_sb_icon_update(SB_NETWORK, 1); ui_sb_icon_update(SB_NETWORK, 1);
#ifdef ENABLE_NETWORK_DUMP #if defined(WALTJE) && defined(_DEBUG) && defined(ENABLE_NETWORK_DUMP)
{ {
char temp[8192]; char temp[8192];
hexdump_p(temp, bufp, len); hexdump_p(temp, bufp, len);
@@ -436,7 +391,7 @@ network_rx(uint8_t *bufp, int len)
{ {
ui_sb_icon_update(SB_NETWORK, 1); ui_sb_icon_update(SB_NETWORK, 1);
#ifdef ENABLE_NETWORK_DUMP #if defined(WALTJE) && defined(_DEBUG) && defined(ENABLE_NETWORK_DUMP)
{ {
char temp[8192]; char temp[8192];
hexdump_p(temp, bufp, len); hexdump_p(temp, bufp, len);

View File

@@ -189,14 +189,14 @@
* including the later update (DS12887A) which implemented a * including the later update (DS12887A) which implemented a
* "century" register to be compatible with Y2K. * "century" register to be compatible with Y2K.
* *
* Version: @(#)nvr_at.c 1.0.11 2018/09/22 * Version: @(#)nvr_at.c 1.0.12 2019/03/06
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
* Mahod, * Mahod,
* Sarah Walker, <tommowalker@tommowalker.co.uk> * Sarah Walker, <tommowalker@tommowalker.co.uk>
* *
* Copyright 2017,2018 Fred N. van Kempen. * Copyright 2017-2019 Fred N. van Kempen.
* Copyright 2016-2018 Miran Grca. * Copyright 2016-2018 Miran Grca.
* Copyright 2008-2018 Sarah Walker. * Copyright 2008-2018 Sarah Walker.
* *
@@ -753,7 +753,7 @@ const device_t ps_nvr_device = {
const device_t amstrad_nvr_device = { const device_t amstrad_nvr_device = {
"Amstrad NVRAM", "Amstrad NVRAM",
MACHINE_ISA | MACHINE_AT, DEVICE_ISA | DEVICE_AT,
3, 3,
nvr_at_init, nvr_at_close, NULL, nvr_at_init, nvr_at_close, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,

View File

@@ -8,7 +8,7 @@
* *
* Emulation of the old and new IBM CGA graphics cards. * Emulation of the old and new IBM CGA graphics cards.
* *
* Version: @(#)vid_cga.c 1.0.12 2019/03/04 * Version: @(#)vid_cga.c 1.0.13 2019/03/05
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -653,7 +653,8 @@ cga_standalone_init(const device_t *info)
cga_palette = (dev->rgb_type << 1); cga_palette = (dev->rgb_type << 1);
cgapal_rebuild(); cgapal_rebuild();
video_load_font(CGA_FONT_ROM_PATH, (dev->font_type) ? 2 : 1); video_load_font(CGA_FONT_ROM_PATH,
(dev->font_type) ? FONT_CGA_THICK : FONT_CGA_THIN);
video_inform(VID_TYPE_CGA, info->vid_timing); video_inform(VID_TYPE_CGA, info->vid_timing);

View File

@@ -40,7 +40,7 @@
* W = 3 bus clocks * W = 3 bus clocks
* L = 4 bus clocks * L = 4 bus clocks
* *
* Version: @(#)video.c 1.0.25 2019/03/03 * Version: @(#)video.c 1.0.25 2019/03/05
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -93,8 +93,8 @@ int video_do_log = ENABLE_VIDEO_LOG;
#endif #endif
/* These will go away soon. */ /* These will go away soon. */
uint8_t fontdat[256][8]; /* IBM CGA font */ uint8_t fontdat[1024][8]; /* IBM CGA font */
uint8_t fontdatm[256][16]; /* IBM MDA font */ uint8_t fontdatm[1024][16]; /* IBM MDA font */
dbcs_font_t *fontdatk = NULL, /* Korean KSC-5601 font */ dbcs_font_t *fontdatk = NULL, /* Korean KSC-5601 font */
*fontdatk_user = NULL; /* Korean KSC-5601 font (user)*/ *fontdatk_user = NULL; /* Korean KSC-5601 font (user)*/
@@ -899,28 +899,28 @@ video_reset_font(void)
/* Load a font from its ROM source. */ /* Load a font from its ROM source. */
void void
video_load_font(const wchar_t *s, int format) video_load_font(const wchar_t *s, fontformat_t num)
{ {
FILE *fp; FILE *fp;
int c; int c;
fp = plat_fopen(rom_path(s), L"rb"); fp = plat_fopen(rom_path(s), L"rb");
if (fp == NULL) { if (fp == NULL) {
ERRLOG("VIDEO: cannot load font '%ls', fmt=%i\n", s, format); ERRLOG("VIDEO: cannot load font '%ls', fmt=%i\n", s, num);
return; return;
} }
switch (format) { switch (num) {
case 0: /* MDA */ case FONT_MDA: /* MDA */
for (c = 0; c < 256; c++) for (c = 0; c < 256; c++)
(void)fread(&fontdatm[c][0], 1, 8, fp); (void)fread(&fontdatm[c][0], 1, 8, fp);
for (c = 0; c < 256; c++) for (c = 0; c < 256; c++)
(void)fread(&fontdatm[c][8], 1, 8, fp); (void)fread(&fontdatm[c][8], 1, 8, fp);
break; break;
case 1: /* CGA, thin font */ case FONT_CGA_THIN: /* CGA, thin font */
case 2: /* CGA, thick font */ case FONT_CGA_THICK: /* CGA, thick font */
if (format == 2) { if (num == FONT_CGA_THICK) {
/* Use the second ("thick") font in the ROM. */ /* Use the second ("thick") font in the ROM. */
(void)fseek(fp, 2048, SEEK_SET); (void)fseek(fp, 2048, SEEK_SET);
} }
@@ -929,7 +929,7 @@ video_load_font(const wchar_t *s, int format)
break; break;
} }
DEBUG("VIDEO: font #%i loaded\n", format); DEBUG("VIDEO: font #%i loaded\n", num);
(void)fclose(fp); (void)fclose(fp);
} }

View File

@@ -8,7 +8,7 @@
* *
* Definitions for the video controller module. * Definitions for the video controller module.
* *
* Version: @(#)video.h 1.0.27 2019/03/03 * Version: @(#)video.h 1.0.28 2019/03/05
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -76,6 +76,12 @@ enum {
FULLSCR_SCALE_KEEPRATIO FULLSCR_SCALE_KEEPRATIO
}; };
typedef enum {
FONT_MDA = 0, /* MDA 8x14 */
FONT_CGA_THIN, /* CGA 8x8, thin lines */
FONT_CGA_THICK, /* CGA 8x8, thick lines */
} fontformat_t;
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@@ -114,8 +120,8 @@ typedef rgb_t PALETTE[256];
extern int changeframecount; extern int changeframecount;
/* These will go away soon. */ /* These will go away soon. */
extern uint8_t fontdat[256][8]; extern uint8_t fontdat[1024][8]; /* 1024 characters */
extern uint8_t fontdatm[256][16]; extern uint8_t fontdatm[1024][16]; /* 1024 characters */
extern dbcs_font_t *fontdatk, extern dbcs_font_t *fontdatk,
*fontdatk_user; *fontdatk_user;
@@ -348,7 +354,7 @@ extern void video_update_timing(void);
extern void video_inform(int type, const video_timings_t *ptr); extern void video_inform(int type, const video_timings_t *ptr);
extern int video_type(void); extern int video_type(void);
extern void video_reset_font(void); extern void video_reset_font(void);
extern void video_load_font(const wchar_t *s, int format); extern void video_load_font(const wchar_t *s, fontformat_t num);
extern uint8_t video_force_resize_get(void); extern uint8_t video_force_resize_get(void);
extern void video_force_resize_set(uint8_t res); extern void video_force_resize_set(uint8_t res);
extern uint32_t video_color_transform(uint32_t color); extern uint32_t video_color_transform(uint32_t color);

View File

@@ -12,7 +12,7 @@
* "extern" reference to its device into the video.h file, * "extern" reference to its device into the video.h file,
* and add an entry for it into the table here. * and add an entry for it into the table here.
* *
* Version: @(#)video_dev.c 1.0.32 2019/03/03 * Version: @(#)video_dev.c 1.0.33 2019/03/05
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -216,7 +216,7 @@ video_reset(void)
video_reset_font(); video_reset_font();
/* Initialize the video font tables. */ /* Initialize the video font tables. */
video_load_font(L"video/ibm/mda/mda.rom", 0); video_load_font(L"video/ibm/mda/mda.rom", FONT_MDA);
/* Do not initialize internal cards here. */ /* Do not initialize internal cards here. */
if ((video_card == VID_NONE) || \ if ((video_card == VID_NONE) || \

View File

@@ -32,7 +32,7 @@
* BIOSES: I need to re-do the bios.txt format so we can load non-BIOS * BIOSES: I need to re-do the bios.txt format so we can load non-BIOS
* ROM files for a given machine, such as font roms here.. * ROM files for a given machine, such as font roms here..
* *
* Version: @(#)m_amstrad.c 1.0.22 2019/03/03 * Version: @(#)m_amstrad.c 1.0.23 2019/03/06
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -109,6 +109,7 @@ typedef struct {
uint8_t crtc[32]; uint8_t crtc[32];
int crtcreg; int crtcreg;
int cga_enabled; /* 1640 */ int cga_enabled; /* 1640 */
int fontbase; /* 1512/200 */
uint8_t cgacol, uint8_t cgacol,
cgamode, cgamode,
stat; stat;
@@ -133,7 +134,7 @@ typedef struct {
int firstline, int firstline,
lastline; lastline;
uint8_t *vram; uint8_t *vram;
uint8_t fontdat[256][8]; /* 1512/200 */ uint8_t fontdat[1024][8]; /* 1512/200 */
} amsvid_t; } amsvid_t;
typedef struct { typedef struct {
@@ -269,10 +270,14 @@ vid_write_1512(uint32_t addr, uint8_t val, void *priv)
addr &= 0x3fff; addr &= 0x3fff;
if ((vid->cgamode & 0x12) == 0x12) { if ((vid->cgamode & 0x12) == 0x12) {
if (vid->plane_write & 1) vid->vram[addr] = val; if (vid->plane_write & 0x01)
if (vid->plane_write & 2) vid->vram[addr | 0x4000] = val; vid->vram[addr] = val;
if (vid->plane_write & 4) vid->vram[addr | 0x8000] = val; if (vid->plane_write & 0x02)
if (vid->plane_write & 8) vid->vram[addr | 0xc000] = val; vid->vram[addr | 0x4000] = val;
if (vid->plane_write & 0x04)
vid->vram[addr | 0x8000] = val;
if (vid->plane_write & 0x08)
vid->vram[addr | 0xc000] = val;
} else } else
vid->vram[addr] = val; vid->vram[addr] = val;
} }
@@ -348,10 +353,10 @@ vid_poll_1512(void *priv)
} }
if (drawcursor) { if (drawcursor) {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[vid->displine][(x << 3) + c + 8] = cols[(vid->fontdat[chr][vid->sc & 7] & (1 << (c ^ 7))) ? 1 : 0] ^ 15; buffer->line[vid->displine][(x << 3) + c + 8] = cols[(vid->fontdat[chr + vid->fontbase][vid->sc & 7] & (1 << (c ^ 7))) ? 1 : 0] ^ 15;
} else { } else {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[vid->displine][(x << 3) + c + 8] = cols[(vid->fontdat[chr][vid->sc & 7] & (1 << (c ^ 7))) ? 1 : 0]; buffer->line[vid->displine][(x << 3) + c + 8] = cols[(vid->fontdat[chr + vid->fontbase][vid->sc & 7] & (1 << (c ^ 7))) ? 1 : 0];
} }
vid->ma++; vid->ma++;
} }
@@ -373,11 +378,11 @@ vid_poll_1512(void *priv)
if (drawcursor) { if (drawcursor) {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[vid->displine][(x << 4) + (c << 1) + 8] = buffer->line[vid->displine][(x << 4) + (c << 1) + 8] =
buffer->line[vid->displine][(x << 4) + (c << 1) + 1 + 8] = cols[(vid->fontdat[chr][vid->sc & 7] & (1 << (c ^ 7))) ? 1 : 0] ^ 15; buffer->line[vid->displine][(x << 4) + (c << 1) + 1 + 8] = cols[(vid->fontdat[chr + vid->fontbase][vid->sc & 7] & (1 << (c ^ 7))) ? 1 : 0] ^ 15;
} else { } else {
for (c = 0; c < 8; c++) for (c = 0; c < 8; c++)
buffer->line[vid->displine][(x << 4) + (c << 1) + 8] = buffer->line[vid->displine][(x << 4) + (c << 1) + 8] =
buffer->line[vid->displine][(x << 4) + (c << 1) + 1 + 8] = cols[(vid->fontdat[chr][vid->sc & 7] & (1 << (c ^ 7))) ? 1 : 0]; buffer->line[vid->displine][(x << 4) + (c << 1) + 1 + 8] = cols[(vid->fontdat[chr + vid->fontbase][vid->sc & 7] & (1 << (c ^ 7))) ? 1 : 0];
} }
} }
} else if (! (vid->cgamode & 16)) { } else if (! (vid->cgamode & 16)) {
@@ -534,51 +539,6 @@ vid_poll_1512(void *priv)
} }
static void
vid_init_1512(amstrad_t *ams, const wchar_t *fn, int num)
{
amsvid_t *vid;
FILE *fp;
int c;
/* Allocate a video controller block. */
vid = (amsvid_t *)mem_alloc(sizeof(amsvid_t));
memset(vid, 0x00, sizeof(amsvid_t));
/* Load the PC1512 CGA Character Set ROM. */
fp = plat_fopen(rom_path(fn), L"rb");
if (fp != NULL) {
if (num == 8) {
/* Use the second ("thick") font in the ROM. */
(void)fseek(fp, 2048, SEEK_SET);
}
for (c = 0; c < 256; c++)
(void)fread(&vid->fontdat[c][0], 1, 8, fp);
(void)fclose(fp);
} else {
ERRLOG("AMSTRAD: cannot load font '%ls'\n", fn);
return;
}
vid->vram = (uint8_t *)mem_alloc(0x10000);
vid->cgacol = 7;
vid->cgamode = 0x12;
timer_add(vid_poll_1512, &vid->vidtime, TIMER_ALWAYS_ENABLED, vid);
mem_map_add(&vid->cga.mapping, 0xb8000, 0x08000,
vid_read_1512, NULL, NULL, vid_write_1512, NULL, NULL,
NULL, 0, vid);
io_sethandler(0x03d0, 16,
vid_in_1512, NULL, NULL, vid_out_1512, NULL, NULL, vid);
overscan_x = overscan_y = 16;
video_inform(VID_TYPE_CGA, &pc1512_timing);
ams->vid = vid;
}
static void static void
vid_close_1512(void *priv) vid_close_1512(void *priv)
{ {
@@ -598,15 +558,98 @@ vid_speed_change_1512(void *priv)
} }
static const device_t vid_1512_device = { static void
"Amstrad PC1512 (video)", vid_init_1512(amstrad_t *ams, const wchar_t *fn, int num)
{
amsvid_t *vid;
FILE *fp;
int c, d;
/* Allocate a video controller block. */
vid = (amsvid_t *)mem_alloc(sizeof(amsvid_t));
memset(vid, 0x00, sizeof(amsvid_t));
/* Load the PC1512 CGA Character Set ROM. */
fp = plat_fopen(rom_path(fn), L"rb");
if (fp != NULL) {
if (num == FONT_CGA_THICK) {
/* Use the second ("thick") font in the ROM. */
(void)fseek(fp, 2048, SEEK_SET);
}
/* The ROM has 4 fonts. */
for (d = 0; d < 4; d++) {
/* 8x8 CGA. */
for (c = 0; c < 256; c++)
fread(&vid->fontdat[256 * d + c], 1, 8, fp);
}
(void)fclose(fp);
} else {
ERRLOG("AMSTRAD: cannot load fonts from '%ls'\n", fn);
return;
}
/* Add the device to the system. */
device_add_ex(&m_amstrad_1512_device, vid);
vid->fontbase = (device_get_config_int("codepage") & 3) * 256;
vid->vram = (uint8_t *)mem_alloc(0x10000);
vid->cgacol = 7;
vid->cgamode = 0x12;
timer_add(vid_poll_1512, &vid->vidtime, TIMER_ALWAYS_ENABLED, vid);
mem_map_add(&vid->cga.mapping, 0xb8000, 0x08000,
vid_read_1512, NULL, NULL, vid_write_1512, NULL, NULL,
NULL, 0, vid);
io_sethandler(0x03d0, 16,
vid_in_1512, NULL, NULL, vid_out_1512, NULL, NULL, vid);
overscan_x = overscan_y = 16;
cgapal_rebuild();
video_inform(VID_TYPE_CGA, &pc1512_timing);
ams->vid = vid;
}
static const device_config_t pc1512_config[] = {
{
"codepage", "Hardware font", CONFIG_SELECTION, "", 3,
{
{
"US English", 3
},
// FIXME: what is 2 ??
{
"Danish", 1
},
{
"Greek", 0
},
{
""
}
}
},
{
"", "", -1
}
};
const device_t m_amstrad_1512_device = {
"Amstrad PC1512",
0, 0, 0, 0,
NULL, vid_close_1512, NULL, NULL, vid_close_1512, NULL,
NULL, NULL,
vid_speed_change_1512, vid_speed_change_1512,
NULL, NULL,
&pc1512_timing, &pc1512_timing,
NULL pc1512_config
}; };
@@ -769,7 +812,7 @@ vid_speed_changed_1640(void *priv)
static const device_t vid_1640_device = { static const device_t vid_1640_device = {
"Amstrad PC1640 (video)", "Amstrad PC1640",
0, 0, 0, 0,
NULL, vid_close_1640, NULL, NULL, vid_close_1640, NULL,
NULL, NULL,
@@ -858,7 +901,7 @@ vid_in_200(uint16_t addr, void *priv)
static void static void
vid_init_200(amstrad_t *ams, const wchar_t *fn) vid_init_200(amstrad_t *dev, const wchar_t *fn)
{ {
amsvid_t *vid; amsvid_t *vid;
cga_t *cga; cga_t *cga;
@@ -869,32 +912,37 @@ vid_init_200(amstrad_t *ams, const wchar_t *fn)
vid = (amsvid_t *)mem_alloc(sizeof(amsvid_t)); vid = (amsvid_t *)mem_alloc(sizeof(amsvid_t));
memset(vid, 0x00, sizeof(amsvid_t)); memset(vid, 0x00, sizeof(amsvid_t));
/* Add the device to the system. */
device_add_ex(&m_amstrad_200_device, vid);
vid->fontbase = (device_get_config_int("codepage") & 3) * 256;
/* Load the PC200 CGA Character Set ROM. */ /* Load the PC200 CGA Character Set ROM. */
fp = plat_fopen(rom_path(fn), L"rb"); fp = plat_fopen(rom_path(fn), L"rb");
if (fp != NULL) { if (fp != NULL) {
for (c = 0; c < 256; c++) /* The ROM has 4 fonts. */
(void)fread(&fontdatm[c][0], 1, 8, fp); for (d = 0; d < 4; d++) {
for (c = 0; c < 256; c++) /* 8x14 MDA in 8x16 cell. */
(void)fread(&fontdatm[c][8], 1, 8, fp); for (c = 0; c < 256; c++)
fread(&fontdatm[256 * d + c], 1, 16, fp);
(void)fseek(fp, 4096, SEEK_SET); /* 8x8 CGA in 8x16 cell. */
for (c = 0; c < 256; c++) {
for (c = 0; c < 256; c++) { fread(&fontdat[256 * d + c], 1, 8, fp);
(void)fread(&fontdat[c][0], 1, 8, fp); fseek(fp, 8, SEEK_CUR);
}
for (d = 0; d < 8; d++)
(void)fgetc(fp);
} }
(void)fclose(fp); (void)fclose(fp);
} else { } else {
ERRLOG("AMSTRAD: cannot load font '%ls'\n", fn); ERRLOG("AMSTRAD: cannot load fonts from '%ls'\n", fn);
return; return;
} }
cga = &vid->cga; cga = &vid->cga;
cga->vram = (uint8_t *)mem_alloc(0x4000); cga->vram = (uint8_t *)mem_alloc(0x4000);
cga_init(cga); cga_init(cga);
vid->cga.fontbase = vid->fontbase;
mem_map_add(&vid->cga.mapping, 0xb8000, 0x08000, mem_map_add(&vid->cga.mapping, 0xb8000, 0x08000,
cga_read,NULL,NULL, cga_write,NULL,NULL, NULL, 0, cga); cga_read,NULL,NULL, cga_write,NULL,NULL, NULL, 0, cga);
@@ -905,9 +953,11 @@ vid_init_200(amstrad_t *ams, const wchar_t *fn)
overscan_x = overscan_y = 16; overscan_x = overscan_y = 16;
cgapal_rebuild();
video_inform(VID_TYPE_CGA, &pc200_timing); video_inform(VID_TYPE_CGA, &pc200_timing);
ams->vid = vid; dev->vid = vid;
} }
@@ -931,71 +981,104 @@ vid_speed_changed_200(void *priv)
} }
static const device_t vid_200_device = { /*
"Amstrad PC200 (video)", * TODO: Should have options here for:
*
* > Video emulation (CGA / MDA)
* > Display port (TTL or RF)
*/
static const device_config_t pc200_config[] = {
{
"codepage", "Hardware font", CONFIG_SELECTION, "", 3,
{
{
"US English", 3
},
{
"Portugese", 2
},
{
"Norwegian", 1
},
{
"Greek", 0
},
{
""
}
}
},
{
"", "", -1
}
};
const device_t m_amstrad_200_device = {
"Amstrad PC200",
0, 0, 0, 0,
NULL, vid_close_200, NULL, NULL, vid_close_200, NULL,
NULL, NULL,
vid_speed_changed_200, vid_speed_changed_200,
NULL, NULL,
&pc200_timing, &pc200_timing,
NULL pc200_config
}; };
static void static void
mse_write(uint16_t addr, uint8_t val, void *priv) mse_write(uint16_t addr, uint8_t val, void *priv)
{ {
amstrad_t *ams = (amstrad_t *)priv; amstrad_t *dev = (amstrad_t *)priv;
if (addr == 0x78) if (addr == 0x0078)
ams->mousex = 0; dev->mousex = 0;
else else
ams->mousey = 0; dev->mousey = 0;
} }
static uint8_t static uint8_t
mse_read(uint16_t addr, void *priv) mse_read(uint16_t addr, void *priv)
{ {
amstrad_t *ams = (amstrad_t *)priv; amstrad_t *dev = (amstrad_t *)priv;
if (addr == 0x78) if (addr == 0x0078)
return(ams->mousex); return(dev->mousex);
return(ams->mousey); return(dev->mousey);
} }
static int static int
mse_poll(int x, int y, int z, int b, void *priv) mse_poll(int x, int y, int z, int b, void *priv)
{ {
amstrad_t *ams = (amstrad_t *)priv; amstrad_t *dev = (amstrad_t *)priv;
ams->mousex += x; dev->mousex += x;
ams->mousey -= y; dev->mousey -= y;
if ((b & 1) && !(ams->oldb & 1)) if ((b & 1) && !(dev->oldb & 1))
keyboard_send(0x7e); keyboard_send(0x7e);
if ((b & 2) && !(ams->oldb & 2)) if ((b & 2) && !(dev->oldb & 2))
keyboard_send(0x7d); keyboard_send(0x7d);
if (!(b & 1) && (ams->oldb & 1)) if (!(b & 1) && (dev->oldb & 1))
keyboard_send(0xfe); keyboard_send(0xfe);
if (!(b & 2) && (ams->oldb & 2)) if (!(b & 2) && (dev->oldb & 2))
keyboard_send(0xfd); keyboard_send(0xfd);
ams->oldb = b; dev->oldb = b;
return(0); return(1);
} }
static void static void
kbd_adddata(uint16_t val) kbd_adddata(uint16_t val)
{ {
key_queue[key_queue_end] = (uint8_t)(val&0xff); key_queue[key_queue_end] = (uint8_t)(val & 0xff);
DBGLOG(1, "AMSkb: %02X added to key queue at %i\n", val, key_queue_end); DBGLOG(1, "AMSkb: %02X added to key queue at %i\n", val, key_queue_end);
key_queue_end = (key_queue_end + 1) & 0xf; key_queue_end = (key_queue_end + 1) & 0x0f;
} }
@@ -1009,9 +1092,9 @@ kbd_adddata_ex(uint16_t val)
static void static void
kbd_write(uint16_t port, uint8_t val, void *priv) kbd_write(uint16_t port, uint8_t val, void *priv)
{ {
amstrad_t *ams = (amstrad_t *)priv; amstrad_t *dev = (amstrad_t *)priv;
DBGLOG(2, "AMSkb: write %04X %02X %02X\n", port, val, ams->pb); DBGLOG(2, "AMSkb: write %04X %02X %02X\n", port, val, dev->pb);
switch (port) { switch (port) {
case 0x61: case 0x61:
@@ -1029,12 +1112,12 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
* *
* This register is controlled by BIOS and/or ROS. * This register is controlled by BIOS and/or ROS.
*/ */
DBGLOG(1, "AMSkb: write PB %02x (%02x)\n", val, ams->pb); DBGLOG(1, "AMSkb: write PB %02x (%02x)\n", val, dev->pb);
if (!(ams->pb & 0x40) && (val & 0x40)) { /*Reset keyboard*/ if (!(dev->pb & 0x40) && (val & 0x40)) { /*Reset keyboard*/
DEBUG("AMSkb: reset keyboard\n"); DEBUG("AMSkb: reset keyboard\n");
kbd_adddata(0xaa); kbd_adddata(0xaa);
} }
ams->pb = val; dev->pb = val;
ppi.pb = val; ppi.pb = val;
timer_process(); timer_process();
@@ -1049,7 +1132,7 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
if (val & 0x80) { if (val & 0x80) {
/* Keyboard enabled, so enable PA reading. */ /* Keyboard enabled, so enable PA reading. */
ams->pa = 0x00; dev->pa = 0x00;
} }
break; break;
@@ -1057,11 +1140,11 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
break; break;
case 0x64: case 0x64:
ams->stat1 = val; dev->stat1 = val;
break; break;
case 0x65: case 0x65:
ams->stat2 = val; dev->stat2 = val;
break; break;
case 0x66: case 0x66:
@@ -1077,12 +1160,12 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
static uint8_t static uint8_t
kbd_read(uint16_t port, void *priv) kbd_read(uint16_t port, void *priv)
{ {
amstrad_t *ams = (amstrad_t *)priv; amstrad_t *dev = (amstrad_t *)priv;
uint8_t ret = 0xff; uint8_t ret = 0xff;
switch (port) { switch (port) {
case 0x60: case 0x60:
if (ams->pb & 0x80) { if (dev->pb & 0x80) {
/* /*
* PortA - System Status 1 * PortA - System Status 1
* *
@@ -1105,21 +1188,21 @@ kbd_read(uint16_t port, void *priv)
* 2. The ROS then sets the initial VDU state based * 2. The ROS then sets the initial VDU state based
* on the DDM value. * on the DDM value.
*/ */
ret = (0x0d | ams->stat1) & 0x7f; ret = (0x0d | dev->stat1) & 0x7f;
} else { } else {
ret = ams->pa; ret = dev->pa;
if (key_queue_start == key_queue_end) { if (key_queue_start == key_queue_end) {
ams->wantirq = 0; dev->wantirq = 0;
} else { } else {
ams->key_waiting = key_queue[key_queue_start]; dev->key_waiting = key_queue[key_queue_start];
key_queue_start = (key_queue_start + 1) & 0xf; key_queue_start = (key_queue_start + 1) & 0xf;
ams->wantirq = 1; dev->wantirq = 1;
} }
} }
break; break;
case 0x61: case 0x61:
ret = ams->pb; ret = dev->pb;
break; break;
case 0x62: case 0x62:
@@ -1148,10 +1231,10 @@ kbd_read(uint16_t port, void *priv)
* 10001 608K bytes (96K external). * 10001 608K bytes (96K external).
* 10010 640K bytes (128K external or fitted on-board). * 10010 640K bytes (128K external or fitted on-board).
*/ */
if (ams->pb & 0x04) if (dev->pb & 0x04)
ret = ams->stat2 & 0x0f; ret = dev->stat2 & 0x0f;
else else
ret = ams->stat2 >> 4; ret = dev->stat2 >> 4;
ret |= (ppispeakon ? 0x20 : 0); ret |= (ppispeakon ? 0x20 : 0);
if (nmi) if (nmi)
ret |= 0x40; ret |= 0x40;
@@ -1168,23 +1251,23 @@ kbd_read(uint16_t port, void *priv)
static void static void
kbd_poll(void *priv) kbd_poll(void *priv)
{ {
amstrad_t *ams = (amstrad_t *)priv; amstrad_t *dev = (amstrad_t *)priv;
keyboard_delay += (1000 * TIMER_USEC); keyboard_delay += (1000 * TIMER_USEC);
if (ams->wantirq) if (dev->wantirq)
{ {
ams->wantirq = 0; dev->wantirq = 0;
dev->pa = dev->key_waiting; dev->pa = dev->key_waiting;
picint(2); picint(2);
DBGLOG(1, "AMSkb: take IRQ\n"); DBGLOG(1, "AMSkb: take IRQ\n");
} }
if (key_queue_start != key_queue_end && !ams->pa) { if (key_queue_start != key_queue_end && !dev->pa) {
dev->key_waiting = key_queue[key_queue_start]; dev->key_waiting = key_queue[key_queue_start];
DBGLOG(1, "AMSkb: reading %02X from the key queue at %i\n", DBGLOG(1, "AMSkb: reading %02X from the key queue at %i\n",
ams->key_waiting, key_queue_start); dev->key_waiting, key_queue_start);
key_queue_start = (key_queue_start + 1) & 0xf; key_queue_start = (key_queue_start + 1) & 0x0f;
dev->wantirq = 1; dev->wantirq = 1;
} }
} }
@@ -1192,11 +1275,11 @@ kbd_poll(void *priv)
static void static void
ams_write(uint16_t port, uint8_t val, void *priv) ams_write(uint16_t port, uint8_t val, void *priv)
{ {
amstrad_t *dev = (amstrad_t *)priv; amstrad_t *dev = (amstrad_t *)priv;
switch (port) { switch (port) {
case 0xdead: case 0xdead:
dev->dead = val; dev->dead = val;
break; break;
} }
@@ -1205,7 +1288,7 @@ ams_write(uint16_t port, uint8_t val, void *priv)
static uint8_t static uint8_t
ams_read(uint16_t port, void *priv) ams_read(uint16_t port, void *priv)
{ {
amstrad_t *dev = (amstrad_t *)priv; amstrad_t *dev = (amstrad_t *)priv;
uint8_t ret = 0xff; uint8_t ret = 0xff;
@@ -1223,7 +1306,7 @@ ams_read(uint16_t port, void *priv)
ret = 0x02; /* ENGLISH. no Diags mode */ ret = 0x02; /* ENGLISH. no Diags mode */
break; break;
case 0x037a: /* printer status */ case 0x037a: /* printer status */
switch(dev->type) { switch(dev->type) {
case 0: case 0:
ret = 0x20; ret = 0x20;
@@ -1238,7 +1321,7 @@ ams_read(uint16_t port, void *priv)
} }
break; break;
case 0xdead: case 0xdead:
ret = dev->dead; ret = dev->dead;
break; break;
} }
@@ -1250,23 +1333,22 @@ static void
static void static void
amstrad_common_init(const machine_t *model, void *arg, int type) amstrad_common_init(const machine_t *model, void *arg, int type)
{ {
romdef_t *roms = (romdef_t *)arg; romdef_t *roms = (romdef_t *)arg;
amstrad_t *dev; amstrad_t *dev;
ams = (amstrad_t *)mem_alloc(sizeof(amstrad_t)); dev = (amstrad_t *)mem_alloc(sizeof(amstrad_t));
memset(ams, 0x00, sizeof(amstrad_t)); memset(dev, 0x00, sizeof(amstrad_t));
dev->type = type; dev->type = type;
machine_common_init(model, arg); machine_common_init(model, arg);
nmi_init(); nmi_init();
switch(dev->type) { switch(dev->type) {
case 0: /* 1512 */ case 0: /* 1512 */
device_add(&fdc_xt_device); device_add(&fdc_xt_device);
if (video_card == VID_INTERNAL) { if (video_card == VID_INTERNAL) {
/* Initialize the internal CGA controller. */ /* Initialize the internal CGA controller. */
vid_init_1512(ams, roms->fontfn, roms->fontnum);
vid_init_1512(dev, roms->fontfn, roms->fontnum); vid_init_1512(dev, roms->fontfn, roms->fontnum);
} }
break; break;
@@ -1274,8 +1356,8 @@ amstrad_common_init(const machine_t *model, void *arg, int type)
case 1: /* 1640 */ case 1: /* 1640 */
device_add(&fdc_xt_device); device_add(&fdc_xt_device);
if (video_card == VID_INTERNAL) { if (video_card == VID_INTERNAL) {
/* Initialize the internal CGA/EGA controller. */ /* Initialize the internal CGA/EGA controller. */
vid_init_1640(ams, roms->vidfn, roms->vidsz); vid_init_1640(dev, roms->vidfn, roms->vidsz);
device_add_ex(&vid_1640_device, dev->vid); device_add_ex(&vid_1640_device, dev->vid);
} }
break; break;
@@ -1283,8 +1365,7 @@ amstrad_common_init(const machine_t *model, void *arg, int type)
case 2: /* PC200 */ case 2: /* PC200 */
device_add(&fdc_xt_device); device_add(&fdc_xt_device);
if (video_card == VID_INTERNAL) { if (video_card == VID_INTERNAL) {
/* Initialize the internal CGA controller. */ /* Initialize the internal CGA controller. */
vid_init_200(ams, roms->fontfn);
vid_init_200(dev, roms->fontfn); vid_init_200(dev, roms->fontfn);
} }
break; break;
@@ -1318,22 +1399,22 @@ amstrad_common_init(const machine_t *model, void *arg, int type)
//FIXME: parallel_remove_amstrad(); //FIXME: parallel_remove_amstrad();
io_sethandler(0x0078, 1, io_sethandler(0x0078, 1,
mse_read, NULL, NULL, mse_write, NULL, NULL, dev); mse_read, NULL, NULL, mse_write, NULL, NULL, dev);
io_sethandler(0x007a, 1, io_sethandler(0x007a, 1,
mse_read, NULL, NULL, mse_write, NULL, NULL, dev); mse_read, NULL, NULL, mse_write, NULL, NULL, dev);
io_sethandler(0x0379, 2, io_sethandler(0x0379, 2,
ams_read, NULL, NULL, NULL, NULL, NULL, dev); ams_read, NULL, NULL, NULL, NULL, NULL, dev);
io_sethandler(0xdead, 1, io_sethandler(0xdead, 1,
ams_read, NULL, NULL, ams_write, NULL, NULL, dev); ams_read, NULL, NULL, ams_write, NULL, NULL, dev);
/* Initialize the (custom) keyboard/mouse interface. */ /* Initialize the (custom) keyboard/mouse interface. */
dev->wantirq = 0; dev->wantirq = 0;
io_sethandler(0x0060, 7, io_sethandler(0x0060, 7,
kbd_read, NULL, NULL, kbd_write, NULL, NULL, ams); kbd_read, NULL, NULL, kbd_write, NULL, NULL, dev);
timer_add(kbd_poll, &keyboard_delay, TIMER_ALWAYS_ENABLED, dev); timer_add(kbd_poll, &keyboard_delay, TIMER_ALWAYS_ENABLED, dev);
keyboard_set_table(scancode_xt); keyboard_set_table(scancode_xt);
keyboard_send = kbd_adddata_ex; keyboard_send = kbd_adddata_ex;
@@ -1341,7 +1422,7 @@ amstrad_common_init(const machine_t *model, void *arg, int type)
/* Tell mouse driver about our internal mouse. */ /* Tell mouse driver about our internal mouse. */
if (mouse_type == MOUSE_INTERNAL) { if (mouse_type == MOUSE_INTERNAL) {
mouse_reset(); mouse_reset();
mouse_set_poll(mse_poll, dev); mouse_set_poll(mse_poll, dev);
} }
} }

View File

@@ -96,7 +96,7 @@
* *
* FIXME: The ROM drive should be re-done using the "option file". * FIXME: The ROM drive should be re-done using the "option file".
* *
* Version: @(#)m_xt_t1000.c 1.0.15 2019/02/16 * Version: @(#)m_xt_t1000.c 1.0.16 2019/03/05
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -152,6 +152,8 @@
#define T1000_ROMDOS_SIZE (512*1024UL) /* Max romdrive size is 512k */ #define T1000_ROMDOS_SIZE (512*1024UL) /* Max romdrive size is 512k */
#define T1000_ROMDOS_PATH L"machines/toshiba/t1000/t1000dos.rom" #define T1000_ROMDOS_PATH L"machines/toshiba/t1000/t1000dos.rom"
#define T1000_FONT_PATH L"machines/toshiba/t1000/t1000font.rom"
#define T1200_FONT_PATH L"machines/toshiba/t1200/t1000font.bin"
enum TC8521_ADDR { enum TC8521_ADDR {
@@ -1007,7 +1009,7 @@ m_xt_t1000_init(const machine_t *model, void *arg)
tc8521_init(&t1000.nvr, model->nvrsz); tc8521_init(&t1000.nvr, model->nvrsz);
if (video_card == VID_INTERNAL) { if (video_card == VID_INTERNAL) {
/* Load the T1000 CGA Font ROM. */ /* Load the T1000 CGA Font ROM. */
video_load_font(T1000_FONT_PATH, FONT_CGA_THICK); video_load_font(T1000_FONT_PATH, FONT_CGA_THICK);
device_add(&t1000_video_device); device_add(&t1000_video_device);
@@ -1081,7 +1083,7 @@ m_xt_t1200_init(const machine_t *model, void *arg)
tc8521_init(&t1000.nvr, model->nvrsz); tc8521_init(&t1000.nvr, model->nvrsz);
if (video_card == VID_INTERNAL) { if (video_card == VID_INTERNAL) {
/* Load the T1200 CGA Font ROM. */ /* Load the T1200 CGA Font ROM. */
video_load_font(T1200_FONT_PATH, FONT_CGA_THICK); video_load_font(T1200_FONT_PATH, FONT_CGA_THICK);
device_add(&t1200_video_device); device_add(&t1200_video_device);

View File

@@ -8,7 +8,7 @@
* *
* Handling of the emulated machines. * Handling of the emulated machines.
* *
* Version: @(#)machine.h 1.0.27 2019/02/16 * Version: @(#)machine.h 1.0.28 2019/03/05
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -207,8 +207,14 @@ extern void m_ps2_model_70_type4_init(const machine_t *, void *);
extern void m_ps2_model_80_init(const machine_t *, void *); extern void m_ps2_model_80_init(const machine_t *, void *);
extern void m_amstrad_1512_init(const machine_t *, void *); extern void m_amstrad_1512_init(const machine_t *, void *);
#ifdef EMU_DEVICE_H
extern const device_t m_amstrad_1512_device;
#endif
extern void m_amstrad_1640_init(const machine_t *, void *); extern void m_amstrad_1640_init(const machine_t *, void *);
extern void m_amstrad_200_init(const machine_t *, void *); extern void m_amstrad_200_init(const machine_t *, void *);
#ifdef EMU_DEVICE_H
extern const device_t m_amstrad_200_device;
#endif
extern void m_amstrad_2086_init(const machine_t *, void *); extern void m_amstrad_2086_init(const machine_t *, void *);
extern void m_amstrad_3086_init(const machine_t *, void *); extern void m_amstrad_3086_init(const machine_t *, void *);
extern void m_amstrad_mega_init(const machine_t *, void *); extern void m_amstrad_mega_init(const machine_t *, void *);

View File

@@ -8,7 +8,7 @@
* *
* Handling of the emulated machines. * Handling of the emulated machines.
* *
* Version: @(#)machine_table.c 1.0.36 2019/03/04 * Version: @(#)machine_table.c 1.0.37 2019/03/05
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -87,11 +87,11 @@ const machine_t machines[] = {
{ "[8088] Zenith Data SupersPORT", "zenith_supersport", L"zenith/supersport", -1, {{"Intel", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA, 128, 640, 128, 0, m_zenith_supersport_init, NULL, NULL }, { "[8088] Zenith Data SupersPORT", "zenith_supersport", L"zenith/supersport", -1, {{"Intel", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA, 128, 640, 128, 0, m_zenith_supersport_init, NULL, NULL },
/* 8086 */ /* 8086 */
{ "[8086] Amstrad PC1512", "amstrad_pc1512", L"amstrad/pc1512", -1, {{"Intel", cpus_pc1512}, {"NEC", cpus_nec}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_VIDEO | MACHINE_MOUSE, 512, 640, 128, 64, m_amstrad_1512_init, NULL, NULL }, { "[8086] Amstrad PC1512", "amstrad_pc1512", L"amstrad/pc1512", -1, {{"Intel", cpus_pc1512}, {"NEC", cpus_nec}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_VIDEO | MACHINE_MOUSE, 512, 640, 128, 64, m_amstrad_1512_init, &m_amstrad_1512_device, NULL },
{ "[8086] Amstrad PC1640", "amstrad_pc1640", L"amstrad/pc1640", -1, {{"Intel", cpus_8086}, {"NEC", cpus_nec}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_VIDEO | MACHINE_MOUSE, 640, 640, 0, 64, m_amstrad_1640_init, NULL, NULL }, { "[8086] Amstrad PC1640", "amstrad_pc1640", L"amstrad/pc1640", -1, {{"Intel", cpus_8086}, {"NEC", cpus_nec}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_VIDEO | MACHINE_MOUSE, 640, 640, 0, 64, m_amstrad_1640_init, NULL, NULL },
{ "[8086] Amstrad PC2086", "amstrad_pc2086", L"amstrad/pc2086", -1, {{"Intel", cpus_8086}, {"NEC", cpus_nec}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_VIDEO | MACHINE_MOUSE, 640, 640, 0, 64, m_amstrad_2086_init, NULL, NULL }, { "[8086] Amstrad PC2086", "amstrad_pc2086", L"amstrad/pc2086", -1, {{"Intel", cpus_8086}, {"NEC", cpus_nec}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_VIDEO | MACHINE_MOUSE, 640, 640, 0, 64, m_amstrad_2086_init, NULL, NULL },
{ "[8086] Amstrad PC3086", "amstrad_pc3086", L"amstrad/pc3086", -1, {{"Intel", cpus_8086}, {"NEC", cpus_nec}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_VIDEO | MACHINE_MOUSE, 640, 640, 0, 64, m_amstrad_3086_init, NULL, NULL }, { "[8086] Amstrad PC3086", "amstrad_pc3086", L"amstrad/pc3086", -1, {{"Intel", cpus_8086}, {"NEC", cpus_nec}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_VIDEO | MACHINE_MOUSE, 640, 640, 0, 64, m_amstrad_3086_init, NULL, NULL },
{ "[8086] Amstrad PC20(0)", "amstrad_pc200", L"amstrad/pc200", -1, {{"Intel", cpus_8086}, {"NEC", cpus_nec}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_VIDEO | MACHINE_MOUSE, 512, 640, 128, 64, m_amstrad_200_init, NULL, NULL }, { "[8086] Amstrad PC20(0)", "amstrad_pc200", L"amstrad/pc200", -1, {{"Intel", cpus_8086}, {"NEC", cpus_nec}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_VIDEO | MACHINE_MOUSE, 512, 640, 128, 64, m_amstrad_200_init, &m_amstrad_200_device, NULL },
{ "[8086] Olivetti M24", "olivetti_m24", L"olivetti/m24", -1, {{"Intel", cpus_8086}, {"NEC", cpus_nec}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_VIDEO | MACHINE_MOUSE, 128, 640, 128, 0, m_olim24_init, NULL, NULL }, { "[8086] Olivetti M24", "olivetti_m24", L"olivetti/m24", -1, {{"Intel", cpus_8086}, {"NEC", cpus_nec}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_VIDEO | MACHINE_MOUSE, 128, 640, 128, 0, m_olim24_init, NULL, NULL },
{ "[8086] Tandy 1000 SL/2", "tandy_1000sl2", L"tandy/t1000sl2", -1, {{"Intel", cpus_8086}, {"NEC", cpus_nec}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA, 512, 768, 128, 0, m_tandy1k_sl2_init, &m_tandy1k_sl2_device, NULL }, { "[8086] Tandy 1000 SL/2", "tandy_1000sl2", L"tandy/t1000sl2", -1, {{"Intel", cpus_8086}, {"NEC", cpus_nec}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA, 512, 768, 128, 0, m_tandy1k_sl2_init, &m_tandy1k_sl2_device, NULL },
{ "[8086] Toshiba T1200", "toshiba_t1200", L"toshiba/t1200", -1, {{"Intel", cpus_8086}, {"NEC", cpus_nec}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_VIDEO | MACHINE_HDC, 1024, 2048,1024, 64, m_xt_t1200_init, &t1200_video_device, m_xt_t1x00_close }, { "[8086] Toshiba T1200", "toshiba_t1200", L"toshiba/t1200", -1, {{"Intel", cpus_8086}, {"NEC", cpus_nec}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_VIDEO | MACHINE_HDC, 1024, 2048,1024, 64, m_xt_t1200_init, &t1200_video_device, m_xt_t1x00_close },