From f56cb9eec899c441261ecadcfcdf6be06a5075dc Mon Sep 17 00:00:00 2001 From: waltje Date: Tue, 30 Apr 2019 21:18:29 -0500 Subject: [PATCH] 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.) --- .travis-build.sh | 1 + src/cpu/386_ops.h | 5 +- src/devices/input/keyboard_at.c | 93 +++++++++++++++++---------------- src/devices/ports/serial.c | 49 ++++++++++------- src/devices/video/vid_voodoo.c | 4 +- src/machines/m_ps2_mca.c | 13 +++-- src/pc.c | 4 +- src/rom.c | 8 +-- src/rom_load.c | 33 ++++-------- src/ui/ui_misc.c | 5 +- src/ui/ui_vidapi.c | 6 +-- src/win/win.c | 4 +- src/win/win_settings_floppy.h | 7 ++- src/win/win_ui.c | 6 ++- 14 files changed, 124 insertions(+), 114 deletions(-) diff --git a/.travis-build.sh b/.travis-build.sh index 8a0f4a8..6afe8ea 100644 --- a/.travis-build.sh +++ b/.travis-build.sh @@ -66,6 +66,7 @@ # Build the project. echo ; echo "Building VARCem #${TRAVIS_BUILD_NUMBER} target ${TARGET}" + echo "Options selected: ${OPTS}" cd src diff --git a/src/cpu/386_ops.h b/src/cpu/386_ops.h index 0b8fa8c..c13673a 100644 --- a/src/cpu/386_ops.h +++ b/src/cpu/386_ops.h @@ -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, * Sarah Walker, @@ -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; } diff --git a/src/devices/input/keyboard_at.c b/src/devices/input/keyboard_at.c index 3009f2c..35ff2f3 100644 --- a/src/devices/input/keyboard_at.c +++ b/src/devices/input/keyboard_at.c @@ -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, * Miran Grca, @@ -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; diff --git a/src/devices/ports/serial.c b/src/devices/ports/serial.c index 07b2821..3389164 100644 --- a/src/devices/ports/serial.c +++ b/src/devices/ports/serial.c @@ -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, * @@ -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; diff --git a/src/devices/video/vid_voodoo.c b/src/devices/video/vid_voodoo.c index 28cfea5..8af01bd 100644 --- a/src/devices/video/vid_voodoo.c +++ b/src/devices/video/vid_voodoo.c @@ -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, * Miran Grca, @@ -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]; diff --git a/src/machines/m_ps2_mca.c b/src/machines/m_ps2_mca.c index 27750a2..61d03b1 100644 --- a/src/machines/m_ps2_mca.c +++ b/src/machines/m_ps2_mca.c @@ -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, * Miran Grca, @@ -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, diff --git a/src/pc.c b/src/pc.c index e737f24..d334a28 100644 --- a/src/pc.c +++ b/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, * Miran Grca, @@ -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. */ diff --git a/src/rom.c b/src/rom.c index 4a42023..55fdfbb 100644 --- a/src/rom.c +++ b/src/rom.c @@ -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, * Miran Grca, @@ -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); diff --git a/src/rom_load.c b/src/rom_load.c index bd67c06..ade43d3 100644 --- a/src/rom_load.c +++ b/src/rom_load.c @@ -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, * @@ -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); } diff --git a/src/ui/ui_misc.c b/src/ui/ui_misc.c index 6ad03b0..6dfff70 100644 --- a/src/ui/ui_misc.c +++ b/src/ui/ui_misc.c @@ -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, * @@ -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 } diff --git a/src/ui/ui_vidapi.c b/src/ui/ui_vidapi.c index e2b10b4..887685d 100644 --- a/src/ui/ui_vidapi.c +++ b/src/ui/ui_vidapi.c @@ -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, * @@ -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; diff --git a/src/win/win.c b/src/win/win.c index 5bbc7fb..cebda20 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -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, * Miran Grca, @@ -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); diff --git a/src/win/win_settings_floppy.h b/src/win/win_settings_floppy.h index 4c6f528..934a1b7 100644 --- a/src/win/win_settings_floppy.h +++ b/src/win/win_settings_floppy.h @@ -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, * Miran Grca, @@ -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); diff --git a/src/win/win_ui.c b/src/win/win_ui.c index ddc0375..5cf7d63 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -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, * Miran Grca, @@ -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;