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源码阅读笔记(一)

    今天开始阅读yii2的源码,想深入了解一下yii框架的工作原理,同时学习一下优秀的编码规范和风格.在此记录一下阅读中的小心得. 每个框架都有一个入口文件,首先从入口文件开始,yii2的入口文件位于we ...

  2. C#winform中ListView的使用

    使用ListView模仿Windows系统的资源管理器界面,实现文件(夹)的浏览.重命名.删除及查询等功能,主要功能界面展示如下: 1.MainForm.cs及MainForm.Designer.cs ...

  3. javaee基本环境搭建

    安装包 安装jdk :D:\Program Files\Java\jdk1.7.0_17 下载tomcat:E:\apache-tomcat-6.0.36 下载maven:E:\apache-mave ...

  4. Bluetooth Low Energy介绍

    目录 1. 介绍 2. 协议栈 3. 实现方案 3.1 硬件实现方案 3.2 软件实现方案 1. 介绍 Bluetooth low energy,也称BLE(低功耗蓝牙),在4.0规范中提出 BLE分 ...

  5. LMAO?

    70 weeks to finish TC problems? 2015.4.16 week1 week1~week8:Graph 1.DFS,BFS,Topological sort,Strongl ...

  6. Java冒泡排序,Java对象冒泡排序

    今天呆公司特别无聊,百度了一下Java机试题,看到一个冒泡排序. 粘上我全部的代码: 实体类: package accp.com.internet;/** * 人物类 * @author xuxiao ...

  7. Android笔记:java 中的枚举

    部分数据使用枚举比较方便,java中的enmu不如c#中使用方便 记录备忘 以c#中的代码为例 public enum PlayState { /// <summary> /// 关闭 / ...

  8. Android开发笔记-加载xml资源

    1.Activity获取strings.xml中键的值 需要通过 getResources().getString(R.string.*)方法获得 以“state”为例 String value= g ...

  9. Chip Factory---hdu5536(异或值最大,01字典树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5536 题意:有一个数组a[], 包含n个数,从n个数中找到三个数使得 (a[i]+a[j])⊕a[k] ...

  10. JS位操作符

    1.按位与 AND & var result = 25 & 3; alert(result); //1var result2 = 25 & -3;alert(result2); ...