fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

ibmpc: Add a keyboard timeout

After a timeout new keys will overwrite old but unread keys. This
prevents the keyboard from getting stuck when a keyboard interrupt
is missed for some reason.

+21 -2
+20 -2
src/arch/ibmpc/keyboard.c
··· 29 29 30 30 31 31 /* 10 bits at 31250 bps */ 32 - #define PC_KBD_DELAY (PCE_IBMPC_CLK2 / (31250 / 10)) 32 + #define PC_KBD_DELAY (PCE_IBMPC_CLK2 / (31250 / 10)) 33 + #define PC_KBD_TIMEOUT (64 * PC_KBD_DELAY) 33 34 34 35 35 36 typedef struct { ··· 151 152 void pc_kbd_init (pc_kbd_t *kbd) 152 153 { 153 154 kbd->delay = PC_KBD_DELAY; 155 + kbd->timeout = 0; 154 156 155 157 kbd->key = 0; 156 158 kbd->key_valid = 0; ··· 193 195 } 194 196 195 197 kbd->delay = PC_KBD_DELAY; 198 + kbd->timeout = PC_KBD_TIMEOUT; 196 199 kbd->key = 0x55; 197 200 198 201 kbd->key_i = 0; 199 202 kbd->key_j = 1; 200 203 kbd->key_buf[0] = 0xaa; 204 + 205 + pc_kbd_set_irq (kbd, 0); 201 206 } 202 207 203 208 void pc_kbd_set_clk (pc_kbd_t *kbd, unsigned char val) ··· 227 232 228 233 if (val) { 229 234 kbd->delay = PC_KBD_DELAY; 235 + kbd->delay = PC_KBD_TIMEOUT; 230 236 } 231 237 else { 232 238 kbd->key = 0x00; ··· 319 325 } 320 326 321 327 if (kbd->key_valid) { 322 - return; 328 + if (kbd->timeout == 0) { 329 + return; 330 + } 331 + 332 + if (kbd->timeout > cnt) { 333 + kbd->timeout -= cnt; 334 + return; 335 + } 336 + 337 + kbd->timeout = 0; 338 + kbd->key_valid = 0; 323 339 } 324 340 325 341 if (kbd->delay > cnt) { ··· 328 344 } 329 345 330 346 kbd->delay = PC_KBD_DELAY; 347 + kbd->delay = PC_KBD_TIMEOUT; 331 348 332 349 kbd->key = kbd->key_buf[kbd->key_i]; 333 350 kbd->key_valid = 1; 334 351 335 352 kbd->key_i = (kbd->key_i + 1) % PC_KBD_BUF; 336 353 354 + pc_kbd_set_irq (kbd, 0); 337 355 pc_kbd_set_irq (kbd, 1); 338 356 }
+1
src/arch/ibmpc/keyboard.h
··· 30 30 typedef struct { 31 31 /* transmission delay in 1.19 MHz clocks */ 32 32 unsigned long delay; 33 + unsigned long timeout; 33 34 34 35 /* the shift register */ 35 36 unsigned char key;