From 636fcfbacb335e7779ddef6e5149df3d6fb5eee6 Mon Sep 17 00:00:00 2001 From: waltje Date: Sun, 28 Apr 2019 00:54:35 -0500 Subject: [PATCH] Many more cleanups all over, renaming variables for consistency etc. More cleanups in the keyboard drivers, especially the AT one (with new changes from 86Box.) Small update to fix the CD sound volume when using SoundBlaster. --- src/devices/floppy/fdc.c | 20 +- src/devices/floppy/fdc.h | 4 +- src/devices/input/keyboard.h | 10 +- src/devices/input/keyboard_at.c | 1330 +++++++++++++++------------- src/devices/input/mouse_bus.c | 7 +- src/devices/sound/snd_sb.c | 15 +- src/devices/video/vid_svga.c | 6 +- src/devices/video/vid_ti_cf62011.c | 4 +- src/devices/video/vid_vga.c | 10 +- src/devices/video/video.h | 8 +- src/machines/m_ps1.c | 6 +- src/machines/m_ps2_isa.c | 6 +- src/machines/m_ps2_mca.c | 16 +- src/plat.h | 5 +- src/ui/ui_misc.c | 5 +- src/win/win_d2d.cpp | 35 +- src/win/win_ui.c | 75 +- 17 files changed, 841 insertions(+), 721 deletions(-) diff --git a/src/devices/floppy/fdc.c b/src/devices/floppy/fdc.c index 86fdb2d..06de91b 100644 --- a/src/devices/floppy/fdc.c +++ b/src/devices/floppy/fdc.c @@ -9,7 +9,7 @@ * Implementation of the NEC uPD-765 and compatible floppy disk * controller. * - * Version: @(#)fdc.c 1.0.21 2019/04/25 + * Version: @(#)fdc.c 1.0.22 2019/04/27 * * Authors: Miran Grca, * Sarah Walker, @@ -132,23 +132,9 @@ fdc_log(int level, const char *fmt, ...) uint8_t -fdc_ps1_525(void) +fdc_get_current_drive(void) { -#if 1 - return fdd_is_525(current_drive) ? 0x40 : 0x00; -#else - switch (romset) { - case ROM_IBMPS1_2011: - case ROM_IBMPS1_2121: - case ROM_IBMPS1_2121_ISA: - return fdd_is_525(current_drive) ? 0x40 : 0x00; - - default: - break; - } - - return(0x00); -#endif + return current_drive; } diff --git a/src/devices/floppy/fdc.h b/src/devices/floppy/fdc.h index 4589491..f5eff55 100644 --- a/src/devices/floppy/fdc.h +++ b/src/devices/floppy/fdc.h @@ -9,7 +9,7 @@ * Implementation of the NEC uPD-765 and compatible floppy disk * controller. * - * Version: @(#)fdc.h 1.0.5 2018/10/19 + * Version: @(#)fdc.h 1.0.6 2019/04/27 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -193,7 +193,7 @@ extern void fdc_sectorid(fdc_t *fdc, uint8_t track, uint8_t side, extern uint8_t fdc_read(uint16_t addr, void *priv); extern void fdc_reset(void *priv); -extern uint8_t fdc_ps1_525(void); +extern uint8_t fdc_get_current_drive(void); #endif /*EMU_FDC_H*/ diff --git a/src/devices/input/keyboard.h b/src/devices/input/keyboard.h index 61008c7..b439701 100644 --- a/src/devices/input/keyboard.h +++ b/src/devices/input/keyboard.h @@ -8,7 +8,7 @@ * * Definitions for the keyboard interface. * - * Version: @(#)keyboard.h 1.0.13 2019/04/26 + * Version: @(#)keyboard.h 1.0.14 2019/04/27 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -94,14 +94,16 @@ extern const device_t keyboard_at_ami_device; extern const device_t keyboard_at_toshiba_device; extern const device_t keyboard_ps2_device; +extern const device_t keyboard_ps2_pci_device; +extern const device_t keyboard_ps2_ps1_device; +extern const device_t keyboard_ps2_ps2_device; extern const device_t keyboard_ps2_acer_device; -extern const device_t keyboard_ps2_xi8088_device; extern const device_t keyboard_ps2_ami_device; +extern const device_t keyboard_ps2_ami_pci_device; extern const device_t keyboard_ps2_mca_device; extern const device_t keyboard_ps2_mca_2_device; extern const device_t keyboard_ps2_quadtel_device; -extern const device_t keyboard_ps2_pci_device; -extern const device_t keyboard_ps2_ami_pci_device; +extern const device_t keyboard_ps2_xi8088_device; #endif extern void (*keyboard_send)(uint16_t val); diff --git a/src/devices/input/keyboard_at.c b/src/devices/input/keyboard_at.c index 80122fa..3009f2c 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.25 2019/04/26 + * Version: @(#)keyboard_at.c 1.0.26 2019/04/27 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -97,9 +97,10 @@ #define CCB_MASK 0x68 #define MODE_MASK 0x6c -#define KBC_TYPE_ISA 0x00 -#define KBC_TYPE_PS2_1 0x01 -#define KBC_TYPE_PS2_2 0x02 +#define KBC_TYPE_ISA 0x00 /* AT ISA-based chips */ +#define KBC_TYPE_PS2_NOREF 0x01 /* PS2 type, no refresh */ +#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_VEN_GENERIC 0x00 @@ -108,7 +109,8 @@ #define KBC_VEN_QUADTEL 0x0c #define KBC_VEN_TOSHIBA 0x10 #define KBC_VEN_XI8088 0x14 -#define KBC_VEN_ACER 0x18 +#define KBC_VEN_IBM_PS1 0x18 +#define KBC_VEN_ACER 0x1c #define KBC_VEN_MASK 0x1c @@ -181,7 +183,7 @@ static uint8_t mouse_queue[16]; static void (*mouse_write)(uint8_t val, void *priv) = NULL; static void *mouse_p = NULL; static uint8_t sc_or = 0; -static atkbd_t *CurrentKbd = NULL; // FIXME: remove!!! --FvK +static atkbd_t *SavedKbd = NULL; // FIXME: remove!!! --FvK /* Non-translated to translated scan codes. */ @@ -1724,7 +1726,7 @@ static const scancode_t scancode_set3[512] = { static void -kbd_setmap(atkbd_t *kbd) +set_scancode_map(atkbd_t *dev) { switch (keyboard_mode & 3) { #if USE_SET1 @@ -1756,80 +1758,80 @@ kbd_setmap(atkbd_t *kbd) static void kbd_poll(void *priv) { - atkbd_t *kbd = (atkbd_t *)priv; + atkbd_t *dev = (atkbd_t *)priv; keyboard_delay += (1000LL * TIMER_USEC); - if ((kbd->out_new != -1) && !kbd->last_irq) { - kbd->wantirq = 0; - if (kbd->out_new & 0x100) { + if ((dev->out_new != -1) && !dev->last_irq) { + dev->wantirq = 0; + if (dev->out_new & 0x100) { DEBUG("ATkbd: want mouse data\n"); - if (kbd->mem[0] & 0x02) + if (dev->mem[0] & 0x02) picint(0x1000); - kbd->out = kbd->out_new & 0xff; - kbd->out_new = -1; - kbd->status |= STAT_OFULL; - kbd->status &= ~STAT_IFULL; - kbd->status |= STAT_MFULL; - kbd->last_irq = 0x1000; + dev->out = dev->out_new & 0xff; + dev->out_new = -1; + dev->status |= STAT_OFULL; + dev->status &= ~STAT_IFULL; + dev->status |= STAT_MFULL; + dev->last_irq = 0x1000; } else { DEBUG("ATkbd: want keyboard data\n"); - if (kbd->mem[0] & 0x01) + if (dev->mem[0] & 0x01) picint(2); - kbd->out = kbd->out_new & 0xff; - kbd->out_new = -1; - kbd->status |= STAT_OFULL; - kbd->status &= ~STAT_IFULL; - kbd->status &= ~STAT_MFULL; - kbd->last_irq = 2; + dev->out = dev->out_new & 0xff; + dev->out_new = -1; + dev->status |= STAT_OFULL; + dev->status &= ~STAT_IFULL; + dev->status &= ~STAT_MFULL; + dev->last_irq = 2; } } - if (kbd->out_new == -1 && !(kbd->status & STAT_OFULL) && key_ctrl_queue_start != key_ctrl_queue_end) { - kbd->out_new = key_ctrl_queue[key_ctrl_queue_start] | 0x200; + if (dev->out_new == -1 && !(dev->status & STAT_OFULL) && key_ctrl_queue_start != key_ctrl_queue_end) { + dev->out_new = key_ctrl_queue[key_ctrl_queue_start] | 0x200; key_ctrl_queue_start = (key_ctrl_queue_start + 1) & 0xf; - } else if (!(kbd->status & STAT_OFULL) && kbd->out_new == -1 && kbd->out_delayed != -1) { - kbd->out_new = kbd->out_delayed; - kbd->out_delayed = -1; - } else if (!(kbd->status & STAT_OFULL) && kbd->out_new == -1 && !(kbd->mem[0] & 0x10) && kbd->out_delayed != -1) { - kbd->out_new = kbd->out_delayed; - kbd->out_delayed = -1; - } else if (!(kbd->status & STAT_OFULL) && kbd->out_new == -1/* && !(kbd->mem[0] & 0x20)*/ && + } else if (!(dev->status & STAT_OFULL) && dev->out_new == -1 && dev->out_delayed != -1) { + dev->out_new = dev->out_delayed; + dev->out_delayed = -1; + } else if (!(dev->status & STAT_OFULL) && dev->out_new == -1 && !(dev->mem[0] & 0x10) && dev->out_delayed != -1) { + dev->out_new = dev->out_delayed; + dev->out_delayed = -1; + } else if (!(dev->status & STAT_OFULL) && dev->out_new == -1/* && !(dev->mem[0] & 0x20)*/ && (mouse_queue_start != mouse_queue_end)) { - kbd->out_new = mouse_queue[mouse_queue_start] | 0x100; + dev->out_new = mouse_queue[mouse_queue_start] | 0x100; mouse_queue_start = (mouse_queue_start + 1) & 0xf; - } else if (!(kbd->status&STAT_OFULL) && kbd->out_new == -1 && - !(kbd->mem[0]&0x10) && (key_queue_start != key_queue_end)) { - kbd->out_new = key_queue[key_queue_start]; + } else if (!(dev->status&STAT_OFULL) && dev->out_new == -1 && + !(dev->mem[0]&0x10) && (key_queue_start != key_queue_end)) { + dev->out_new = key_queue[key_queue_start]; key_queue_start = (key_queue_start + 1) & 0xf; } } static void -kbd_adddata(uint8_t val) +add_data(atkbd_t *dev, uint8_t val) { key_ctrl_queue[key_ctrl_queue_end] = val; key_ctrl_queue_end = (key_ctrl_queue_end + 1) & 0xf; - if (!(CurrentKbd->out_new & 0x300)) { - CurrentKbd->out_delayed = CurrentKbd->out_new; - CurrentKbd->out_new = -1; + if (! (dev->out_new & 0x300)) { + dev->out_delayed = dev->out_new; + dev->out_new = -1; } } static void -kbd_adddata_vals(uint8_t *val, uint8_t len) +add_data_vals(atkbd_t *dev, uint8_t *val, uint8_t len) { - int xt_mode = (keyboard_mode & 0x20) && ((CurrentKbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1); + int xt_mode = (keyboard_mode & 0x20) && ((dev->flags & KBC_TYPE_MASK) < 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 || ((CurrentKbd->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2); + translate = translate || ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2); for (i = 0; i < len; i++) { if (translate) { @@ -1842,8 +1844,8 @@ kbd_adddata_vals(uint8_t *val, uint8_t len) or = 0; } else send = val[i]; - DEBUG("%02X", send); - kbd_adddata(send); + DEBUG("%02x", send); + add_data(dev, send); if (i < (len - 1)) DEBUG(" "); } @@ -1851,7 +1853,7 @@ kbd_adddata_vals(uint8_t *val, uint8_t len) if (translate) { DEBUG(" original: ("); for (i = 0; i < len; i++) { - DEBUG("%02X", val[i]); + DEBUG("%02x", val[i]); if (i < (len - 1)) DEBUG(" "); } DEBUG(")"); @@ -1862,16 +1864,16 @@ kbd_adddata_vals(uint8_t *val, uint8_t len) static void -kbd_adddata_keyboard(uint16_t val) +add_data_kbd(uint16_t val) { - atkbd_t *kbd = CurrentKbd; - int xt_mode = (keyboard_mode & 0x20) && ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1); + atkbd_t *dev = SavedKbd; + int xt_mode = (keyboard_mode & 0x20) && ((dev->flags & KBC_TYPE_MASK) < 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 || ((kbd->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2); + translate = translate || ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2); num_lock = !!(keyboard_get_state() & KBD_FLAG_NUM); shift_states = keyboard_get_shift() & STATE_SHIFT_MASK; @@ -1885,30 +1887,30 @@ kbd_adddata_keyboard(uint16_t val) /* Skip break code if translated make code has bit 7 set. */ if (translate && (sc_or == 0x80) && (val & 0x80)) { - DEBUG("ATkbd: translate is on, skipping scan code: %02X (original: F0 %02X)\n", nont_to_t[val], val); + DEBUG("ATkbd: translate is on, skipping scan code: %02x (original: F0 %02x)\n", nont_to_t[val], val); sc_or = 0; return; } /* Test for T3100E 'Fn' key (Right Alt / Right Ctrl) */ - if ((kbd != NULL) && - ((kbd->flags & KBC_VEN_MASK) == KBC_VEN_TOSHIBA) && + if ((dev != NULL) && + ((dev->flags & KBC_VEN_MASK) == KBC_VEN_TOSHIBA) && (keyboard_recv(0xb8) || keyboard_recv(0x9d))) switch (val) { - case 0x4f: t3100e_notify_set(kbd->func_priv, 0x01); break; /* End */ - case 0x50: t3100e_notify_set(kbd->func_priv, 0x02); break; /* Down */ - case 0x51: t3100e_notify_set(kbd->func_priv, 0x03); break; /* PgDn */ - case 0x52: t3100e_notify_set(kbd->func_priv, 0x04); break; /* Ins */ - case 0x53: t3100e_notify_set(kbd->func_priv, 0x05); break; /* Del */ - case 0x54: t3100e_notify_set(kbd->func_priv, 0x06); break; /* SysRQ */ - case 0x45: t3100e_notify_set(kbd->func_priv, 0x07); break; /* NumLock */ - case 0x46: t3100e_notify_set(kbd->func_priv, 0x08); break; /* ScrLock */ - case 0x47: t3100e_notify_set(kbd->func_priv, 0x09); break; /* Home */ - case 0x48: t3100e_notify_set(kbd->func_priv, 0x0a); break; /* Up */ - case 0x49: t3100e_notify_set(kbd->func_priv, 0x0b); break; /* PgUp */ - case 0x4A: t3100e_notify_set(kbd->func_priv, 0x0c); break; /* Keypad -*/ - case 0x4B: t3100e_notify_set(kbd->func_priv, 0x0d); break; /* Left */ - case 0x4C: t3100e_notify_set(kbd->func_priv, 0x0e); break; /* KP 5 */ - case 0x4D: t3100e_notify_set(kbd->func_priv, 0x0f); break; /* Right */ + case 0x4f: t3100e_notify_set(dev->func_priv, 0x01); break; /* End */ + case 0x50: t3100e_notify_set(dev->func_priv, 0x02); break; /* Down */ + case 0x51: t3100e_notify_set(dev->func_priv, 0x03); break; /* PgDn */ + case 0x52: t3100e_notify_set(dev->func_priv, 0x04); break; /* Ins */ + case 0x53: t3100e_notify_set(dev->func_priv, 0x05); break; /* Del */ + case 0x54: t3100e_notify_set(dev->func_priv, 0x06); break; /* SysRQ */ + case 0x45: t3100e_notify_set(dev->func_priv, 0x07); break; /* NumLock */ + case 0x46: t3100e_notify_set(dev->func_priv, 0x08); break; /* ScrLock */ + case 0x47: t3100e_notify_set(dev->func_priv, 0x09); break; /* Home */ + case 0x48: t3100e_notify_set(dev->func_priv, 0x0a); break; /* Up */ + case 0x49: t3100e_notify_set(dev->func_priv, 0x0b); break; /* PgUp */ + case 0x4A: t3100e_notify_set(dev->func_priv, 0x0c); break; /* Keypad -*/ + case 0x4B: t3100e_notify_set(dev->func_priv, 0x0d); break; /* Left */ + case 0x4C: t3100e_notify_set(dev->func_priv, 0x0e); break; /* KP 5 */ + case 0x4D: t3100e_notify_set(dev->func_priv, 0x0f); break; /* Right */ } DEBUG("ATkbd: translate is %s, ", translate ? "on" : "off"); @@ -1924,12 +1926,14 @@ kbd_adddata_keyboard(uint16_t val) switch(keyboard_mode & 0x02) { case 1: fake_shift[0] = 0xe0; fake_shift[1] = 0x2a; - kbd_adddata_vals(fake_shift, 2); + add_data_vals(dev, fake_shift, 2); break; + case 2: fake_shift[0] = 0xe0; fake_shift[1] = 0x12; - kbd_adddata_vals(fake_shift, 2); + add_data_vals(dev, fake_shift, 2); break; + default: DEBUG("N/A (scan code set %i)\n", keyboard_mode & 0x02); break; @@ -1941,12 +1945,14 @@ kbd_adddata_keyboard(uint16_t val) switch(keyboard_mode & 0x02) { case 1: fake_shift[0] = 0xe0; fake_shift[1] = 0xaa; - kbd_adddata_vals(fake_shift, 2); + add_data_vals(dev, fake_shift, 2); break; + case 2: fake_shift[0] = 0xe0; fake_shift[1] = 0xf0; fake_shift[2] = 0x12; - kbd_adddata_vals(fake_shift, 3); + add_data_vals(dev, fake_shift, 3); break; + default: DEBUG("N/A (scan code set %i)\n", keyboard_mode & 0x02); break; @@ -1957,12 +1963,14 @@ kbd_adddata_keyboard(uint16_t val) switch(keyboard_mode & 0x02) { case 1: fake_shift[0] = 0xe0; fake_shift[1] = 0xb6; - kbd_adddata_vals(fake_shift, 2); + add_data_vals(dev, fake_shift, 2); break; + case 2: fake_shift[0] = 0xe0; fake_shift[1] = 0xf0; fake_shift[2] = 0x59; - kbd_adddata_vals(fake_shift, 3); + add_data_vals(dev, fake_shift, 3); break; + default: DEBUG("N/A (scan code set %i)\n", keyboard_mode & 0x02); break; @@ -1973,6 +1981,7 @@ kbd_adddata_keyboard(uint16_t val) } } break; + case FAKE_LSHIFT_OFF: DEBUG("fake left shift on, scan code: "); if (num_lock) { @@ -1984,12 +1993,14 @@ kbd_adddata_keyboard(uint16_t val) switch(keyboard_mode & 0x02) { case 1: fake_shift[0] = 0xe0; fake_shift[1] = 0xaa; - kbd_adddata_vals(fake_shift, 2); + add_data_vals(dev, fake_shift, 2); break; + case 2: fake_shift[0] = 0xe0; fake_shift[1] = 0xf0; fake_shift[2] = 0x12; - kbd_adddata_vals(fake_shift, 3); + add_data_vals(dev, fake_shift, 3); break; + default: DEBUG("N/A (scan code set %i)\n", keyboard_mode & 0x02); break; @@ -2001,12 +2012,14 @@ kbd_adddata_keyboard(uint16_t val) switch(keyboard_mode & 0x02) { case 1: fake_shift[0] = 0xe0; fake_shift[1] = 0x2a; - kbd_adddata_vals(fake_shift, 2); + add_data_vals(dev, fake_shift, 2); break; + case 2: fake_shift[0] = 0xe0; fake_shift[1] = 0x12; - kbd_adddata_vals(fake_shift, 2); + add_data_vals(dev, fake_shift, 2); break; + default: DEBUG("N/A (scan code set %i)\n", keyboard_mode & 0x02); break; @@ -2017,12 +2030,14 @@ kbd_adddata_keyboard(uint16_t val) switch(keyboard_mode & 0x02) { case 1: fake_shift[0] = 0xe0; fake_shift[1] = 0x36; - kbd_adddata_vals(fake_shift, 2); + add_data_vals(dev, fake_shift, 2); break; + case 2: fake_shift[0] = 0xe0; fake_shift[1] = 0x59; - kbd_adddata_vals(fake_shift, 2); + add_data_vals(dev, fake_shift, 2); break; + default: DEBUG("N/A (scan code set %i)\n", keyboard_mode & 0x02); break; @@ -2033,16 +2048,17 @@ kbd_adddata_keyboard(uint16_t val) } } break; + default: #ifdef _DEBUG DEBUG("scan code: "); if (translate) { - DEBUG("%02X (original: ", (nont_to_t[val] | sc_or)); + DEBUG("%02x (original: ", (nont_to_t[val] | sc_or)); if (sc_or == 0x80) DEBUG("F0 "); - DEBUG("%02X)\n", val); + DEBUG("%02x)\n", val); } else - DEBUG("%02X\n", val); + DEBUG("%02x\n", val); #endif key_queue[key_queue_end] = (translate ? (nont_to_t[val] | sc_or) : val); @@ -2050,56 +2066,57 @@ kbd_adddata_keyboard(uint16_t val) break; } - if (sc_or == 0x80) sc_or = 0; + if (sc_or == 0x80) + sc_or = 0; } static void -kbd_output_write(atkbd_t *kbd, uint8_t val) +write_output(atkbd_t *dev, uint8_t val) { - DBGLOG(1, "ATkbd: write output port: %02X (old: %02X)\n", val, kbd->output_port); + DBGLOG(1, "ATkbd: write_output(%02x) [old=%02x]\n", val, dev->output_port); - if ((kbd->output_port ^ val) & 0x20) { /*IRQ 12*/ + if ((dev->output_port ^ val) & 0x20) { /*IRQ 12*/ if (val & 0x20) picint(1 << 12); else picintc(1 << 12); } - if ((kbd->output_port ^ val) & 0x10) { /*IRQ 1*/ + if ((dev->output_port ^ val) & 0x10) { /*IRQ 1*/ if (val & 0x10) picint(1 << 1); else picintc(1 << 1); } - if ((kbd->output_port ^ val) & 0x02) { /*A20 enable change*/ + if ((dev->output_port ^ val) & 0x02) { /*A20 enable change*/ mem_a20_key = val & 0x02; mem_a20_recalc(); flushmmucache(); } - if ((kbd->output_port ^ val) & 0x01) { /*Reset*/ + if ((dev->output_port ^ val) & 0x01) { /*Reset*/ if (! (val & 0x01)) { cpu_reset(0); cpu_set_edx(); } } - kbd->output_port = val; + dev->output_port = val; } static void -kbd_cmd_write(atkbd_t *kbd, uint8_t val) +write_cmd(atkbd_t *dev, uint8_t val) { - DBGLOG(1, "ATkbd: write command byte: %02X (old: %02X)\n", val, kbd->mem[0]); + DBGLOG(1, "ATkbd: write_cmd(%02x) [old=%02x]\n", val, dev->mem[0]); - if ((val & 1) && (kbd->status & STAT_OFULL)) - kbd->wantirq = 1; - if (!(val & 1) && kbd->wantirq) - kbd->wantirq = 0; + if ((val & 1) && (dev->status & STAT_OFULL)) + dev->wantirq = 1; + if (!(val & 1) && dev->wantirq) + dev->wantirq = 0; /* PS/2 type 2 keyboard controllers always force the XLAT bit to 0. */ - if ((kbd->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2) { + if ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2) { val &= ~CCB_TRANSLATE; - kbd->mem[0] &= ~CCB_TRANSLATE; + dev->mem[0] &= ~CCB_TRANSLATE; } /* Scan code translate ON/OFF. */ @@ -2112,8 +2129,8 @@ kbd_cmd_write(atkbd_t *kbd, 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 (((kbd->flags & KBC_VEN_MASK) == KBC_VEN_AMI) || - ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1)) { + if (((dev->flags & KBC_VEN_MASK) == KBC_VEN_AMI) || + ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) { keyboard_mode &= ~CCB_PCMODE; mouse_scan = !(val & 0x20); @@ -2122,137 +2139,148 @@ kbd_cmd_write(atkbd_t *kbd, uint8_t val) DEBUG("ATkbd: mouse interrupt is now %s\n", (val & 0x02) ? "enabled" : "disabled"); } - DBGLOG(1, "Command byte now: %02X (%02X)\n", kbd->mem[0], val); + DBGLOG(1, "Command byte now: %02x (%02x)\n", dev->mem[0], val); } static void -kbd_output_pulse(atkbd_t *kbd, uint8_t mask) +pulse_output(atkbd_t *dev, uint8_t mask) { - if (mask != 0xF) { - kbd->old_output_port = kbd->output_port & ~(0xF0 | mask); - kbd_output_write(kbd, kbd->output_port & (0xF0 | mask)); - kbd->pulse_cb = 6LL * TIMER_USEC; + if (mask != 0x0f) { + dev->old_output_port = dev->output_port & ~(0xf0 | mask); + write_output(dev, dev->output_port & (0xf0 | mask)); + dev->pulse_cb = 6LL * TIMER_USEC; } } static void -kbd_pulse_poll(void *p) +pulse_poll(void *priv) { - atkbd_t *kbd = (atkbd_t *) p; + atkbd_t *dev = (atkbd_t *)priv; - kbd_output_write(kbd, kbd->output_port | kbd->old_output_port); - kbd->pulse_cb = 0LL; + write_output(dev, dev->output_port | dev->old_output_port); + dev->pulse_cb = 0LL; } static void -kbd_keyboard_set(atkbd_t *kbd, uint8_t enable) +set_enable_kbd(atkbd_t *dev, uint8_t enable) { - kbd->mem[0] &= 0xef; - kbd->mem[0] |= (enable ? 0x00 : 0x10); + dev->mem[0] &= 0xef; + dev->mem[0] |= (enable ? 0x00 : 0x10); if (enable) - kbd->status |= STAT_UNLOCKED; + dev->status |= STAT_UNLOCKED; else - kbd->status &= ~STAT_UNLOCKED; + dev->status &= ~STAT_UNLOCKED; keyboard_scan = enable; } static void -kbd_mouse_set(atkbd_t *kbd, uint8_t enable) +set_enable_mouse(atkbd_t *dev, uint8_t enable) { - kbd->mem[0] &= 0xdf; - kbd->mem[0] |= (enable ? 0x00 : 0x20); + dev->mem[0] &= 0xdf; + dev->mem[0] |= (enable ? 0x00 : 0x20); + mouse_scan = enable; } static uint8_t -kbd_write64_generic(void *p, uint8_t val) +write64_generic(void *priv, uint8_t val) { - atkbd_t *kbd = (atkbd_t *)p; + atkbd_t *dev = (atkbd_t *)priv; + uint8_t current_drive; switch (val) { - case 0xa4: /*Check if password installed*/ - if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { + case 0xa4: /* check if password installed */ + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { DEBUG("ATkbd: check if password installed\n"); - kbd_adddata(0xf1); + add_data(dev, 0xf1); return 0; - } else { + } else ERRLOG("ATkbd: bad command A4\n"); - } break; - case 0xa7: /*Disable mouse port*/ - if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { + case 0xa7: /* disable mouse port */ + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { DEBUG("ATkbd: disable mouse port\n"); - kbd_mouse_set(kbd, 0); + set_enable_mouse(dev, 0); return 0; - } else { + } else ERRLOG("ATkbd: bad command A7\n"); - } break; case 0xa8: /*Enable mouse port*/ - if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { DEBUG("ATkbd: enable mouse port\n"); - kbd_mouse_set(kbd, 1); + set_enable_mouse(dev, 1); return 0; - } else { + } else ERRLOG("ATkbd: bad command A8\n"); - } break; case 0xa9: /*Test mouse port*/ DEBUG("ATkbd: test mouse port\n"); - if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { if (mouse_write) - kbd_adddata(0x00); /*no error*/ + add_data(dev, 0x00); /* no error */ else - kbd_adddata(0xff); /*no mouse*/ + add_data(dev, 0xff); /* no mouse */ return 0; - } else { + } else ERRLOG("ATkbd: bad command A9\n"); - } break; - case 0xaf: /*Read keyboard version*/ + case 0xaf: /* read keyboard version */ DEBUG("ATkbd: read keyboard version\n"); - kbd_adddata(0x00); + add_data(dev, 0x00); return 0; - case 0xc0: /*Read input port*/ + case 0xc0: /* read input port */ DEBUG("ATkbd: read input port\n"); - kbd_adddata(kbd->input_port | 4 | fdc_ps1_525()); - kbd->input_port = ((kbd->input_port + 1) & 3) | (kbd->input_port & 0xfc) | fdc_ps1_525(); + if ((dev->flags & KBC_VEN_MASK) == KBC_VEN_IBM_PS1) { + current_drive = fdc_get_current_drive(); + add_data(dev, dev->input_port | 4 | (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); + dev->input_port = ((dev->input_port + 1) & 3) | + (dev->input_port & 0xfc); + } return 0; - case 0xd3: /*Write mouse output buffer*/ - if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { + case 0xd3: /* write mouse output buffer */ + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { DEBUG("ATkbd: write mouse output buffer\n"); - kbd->want60 = 1; + dev->want60 = 1; return 0; } break; - case 0xd4: /*Write to mouse*/ - if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { + case 0xd4: /* write to mouse */ +#if 0 + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { +#endif DEBUG("ATkbd: write to mouse\n"); - kbd->want60 = 1; + dev->want60 = 1; return 0; +#if 0 } break; +#endif case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff: DBGLOG(1, "ATkbd: pulse %01X\n", val & 0x0f); - kbd_output_pulse(kbd, val & 0x0f); + pulse_output(dev, val & 0x0f); return 0; } @@ -2261,69 +2289,45 @@ kbd_write64_generic(void *p, uint8_t val) static uint8_t -kbd_write60_acer(void *p, uint8_t val) +write60_acer(void *priv, uint8_t val) { - atkbd_t *kbd = (atkbd_t *) p; +#if 0 + atkbd_t *dev = (atkbd_t *)priv; -INFO("ACER: write60(%02x, %02x)\n", kbd->command, val); - switch(kbd->command) { - /* 0x40 - 0x5F are aliases for 0x60-0x7F */ - case 0x40: case 0x41: case 0x42: case 0x43: - case 0x44: case 0x45: case 0x46: case 0x47: - case 0x48: case 0x49: case 0x4a: case 0x4b: - case 0x4c: case 0x4d: case 0x4e: case 0x4f: - case 0x50: case 0x51: case 0x52: case 0x53: - case 0x54: case 0x55: case 0x56: case 0x57: - case 0x58: case 0x59: case 0x5a: case 0x5b: - case 0x5c: case 0x5d: case 0x5e: case 0x5f: - DEBUG("ATkbd: AMI - alias write to %08X\n", kbd->command); - kbd->mem[kbd->command & 0x1f] = val; - if (kbd->command == 0x60) - kbd_cmd_write(kbd, val); - return 0; - - case 0xaf: /*AMI - set extended controller RAM*/ - DEBUG("ATkbd: AMI - set extended controller RAM\n"); - if (kbd->secr_phase == 1) { - kbd->mem_addr = val; - kbd->want60 = 1; - kbd->secr_phase = 2; - } else if (kbd->secr_phase == 2) { - kbd->mem[kbd->mem_addr] = val; - kbd->secr_phase = 0; - } - return 0; - - case 0xcb: /*AMI - set keyboard mode*/ - DEBUG("ATkbd: AMI - set keyboard mode\n"); + switch(dev->command) { + case 0xc0: /* sent by Acer V30 BIOS */ return 0; } +#endif return 1; } static uint8_t -kbd_write64_acer(void *p, uint8_t val) +write64_acer(void *priv, uint8_t val) { - atkbd_t *kbd = (atkbd_t *) p; + atkbd_t *dev = (atkbd_t *)priv; -INFO("ACER: write64(%02x, %02x)\n", kbd->command, val); + INFO("ACER: write64(%02x, %02x)\n", dev->command, val); + +#if 0 switch (val) { case 0xc0: /* sent by Acer V30 BIOS */ return 0; } +#endif - return kbd_write64_generic(kbd, val); + return write64_generic(dev, val); } static uint8_t -kbd_write60_ami(void *p, uint8_t val) +write60_ami(void *priv, uint8_t val) { - atkbd_t *kbd = (atkbd_t *) p; + atkbd_t *dev = (atkbd_t *)priv; - switch(kbd->command) { + switch(dev->command) { /* 0x40 - 0x5F are aliases for 0x60-0x7F */ case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: @@ -2333,26 +2337,26 @@ kbd_write60_ami(void *p, uint8_t val) case 0x54: case 0x55: case 0x56: case 0x57: case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f: - DEBUG("ATkbd: AMI - alias write to %08X\n", kbd->command); - kbd->mem[kbd->command & 0x1f] = val; - if (kbd->command == 0x60) - kbd_cmd_write(kbd, val); + DEBUG("ATkbd: alias write to %02x (AMI)\n", dev->command); + dev->mem[dev->command & 0x1f] = val; + if (dev->command == 0x60) + write_cmd(dev, val); return 0; - case 0xaf: /*AMI - set extended controller RAM*/ - DEBUG("ATkbd: AMI - set extended controller RAM\n"); - if (kbd->secr_phase == 1) { - kbd->mem_addr = val; - kbd->want60 = 1; - kbd->secr_phase = 2; - } else if (kbd->secr_phase == 2) { - kbd->mem[kbd->mem_addr] = val; - kbd->secr_phase = 0; + case 0xaf: /* set extended controller RAM */ + DEBUG("ATkbd: set extended controller RAM (AMI)\n"); + if (dev->secr_phase == 1) { + dev->mem_addr = val; + dev->want60 = 1; + dev->secr_phase = 2; + } else if (dev->secr_phase == 2) { + dev->mem[dev->mem_addr] = val; + dev->secr_phase = 0; } return 0; - case 0xcb: /*AMI - set keyboard mode*/ - DEBUG("ATkbd: AMI - set keyboard mode\n"); + case 0xcb: /* set keyboard mode */ + DEBUG("ATkbd: set keyboard mode (AMI)\n"); return 0; } @@ -2361,9 +2365,9 @@ kbd_write60_ami(void *p, uint8_t val) static uint8_t -kbd_write64_ami(void *p, uint8_t val) +write64_ami(void *priv, uint8_t val) { - atkbd_t *kbd = (atkbd_t *) p; + atkbd_t *dev = (atkbd_t *)priv; switch (val) { case 0x00: case 0x01: case 0x02: case 0x03: @@ -2374,8 +2378,8 @@ kbd_write64_ami(void *p, uint8_t val) case 0x14: case 0x15: case 0x16: case 0x17: case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: - DEBUG("ATkbd: AMI - alias read from %08X\n", val); - kbd_adddata(kbd->mem[val]); + DEBUG("ATkbd: alias read from %02x (AMI)\n", val); + add_data(dev, dev->mem[val]); return 0; case 0x40: case 0x41: case 0x42: case 0x43: @@ -2386,167 +2390,171 @@ kbd_write64_ami(void *p, uint8_t val) case 0x54: case 0x55: case 0x56: case 0x57: case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f: - DEBUG("ATkbd: AMI - alias write to %08X\n", kbd->command); - kbd->want60 = 1; + DEBUG("ATkbd: alias write to %02x (AMI)\n", dev->command); + dev->want60 = 1; return 0; - case 0xa1: /*AMI - get controller version*/ - DEBUG("ATkbd: AMI - get controller version\n"); + case 0xa1: /* get controller version */ + DEBUG("ATkbd: get controller version (AMI)\n"); return 0; - case 0xa2: /*AMI - reset keyboard controller lines P22 and P23 low*/ - if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { - DEBUG("ATkbd: AMI - clear KBC lines P22 and P23\n"); - kbd_output_write(kbd, kbd->output_port & 0xf3); - kbd_adddata(0x00); + case 0xa2: /* clear keyboard controller lines P22/P23 */ + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { + DEBUG("ATkbd: clear KBC lines P22/P23 (AMI)\n"); + write_output(dev, dev->output_port & 0xf3); + add_data(dev, 0x00); return 0; } break; - case 0xa3: /*AMI - set keyboard controller lines P22 and P23 high*/ - if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { - DEBUG("ATkbd: AMI - set KBC lines P22 and P23\n"); - kbd_output_write(kbd, kbd->output_port | 0x0c); - kbd_adddata(0x00); + case 0xa3: /* set keyboard controller lines P22/P23 */ + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { + DEBUG("ATkbd: set KBC lines P22/P23 (AMI)\n"); + write_output(dev, dev->output_port | 0x0c); + add_data(dev, 0x00); return 0; } break; - case 0xa4: /* AMI - write clock = low */ - if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { - DEBUG("ATkbd: AMI - write clock = low\n"); - kbd->ami_stat &= 0xfe; + case 0xa4: /* write clock = low */ + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { + DEBUG("ATkbd: write clock=low (AMI)\n"); + dev->ami_stat &= 0xfe; return 0; } break; - case 0xa5: /* AMI - write clock = high */ - if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { - DEBUG("ATkbd: AMI - write clock = high\n"); - kbd->ami_stat |= 0x01; + case 0xa5: /* write clock = high */ + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { + DEBUG("ATkbd: write clock=high (AMI)\n"); + dev->ami_stat |= 0x01; return 0; } break; - case 0xa6: /* AMI - read clock */ - if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { - DEBUG("ATkbd: AMI - read clock\n"); - kbd_adddata(!!(kbd->ami_stat & 1)); + case 0xa6: /* read clock */ + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { + DEBUG("ATkbd: read clock (AMI)\n"); + add_data(dev, !!(dev->ami_stat & 1)); return 0; } break; - case 0xa7: /* AMI - write cache bad */ - if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { - DEBUG("ATkbd: AMI - write cache bad\n"); - kbd->ami_stat &= 0xfd; + case 0xa7: /* write cache bad */ + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { + DEBUG("ATkbd: write cache bad (AMI)\n"); + dev->ami_stat &= 0xfd; return 0; } break; - case 0xa8: /* AMI - write cache good */ - if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { - DEBUG("ATkbd: AMI - write cache good\n"); - kbd->ami_stat |= 0x02; + case 0xa8: /* write cache good */ + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { + DEBUG("ATkbd: write cache good (AMI)\n"); + dev->ami_stat |= 0x02; return 0; } break; - case 0xa9: /* AMI - read cache */ - if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { - DEBUG("ATkbd: AMI - read cache\n"); - kbd_adddata(!!(kbd->ami_stat & 2)); + case 0xa9: /* read cache */ + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { + DEBUG("ATkbd: read cache (AMI)\n"); + add_data(dev, !!(dev->ami_stat & 2)); return 0; } break; - case 0xaf: /*Set extended controller RAM*/ - DEBUG("ATkbd: set extended controller RAM\n"); - kbd->want60 = 1; - kbd->secr_phase = 1; + case 0xaf: /* set extended controller RAM */ + DEBUG("ATkbd: set extended controller RAM (AMI)\n"); + dev->want60 = 1; + dev->secr_phase = 1; return 0; case 0xb0: case 0xb1: case 0xb2: case 0xb3: - /*Set keyboard controller line P10-P13 (input port bits 0-3) low*/ + /* set KBC lines P10-P13 (input port bits 0-3) low */ if (!PCI || (val > 0xb1)) { - kbd->input_port &= ~(1 << (val & 0x03)); - kbd_adddata(0x00); + dev->input_port &= ~(1 << (val & 0x03)); + add_data(dev, 0x00); } return 0; case 0xb4: case 0xb5: - /*Set keyboard controller line P22-P23 (output port bits 2-3) low*/ + /* set KBC lines P22-P23 (output port bits 2-3) low */ if (! PCI) { - kbd_output_write(kbd, kbd->output_port & ~(4 << (val & 0x01))); - kbd_adddata(0x00); + write_output(dev, dev->output_port & ~(4 << (val & 0x01))); + add_data(dev, 0x00); } return 0; case 0xb8: case 0xb9: case 0xba: case 0xbb: - /*Set keyboard controller line P10-P13 (input port bits 0-3) high*/ + /* set KBC lines P10-P13 (input port bits 0-3) high */ if (!PCI || (val > 0xb9)) { - kbd->input_port |= (1 << (val & 0x03)); - kbd_adddata(0x00); + dev->input_port |= (1 << (val & 0x03)); + add_data(dev, 0x00); } return 0; case 0xbc: case 0xbd: - /*Set keyboard controller line P22-P23 (output port bits 2-3) high*/ + /* set KBC lines P22-P23 (output port bits 2-3) high */ if (! PCI) { - kbd_output_write(kbd, kbd->output_port | (4 << (val & 0x01))); - kbd_adddata(0x00); + write_output(dev, dev->output_port | (4 << (val & 0x01))); + add_data(dev, 0x00); } return 0; - case 0xc8: /*AMI - unblock keyboard controller lines P22 and P23 - (allow command D1 to change bits 2 and 3 of the output - port)*/ - DEBUG("ATkbd: AMI - unblock KBC lines P22 and P23\n"); - kbd->output_locked = 1; + case 0xc8: + /* + * unblock KBC lines P22/P23 + * (allow command D1 to change bits 2/3 of the output port) + */ + DEBUG("ATkbd: unblock KBC lines P22/P23 (AMI)\n"); + dev->output_locked = 1; return 0; - case 0xc9: /*AMI - block keyboard controller lines P22 and P23 - (prevent command D1 from changing bits 2 and 3 of the - output port)*/ - DEBUG("ATkbd: AMI - block KBC lines P22 and P23\n"); - kbd->output_locked = 1; + case 0xc9: + /* + * block KBC lines P22/P23 + * (disallow command D1 from changing bits 2/3 of the port) + */ + DEBUG("ATkbd: block KBC lines P22/P23 (AMI)\n"); + dev->output_locked = 1; return 0; - case 0xca: /*AMI - read keyboard mode*/ - DEBUG("ATkbd: AMI - read keyboard mode\n"); - kbd_adddata(0x00); /*ISA mode*/ + case 0xca: /* read keyboard mode */ + DEBUG("ATkbd: read keyboard mode (AMI)\n"); + add_data(dev, 0x00); /*ISA mode*/ return 0; - case 0xcb: /*AMI - set keyboard mode*/ - DEBUG("ATkbd: AMI - set keyboard mode\n"); - kbd->want60 = 1; + case 0xcb: /* set keyboard mode */ + DEBUG("ATkbd: set keyboard mode (AMI)\n"); + dev->want60 = 1; return 0; - case 0xef: /*??? - sent by AMI486*/ + case 0xef: /* ??? - sent by AMI486 */ DEBUG("ATkbd: ??? - sent by AMI486\n"); return 0; } - return kbd_write64_generic(kbd, val); + return write64_generic(dev, val); } static uint8_t -kbd_write64_ibm_mca(void *p, uint8_t val) +write64_ibm_mca(void *priv, uint8_t val) { - atkbd_t *kbd = (atkbd_t *) p; + atkbd_t *dev = (atkbd_t *)priv; switch (val) { case 0xc1: /*Copy bits 0 to 3 of input port to status bits 4 to 7*/ DEBUG("ATkbd: copy bits 0 to 3 of input port to status bits 4 to 7\n"); - kbd->status &= 0xf; - kbd->status |= ((((kbd->input_port & 0xfc) | 0x84 | fdc_ps1_525()) & 0xf) << 4); + dev->status &= 0x0f; + dev->status |= ((((dev->input_port & 0xfc) | 0x84) & 0x0f) << 4); return 0; case 0xc2: /*Copy bits 4 to 7 of input port to status bits 4 to 7*/ DEBUG("ATkbd: copy bits 4 to 7 of input port to status bits 4 to 7\n"); - kbd->status &= 0xf; - kbd->status |= (((kbd->input_port & 0xfc) | 0x84 | fdc_ps1_525()) & 0xf0); + dev->status &= 0x0f; + dev->status |= (((dev->input_port & 0xfc) | 0x84) & 0xf0); return 0; case 0xaf: @@ -2558,20 +2566,20 @@ kbd_write64_ibm_mca(void *p, uint8_t val) case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff: DEBUG("ATkbd: pulse: %01X\n", (val & 0x03) | 0x0c); - kbd_output_pulse(kbd, (val & 0x03) | 0x0c); + pulse_output(dev, (val & 0x03) | 0x0c); return 0; } - return kbd_write64_generic(kbd, val); + return write64_generic(dev, val); } static uint8_t -kbd_write60_quadtel(void *p, uint8_t val) +write60_quadtel(void *priv, uint8_t val) { - atkbd_t *kbd = (atkbd_t *) p; + atkbd_t *dev = (atkbd_t *)priv; - switch(kbd->command) { + switch(dev->command) { case 0xcf: /*??? - sent by MegaPC BIOS*/ DEBUG("ATkbd: ??? - sent by MegaPC BIOS\n"); return 0; @@ -2582,9 +2590,9 @@ kbd_write60_quadtel(void *p, uint8_t val) static uint8_t -kbd_write64_quadtel(void *p, uint8_t val) +write64_quadtel(void *priv, uint8_t val) { - atkbd_t *kbd = (atkbd_t *) p; + atkbd_t *dev = (atkbd_t *)priv; switch (val) { case 0xaf: @@ -2593,22 +2601,22 @@ kbd_write64_quadtel(void *p, uint8_t val) case 0xcf: /*??? - sent by MegaPC BIOS*/ DEBUG("ATkbd: ??? - sent by MegaPC BIOS\n"); - kbd->want60 = 1; + dev->want60 = 1; return 0; } - return kbd_write64_generic(kbd, val); + return write64_generic(dev, val); } static uint8_t -kbd_write60_toshiba(void *p, uint8_t val) +write60_toshiba(void *priv, uint8_t val) { - atkbd_t *kbd = (atkbd_t *) p; + atkbd_t *dev = (atkbd_t *)priv; - switch(kbd->command) { + switch(dev->command) { case 0xb6: /* T3100e - set color/mono switch */ - t3100e_mono_set(kbd->func_priv, val); + t3100e_mono_set(dev->func_priv, val); return 0; } @@ -2617,9 +2625,9 @@ kbd_write60_toshiba(void *p, uint8_t val) static uint8_t -kbd_write64_toshiba(void *p, uint8_t val) +write64_toshiba(void *priv, uint8_t val) { - atkbd_t *kbd = (atkbd_t *) p; + atkbd_t *dev = (atkbd_t *)priv; switch (val) { case 0xaf: @@ -2627,11 +2635,11 @@ kbd_write64_toshiba(void *p, uint8_t val) return 1; case 0xb0: /* T3100e: Turbo on */ - t3100e_turbo_set(kbd->func_priv, 1); + t3100e_turbo_set(dev->func_priv, 1); return 0; case 0xb1: /* T3100e: Turbo off */ - t3100e_turbo_set(kbd->func_priv, 0); + t3100e_turbo_set(dev->func_priv, 0); return 0; case 0xb2: /* T3100e: Select external display */ @@ -2643,15 +2651,15 @@ kbd_write64_toshiba(void *p, uint8_t val) return 0; case 0xb4: /* T3100e: Get configuration / status */ - kbd_adddata(t3100e_config_get(kbd->func_priv)); + add_data(dev, t3100e_config_get(dev->func_priv)); return 0; case 0xb5: /* T3100e: Get colour / mono byte */ - kbd_adddata(t3100e_mono_get(kbd->func_priv)); + add_data(dev, t3100e_mono_get(dev->func_priv)); return 0; case 0xb6: /* T3100e: Set colour / mono byte */ - kbd->want60 = 1; + dev->want60 = 1; return 0; case 0xb7: /* T3100e: Emulate PS/2 keyboard - not implemented */ @@ -2664,12 +2672,12 @@ kbd_write64_toshiba(void *p, uint8_t val) using 'Fn'. */ if (keyboard_recv(0xb8) || /* Right Alt */ keyboard_recv(0x9d)) /* Right Ctrl */ - kbd_adddata(0x04); - else kbd_adddata(0x00); + add_data(dev, 0x04); + else add_data(dev, 0x00); return 0; case 0xbc: /* T3100e: Reset Fn+Key notification */ - t3100e_notify_set(kbd->func_priv, 0x00); + t3100e_notify_set(dev->func_priv, 0x00); return 0; case 0xc0: /*Read input port*/ @@ -2677,35 +2685,36 @@ kbd_write64_toshiba(void *p, uint8_t val) /* The T3100e returns all bits set except bit 6 which * is set by t3100e_mono_set() */ - kbd->input_port = (t3100e_mono_get(kbd->func_priv) & 1) ? 0xff : 0xbf; - kbd_adddata(kbd->input_port); + dev->input_port = (t3100e_mono_get(dev->func_priv) & 1) ? 0xff : 0xbf; + add_data(dev, dev->input_port); return 0; } - return kbd_write64_generic(kbd, val); + return write64_generic(dev, val); } static void kbd_write(uint16_t port, uint8_t val, void *priv) { - atkbd_t *kbd = (atkbd_t *)priv; + atkbd_t *dev = (atkbd_t *)priv; int i = 0; int bad = 1; uint8_t mask; - if (((kbd->flags & KBC_VEN_MASK) == KBC_VEN_XI8088) && (port == 0x63)) + if (((dev->flags & KBC_VEN_MASK) == KBC_VEN_XI8088) && (port == 0x63)) port = 0x61; - DBGLOG(2, "ATkbd: write(%04X, %02X)\n", port, val); + DBGLOG(2, "ATkbd: write(%04x, %02x)\n", port, val); switch (port) { case 0x60: - if (kbd->want60) { - /*Write to controller*/ - kbd->want60 = 0; - switch (kbd->command) { + if (dev->want60) { + /* Write data to controller. */ + dev->want60 = 0; + + switch (dev->command) { case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: case 0x68: case 0x69: case 0x6a: case 0x6b: @@ -2714,162 +2723,188 @@ kbd_write(uint16_t port, uint8_t val, void *priv) case 0x74: case 0x75: case 0x76: case 0x77: case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f: - kbd->mem[kbd->command & 0x1f] = val; - if (kbd->command == 0x60) - kbd_cmd_write(kbd, val); + dev->mem[dev->command & 0x1f] = val; + if (dev->command == 0x60) + write_cmd(dev, val); break; - case 0xd1: /*Write output port*/ + case 0xd1: /* write output port */ DEBUG("ATkbd: write output port\n"); - if (kbd->output_locked) { + if (dev->output_locked) { /*If keyboard controller lines P22-P23 are blocked, we force them to remain unchanged.*/ val &= ~0x0c; - val |= (kbd->output_port & 0x0c); + val |= (dev->output_port & 0x0c); } - kbd_output_write(kbd, val); + write_output(dev, val); break; - case 0xd2: /*Write to keyboard output buffer*/ + case 0xd2: /* write to keyboard output buffer */ DEBUG("ATkbd: write to keyboard output buffer\n"); - kbd_adddata_keyboard(val); + add_data_kbd(val); break; - case 0xd3: /*Write to mouse output buffer*/ + case 0xd3: /* write to mouse output buffer */ DEBUG("ATkbd: write to mouse output buffer\n"); - if (mouse_write && ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1)) + if (mouse_write && ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) keyboard_at_adddata_mouse(val); break; - case 0xd4: /*Write to mouse*/ - DEBUG("ATkbd: write to mouse (%02X)\n", val); - kbd_mouse_set(kbd, 1); - if (mouse_write && ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1)) + case 0xd4: /* write to mouse */ + DEBUG("ATkbd: write to mouse (%02x)\n", val); + + if (val == 0xbb) + break; + + set_enable_mouse(dev, 1); + if (mouse_write && ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) mouse_write(val, mouse_p); - else if (!mouse_write && ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1)) + else if (!mouse_write && ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) keyboard_at_adddata_mouse(0xff); break; default: - /* Run the vendor-specific command handler, if present, - otherwise (or if the former returns 1), assume bad command. */ - if (kbd->write60_ven) - bad = kbd->write60_ven(kbd, val); + /* + * Run the vendor-specific handler + * if we have one. Otherwise, or if + * it returns an error, log a bad + * controller command. + */ + if (dev->write60_ven) + bad = dev->write60_ven(dev, val); if (bad) { - ERRLOG("ATkbd: bad keyboard controller 0060 write %02X command %02X\n", val, kbd->command); + ERRLOG("ATkbd: bad controller command %02x data %02x\n", dev->command, val); + add_data_kbd(0xfe); } } } else { - /*Write to keyboard*/ - kbd->mem[0] &= ~0x10; - if (kbd->key_wantdata) { - kbd->key_wantdata = 0; - switch (kbd->key_command) { - case 0xed: /*Set/reset LEDs*/ - /* Command ED does command if command is recognized. */ - if (val & 0xf8) - goto do_command; - kbd_adddata_keyboard(0xfa); + /* Write data to keyboard. */ + dev->mem[0] &= ~0x10; + + if (dev->key_wantdata) { + dev->key_wantdata = 0; + + /* + * Several system BIOSes and OS device drivers + * mess up with this, and repeat the command + * code many times. Fun! + */ + if (val == dev->key_command) { +#if 1 + /* Respond NAK and ignore it. */ + add_data_kbd(0xfe); + dev->key_command = 0x00; + break; +#else + goto do_command; +#endif + } + + switch (dev->key_command) { + case 0xed: /* set/reset LEDs */ + add_data_kbd(0xfa); + INFO("ATkbd: set LEDs [%02x]\n", + val); break; - case 0xf0: /*Get/set scancode set*/ - kbd_adddata_keyboard(0xfa); + case 0xf0: /* get/set scancode set */ + add_data_kbd(0xfa); if (val == 0) { - DEBUG("ATkbd: get scan code set: %02X\n", keyboard_mode & 3); - kbd_adddata_keyboard(keyboard_mode & 3); + DEBUG("ATkbd: get scan code set: %02x\n", keyboard_mode & 3); + add_data_kbd(keyboard_mode & 3); } else { if ((val <= 3) && (val != 1)) { keyboard_mode &= 0xfc; keyboard_mode |= (val & 3); - DEBUG("ATkbd: scan code set now: %02X\n", val); + DEBUG("ATkbd: scan code set now: %02x\n", val); } - kbd_setmap(kbd); + set_scancode_map(dev); } break; - case 0xf3: /*Set typematic rate/delay*/ - kbd_adddata_keyboard(0xfa); + case 0xf3: /* set typematic rate/delay */ + add_data_kbd(0xfa); break; default: - DEBUG("ATkbd: bad keyboard 0060 write %02X command %02X\n", val, kbd->key_command); + DEBUG("ATkbd: bad keyboard %02x data %02x\n", dev->key_command, val); + add_data_kbd(0xfe); break; } /* Keyboard command is now done. */ - kbd->key_command = 0x00; + dev->key_command = 0x00; } else { +#if 0 do_command: +#endif /* No keyboard command in progress. */ - kbd->key_command = 0x00; + dev->key_command = 0x00; - kbd_keyboard_set(kbd, 1); + set_enable_kbd(dev, 1); switch (val) { case 0x00: DEBUG("ATkbd: command 00\n"); - kbd_adddata_keyboard(0xfa); + add_data_kbd(0xfa); break; case 0x05: /*??? - sent by NT 4.0*/ - DEBUG("ATkbd: NT4.0 command FE\n"); - kbd_adddata_keyboard(0xfe); + DEBUG("ATkbd: command 05 (NT 4.0)\n"); + add_data_kbd(0xfe); break; - case 0x71: /*These two commands are sent by Pentium-era AMI BIOS'es.*/ + /* Sent by Pentium-era AMI BIOS'es.*/ + case 0x71: case 0x82: - DEBUG("ATkbd: Pentium-era AMI BIOS command %02X\n", val); + DEBUG("ATkbd: command %02x (Pentium-era AMI BIOS)\n", val); break; - case 0xed: /*Set/reset LEDs*/ + case 0xed: /* set/reset LEDs */ DEBUG("ATkbd: set/reset leds\n"); - kbd_adddata_keyboard(0xfa); + add_data_kbd(0xfa); - kbd->key_wantdata = 1; - kbd->key_command = val; + dev->key_wantdata = 1; break; - case 0xee: /*Diagnostic echo*/ + case 0xee: /* diagnostic echo */ DEBUG("ATkbd: ECHO\n"); - kbd_adddata_keyboard(0xee); + add_data_kbd(0xee); break; - case 0xef: /*NOP (No OPeration). Reserved for future use.*/ + case 0xef: /* NOP (reserved for future use) */ DEBUG("ATkbd: NOP\n"); break; - case 0xf0: /*Get/set scan code set*/ + case 0xf0: /* get/set scan code set */ DEBUG("ATkbd: scan code set\n"); - kbd_adddata_keyboard(0xfa); - kbd->key_wantdata = 1; - kbd->key_command = val; + add_data_kbd(0xfa); + dev->key_wantdata = 1; break; - case 0xf2: /*Read ID*/ - /* Fixed as translation will be done in kbd_adddata_keyboard(). */ + case 0xf2: /* read ID */ + /* Fixed as translation will be done in add_data_kbd(). */ DEBUG("ATkbd: read keyboard id\n"); - kbd_adddata_keyboard(0xfa); - kbd_adddata_keyboard(0xab); - kbd_adddata_keyboard(0x83); + add_data_kbd(0xfa); + add_data_kbd(0xab); + add_data_kbd(0x83); break; - case 0xf3: /*Set typematic rate/delay*/ + case 0xf3: /* set typematic rate/delay */ DEBUG("ATkbd: set typematic rate/delay\n"); - kbd_adddata_keyboard(0xfa); - kbd->key_wantdata = 1; - kbd->key_command = val; + add_data_kbd(0xfa); + dev->key_wantdata = 1; break; - case 0xf4: /*Enable keyboard*/ + case 0xf4: /* enable keyboard */ DEBUG("ATkbd: enable keyboard via keyboard\n"); - kbd_adddata_keyboard(0xfa); + add_data_kbd(0xfa); keyboard_scan = 1; break; - case 0xf5: /*Disable keyboard*/ + case 0xf5: /* disable keyboard */ DEBUG("ATkbd: disable keyboard via keyboard\n"); - kbd_adddata_keyboard(0xfa); keyboard_scan = 0; /* @@ -2879,62 +2914,66 @@ do_command: */ /*FALLTHROUGH*/ - case 0xf6: /*Set defaults*/ + case 0xf6: /* set defaults */ DEBUG("ATkbd: set defaults\n"); - kbd_adddata_keyboard(0xfa); + add_data_kbd(0xfa); keyboard_set3_all_break = 0; keyboard_set3_all_repeat = 0; memset(keyboard_set3_flags, 0, 512); keyboard_mode = (keyboard_mode & 0xfc) | 0x02; - kbd_setmap(kbd); + set_scancode_map(dev); break; - case 0xf7: /*Set all keys to repeat*/ + case 0xf7: /* set all keys to repeat */ DEBUG("ATkbd: set all keys to repeat\n"); - kbd_adddata_keyboard(0xfa); + add_data_kbd(0xfa); keyboard_set3_all_break = 1; break; - case 0xf8: /*Set all keys to give make/break codes*/ + case 0xf8: /* set all keys to give make/break codes */ DEBUG("ATkbd: set all keys to give make/break codes\n"); - kbd_adddata_keyboard(0xfa); + add_data_kbd(0xfa); keyboard_set3_all_break = 1; break; - case 0xf9: /*Set all keys to give make codes only*/ + case 0xf9: /* set all keys to give make codes only */ DEBUG("ATkbd: set all keys to give make codes only\n"); - kbd_adddata_keyboard(0xfa); + add_data_kbd(0xfa); keyboard_set3_all_break = 0; break; - case 0xfa: /*Set all keys to repeat and give make/break codes*/ + case 0xfa: /* set all keys to repeat and give make/break codes */ DEBUG("ATkbd: set all keys to repeat and give make/break codes\n"); - kbd_adddata_keyboard(0xfa); + add_data_kbd(0xfa); keyboard_set3_all_repeat = 1; keyboard_set3_all_break = 1; break; - case 0xfe: /*Resend last scan code*/ + case 0xfe: /* resend last scan code */ DEBUG("ATkbd: reset last scan code\n"); - kbd_adddata_keyboard(kbd->last_scan_code); + add_data_kbd(dev->last_scan_code); break; - case 0xff: /*Reset*/ + case 0xff: /* reset */ DEBUG("ATkbd: kbd reset\n"); key_queue_start = key_queue_end = 0; /*Clear key queue*/ - kbd_adddata_keyboard(0xfa); - kbd_adddata_keyboard(0xaa); + add_data_kbd(0xfa); + add_data_kbd(0xaa); /* Set scan code set to 2. */ keyboard_mode = (keyboard_mode & 0xfc) | 0x02; - kbd_setmap(kbd); + set_scancode_map(dev); break; default: - ERRLOG("ATkbd: bad keyboard command %02X\n", val); - kbd_adddata_keyboard(0xfe); + ERRLOG("ATkbd: bad keyboard command %02x\n", val); + add_data_kbd(0xfe); } + + /* If command needs data, remember command. */ + if (dev->key_wantdata == 1) + dev->key_command = val; } } break; @@ -2952,34 +2991,17 @@ do_command: speaker_was_enable = 1; pit_set_gate(&pit, 2, val & 1); - if ((kbd->flags & KBC_VEN_MASK) == KBC_VEN_XI8088) { - kbd->write_func(kbd->func_priv, !!(val & 0x04)); + if ((dev->flags & KBC_VEN_MASK) == KBC_VEN_XI8088) { + dev->write_func(dev->func_priv, !!(val & 0x04)); } break; case 0x64: - /* - * Try to recover from bad commands. - * - * If we get a command here, but seem to be still in - * keyboard-command data mode, abort that... - */ - if (kbd->key_wantdata || kbd->key_command) { - ERRLOG("ATkbd: *** BUG ALERT *** aborting previous keyboard command 0x%02X (data %d)\n", kbd->key_command, kbd->key_wantdata); + /* Controller command. */ + dev->want60 = 0; - /* If they were waiting for data.. */ - kbd_adddata(0xfa); - - /* Abort the previous command. */ - kbd->key_command = 0x00; - kbd->key_wantdata = 0; - } - - kbd->want60 = 0; - kbd->command = val; - - /*New controller command*/ switch (val) { + /* Read data from KBC memory. */ case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: case 0x28: case 0x29: case 0x2a: case 0x2b: @@ -2988,9 +3010,10 @@ do_command: case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f: - kbd_adddata(kbd->mem[val & 0x1f]); + add_data(dev, dev->mem[val & 0x1f]); break; + /* Write data to KBC memory. */ case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: case 0x68: case 0x69: case 0x6a: case 0x6b: @@ -2999,100 +3022,109 @@ do_command: case 0x74: case 0x75: case 0x76: case 0x77: case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f: - kbd->want60 = 1; + dev->want60 = 1; break; - case 0xaa: /*Self-test*/ + case 0xaa: /* self-test */ DEBUG("ATkbd: self-test\n"); - if ((kbd->flags & KBC_VEN_MASK) == KBC_VEN_TOSHIBA) - kbd->status |= STAT_IFULL; - if (! kbd->initialized) { - kbd->initialized = 1; + if ((dev->flags & KBC_VEN_MASK) == KBC_VEN_TOSHIBA) + dev->status |= STAT_IFULL; + if (! dev->initialized) { + dev->initialized = 1; key_ctrl_queue_start = key_ctrl_queue_end = 0; - kbd->status &= ~STAT_OFULL; + dev->status &= ~STAT_OFULL; } - kbd->status |= STAT_SYSFLAG; - kbd->mem[0] |= 0x04; - kbd_keyboard_set(kbd, 1); - if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) - kbd_mouse_set(kbd, 1); - kbd_output_write(kbd, 0xcf); - kbd_adddata(0x55); + dev->status |= STAT_SYSFLAG; + dev->mem[0] |= 0x04; + set_enable_kbd(dev, 1); + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) + set_enable_mouse(dev, 1); + write_output(dev, 0xcf); + add_data(dev, 0x55); break; - case 0xab: /*Interface test*/ + case 0xab: /* interface test */ DEBUG("ATkbd: interface test\n"); - kbd_adddata(0x00); /*no error*/ + add_data(dev, 0x00); /*no error*/ break; - case 0xac: /*Diagnostic dump*/ + case 0xac: /* diagnostic dump */ DEBUG("ATkbd: diagnostic dump\n"); for (i = 0; i < 16; i++) - kbd_adddata(kbd->mem[i]); - kbd_adddata((kbd->input_port & 0xf0) | 0x80); - kbd_adddata(kbd->output_port); - kbd_adddata(kbd->status); + add_data(dev, dev->mem[i]); + add_data(dev, (dev->input_port & 0xf0) | 0x80); + add_data(dev, dev->output_port); + add_data(dev, dev->status); break; - case 0xad: /*Disable keyboard*/ + case 0xad: /* disable keyboard */ DEBUG("ATkbd: disable keyboard\n"); - kbd_keyboard_set(kbd, 0); + set_enable_kbd(dev, 0); break; - case 0xae: /*Enable keyboard*/ + case 0xae: /* enable keyboard */ DEBUG("ATkbd: enable keyboard\n"); - kbd_keyboard_set(kbd, 1); + set_enable_kbd(dev, 1); break; - case 0xd0: /*Read output port*/ + case 0xd0: /* read output port */ DEBUG("ATkbd: read output port\n"); mask = 0xff; if (! keyboard_scan) mask &= 0xbf; - if (!mouse_scan && ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1)) + if (!mouse_scan && ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) mask &= 0xf7; - kbd_adddata(kbd->output_port & mask); + add_data(dev, dev->output_port & mask); break; - case 0xd1: /*Write output port*/ + case 0xd1: /* write output port */ DEBUG("ATkbd: write output port\n"); - kbd->want60 = 1; + dev->want60 = 1; break; - case 0xd2: /*Write keyboard output buffer*/ + case 0xd2: /* write keyboard output buffer */ DEBUG("ATkbd: write keyboard output buffer\n"); - kbd->want60 = 1; + dev->want60 = 1; break; - case 0xd4: /* Dunno, but OS/2 2.00LA sends it */ - kbd->want60 = 1; + case 0xd4: /* dunno, but OS/2 2.00LA sends it */ + dev->want60 = 1; break; - case 0xdd: /* Disable A20 Address Line */ + case 0xdd: /* disable A20 address line */ DEBUG("ATkbd: disable A20\n"); - kbd_output_write(kbd, kbd->output_port & 0xfd); + write_output(dev, dev->output_port & 0xfd); break; - case 0xdf: /* Enable A20 Address Line */ + case 0xdf: /* enable A20 address line */ DEBUG("ATkbd: enable A20\n"); - kbd_output_write(kbd, kbd->output_port | 0x02); + write_output(dev, dev->output_port | 0x02); break; - case 0xe0: /*Read test inputs*/ + case 0xe0: /* read test inputs */ DEBUG("ATkbd: read test inputs\n"); - kbd_adddata(0x00); + add_data(dev, 0x00); break; default: - /* Run the vendor-specific command handler, if present, - otherwise (or if the former returns 1), assume bad command. */ - if (kbd->write64_ven) - bad = kbd->write64_ven(kbd, val); + /* + * Unrecognized controller command. + * + * If we have a vendor-specific handler, run + * that. Otherwise, or if that handler fails, + * log a bad command. + */ + if (dev->write64_ven) + bad = dev->write64_ven(dev, val); if (bad) { - DEBUG("ATkbd: bad controller command %02X\n", val); + DEBUG("ATkbd: bad controller command %02x\n", val); } } + + /* If the command needs data, remember the command. */ + if (dev->want60) + dev->command = val; break; } } @@ -3101,19 +3133,19 @@ do_command: static uint8_t kbd_read(uint16_t port, void *priv) { - atkbd_t *kbd = (atkbd_t *)priv; + atkbd_t *dev = (atkbd_t *)priv; uint8_t ret = 0xff; - if (((kbd->flags & KBC_VEN_MASK) == KBC_VEN_XI8088) && (port == 0x63)) + if (((dev->flags & KBC_VEN_MASK) == KBC_VEN_XI8088) && (port == 0x63)) port = 0x61; switch (port) { case 0x60: - ret = kbd->out; - kbd->status &= ~(STAT_OFULL); - if (kbd->last_irq) { - picintc(kbd->last_irq); - kbd->last_irq = 0; + ret = dev->out; + dev->status &= ~(STAT_OFULL); + if (dev->last_irq) { + picintc(dev->last_irq); + dev->last_irq = 0; } break; @@ -3121,14 +3153,14 @@ kbd_read(uint16_t port, void *priv) ret = ppi.pb & ~0xe0; if (ppispeakon) ret |= 0x20; - if ((kbd->flags & KBC_TYPE_MASK) != KBC_TYPE_ISA) { - if (kbd->refresh) + if ((dev->flags & KBC_TYPE_MASK) > KBC_TYPE_PS2_NOREF) { + if (dev->refresh) ret |= 0x10; else ret &= ~0x10; } - if ((kbd->flags & KBC_VEN_MASK) == KBC_VEN_XI8088) { - if (kbd->read_func(kbd->func_priv)) + if ((dev->flags & KBC_VEN_MASK) == KBC_VEN_XI8088) { + if (dev->read_func(dev->func_priv)) ret |= 0x04; else ret &= ~0x04; @@ -3136,15 +3168,19 @@ kbd_read(uint16_t port, void *priv) break; case 0x64: - ret = (kbd->status & 0xFB) | (keyboard_mode & CCB_SYSTEM); + ret = (dev->status & 0xFB) | (keyboard_mode & CCB_SYSTEM); ret |= STAT_UNLOCKED; /* The transmit timeout (TTIMEOUT) flag should *NOT* be cleared, otherwise the IBM PS/2 Model 80's BIOS gives error 8601 (mouse error). */ - kbd->status &= ~(STAT_RTIMEOUT/* | STAT_TTIMEOUT*/); + dev->status &= ~(STAT_RTIMEOUT/* | STAT_TTIMEOUT*/); + break; + + default: + ERRLOG("ATkbd: read(%04x) invalid!\n", port); break; } - DBGLOG(2, "ATkbd: read(%04X) = %02X\n", port, ret); + DBGLOG(2, "ATkbd: read(%04x) = %02x\n", port, ret); return(ret); } @@ -3153,132 +3189,61 @@ kbd_read(uint16_t port, void *priv) static void kbd_refresh(void *priv) { - atkbd_t *kbd = (atkbd_t *)priv; + atkbd_t *dev = (atkbd_t *)priv; - kbd->refresh = !kbd->refresh; - kbd->refresh_time += PS2_REFRESH_TIME; + dev->refresh = !dev->refresh; + dev->refresh_time += PS2_REFRESH_TIME; } static void kbd_reset(void *priv) { - atkbd_t *kbd = (atkbd_t *)priv; + atkbd_t *dev = (atkbd_t *)priv; - kbd->initialized = 0; - kbd->dtrans = 0; - kbd->first_write = 1; - kbd->status = STAT_UNLOCKED | STAT_CD; - kbd->mem[0] = 0x01; - kbd->wantirq = 0; - kbd_output_write(kbd, 0xcf); - kbd->input_port = (video_type() == VID_TYPE_MDA) ? 0xf0 : 0xb0; - kbd->out_new = -1; - kbd->last_irq = 0; - kbd->secr_phase = 0; - kbd->key_wantdata = 0; + dev->initialized = 0; + dev->dtrans = 0; + dev->first_write = 1; + dev->status = STAT_UNLOCKED | STAT_CD; + dev->mem[0] = 0x01; + dev->wantirq = 0; + write_output(dev, 0xcf); + dev->out_new = -1; + dev->last_irq = 0; + dev->secr_phase = 0; + dev->key_wantdata = 0; - keyboard_mode = 0x02 | kbd->dtrans; + /* Set up the correct Video Type bits. */ + if ((dev->flags & KBC_VEN_MASK) == KBC_VEN_XI8088) + dev->input_port = (video_type() == VID_TYPE_MDA) ? 0xb0 : 0xf0; + else + dev->input_port = (video_type() == VID_TYPE_MDA) ? 0xf0 : 0xb0; + DEBUG("ATkbd: input port = %02x\n", dev->input_port); - kbd_keyboard_set(kbd, 1); - kbd_mouse_set(kbd, 0); + keyboard_mode = 0x02 | dev->dtrans; + + /* Enable keyboard, disable mouse. */ + set_enable_kbd(dev, 1); + set_enable_mouse(dev, 0); sc_or = 0; -#if 0 - keyboard_update_states(0, 0, 0); -#endif memset(keyboard_set3_flags, 0, 512); - kbd_setmap(kbd); -} - - -static void * -kbd_init(const device_t *info, UNUSED(void *parent)) -{ - atkbd_t *kbd; - - kbd = (atkbd_t *)mem_alloc(sizeof(atkbd_t)); - memset(kbd, 0x00, sizeof(atkbd_t)); - - kbd->flags = info->local; - - kbd_reset(kbd); - - io_sethandler(0x0060, 5, - kbd_read, NULL, NULL, kbd_write, NULL, NULL, kbd); - keyboard_send = kbd_adddata_keyboard; - - timer_add(kbd_poll, kbd, &keyboard_delay, TIMER_ALWAYS_ENABLED); - - if ((kbd->flags & KBC_TYPE_MASK) != KBC_TYPE_ISA) { -#if 1 - if ((kbd->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2) { - /* - * These machines force translation off, so the - * the keyboard must start in scan code set 1. - */ - keyboard_mode &= ~0x03; - keyboard_mode |= 0x01; - } -#endif - - timer_add(kbd_refresh, kbd, &kbd->refresh_time, TIMER_ALWAYS_ENABLED); - } - - timer_add(kbd_pulse_poll, kbd, &kbd->pulse_cb, &kbd->pulse_cb); - - kbd->write60_ven = NULL; - kbd->write64_ven = NULL; - - switch(kbd->flags & KBC_VEN_MASK) { - case KBC_VEN_GENERIC: - kbd->write64_ven = &kbd_write64_generic; - break; - - case KBC_VEN_AMI: - kbd->write60_ven = &kbd_write60_ami; - kbd->write64_ven = &kbd_write64_ami; - break; - - case KBC_VEN_IBM_MCA: - kbd->write64_ven = &kbd_write64_ibm_mca; - break; - - case KBC_VEN_QUADTEL: - kbd->write60_ven = &kbd_write60_quadtel; - kbd->write64_ven = &kbd_write64_quadtel; - break; - - case KBC_VEN_TOSHIBA: - kbd->write60_ven = &kbd_write60_toshiba; - kbd->write64_ven = &kbd_write64_toshiba; - break; - - case KBC_VEN_ACER: - kbd->write60_ven = &kbd_write60_acer; - kbd->write64_ven = &kbd_write64_acer; - break; - } - - /* We need this, sadly. */ - CurrentKbd = kbd; - - return(kbd); + set_scancode_map(dev); } static void kbd_close(void *priv) { - atkbd_t *kbd = (atkbd_t *)priv; + atkbd_t *dev = (atkbd_t *)priv; - kbd_reset(kbd); + kbd_reset(dev); /* Stop timers. */ keyboard_delay = 0; - kbd->refresh_time = 0; + dev->refresh_time = 0; keyboard_scan = 0; keyboard_send = NULL; @@ -3286,8 +3251,72 @@ kbd_close(void *priv) /* Disable the scancode maps. */ keyboard_set_table(NULL); - CurrentKbd = NULL; - free(kbd); + SavedKbd = NULL; + free(dev); +} + + +static void * +kbd_init(const device_t *info, UNUSED(void *parent)) +{ + atkbd_t *dev; + + dev = (atkbd_t *)mem_alloc(sizeof(atkbd_t)); + memset(dev, 0x00, sizeof(atkbd_t)); + + dev->flags = info->local; + + kbd_reset(dev); + + io_sethandler(0x0060, 5, + kbd_read, NULL, NULL, kbd_write, NULL, NULL, dev); + keyboard_send = add_data_kbd; + + timer_add(kbd_poll, dev, &keyboard_delay, TIMER_ALWAYS_ENABLED); + + if ((dev->flags & KBC_TYPE_MASK) > 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); + + dev->write60_ven = NULL; + dev->write64_ven = NULL; + + switch(dev->flags & KBC_VEN_MASK) { + case KBC_VEN_GENERIC: + case KBC_VEN_IBM_PS1: + dev->write64_ven = write64_generic; + break; + + case KBC_VEN_AMI: + dev->write60_ven = write60_ami; + dev->write64_ven = write64_ami; + break; + + case KBC_VEN_IBM_MCA: + dev->write64_ven = write64_ibm_mca; + break; + + case KBC_VEN_QUADTEL: + dev->write60_ven = write60_quadtel; + dev->write64_ven = write64_quadtel; + break; + + case KBC_VEN_TOSHIBA: + dev->write60_ven = write60_toshiba; + dev->write64_ven = write64_toshiba; + break; + + case KBC_VEN_ACER: + dev->write60_ven = write60_acer; + dev->write64_ven = write64_acer; + break; + } + + /* We need this, sadly. */ + SavedKbd = dev; + + return(dev); } @@ -3322,7 +3351,37 @@ const device_t keyboard_at_toshiba_device = { }; const device_t keyboard_ps2_device = { - "PS/2 Keyboard", + "PS/2 Keyboard (Generic)", + 0, + KBC_TYPE_PS2_NOREF | KBC_VEN_GENERIC, + NULL, + kbd_init, kbd_close, kbd_reset, + NULL, NULL, NULL, NULL, + NULL +}; + +const device_t keyboard_ps2_pci_device = { + "PS/2 Keyboard (Generic, PCI)", + DEVICE_PCI, + KBC_TYPE_PS2_NOREF | KBC_VEN_GENERIC, + NULL, + kbd_init, kbd_close, kbd_reset, + NULL, NULL, NULL, NULL, + NULL +}; + +const device_t keyboard_ps2_ps1_device = { + "PS/2 Keyboard (IBM PS/1)", + 0, + KBC_TYPE_PS2_NOREF | KBC_VEN_IBM_PS1, + NULL, + kbd_init, kbd_close, kbd_reset, + NULL, NULL, NULL, NULL, + NULL +}; + +const device_t keyboard_ps2_ps2_device = { + "PS/2 Keyboard (IBM PS/2)", 0, KBC_TYPE_PS2_1 | KBC_VEN_GENERIC, NULL, @@ -3331,21 +3390,14 @@ const device_t keyboard_ps2_device = { NULL }; - const device_t keyboard_ps2_acer_device = { - "Acer 90M002A PS/2 Keyboard", + "PS/2 Keyboard (Acer 90M002A)", 0, - KBC_TYPE_PS2_2 | KBC_VEN_ACER, - NULL, - kbd_init, kbd_close, kbd_reset, - NULL, NULL, NULL, NULL, - NULL -}; - -const device_t keyboard_ps2_xi8088_device = { - "PS/2 Keyboard (Xi8088)", - 0, - KBC_TYPE_PS2_1 | KBC_VEN_XI8088, +#ifdef KBC_VEN_ACER + KBC_TYPE_PS2_NOREF | KBC_VEN_ACER, +#else + KBC_TYPE_PS2_NOREF | KBC_VEN_GENERIC, +#endif NULL, kbd_init, kbd_close, kbd_reset, NULL, NULL, NULL, NULL, @@ -3353,9 +3405,19 @@ const device_t keyboard_ps2_xi8088_device = { }; const device_t keyboard_ps2_ami_device = { - "PS/2 Keyboard (AMI)", + "PS/2 Keyboard (AMIKEY)", 0, - KBC_TYPE_PS2_1 | KBC_VEN_AMI, + KBC_TYPE_PS2_NOREF | KBC_VEN_AMI, + NULL, + kbd_init, kbd_close, kbd_reset, + NULL, NULL, NULL, NULL, + NULL +}; + +const device_t keyboard_ps2_ami_pci_device = { + "PS/2 Keyboard (AMIKEY PCI)", + DEVICE_PCI, + KBC_TYPE_PS2_NOREF | KBC_VEN_AMI, NULL, kbd_init, kbd_close, kbd_reset, NULL, NULL, NULL, NULL, @@ -3363,7 +3425,7 @@ const device_t keyboard_ps2_ami_device = { }; const device_t keyboard_ps2_mca_device = { - "PS/2 Keyboard", + "PS/2 Keyboard (MCA #1)", 0, KBC_TYPE_PS2_1 | KBC_VEN_IBM_MCA, NULL, @@ -3373,7 +3435,7 @@ const device_t keyboard_ps2_mca_device = { }; const device_t keyboard_ps2_mca_2_device = { - "PS/2 Keyboard", + "PS/2 Keyboard (MCA #2)", 0, KBC_TYPE_PS2_2 | KBC_VEN_IBM_MCA, NULL, @@ -3385,27 +3447,17 @@ const device_t keyboard_ps2_mca_2_device = { const device_t keyboard_ps2_quadtel_device = { "PS/2 Keyboard (Quadtel/MegaPC)", 0, - KBC_TYPE_PS2_1 | KBC_VEN_QUADTEL, + KBC_TYPE_PS2_NOREF | KBC_VEN_QUADTEL, NULL, kbd_init, kbd_close, kbd_reset, NULL, NULL, NULL, NULL, NULL }; -const device_t keyboard_ps2_pci_device = { - "PS/2 Keyboard", - DEVICE_PCI, - KBC_TYPE_PS2_1 | KBC_VEN_GENERIC, - NULL, - kbd_init, kbd_close, kbd_reset, - NULL, NULL, NULL, NULL, - NULL -}; - -const device_t keyboard_ps2_ami_pci_device = { - "PS/2 Keyboard (AMI)", - DEVICE_PCI, - KBC_TYPE_PS2_1 | KBC_VEN_AMI, +const device_t keyboard_ps2_xi8088_device = { + "PS/2 Keyboard (Xi8088)", + 0, + KBC_TYPE_PS2_NOREF | KBC_VEN_XI8088, NULL, kbd_init, kbd_close, kbd_reset, NULL, NULL, NULL, NULL, @@ -3441,23 +3493,23 @@ keyboard_at_adddata_mouse(uint8_t val) void keyboard_at_set_funcs(void *arg, uint8_t (*readfunc)(void *), void (*writefunc)(void *, uint8_t), void *priv) { - atkbd_t *kbd = (atkbd_t *)arg; + atkbd_t *dev = (atkbd_t *)arg; - kbd->read_func = readfunc; - kbd->write_func = writefunc; - kbd->func_priv = priv; + dev->read_func = readfunc; + dev->write_func = writefunc; + dev->func_priv = priv; } void keyboard_at_set_mouse_scan(uint8_t val) { - atkbd_t *kbd = CurrentKbd; + atkbd_t *dev = SavedKbd; uint8_t temp_mouse_scan = val ? 1 : 0; if (temp_mouse_scan == mouse_scan) return; - kbd_mouse_set(kbd, val ? 1 : 0); + set_enable_mouse(dev, val ? 1 : 0); INFO("ATkbd: mouse scan %sabled via PCI\n", mouse_scan ? "en" : "dis"); } diff --git a/src/devices/input/mouse_bus.c b/src/devices/input/mouse_bus.c index a1580d9..4847695 100644 --- a/src/devices/input/mouse_bus.c +++ b/src/devices/input/mouse_bus.c @@ -53,7 +53,7 @@ * Microsoft Windows NT 3.1 * Microsoft Windows 98 SE * - * Version: @(#)mouse_bus.c 1.1.8 2019/04/25 + * Version: @(#)mouse_bus.c 1.1.9 2019/04/27 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -678,6 +678,7 @@ bm_init(const device_t *info, UNUSED(void *parent)) case 1: /* on-board controller, Logitech compatible */ dev->base = 0x023c; dev->irq = -1; + dev->bn = 2; break; case 10: /* Microsoft InPort controller */ @@ -689,11 +690,13 @@ bm_init(const device_t *info, UNUSED(void *parent)) case 11: /* Microsoft InPort on-board controller */ dev->flags = FLAG_INPORT; dev->base = 0x023c; + dev->bn = 2; dev->irq = -1; break; } - dev->bn = device_get_config_int("buttons"); + if (dev->bn == 0) + dev->bn = device_get_config_int("buttons"); mouse_set_buttons(dev->bn); dev->timer_enabled = 0; diff --git a/src/devices/sound/snd_sb.c b/src/devices/sound/snd_sb.c index 7b336fa..06ca65e 100644 --- a/src/devices/sound/snd_sb.c +++ b/src/devices/sound/snd_sb.c @@ -8,11 +8,12 @@ * * Sound Blaster emulation. * - * Version: @(#)snd_sb.c 1.0.11 2019/04/11 + * Version: @(#)snd_sb.c 1.0.12 2019/04/27 * * Authors: Fred N. van Kempen, * Miran Grca, * TheCollector1995, + * John Sirett, //FIXME: * Sarah Walker, * * Copyright 2017-2019 Fred N. van Kempen. @@ -529,8 +530,8 @@ void sb_ct1335_mixer_write(uint16_t addr, uint8_t val, void *p) mixer->cd = sb_att_4dbstep_3bits[(mixer->regs[0x08] >> 1)&0x7]; mixer->voice = sb_att_7dbstep_2bits[(mixer->regs[0x0A] >> 1)&0x3]; - sound_cd_set_volume(((uint32_t)mixer->master * (uint32_t)mixer->cd) / 65535, - ((uint32_t)mixer->master * (uint32_t)mixer->cd) / 65535); + sound_cd_set_volume(((uint32_t)mixer->master * (uint32_t)mixer->cd * 4) / 65535, + ((uint32_t)mixer->master * (uint32_t)mixer->cd * 4) / 65535); } } @@ -650,8 +651,8 @@ void sb_ct1345_mixer_write(uint16_t addr, uint8_t val, void *p) } /* TODO: pcspeaker volume? Or is it not worth? */ - sound_cd_set_volume(((uint32_t)mixer->master_l * (uint32_t)mixer->cd_l) / 65535, - ((uint32_t)mixer->master_r * (uint32_t)mixer->cd_r) / 65535); + sound_cd_set_volume(((uint32_t)mixer->master_l * (uint32_t)mixer->cd_l * 4) / 65535, + ((uint32_t)mixer->master_r * (uint32_t)mixer->cd_r * 4) / 65535); } } @@ -816,8 +817,8 @@ void sb_ct1745_mixer_write(uint16_t addr, uint8_t val, void *p) mixer->treble_r = mixer->regs[0x45] >> 4; /*TODO: pcspeaker volume, with "output_selector" check? or better not? */ - sound_cd_set_volume(((uint32_t)mixer->master_l * (uint32_t)mixer->cd_l) / 65535, - ((uint32_t)mixer->master_r * (uint32_t)mixer->cd_r) / 65535); + sound_cd_set_volume(((uint32_t)mixer->master_l * (uint32_t)mixer->cd_l * 4) / 65535, + ((uint32_t)mixer->master_r * (uint32_t)mixer->cd_r * 4) / 65535); DEBUG("sb_ct1745: Received register WRITE: %02X\t%02X\n", mixer->index, mixer->regs[mixer->index]); } } diff --git a/src/devices/video/vid_svga.c b/src/devices/video/vid_svga.c index 639ebf4..75321c1 100644 --- a/src/devices/video/vid_svga.c +++ b/src/devices/video/vid_svga.c @@ -11,7 +11,7 @@ * This is intended to be used by another SVGA driver, * and not as a card in it's own right. * - * Version: @(#)vid_svga.c 1.0.19 2019/04/25 + * Version: @(#)vid_svga.c 1.0.20 2019/04/27 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -135,7 +135,7 @@ svga_out(uint16_t addr, uint8_t val, void *priv) if (o != val) svga_recalctimings(svga); } else if (svga->attraddr == 0x11) { - svga->overscan_color = svga->pallook[svga->attrregs[0x11]]; + svga->overscan_color = svga->pallook[svga->attrregs[0x11] & 0x3f]; if (o != val) svga_recalctimings(svga); } else if (svga->attraddr == 0x12) { @@ -1209,7 +1209,7 @@ svga_doblit(int y1, int y2, int wx, int wy, svga_t *svga) for (i = (y_add >> 1); i < (ysize + (y_add >> 1)); i ++) { for (j = 0; j < 8; j++) { - screen->line[i & 0x7ff][32 + j].val = svga->pallook[svga->overscan_color]; + screen->line[i & 0x7ff][32 + j].val = svga->overscan_color; screen->line[i & 0x7ff][32 + xsize + (x_add >> 1) + j].val = svga->overscan_color; } } diff --git a/src/devices/video/vid_ti_cf62011.c b/src/devices/video/vid_ti_cf62011.c index deeaa63..135047c 100644 --- a/src/devices/video/vid_ti_cf62011.c +++ b/src/devices/video/vid_ti_cf62011.c @@ -42,7 +42,7 @@ * which are the same as the XGA. It supports up to 1MB of VRAM, * but we lock it down to 512K. The PS/1 2122 had 256K. * - * Version: @(#)vid_ti_cf62011.c 1.0.9 2019/04/19 + * Version: @(#)vid_ti_cf62011.c 1.0.10 2019/04/27 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -326,7 +326,7 @@ const device_t ti_cf62011_device = { #endif -const device_t ibm_ps1_2121_device = { +const device_t ti_ps1_device = { "IBM PS/1 Model 2121 SVGA", DEVICE_VIDEO(VID_TYPE_SPEC) | DEVICE_ISA, 512, diff --git a/src/devices/video/vid_vga.c b/src/devices/video/vid_vga.c index afbeb65..3236d15 100644 --- a/src/devices/video/vid_vga.c +++ b/src/devices/video/vid_vga.c @@ -8,7 +8,7 @@ * * IBM VGA emulation. * - * Version: @(#)vid_vga.c 1.0.9 2019/04/19 + * Version: @(#)vid_vga.c 1.0.10 2019/04/27 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -206,8 +206,8 @@ const device_t vga_device = { static const video_timings_t ps1vga_timing = {VID_ISA,6,8,16,6,8,16}; -const device_t ps1vga_device = { - "PS/1 VGA", +const device_t vga_ps1_device = { + "VGA (PS/1)", DEVICE_VIDEO(VID_TYPE_SPEC) | DEVICE_ISA, 1, NULL, @@ -219,8 +219,8 @@ const device_t ps1vga_device = { NULL }; -const device_t ps1vga_mca_device = { - "PS/1 VGA", +const device_t vga_ps1_mca_device = { + "VGA (PS/1, MCA)", DEVICE_VIDEO(VID_TYPE_SPEC) | DEVICE_MCA, 1, NULL, diff --git a/src/devices/video/video.h b/src/devices/video/video.h index 1c2e5da..02348d3 100644 --- a/src/devices/video/video.h +++ b/src/devices/video/video.h @@ -8,7 +8,7 @@ * * Definitions for the video controller module. * - * Version: @(#)video.h 1.0.32 2019/04/23 + * Version: @(#)video.h 1.0.33 2019/04/27 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -307,12 +307,12 @@ extern const device_t tgui9440_pci_device; #if defined(DEV_BRANCH) && defined(USE_TI) extern const device_t ti_cf62011_device; #endif -extern const device_t ibm_ps1_2121_device; +extern const device_t ti_ps1_device; /* IBM VGA and compatibles. */ extern const device_t vga_device; -extern const device_t ps1vga_device; -extern const device_t ps1vga_mca_device; +extern const device_t vga_ps1_device; +extern const device_t vga_ps1_mca_device; /* 3Dfx VooDoo-series cards. */ extern const device_t voodoo_device; diff --git a/src/machines/m_ps1.c b/src/machines/m_ps1.c index bd5ec54..6c2003d 100644 --- a/src/machines/m_ps1.c +++ b/src/machines/m_ps1.c @@ -519,7 +519,7 @@ ps1_init(const device_t *info, void *arg) } /* Enable the PS/1 VGA controller. */ - device_add(&ps1vga_device); + device_add(&vga_ps1_device); /* Enable the builtin sound chip. */ device_add(&snd_device); @@ -549,7 +549,7 @@ ps1_init(const device_t *info, void *arg) } /* Initialize the video controller. */ - device_add(&ibm_ps1_2121_device); + device_add(&ti_ps1_device); /* Enable the builtin sound chip. */ device_add(&snd_device); @@ -599,7 +599,7 @@ ps1_init(const device_t *info, void *arg) device_add(&ps_nvr_device); - device_add(&keyboard_ps2_device); + device_add(&keyboard_ps2_ps1_device); device_add(&mouse_ps2_device); diff --git a/src/machines/m_ps2_isa.c b/src/machines/m_ps2_isa.c index 4e1974e..c9b72dc 100644 --- a/src/machines/m_ps2_isa.c +++ b/src/machines/m_ps2_isa.c @@ -8,7 +8,7 @@ * * Implementation of ISA-based PS/2 machines. * - * Version: @(#)m_ps2_isa.c 1.0.17 2019/04/25 + * Version: @(#)m_ps2_isa.c 1.0.18 2019/04/27 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -243,13 +243,13 @@ ps2_init(const device_t *info, void *arg) device_add(&ps_nvr_device); - device_add(&keyboard_ps2_device); + device_add(&keyboard_ps2_ps2_device); device_add(&fdc_at_ps1_device); switch(dev->type) { case 0: /* Model 30/286 */ - device_add(&ps1vga_device); + device_add(&vga_ps1_device); break; } diff --git a/src/machines/m_ps2_mca.c b/src/machines/m_ps2_mca.c index 8628ff3..f40021e 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.22 2019/04/25 + * Version: @(#)m_ps2_mca.c 1.0.23 2019/04/27 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -555,7 +555,7 @@ model_50_init(ps2_t *dev) } if (video_card == VID_INTERNAL) - device_add(&ps1vga_device); + device_add(&vga_ps1_device); } @@ -743,7 +743,7 @@ model_55sx_init(ps2_t *dev) dev->planar_write = model_55sx_write; if (video_card == VID_INTERNAL) - device_add(&ps1vga_device); + device_add(&vga_ps1_device); } @@ -1069,7 +1069,7 @@ model_70_init(ps2_t *dev) } if (video_card == VID_INTERNAL) - device_add(&ps1vga_device); + device_add(&vga_ps1_device); } @@ -1236,7 +1236,7 @@ model_80_init(ps2_t *dev) } if (video_card == VID_INTERNAL) - device_add(&ps1vga_device); + device_add(&vga_ps1_device); } @@ -1443,8 +1443,6 @@ ps2_init(const device_t *info, void *arg) device_add(&ps_nvr_device); - device_add(&keyboard_ps2_mca_device); - device_add(&fdc_at_device); parallel_setup(0, 0x03bc); @@ -1468,19 +1466,23 @@ ps2_init(const device_t *info, void *arg) switch(dev->type) { case 50: /* Model 50 */ + device_add(&keyboard_ps2_mca_device); model_50_init(dev); break; case 55: /* Model 55SX */ + device_add(&keyboard_ps2_mca_device); model_55sx_init(dev); break; case 73: /* Model 70, Type 3 */ case 74: /* Model 70, Type 4 */ + device_add(&keyboard_ps2_mca_device); model_70_init(dev); break; case 80: /* Model 80 */ + device_add(&keyboard_ps2_mca_device); model_80_init(dev); break; } diff --git a/src/plat.h b/src/plat.h index 5c0747a..60218c7 100644 --- a/src/plat.h +++ b/src/plat.h @@ -8,7 +8,7 @@ * * Define the various platform support functions. * - * Version: @(#)plat.h 1.0.23 2019/03/05 + * Version: @(#)plat.h 1.0.24 2019/04/26 * * Author: Fred N. van Kempen, * @@ -160,7 +160,8 @@ extern uint64_t plat_timer_read(void); extern uint32_t plat_get_ticks(void); extern void plat_delay_ms(uint32_t count); extern void plat_mouse_capture(int on); -extern int plat_kbd_state(void); +extern int plat_get_kbd_state(void); +extern void plat_set_kbd_state(int flags); extern void plat_fullscreen(int on); #ifdef EMU_UI_H extern const string_t *plat_lang_load(lang_t *ptr); diff --git a/src/ui/ui_misc.c b/src/ui/ui_misc.c index 2d4ffc5..6ad03b0 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.2 2019/04/26 + * Version: @(#)ui_misc.c 1.0.3 2019/04/26 * * Author: Fred N. van Kempen, * @@ -60,6 +60,9 @@ ui_set_kbd_state(int flags) { /* First of all, update our status bar. */ ui_sb_kbstate(flags); + + /* Let the platform code try to update the host keyboard. */ + plat_set_kbd_state(flags); } diff --git a/src/win/win_d2d.cpp b/src/win/win_d2d.cpp index dbcce97..81d46f8 100644 --- a/src/win/win_d2d.cpp +++ b/src/win/win_d2d.cpp @@ -57,16 +57,18 @@ #include "win_d2d.h" +#define PATH_D2D_DLL "d2d1.dll" + + #if USE_D2D == 2 -# define PATH_D2D_DLL "d2d1.dll" # define DLLFUNC(x) D2D1_ ## x /* Pointers to the real functions. */ -static bool (*D2D1_CreateFactory)(D2D1_FACTORY_TYPE facType, - REFIID riid, - CONST D2D1_FACTORY_OPTIONS *pFacOptions, - void **ppIFactory); +static HRESULT (*D2D1_CreateFactory)(D2D1_FACTORY_TYPE facType, + REFIID riid, + CONST D2D1_FACTORY_OPTIONS *pFacOptions, + void **ppIFactory); static const dllimp_t d2d_imports[] = { { "D2D1CreateFactory", &D2D1_CreateFactory }, @@ -350,7 +352,16 @@ d2d_init(int fs) INFO("D2D: module '%s' loaded.\n", PATH_D2D_DLL); #endif - /* Get and log the version of the DLL we are using. */ + hr = DLLFUNC(CreateFactory)(D2D1_FACTORY_TYPE_MULTI_THREADED, + __uuidof(ID2D1Factory), + NULL, + reinterpret_cast (&d2d_factory)); + if (FAILED(hr)) { + ERRLOG("D2D: unable to load factory, D2D not available.\n"); + d2d_close(); + return(0); + } + if (fs) { /* * Direct2D seems to lack any proper fullscreen mode, @@ -377,19 +388,7 @@ d2d_init(int fs) SetFocus(d2d_hwnd); SetWindowPos(d2d_hwnd, HWND_TOPMOST, 0,0, d2d_screen_width,d2d_screen_height, SWP_SHOWWINDOW); - } - hr = DLLFUNC(CreateFactory)(D2D1_FACTORY_TYPE_MULTI_THREADED, - __uuidof(ID2D1Factory), - NULL, - reinterpret_cast (&d2d_factory)); - if (FAILED(hr)) { - ERRLOG("D2D: unable to load factory, D2D not available.\n"); - d2d_close(); - return(0); - } - - if (fs) { props = D2D1::HwndRenderTargetProperties(d2d_hwnd, D2D1::SizeU(d2d_screen_width, d2d_screen_height)); } else { diff --git a/src/win/win_ui.c b/src/win/win_ui.c index b6adecb..e924ffe 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.34 2019/03/07 + * Version: @(#)win_ui.c 1.0.35 2019/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -92,6 +92,8 @@ static int save_window_pos = 0; static int cruft_x = 0, cruft_y = 0, cruft_sb = 0; +static int kbd_flags, /* current keyboard flags */ + win_kbd_flags; /* original host keyboard flags */ static VOID APIENTRY @@ -581,6 +583,10 @@ input_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 0); hook_enabled = 1; } + + /* Update host keyboard state if needed. */ + if (kbd_flags != win_kbd_flags) + plat_set_kbd_state(kbd_flags); break; case WM_KILLFOCUS: @@ -590,6 +596,10 @@ input_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) UnhookWindowsHookEx(hKeyboardHook); hook_enabled = 0; } + + /* Update host keyboard state if needed. */ + if (kbd_flags != win_kbd_flags) + plat_set_kbd_state(win_kbd_flags); break; case WM_LBUTTONUP: @@ -770,6 +780,10 @@ ui_init(int nCmdShow) /* Set up the main window for RawInput. */ plat_set_input(hwndMain); + /* Grab the current state of the (host) keyboard. */ + win_kbd_flags = plat_get_kbd_state(); + kbd_flags = win_kbd_flags; + /* Create the Machine Rendering window. */ hwndRender = CreateWindow(L"STATIC", NULL, @@ -910,6 +924,9 @@ again: win_mouse_close(); + /* Restore host keyboard state. */ + plat_set_kbd_state(win_kbd_flags); + return((int)messages.wParam); } @@ -1015,7 +1032,7 @@ plat_pause(int paused) /* Grab the current keyboard state. */ int -plat_kbd_state(void) +plat_get_kbd_state(void) { BYTE kbdata[256]; int ret = 0x00; @@ -1034,6 +1051,60 @@ plat_kbd_state(void) } +/* Set the active keyboard state. */ +void +plat_set_kbd_state(int flags) +{ + INPUT kbdata[2]; + + memset(kbdata, 0x00, sizeof(kbdata)); + 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); + if (kbd_flags != flags) { + /* Save the new flags. */ + kbd_flags = flags; + + /* If we are active, update the host keyboard state. */ + if (infocus) { + /* Pick out the keys we are interested in. */ + if (flags & KBD_FLAG_NUM) { + kbdata[0].ki.wVk = kbdata[1].ki.wVk = VK_NUMLOCK; + if (SendInput(2, kbdata, sizeof(INPUT)) == 0) { + ERRLOG("WIN: cannot SendInput(%i): error %i\n", + kbdata[0].ki.wVk, GetLastError()); + } + } + + if (flags & KBD_FLAG_CAPS) { + kbdata[0].ki.wVk = kbdata[1].ki.wVk = VK_CAPITAL; + if (SendInput(2, kbdata, sizeof(INPUT)) == 0) { + ERRLOG("WIN: cannot SendInput(%i): error %i\n", + kbdata[0].ki.wVk, GetLastError()); + } + } + + if (flags & KBD_FLAG_SCROLL) { + kbdata[0].ki.wVk = kbdata[1].ki.wVk = VK_SCROLL; + if (SendInput(2, kbdata, sizeof(INPUT)) == 0) { + ERRLOG("WIN: cannot SendInput(%i): error %i\n", + kbdata[0].ki.wVk, GetLastError()); + } + } + + if (flags & KBD_FLAG_PAUSE) { + kbdata[0].ki.wVk = kbdata[1].ki.wVk = VK_PAUSE; + if (SendInput(2, kbdata, sizeof(INPUT)) == 0) { + ERRLOG("WIN: cannot SendInput(%i): error %i\n", + kbdata[0].ki.wVk, GetLastError()); + } + } + } + } +} + + /* UI support: enable or disable mouse clipping. */ void plat_mouse_capture(int on)