harib05a:
  鼠标解读(01)P145 前一天已经让鼠标成功接收数据了,这些数据是什么意思?
  笔者在这一部分来解读数据:让鼠标动起来啊,停在那不动有什么意思啊!
  前面已经知道,鼠标每一次动作都是3个字节数据,为什么是3个。想想也知道:两个坐标,一个状态

if (mouse_phase == ) {         /* 等待鼠标进入0xfa的状态。实际上就是等待控制器准备就绪 */
  if (i == 0xfa) {
  mouse_phase = ;
  }
} else if (mouse_phase == ) { /* 等待鼠标的第一个字节 */
  mouse_dbuf[] = i;
  mouse_phase = ;
} else if (mouse_phase == ) { /* 等待鼠标的第二个字节 */
  mouse_dbuf[] = i;
  mouse_phase = ;
} else if (mouse_phase == ) { /* 等待鼠标的第三个字节 */
  mouse_dbuf[] = i;
  mouse_phase = ;
                   /* 将这三个字节显示出来 */
  sprintf(s, "%02X %02X %02X", mouse_dbuf[], mouse_dbuf[], mouse_dbuf[]);
  boxfill8(binfo->vram, binfo->scrnx, COL8_008484, , , + * - , );
  putfonts8_asc(binfo->vram, binfo->scrnx, , , COL8_FFFFFF, s);
}

  看了上面的代码,细心的肯定会发现一个问题,鼠标每次动作产生3个字节数据:坐标X、Y、状态信息
  那么0xfa是什么东西?为什么有4个if的条件判断?不是3个字节的数据吗?
  ANS:我们回头看看鼠标中断程序;void enable_mouse(void)。(前一天的内容)发现没有,
      鼠标激活成功会返回一个ACK,这个ACK的值就是0xfa。他表示的意思就是:好的,我已经准备好了发送数据了。
harib05b:
  标题:稍事整理\\这部分没什么新的可讲的代码
  没错:笔者在这里就是对HzriMain做了一些整理;内容完全没有变化(不想看的也可以跳过这一部分)
    1、把解读鼠标所需要的变量整合到结构体MOUSE_DEC中了
    2、在鼠标中断处理程序enable_mouse(void)最后,把0xfa进行了处理,成功就绪返回1,这样便于鼠标数据接收和处理
  MOUSE_DEC{ unsigned char buf[3], phase };

harib05c:
  鼠标解读(02)这里结构体MOUSE_DEC发生了一些变化:

struct MOUSE_DEC { //x,y用来存放鼠标位置信息;btn存放状态信息。
  unsigned char buf[], phase;
  int x, y, btn;
};
int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat) {
  if (mdec->phase == ) {
  /* 等待鼠标的0xfa状态,接收到enable_mouse(void)的0xfa的ACK值,表示鼠标控制器以及就绪,可以传数据了。 */
  if (dat == 0xfa) {
  mdec->phase = ;
  }
  return ;
}
if (mdec->phase == ) {
  /* 等待鼠标的第一字节状态 */
  if ((dat & 0xc8) == 0x08) {
  /* 对第一个字节的范围进行判断(0-3) */
    mdec->buf[] = dat;
    mdec->phase = ;
  }
  return ;
}
if (mdec->phase == ) {
  /* 等待鼠标的第二个字节第二个字节的范围(8-F) */
  mdec->buf[] = dat;
  mdec->phase = ;
  return ;
}
if (mdec->phase == ) {
    /* 第三个字节,最关键的部分,鼠标键的状态放在buf[0]的低3位 */
  mdec->buf[] = dat;
  mdec->phase = ;
  mdec->btn = mdec->buf[] & 0x07; //buf[0]&0000 0111取出buf[0]的低3位,鼠标状态信息
  mdec->x = mdec->buf[]; //取出鼠标的坐标信息
  mdec->y = mdec->buf[];
if ((mdec->buf[] & 0x10) != ) {  mdec->x |= 0xffffff00; }
if ((mdec->buf[] & 0x20) != ) {  mdec->y |= 0xffffff00; }
  mdec->y = - mdec->y; /* y坐标的方向,鼠标和画面符号是相反的 */
  return ;
  }
  return -; //获取鼠标信息失败了
}

  接下来修改鼠标的显示部分:

