Commit 07ad1b93a365a15c77b5848bba0f6a3399bce076
1 parent
d36cd60e
disable keyboard interrupts if keyboard clock disabled (may not be fully correct…
…) - added keyboard ID for extended keyboard git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@482 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
17 additions
and
2 deletions
vl.c
| @@ -1462,6 +1462,10 @@ void serial_received_byte(SerialState *s, int ch) | @@ -1462,6 +1462,10 @@ void serial_received_byte(SerialState *s, int ch) | ||
| 1462 | s->lsr |= UART_LSR_BI | UART_LSR_DR; | 1462 | s->lsr |= UART_LSR_BI | UART_LSR_DR; |
| 1463 | serial_update_irq(); | 1463 | serial_update_irq(); |
| 1464 | break; | 1464 | break; |
| 1465 | + case 'd': | ||
| 1466 | + // tb_flush(); | ||
| 1467 | + cpu_set_log(CPU_LOG_ALL); | ||
| 1468 | + break; | ||
| 1465 | case TERM_ESCAPE: | 1469 | case TERM_ESCAPE: |
| 1466 | goto send_char; | 1470 | goto send_char; |
| 1467 | } | 1471 | } |
| @@ -1979,6 +1983,7 @@ void ne2000_init(void) | @@ -1979,6 +1983,7 @@ void ne2000_init(void) | ||
| 1979 | /* Keyboard Commands */ | 1983 | /* Keyboard Commands */ |
| 1980 | #define KBD_CMD_SET_LEDS 0xED /* Set keyboard leds */ | 1984 | #define KBD_CMD_SET_LEDS 0xED /* Set keyboard leds */ |
| 1981 | #define KBD_CMD_ECHO 0xEE | 1985 | #define KBD_CMD_ECHO 0xEE |
| 1986 | +#define KBD_CMD_GET_ID 0xF2 /* get keyboard ID */ | ||
| 1982 | #define KBD_CMD_SET_RATE 0xF3 /* Set typematic rate */ | 1987 | #define KBD_CMD_SET_RATE 0xF3 /* Set typematic rate */ |
| 1983 | #define KBD_CMD_ENABLE 0xF4 /* Enable scanning */ | 1988 | #define KBD_CMD_ENABLE 0xF4 /* Enable scanning */ |
| 1984 | #define KBD_CMD_RESET_DISABLE 0xF5 /* reset and disable scanning */ | 1989 | #define KBD_CMD_RESET_DISABLE 0xF5 /* reset and disable scanning */ |
| @@ -2065,6 +2070,8 @@ KBDState kbd_state; | @@ -2065,6 +2070,8 @@ KBDState kbd_state; | ||
| 2065 | int reset_requested; | 2070 | int reset_requested; |
| 2066 | 2071 | ||
| 2067 | /* update irq and KBD_STAT_[MOUSE_]OBF */ | 2072 | /* update irq and KBD_STAT_[MOUSE_]OBF */ |
| 2073 | +/* XXX: not generating the irqs if KBD_MODE_DISABLE_KBD is set may be | ||
| 2074 | + incorrect, but it avoids having to simulate exact delays */ | ||
| 2068 | static void kbd_update_irq(KBDState *s) | 2075 | static void kbd_update_irq(KBDState *s) |
| 2069 | { | 2076 | { |
| 2070 | int irq12_level, irq1_level; | 2077 | int irq12_level, irq1_level; |
| @@ -2080,7 +2087,8 @@ static void kbd_update_irq(KBDState *s) | @@ -2080,7 +2087,8 @@ static void kbd_update_irq(KBDState *s) | ||
| 2080 | if (s->mode & KBD_MODE_MOUSE_INT) | 2087 | if (s->mode & KBD_MODE_MOUSE_INT) |
| 2081 | irq12_level = 1; | 2088 | irq12_level = 1; |
| 2082 | } else { | 2089 | } else { |
| 2083 | - if (s->mode & KBD_MODE_KBD_INT) | 2090 | + if ((s->mode & KBD_MODE_KBD_INT) && |
| 2091 | + !(s->mode & KBD_MODE_DISABLE_KBD)) | ||
| 2084 | irq1_level = 1; | 2092 | irq1_level = 1; |
| 2085 | } | 2093 | } |
| 2086 | } | 2094 | } |
| @@ -2120,7 +2128,7 @@ uint32_t kbd_read_status(CPUX86State *env, uint32_t addr) | @@ -2120,7 +2128,7 @@ uint32_t kbd_read_status(CPUX86State *env, uint32_t addr) | ||
| 2120 | KBDState *s = &kbd_state; | 2128 | KBDState *s = &kbd_state; |
| 2121 | int val; | 2129 | int val; |
| 2122 | val = s->status; | 2130 | val = s->status; |
| 2123 | -#if defined(DEBUG_KBD) && 0 | 2131 | +#if defined(DEBUG_KBD) |
| 2124 | printf("kbd: read status=0x%02x\n", val); | 2132 | printf("kbd: read status=0x%02x\n", val); |
| 2125 | #endif | 2133 | #endif |
| 2126 | return val; | 2134 | return val; |
| @@ -2162,9 +2170,11 @@ void kbd_write_command(CPUX86State *env, uint32_t addr, uint32_t val) | @@ -2162,9 +2170,11 @@ void kbd_write_command(CPUX86State *env, uint32_t addr, uint32_t val) | ||
| 2162 | break; | 2170 | break; |
| 2163 | case KBD_CCMD_KBD_DISABLE: | 2171 | case KBD_CCMD_KBD_DISABLE: |
| 2164 | s->mode |= KBD_MODE_DISABLE_KBD; | 2172 | s->mode |= KBD_MODE_DISABLE_KBD; |
| 2173 | + kbd_update_irq(s); | ||
| 2165 | break; | 2174 | break; |
| 2166 | case KBD_CCMD_KBD_ENABLE: | 2175 | case KBD_CCMD_KBD_ENABLE: |
| 2167 | s->mode &= ~KBD_MODE_DISABLE_KBD; | 2176 | s->mode &= ~KBD_MODE_DISABLE_KBD; |
| 2177 | + kbd_update_irq(s); | ||
| 2168 | break; | 2178 | break; |
| 2169 | case KBD_CCMD_READ_INPORT: | 2179 | case KBD_CCMD_READ_INPORT: |
| 2170 | kbd_queue(s, 0x00, 0); | 2180 | kbd_queue(s, 0x00, 0); |
| @@ -2251,6 +2261,11 @@ static void kbd_write_keyboard(KBDState *s, int val) | @@ -2251,6 +2261,11 @@ static void kbd_write_keyboard(KBDState *s, int val) | ||
| 2251 | case 0x05: | 2261 | case 0x05: |
| 2252 | kbd_queue(s, KBD_REPLY_RESEND, 0); | 2262 | kbd_queue(s, KBD_REPLY_RESEND, 0); |
| 2253 | break; | 2263 | break; |
| 2264 | + case KBD_CMD_GET_ID: | ||
| 2265 | + kbd_queue(s, KBD_REPLY_ACK, 0); | ||
| 2266 | + kbd_queue(s, 0xab, 0); | ||
| 2267 | + kbd_queue(s, 0x83, 0); | ||
| 2268 | + break; | ||
| 2254 | case KBD_CMD_ECHO: | 2269 | case KBD_CMD_ECHO: |
| 2255 | kbd_queue(s, KBD_CMD_ECHO, 0); | 2270 | kbd_queue(s, KBD_CMD_ECHO, 0); |
| 2256 | break; | 2271 | break; |