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

📄 keyboard.cpp

📁 哈工大的几个人开发的操作系统pyos的部分源码
💻 CPP
字号:
#include "keyboard.h"
#include "interrupt.h"
#include "message.h"
#include "kernel.h"
#include "video.h"
#include "kernel.h"
#include "system.h"

struct_pyos_StateKey class_pyos_Keyboard::StateKey ;
bool class_pyos_Keyboard::ex ;

/* 中断实际处理函数 */
void class_pyos_Keyboard::HandleInterrupt() 
{
  // 从键盘控制器的0x60端口读入扫描码,否则键盘不会第二次中断,因为键盘在等待用户从0x60口读走数据
  unsigned char ch = class_pyos_System::FromPort( 0x60 ) ;
  // 先过滤掉特殊字节
  if( ch == 0x0 ){ // 0x0 表示按键产生错误
    return ; 
  }
  else if( ch == 0xe0 ){ // 检测是否是扩展码的前缀
    // 设置 扩展码标记位
    ex = true ;
    // 直接返回,等待下一个中断送来真实的扫描码
    return ;
  }
  else{    
    // 构造一个键盘消息
    struct_pyos_Message message ;
    message.MessageType = pyos_message_type_Keyboard ;
    if( ex == true ){
      message.KeyboardScanCode.KeyboardScanCodeHighChar = 0xe0 ; // 让高字节为扩展码
    }
    else{
      message.KeyboardScanCode.KeyboardScanCodeHighChar = 0 ;
    }
    ex = 0 ; // 清空扩展码标志    
    message.KeyboardScanCode.KeyboardScanCodeLowChar = ch ; // 让低字节为送来的真实扫描码    
    /* 发送消息给应用程序 , ReceiveMessageQueue指向的是接收消息的队列 */
    ReceiveMessageQueue->PutData( message ) ; 
  }
}
/* 翻译键盘扫描码函数 */
char class_pyos_Keyboard::TraslateScanCodeToAsciiCode( struct_pyos_KeyboardScanCode scan_code )
{
  /* 默认此键不是功能键,如果此键是功能键时再设置功能键的值 */
  StateKey.FunctionKey = keyNotFunctionKey ;
  if( scan_code.KeyboardScanCodeLowChar > 0x80 ){
    StateKey.Down = false ; // 键被弹起
  }
  else{
    StateKey.Down = true ;
  }
  if( scan_code.KeyboardScanCodeHighChar == 0xe0 ){
    // 对扩展键进行处理
    switch( scan_code.KeyboardScanCodeLowChar ){
      case 0x1d :
        StateKey.CtrlDown = true ;
        StateKey.FunctionKey = keyCtrl ;
        return 0 ;
      case 0x9d :
        StateKey.CtrlDown = false ;
        StateKey.FunctionKey = keyCtrl ;
        return 0 ;
      case 0x38 :
        StateKey.AltDown = true ;
        StateKey.FunctionKey = keyAlt ;
        return 0 ;
      case 0xb8 :
        StateKey.AltDown = false ;
        StateKey.FunctionKey = keyAlt ;
        return 0 ;
      case 0x52 :
      case 0xd2 :
        StateKey.FunctionKey = keyInsert ;
        return 0 ;
      case 0x47 :
      case 0xc7 :
        StateKey.FunctionKey = keyHome ;
        return 0 ;
      case 0x49 :
      case 0xc9 :
        StateKey.FunctionKey = keyPageUp ;
        return 0 ;
      case 0x53 :
      case 0xd3 :
        StateKey.FunctionKey = keyDelete ;
        return 0 ;
      case 0x4f :
      case 0xcf :
        StateKey.FunctionKey = keyEnd ;
        return 0 ;
      case 0x51 :
      case 0xd1 :
        StateKey.FunctionKey = keyPageDown ;
        return 0 ;
      case 0x48 :
      case 0xc8 :
        StateKey.FunctionKey = keyUpArrow ;
        return 0 ;
      case 0x4b :
      case 0xcb :
        StateKey.FunctionKey = keyLeftArrow ;
        return 0 ;
      case 0x50 :
      case 0xd0 :
        StateKey.FunctionKey = keyDownArrow ;
        return 0 ;
      case 0x4d :
      case 0xcd :
        StateKey.FunctionKey = keyRightArrow ;
        return 0 ;
    }
  }
  else{
    // 对基本键进行处理
    switch( scan_code.KeyboardScanCodeLowChar ){
      case 0x1e :
      case 0x9e :
        return 'a' ;
      case 0x30 :
      case 0xb0 :
        return 'b' ;
      case 0x2e :
      case 0xae :
        return 'c' ;
      case 0x20 :
      case 0xa0 :
        return 'd' ;
      case 0x12 :
      case 0x92 :
        return 'e' ;
      case 0x21 :
      case 0xa1 :
        return 'f' ;
      case 0x22 :
      case 0xa2 :
        return 'g' ;
      case 0x23 :
      case 0xa3 :
        return 'h' ;
      case 0x17 :
      case 0x97 :
        return 'i' ;
      case 0x24 :
      case 0xa4 :
        return 'j' ;
      case 0x25 :
      case 0xa5 :
        return 'k' ;
      case 0x26 :
      case 0xa6 :
        return 'l' ;
      case 0x32 :
      case 0xb2 :
        return 'm' ;
      case 0x31 :
      case 0xb1 :
        return 'n' ;
      case 0x18 :
      case 0x98 :
        return 'o' ;
      case 0x19 :
      case 0x99 :
        return 'p' ;
      case 0x10 :
      case 0x90 :
        return 'q' ;
      case 0x13 :
      case 0x93 :
        return 'r' ;
      case 0x1f :
      case 0x9f :
        return 's' ;
      case 0x14 :
      case 0x94 :
        return 't' ;
      case 0x16 :
      case 0x96 :
        return 'u' ;
      case 0x2f :
      case 0xaf :
        return 'v' ;
      case 0x11 :
      case 0x91 :
        return 'w' ;
      case 0x2d :
      case 0xad :
        return 'x' ;
      case 0x15 :
      case 0x95 :
        return 'y' ;
      case 0x2c :
      case 0xac :
        return 'z' ;
      case 0x0b :
      case 0x8b :
        return '0' ;
      case 0x29 :
      case 0xa9 :
        if( StateKey.ShiftDown ){
          return '~' ;
        }
        else{
          return '`' ;
        }
      case 0x0c :
      case 0x8c :
        if( StateKey.ShiftDown ){
          return '_' ;
        }
        else{
          return '-' ;
        }
      case 0x0d :
      case 0x8d :
        if( StateKey.ShiftDown ){
          return '+' ;
        }
        else{
          return '=' ;
        }
      case 0x2b :
      case 0xab :
        if( StateKey.ShiftDown ){
          return '|' ;
        }
        else{
          return '\\' ;
        }
      case 0x0e :
      case 0x8e :
        return '\b' ; // 退格键
      case 0x39 :
      case 0xb9:
        return ' ' ;
      case 0x0f :
      case 0x8f :
        return '\t' ;
      case 0x3a :
      case 0xba :
        StateKey.CapsLockDown = !StateKey.CapsLockDown ;
        StateKey.FunctionKey = keyCapsLock ;
        return 0 ;
      case 0x2a :
      case 0x36 :
        StateKey.ShiftDown = true ;
        StateKey.FunctionKey = keyShift ;
        return 0 ;
      case 0xaa :
      case 0xb6 :
        StateKey.ShiftDown = false ;
        StateKey.FunctionKey = keyShift ;
        return 0 ;
      case 0x1d :
        StateKey.CtrlDown = true ;
        StateKey.FunctionKey = keyCtrl ;
        return 0 ;
      case 0x9d :
        StateKey.CtrlDown = false ;
        StateKey.FunctionKey = keyCtrl ;
        return 0 ;
      case 0x38 :
        StateKey.AltDown = true ;
        StateKey.FunctionKey = keyAlt ;
        return 0 ;
      case 0xb8 :
        StateKey.AltDown = false ;
        StateKey.FunctionKey = keyAlt ;
        return 0 ;
      case 0x1c :
      case 0x9c :
        return '\n' ; 
      case 0x01 :
      case 0x81 :
        return 27 ; // Esc 键
      case 0x3b :
      case 0xbb :
        StateKey.FunctionKey = keyF1 ;
        return 0 ;
      case 0x3c :
      case 0xbc :
        StateKey.FunctionKey = keyF2 ;
        return 0 ;
      case 0x3d :
      case 0xbd :
        StateKey.FunctionKey = keyF3 ;
        return 0 ;
      case 0x3e :
      case 0xbe :
        StateKey.FunctionKey = keyF4 ;
        return 0 ;
      case 0x3f :
      case 0xbf :
        StateKey.FunctionKey = keyF5 ;
        return 0 ;
      case 0x40 :
      case 0xc0 :
        StateKey.FunctionKey = keyF6 ;
        return 0 ;
      case 0x41 :
      case 0xc1 :
        StateKey.FunctionKey = keyF7 ;
        return 0 ;
      case 0x42 :
      case 0xc2 :
        StateKey.FunctionKey = keyF8 ;
        return 0 ;
      case 0x43 :
      case 0xc3 :
        StateKey.FunctionKey = keyF9 ;
        return 0 ;
      case 0x44 :
      case 0xc4 :
        StateKey.FunctionKey = keyF10 ;
        return 0 ;
      case 0x57 :
      case 0xd7 :
        StateKey.FunctionKey = keyF11 ;
        return 0 ;
      case 0x58 :
      case 0xd8 :
        StateKey.FunctionKey = keyF12 ;
        return 0 ;
      case 0x1a :
      case 0x9a :
        if( StateKey.ShiftDown ){
          return '{' ;
        }
        else{
          return '[' ;
        }
      case 0x1b :
      case 0x9b:
        if( StateKey.ShiftDown ){
          return '}' ;
        }
        else{
          return ']' ;
        }
      case 0x27 :
      case 0xa7 :
        if( StateKey.ShiftDown ){
          return ':' ;
        }
        else{
          return ';' ;
        }
      case 0x28 :
      case 0xa8 :
        if( StateKey.ShiftDown ){
          return '"' ;
        }
        else{
          return '\'' ;
        }
      case 0x33 :
      case 0xb3 :
        if( StateKey.ShiftDown ){
          return '<' ;
        }
        else{
          return ',' ;
        }
      case 0x34 :
      case 0xb4 :
        if( StateKey.ShiftDown ){
          return '>' ;
        }
        else{
          return '.' ;
        }
      case 0x35 :
      case 0xb5 :
        if( StateKey.ShiftDown ){
          return '?' ;
        }
        else{
          return '/' ;
        }
    }
  }
  if( scan_code.KeyboardScanCodeLowChar >= 0x02 && scan_code.KeyboardScanCodeLowChar <= 0x0a ){
    // 数字键按下 
    return scan_code.KeyboardScanCodeLowChar + 0x2f ;
  }
  if( scan_code.KeyboardScanCodeLowChar >= 0x82 && scan_code.KeyboardScanCodeLowChar <= 0x8a ){
    // 数字键被弹起
    return scan_code.KeyboardScanCodeLowChar - 0x51 ;
  }
}