//原理:用if语句将s的值置换成相应的字符串即可
if (mouse_decode(&mdec, i) != ) {
  sprintf(s, "[lcr %4d %4d]", mdec.x, mdec.y);
  if ((mdec.btn & 0x01) != ) { s[] = 'L';}
  if ((mdec.btn & 0x02) != ) { s[] = 'R';}
  if ((mdec.btn & 0x04) != ) { s[] = 'C';}
  boxfill8(binfo->vram, binfo->scrnx, COL8_008484, , , + * - , );
  putfonts8_asc(binfo->vram, binfo->scrnx, , , COL8_FFFFFF, s);
} //接下来输出字符串s就可以了:

harib05d:
  如何让鼠标在屏幕上动起来?
  上面我们已经搞定了鼠标移动时的坐标位置,我们其实已经把鼠标的图像给显示出来了;
  接下来:我们按照这个坐标值,不断的刷新鼠标的显示就行了
  原   理:每次鼠标中断读取的鼠标信息给鼠标图形显示函数putfonts8_asc()
      我们来看看笔者是怎么修改的:

if (mouse_decode(&mdec, i) != ) {  /* 显示鼠标数据的三个字节 */
sprintf(s, "[lcr %4d %4d]", mdec.x, mdec.y);
if ((mdec.btn & 0x01) != ) { s[] = 'L'; } //如果btn的最后一位为1
if ((mdec.btn & 0x02) != ) { s[] = 'R'; } //如果btn的倒数第三位为1  
if ((mdec.btn & 0x04) != ) { s[] = 'C'; } //如果btn的倒数第四位为1
boxfill8(binfo->vram, binfo->scrnx, COL8_008484, , , + * - , ); //显示界面下面的白条
putfonts8_asc(binfo->vram, binfo->scrnx, , , COL8_FFFFFF, s); //鼠标指针的移动
//这个东西是干嘛的啊??隐藏鼠标
//当鼠标坐标移到下面的白条的时候。如果上面叠加了鼠标的图像将会变得很乱,
//在这里,当鼠标位置移到下面的时候,将其位置放在白条的上方
//就像我们桌面上,鼠标指针移到最下方,始终在任务栏的上方(一个道理)
boxfill8(binfo->vram, binfo->scrnx, COL8_008484, mx, my, mx + , my + );
mx += mdec.x;
my += mdec.y;
if (mx < ) { mx = ; } //检测x坐标越界到最小
   if (my < ) { my = ; } //检测y坐标越界到最小
if (mx > binfo->scrnx - ) { mx = binfo->scrnx - ; } //检测x坐标越界到最大
if (my > binfo->scrny - ) { my = binfo->scrny - ; } //检测x坐标越界到最大
sprintf(s, "(%3d, %3d)", mx, my);                  //输出字符串
boxfill8(binfo->vram, binfo->scrnx, COL8_008484, , , , ); /* 隐藏坐标 */
putfonts8_asc(binfo->vram, binfo->scrnx, , , COL8_FFFFFF, s); /* 显示坐标 */
putblock8_8(binfo->vram, binfo->scrnx, , , mx, my, mcursor, ); /* 描画坐标 */
}

  还有一点明天再写吧!真心费时间。。。。。。。。。。。

