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)