static void write_p64(Bitu port,Bitu val,Bitu iolen) { switch (val) { case 0xae: /* Activate keyboard */ keyb.active=true; if (keyb.used && !keyb.scheduled && !keyb.p60changed) { keyb.scheduled=true; PIC_AddEvent(KEYBOARD_TransferBuffer,KEYDELAY); } LOG(LOG_KEYBOARD,LOG_NORMAL)("Activated"); break; case 0xad: /* Deactivate keyboard */ keyb.active=false; LOG(LOG_KEYBOARD,LOG_NORMAL)("De-Activated"); break; case 0xd0: /* Outport on buffer */ KEYBOARD_SetPort60(MEM_A20_Enabled() ? 0x02 : 0); break; case 0xd1: /* Write to outport */ keyb.command=CMD_SETOUTPORT; break; default: LOG(LOG_KEYBOARD,LOG_ERROR)("Port 64 write with val %d",val); break; } }
static void write_p64(Bitu port,Bitu val,Bitu iolen) { switch (val) { case 0xae: /* Activate keyboard */ keyb.active=true; if (keyb.used && !keyb.scheduled && !keyb.p60changed) { keyb.scheduled=true; KEYBOARD_TransferBuffer(0); //PIC_AddEvent(KEYBOARD_TransferBuffer,KEYDELAY); } LOG(LOG_KEYBOARD,LOG_NORMAL)("Activated"); break; case 0xad: /* Deactivate keyboard */ keyb.active=false; LOG(LOG_KEYBOARD,LOG_NORMAL)("De-Activated"); break; case 0xc0: // read config jumpers KEYBOARD_SetPort60(x86_get_jumpers()); break; case 0xd0: /* Outport on buffer */ KEYBOARD_SetPort60(MEM_A20_Enabled() ? 0x02 : 0); break; case 0xd1: /* Write to outport */ keyb.command=CMD_SETOUTPORT; break; case 0xaa: KEYBOARD_SetPort60(0x55); break; case 0xe0: // bit 0 = clock line state, 1 = data line state KEYBOARD_SetPort60((keyb.outport & 30) ? 2 : 3); break; case 0xfe: // pulse reset pin case 0xfc: case 0xfa: case 0xf8: case 0xf6: case 0xf4: case 0xf2: case 0xf0: x86_init_reset(); break; default: LOG(LOG_KEYBOARD,LOG_ERROR)("Port 64 write with val %d",val); break; } }
static void KEYBOARD_TransferBuffer(Bitu val) { /* 8042 responses take priority over the keyboard */ if (keyb.enable_aux && keyb.buf8042_len != 0) { KEYBOARD_SetPort60(keyb.buf8042[keyb.buf8042_pos]); if (++keyb.buf8042_pos >= keyb.buf8042_len) keyb.buf8042_len = keyb.buf8042_pos = 0; return; } keyb.scheduled=false; if (!keyb.used) { LOG(LOG_KEYBOARD,LOG_NORMAL)("Transfer started with empty buffer"); return; } KEYBOARD_SetPort60(keyb.buffer[keyb.pos]); if (++keyb.pos>=KEYBUFSIZE) keyb.pos-=KEYBUFSIZE; keyb.used--; }
static void KEYBOARD_TransferBuffer(Bitu val) { keyb.scheduled=false; if (!keyb.used) { LOG(LOG_KEYBOARD,LOG_NORMAL)("Transfer started with empty buffer"); return; } KEYBOARD_SetPort60(keyb.buffer[keyb.pos]); if (++keyb.pos>=KEYBUFSIZE) keyb.pos-=KEYBUFSIZE; keyb.used--; }
static void write_p64(Bitu port,Bitu val,Bitu iolen) { if (keyb.reset) return; switch (val) { case 0x20: /* read command byte */ /* TODO: If biosps2=true and aux=false, mask AUX port bits as if AUX isn't there */ KEYBOARD_Add8042Response( (keyb.cb_xlat << 6) | ((!keyb.auxactive) << 5) | ((!keyb.active) << 4) | (keyb.cb_sys << 2) | (keyb.cb_irq12 << 1) | (keyb.cb_irq1?1:0)); break; case 0x60: keyb.command=CMD_SETCOMMAND; break; case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97: case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f: /* TODO: If bit 0 == 0, trigger system reset */ break; case 0xa7: /* disable aux */ /* TODO: If biosps2=true and aux=false do not respond */ if (keyb.enable_aux) { //keyb.auxactive=false; //LOG(LOG_KEYBOARD,LOG_NORMAL)("AUX De-Activated"); } break; case 0xa8: /* enable aux */ /* TODO: If biosps2=true and aux=false do not respond */ if (keyb.enable_aux) { keyb.auxactive=true; if (keyb.used && !keyb.scheduled && !keyb.p60changed) { keyb.scheduled=true; PIC_AddEvent(KEYBOARD_TransferBuffer,KEYDELAY); } LOG(LOG_KEYBOARD,LOG_NORMAL)("AUX Activated"); } break; case 0xa9: /* mouse interface test */ /* TODO: If biosps2=true and aux=false do not respond */ KEYBOARD_Add8042Response(0x00); /* OK */ break; case 0xaa: /* Self test */ keyb.active=false; /* on real h/w it also seems to disable the keyboard */ KEYBOARD_Add8042Response(0xaa); /* OK */ break; case 0xab: /* interface test */ keyb.active=false; /* on real h/w it also seems to disable the keyboard */ KEYBOARD_Add8042Response(0x00); /* no error */ break; case 0xae: /* Activate keyboard */ keyb.active=true; if (keyb.used && !keyb.scheduled && !keyb.p60changed) { keyb.scheduled=true; PIC_AddEvent(KEYBOARD_TransferBuffer,KEYDELAY); } LOG(LOG_KEYBOARD,LOG_NORMAL)("Activated"); break; case 0xad: /* Deactivate keyboard */ keyb.active=false; LOG(LOG_KEYBOARD,LOG_NORMAL)("De-Activated"); break; case 0xc0: /* read input buffer */ KEYBOARD_Add8042Response(0x40); break; case 0xd0: /* Outport on buffer */ KEYBOARD_SetPort60((MEM_A20_Enabled() ? 0x02 : 0) | 0x01/*some programs read the output port then write it back*/); break; case 0xd1: /* Write to outport */ keyb.command=CMD_SETOUTPORT; break; case 0xd2: /* write output register */ keyb.command=CMD_WRITEOUTPUT; break; case 0xd3: /* write AUX output */ if (keyb.enable_aux) keyb.command=CMD_WRITEAUXOUT; else if (aux_warning++ == 0) LOG(LOG_KEYBOARD,LOG_ERROR)("Program is writing 8042 AUX. If you intend to use PS/2 mouse emulation you may consider adding aux=1 to your dosbox.conf"); break; case 0xd4: /* send byte to AUX */ if (keyb.enable_aux) keyb.command=CMD_WRITEAUX; else if (aux_warning++ == 0) LOG(LOG_KEYBOARD,LOG_ERROR)("Program is writing 8042 AUX. If you intend to use PS/2 mouse emulation you may consider adding aux=1 to your dosbox.conf"); break; case 0xe0: /* read test port */ KEYBOARD_Add8042Response(0x00); break; 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: /* pulse output register */ if (!(val & 1)) { if (allow_keyb_reset) { LOG_MSG("Restart by keyboard controller requested\n"); On_Software_CPU_Reset(); } else { LOG_MSG("WARNING: Keyboard output port written (pulsed) with bit 1 clear. Is the guest OS or application attempting to reset the system?\n"); } } break; default: LOG(LOG_KEYBOARD,LOG_ERROR)("Port 64 write with val %d",(int)val); break; } }