中南大学微机原理实验代码硬件部分.docx
《中南大学微机原理实验代码硬件部分.docx》由会员分享,可在线阅读,更多相关《中南大学微机原理实验代码硬件部分.docx(40页珍藏版)》请在冰豆网上搜索。
中南大学微机原理实验代码硬件部分
;Tio.asm
;基本I/O接口电路设计实验
;***************根据CHECK配置信息修改下列符号值*******************
IOY0EQU0C400H;片选IOY0对应的端口始地址
IOY1EQU0C400H;片选IOY1对应的端口始地址
;*****************************************************************
MYIO_AEQUIOY0+00H*4;基本输入输出单元A组端口地址
MYIO_BEQUIOY1+00H*4;基本输入输出单元B组端口地址
STACK1SEGMENTSTACK
DW256DUP(?
)
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE
START:
MOVDX,MYIO_A;读写基本I/O单元A组的端口
INAL,DX
OUTDX,AL
MOVDX,MYIO_B;读写基本I/O单元B组的端口
INAL,DX
OUTDX,AL
MOVAH,1;判断是否有按键按下
INT16H
JZSTART;无按键则跳回继续循环,有则退出
QUIT:
MOVAX,4C00H;返回到DOS
INT21H
CODEENDS
ENDSTART
;T138.asm
;地址译码电路设计实验
;***************根据CHECK配置信息修改下列符号值*******************
IOY0EQU0C400H;片选IOY0对应的端口始地址
;*****************************************************************
Y0EQUIOY0+00H;译码电路输出Y6对应的端口地址
Y1EQUIOY0+20H;译码电路输出Y7对应的端口地址
STACK1SEGMENTSTACK
DW256DUP(?
)
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE
START:
MOVDX,Y0;读写片选接Y6的端口
INAL,DX
OUTDX,AL
MOVDX,Y1;读写片选接Y7的端口
INAL,DX
OUTDX,AL
MOVAH,1;判断是否有按键按下
INT16H
JZSTART;无按键则跳回继续循环,有则退出
QUIT:
MOVAX,4C00H;返回到DOS
INT21H
CODEENDS
ENDSTART
;T8255-1.asm
;8255流水灯显示实验
;****************根据查看端口资源修改下列符号值*******************
IOY0EQU0C400H;片选IOY0对应的端口始地址
;*****************************************************************
MY8255_AEQUIOY0+00H*4;8255的A口地址
MY8255_BEQUIOY0+01H*4;8255的B口地址
MY8255_CEQUIOY0+02H*4;8255的C口地址
MY8255_MODEEQUIOY0+03H*4;8255的控制寄存器地址
STACK1SEGMENTSTACK
DW256DUP(?
)
STACK1ENDS
DATASEGMENT
LADB?
;定义数据变量
;LBDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,MY8255_MODE;定义8255工作方式
MOVAL,82H;工作方式0,A口为输出,B口为输入
OUTDX,AL
MOVDX,MY8255_A;写A口发出的起始数据
MOVAL,80H
OUTDX,AL
MOVLA,AL
PAN:
MOVDX,MY8255_B
INAL,DX
CMPAL,01H
JEZUO
CMPAL,02H
JEYOU
CMPAL,03H
JESHAN
CMPAL,04H
JEQUIT
JMPPAN
ZUO:
CALLDALLY
MOVAL,LA;将A口起始数据右移再写入A口
ROLAL,1
MOVLA,AL
MOVDX,MY8255_A
OUTDX,AL
MOVDX,MY8255_B
INAL,DX
CMPAL,01H
JEZUO
CMPAL,02H
JEYOU
CMPAL,03H
JESHAN
CMPAL,04H
JEQUIT
JMPPAN;无按键则跳回继续循环,有则退出
YOU:
CALLDALLY
MOVAL,LA;将A口起始数据右移再写入A口
RORAL,1
MOVLA,AL
MOVDX,MY8255_A
OUTDX,AL
MOVDX,MY8255_B
INAL,DX
CMPAL,01H
JEZUO
CMPAL,02H
JEYOU
CMPAL,03H
JESHAN
CMPAL,04H
JEQUIT
JMPPAN;无按键则跳回继续循环,有则退出
SHAN:
CALLDALLY
MOVAL,00H
MOVDX,MY8255_A
OUTDX,AL
CALLDALLY
MOVAL,0FFH
MOVDX,MY8255_A
OUTDX,AL
MOVDX,MY8255_B
INAL,DX
CMPAL,01H
JEZUO
CMPAL,02H
JEYOU
CMPAL,03H
JESHAN
CMPAL,04H
JEQUIT
JMPPAN;无按键则跳回继续循环,有则退出
QUIT:
MOVAX,4C00H;结束程序退出
INT21H
DALLYPROCNEAR;软件延时子程序
PUSHCX
PUSHAX
MOVCX,3FFH
D1:
MOVAX,0FFFFH
D2:
DECAX
JNZD2
LOOPD1
POPAX
POPCX
RET
DALLYENDP
CODEENDS
ENDSTART
;T8255-2.asm
;8255流水灯显示实验
;****************根据查看端口资源修改下列符号值*******************
IOY0EQU0C400H;片选IOY0对应的端口始地址
;*****************************************************************
MY8255_AEQUIOY0+00H*4;8255的A口地址
MY8255_BEQUIOY0+01H*4;8255的B口地址
MY8255_CEQUIOY0+02H*4;8255的C口地址
MY8255_MODEEQUIOY0+03H*4;8255的控制寄存器地址
STACK1SEGMENTSTACK
DW256DUP(?
)
STACK1ENDS
DATASEGMENT
LADB?
;定义数据变量
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,MY8255_MODE;定义8255工作方式
MOVAL,82H;工作方式0,A口为输出,B口为输入
OUTDX,AL
MOVDX,MY8255_A;写A口发出的起始数据
MOVAL,80H
OUTDX,AL
MOVLA,AL
PAN:
MOVAH,1;判断是否有按键按下
INT16H
CMPAL,31H
JEZUO
CMPAL,32H
JEYOU
CMPAL,33H
JESHAN
CMPAL,34H
JEQUIT
JMPPAN
ZUO:
CALLDALLY
MOVAL,LA;将A口起始数据右移再写入A口
ROLAL,1
MOVLA,AL
MOVDX,MY8255_A
OUTDX,AL
MOVAH,1;判断是否有按键按下
INT16H
CMPAL,31H
JEZUO
CMPAL,32H
JEYOU
CMPAL,33H
JESHAN
CMPAL,34H
JEQUIT
JMPZUO
YOU:
CALLDALLY
MOVAL,LA;将A口起始数据右移再写入A口
RORAL,1
MOVLA,AL
MOVDX,MY8255_A
OUTDX,AL
MOVAH,1;判断是否有按键按下
INT16H
CMPAL,31H
JEZUO
CMPAL,32H
JEYOU
CMPAL,33H
JESHAN
CMPAL,34H
JEQUIT
JMPYOU
SHAN:
CALLDALLY
MOVAL,00H
MOVDX,MY8255_A
OUTDX,AL
CALLDALLY
MOVAL,0FFH
MOVDX,MY8255_A
OUTDX,AL
MOVAH,1;判断是否有按键按下
INT16H
CMPAL,31H
JEZUO
CMPAL,32H
JEYOU
CMPAL,33H
JESHAN
CMPAL,34H
JEQUIT
JMPSHAN
QUIT:
MOVAX,4C00H;结束程序退出
INT21H
DALLYPROCNEAR;软件延时子程序
PUSHCX
PUSHAX
MOVCX,3FFH
D1:
MOVAX,0FFFFH
D2:
DECAX
JNZD2
LOOPD1
POPAX
POPCX
RET
DALLYENDP
CODEENDS
ENDSTART
;Sound.asm
;电子发声设计实验
;****************根据查看端口资源修改下列符号值*******************
IOY0EQU9C00H
;*****************************************************************
MY8254_COUNT0EQUIOY0+00H*4;8254计数器0端口地址
MY8254_COUNT1EQUIOY0+01H*4;8254计数器1端口地址
MY8254_COUNT2EQUIOY0+02H*4;8254计数器2端口地址
MY8254_MODEEQUIOY0+03H*4;8254控制寄存器端口地址
STACK1SEGMENTSTACK
DW256DUP(?
)
STACK1ENDS
DATASEGMENT
FREQ_LISTDW371,495,495,495,624,556,495,556,624;频率表
DW495,495,624,742,833,833,833,742,624
DW624,495,556,495,556,624,495,416,416,371
DW495,833,742,624,624,495,556,495,556,833
DW742,624,624,742,833,990,742,624,624,495
DW556,495,556,624,495,416,416,371,495,0
TIME_LISTDB4,6,2,4,4,6,2,4,4;时间表
DB6,2,4,4,12,1,3,6,2
DB4,4,6,2,4,4,6,2,4,4
DB12,4,6,2,4,4,6,2,4,4
DB6,2,4,4,12,4,6,2,4,4
DB6,2,4,4,6,2,4,4,12
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,MY8254_MODE;初始化8254工作方式
MOVAL,36H;定时器0、方式3
OUTDX,AL
BEGIN:
MOVSI,OFFSETFREQ_LIST;装入频率表起始地址
MOVDI,OFFSETTIME_LIST;装入时间表起始地址
PLAY:
MOVDX,0FH;输入时钟为1.0416667MHz,1.0416667M=0FE502H
MOVAX,0E502H
DIVWORDPTR[SI];取出频率值计算计数初值,0F4240H/输出频率
MOVDX,MY8254_COUNT0
OUTDX,AL;装入计数初值
MOVAL,AH
OUTDX,AL
MOVDL,[DI];取出演奏相对时间,调用延时子程序
CALLDALLY
ADDSI,2
INCDI
CMPWORDPTR[SI],0;判断是否到曲末?
JEBEGIN
MOVAH,1;判断是否有按键按下?
INT16H
JZPLAY
QUIT:
MOVDX,MY8254_MODE;退出时设置8254为方式2,OUT0置0
MOVAL,10H
OUTDX,AL
MOVAX,4C00H;结束程序退出
INT21H
DALLYPROC;延时子程序
D0:
MOVCX,200H
D1:
MOVAX,0FFFFH
D2:
DECAX
JNZD2
LOOPD1
DECDL
JNZD0
RET
DALLYENDP
CODEENDS
ENDSTART
;T8254-1.asm
;8254计数应用实验
;***************根据CHECK配置信息修改下列符号值*******************
INTR_IVADDEQU01CCH;INTR对应的中断矢量地址
INTR_OCW1EQU0A1H;INTR对应PC机内部8259的OCW1地址
INTR_OCW2EQU0A0H;INTR对应PC机内部8259的OCW2地址
INTR_IMEQU0F7H;INTR对应的中断屏蔽字
PCI_INTCSREQU9438H;PCI卡中断控制寄存器地址
IOY0EQU9C00H
;*****************************************************************
MY8254_COUNT0EQUIOY0+00H*4;8254计数器0端口地址
MY8254_COUNT1EQUIOY0+01H*4;8254计数器1端口地址
MY8254_COUNT2EQUIOY0+02H*4;8254计数器2端口地址
MY8254_MODEEQUIOY0+03H*4;8254控制寄存器端口地址
STACK1SEGMENTSTACK
DW256DUP(?
)
STACK1ENDS
DATASEGMENT
CS_BAKDW?
;保存INTR原中断处理程序入口段地址的变量
IP_BAKDW?
;保存INTR原中断处理程序入口偏移地址的变量
IM_BAKDB?
;保存INTR原中断屏蔽字的变量
STR1DB'COUNT:
$';显示的字符串
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
CLI
MOVDX,PCI_INTCSR
SUBDX,19H
INAL,DX
MOVDX,PCI_INTCSR;初始化PCI卡中断控制寄存器
MOVAX,1F00H;向PCI_INTCSR中写入003F1F00H
OUTDX,AX
ADDDX,2
MOVAX,003FH
OUTDX,AX
MOVAX,0000H;替换INTR的中断矢量
MOVES,AX
MOVDI,INTR_IVADD
MOVAX,ES:
[DI]
MOVIP_BAK,AX;保存INTR原中断处理程序入口偏移地址
MOVAX,OFFSETMYISR
MOVES:
[DI],AX;设置当前中断处理程序入口偏移地址
ADDDI,2
MOVAX,ES:
[DI]
MOVCS_BAK,AX;保存INTR原中断处理程序入口段地址
MOVAX,SEGMYISR
MOVES:
[DI],AX;设置当前中断处理程序入口段地址
MOVDX,INTR_OCW1;设置中断屏蔽寄存器,打开INTR的屏蔽位
INAL,DX
MOVIM_BAK,AL;保存INTR原中断屏蔽字
ANDAL,INTR_IM
OUTDX,AL
STI
MOVDX,OFFSETSTR1;显示字符串
MOVAH,9
INT21H
MOVDX,MY8254_MODE;初始化8254工作方式
MOVAL,10H;计数器0,方式0
OUTDX,AL
MOVDX,MY8254_COUNT0;装入计数初值
MOVAL,4
OUTDX,AL
WAIT1:
MOVAH,1;判断是否有按键按下
INT16H
JZWAIT1;无按键则跳回继续等待,有则退出
QUIT:
CLI
MOVDX,PCI_INTCSR;恢复PCI卡中断控制寄存器
MOVAX,0000H
OUTDX,AX
MOVAX,0000H;恢复INTR原中断矢量
MOVES,AX
MOVDI,INTR_IVADD
MOVAX,IP_BAK;恢复INTR原中断处理程序入口偏移地址
MOVES:
[DI],AX
ADDDI,2
MOVAX,CS_BAK;恢复INTR原中断处理程序入口段地址
MOVES:
[DI],AX
MOVDX,INTR_OCW1;恢复INTR原中断屏蔽寄存器的屏蔽字
MOVAL,IM_BAK
OUTDX,AL
STI
MOVAX,4C00H;返回到DOS
INT21H
MYISRPROCNEAR;中断处理程序MYISR
MOVAL,35H
MOVAH,0EH
INT10H
MOVAL,20H
INT10H
MOVDX,MY8254_COUNT0;重装计数初值
MOVAL,4
OUTDX,AL
OVER:
MOVDX,PCI_INTCSR;清PCI卡中断控制寄存器标志位
SUBDX,19H
INAL,DX
MOVDX,PCI_INTCSR
ADDDX,2
MOVAX,003FH
OUTDX,AX
MOVDX,INTR_OCW2;向PC机内部8259发送中断结束命令
MOVAL,20H
OUTDX,AL
MOVAL,20H
OUT20H,AL
IRET
MYISRENDP
CODEENDS
ENDSTART
;T8254-2.asm
;8254定时应用实验
;***************根据CHECK配置信息修改下列符号值*******************
INTR_IVADDEQU01CCH;INTR对应的中断矢量地址
INTR_OCW1EQU0A1H;INTR对应PC机内部8259的OCW1地址
INTR_OCW2EQU0A0H;INTR对应PC机内部8259的OCW2地址
INTR_IMEQU0F7H;INTR对应的中断屏蔽字
PCI_INTCSREQU9438H;PCI卡中断控制寄存器地址
IOY0EQU9C00H
;*****************************************************************
MY8254_COUNT0EQUIOY0+00H*4;8254计数器0端口地址
MY8254_COUNT1EQUIOY0+01H*4;8254计数器1端口地址
MY8254_COUNT2EQUIOY0+02H*4;8254计数器2端口地址
MY8254_MODEEQUIOY0+03H*4;8254控制寄存器端口地址
STACK1SEGMENTSTACK
DW256DUP(?
)
STACK1ENDS
DATASEGMENT
CS_BAKDW?
;保存INTR原中断处理程序入口段地址的变量
IP_BAKDW?
;保存INTR原中断处理程序入口偏移地址的变量
IM_BAKDB?
;保存INTR原中断屏蔽字的变量
SECDW0;秒计时变量
COUNTDB0
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
CLI
MOVDX,PCI_INTCSR
SUBDX,19H
INAL,DX
MOVDX,PCI_INTCSR;初始化PCI卡中断控制寄存器
MOVAX,1F00H;向PCI_INTCSR中写入003F1F00H
OUTDX,AX
ADDDX,2
MOVAX,003FH
OUTDX,AX
MOVAX,0000H;替换INTR的中断矢量
MOVES,AX
MOVDI,INTR_IVADD
MOVAX,ES:
[DI]
MOVIP_BAK,AX;保存INTR原中断处