Updated travis-build script to display build options (for clarity.)
Fixed a buffer overflow in vid_voodoo.c (thanks DS) Fixed the BIOS-loading error that caused the PS/2 M50 to not boot. Small changes here and there. Disabled writing keyboard to the host (for now.)
This commit is contained in:
@@ -66,6 +66,7 @@
|
||||
|
||||
# Build the project.
|
||||
echo ; echo "Building VARCem #${TRAVIS_BUILD_NUMBER} target ${TARGET}"
|
||||
echo "Options selected: ${OPTS}"
|
||||
|
||||
cd src
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* 286/386+ instruction handlers list.
|
||||
*
|
||||
* Version: @(#)386_ops.h 1.0.4 2019/04/11
|
||||
* Version: @(#)386_ops.h 1.0.5 2019/04/30
|
||||
*
|
||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
* Sarah Walker, <tommowalker@tommowalker.co.uk>
|
||||
@@ -162,7 +162,8 @@ static int ILLEGAL(uint32_t fetchdat)
|
||||
{
|
||||
cpu_state.pc = cpu_state.oldpc;
|
||||
|
||||
ERRLOG("CPU: illegal instruction %08X (%02X)\n", fetchdat, fopcode);
|
||||
ERRLOG("CPU: illegal instruction %08X (%02X) @%s\n",
|
||||
fetchdat, fopcode, cpu_current_pc(NULL));
|
||||
x86illegal();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
* it either will not process ctrl-alt-esc, or it will not do
|
||||
* ANY input.
|
||||
*
|
||||
* Version: @(#)keyboard_at.c 1.0.26 2019/04/27
|
||||
* Version: @(#)keyboard_at.c 1.0.27 2019/04/30
|
||||
*
|
||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -102,6 +102,7 @@
|
||||
#define KBC_TYPE_PS2_1 0x02 /* PS2 on PS/2, type 1 */
|
||||
#define KBC_TYPE_PS2_2 0x03 /* PS2 on PS/2, type 2 */
|
||||
#define KBC_TYPE_MASK 0x03
|
||||
#define KBC_TYPE(x) ((x)->flags & KBC_TYPE_MASK)
|
||||
|
||||
#define KBC_VEN_GENERIC 0x00
|
||||
#define KBC_VEN_AMI 0x04
|
||||
@@ -112,6 +113,7 @@
|
||||
#define KBC_VEN_IBM_PS1 0x18
|
||||
#define KBC_VEN_ACER 0x1c
|
||||
#define KBC_VEN_MASK 0x1c
|
||||
#define KBC_VENDOR(x) ((x)->flags & KBC_VEN_MASK)
|
||||
|
||||
|
||||
typedef struct {
|
||||
@@ -1824,14 +1826,15 @@ add_data(atkbd_t *dev, uint8_t val)
|
||||
static void
|
||||
add_data_vals(atkbd_t *dev, uint8_t *val, uint8_t len)
|
||||
{
|
||||
int xt_mode = (keyboard_mode & 0x20) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF);
|
||||
int xt_mode = (keyboard_mode & 0x20) &&
|
||||
(KBC_TYPE(dev) < KBC_TYPE_PS2_NOREF);
|
||||
int translate = (keyboard_mode & 0x40);
|
||||
int i;
|
||||
uint8_t or = 0;
|
||||
uint8_t send;
|
||||
|
||||
translate = translate || (keyboard_mode & 0x40) || xt_mode;
|
||||
translate = translate || ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2);
|
||||
translate = translate || (KBC_TYPE(dev) == KBC_TYPE_PS2_2);
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
if (translate) {
|
||||
@@ -1867,13 +1870,14 @@ static void
|
||||
add_data_kbd(uint16_t val)
|
||||
{
|
||||
atkbd_t *dev = SavedKbd;
|
||||
int xt_mode = (keyboard_mode & 0x20) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF);
|
||||
int xt_mode = (keyboard_mode & 0x20) &&
|
||||
(KBC_TYPE(dev) < KBC_TYPE_PS2_NOREF);
|
||||
int translate = (keyboard_mode & 0x40);
|
||||
uint8_t fake_shift[4];
|
||||
uint8_t num_lock = 0, shift_states = 0;
|
||||
|
||||
translate = translate || (keyboard_mode & 0x40) || xt_mode;
|
||||
translate = translate || ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2);
|
||||
translate = translate || (KBC_TYPE(dev) == KBC_TYPE_PS2_2);
|
||||
|
||||
num_lock = !!(keyboard_get_state() & KBD_FLAG_NUM);
|
||||
shift_states = keyboard_get_shift() & STATE_SHIFT_MASK;
|
||||
@@ -1893,8 +1897,7 @@ add_data_kbd(uint16_t val)
|
||||
}
|
||||
|
||||
/* Test for T3100E 'Fn' key (Right Alt / Right Ctrl) */
|
||||
if ((dev != NULL) &&
|
||||
((dev->flags & KBC_VEN_MASK) == KBC_VEN_TOSHIBA) &&
|
||||
if ((dev != NULL) && (KBC_VENDOR(dev) == KBC_VEN_TOSHIBA) &&
|
||||
(keyboard_recv(0xb8) || keyboard_recv(0x9d))) switch (val) {
|
||||
case 0x4f: t3100e_notify_set(dev->func_priv, 0x01); break; /* End */
|
||||
case 0x50: t3100e_notify_set(dev->func_priv, 0x02); break; /* Down */
|
||||
@@ -2114,7 +2117,7 @@ write_cmd(atkbd_t *dev, uint8_t val)
|
||||
dev->wantirq = 0;
|
||||
|
||||
/* PS/2 type 2 keyboard controllers always force the XLAT bit to 0. */
|
||||
if ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2) {
|
||||
if (KBC_TYPE(dev) == KBC_TYPE_PS2_2) {
|
||||
val &= ~CCB_TRANSLATE;
|
||||
dev->mem[0] &= ~CCB_TRANSLATE;
|
||||
}
|
||||
@@ -2129,8 +2132,8 @@ write_cmd(atkbd_t *dev, uint8_t val)
|
||||
|
||||
/* ISA AT keyboard controllers use bit 5 for keyboard mode (1 = PC/XT, 2 = AT);
|
||||
PS/2 (and EISA/PCI) keyboard controllers use it as the PS/2 mouse enable switch. */
|
||||
if (((dev->flags & KBC_VEN_MASK) == KBC_VEN_AMI) ||
|
||||
((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) {
|
||||
if ((KBC_VENDOR(dev) == KBC_VEN_AMI) ||
|
||||
(KBC_TYPE(dev) >= KBC_TYPE_PS2_NOREF)) {
|
||||
keyboard_mode &= ~CCB_PCMODE;
|
||||
|
||||
mouse_scan = !(val & 0x20);
|
||||
@@ -2197,7 +2200,7 @@ write64_generic(void *priv, uint8_t val)
|
||||
|
||||
switch (val) {
|
||||
case 0xa4: /* check if password installed */
|
||||
if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) {
|
||||
if (KBC_TYPE(dev) >= KBC_TYPE_PS2_NOREF) {
|
||||
DEBUG("ATkbd: check if password installed\n");
|
||||
add_data(dev, 0xf1);
|
||||
return 0;
|
||||
@@ -2206,7 +2209,7 @@ write64_generic(void *priv, uint8_t val)
|
||||
break;
|
||||
|
||||
case 0xa7: /* disable mouse port */
|
||||
if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) {
|
||||
if (KBC_TYPE(dev) >= KBC_TYPE_PS2_NOREF) {
|
||||
DEBUG("ATkbd: disable mouse port\n");
|
||||
set_enable_mouse(dev, 0);
|
||||
return 0;
|
||||
@@ -2214,8 +2217,8 @@ write64_generic(void *priv, uint8_t val)
|
||||
ERRLOG("ATkbd: bad command A7\n");
|
||||
break;
|
||||
|
||||
case 0xa8: /*Enable mouse port*/
|
||||
if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) {
|
||||
case 0xa8: /* enable mouse port */
|
||||
if (KBC_TYPE(dev) >= KBC_TYPE_PS2_NOREF) {
|
||||
DEBUG("ATkbd: enable mouse port\n");
|
||||
set_enable_mouse(dev, 1);
|
||||
return 0;
|
||||
@@ -2223,9 +2226,9 @@ write64_generic(void *priv, uint8_t val)
|
||||
ERRLOG("ATkbd: bad command A8\n");
|
||||
break;
|
||||
|
||||
case 0xa9: /*Test mouse port*/
|
||||
case 0xa9: /* test mouse port */
|
||||
DEBUG("ATkbd: test mouse port\n");
|
||||
if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) {
|
||||
if (KBC_TYPE(dev) >= KBC_TYPE_PS2_NOREF) {
|
||||
if (mouse_write)
|
||||
add_data(dev, 0x00); /* no error */
|
||||
else
|
||||
@@ -2242,21 +2245,21 @@ write64_generic(void *priv, uint8_t val)
|
||||
|
||||
case 0xc0: /* read input port */
|
||||
DEBUG("ATkbd: read input port\n");
|
||||
if ((dev->flags & KBC_VEN_MASK) == KBC_VEN_IBM_PS1) {
|
||||
if (KBC_VENDOR(dev) == KBC_VEN_IBM_PS1) {
|
||||
current_drive = fdc_get_current_drive();
|
||||
add_data(dev, dev->input_port | 4 | (fdd_is_525(current_drive) ? 0x40 : 0x00));
|
||||
add_data(dev, dev->input_port | (fdd_is_525(current_drive) ? 0x40 : 0x00));
|
||||
dev->input_port = ((dev->input_port + 1) & 3) |
|
||||
(dev->input_port & 0xfc) |
|
||||
(fdd_is_525(current_drive) ? 0x40 : 0x00);
|
||||
} else {
|
||||
add_data(dev, dev->input_port | 4);
|
||||
add_data(dev, dev->input_port);
|
||||
dev->input_port = ((dev->input_port + 1) & 3) |
|
||||
(dev->input_port & 0xfc);
|
||||
}
|
||||
return 0;
|
||||
|
||||
case 0xd3: /* write mouse output buffer */
|
||||
if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) {
|
||||
if (KBC_TYPE(dev) >= KBC_TYPE_PS2_NOREF) {
|
||||
DEBUG("ATkbd: write mouse output buffer\n");
|
||||
dev->want60 = 1;
|
||||
return 0;
|
||||
@@ -2265,7 +2268,7 @@ write64_generic(void *priv, uint8_t val)
|
||||
|
||||
case 0xd4: /* write to mouse */
|
||||
#if 0
|
||||
if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) {
|
||||
if (KBC_TYPE(dev) >= KBC_TYPE_PS2_NOREF) {
|
||||
#endif
|
||||
DEBUG("ATkbd: write to mouse\n");
|
||||
dev->want60 = 1;
|
||||
@@ -2399,7 +2402,7 @@ write64_ami(void *priv, uint8_t val)
|
||||
return 0;
|
||||
|
||||
case 0xa2: /* clear keyboard controller lines P22/P23 */
|
||||
if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) {
|
||||
if (KBC_TYPE(dev) < KBC_TYPE_PS2_NOREF) {
|
||||
DEBUG("ATkbd: clear KBC lines P22/P23 (AMI)\n");
|
||||
write_output(dev, dev->output_port & 0xf3);
|
||||
add_data(dev, 0x00);
|
||||
@@ -2408,7 +2411,7 @@ write64_ami(void *priv, uint8_t val)
|
||||
break;
|
||||
|
||||
case 0xa3: /* set keyboard controller lines P22/P23 */
|
||||
if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) {
|
||||
if (KBC_TYPE(dev) < KBC_TYPE_PS2_NOREF) {
|
||||
DEBUG("ATkbd: set KBC lines P22/P23 (AMI)\n");
|
||||
write_output(dev, dev->output_port | 0x0c);
|
||||
add_data(dev, 0x00);
|
||||
@@ -2417,7 +2420,7 @@ write64_ami(void *priv, uint8_t val)
|
||||
break;
|
||||
|
||||
case 0xa4: /* write clock = low */
|
||||
if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) {
|
||||
if (KBC_TYPE(dev) < KBC_TYPE_PS2_NOREF) {
|
||||
DEBUG("ATkbd: write clock=low (AMI)\n");
|
||||
dev->ami_stat &= 0xfe;
|
||||
return 0;
|
||||
@@ -2425,7 +2428,7 @@ write64_ami(void *priv, uint8_t val)
|
||||
break;
|
||||
|
||||
case 0xa5: /* write clock = high */
|
||||
if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) {
|
||||
if (KBC_TYPE(dev) < KBC_TYPE_PS2_NOREF) {
|
||||
DEBUG("ATkbd: write clock=high (AMI)\n");
|
||||
dev->ami_stat |= 0x01;
|
||||
return 0;
|
||||
@@ -2433,7 +2436,7 @@ write64_ami(void *priv, uint8_t val)
|
||||
break;
|
||||
|
||||
case 0xa6: /* read clock */
|
||||
if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) {
|
||||
if (KBC_TYPE(dev) < KBC_TYPE_PS2_NOREF) {
|
||||
DEBUG("ATkbd: read clock (AMI)\n");
|
||||
add_data(dev, !!(dev->ami_stat & 1));
|
||||
return 0;
|
||||
@@ -2441,7 +2444,7 @@ write64_ami(void *priv, uint8_t val)
|
||||
break;
|
||||
|
||||
case 0xa7: /* write cache bad */
|
||||
if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) {
|
||||
if (KBC_TYPE(dev) < KBC_TYPE_PS2_NOREF) {
|
||||
DEBUG("ATkbd: write cache bad (AMI)\n");
|
||||
dev->ami_stat &= 0xfd;
|
||||
return 0;
|
||||
@@ -2449,7 +2452,7 @@ write64_ami(void *priv, uint8_t val)
|
||||
break;
|
||||
|
||||
case 0xa8: /* write cache good */
|
||||
if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) {
|
||||
if (KBC_TYPE(dev) < KBC_TYPE_PS2_NOREF) {
|
||||
DEBUG("ATkbd: write cache good (AMI)\n");
|
||||
dev->ami_stat |= 0x02;
|
||||
return 0;
|
||||
@@ -2457,7 +2460,7 @@ write64_ami(void *priv, uint8_t val)
|
||||
break;
|
||||
|
||||
case 0xa9: /* read cache */
|
||||
if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) {
|
||||
if (KBC_TYPE(dev) < KBC_TYPE_PS2_NOREF) {
|
||||
DEBUG("ATkbd: read cache (AMI)\n");
|
||||
add_data(dev, !!(dev->ami_stat & 2));
|
||||
return 0;
|
||||
@@ -2703,7 +2706,7 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
|
||||
int bad = 1;
|
||||
uint8_t mask;
|
||||
|
||||
if (((dev->flags & KBC_VEN_MASK) == KBC_VEN_XI8088) && (port == 0x63))
|
||||
if ((KBC_VENDOR(dev) == KBC_VEN_XI8088) && (port == 0x63))
|
||||
port = 0x61;
|
||||
|
||||
DBGLOG(2, "ATkbd: write(%04x, %02x)\n", port, val);
|
||||
@@ -2746,7 +2749,7 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
|
||||
|
||||
case 0xd3: /* write to mouse output buffer */
|
||||
DEBUG("ATkbd: write to mouse output buffer\n");
|
||||
if (mouse_write && ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF))
|
||||
if (mouse_write && (KBC_TYPE(dev) >= KBC_TYPE_PS2_NOREF))
|
||||
keyboard_at_adddata_mouse(val);
|
||||
break;
|
||||
|
||||
@@ -2757,9 +2760,9 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
|
||||
break;
|
||||
|
||||
set_enable_mouse(dev, 1);
|
||||
if (mouse_write && ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF))
|
||||
if (mouse_write && (KBC_TYPE(dev) >= KBC_TYPE_PS2_NOREF))
|
||||
mouse_write(val, mouse_p);
|
||||
else if (!mouse_write && ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF))
|
||||
else if (!mouse_write && (KBC_TYPE(dev) >= KBC_TYPE_PS2_NOREF))
|
||||
keyboard_at_adddata_mouse(0xff);
|
||||
break;
|
||||
|
||||
@@ -2991,9 +2994,8 @@ do_command:
|
||||
speaker_was_enable = 1;
|
||||
pit_set_gate(&pit, 2, val & 1);
|
||||
|
||||
if ((dev->flags & KBC_VEN_MASK) == KBC_VEN_XI8088) {
|
||||
if (KBC_VENDOR(dev) == KBC_VEN_XI8088)
|
||||
dev->write_func(dev->func_priv, !!(val & 0x04));
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x64:
|
||||
@@ -3027,7 +3029,7 @@ do_command:
|
||||
|
||||
case 0xaa: /* self-test */
|
||||
DEBUG("ATkbd: self-test\n");
|
||||
if ((dev->flags & KBC_VEN_MASK) == KBC_VEN_TOSHIBA)
|
||||
if (KBC_VENDOR(dev) == KBC_VEN_TOSHIBA)
|
||||
dev->status |= STAT_IFULL;
|
||||
if (! dev->initialized) {
|
||||
dev->initialized = 1;
|
||||
@@ -3037,7 +3039,7 @@ do_command:
|
||||
dev->status |= STAT_SYSFLAG;
|
||||
dev->mem[0] |= 0x04;
|
||||
set_enable_kbd(dev, 1);
|
||||
if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)
|
||||
if (KBC_TYPE(dev) >= KBC_TYPE_PS2_NOREF)
|
||||
set_enable_mouse(dev, 1);
|
||||
write_output(dev, 0xcf);
|
||||
add_data(dev, 0x55);
|
||||
@@ -3072,7 +3074,7 @@ do_command:
|
||||
mask = 0xff;
|
||||
if (! keyboard_scan)
|
||||
mask &= 0xbf;
|
||||
if (!mouse_scan && ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF))
|
||||
if (!mouse_scan && (KBC_TYPE(dev) >= KBC_TYPE_PS2_NOREF))
|
||||
mask &= 0xf7;
|
||||
add_data(dev, dev->output_port & mask);
|
||||
break;
|
||||
@@ -3136,7 +3138,7 @@ kbd_read(uint16_t port, void *priv)
|
||||
atkbd_t *dev = (atkbd_t *)priv;
|
||||
uint8_t ret = 0xff;
|
||||
|
||||
if (((dev->flags & KBC_VEN_MASK) == KBC_VEN_XI8088) && (port == 0x63))
|
||||
if ((KBC_VENDOR(dev) == KBC_VEN_XI8088) && (port == 0x63))
|
||||
port = 0x61;
|
||||
|
||||
switch (port) {
|
||||
@@ -3153,13 +3155,13 @@ kbd_read(uint16_t port, void *priv)
|
||||
ret = ppi.pb & ~0xe0;
|
||||
if (ppispeakon)
|
||||
ret |= 0x20;
|
||||
if ((dev->flags & KBC_TYPE_MASK) > KBC_TYPE_PS2_NOREF) {
|
||||
if (KBC_TYPE(dev) > KBC_TYPE_PS2_NOREF) {
|
||||
if (dev->refresh)
|
||||
ret |= 0x10;
|
||||
else
|
||||
ret &= ~0x10;
|
||||
}
|
||||
if ((dev->flags & KBC_VEN_MASK) == KBC_VEN_XI8088) {
|
||||
if (KBC_VENDOR(dev) == KBC_VEN_XI8088) {
|
||||
if (dev->read_func(dev->func_priv))
|
||||
ret |= 0x04;
|
||||
else
|
||||
@@ -3214,10 +3216,13 @@ kbd_reset(void *priv)
|
||||
dev->key_wantdata = 0;
|
||||
|
||||
/* Set up the correct Video Type bits. */
|
||||
if ((dev->flags & KBC_VEN_MASK) == KBC_VEN_XI8088)
|
||||
if (KBC_VENDOR(dev) == KBC_VEN_XI8088)
|
||||
dev->input_port = (video_type() == VID_TYPE_MDA) ? 0xb0 : 0xf0;
|
||||
else
|
||||
dev->input_port = (video_type() == VID_TYPE_MDA) ? 0xf0 : 0xb0;
|
||||
|
||||
/* For now, always assume high-speed mode. */
|
||||
dev->input_port |= 0x04;
|
||||
DEBUG("ATkbd: input port = %02x\n", dev->input_port);
|
||||
|
||||
keyboard_mode = 0x02 | dev->dtrans;
|
||||
@@ -3274,7 +3279,7 @@ kbd_init(const device_t *info, UNUSED(void *parent))
|
||||
|
||||
timer_add(kbd_poll, dev, &keyboard_delay, TIMER_ALWAYS_ENABLED);
|
||||
|
||||
if ((dev->flags & KBC_TYPE_MASK) > KBC_TYPE_PS2_NOREF)
|
||||
if (KBC_TYPE(dev) > KBC_TYPE_PS2_NOREF)
|
||||
timer_add(kbd_refresh, dev, &dev->refresh_time, TIMER_ALWAYS_ENABLED);
|
||||
|
||||
timer_add(pulse_poll, dev, &dev->pulse_cb, &dev->pulse_cb);
|
||||
@@ -3282,7 +3287,7 @@ kbd_init(const device_t *info, UNUSED(void *parent))
|
||||
dev->write60_ven = NULL;
|
||||
dev->write64_ven = NULL;
|
||||
|
||||
switch(dev->flags & KBC_VEN_MASK) {
|
||||
switch(KBC_VENDOR(dev)) {
|
||||
case KBC_VEN_GENERIC:
|
||||
case KBC_VEN_IBM_PS1:
|
||||
dev->write64_ven = write64_generic;
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
* The lower half of the driver can interface to the host system
|
||||
* serial ports, or other channels, for real-world access.
|
||||
*
|
||||
* Version: @(#)serial.c 1.0.15 2019/04/25
|
||||
* Version: @(#)serial.c 1.0.16 2019/04/30
|
||||
*
|
||||
* Author: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
*
|
||||
@@ -317,23 +317,22 @@ read_fifo(serial_t *dev)
|
||||
dev->fifo_read = 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* If we have more, generate (new) int. */
|
||||
if (sp->fifo_read != sp->fifo_write) {
|
||||
#if 1
|
||||
sp->delay = 1000*TIMER_USEC;
|
||||
/* If we have more, generate (new) int. */
|
||||
if (dev->fifo_read != dev->fifo_write) {
|
||||
#if 1
|
||||
dev->delay = 1000*TIMER_USEC;
|
||||
#else
|
||||
if (sp->bh != NULL) {
|
||||
sp->int_status |= SERINT_RECEIVE;
|
||||
sp->lsr |= LSR_DR;
|
||||
if (dev->bh != NULL) {
|
||||
dev->int_status |= SERINT_RECEIVE;
|
||||
dev->lsr |= LSR_DR;
|
||||
|
||||
/* Update interrupt state. */
|
||||
update_ints(sp);
|
||||
update_ints(dev);
|
||||
} else {
|
||||
sp->delay = 1000*TIMER_USEC;
|
||||
dev->delay = 1000*TIMER_USEC;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -429,17 +428,17 @@ ser_write(uint16_t addr, uint8_t val, void *priv)
|
||||
/* DLAB clear, regular data write. */
|
||||
dev->thr = val;
|
||||
|
||||
if (dev->ops && dev->ops->write) {
|
||||
dev->ops->write(dev, dev->ops_arg, dev->thr);
|
||||
#ifdef USE_HOST_SERIAL
|
||||
if (dev->bh != NULL) {
|
||||
} else if (dev->bh != NULL) {
|
||||
/* We are linked, so send to BH layer. */
|
||||
plat_serial_write(dev->bh, dev->thr);
|
||||
} else
|
||||
#endif
|
||||
|
||||
if (dev->ops && dev->ops->write)
|
||||
dev->ops->write(dev, dev->ops_arg, val);
|
||||
}
|
||||
|
||||
/* WRITE completed, we are ready for more. */
|
||||
//FIXME: add a callback delay here.
|
||||
dev->lsr |= LSR_THRE;
|
||||
dev->int_status |= SER_INT_TX;
|
||||
update_ints(dev);
|
||||
@@ -467,8 +466,12 @@ ser_write(uint16_t addr, uint8_t val, void *priv)
|
||||
|
||||
case 2: /* FCR */
|
||||
if (dev->type >= UART_TYPE_16550) {
|
||||
pclog(0,"Serial%i: tried to enable FIFO (%02x), type %d!\n", dev->port, val, dev->type);
|
||||
INFO("Serial%i: enable FIFO (%02x), type %i!\n", dev->port, val, dev->type);
|
||||
dev->fcr = val;
|
||||
if (val == 0x00)
|
||||
dev->iir &= ~IIR_FIFOENB; /* off */
|
||||
else
|
||||
dev->iir |= IIR_FIFOENB; /* enabled */
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -507,10 +510,12 @@ pclog(0,"Serial%i: tried to enable FIFO (%02x), type %d!\n", dev->port, val, dev
|
||||
break;
|
||||
|
||||
case 4: /* MCR */
|
||||
#if 0
|
||||
if (dev->bh == NULL) {
|
||||
/* Not linked, force LOOPBACK mode. */
|
||||
val |= MCR_LMS;
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((val & MCR_RTS) && !(dev->mcr & MCR_RTS)) {
|
||||
/*
|
||||
@@ -686,6 +691,8 @@ ser_read(uint16_t addr, void *priv)
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
DEBUG("Serial%i: read(%i) = %02x\n", dev->port, (addr & 0x0007), ret);
|
||||
|
||||
return(ret);
|
||||
}
|
||||
@@ -780,7 +787,11 @@ serial_reset(void)
|
||||
dev = &ports[i];
|
||||
memset(dev, 0x00, sizeof(serial_t));
|
||||
dev->port = i;
|
||||
#if 1
|
||||
dev->type = UART_TYPE_16550;
|
||||
#else
|
||||
dev->type = UART_TYPE_8250;
|
||||
#endif
|
||||
|
||||
/* Set up default port and IRQ for the device. */
|
||||
switch(i) {
|
||||
@@ -820,8 +831,8 @@ serial_setup(int id, uint16_t port, int8_t irq)
|
||||
{
|
||||
serial_t *dev = &ports[id];
|
||||
|
||||
INFO("SERIAL: setting up COM%i as %04X [enabled=%i]\n",
|
||||
id+1, port, serial_enabled[id]);
|
||||
INFO("SERIAL: setting up COM%i as %04X,%i [enabled=%i]\n",
|
||||
id+1, port, irq, serial_enabled[id]);
|
||||
|
||||
if (! serial_enabled[id]) return;
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Emulation of the 3DFX Voodoo Graphics controller.
|
||||
*
|
||||
* Version: @(#)vid_voodoo.c 1.0.19 2019/04/25
|
||||
* Version: @(#)vid_voodoo.c 1.0.20 2019/04/30
|
||||
*
|
||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -424,7 +424,7 @@ typedef struct voodoo_t
|
||||
int dst_stride;
|
||||
} blt;
|
||||
|
||||
rgbp_t clutData[33];
|
||||
rgbp_t clutData[64];
|
||||
int clutData_dirty;
|
||||
rgbp_t clutData256[256];
|
||||
uint32_t video_16to32[0x10000];
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
*
|
||||
* This works around the timing loop mentioned above.
|
||||
*
|
||||
* Version: @(#)m_ps2_mca.c 1.0.24 2019/04/29
|
||||
* Version: @(#)m_ps2_mca.c 1.0.24 2019/04/30
|
||||
*
|
||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -550,7 +550,10 @@ model_50_init(ps2_t *dev)
|
||||
dev->planar_write = model_50_write;
|
||||
|
||||
if (mem_size > 2048) {
|
||||
/* Only 2 MB supported on planar, create a memory expansion card for the rest */
|
||||
/*
|
||||
* The M50 planar only supports up to 2 MB.
|
||||
* If we have more, create a memory expansion card for the rest.
|
||||
*/
|
||||
mem_fffc_init(dev, 2);
|
||||
}
|
||||
|
||||
@@ -1437,10 +1440,12 @@ ps2_init(const device_t *info, void *arg)
|
||||
machine_common_init();
|
||||
|
||||
dma16_init();
|
||||
pic2_init();
|
||||
ps2_dma_init();
|
||||
pic2_init();
|
||||
pit_ps2_init();
|
||||
|
||||
nmi_mask = 0x80;
|
||||
|
||||
device_add(&ps_nvr_device);
|
||||
|
||||
device_add(&fdc_at_device);
|
||||
@@ -1451,8 +1456,6 @@ ps2_init(const device_t *info, void *arg)
|
||||
|
||||
port_92_add(0);
|
||||
|
||||
nmi_mask = 0x80;
|
||||
|
||||
io_sethandler(0x0091, 1,
|
||||
ps2_mca_read,NULL,NULL, ps2_mca_write,NULL,NULL, dev);
|
||||
io_sethandler(0x0094, 1,
|
||||
|
||||
4
src/pc.c
4
src/pc.c
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Main emulator module where most things are controlled.
|
||||
*
|
||||
* Version: @(#)pc.c 1.0.72 2019/04/29
|
||||
* Version: @(#)pc.c 1.0.73 2019/04/30
|
||||
*
|
||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -771,7 +771,7 @@ pc_set_speed(int turbo)
|
||||
* For PC and XT class, this will return max speed.
|
||||
*/
|
||||
speed = machine_get_speed(turbo);
|
||||
INFO("PC: set_speed(%i) -> speed %lu\n", turbo, speed);
|
||||
DEBUG("PC: set_speed(%i) -> speed %lu\n", turbo, speed);
|
||||
|
||||
if (cpu_get_type() >= CPU_286) {
|
||||
/* For 286+, we are done. */
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Handling of ROM image files.
|
||||
*
|
||||
* Version: @(#)rom.c 1.0.18 2019/04/11
|
||||
* Version: @(#)rom.c 1.0.19 2019/04/30
|
||||
*
|
||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -193,7 +193,7 @@ rom_add_upper_bios(void)
|
||||
mem_map_add(&bios_mapping[i], base, size,
|
||||
rom_bios_read,rom_bios_readw,rom_bios_readl,
|
||||
mem_write_null,mem_write_nullw,mem_write_nulll,
|
||||
bios + ((0x10000 + (size * i)) & biosmask),
|
||||
bios + ((size * i) & biosmask),
|
||||
MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM, 0);
|
||||
base += size;
|
||||
}
|
||||
@@ -228,7 +228,8 @@ rom_add_bios(void)
|
||||
mem_map_add(&bios_high_mapping[i], hibase, size,
|
||||
rom_bios_read,rom_bios_readw,rom_bios_readl,
|
||||
mem_write_null,mem_write_nullw,mem_write_nulll,
|
||||
bios + ((size * i) & biosmask), MEM_MAPPING_ROM, 0);
|
||||
bios + ((size * i) & biosmask),
|
||||
MEM_MAPPING_ROM, 0);
|
||||
hibase += size;
|
||||
}
|
||||
}
|
||||
@@ -282,7 +283,6 @@ rom_load_interleaved(const wchar_t *fnl, const wchar_t *fnh, uint32_t addr, int
|
||||
addr = 0;
|
||||
else
|
||||
addr &= 0x03ffff;
|
||||
INFO("ROM: loading %i bytes at %06lx\n", sz, addr);
|
||||
|
||||
(void)fseek(fl, off, SEEK_SET);
|
||||
(void)fseek(fh, off, SEEK_SET);
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
* or to use a generic handler, and then pass it a pointer
|
||||
* to a command table. For now, we don't.
|
||||
*
|
||||
* Version: @(#)rom_load.c 1.0.14 2019/03/17
|
||||
* Version: @(#)rom_load.c 1.0.15 2019/04/30
|
||||
*
|
||||
* Author: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
*
|
||||
@@ -385,20 +385,20 @@ rom_load_bios(romdef_t *r, const wchar_t *fn, int test_only)
|
||||
return(1);
|
||||
|
||||
/* Show the resulting data. */
|
||||
INFO("Size : %lu\n", r->total);
|
||||
INFO("Offset : 0x%06lx (%lu)\n", r->offset, r->offset);
|
||||
INFO("Mode : %s\n", (r->mode == 1)?"interleaved":"linear");
|
||||
INFO("Files : %i\n", r->nfiles);
|
||||
INFO(" Size : %lu\n", r->total);
|
||||
INFO(" Offset : 0x%06lx (%lu)\n", r->offset, r->offset);
|
||||
INFO(" Mode : %s\n", (r->mode == 1)?"interleaved":"linear");
|
||||
INFO(" Files : %i\n", r->nfiles);
|
||||
for (c = 0; c < r->nfiles; c++) {
|
||||
INFO("%c[%i] : '%ls', %i, 0x%06lx, %i\n",
|
||||
INFO(" %c[%i] : '%ls', %i, 0x%06lx, %i\n",
|
||||
(r->files[c].offset==0xffffffff)?'*':' ', c+1,
|
||||
r->files[c].path, r->files[c].skip,
|
||||
r->files[c].offset, r->files[c].size);
|
||||
}
|
||||
if (r->fontnum != -1)
|
||||
INFO("Font : %i, '%ls'\n", r->fontnum, r->fontfn);
|
||||
INFO(" Font : %i, '%ls'\n", r->fontnum, r->fontfn);
|
||||
if (r->vidsz != 0)
|
||||
INFO("VideoBIOS: '%ls', %i\n", r->vidfn, r->vidsz);
|
||||
INFO(" VideoBIOS: '%ls', %i\n", r->vidfn, r->vidsz);
|
||||
|
||||
/* Actually perform the work. */
|
||||
switch(r->mode) {
|
||||
@@ -428,7 +428,6 @@ rom_load_bios(romdef_t *r, const wchar_t *fn, int test_only)
|
||||
|
||||
pc_path(script, sizeof_w(script), r->files[c].path);
|
||||
pc_path(temp, sizeof_w(temp), r->files[c+1].path);
|
||||
INFO("ROM: loading '%ls'/'%ls' at %06lx, size=%i, skip=%i\n", script, temp, r->files[c].offset, r->files[c].size, r->files[c].skip);
|
||||
|
||||
i = rom_load_interleaved(script, temp,
|
||||
r->files[c].offset,
|
||||
@@ -445,20 +444,6 @@ INFO("ROM: loading '%ls'/'%ls' at %06lx, size=%i, skip=%i\n", script, temp, r->f
|
||||
else
|
||||
biosmask = 0x00ffff;
|
||||
|
||||
#if defined(WALTJE) && defined(_DEBUG)
|
||||
//FIXME: this will go away again!
|
||||
{
|
||||
char foo[32768];
|
||||
INFO("ROM loaded, total=%i, mask=%06x\n", r->total, biosmask);
|
||||
pclog_repeat(0);
|
||||
for (i = 0; i < r->total; i += 4096) {
|
||||
hexdump_p(foo, i, &bios[i], 4096);
|
||||
pclog(0, foo);
|
||||
}
|
||||
pclog_repeat(1);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Create a full pathname for the video font file. */
|
||||
if (r->fontnum != -1) {
|
||||
plat_append_filename(temp, path, r->fontfn);
|
||||
@@ -471,7 +456,7 @@ pclog_repeat(1);
|
||||
pc_path(r->vidfn, sizeof_w(r->vidfn), temp);
|
||||
}
|
||||
|
||||
INFO("ROM: tot %lu, mask 0x%06lx\n", r->total, biosmask);
|
||||
INFO("ROM: total %lu, mask 0x%06lx\n", r->total, biosmask);
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Misc stuff for UI, doesn't fit anywhere else..
|
||||
*
|
||||
* Version: @(#)ui_misc.c 1.0.3 2019/04/26
|
||||
* Version: @(#)ui_misc.c 1.0.4 2019/04/30
|
||||
*
|
||||
* Author: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
*
|
||||
@@ -61,8 +61,11 @@ ui_set_kbd_state(int flags)
|
||||
/* First of all, update our status bar. */
|
||||
ui_sb_kbstate(flags);
|
||||
|
||||
#if 0
|
||||
//FIXME: not yet.
|
||||
/* Let the platform code try to update the host keyboard. */
|
||||
plat_set_kbd_state(flags);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Handle the various video renderer modules.
|
||||
*
|
||||
* Version: @(#)ui_vidapi.c 1.0.6 2019/04/29
|
||||
* Version: @(#)ui_vidapi.c 1.0.6 2019/04/30
|
||||
*
|
||||
* Author: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
*
|
||||
@@ -119,7 +119,7 @@ vidapi_set(int api)
|
||||
{
|
||||
int i;
|
||||
|
||||
INFO("Initializing VIDAPI: api=%d\n", api);
|
||||
INFO("VIDAPI: initializing (api=%i)\n", api);
|
||||
|
||||
/* Lock the blitter. */
|
||||
plat_startblit();
|
||||
@@ -218,7 +218,7 @@ vidapi_screenshot(void)
|
||||
struct tm *info;
|
||||
time_t now;
|
||||
|
||||
DEBUG("Screenshot: video API is: %i\n", vid_api);
|
||||
DEBUG("VIDAPI: screenshot (api=%i)\n", vid_api);
|
||||
|
||||
if (vid_api < 0) return;
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Platform main support module for Windows.
|
||||
*
|
||||
* Version: @(#)win.c 1.0.27 2019/03/05
|
||||
* Version: @(#)win.c 1.0.28 2019/04/30
|
||||
*
|
||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -290,7 +290,7 @@ plat_start(void)
|
||||
timeBeginPeriod(1);
|
||||
QueryPerformanceFrequency(&qpc);
|
||||
freq = qpc.QuadPart;
|
||||
INFO("Main timer precision: %llu\n", freq);
|
||||
DEBUG("WIN: main timer precision: %llu\n", freq);
|
||||
|
||||
/* Start the emulator, really. */
|
||||
thMain = thread_create(pc_thread, &quited);
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Implementation of the Settings dialog.
|
||||
*
|
||||
* Version: @(#)win_settings_floppy.h 1.0.11 2019/03/21
|
||||
* Version: @(#)win_settings_floppy.h 1.0.12 2019/04/30
|
||||
*
|
||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -252,11 +252,10 @@ floppy_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
|
||||
if ((((LPNMHDR)lParam)->code == LVN_ITEMCHANGED) && (((LPNMHDR)lParam)->idFrom == IDC_LIST_FLOPPY_DRIVES)) {
|
||||
old_sel = fdlv_current_sel;
|
||||
h = GetDlgItem(hdlg, IDC_LIST_FLOPPY_DRIVES);
|
||||
fdlv_current_sel = floppy_get_selected(hdlg);
|
||||
if (fdlv_current_sel == old_sel) {
|
||||
if (fdlv_current_sel == old_sel)
|
||||
return FALSE;
|
||||
} else if (fdlv_current_sel == -1) {
|
||||
if (fdlv_current_sel == -1) {
|
||||
fd_ignore_change = 1;
|
||||
fdlv_current_sel = old_sel;
|
||||
ListView_SetItemState(h, fdlv_current_sel, LVIS_FOCUSED | LVIS_SELECTED, 0x000F);
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Implement the user Interface module.
|
||||
*
|
||||
* Version: @(#)win_ui.c 1.0.36 2019/04/29
|
||||
* Version: @(#)win_ui.c 1.0.37 2019/04/30
|
||||
*
|
||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -1077,7 +1077,9 @@ plat_set_kbd_state(int flags)
|
||||
kbdata[0].type = kbdata[1].type = INPUT_KEYBOARD;
|
||||
kbdata[1].ki.dwFlags = KEYEVENTF_KEYUP;
|
||||
|
||||
INFO("WIN kbd_state(%04x) [%04x] focus=%d\n" , flags, kbd_flags, infocus);
|
||||
DEBUG("WIN: set_kbd_state(%04x) [%04x] focus=%d\n",
|
||||
flags, kbd_flags, infocus);
|
||||
|
||||
if (kbd_flags != flags) {
|
||||
/* Save the new flags. */
|
||||
kbd_flags = flags;
|
||||
|
||||
Reference in New Issue
Block a user