30天自制操作系统第八天学习笔记(u盘软盘双启动版本)
暑假学习小日本的那本书:30天自制操作系统
qq交流群:122358078 ,更多学习中的问题、资料,群里分享
environment:开发环境:ubuntu
第八天的学习思考:
关于鼠标是怎么移动怎来的 思考过程。
现在忘掉作者的代码思路,如果是我们自己写代码,鼠标指针应该怎么样才能动起来呢?
我的思路:
其实让鼠标指针动起来真的非常简单,只需要改变下面函数中的mx,my变量,也就是鼠标的position变量,鼠标指针就会移动了。但是在移动前一定要把原来鼠标指针出现的位置填充为背景
色,这样就不出现鼠标移动的轨迹了。
display_mouse(bootp->vram,bootp->xsize,16,16,mx,my,mousepic,16);
这个函数就可以把鼠标原来出现过的地方填充为背景色,白色。
boxfill(white,mx,my,mx+15,my+15);
我们可以写这样的函数:
for(i=0;i++;i<8)
{
display_mouse(bootp->vram,bootp->xsize,16,16,mx,my,mousepic,16);
sleep(1);/sleep 1 second
boxfill(white,mx,my,mx+15,my+15);
mx=mx+15;
}
//上面的函数就会使 鼠标的函数指针每过1s,就在x方向移动15个像素点
所以移动鼠标的基本思想就是 1:用背景色把原来鼠标出现过的位置填充掉
2:改变mx,my(就是表示鼠标位置的变量),然后用display_mouse(bootp->vram,bootp->xsize,16,16,mx,my,mousepic,16);函数重新显示鼠标指针
但是现在有个难点就是我们手上的硬件左移时,怎么得到左移这个变量,然后把这个变量反应到mx变化上面。
当我们手上的鼠标移动时,会产生中断,然后我们从中断服务程序中得到鼠标硬件产生的数据,鼠标比较特别,需要从三个中断服务程序中得三个有效的数据,才能正确的反应出鼠标当前的位置信息。
当我们用某种方法得到三个字节的鼠标信息后(保存在buffer[0],buffer[1],buffer[2]),只要对这三个字节的内容进行正确的解读,就能得到鼠标是否有左右键按下,是向哪个方向移动了。
对于buffer[0] 低4位主要反应按键 按下情况:0:no key press 1:left key press 2:right key press
3:both left right key press 4:middle key press
高4位中低2位与x,y的移动方向有关,当bit4为1时,表示鼠标向-x方向移动,当bit5为1时表示鼠标向-y方向移动
对于buffer[1]就是包含了在x方向上移动的增量,移动的快,这个增量就大,移动慢,这个增量就小.一定注意这是一个增量。例如:当buffer[1]=4时,表示在x方向移动的速度增量只有4,再结合buffer[0]的bit4位,就可以知道是向x正方向移动(bit4=0),还是x负方向移动(bit4=1)
对于buffer[2]就是包含了在y方向上移动的增量,移动的快,这个增量就大,移动慢,这个增量就小.一定注意这是一个增量。
所以只需要把有方向量的buffer[1]增量,加在mx上;mx=mx+buffer[1](mx=mx+dx),就可以根据硬件上鼠标的移动,来反应到屏幕上鼠标指针位置的改变。
这样就把从三个中断服务程序中,硬件鼠标得到三个字节的数据buffer[0],buffer[1],buffer[2] 与 屏幕上鼠标指针位置mx,my联系起来,每次根据新的mx,my重绘鼠标指针之前,需要把原来鼠标出现的位置填充为背景色,以免出现鼠标运行的轨迹。
整个思路有了,就是程序上如何实现了。
mouse_decode(struct MOUSE_DEC *mdec,unsigned char data)这个函数就是从得到三个字节数据中解读出dx,dy 还有button的情况。
下面的几个if判断完全是为了防止鼠标指针跑出了屏幕的边界。
if(mx<0)
{
mx=0;
}
if(my<0)
{
my=0;
}
if(mx>bootp->xsize-16)
{
mx=bootp->xsize-16;
}
if(my>bootp->ysize-16)
{
my=bootp->ysize-16;
}
//其它的部分也就顺理成章了。
代码下载页面:http://download.csdn.net/detail/h397916230/5996057
从u盘启动后移动鼠标指针图片:
30天自制操作系统第八天学习笔记(u盘软盘双启动版本)的更多相关文章
- 30天自制操作系统第九天学习笔记(u盘软盘双启动版本)
暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078 ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第九天的课程已学完,确实有点不想写 ...
- 《30天自制操作系统》19_day_学习笔记
harib16a: 这一部分,我们在系统中实现读取文件内容的命令type.在windows中,输入“type 文件名”,在Linux中,输入“cat 文件名”都可以显示文件的内容.我们先来看看如何读取 ...
- 《30天自制操作系统》12_day_学习笔记
harib09a: 定时器:(Timer)每隔一段时间,会向CPU发送一个中断.这样CPU不用记住每一条指令的执行时间.没有定时器很多指令CPU都很难执行.例如HLT指令,这个指令的执行时间不是个固定 ...
- 《30天自制操作系统》09_day_学习笔记
harib06a: 在昨天的最后一部分,我们已经变成了32位的模式,目的就是希望能够使用电脑的全部内存. 虽然鼠标的显示处理有一些叠加问题,不过笔者为了不让我们感到腻烦,先带我们折腾一下内存 这里笔者 ...
- 《30天自制操作系统》05_day_学习笔记
//bootpack.c 完整代码 #include <stdio.h> void io_hlt(void); void io_cli(void); void io_out8(int po ...
- 《30天自制操作系统》03_day_学习笔记
harib00a: 添加的部分从P46开始,制作IPL准备开始从磁盘装载程序了 笔者讲解了软盘的驱动的构造,以及汇编语言读取软盘的方法 MOV AX,0x0820 MOV ES,AX ; 柱面0 ; ...
- 《30天自制操作系统》17_day_学习笔记
harib14a: 接着上一天的内容,我们来思考一个问题:当所有的LEVEL中都没有任务的时候怎么办?采用前面定时器链表中加入“哨兵”的思路,我们加入一个idle任务,去执行HLT.接下来我们只需要将 ...
- 《30天自制操作系统》18_day_学习笔记
harib15a: 到这里为止,我们已经能实现窗口的切换了.我们发现所有的窗口都有光标闪烁,而我们只希望可以接受输入的窗口有光标闪烁.这里我们先来修改任务A中的光标闪烁,当按下TAB时,如果让A不现实 ...
- 《30天自制操作系统》16_day_学习笔记
harib13a: 今天我们要继续折腾多任务,任务的高效管理是操作系统的一个重要的任务.在今天,我们将为系统创建更加完善的任务管理系统,其中包括优先级,任务等级等. 1.任务管理结构体 #define ...
随机推荐
- hdu 5730 Shell Necklace fft+cdq分治
题目链接 dp[n] = sigma(a[i]*dp[n-i]), 给出a1.....an, 求dp[n]. n为1e5. 这个式子的形式显然是一个卷积, 所以可以用fft来优化一下, 但是这样也是会 ...
- verilog中阻塞复制,非阻塞复制,顺序块,并行块之间的关系
这几个概念是不一样的 顺序块:顺序块中的语句是按顺序执行的,每条语句中的延迟值是与其前一条语句执行的仿真时间有关. 并行块:并行块语句是并行执行的,它里面的每条语句中指定的延迟值都是相对于语句块开始执 ...
- 9.java.lang.ClassCastException
java.lang.ClassCastException 数据类型转换异常 当试图将对某个对象强制执行向下转型,但该对象又不可转换又不可转换为其子类的实例时将引发该异常,如下列代码. Object o ...
- linux关闭防火墙方法
在关闭防火墙之前需要查看防火墙的状态,可以使用service iptables status命令来查看,确定防火墙是否开启再来进行关闭操作. 如果想临时开启防火墙使用命令service iptable ...
- Exec sql/c
Exec sql/c 利用高级语言的过程性结构来弥补SQL语言实现复杂应用方面的不足. 嵌入SQL的高级语言称为主语言或宿主语言. 在混合编程中,SQL语句负责操作数据库,高级语言语句负责控制程序流程 ...
- [LeetCode][Python]Add Two Numbers
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/add-two ...
- Ubuntu14.04 Server Apache2+subversion环境搭建
自从工作后,发现之前的代码开发太随便啦,于是经过不到两年的工作积累,打算在自己开发软件的过程中好好管理自己的项目.于是打算搭建自己的项目服务器,去年搭建过一次,但是由于没有记录,现在需要再来一遍,好多 ...
- 1503171912-ny-一道水题
一道水题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描写叙述 今天LZQ在玩一种小游戏,可是这游戏数有一点点的大,他一个人玩的累.想多拉一些人进来帮帮他.你能写一个程序帮 ...
- server宕机监控、检測、报警程序(139绑定手机短信报警)monitor_down.sh
宕机监控报警程序 一. 需求来源 宕机对运维人员来说,最痛苦了.怎样检測一台server是否还在正常执行,假设该server宕机,怎样在第一时间监測到并通知一线运维人员进行维护,最大化降低损失. ...
- redis持久化与可用性
redis对于持久化有快照及aof日志文件两种形式. 快照db文件,长处是二进制,大小比aof日志文件小.但会丢失最后一次成功备份时间到down机时间的数据. aof相比而言文件大小就大了点,但相对快 ...