📄 int16.c
字号:
/* DPMI Driver for FD32: int 0x16 services * by Luca Abeni * * This is free software; see GPL.txt */#include <ll/i386/hw-data.h>#include <ll/i386/hw-instr.h>#include <ll/i386/hw-func.h>#include <ll/i386/mem.h>#include <ll/i386/string.h>#include <ll/i386/error.h>#include <ll/i386/cons.h>#include <logger.h>#include <devices.h>#include <kernel.h>#include "rmint.h"#define BIOSKEY_NON_BLOCKING 0#define BIOSKEY_BLOCKING 1/* Keyboard driver handle and ID */static void *kbddev_id = NULL;static fd32_request_t *kbdreq = NULL;static WORD get_keycode(int mode){ int res; fd32_read_t R; WORD c; R.Size = sizeof(fd32_read_t); R.DeviceId = kbddev_id; R.Buffer = &c; if (mode == BIOSKEY_NON_BLOCKING) { R.BufferBytes = 0; /* 0 is non-blocking read BIOS keycode */ } else if (mode == BIOSKEY_BLOCKING) { R.BufferBytes = -1; /* -1 is blocking read BIOS keycode */ } /* Note: Directly get the keycode ... */ res = kbdreq(FD32_READ, &R); if (res == 0) { return 0; } return c;}int keybbios_int(union rmregs *r){ WORD keycode; if (kbdreq == NULL) { int res = fd32_dev_search("kbd"); if (res < 0) { RMREGS_SET_CARRY; return 1; } fd32_dev_get(res, &kbdreq, &kbddev_id, NULL, 0); } switch (r->h.ah) { case 0x00: case 0x10: keycode = get_keycode(BIOSKEY_BLOCKING); if (keycode == 0) { r->x.flags |= 0x40; } else { r->x.flags &= ~0x40; r->x.ax = keycode; } RMREGS_CLEAR_CARRY; return 0; case 0x01: case 0x11: keycode = get_keycode(BIOSKEY_NON_BLOCKING); if (keycode == 0) { r->x.flags |= 0x40; } else { r->x.flags &= ~0x40; r->x.ax = keycode; } RMREGS_CLEAR_CARRY; return 0; case 0x02: case 0x12: /* TODO: Should define new keyboard function number */ r->x.ax = kbdreq(FD32_GETATTR, NULL); RMREGS_CLEAR_CARRY; return 0; default: error("Unimplemeted INT!!!\n"); message("INT 16, AX = 0x%x\n", r->x.ax); fd32_abort(); } return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -