【第7章】TTY【三】

     现在来处理一下滚动的情况,一个TTY的容量不止4000字节啊,要是超过了咋办捏?只能重新设置一下显示的起始位置了,把这个功能写成一个函数,添在console.c中:

Code:
  1. void Scroll_Screen(CONSOLE *p_con,int direction)   
  2. {   
  3.     if(direction == 0)   
  4.     {   
  5.         if(p_con->current_addr < p_con->start_addr + p_con->memory_size)   
  6.         {   
  7.             p_con->current_addr += 160; 
  8.             p_con->cursor += 160;    
  9.         }   
  10.     }   
  11.     else if(direction == 1)   
  12.     {   
  13.         if(p_con->current_addr > p_con->start_addr)   
  14.         {   
  15.             p_con->current_addr -= 160; 
  16.             p_con->cursor -= 160;    
  17.         }      
  18.     }   
  19.        
  20.     Set_Start_Addr(p_con->current_addr / 2);   
  21.     Set_Cursor(p_con->cursor / 2);   
  22. }  

     一次向上滚或向下滚一行,然后在In_Process函数中添加调用的语句:

Code:
  1. case DOWN:   
  2.     if((key_value & FLAG_SHIFT_L) || (key_value & FLAG_SHIFT_R))   
  3.     {   
  4.         Scroll_Screen(p_tty->console,0);    
  5.     }   
  6.     break;   
  7. case UP:   
  8.     if((key_value & FLAG_SHIFT_L) || (key_value & FLAG_SHIFT_R))   
  9.     {   
  10.         Scroll_Screen(p_tty->console,1);    
  11.     }   
  12.     break;  

     make,运行,结果如图所示,分别为下滚和上滚的情形:

     这篇也太短了吧,那么再写点。

     我们还没实现Enter键和BackSpace键的功能,下面来模拟它们各自的功能。

     由于按下这两个键的时候,得到的key值的第9位为1,就是不可打印的字符,所以在In_Process函数中要判断一下,如果按下的是这两个键,那么就往当前console的输出缓冲区中分别放入'/b','/n',这样在Out_Char函数中就可以做相应的处理。

     先修改In_Process函数,把key值丢进输出缓冲区的代码写成了一个static函数:

Code:
  1. void In_Process(TTY *p_tty,u32 key_value)   
  2. {   
  3.     if(!(key_value & FLAG_EXT))   
  4.     {   
  5.         Put_Key(p_tty,key_value);   
  6.     }   
  7.     else  
  8.     {   
  9.         int raw_key = key_value & 0x1ff;   
  10.         switch(raw_key)   
  11.         {   
  12.             case BACKSPACE:   
  13.                 Put_Key(p_tty,'/b');   
  14.                 break;   
  15.             case ENTER:   
  16.                 Put_Key(p_tty,'/n');   
  17.                 break;   
  18.             case DOWN:   
  19.                 if((key_value & FLAG_SHIFT_L) || (key_value & FLAG_SHIFT_R))   
  20.                 {   
  21.                     Scroll_Screen(p_tty->console,0);    
  22.                 }   
  23.                 break;   
  24.             case UP:   
  25.                 if((key_value & FLAG_SHIFT_L) || (key_value & FLAG_SHIFT_R))   
  26.                 {   
  27.                     Scroll_Screen(p_tty->console,1);    
  28.                 }   
  29.                 break;   
  30.             case F1:   
  31.             case F2:   
  32.             case F3:   
  33.                 if((key_value & FLAG_SHIFT_L) || (key_value & FLAG_SHIFT_R))   
  34.                 {   
  35.                     Set_Console(raw_key - F1);   
  36.                 }   
  37.                 break;   
  38.             default:   
  39.                 break;   
  40.         }   
  41.     }   
  42. }   
  43.   
  44. static void Put_Key(TTY *p_tty,u32 key_value)   
  45. {   
  46.     if(p_tty->count < 256)   
  47.     {   
  48.         Disable_Int();   
  49.         *p_tty->p_tty_tail = key_value;   
  50.         p_tty->p_tty_tail++;   
  51.         if(p_tty->p_tty_tail == p_tty->tty_buffer + 256)   
  52.         {   
  53.             p_tty->p_tty_tail = p_tty->tty_buffer;   
  54.         }   
  55.         p_tty->count++;   
  56.         Enable_Int();   
  57.     }   
  58. }  

     接下来修改Out_Char函数:

Code:
  1. void Out_Char(CONSOLE *p_con,char c_disp)   
  2. {   
  3.     u8 *p_disp_addr = (u8*)(0xb8000 + p_con->cursor);   
  4.        
  5.     switch(c_disp)   
  6.     {   
  7.         case '/b':   
  8.             if(p_con->cursor != p_con->start_addr)   
  9.             {   
  10.                 *(p_disp_addr - 1) = 0x7f;   
  11.                 *(p_disp_addr - 2) = ' ';   
  12.                 p_con->cursor -= 2;   
  13.             }   
  14.             break;   
  15.         case '/n':   
  16.             if((p_con->cursor / 160 + 1) != ((p_con->start_addr + p_con->memory_size) / 160))   
  17.             {   
  18.                 p_con->cursor = ((p_con->cursor / 160) + 1) * 160;   
  19.             }   
  20.             break;   
  21.         default:   
  22.             if(p_con->cursor < p_con->start_addr + p_con->memory_size - 1)   
  23.             {   
  24.                 *p_disp_addr++ = c_disp;   
  25.                 *p_disp_addr++ = 0xa;   
  26.                 p_con->cursor += 2;   
  27.             }   
  28.             break;   
  29.     }   
  30.        
  31.     Set_Cursor(p_con->cursor / 2);   
  32.     Set_Start_Addr(p_con->current_addr / 2);   
  33. }      

     逻辑很简单,但其中的if判断语句要特别注意,每个console都有自己的空间,这里的判断是为了防止越界。

     make,运行,利用Enter和BackSpace键把内存信息删掉了一些:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值