diff --git a/src/86box.c b/src/86box.c index e9c535e02..d02732705 100644 --- a/src/86box.c +++ b/src/86box.c @@ -211,6 +211,7 @@ int video_fullscreen_scale_maximized = 0; /* (C) Whether also apply when maximized. */ int do_auto_pause = 0; /* (C) Auto-pause the emulator on focus loss */ +int force_constant_mouse = 0; /* (C) Forst constant updating of the mouse */ int hook_enabled = 1; /* (C) Keyboard hook is enabled */ int test_mode = 0; /* (C) Test mode */ char uuid[MAX_UUID_LEN] = { '\0' }; /* (C) UUID or machine identifier */ diff --git a/src/config.c b/src/config.c index 20227aed6..de726939f 100644 --- a/src/config.c +++ b/src/config.c @@ -224,6 +224,7 @@ load_general(void) } do_auto_pause = ini_section_get_int(cat, "do_auto_pause", 0); + force_constant_mouse = ini_section_get_int(cat, "force_constant_mouse", 0); p = ini_section_get_string(cat, "uuid", NULL); if (p != NULL) @@ -2040,13 +2041,14 @@ config_load(void) cpu_f = (cpu_family_t *) &cpu_families[0]; cpu = 0; - kbd_req_capture = 0; - hide_status_bar = 0; - hide_tool_bar = 0; - scale = 1; - machine = machine_get_machine_from_internal_name("ibmpc"); - dpi_scale = 1; - do_auto_pause = 0; + kbd_req_capture = 0; + hide_status_bar = 0; + hide_tool_bar = 0; + scale = 1; + machine = machine_get_machine_from_internal_name("ibmpc"); + dpi_scale = 1; + do_auto_pause = 0; + force_constant_mouse = 0; cpu_override_interpreter = 0; @@ -2326,6 +2328,11 @@ save_general(void) else ini_section_delete_var(cat, "do_auto_pause"); + if (force_constant_mouse) + ini_section_set_int(cat, "force_constant_mouse", force_constant_mouse); + else + ini_section_delete_var(cat, "force_constant_mouse"); + char cpu_buf[128] = { 0 }; plat_get_cpu_string(cpu_buf, 128); ini_section_set_string(cat, "host_cpu", cpu_buf); diff --git a/src/device/kbc_at.c b/src/device/kbc_at.c index 1ac749fa9..83e01511e 100644 --- a/src/device/kbc_at.c +++ b/src/device/kbc_at.c @@ -82,6 +82,11 @@ #define KBC_VEN_SIEMENS 0x2c #define KBC_VEN_COMPAQ 0x30 #define KBC_VEN_IBM 0x34 +#define KBC_VEN_AWARD 0x38 +#define KBC_VEN_VIA 0x3c +#define KBC_VEN_CHIPS 0x40 +#define KBC_VEN_HOLTEK 0x44 +#define KBC_VEN_UMC 0x48 #define KBC_VEN_MASK 0x7c #define KBC_FLAG_IS_ASIC 0x80000000 @@ -167,8 +172,12 @@ typedef struct atkbc_t { /* Keyboard controller ports. */ kbc_at_port_t *kbc_at_ports[2] = { NULL, NULL }; -static uint8_t kbc_ami_revision = '8'; -static uint8_t kbc_award_revision = 0x42; +static uint8_t kbc_ami_revision = '8'; +static uint8_t kbc_award_revision = 0x42; + +static uint8_t kbc_chips_revision = 0xa6; + +static uint16_t kbc_phoenix_version = 0x0416; static void (*kbc_at_do_poll)(atkbc_t *dev); @@ -391,6 +400,7 @@ kbc_send_to_ob(atkbc_t *dev, uint8_t val, uint8_t channel, uint8_t stat_hi) return; if ((kbc_ven == KBC_VEN_AMI) || (kbc_ven == KBC_VEN_TRIGEM_AMI) || + (kbc_ven == KBC_VEN_HOLTEK) || (kbc_ven == KBC_VEN_UMC) || (dev->misc_flags & FLAG_PS2)) stat_hi |= ((dev->p1 & 0x80) ? 0x10 : 0x00); else @@ -945,6 +955,26 @@ pulse_poll(void *priv) write_p2(dev, dev->p2 | dev->old_p2); } +static uint8_t +write_cmd_acer(void *priv, uint8_t val) +{ + atkbc_t *dev = (atkbc_t *) priv; + uint8_t ret = 1; + + switch (val) { + default: + break; + + case 0xaf: + kbc_at_log("ATkbc: ??? - appears in the probes of the real controller\n"); + kbc_delay_to_ob(dev, 0x00, 0, 0x00); + ret = 0; + break; + } + + return ret; +} + static uint8_t write_cmd_data_ami(void *priv, uint8_t val) { @@ -1001,7 +1031,7 @@ write_cmd_data_ami(void *priv, uint8_t val) void kbc_at_set_ps2(void *priv, const uint8_t ps2) { - atkbc_t *dev = (atkbc_t *) priv; + atkbc_t *dev = (atkbc_t *) priv; dev->ami_flags = (dev->ami_flags & 0xfe) | (!!ps2); dev->misc_flags &= ~FLAG_PS2; @@ -1216,6 +1246,12 @@ write_cmd_ami(void *priv, uint8_t val) ret = 0; break; + case 0xca: /* read keyboard mode */ + kbc_at_log("ATkbc: AMI - read keyboard mode\n"); + kbc_delay_to_ob(dev, dev->ami_flags, 0, 0x00); + ret = 0; + break; + case 0xcb: /* set keyboard mode */ kbc_at_log("ATkbc: AMI - set keyboard mode\n"); dev->wantdata = 1; @@ -1250,11 +1286,283 @@ write_cmd_ami(void *priv, uint8_t val) } static uint8_t -write_cmd_data_phoenix(void *priv, uint8_t val) +write_cmd_umc(void *priv, uint8_t val) { atkbc_t *dev = (atkbc_t *) priv; uint8_t ret = 1; + switch (val) { + default: + break; + + case 0xa0: /* copyright message */ + kbc_at_queue_add(dev, 0x28); + kbc_at_queue_add(dev, 0x28); + kbc_at_queue_add(dev, 0x28); + kbc_at_queue_add(dev, 0x00); + ret = 0; + break; + + case 0xa1: /* get controller version */ + kbc_at_log("ATkbc: UMC - get controller version\n"); + kbc_delay_to_ob(dev, kbc_ami_revision, 0, 0x00); + ret = 0; + break; + } + + return ret; +} + +static uint8_t +write_cmd_data_award(void *priv, uint8_t val) +{ + atkbc_t *dev = (atkbc_t *) priv; + uint8_t ret = 1; + + switch (val) { + default: + break; + + case 0xcb: /* set keyboard mode */ + kbc_at_log("ATkbc: AMI - set keyboard mode\n"); + dev->ami_flags = val; + dev->misc_flags &= ~FLAG_PS2; + if (val & 0x01) { + kbc_at_log("ATkbc: AMI: Emulate PS/2 keyboard\n"); + dev->misc_flags |= FLAG_PS2; + kbc_at_do_poll = kbc_at_poll_ps2; + } else { + kbc_at_log("ATkbc: AMI: Emulate AT keyboard\n"); + kbc_at_do_poll = kbc_at_poll_at; + } + ret = 0; + break; + } + + return ret; +} + +static uint8_t +write_cmd_award(void *priv, uint8_t val) +{ + atkbc_t *dev = (atkbc_t *) priv; + uint8_t ret = 1; + + switch (val) { + default: + break; + + case 0x90 ... 0x9f: /* Write low nibble to (Port13-Port10) */ + kbc_at_log("ATkbc: Award - write low nibble to (Port13-Port10)\n"); + dev->p1 = (dev->p1 & 0xf0) | (val & 0x0f); + ret = 0; + break; + + case 0xa1: /* get controller version */ + kbc_at_log("ATkbc: AMI - get controller version\n"); + kbc_delay_to_ob(dev, kbc_ami_revision, 0, 0x00); + ret = 0; + break; + + case 0xa4: /* check if password installed */ + kbc_at_log("ATkbc: check if password installed\n"); + kbc_delay_to_ob(dev, 0xf1, 0, 0x00); + ret = 0; + break; + + case 0xa5: /* do nothing */ + kbc_at_log("ATkbc: do nothing\n"); + ret = 0; + break; + + /* TODO: Make this command do nothing on the Regional HT6542, + or else, Efflixi's Award OPTi 495 BIOS gets a stuck key + in Norton Commander 3.0. */ + case 0xaf: /* read keyboard version */ + kbc_at_log("ATkbc: read keyboard version\n"); + kbc_delay_to_ob(dev, kbc_award_revision, 0, 0x00); + ret = 0; + break; + + case 0xb0 ... 0xb3: + /* set KBC lines P10-P13 (P1 bits 0-3) low */ + kbc_at_log("ATkbc: set KBC lines P10-P13 (P1 bits 0-3) low\n"); + dev->p1 &= ~(1 << (val & 0x03)); + kbc_delay_to_ob(dev, dev->ob, 0, 0x00); + ret = 0; + break; + + /* TODO: The ICS SB486PV sends command B4 but expects to read *TWO* bytes. */ + case 0xb4: case 0xb5: + /* set KBC lines P22-P23 (P2 bits 2-3) low */ + kbc_at_log("ATkbc: set KBC lines P22-P23 (P2 bits 2-3) low\n"); + write_p2(dev, dev->p2 & ~(4 << (val & 0x01))); + kbc_delay_to_ob(dev, dev->ob, 0, 0x00); + ret = 0; + break; + + case 0xb6 ... 0xb7: + /* set KBC lines P14-P15 (P1 bits 4-5) low */ + kbc_at_log("ATkbc: set KBC lines P14-P15 (P1 bits 4-5) low\n"); + dev->p1 &= ~(0x10 << (val & 0x01)); + kbc_delay_to_ob(dev, dev->ob, 0, 0x00); + ret = 0; + break; + + case 0xb8 ... 0xbb: + /* set KBC lines P10-P13 (P1 bits 0-3) high */ + kbc_at_log("ATkbc: set KBC lines P10-P13 (P1 bits 0-3) high\n"); + dev->p1 |= (1 << (val & 0x03)); + kbc_delay_to_ob(dev, dev->ob, 0, 0x00); + ret = 0; + break; + + case 0xbc: case 0xbd: + /* set KBC lines P22-P23 (P2 bits 2-3) high */ + kbc_at_log("ATkbc: set KBC lines P22-P23 (P2 bits 2-3) high\n"); + write_p2(dev, dev->p2 | (4 << (val & 0x01))); + kbc_delay_to_ob(dev, dev->ob, 0, 0x00); + ret = 0; + break; + + case 0xbe ... 0xbf: + /* set KBC lines P14-P15 (P1 bits 4-5) high */ + kbc_at_log("ATkbc: set KBC lines P14-P15 (P1 bits 4-5) high\n"); + dev->p1 |= (0x10 << (val & 0x01)); + kbc_delay_to_ob(dev, dev->ob, 0, 0x00); + ret = 0; + break; + + case 0xc8: + /* + * unblock KBC lines P22/P23 + * (allow command D1 to change bits 2/3 of P2) + */ + kbc_at_log("ATkbc: AMI - unblock KBC lines P22 and P23\n"); + dev->ami_flags &= 0xfb; + ret = 0; + break; + + case 0xc9: + /* + * block KBC lines P22/P23 + * (disallow command D1 from changing bits 2/3 of the port) + */ + kbc_at_log("ATkbc: AMI - block KBC lines P22 and P23\n"); + dev->ami_flags |= 0x04; + ret = 0; + break; + + case 0xca: /* read keyboard mode */ + kbc_at_log("ATkbc: AMI - read keyboard mode\n"); + kbc_delay_to_ob(dev, dev->ami_flags, 0, 0x00); + ret = 0; + break; + + case 0xcb: /* set keyboard mode */ + kbc_at_log("ATkbc: AMI - set keyboard mode\n"); + dev->wantdata = 1; + dev->state = STATE_KBC_PARAM; + ret = 0; + break; + + case 0xe1 ... 0xef: /* Active output ports */ + kbc_at_log("ATkbc: Award - active output ports\n"); + write_p2(dev, (dev->p2 & 0xf1) | (val & 0x0e)); + ret = 0; + break; + } + + return ret; +} + +static uint8_t +write_cmd_data_chips(void *priv, uint8_t val) +{ + atkbc_t *dev = (atkbc_t *) priv; + uint8_t ret = 1; + + switch (val) { + default: + break; + + case 0xa1: /* CHIPS extensions */ + kbc_at_log("ATkbc: C&T - CHIPS extensions\n"); + if (dev->command_phase == 1) { + switch (val) { + default: + break; + case 0x00: /* return ID */ + kbc_at_log("ATkbc: C&T - return ID\n"); + kbc_delay_to_ob(dev, kbc_chips_revision, 0, 0x00); + break; + case 0x02: /* write input port */ + kbc_at_log("ATkbc: C&T - write input port\n"); + dev->mem_addr = val; + dev->wantdata = 1; + dev->state = STATE_KBC_PARAM; + dev->command_phase = 2; + break; + case 0x04: /* select turbo switch input */ + kbc_at_log("ATkbc: C&T - select turbo switch input\n"); + dev->mem_addr = val; + dev->wantdata = 1; + dev->state = STATE_KBC_PARAM; + dev->command_phase = 2; + break; + case 0x05: /* select turbo LED output */ + kbc_at_log("ATkbc: Cselect turbo LED output\n"); + dev->mem_addr = val; + dev->wantdata = 1; + dev->state = STATE_KBC_PARAM; + dev->command_phase = 2; + break; + } + } else if (dev->command_phase == 2) { + switch (dev->mem_addr) { + default: + break; + case 0x02: /* write input port */ + kbc_at_log("ATkbc: C&T - write iput port\n"); + dev->p1 = val; + break; + } + dev->command_phase = 0; + } + ret = 0; + break; + } + + return ret; +} + +static uint8_t +write_cmd_chips(void *priv, uint8_t val) +{ + atkbc_t *dev = (atkbc_t *) priv; + uint8_t ret = 1; + + switch (val) { + default: + break; + + case 0xa1: /* CHIPS extensions */ + kbc_at_log("ATkbc: C&T - CHIPS extensions\n"); + dev->wantdata = 1; + dev->state = STATE_KBC_PARAM; + ret = 0; + break; + } + + return ret; +} + +static uint8_t +write_cmd_data_phoenix(void *priv, uint8_t val) +{ + atkbc_t *dev = (atkbc_t *) priv; + uint8_t ret = 1; + switch (dev->command) { default: break; @@ -1452,18 +1760,8 @@ write_cmd_phoenix(void *priv, uint8_t val) revision level and proper CPU bits. */ case 0xd5: /* Read MultiKey code revision level */ kbc_at_log("ATkbc: Phoenix - Read MultiKey code revision level\n"); - if (dev->misc_flags & FLAG_PS2) { - if (dev->flags & DEVICE_PCI) { - kbc_at_queue_add(dev, 0x04); - kbc_at_queue_add(dev, 0x16); - } else { - kbc_at_queue_add(dev, 0x01); - kbc_at_queue_add(dev, 0x38); - } - } else { - kbc_at_queue_add(dev, 0x01); - kbc_at_queue_add(dev, 0x29); - } + kbc_at_queue_add(dev, kbc_phoenix_version >> 8); + kbc_at_queue_add(dev, kbc_phoenix_version & 0xff); ret = 0; break; @@ -1496,44 +1794,18 @@ write_cmd_phoenix(void *priv, uint8_t val) } ret = 0; break; - } - return ret; -} - -static uint8_t -write_cmd_siemens(void *priv, uint8_t val) -{ - atkbc_t *dev = (atkbc_t *) priv; - uint8_t ret = 1; - - switch (val) { - default: - ret = write_cmd_ami(dev, val); - break; - - case 0x92: /*Siemens Award - 92 sent by PCD-2L BIOS*/ - kbc_at_log("Siemens Award - 92 sent by PCD-2L BIOS\n"); - ret = 0; - break; - - case 0x94: /*Siemens Award - 94 sent by PCD-2L BIOS*/ - kbc_at_log("Siemens Award - 94 sent by PCD-2L BIOS\n"); - ret = 0; - break; - - case 0x9a: /*Siemens Award - 9A sent by PCD-2L BIOS*/ - kbc_at_log("Siemens Award - 9A sent by PCD-2L BIOS\n"); - ret = 0; - break; - - case 0x9c: /*Siemens Award - 9C sent by PCD-2L BIOS*/ - kbc_at_log("Siemens Award - 9C sent by PCD-2L BIOS\n"); - ret = 0; - break; - - case 0xa9: /*Siemens Award - A9 sent by PCD-2L BIOS*/ - kbc_at_log("Siemens Award - A9 sent by PCD-2L BIOS\n"); + /* NOTE: The MultiKey/42i reference does not document these at all. + The ADI 386SX BIOS uses these commands but it also uses + commands B8 and BB with a parameters, which clearly indicates a + Phoenix KBC. So either these are undocumented or were present + in an early Phoenix MultiKey variant but later removed - the + MultiKey/42i reference does say a number of features were + removed, so these may have been among them, and we have no + earlier MultiKey reference to look at. */ + case 0xe1 ... 0xef: /* Active output ports */ + kbc_at_log("ATkbc: Phoenix - active output ports\n"); + write_p2(dev, (dev->p2 & 0xf1) | (val & 0x0e)); ret = 0; break; } @@ -2091,14 +2363,6 @@ kbc_at_process_cmd(void *priv) set_enable_kbd(dev, 1); break; - /* TODO: Make this command do nothing on the Regional HT6542, - or else, Efflixi's Award OPTi 495 BIOS gets a stuck key - in Norton Commander 3.0. */ - case 0xaf: /* read keyboard version */ - kbc_at_log("ATkbc: read keyboard version\n"); - kbc_delay_to_ob(dev, kbc_award_revision, 0, 0x00); - break; - case 0xc0: /* read P1 */ kbc_at_log("ATkbc: read P1\n"); kbc_delay_to_ob(dev, read_p1(dev), 0, 0x00); @@ -2120,11 +2384,6 @@ kbc_at_process_cmd(void *priv) } break; - case 0xca: /* read keyboard mode */ - kbc_at_log("ATkbc: AMI - read keyboard mode\n"); - kbc_delay_to_ob(dev, dev->ami_flags, 0, 0x00); - break; - case 0xd0: /* read P2 */ kbc_at_log("ATkbc: read P2\n"); mask = 0xff; @@ -2574,20 +2833,32 @@ kbc_at_init(const device_t *info) timer_add(&dev->kbc_dev_poll_timer, kbc_at_dev_poll, dev, 1); dev->write_cmd_data_ven = NULL; - dev->write_cmd_ven = NULL; + dev->write_cmd_ven = NULL; - kbc_ami_revision = '8'; - kbc_award_revision = 0x42; + kbc_ami_revision = '8'; + kbc_award_revision = 0x42; + + kbc_chips_revision = 0xa6; + + kbc_phoenix_version = 0x0416; switch (dev->flags & KBC_VEN_MASK) { default: break; case KBC_VEN_SIEMENS: - kbc_ami_revision = '8'; - kbc_award_revision = 0x42; - dev->write_cmd_data_ven = write_cmd_data_ami; - dev->write_cmd_ven = write_cmd_siemens; + case KBC_VEN_AWARD: + case KBC_VEN_VIA: + if ((info->local & 0xff00) != 0x0000) + kbc_ami_revision = (info->local >> 8) & 0xff; + if ((info->local & 0xff0000) != 0x000000) + kbc_award_revision = (info->local >> 16) & 0xff; + dev->write_cmd_data_ven = write_cmd_data_award; + dev->write_cmd_ven = write_cmd_award; + break; + + case KBC_VEN_ACER: + dev->write_cmd_ven = write_cmd_acer; break; case KBC_VEN_OLIVETTI: @@ -2608,7 +2879,10 @@ kbc_at_init(const device_t *info) break; case KBC_VEN_AMI: - if ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_GREEN) + case KBC_VEN_HOLTEK: + if ((info->local & 0xff00) != 0x0000) + kbc_ami_revision = (info->local >> 8) & 0xff; + else if ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_GREEN) kbc_ami_revision = '5'; else if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { if (cpu_64bitbus) @@ -2631,7 +2905,25 @@ kbc_at_init(const device_t *info) dev->write_cmd_ven = write_cmd_ami; break; + case KBC_VEN_UMC: + if ((info->local & 0xff00) != 0x0000) + kbc_ami_revision = (info->local >> 8) & 0xff; + else + kbc_ami_revision = 0x48; + + dev->write_cmd_ven = write_cmd_umc; + break; + + case KBC_VEN_CHIPS: + if ((info->local & 0xff00) != 0x0000) + kbc_chips_revision = (info->local >> 8) & 0xff; + dev->write_cmd_data_ven = write_cmd_data_chips; + dev->write_cmd_ven = write_cmd_chips; + break; + case KBC_VEN_PHOENIX: + if ((info->local & 0xffff00) != 0x000000) + kbc_phoenix_version = (info->local >> 8) & 0xffff; dev->write_cmd_data_ven = write_cmd_data_phoenix; dev->write_cmd_ven = write_cmd_phoenix; break; @@ -2721,6 +3013,76 @@ const device_t kbc_at_ami_device = { .config = NULL }; +const device_t kbc_at_holtek_device = { + .name = "PC/AT Keyboard (Holtek)", + .internal_name = "keyboard_at_holtek", + .flags = DEVICE_KBC, + .local = KBC_TYPE_ISA | KBC_VEN_HOLTEK | KBC_FLAG_IS_ASIC, + .init = kbc_at_init, + .close = kbc_at_close, + .reset = kbc_at_reset, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t kbc_at_umc_device = { + .name = "PC/AT Keyboard (UMC)", + .internal_name = "keyboard_at_umc", + .flags = DEVICE_KBC, + .local = KBC_TYPE_ISA | KBC_VEN_UMC | KBC_FLAG_IS_ASIC, + .init = kbc_at_init, + .close = kbc_at_close, + .reset = kbc_at_reset, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t kbc_at_award_device = { + .name = "PC/AT Keyboard (Award)", + .internal_name = "keyboard_at_award", + .flags = DEVICE_KBC, + .local = KBC_TYPE_ISA | KBC_VEN_AWARD, + .init = kbc_at_init, + .close = kbc_at_close, + .reset = kbc_at_reset, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t kbc_at_chips_device = { + .name = "PC/AT Keyboard (C&T)", + .internal_name = "keyboard_at_chips", + .flags = DEVICE_KBC, + .local = KBC_TYPE_ISA | KBC_VEN_CHIPS, + .init = kbc_at_init, + .close = kbc_at_close, + .reset = kbc_at_reset, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t kbc_at_quadtel_device = { + .name = "PC/AT Keyboard (Quadtel)", + .internal_name = "keyboard_at_quadtel", + .flags = DEVICE_KBC, + .local = KBC_TYPE_ISA | KBC_VEN_QUADTEL, + .init = kbc_at_init, + .close = kbc_at_close, + .reset = kbc_at_reset, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t kbc_at_tg_ami_device = { .name = "PC/AT Keyboard Controller (TriGem AMI)", .internal_name = "kbc_at_tg_ami", @@ -2777,6 +3139,20 @@ const device_t kbc_at_ncr_device = { .config = NULL }; +const device_t kbc_at_via_device = { + .name = "PC/AT Keyboard (VIA)", + .internal_name = "keyboard_at_via", + .flags = DEVICE_KBC, + .local = KBC_TYPE_ISA | KBC_VEN_VIA | KBC_FLAG_IS_ASIC, + .init = kbc_at_init, + .close = kbc_at_close, + .reset = kbc_at_reset, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t kbc_at_compaq_device = { .name = "PC/AT Keyboard Controller (Compaq)", .internal_name = "kbc_at_compaq", @@ -2861,6 +3237,20 @@ const device_t kbc_ps2_xi8088_device = { .config = NULL }; +const device_t kbc_ps2_acer_device = { + .name = "PS/2 Keyboard (Acer 90M002A)", + .internal_name = "keyboard_ps2_acer_pci", + .flags = DEVICE_KBC, + .local = KBC_TYPE_PS2_1 | KBC_VEN_ACER, + .init = kbc_at_init, + .close = kbc_at_close, + .reset = kbc_at_reset, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t kbc_ps2_ami_device = { .name = "PS/2 Keyboard Controller (AMI)", .internal_name = "kbc_ps2_ami", @@ -2893,7 +3283,50 @@ const device_t kbc_ps2_holtek_device = { .name = "PS/2 Keyboard Controller (Holtek)", .internal_name = "kbc_ps2_holtek", .flags = DEVICE_KBC, - .local = KBC_TYPE_PS2_1 | KBC_VEN_AMI | KBC_FLAG_IS_ASIC, + .local = KBC_TYPE_PS2_1 | KBC_VEN_HOLTEK | KBC_FLAG_IS_ASIC, + .init = kbc_at_init, + .close = kbc_at_close, + .reset = kbc_at_reset, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + + +const device_t kbc_ps2_umc_device = { + .name = "PS/2 Keyboard (UMC)", + .internal_name = "keyboard_ps2_umc", + .flags = DEVICE_KBC, + .local = KBC_TYPE_PS2_1 | KBC_VEN_UMC | KBC_FLAG_IS_ASIC, + .init = kbc_at_init, + .close = kbc_at_close, + .reset = kbc_at_reset, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t kbc_ps2_award_device = { + .name = "PS/2 Keyboard (Award)", + .internal_name = "keyboard_ps2_award", + .flags = DEVICE_KBC, + .local = KBC_TYPE_PS2_1 | KBC_VEN_AWARD, + .init = kbc_at_init, + .close = kbc_at_close, + .reset = kbc_at_reset, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t kbc_ps2_via_device = { + .name = "PS/2 Keyboard (VIA)", + .internal_name = "keyboard_ps2_via", + .flags = DEVICE_KBC, + .local = KBC_TYPE_PS2_1 | KBC_VEN_VIA | KBC_FLAG_IS_ASIC, .init = kbc_at_init, .close = kbc_at_close, .reset = kbc_at_reset, diff --git a/src/device/mouse.c b/src/device/mouse.c index abde81246..fb7fd020f 100644 --- a/src/device/mouse.c +++ b/src/device/mouse.c @@ -559,7 +559,7 @@ mouse_get_buttons_ex(void) void mouse_set_sample_rate(double new_rate) { - mouse_timed = (new_rate > 0.0); + mouse_timed = !force_constant_mouse && (new_rate > 0.0); timer_stop(&mouse_timer); @@ -568,6 +568,12 @@ mouse_set_sample_rate(double new_rate) timer_on_auto(&mouse_timer, 1000000.0 / sample_rate); } +void +mouse_update_sample_rate(void) +{ + mouse_set_sample_rate(sample_rate); +} + /* Callback from the hardware driver. */ void mouse_set_buttons(int buttons) diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index 7a7296abe..1594d62fc 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -171,6 +171,7 @@ extern int fixed_size_y; extern int sound_muted; /* (C) Is sound muted? */ extern int do_auto_pause; /* (C) Auto-pause the emulator on focus loss */ extern int auto_paused; +extern int force_constant_mouse; /* (C) Forst constant updating of the mouse */ extern double mouse_sensitivity; /* (C) Mouse sensitivity scale */ #ifdef _Atomic extern _Atomic double mouse_x_error; /* Mouse error accumulator - Y */ diff --git a/src/include/86box/keyboard.h b/src/include/86box/keyboard.h index 86cea515e..d11601285 100644 --- a/src/include/86box/keyboard.h +++ b/src/include/86box/keyboard.h @@ -258,7 +258,14 @@ extern const device_t kbc_xt_fe2010_device; extern const device_t kbc_xtclone_device; extern const device_t kbc_at_device; extern const device_t kbc_at_ami_device; +extern const device_t kbc_at_award_device; +extern const device_t kbc_at_chips_device; +extern const device_t kbc_at_holtek_device; +extern const device_t kbc_at_phoenix_device; +extern const device_t kbc_at_quadtel_device; extern const device_t kbc_at_compaq_device; +extern const device_t kbc_at_umc_device; +extern const device_t kbc_at_via_device; extern const device_t kbc_at_phoenix_device; extern const device_t kbc_at_ncr_device; extern const device_t kbc_at_olivetti_device; @@ -269,7 +276,9 @@ extern const device_t kbc_ps2_device; extern const device_t kbc_ps2_ps1_device; extern const device_t kbc_ps2_ps1_pci_device; extern const device_t kbc_ps2_xi8088_device; +extern const device_t kbc_ps2_acer_device; extern const device_t kbc_ps2_ami_device; +extern const device_t kbc_ps2_award_device; extern const device_t kbc_ps2_compaq_device; extern const device_t kbc_ps2_holtek_device; extern const device_t kbc_ps2_mca_1_device; @@ -277,6 +286,8 @@ extern const device_t kbc_ps2_mca_2_device; extern const device_t kbc_ps2_olivetti_device; extern const device_t kbc_ps2_phoenix_device; extern const device_t kbc_ps2_quadtel_device; +extern const device_t kbc_ps2_umc_device; +extern const device_t kbc_ps2_via_device; extern const device_t kbc_ps2_tg_ami_device; extern const device_t kbc_ps2_tg_ami_green_device; extern const device_t kbc_ps2_pci_device; diff --git a/src/include/86box/mouse.h b/src/include/86box/mouse.h index d3e33ad32..9745de444 100644 --- a/src/include/86box/mouse.h +++ b/src/include/86box/mouse.h @@ -114,6 +114,7 @@ extern void mouse_subtract_w(int *delta_w, int min, int max, int inve extern void mouse_set_buttons_ex(int b); extern int mouse_get_buttons_ex(void); extern void mouse_set_sample_rate(double new_rate); +extern void mouse_update_sample_rate(void); extern void mouse_set_buttons(int buttons); extern void mouse_get_abs_coords(double *x_abs, double *y_abs); extern void mouse_process(void); diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 36c951427..533d5b888 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -2933,3 +2933,6 @@ msgstr "" msgid "The system will not be added." msgstr "" + +msgid "&Update mouse every CPU frame" +msgstr "" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index fb791d87d..98308f734 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -2933,3 +2933,6 @@ msgstr "Systém nebude přidán." msgid "%1 Hz" msgstr "%1 Hz" + +msgid "&Update mouse every CPU frame" +msgstr "&Aktualizovat myš při každém rámce CPU" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index bb563f761..e81c25222 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -2934,6 +2934,9 @@ msgstr "Der Prozess der virtuellen Maschine \"%1\" wurde unerwartet mit dem Exit msgid "The system will not be added." msgstr "Das System wird nicht hinzugefügt werden." +msgid "&Update mouse every CPU frame" +msgstr "&Maus bei jedem CPU-Frame aktualisieren" + #~ msgid "HD Controller:" #~ msgstr "Festplatten-Controller:" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 14de5915c..57c15996e 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -2934,6 +2934,9 @@ msgstr "El proceso de la máquina virtual \"%1\" terminó inesperadamente con el msgid "The system will not be added." msgstr "El sistema no será añadido." +msgid "&Update mouse every CPU frame" +msgstr "&Actualiza el estado del ratón en cada bloco de CPU" + #~ msgid "HD Controller:" #~ msgstr "Controladora HD:" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 8ff77a4e2..baad8f0aa 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -400,7 +400,7 @@ msgid "Dynamic Recompiler" msgstr "Recompilateur dynamique" msgid "CPU frame size" -msgstr "Taille du bloc de CPU" +msgstr "Taille du bloc de processeur" msgid "Larger frames (less smooth)" msgstr "Blocs plus grands (moins fluid)" @@ -2934,6 +2934,9 @@ msgstr "Le processus de la machine virtuelle \"%1\" s'est arrêté de manière i msgid "The system will not be added." msgstr "Le système ne sera pas ajouté." +msgid "&Update mouse every CPU frame" +msgstr "&Mettre à jour le statut du souris en qualquier bloc de processeur" + #~ msgid "HD Controller:" #~ msgstr "Contrôleur HD:" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 67375209f..01e783023 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -2934,6 +2934,9 @@ msgstr "Proces virtualnog sistema \"%1\" neočekivano je završio s izlaznim kod msgid "The system will not be added." msgstr "Sistem neće biti dodan." +msgid "&Update mouse every CPU frame" +msgstr "&Ažuriraj status miša kod skavog bloka procesora" + #~ msgid "HD Controller:" #~ msgstr "Kontroler tvrdog diska:" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 4574f4697..cefd5bfb4 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -400,13 +400,13 @@ msgid "Dynamic Recompiler" msgstr "Ricompilatore dinamico" msgid "CPU frame size" -msgstr "Dimensione fotogrammi CPU" +msgstr "Dimensione blocchi CPU" msgid "Larger frames (less smooth)" -msgstr "Fotogrammi più grandi (meno fluido)" +msgstr "Blocchi più grandi (meno fluido)" msgid "Smaller frames (smoother)" -msgstr "Fotogrammi più piccoli (più fluido)" +msgstr "Blocchi più piccoli (più fluido)" msgid "Video:" msgstr "Video:" @@ -2934,6 +2934,9 @@ msgstr "Il processo della macchina virtuale \"%1\" è terminato inaspettatamente msgid "The system will not be added." msgstr "Il sistema non verrà aggiunto." +msgid "&Update mouse every CPU frame" +msgstr "&Aggiorano stato mouse ad ogni blocco CPU" + #~ msgid "HD Controller:" #~ msgstr "Controller HD:" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index ac539ab05..7d41f3cb0 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -2934,6 +2934,9 @@ msgstr "仮想マシン\"%1\"のプロセスが、終了コード %2 で予期 msgid "The system will not be added." msgstr "システムは追加されません。" +msgid "&Update mouse every CPU frame" +msgstr "マウスをCPUフレームごとに更新(&U)" + #~ msgid "HD Controller:" #~ msgstr "HDDコントローラー:" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index a0ffdbadc..18feabb5b 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -2934,6 +2934,9 @@ msgstr "" msgid "The system will not be added." msgstr "" +msgid "&Update mouse every CPU frame" +msgstr "" + #~ msgid "HD Controller:" #~ msgstr "HD 컨트롤러:" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 8d023a6a7..e6fc0bda2 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -2934,6 +2934,9 @@ msgstr "Het proces van de virtuele machine \"%1\" is onverwacht beëindigd met e msgid "The system will not be added." msgstr "Het systeem wordt niet toegevoegd." +msgid "&Update mouse every CPU frame" +msgstr "&Muis bijwerken bij elk CPU-frame" + #~ msgid "HD Controller:" #~ msgstr "HD-controller:" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 90558eed4..711e05eaf 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -2933,3 +2933,6 @@ msgstr "" msgid "The system will not be added." msgstr "" + +msgid "&Update mouse every CPU frame" +msgstr "" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index abe1d2436..acdf9681c 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -2933,3 +2933,6 @@ msgstr "O processo da máquina virtual \"%1\" terminou inesperadamente com o có msgid "The system will not be added." msgstr "O sistema não será adicionado." + +msgid "&Update mouse every CPU frame" +msgstr "&Atualiza o estado do mouse em cada quadro do CPU" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index e3a1775ce..31b729499 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -2934,6 +2934,9 @@ msgstr "O processo da máquina virtual \"%1\" terminou inesperadamente com o có msgid "The system will not be added." msgstr "O sistema não será adicionado." +msgid "&Update mouse every CPU frame" +msgstr "&Atualiza o estado do rato em cada bloco do CPU" + #~ msgid "HD Controller:" #~ msgstr "Controlador HD:" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index e40c77037..2cf971456 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -2934,6 +2934,9 @@ msgstr "Процесс виртуальной машины \"%1\" неожида msgid "The system will not be added." msgstr "Система не будет добавлена." +msgid "&Update mouse every CPU frame" +msgstr "&Обновлять мышь при каждом кадре ЦП" + #~ msgid "HD Controller:" #~ msgstr "Контроллер HD:" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 1519c899b..f8f761258 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -2934,6 +2934,9 @@ msgstr "Systém nebude pridaný." msgid "%1 Hz" msgstr "%1 Hz" +msgid "&Update mouse every CPU frame" +msgstr "&Aktualizovať myš pri každom rámci CPU" + #~ msgid "HD Controller:" #~ msgstr "Radič disku:" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 7053ee89b..8dff219d9 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -2934,6 +2934,9 @@ msgstr "Proces navidezne naprave \"%1\" se je nepričakovano zaključil z izhodn msgid "The system will not be added." msgstr "Sistem ne bo dodan." +msgid "&Update mouse every CPU frame" +msgstr "&Posodibi stanje miške ob vsakem bloku procesorja" + #~ msgid "HD Controller:" #~ msgstr "Krmilnik trdega diska:" diff --git a/src/qt/languages/sv-SE.po b/src/qt/languages/sv-SE.po index bcf9bc52c..cf393c058 100644 --- a/src/qt/languages/sv-SE.po +++ b/src/qt/languages/sv-SE.po @@ -2934,6 +2934,9 @@ msgstr "" msgid "The system will not be added." msgstr "" +msgid "&Update mouse every CPU frame" +msgstr "" + #~ msgid "HD Controller:" #~ msgstr "Styrenhet för hårddisk:" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 00effa77a..20dafad99 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -2934,6 +2934,9 @@ msgstr "" msgid "The system will not be added." msgstr "" +msgid "&Update mouse every CPU frame" +msgstr "" + #~ msgid "HD Controller:" #~ msgstr "Hard Disk Denetleyicisi:" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 5844cc83a..cfff6b343 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -2934,6 +2934,9 @@ msgstr "Процес віртуальної машини \"%1\" несподів msgid "The system will not be added." msgstr "Система не буде додана." +msgid "&Update mouse every CPU frame" +msgstr "&Оновлювати мишу при кожному кадрі ЦП" + #~ msgid "HD Controller:" #~ msgstr "Контролер HD:" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 9fcba41cd..18b30f3a4 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -2934,6 +2934,9 @@ msgstr "Tiến trình của máy ảo \"%1\" đã bị dừng bất thường v msgid "The system will not be added." msgstr "Hệ thống sẽ không được thêm." +msgid "&Update mouse every CPU frame" +msgstr "&Cập nhật chuột mỗi cỡ khung CPU" + #~ msgid "HD Controller:" #~ msgstr "Bộ điều khiển ổ cứng:" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 835a8e46c..59f83e7a9 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -2934,6 +2934,9 @@ msgstr "" msgid "The system will not be added." msgstr "" +msgid "&Update mouse every CPU frame" +msgstr "" + #~ msgid "HD Controller:" #~ msgstr "硬盘控制器:" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index e7b1e9205..7379f8aa6 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -2934,6 +2934,9 @@ msgstr "" msgid "The system will not be added." msgstr "" +msgid "&Update mouse every CPU frame" +msgstr "" + #~ msgid "HD Controller:" #~ msgstr "硬碟控制器:" diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 7a6030e39..37208f3da 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -678,6 +678,9 @@ MainWindow::MainWindow(QWidget *parent) if (do_auto_pause > 0) { ui->actionAuto_pause->setChecked(true); } + if (force_constant_mouse > 0) { + ui->actionUpdate_mouse_every_CPU_frame->setChecked(true); + } #ifdef Q_OS_MACOS ui->actionCtrl_Alt_Del->setShortcutVisibleInContextMenu(true); @@ -1982,6 +1985,16 @@ MainWindow::on_actionAuto_pause_triggered() { do_auto_pause ^= 1; ui->actionAuto_pause->setChecked(do_auto_pause > 0 ? true : false); + config_save(); +} + +void +MainWindow::on_actionUpdate_mouse_every_CPU_frame_triggered() +{ + force_constant_mouse ^= 1; + ui->actionUpdate_mouse_every_CPU_frame->setChecked(force_constant_mouse > 0 ? true : false); + mouse_update_sample_rate(); + config_save(); } void diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp index 99cfdadbc..cf303eac6 100644 --- a/src/qt/qt_mainwindow.hpp +++ b/src/qt/qt_mainwindow.hpp @@ -81,6 +81,7 @@ private slots: void on_actionSettings_triggered(); void on_actionExit_triggered(); void on_actionAuto_pause_triggered(); + void on_actionUpdate_mouse_every_CPU_frame_triggered(); void on_actionPause_triggered(); void on_actionCtrl_Alt_Del_triggered(); void on_actionCtrl_Alt_Esc_triggered(); diff --git a/src/qt/qt_mainwindow.ui b/src/qt/qt_mainwindow.ui index 2a371014c..217635b87 100644 --- a/src/qt/qt_mainwindow.ui +++ b/src/qt/qt_mainwindow.ui @@ -68,12 +68,14 @@ - + - + + + @@ -272,6 +274,14 @@ + + + true + + + &Update mouse every CPU frame + + true