⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 queues.c

📁 freedos32的源代码
💻 C
字号:
/* Keyborad Driver for FD32 * original by Luca Abeni * extended by Hanzac Chen * * 2004 - 2005 * This is free software; see GPL.txt */#include <dr-env.h>#include "key.h"#include "queues.h"/* Level 1 keybuf queue */static volatile BYTE rawqueue[RAWQUEUE_MAX_SIZE];/* static volatile int rawqueue_elements; */static volatile WORD rawqueue_head;static volatile WORD rawqueue_tail;/* Level 2 keybuf queue */static volatile BYTE *keyqueue = (BYTE *)BDA_KEYB_BUF; /* KEYQUEUE_MAX_SIZE *//* static volatile int keyqueue_elements; */static volatile WORD *keyqueue_head = (WORD *)BDA_KEYB_BUFHEAD;static volatile WORD *keyqueue_tail = (WORD *)BDA_KEYB_BUFTAIL;void rawqueue_put(BYTE code){  if (rawqueue_tail-rawqueue_head == RAWQUEUE_MAX_SIZE) {    return;  } /* Note: keyqueue_elements++ is not used, elements determined by keyqueue_tail[0]-keyqueue_head[0] */  fd32_cli();  rawqueue_tail = (rawqueue_tail + 1) % RAWQUEUE_MAX_SIZE;  rawqueue[rawqueue_tail] = code;  fd32_sti();  return;}BYTE rawqueue_get(void){  if (rawqueue_tail == rawqueue_head) {    //    fd32_error("??? No char in queue???\n");    return 0;  }  /* rawqueue_elements--; */  fd32_cli();  rawqueue_head = (rawqueue_head + 1) % RAWQUEUE_MAX_SIZE;  fd32_sti();  return rawqueue[rawqueue_head];}/* Note: KEYBOARD BUFFER HEAD and TAIL pointer to the buffer offset relative to 0x0040:0000 *       So we need to subtract 0x1E (which is BDA_OFFSET(BDA_KEYB_BUF)) to get the index */void keyqueue_put(WORD code){  if (keyqueue_tail[0]-keyqueue_head[0] == KEYQUEUE_MAX_SIZE) {    return;  }  /* Note: keyqueue_elements++ is not used, elements determined by keyqueue_tail[0]-keyqueue_head[0] */  fd32_cli();  ((WORD *)(keyqueue + keyqueue_tail[0] - BDA_OFFSET(BDA_KEYB_BUF)))[0] = code;  keyqueue_tail[0] = (keyqueue_tail[0] - BDA_OFFSET(BDA_KEYB_BUF) + 2) % KEYQUEUE_MAX_SIZE;  keyqueue_tail[0] += BDA_OFFSET(BDA_KEYB_BUF);  fd32_sti();  return;}/* Note: Not ignore the maskable interrupts 'cause no shared data manipulation */WORD keyqueue_gethead(void){  if (keyqueue_tail[0] == keyqueue_head[0]) {    /* fd32_error("??? No char in queue???\n"); */    return 0;  }  return ((WORD *)(keyqueue + (keyqueue_head[0]-BDA_OFFSET(BDA_KEYB_BUF)) % KEYQUEUE_MAX_SIZE))[0];}BYTE keyqueue_get(void){  DWORD t = keyqueue_head[0];  if (keyqueue_tail[0] == keyqueue_head[0]) {    /* fd32_error("??? No char in queue???\n"); */    return 0;  }  /* keyqueue_elements--; */  fd32_cli();  keyqueue_head[0] = (keyqueue_head[0]-BDA_OFFSET(BDA_KEYB_BUF) + 1) % KEYQUEUE_MAX_SIZE;  keyqueue_head[0] += BDA_OFFSET(BDA_KEYB_BUF);  fd32_sti();  return keyqueue[t-BDA_OFFSET(BDA_KEYB_BUF)];}int keyqueue_empty(void){  if (keyqueue_tail[0] == keyqueue_head[0]) {    /* fd32_error("??? No char in queue???\n"); */    return 1;  } else {    return 0;  }}void keyb_queue_clear(void){  /* Rawqueue clear */  rawqueue_head = 0;  rawqueue_tail = 0;  /* Keyqueue clear */  keyqueue_head[0] = BDA_OFFSET(BDA_KEYB_BUF);  keyqueue_tail[0] = BDA_OFFSET(BDA_KEYB_BUF);  /* Set the Keyqueue buffer start offsets to 0x0040:0000 */  ((WORD *)BDA_KEYB_BUFSTART)[0] = BDA_OFFSET(BDA_KEYB_BUF);  ((WORD *)BDA_KEYB_BUFEND)[0] = BDA_OFFSET(BDA_KEYB_BUF)+KEYQUEUE_MAX_SIZE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -