diff --git a/src/keyboard.h b/src/keyboard.h index 39c474c4f..a18f44e4e 100644 --- a/src/keyboard.h +++ b/src/keyboard.h @@ -8,7 +8,7 @@ * * Definitions for the keyboard interface. * - * Version: @(#)keyboard.h 1.0.8 2018/01/04 + * Version: @(#)keyboard.h 1.0.9 2018/01/08 * * Authors: Sarah Walker, * Miran Grca, diff --git a/src/keyboard_at.c b/src/keyboard_at.c index 57ac177f0..55ac60ee4 100644 --- a/src/keyboard_at.c +++ b/src/keyboard_at.c @@ -8,7 +8,7 @@ * * Intel 8042 (AT keyboard controller) emulation. * - * Version: @(#)keyboard_at.c 1.0.20 2018/01/07 + * Version: @(#)keyboard_at.c 1.0.21 2018/01/08 * * Authors: Sarah Walker, * Miran Grca, @@ -116,6 +116,7 @@ typedef struct { uint8_t output_locked; int64_t pulse_cb; + uint8_t ami_stat; uint8_t (*write60_ven)(void *p, uint8_t val); uint8_t (*write64_ven)(void *p, uint8_t val); @@ -617,41 +618,6 @@ kbd_adddata_keyboard(uint8_t val) } -static void -kbd_cmd_write(atkbd_t *kbd, uint8_t val) -{ - if ((val & 1) && (kbd->status & STAT_OFULL)) - kbd->wantirq = 1; - if (!(val & 1) && kbd->wantirq) - kbd->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) { - val &= ~CCB_TRANSLATE; - kbd->mem[kbd->command & 0x1f] &= ~CCB_TRANSLATE; - } - - /* Scan code translate ON/OFF. */ - keyboard_mode &= 0x93; - keyboard_mode |= (val & MODE_MASK); - - /* 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_TYPE_MASK) >= KBC_TYPE_PS2_1) { - keyboard_mode &= ~CCB_PCMODE; - - mouse_scan = !(val & 0x20); - kbdlog("ATkbd: mouse is now %s\n", mouse_scan ? "enabled" : "disabled"); - kbdlog("ATkbd: mouse interrupt is now %s\n", (val & 0x02) ? "enabled" : "disabled"); - } - -#if 0 - /* Reset scancode map. */ - kbd_setmap(kbd); -#endif -} - - static void kbd_output_write(atkbd_t *kbd, uint8_t val) { @@ -684,6 +650,56 @@ kbd_output_write(atkbd_t *kbd, uint8_t val) } +static void +kbd_cmd_write(atkbd_t *kbd, uint8_t val) +{ + uint8_t temp_op = kbd->output_port; + + kbdlog("Write command byte: %02X (old: %02X)\n", val, kbd->mem[0]); + + if ((val & 1) && (kbd->status & STAT_OFULL)) + kbd->wantirq = 1; + if (!(val & 1) && kbd->wantirq) + kbd->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) { + val &= ~CCB_TRANSLATE; + kbd->mem[0] &= ~CCB_TRANSLATE; + } + + /* Scan code translate ON/OFF. */ + keyboard_mode &= 0x93; + keyboard_mode |= (val & MODE_MASK); + + keyboard_scan = !(val & 0x10); + kbdlog("ATkbd: keyboard is now %s\n", mouse_scan ? "enabled" : "disabled"); + kbdlog("ATkbd: keyboard interrupt is now %s\n", (val & 0x01) ? "enabled" : "disabled"); + + temp_op &= 0xbf; + temp_op |= (keyboard_scan ? 0x40 : 0x00); + + /* 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_TYPE_MASK) >= KBC_TYPE_PS2_1) { + keyboard_mode &= ~CCB_PCMODE; + + mouse_scan = !(val & 0x20); + kbdlog("ATkbd: mouse is now %s\n", mouse_scan ? "enabled" : "disabled"); + + temp_op &= 0xf7; + temp_op |= (mouse_scan ? 0x08 : 0x00); + + kbdlog("ATkbd: mouse interrupt is now %s\n", (val & 0x02) ? "enabled" : "disabled"); + } + +#if 0 + /* Reset scancode map. */ + kbd_setmap(kbd); +#endif +} + + static void kbd_output_pulse(atkbd_t *kbd, uint8_t mask) { @@ -705,6 +721,24 @@ kbd_pulse_poll(void *p) } +static void +kbd_keyboard_set(atkbd_t *kbd, uint8_t enable) +{ + kbd->mem[0] &= 0xef; + kbd->mem[0] |= (enable ? 0x00 : 0x10); + keyboard_scan = enable; +} + + +static void +kbd_mouse_set(atkbd_t *kbd, uint8_t enable) +{ + kbd->mem[0] &= 0xdf; + kbd->mem[0] |= (enable ? 0x00 : 0x20); + mouse_scan = enable; +} + + static uint8_t kbd_write64_generic(void *p, uint8_t val) { @@ -718,6 +752,29 @@ kbd_write64_generic(void *p, uint8_t val) return 0; } break; + case 0xa7: /*Disable mouse port*/ + if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { + kbdlog("ATkbd: disable mouse port\n"); + kbd_mouse_set(kbd, 0); + return 0; + } + break; + case 0xa8: /*Enable mouse port*/ + if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { + kbdlog("ATkbd: enable mouse port\n"); + kbd_mouse_set(kbd, 1); + return 0; + } + break; + case 0xa9: /*Test mouse port*/ + kbdlog("ATkbd: test mouse port\n"); + if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { + if (mouse_write) + kbd_adddata(0x00); /*no error*/ + else + kbd_adddata(0xff); /*no mouse*/ + return 0; + } case 0xaf: /*Read keyboard version*/ kbdlog("ATkbd: read keyboard version\n"); kbd_adddata(0x00); @@ -729,14 +786,14 @@ kbd_write64_generic(void *p, uint8_t val) kbd->input_port = ((kbd->input_port + 1) & 3) | (kbd->input_port & 0xfc) | fdc_ps1_525(); return 0; case 0xd3: /*Write mouse output buffer*/ - if (((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) && mouse_scan) { + if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { kbdlog("ATkbd: write mouse output buffer\n"); kbd->want60 = 1; return 0; } break; case 0xd4: /*Write to mouse*/ - if (((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) && mouse_scan) { + if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { kbdlog("ATkbd: write to mouse\n"); kbd->want60 = 1; return 0; @@ -746,7 +803,7 @@ kbd_write64_generic(void *p, uint8_t val) case 0xf4: case 0xf5: case 0xf6: case 0xf7: case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff: - kbdlog("ATkbd: pulse %01X\n", val & 0x0f); + // kbdlog("ATkbd: pulse %01X\n", val & 0x0f); kbd_output_pulse(kbd, val & 0x0f); return 0; } @@ -761,6 +818,20 @@ kbd_write60_ami(void *p, uint8_t val) atkbd_t *kbd = (atkbd_t *) p; 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: + kbdlog("AMI - alias write to register %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*/ kbdlog("AMI - set extended controller RAM\n"); if (kbd->secr_phase == 1) { @@ -787,9 +858,89 @@ kbd_write64_ami(void *p, uint8_t val) atkbd_t *kbd = (atkbd_t *) p; switch (val) { + case 0x00: case 0x01: case 0x02: case 0x03: + case 0x04: case 0x05: case 0x06: case 0x07: + case 0x08: case 0x09: case 0x0a: case 0x0b: + case 0x0c: case 0x0d: case 0x0e: case 0x0f: + case 0x10: case 0x11: case 0x12: case 0x13: + case 0x14: case 0x15: case 0x16: case 0x17: + case 0x18: case 0x19: case 0x1a: case 0x1b: + case 0x1c: case 0x1d: case 0x1e: case 0x1f: + kbdlog("AMI - alias read from register %08X\n", val); + kbd_adddata(kbd->mem[val]); + return 0; + 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: + kbdlog("AMI - alias write to register %08X\n", kbd->command); + kbd->want60 = 1; + return 0; case 0xa1: /*AMI - get controller version*/ kbdlog("AMI - get controller version\n"); return 0; + case 0xa2: /*AMI - reset keyboard controller lines P22 and P23 low*/ + if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { + kbdlog("AMI - reset keyboard controller lines P22 and P23 low\n"); + kbd_output_write(kbd, kbd->output_port & 0xf3); + kbd_adddata(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) { + kbdlog("AMI - set keyboard controller lines P22 and P23 high\n"); + kbd_output_write(kbd, kbd->output_port | 0x0c); + kbd_adddata(0x00); + return 0; + } + break; + case 0xa4: /* AMI - write clock = low */ + if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { + kbdlog("AMI - write clock = low\n"); + kbd->ami_stat &= 0xfe; + return 0; + } + break; + case 0xa5: /* AMI - write clock = high */ + if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { + kbdlog("AMI - write clock = high\n"); + kbd->ami_stat |= 0x01; + return 0; + } + break; + case 0xa6: /* AMI - read clock */ + if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { + kbdlog("AMI - read clock\n"); + kbd_adddata(!!(kbd->ami_stat & 1)); + return 0; + } + break; + case 0xa7: /* AMI - write cache bad */ + if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { + kbdlog("AMI - write cache bad\n"); + kbd->ami_stat &= 0xfd; + return 0; + } + break; + case 0xa8: /* AMI - write cache good */ + if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { + kbdlog("AMI - write cache good\n"); + kbd->ami_stat |= 0x02; + return 0; + } + break; + case 0xa9: /* AMI - read cache */ + if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { + kbdlog("AMI - read cache\n"); + kbd_adddata(!!(kbd->ami_stat & 2)); + return 0; + } + break; case 0xaf: /*Set extended controller RAM*/ kbdlog("ATkbd: set extended controller RAM\n"); kbd->want60 = 1; @@ -864,6 +1015,9 @@ kbd_write64_ibm_mca(void *p, uint8_t val) kbd->status &= 0xf; kbd->status |= (((kbd->input_port & 0xfc) | 0x84 | fdc_ps1_525()) & 0xf0); return 0; + case 0xaf: + kbdlog("ATkbd: bad kbc command AF\n"); + return 1; case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: case 0xf8: case 0xf9: case 0xfa: case 0xfb: @@ -898,6 +1052,9 @@ kbd_write64_quadtel(void *p, uint8_t val) atkbd_t *kbd = (atkbd_t *) p; switch (val) { + case 0xaf: + kbdlog("ATkbd: bad kbc command AF\n"); + return 1; case 0xcf: /*??? - sent by MegaPC BIOS*/ kbdlog("??? - sent by MegaPC BIOS\n"); kbd->want60 = 1; @@ -929,6 +1086,9 @@ kbd_write64_toshiba(void *p, uint8_t val) atkbd_t *kbd = (atkbd_t *) p; switch (val) { + case 0xaf: + kbdlog("ATkbd: bad kbc command AF\n"); + return 1; case 0xb0: /* T3100e: Turbo on */ t3100e_turbo_set(1); return 0; @@ -986,6 +1146,7 @@ kbd_write(uint16_t port, uint8_t val, void *priv) atkbd_t *kbd = (atkbd_t *)priv; int i = 0; int bad = 1; + uint8_t mask; switch (port) { case 0x60: @@ -993,18 +1154,6 @@ kbd_write(uint16_t port, uint8_t val, void *priv) /*Write to controller*/ kbd->want60 = 0; 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: - kbd->command |= 0x20; - goto write_register; - case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: case 0x68: case 0x69: case 0x6a: case 0x6b: @@ -1013,15 +1162,13 @@ 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: - -write_register: kbd->mem[kbd->command & 0x1f] = val; if (kbd->command == 0x60) kbd_cmd_write(kbd, val); break; case 0xd1: /*Write output port*/ - kbdlog("Write output port\n"); + // kbdlog("Write output port\n"); if (kbd->output_locked) { /*If keyboard controller lines P22-P23 are blocked, we force them to remain unchanged.*/ @@ -1044,8 +1191,11 @@ write_register: case 0xd4: /*Write to mouse*/ kbdlog("ATkbd: write to mouse (%02X)\n", val); + kbd_mouse_set(kbd, 1); if (mouse_write && ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1)) mouse_write(val, mouse_p); + else if (!mouse_write && ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1)) + keyboard_at_adddata_mouse(0xff); break; default: @@ -1089,59 +1239,72 @@ write_register: } } else { kbd->key_command = val; + kbd_keyboard_set(kbd, 1); switch (val) { case 0x00: + kbdlog("ATkbd: command 00\n"); kbd_adddata_keyboard(0xfa); break; case 0x05: /*??? - sent by NT 4.0*/ + kbdlog("ATkbd: nt 4.0 command fe\n"); kbd_adddata_keyboard(0xfe); break; case 0x71: /*These two commands are sent by Pentium-era AMI BIOS'es.*/ case 0x82: + kbdlog("ATkbd: pentium-era ami bios command %02x\n", val); break; case 0xed: /*Set/reset LEDs*/ + kbdlog("ATkbd: set/reset leds\n"); kbd->key_wantdata = 1; kbd_adddata_keyboard(0xfa); break; case 0xee: /*Diagnostic echo*/ + kbdlog("ATkbd: diagnostic echo\n"); kbd_adddata_keyboard(0xee); break; case 0xef: /*NOP (No OPeration). Reserved for future use.*/ + kbdlog("ATkbd: kbd nop\n"); break; case 0xf0: /*Get/set scan code set*/ + kbdlog("ATkbd: scan code set\n"); kbd->key_wantdata = 1; kbd_adddata_keyboard(0xfa); break; case 0xf2: /*Read ID*/ /* Fixed as translation will be done in kbd_adddata_keyboard(). */ + kbdlog("ATkbd: read keyboard id\n"); kbd_adddata_keyboard(0xfa); kbd_adddata_keyboard(0xab); kbd_adddata_keyboard(0x83); break; case 0xf3: /*Set typematic rate/delay*/ + kbdlog("ATkbd: set typematic rate/delay\n"); kbd->key_wantdata = 1; kbd_adddata_keyboard(0xfa); break; case 0xf4: /*Enable keyboard*/ + kbdlog("ATkbd: enable keyboard via keyboard\n"); keyboard_scan = 1; kbd_adddata_keyboard(0xfa); break; case 0xf5: /*Disable keyboard*/ + kbdlog("ATkbd: disable keyboard via keyboard\n"); keyboard_scan = 0; kbd_adddata_keyboard(0xfa); break; case 0xf6: /*Set defaults*/ + kbdlog("ATkbd: set defaults\n"); keyboard_set3_all_break = 0; keyboard_set3_all_repeat = 0; memset(keyboard_set3_flags, 0, 272); @@ -1151,31 +1314,37 @@ write_register: break; case 0xf7: /*Set all keys to repeat*/ + kbdlog("ATkbd: set all keys to repeat\n"); keyboard_set3_all_break = 1; kbd_adddata_keyboard(0xfa); break; case 0xf8: /*Set all keys to give make/break codes*/ + kbdlog("ATkbd: set all keys to give make/break codes\n"); keyboard_set3_all_break = 1; kbd_adddata_keyboard(0xfa); break; case 0xf9: /*Set all keys to give make codes only*/ + kbdlog("ATkbd: set all keys to give make codes only\n"); keyboard_set3_all_break = 0; kbd_adddata_keyboard(0xfa); break; case 0xfa: /*Set all keys to repeat and give make/break codes*/ + kbdlog("ATkbd: set all keys to repeat and give make/break codes\n"); keyboard_set3_all_repeat = 1; keyboard_set3_all_break = 1; kbd_adddata_keyboard(0xfa); break; case 0xfe: /*Resend last scan code*/ + kbdlog("ATkbd: reset last scan code\n"); kbd_adddata_keyboard(kbd->last_scan_code); break; case 0xff: /*Reset*/ + kbdlog("ATkbd: kbd reset\n"); key_queue_start = key_queue_end = 0; /*Clear key queue*/ kbd_adddata_keyboard(0xfa); kbd_adddata_keyboard(0xaa); @@ -1212,18 +1381,6 @@ write_register: kbd->command = val; /*New controller command*/ switch (val) { - case 0x00: case 0x01: case 0x02: case 0x03: - case 0x04: case 0x05: case 0x06: case 0x07: - case 0x08: case 0x09: case 0x0a: case 0x0b: - case 0x0c: case 0x0d: case 0x0e: case 0x0f: - case 0x10: case 0x11: case 0x12: case 0x13: - case 0x14: case 0x15: case 0x16: case 0x17: - case 0x18: case 0x19: case 0x1a: case 0x1b: - case 0x1c: case 0x1d: case 0x1e: case 0x1f: - val |= 0x20; /* 0x00-0x1f aliases for 0x20-0x3f */ - kbd_adddata(kbd->mem[val & 0x1f]); - break; - case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: case 0x28: case 0x29: case 0x2a: case 0x2b: @@ -1246,35 +1403,6 @@ write_register: kbd->want60 = 1; break; - case 0xa7: /*Disable mouse port*/ - if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { - kbdlog("ATkbd: disable mouse port\n"); - mouse_scan = 0; - kbd->mem[0] |= 0x20; - } else { - kbdlog("ATkbd: Write Cache Bad\n"); - } - break; - - case 0xa8: /*Enable mouse port*/ - if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { - kbdlog("ATkbd: enable mouse port\n"); - mouse_scan = 1; - kbd->mem[0] &= 0xDF; - } else { - kbdlog("ATkbd: Write Cache Good\n"); - } - break; - - case 0xa9: /*Test mouse port*/ - kbdlog("ATkbd: test mouse port\n"); - if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { - kbd_adddata(0x00); /*no error*/ - } else { - kbd_adddata(0xff); /*no mouse*/ - } - break; - case 0xaa: /*Self-test*/ kbdlog("Self-test\n"); if ((kbd->flags & KBC_VEN_MASK) == KBC_VEN_TOSHIBA) @@ -1286,14 +1414,11 @@ write_register: } 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); - /*Self-test also resets the output port, enabling A20*/ - if (kbd->output_port & 0x02) { - mem_a20_key = 0; - mem_a20_recalc(); - flushmmucache(); - } - kbd->output_port = 0xcd; break; case 0xab: /*Interface test*/ @@ -1312,21 +1437,26 @@ write_register: case 0xad: /*Disable keyboard*/ kbdlog("ATkbd: disable keyboard\n"); - kbd->mem[0] |= 0x10; + kbd_keyboard_set(kbd, 0); break; case 0xae: /*Enable keyboard*/ kbdlog("ATkbd: enable keyboard\n"); - kbd->mem[0] &= ~0x10; + kbd_keyboard_set(kbd, 1); break; case 0xd0: /*Read output port*/ kbdlog("ATkbd: read output port\n"); - kbd_adddata(kbd->output_port); + mask = 0xff; + if(!keyboard_scan) + mask &= 0xbf; + if(!mouse_scan && ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1)) + mask &= 0xf7; + kbd_adddata(kbd->output_port & mask); break; case 0xd1: /*Write output port*/ - kbdlog("ATkbd: write output port\n"); + // kbdlog("ATkbd: write output port\n"); kbd->want60 = 1; break; @@ -1337,18 +1467,12 @@ write_register: case 0xdd: /* Disable A20 Address Line */ kbdlog("ATkbd: disable A20 Address Line\n"); - kbd->output_port &= ~0x02; - mem_a20_key = 0; - mem_a20_recalc(); - flushmmucache(); + kbd_output_write(kbd, kbd->output_port & 0xfd); break; case 0xdf: /* Enable A20 Address Line */ kbdlog("ATkbd: enable A20 address line\n"); - kbd->output_port |= 0x02; - mem_a20_key = 2; - mem_a20_recalc(); - flushmmucache(); + kbd_output_write(kbd, kbd->output_port | 0x02); break; case 0xe0: /*Read test inputs*/ @@ -1399,7 +1523,7 @@ kbd_read(uint16_t port, void *priv) case 0x64: ret = (kbd->status & 0xFB) | (keyboard_mode & CCB_SYSTEM); ret |= STAT_LOCK; - kbd->status &= ~(STAT_RTIMEOUT/* | STAT_TTIMEOUT*/); + kbd->status &= ~(STAT_RTIMEOUT | STAT_TTIMEOUT); break; } @@ -1426,9 +1550,9 @@ kbd_reset(void *priv) kbd->dtrans = 0; kbd->first_write = 1; kbd->status = STAT_LOCK | STAT_CD; - kbd->mem[0] = 0x11; + kbd->mem[0] = 0x01; kbd->wantirq = 0; - kbd->output_port = 0xcd; + kbd_output_write(kbd, 0xcf); kbd->input_port = (MDA) ? 0xf0 : 0xb0; kbd->out_new = -1; kbd->last_irq = 0; @@ -1436,8 +1560,9 @@ kbd_reset(void *priv) kbd->key_wantdata = 0; keyboard_mode = 0x02 | kbd->dtrans; - keyboard_scan = 1; - mouse_scan = 0; + + kbd_keyboard_set(kbd, 1); + kbd_mouse_set(kbd, 0); sc_or = 0; @@ -1455,6 +1580,8 @@ kbd_init(device_t *info) kbd = (atkbd_t *)malloc(sizeof(atkbd_t)); memset(kbd, 0x00, sizeof(atkbd_t)); + kbd->flags = info->local; + kbd_reset(kbd); io_sethandler(0x0060, 5, @@ -1463,8 +1590,6 @@ kbd_init(device_t *info) timer_add(kbd_poll, &keyboard_delay, TIMER_ALWAYS_ENABLED, kbd); - kbd->flags = info->local; - if ((kbd->flags & KBC_TYPE_MASK) != KBC_TYPE_ISA) { timer_add(kbd_refresh, &kbd->refresh_time, TIMER_ALWAYS_ENABLED, kbd); @@ -1639,10 +1764,7 @@ keyboard_at_set_mouse_scan(uint8_t val) if (temp_mouse_scan == mouse_scan) return; - mouse_scan = val ? 1 : 0; - - kbd->mem[0] &= 0xDF; - kbd->mem[0] |= (val ? 0x00 : 0x20); + kbd_mouse_set(kbd, val ? 1 : 0); kbdlog("ATkbd: mouse scan %sabled via PCI\n", mouse_scan ? "en" : "dis"); } diff --git a/src/machine/m_at_opti495.c b/src/machine/m_at_opti495.c index b0d07e024..23f599554 100644 --- a/src/machine/m_at_opti495.c +++ b/src/machine/m_at_opti495.c @@ -294,13 +294,6 @@ static void opti495_write(uint16_t addr, uint8_t val, void *p) else mem_set_mem_state(0xf0000, 0x10000, MEM_READ_EXTERNAL | MEM_WRITE_INTERNAL); } - if (optireg == 0x27) - { - // mem_a20_alt = (val & 0x80) ? 0x00 : 0x02; - mem_a20_alt = (val & 0x80); - mem_a20_recalc(); - flushmmucache(); - } } break; } @@ -330,7 +323,8 @@ static void opti495_init(void) void machine_at_opti495_init(machine_t *model) { - machine_at_ide_init(model); + machine_at_common_ide_init(model); + device_add(&keyboard_at_device); opti495_init(); }