/* 关闭键盘中断 */
void class_pyos_Keyboard::CloseInterrupt()
{
  /* 屏蔽键盘中断,这里其实屏蔽了所有中断 */
  class_pyos_System::ToPort( 0x21 , 0xff ) ;
}
/* 打开键盘中断 */
void class_pyos_Keyboard::OpenInterrupt()
{
  /* 许可键盘中断 */
  class_pyos_System::ToPort( 0x21 , 0xfd ) ;
}
/* 初始化键盘类 */
void class_pyos_Keyboard::Init()
{
  /* 初始化状态键 */
  StateKey.Down = false ;
  StateKey.AltDown = false ;
  StateKey.CtrlDown = false ;
  StateKey.ShiftDown = false ;
  /* 安装键盘中断,中断号为 0x21 */
  class_pyos_Interrupt::InstallInterrupt( 0x21 , ( void * )pyos_asm_interrupt_handle_for_keyboard ) ;
  /* 这里不许可键盘中断,因为有可能在许可键盘中断前主调用程序会准备一些其它资源,因此当主调用程序把资料
  ** 准备好之后,自行调用 OpenInterrupt 函数许可中断
  */
}

/* 键盘中断处理函数 */
extern "C" void pyos_interrupt_handle_for_keyboard()
{
  class_pyos_Keyboard::HandleInterrupt() ;
}

⌨️ 快捷键说明

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