diff --git a/machine/x86/x86/bios/rombios.c b/machine/x86/x86/bios/rombios.c index 64c569e..0690eb9 100644 --- a/machine/x86/x86/bios/rombios.c +++ b/machine/x86/x86/bios/rombios.c @@ -1086,7 +1086,7 @@ static struct { { 0x342e, 0x343e, none, none, none }, /* .> */ { 0x352f, 0x353f, none, none, none }, /* /? */ { none, none, none, none, none }, /* R Shift */ - { 0x372a, 0x372a, none, none, none }, /* * */ + { 0x372a, 0x372a, 0x5400, 0x5400, none }, /* * */ { none, none, none, none, none }, /* L Alt */ { 0x3920, 0x3920, 0x3920, 0x3920, none }, /* space */ { none, none, none, none, none }, /* caps lock */ @@ -3934,7 +3934,24 @@ BX_DEBUG_INT15("int15 AX=%04x\n",regs.u.r16.ax); break; } - + case 0x85: + // alt + sysrq + switch(regs.u.r8.al) + { + case 0x00: + BX_INFO("int15: alt sysrq pressed\n"); + break; + case 0x01: + BX_INFO("int15: alt sysrq released\n"); + break; + default: + BX_INFO("int15: alt sysrq 0x%02x\n", regs.u.r8.al); + break; + } + //regs.u.r8.ah = 0x00; + //regs.u.r8.al = 0x85; + CLEAR_CF(); + break; case 0x87: #if BX_CPU < 3 # error "Int15 function 87h not supported on < 80386" @@ -5091,7 +5107,27 @@ int09_function(DI, SI, BP, SP, BX, DX, CX, AX) mf2_flags &= ~0x10; write_byte(0x0040, 0x18, mf2_flags); break; - + case 0x54: /* Sysrq press */ + mf2_flags |= 0x04; + write_byte(0x0040, 0x18, mf2_flags); + if (shift_flags & 0x08) // Alt + sysrq + { + SET_AH(0x85); + SET_AL(0x00); // press + ASM_START + int 0x15 + ASM_END + } + return; + case 0xd4: /* Sysrq release */ + mf2_flags &= ~0x04; + write_byte(0x0040, 0x18, mf2_flags); + SET_AH(0x85); + SET_AL(0x01); // release + ASM_START + int 0x15 + ASM_END + return; default: if (scancode & 0x80) { break; /* toss key releases ... */ @@ -5134,6 +5170,19 @@ int09_function(DI, SI, BP, SP, BX, DX, CX, AX) if (scancode==0 && asciicode==0) { BX_INFO("KBD: int09h_handler(): scancode & asciicode are zero?\n"); } + if (scancode==0x54 && asciicode==0x00) + { + mf2_flags |= 0x04; + write_byte(0x0040, 0x18, mf2_flags); + if (shift_flags & 0x08) // Alt + sysrq + { + SET_AH(0x85); + SET_AL(0x00); // press (FIXME: should do release too, w/ 0x01) + ASM_START + int 0x15 + ASM_END + } + } enqueue_key(scancode, asciicode); break; }