没有合适的资源?快使用搜索试试~ 我知道了~
赛车动画程序的汇编实现.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 153 浏览量
2021-12-16
11:44:48
上传
评论
收藏 446KB PDF 举报
温馨提示
试读
47页
赛车动画程序的汇编实现.pdf
资源详情
资源评论
资源推荐
1
1 方案的选择与确定
1.1 轨道显示方案的确定
显示图像的方法有很多种,由所要显示图像的特点和要求,可以调用不同的
DOS功能,也可以选择直接填写数据到图形缓冲区。本次设计的轨道都是由直线构
成,出于简化显示程序,方便触轨程序段的引用,调用 BIOS 中断 INT 10H 在显示
器的模式为 13H, 320 ×200,256 色的环境下用该中断的 0CH号功能写图形象素。
向对应的寄存器里存入起始点坐标和颜色值后调用函数就可画出相应的点,再将
该点坐标与目标点,即该线另一端坐标值比较,判断画线方向后用 INC 或 DEC循
环改变坐标值,即可画出一条直线。将上述画直线过程记为画线程序段,每画完
一条线后改变坐标值再进行调用,即可完成 9 字形轨道的显示。
1.2 小车显示方案的确定
显然,根据设计要求小车图像 是要能整体移动 的,所以小车的显示 最好能是
一个图像模块,或者一个图像的数 据模块。这样显示小车的时候伴随指针和偏移
就可实现小车的移动显示,用填写显示缓冲区的办法正好可以满足这一要求。
显示缓冲区是用来记录屏幕显示信息的。首先规定好显示缓冲区的首地址,
即小车相对坐标的基址。由于图形缓冲区是顺序存储方式,定义好首地址后即可
根据每行格数× Y+X 算得坐标为 (X,Y) 的点的相对地址,改变坐标值 ( 如 X+1)即可
改变填色位置 ( 指向下一个等待填入颜色的空位 ) 。事 先在数据段定义一块 矩阵空
间顺序存储小车的颜色信息,并用指针指向 数据块的首地址。将第一个点的颜色
赋给小车起始坐标所对应的地址后,同时将坐标值和指针循环后移 ( 当数据矩阵换
行时,用上述算法将相对地址相应换行即可 ) ,就能在相对坐标为 (X,Y) 的点处显
示显示数据矩阵所定义的小车模样。
这种显示方案除了可 以改变相对坐标简便地让小车移动外,较其他显示方案
还排除了与显示轨道时所用 320×200 ,25 色显示模式相冲突的问题,改写小车的
形状和颜色比较方便,且显示图像所需反应时间短,比较适合用于图像移动。
2
1.3 自动计时及其显示方案的确定
由于题目要求具备“赛车”的计时功能,所以计时以精确到毫秒为宜。同样,
在屏幕上显示不断变化的时间也有很多种方法, 较多的是采用中断程序。我们可
以采用 DOS中断循环更改屏幕上的时间,也可以利用 BIOS 提供的 INT 15H 的 86H
号功能来实现计时,还可以利用系统中断 INT 1CH,执行中断服务子程序完成计时
和显示功能。考虑到程序在执行计时程序的同时还要执行小车前进、擦除等程序,
所以排除了会独占或依赖 CPU的中断方案,采用系统中断 INT 1CH。这样,动态显
示时间的任务可以由中断服务子程序执行,同时 CPU 可以执行其他程序段,完成
并行功能。
调入系统中断 INT 1CH 后,系统每隔 1/18.2s 执行一次(即每秒钟执行 18.2
次)中断 INT 1CH,因此可以自编程序做为 INT 1CH 的中断服务程序,在子程序中
进行计数和显示。
由于是赛车计时功能,所以在赛车离开起点至到达终点前的过程中,计时是
不受小车状态影响的,即当小车撞了轨道或者暂停时,计时和显示是要继续的。
这样赛车的计时功能就需要 有判别小车状态的能力:如果是 开始键,计时清零并
开始计时;如果是停车或继续键,计时继续。 而状态的判断一般可以用设置标志
变量的方法,即在按键之后设置相应的标志变量值,指示计时程序的执行。
对于计时在屏幕上的显示,同样是在中断服务子程序里执行。通过加入计数
变量和比较计算, 得到满足分秒进制的计时结果并存入相应的寄存器。 调用 INT 21H
中断的 02H 功能以字符形式显示计时结果。
1.4 小车移动方案的确定
小车的移动主要是指小车图像快在屏幕上连续显示的过程。正如小车显示方
案里提到的,只要循环改变小车的相对坐标 X 或 Y 即可实现位置的移动。但问题
是小车的显示是通过填写图像缓冲区显示的,写过的图像信息如果没有被改变就
会继续被保存在图形缓冲区里。这样小车走过后会在其后留下“足迹” ,很不符合
要求的效果。对此,我们可以引入擦除程序,即小车在下一处显示后就将上一次
的图像“擦掉” 。擦除程序的原理和显示小车的原理是相同的,只是将 0 依次赋值
到相应的位置上,即可清空图形缓冲区里小车显示时的数据,也可以理解为使用
3
黑色(黑色的像素值为 0)“擦除”遗留的“足迹” ,在图形上显示为小车在前进。
对于小车运动的方向,由于 程序设计手动和自动两部分,所以可以统一定义
四个方向标志变量,指 示小车下一步的运动方向。按键判断、触轨判断及终点判
断等的结果直接改变标志变量的值。这样可以大大简化程序,使复杂的状态判断
和控制变得简单明了。 而小车改变方向的操作同样只要加减行列坐标 (X 或 Y) 即可。
1.4.1 小车自动运行方案
让小车在弯道处自动拐弯 是自动运行的关键问题。 由于轨道和小车的显示都
是在 BIOS 中断 INT 10H 的 13H 模式下,即 320× 200, 256 色的模式下完成的,所
以轨道和小车拥有相同的 首地址,也就是可以使用同样的相对坐标,这样就 让上
述问题变得相当容易 。只要在已显示的轨道里选定具有参考性的行 坐标或者列坐
标与小车的行列坐标 X 或 Y 进行比较,判断监测小车是否到弯道即可。如此,只
要在小车横向走动时比较 X 与选定点的横坐标、纵向走动时比较 Y 与选定点的纵
坐标,结果改变方向标志即可 实现小车的自动拐弯。判断是否到达终点时,将小
车坐标与终点坐标比较,结果改写到达标志变量并跳出自动程序模块,小车便会
停在终点等待程序的继续执行。
1.4.2 小车手动运行方案
手动运行主要是方向键输入的即时响应和触轨判断及处理两方面的问题。
对于方向键计时响应可以有两种办法实现:一是引用中断程序,在有按键输
入时中断当前执行转而执行按键 的响应;二是让小车每走一步之前先判断有无键
盘输入。显然,中断的引入会让程序相当复杂,另外,中断执行之后,小车还会
继续运行之前未完成的响应,这会引起程序混乱和 CPU 的超载。所以,我们选用
第二种方案,即在程序中加入键盘扫描模块,让小车每走一步之前 先扫描是否有
键盘输入:如果有,则按新的方向标志运行程序;如果没有,则按原来的方向标
志移动。这样可以大大提高程序的可靠性,方向标志变量的运用也让程序不是很
复杂。
触轨的判断主要还是相对坐标的判断,只是与自动运行里的过弯判断相比要
复杂得多。但是触轨判断及处理不但切合实际和设 计要求,还可以避免上述的“擦
4
除”程序将小车“碰到”的轨道“擦除” 。同样,判断小车是否触轨大致有两个方
向:由小车所在的位置比较可能可能碰到的两根轨道的坐标;依次将小车坐标与
轨道上的每一条线的坐标进行比较,判断小车是否触轨。表面上第一种方案简单
一些,事实上由小车的位置取比较线是不可取的,因为任意位置上的小车都可能
碰到它上下左右四个方向的直线,而画轨道所用的线一共才 10 条。其次,如果种
状态都比较四条直线,总体而言有的比较是重复了的。所以选择依次比较每一条
直线比较合理。分别将直线的坐标信息置入寄存器,转到压线判断模 块,通过比
较运算判断小车图 块是否有点在直线上 ,有则触轨,触轨标志改为一 ;没有则跳
出触轨判断模块,转而执行下一步的移动程序。终点判断同理。
综上可见,无论是小车自动运行还是手动控制,各种标志变量的运用起到了
核心作用。
5
2 相关理论的介绍
2.1 关于 INT 1CH 中断
在系统初始化时,已将 8253/8254 计数器 0 设置为方式 3,计数值为 0000H
(相当于 65536 ),所以计数器 0 的输出频率为 1.19318MHz/65536=18,2Hz 的方波。
计数器 0 的输出又接至 8259A 的 IR0 上,因此系统每秒钟产生 18.2 次类型为 8 的
中断(称为时钟中断) 。系统就是通过该中断修改其时间计数值,以维持其日历时
钟。该中断在通常情况下是不能修改的,否则将影响日历时钟的运行。
为了使用户能够使用时钟中断,系统中还设置了另外 一个中断 INT 1CH ,该
中断被 INT 8 中断(即 8253/8254 计数器 0 的中断)服务调用,因此它与 INT 8
保持同步,每秒钟执行 18.2 次,并且在使用 INT 1CH 时,在中断服务程序结束时
不需要向 8259A 输出 EOI 命令,因为这项任务在 INT 8 中已经被执行。通常情况
下,系统中 INT 1CH 中断服务程序只有一条指令 IRET,即什么也没做。因此,可
以修改 INT 1CH 的中断服务程序的入口地址指向自编的程序来完成所需要的工作。
编 写 一 个 中 断 服 务 程 序 取 代 原 INT 1CH 的 服 务 程 序 , 该 程 序 可 被 每 隔 大 约
1/18.2s 启动执行一次。在服务程序中需要对中断次数计数,计数达到 18 次,即
时间过去大约 1s ,再加入相应的比较和进位运算即可实现计时。
2.2 关于 BIOS 键盘中断
键盘和主机通过 5 芯电缆相连,分别是电源线、地线、复位线以及键盘数据
线和键盘时钟线。 PC机系列的键盘触点电路按 16 行× 8 列的矩阵来排列,用单片
机 Intel8048 来控制对键盘的扫描。按键的识别采用行列扫描法,即根据对行线
和列线的扫描结果来确定闭合键的位置,这个位置值称为按键的扫描码,通过数
据线将 8 位扫描码送往主机。当在键盘上“按下”或“放开”一个键时,如果键
盘中断是允许的( 21H 端口的第一位等于 0),就会产生一个类型 9 的中断,并转
入到 BIOS 的键盘中断处理程序。该处理程序从 8255 可编程外围接口芯片的输入
端口读取一个字节,这个字节的低 7 位是按键的扫描码。最高位为 0 或者为 1,分
别表示键是“按下 ”状态还是“放开”状态。按下时, 取得的字节称为通码,放
开时取得的字节称为断码。如 ESC 键按下取得的通码为 01H( 00000001B ),放开
剩余46页未读,继续阅读
LRH122
- 粉丝: 0
- 资源: 4万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0