dos-vga-arena-shooter-game/system/keyboard.c

61 lines
1.5 KiB
C
Raw Normal View History

2024-02-15 01:15:55 +00:00
#include <dos.h>
#include <conio.h>
#include "keyboard.h"
unsigned char keystateBits[16];
struct KeyboardKeydownState keyboardKeydownState;
void far (interrupt *int9Save)();
void populateKeyboardKeydownState() {
keyboardKeydownState.KEY_W = keystateBits[2] & 0x02;
keyboardKeydownState.KEY_A = keystateBits[3] & 0x40;
keyboardKeydownState.KEY_S = keystateBits[3] & 0x80;
keyboardKeydownState.KEY_D = keystateBits[4] & 0x01;
2024-03-04 22:38:03 +00:00
keyboardKeydownState.KEY_I = keystateBits[2] & 0x80;
keyboardKeydownState.KEY_O = keystateBits[3] & 0x01;
keyboardKeydownState.KEY_P = keystateBits[3] & 0x02;
2024-02-20 17:39:28 +00:00
keyboardKeydownState.KEY_ESC = keystateBits[0] & 0x02;
2024-02-15 01:15:55 +00:00
}
void far interrupt keyboardHandler(void) {
unsigned char rawcode, scancode, ksbByte, temp;
unsigned char mask = 1;
_disable();
rawcode = inp(0x60);
scancode = rawcode & 0x7f;
mask = 1 << (scancode & 0x07);
ksbByte = scancode >> 3;
// https://github.com/id-Software/wolf3d/blob/05167784ef009d0d0daefe8d012b027f39dc8541/WOLFSRC/ID_IN.C#L152-L154
outp(0x61, (temp = inp(0x61)) | 0x80);
outp(0x61, temp);
/* break */
if (rawcode & 0x80) {
mask = 0xff - mask;
keystateBits[ksbByte] &= mask;
/* make */
} else {
keystateBits[ksbByte] |= mask;
}
// acknowledge we're done with the interrupt
outp(0x20, 0x20);
_enable();
}
void installKeyboardHandler() {
int9Save = _dos_getvect(9);
_dos_setvect(9, keyboardHandler);
}
void uninstallKeyboardHandler() {
_dos_setvect(9, int9Save);
}