《30天自制操作系统》08_day_学习笔记的更多相关文章

  1. 《30天自制操作系统》学习笔记--Mac下工具的使用

    现在来介绍官网上下的工具怎么用首先是官网地址,书上有个注释上有:hrb.osask.jp 翻译成中文大概是这个样子滴. 上面有两个文件可以下载,一个是工具,一个是工具的源代码,很好的学习资料 下面把工 ...

  2. 《30天自制操作系统》学习笔记--Mac环境搭建

    弄了三天了,终于弄好了,先说结果,就是作者在网站上放了os x的工具(hrb.osask.jp,也有linux下的工具,可以自己去下载),也就是说我白忙活了三天... 再说一下这几天都干啥了,主要是想 ...

  3. 《30天自制操作系统》学习笔记--番外篇之Mac环境下的工具介绍

    这几天又有点不务正业了,书也没看,一直在搞这个破环境,尝试各种做法,网上各种垃圾信息,浪费了很多时间,说的基本都是废话,不过还是找到了一些,赶紧写下来,不然这个过几天又忘了 首先是环境,我用的是Max ...

  4. 《30天自制操作系统》读书笔记(5) GDT&IDT

    梳理项目结构 项目做到现在, 前头的好多东西都忘了, 还是通过Makefile重新理解一下整个项目是如何编译的: 现在我们拥有这么9个文件: ipl10.nas    InitialProgramLo ...

  5. 《30天自制操作系统》读书笔记(3) 引入C语言

    这一次的学习相当曲折, 主要是因为粗心, Makefile里面的错误导致了文件生成出现各种奇奇怪怪的问题, 弄得心力交瘁, 因此制作过程还是尽量按着作者的路子来吧. 作者提供的源码的注释在中文系统下是 ...

  6. 《30天自制操作系统》读书笔记(2)hello, world

    让系统跑起来 要写一个操作系统,我们首先要有一个储存系统的介质,原版书似乎是06年出版的,可惜那时候没有电脑,没想到作者用的还是软盘,现在的电脑谁有软驱?不得已我使用一张128M的SD卡来代替,而事实 ...

  7. 30天自制操作系统第九天学习笔记(u盘软盘双启动版本)

    暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第九天的课程已学完,确实有点不想写 ...

  8. 从你的u盘启动:30天自制操作系统第四天u盘启动学习笔记

    暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 developing environment:ubuntu 关于u盘启动自己做的操 ...

  9. 30天自制操作系统第八天学习笔记(u盘软盘双启动版本)

    暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第八天的学习思考: 关于鼠标是怎么 ...

  10. 《30天自制操作系统》笔记(03)——使用Vmware

    <30天自制操作系统>笔记(03)——使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测 ...

随机推荐

  1. Yii源码阅读笔记(十四)

    Model类,集中整个应用的数据和业务逻辑——场景.属性和标签: /** * Returns a list of scenarios and the corresponding active attr ...

  2. mysql安装tcmalloc

    TCMalloc(Thread-Caching Malloc)是google-perftools工具中的一个,与标准的glibc库的malloc相比,TCMalloc在内存的分配上效率和速度要高得多, ...

  3. shell执行mysql操作

    http://ully.iteye.com/blog/1226494 http://www.jb51.net/article/55207.htm shell执行mysql操作 mysql  -hhos ...

  4. hiho48 : 欧拉路·一

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最后的宝藏.现在他们控制的 ...

  5. 【转】CodeIgniter定义自己的Helper和Helper的方法

    最近做程序,采用了PHP+CodeIgniter框架,总体来说这框架很轻而且上手也很快的. 首先,说下如何定义自己的Helper,个人理解helper其实就是定义函数方法. 如果要建个全新的自己的He ...

  6. java CyclicBarrier

    import java.io.IOException; import java.util.Random; import java.util.concurrent.BrokenBarrierExcept ...

  7. XCode中的单元测试:编写测试类和方法(内容意译自苹果官方文档)

    当你在工程中通过测试导航栏添加了一个测试target之后, xcode会在测试导航栏中显示该target所属的测试类和方法. 这一章演示了怎么创建测试类,以及如何编写测试方法. 测试targets, ...

  8. JavasScript判断输入框不为空

    <form name="form1" method="POST" action="add.php"> <table wid ...

  9. VLC说明

    一.简介 vlc的全名是Video Lan Client,是一个开源的.跨平台的视频播放器.VLC支持大量的音视频传输.封装和编码格式,完整的功能特性列表可以在这里获得http://www.video ...

  10. TCP协议中的三次握手和四次挥手

    转自: http://blog.csdn.net/whuslei/article/details/6667471/ 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: