论文部分内容阅读
摘要:本设计将汇编中最重要的三大芯片——8059(中断)、8053(定时/计数)、8055(并行接口)融合起来,同时涉及汇编中较为复杂的文件操作以及键盘接口电路,并将汇编的软硬件设计结合,为广大汇编初学者熟悉汇编编程和汇编语言的教学提供了一定的参考价值。
关键词:8253;8259A;8255;汇编语言;音乐
中图分类号:TP311.52文献标识码:A文章编号:1007-9599 (2011) 06-0000-02
Music Player Design and Implementation Based on Assembly Language
Wang Shuai
(Southwest University of Science and Technology,School of Information Engineering,MianYang621010,China)
Abstract:This design combines the most important three chips-8059 (interrupted),8053 (timer/counter),8055 (parallel interface) together,
and involves file operation and keyboard interface circuit which are very complicated,also combine the software and hardware design in assembly,thus it has a certain reference value to assembly language teaching and programming among the wide beginners.
Keywords:8253;8259A;8255;Assembly language;Music
汇编以其精简、高效和libc无关性的特点在当今程序设计语言中仍然占据重要位置,如果想学好计算机编程技能,想做一名合格的编程人员,想在计算机编程之路走的更远,学习者只有也必须从汇编语言开始,才能完整、完善的建立计算机编程知识体系!本设计的效果是:将存储于磁盘上的音乐数据通过计算机的扬声器播放出来并键盘实现对歌曲的选择以及开始播放、暂停播放、快进、快退等功能。
一、硬件设计
二、软件设计
(一)音乐数据在磁盘上如何存储
由于本程序采用DOS功能调用,因此原始数据的存储格式要严格服从程序整体算法的设计:所有数据存放于文本文档中;前半部分存放延时时间信息,后半部分存放频率信息,二者以“;”号隔开;各部分内部以“,”号隔开;结尾用“.”标识。例如
“6,5,6,8,……,10,18,;262,294,330,262,……,196,262,.”
不难看出,本设计将“,”作为最小信息单位的标志,即两个“,”之间的一定是一个信息,所以千万不要漏掉“;”和“.”前面的“,”,否则程序无法辨认末尾数据!
(二)装载数据到内存
本过程分为三步,即打开文件,读文件中的数据至DTA(数据缓冲区)和关闭文件,分别使用DOS中的3DH、3FH和3EH功能实现。打开文件后开始从头读取数据,读到“.”号时关闭文件。
(三)如何还原数据
从文件读入内存的是用ASCII码表示的字符,比如“262,”读入内存将变成“32H36H32H2CH”,因此,还原数据就成了本程序最大的难点。本设计提供的思路是利用一个计数变量记录信息的位数n,若信息从高位开始的数值为a1、a2、a3……,则信息值应为a1× +a2× +a3× ……,但千万不要漏掉计算前要对数据做“减30H”的处理。
(四)声音音调的变化
该部分是本程序的核心,本程序是利用8253工作于方式3输出不同频率的方波来实现声音频率的变化的.首先要保护现场,然后读取频率和延时时长信息,接着初始化8253并设置计数初值,同时初始化8255打开扬声器和GATE门,最后调用延时子程序。其中8253计数初值的计算是一个要重点解决的问题。假设8253的CLK端输入时钟脉冲信号为 ,OUT端输出的信号频率为 ,则8253的计数初值为:N= / ,而 =1.19318MHZ,故被除数应该为1234DCH。注意这里可能会有可能产生溢出错误,原因是被除数与除数相差过于悬殊。
(五)如何实现对键盘的检测
为了训练汇编初学者对8259A的熟练度,本程序提供了利用8059A实现对键盘操作的检测方案。硬件连接图如图一所示。该部分程序伊始首先关中断,然后保存原09H中断向量,随即设置新09H中断向量,同时设置8059A的中断屏蔽字,允许IR1中断,接着开中断,主程其他工作处理,最后恢复原09H中断向量。而中断服务程序的流程是从60H端口读入扫描码,若有键按下则保存扫描码到KEYCODE单元,并开始检测按下的是哪个键,然后调用相应的子程序处理中断。
(六)如何实现精确延时
为了解决不同CPU因执行指令速度的不同而导致软件延时时间不可靠的问题,本程序提供了利用BIOS功能调用INT 1AH/00H来实现精确延时的方案。INT 1AH/00H提供了读取当前计时单位的方法,其中计时单位(54.945ms)的计数在DL中。首先取当前计数单位于DX中,然后预测T时间后的计数单位(DL+N),进入循环并不断取当前计数单位检测其是否等于预测值,若相等说明时间到。其中N=T×1000÷54.945个计时单位,定时时间T值由磁盘上的文本文件提供。
(七)暂停子程序
该部分程序要能够分清用户是第几次按空格键,如果是第一次表明是暂停播放,如果是第二次表明是恢复播放。本程序提供的解决方案是:第一次检测到空格键按下后,首先把KEYCODE清零,然后利用8255A的PB1口关闭扬声器,接着进入循环,循环中不断检测KEYCODE的值是不是等于39H(空格键),一旦检测到空格键(第二次),随即跳出循环,恢复打开扬声器。
(八)快进/快退子程序
解决思路就是移动相应的频率指针和时间指针,同时还要判断是不是快进过头或者后退过头了,一旦发现快进过头,则直接结束播放,一旦防线后退过头,则从头开始播放。
三、结束语
本程序的设计思路有很多新颖独特的地方,而且几乎融合了汇编的所有知识点和难点,综合性很强,对于汇编的初学者而言,不仅可以软硬件结合的全面学习汇编知识,还能训练自己的逻辑思维的能力,而当自己亲手创造的美妙音乐在耳边响起的时刻,或许是每一个汇编人最幸福快乐的时刻了。
参考文献:
[1]沈美明,温冬婵.IBM-PC汇编语言程序设计(第二版)[M].北京:清华大学出版社
[2]曲瑞超.学习汇编语言的重要性
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文
关键词:8253;8259A;8255;汇编语言;音乐
中图分类号:TP311.52文献标识码:A文章编号:1007-9599 (2011) 06-0000-02
Music Player Design and Implementation Based on Assembly Language
Wang Shuai
(Southwest University of Science and Technology,School of Information Engineering,MianYang621010,China)
Abstract:This design combines the most important three chips-8059 (interrupted),8053 (timer/counter),8055 (parallel interface) together,
and involves file operation and keyboard interface circuit which are very complicated,also combine the software and hardware design in assembly,thus it has a certain reference value to assembly language teaching and programming among the wide beginners.
Keywords:8253;8259A;8255;Assembly language;Music
汇编以其精简、高效和libc无关性的特点在当今程序设计语言中仍然占据重要位置,如果想学好计算机编程技能,想做一名合格的编程人员,想在计算机编程之路走的更远,学习者只有也必须从汇编语言开始,才能完整、完善的建立计算机编程知识体系!本设计的效果是:将存储于磁盘上的音乐数据通过计算机的扬声器播放出来并键盘实现对歌曲的选择以及开始播放、暂停播放、快进、快退等功能。
一、硬件设计
二、软件设计
(一)音乐数据在磁盘上如何存储
由于本程序采用DOS功能调用,因此原始数据的存储格式要严格服从程序整体算法的设计:所有数据存放于文本文档中;前半部分存放延时时间信息,后半部分存放频率信息,二者以“;”号隔开;各部分内部以“,”号隔开;结尾用“.”标识。例如
“6,5,6,8,……,10,18,;262,294,330,262,……,196,262,.”
不难看出,本设计将“,”作为最小信息单位的标志,即两个“,”之间的一定是一个信息,所以千万不要漏掉“;”和“.”前面的“,”,否则程序无法辨认末尾数据!
(二)装载数据到内存
本过程分为三步,即打开文件,读文件中的数据至DTA(数据缓冲区)和关闭文件,分别使用DOS中的3DH、3FH和3EH功能实现。打开文件后开始从头读取数据,读到“.”号时关闭文件。
(三)如何还原数据
从文件读入内存的是用ASCII码表示的字符,比如“262,”读入内存将变成“32H36H32H2CH”,因此,还原数据就成了本程序最大的难点。本设计提供的思路是利用一个计数变量记录信息的位数n,若信息从高位开始的数值为a1、a2、a3……,则信息值应为a1× +a2× +a3× ……,但千万不要漏掉计算前要对数据做“减30H”的处理。
(四)声音音调的变化
该部分是本程序的核心,本程序是利用8253工作于方式3输出不同频率的方波来实现声音频率的变化的.首先要保护现场,然后读取频率和延时时长信息,接着初始化8253并设置计数初值,同时初始化8255打开扬声器和GATE门,最后调用延时子程序。其中8253计数初值的计算是一个要重点解决的问题。假设8253的CLK端输入时钟脉冲信号为 ,OUT端输出的信号频率为 ,则8253的计数初值为:N= / ,而 =1.19318MHZ,故被除数应该为1234DCH。注意这里可能会有可能产生溢出错误,原因是被除数与除数相差过于悬殊。
(五)如何实现对键盘的检测
为了训练汇编初学者对8259A的熟练度,本程序提供了利用8059A实现对键盘操作的检测方案。硬件连接图如图一所示。该部分程序伊始首先关中断,然后保存原09H中断向量,随即设置新09H中断向量,同时设置8059A的中断屏蔽字,允许IR1中断,接着开中断,主程其他工作处理,最后恢复原09H中断向量。而中断服务程序的流程是从60H端口读入扫描码,若有键按下则保存扫描码到KEYCODE单元,并开始检测按下的是哪个键,然后调用相应的子程序处理中断。
(六)如何实现精确延时
为了解决不同CPU因执行指令速度的不同而导致软件延时时间不可靠的问题,本程序提供了利用BIOS功能调用INT 1AH/00H来实现精确延时的方案。INT 1AH/00H提供了读取当前计时单位的方法,其中计时单位(54.945ms)的计数在DL中。首先取当前计数单位于DX中,然后预测T时间后的计数单位(DL+N),进入循环并不断取当前计数单位检测其是否等于预测值,若相等说明时间到。其中N=T×1000÷54.945个计时单位,定时时间T值由磁盘上的文本文件提供。
(七)暂停子程序
该部分程序要能够分清用户是第几次按空格键,如果是第一次表明是暂停播放,如果是第二次表明是恢复播放。本程序提供的解决方案是:第一次检测到空格键按下后,首先把KEYCODE清零,然后利用8255A的PB1口关闭扬声器,接着进入循环,循环中不断检测KEYCODE的值是不是等于39H(空格键),一旦检测到空格键(第二次),随即跳出循环,恢复打开扬声器。
(八)快进/快退子程序
解决思路就是移动相应的频率指针和时间指针,同时还要判断是不是快进过头或者后退过头了,一旦发现快进过头,则直接结束播放,一旦防线后退过头,则从头开始播放。
三、结束语
本程序的设计思路有很多新颖独特的地方,而且几乎融合了汇编的所有知识点和难点,综合性很强,对于汇编的初学者而言,不仅可以软硬件结合的全面学习汇编知识,还能训练自己的逻辑思维的能力,而当自己亲手创造的美妙音乐在耳边响起的时刻,或许是每一个汇编人最幸福快乐的时刻了。
参考文献:
[1]沈美明,温冬婵.IBM-PC汇编语言程序设计(第二版)[M].北京:清华大学出版社
[2]曲瑞超.学习汇编语言的重要性
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文