📄 clock.asm
字号:
;***************根据CHECK配置信息修改下列符号值*******************
INTR_IVADD EQU 01C8H ;INTR对应的中断矢量地址
INTR_OCW1 EQU 0A1H ;INTR对应PC机内部8259的OCW1地址
INTR_OCW2 EQU 0A0H ;INTR对应PC机内部8259的OCW2地址
INTR_IM EQU 0FBH ;INTR对应的中断屏蔽字
PCI_INTCSR EQU 0C438H ;PCI卡中断控制寄存器地址
IOY0 EQU 0BC00H ;片选IOY0对应的端口始地址
IOY1 EQU 0BC40H
IOY2 EQU 0BC80H
;*****************************************************************
;MY8259_ICW1 EQU IOY0+00H ;实验系统中8259的ICW1端口地址
;MY8259_ICW2 EQU IOY0+04H ;实验系统中8259的ICW2端口地址
;MY8259_ICW3 EQU IOY0+04H ;实验系统中8259的ICW3端口地址
;MY8259_ICW4 EQU IOY0+04H ;实验系统中8259的ICW4端口地址
;MY8259_OCW1 EQU IOY0+04H ;实验系统中8259的OCW1端口地址
;MY8259_OCW2 EQU IOY0+00H ;实验系统中8259的OCW2端口地址
;MY8259_OCW3 EQU IOY0+00H ;实验系统中8259的OCW3端口地址
;*****************************************************************
MY8254_COUNT0 EQU IOY0+00H*4 ;8254计数器0端口地址
MY8254_COUNT1 EQU IOY0+01H*4 ;8254计数器1端口地址
MY8254_COUNT2 EQU IOY0+02H*4 ;8254计数器2端口地址
MY8254_MODE EQU IOY0+03H*4 ;8254控制寄存器端口地址
;*****************************************************************
MY8255_A EQU IOY1+00H*4 ;8255的A口地址
MY8255_B EQU IOY1+01H*4 ;8255的B口地址
MY8255_C EQU IOY1+02H*4 ;8255的C口地址
MY8255_MODE EQU IOY1+03H*4 ;8255的控制寄存器地址
;*****************************************************************
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
CS_BAK DW ? ;保存INTR原中断处理程序入口段地址的变量
IP_BAK DW ? ;保存INTR原中断处理程序入口偏移地址的变量
IM_BAK DB ? ;保存INTR原中断屏蔽字的变量
CSC DW 0 ;厘秒计时变量
SEC DW 0 ;秒计时变量
CSCG DW ? ;保存的厘秒个位数
CSCS DW ? ;保存的厘秒十位数
SECG DW ? ;保存的秒个位数
SECS DW ? ;保存的秒十位数
;TIME DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H ;
TIME1 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,67H ;没有点的十个数的七段显示
TIME2 DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0E7H ;有点的十个数的七段显示
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
CLI
MOV DX,PCI_INTCSR
SUB DX,19H
IN AL,DX
MOV DX,PCI_INTCSR ;初始化PCI卡中断控制寄存器
MOV AX,1F00H ;向PCI_INTCSR中写入003F1F00H
OUT DX,AX
ADD DX,2
MOV AX,003FH
OUT DX,AX
MOV AX,0000H ;替换INTR的中断矢量
MOV ES,AX
MOV DI,INTR_IVADD
MOV AX,ES:[DI]
MOV IP_BAK,AX ;保存INTR原中断处理程序入口偏移地址
MOV AX,OFFSET MYISR
MOV ES:[DI],AX ;设置当前中断处理程序入口偏移地址
ADD DI,2
MOV AX,ES:[DI]
MOV CS_BAK,AX ;保存INTR原中断处理程序入口段地址
MOV AX,SEG MYISR
MOV ES:[DI],AX ;设置当前中断处理程序入口段地址
MOV DX,INTR_OCW1 ;设置中断屏蔽寄存器,打开INTR的屏蔽位
IN AL,DX
MOV IM_BAK,AL ;保存INTR原中断屏蔽字
AND AL,INTR_IM
OUT DX,AL
MOV DX,MY8254_MODE ;初始化8254工作方式
MOV AL,36H ;计数器0,方式3
OUT DX,AL
MOV DX,MY8254_COUNT0 ;装入计数初值
MOV AX,2E9CH ;2E9C=0010 1110 1001 1100B=11932D=1.19318M/100
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DX,MY8255_MODE ;初始化实验系统中的8255
MOV AL,80H ;定义8255工作方式
OUT DX,AL ;工作方式0,A口,B口输出,C口任意
MOV DI,5555H ;用于标识开始/暂停键的状态
STI
;CALL SCREENSHOW
;MOV AX,0E0DH ;回车,置光标到行首
;INT 10H
WAIT1:
CALL SHOW
MOV AH,08H ;判断是否有按键按下
INT 21H
; JZ WAIT1 ;无按键则跳回继续等待,有则退出
CMP AL,0DH
JZ START_PAUSE
CMP AL,'R'
JZ CLEAR
CMP AL,'Q'
JZ QUIT
JMP WAIT1
START_PAUSE:
ROR DI,1
JC OPEN
MOV DX,MY8255_C
MOV AL,00H
OUT DX,AL;
JMP WAIT1
OPEN: MOV DX,MY8255_C
MOV AL,03H
OUT DX,AL;
JMP WAIT1
CLEAR:
MOV DX,MY8255_C
MOV AL,00H
OUT DX,AL;
MOV CSC,0 ;厘秒计时变量清零
;MOV SEC,0 ;秒计时变量清零
;MOV SECS,0 ;秒十位清零
;MOV SECG,0 ;秒个位清零
;MOV CSCS,0 ;厘秒十位清零
;MOV CSCG,0 ;厘秒个位清零
CALL SHOW
JMP WAIT1
QUIT: CLI
MOV DX,PCI_INTCSR ;恢复PCI卡中断控制寄存器
MOV AX,0000H
OUT DX,AX
MOV AX,0000H ;恢复INTR原中断矢量
MOV ES,AX
MOV DI,INTR_IVADD
MOV AX,IP_BAK ;恢复INTR原中断处理程序入口偏移地址
MOV ES:[DI],AX
ADD DI,2
MOV AX,CS_BAK ;恢复INTR原中断处理程序入口段地址
MOV ES:[DI],AX
MOV DX,INTR_OCW1 ;恢复INTR原中断屏蔽寄存器的屏蔽字
MOV AL,IM_BAK
OUT DX,AL
STI
MOV AX,4C00H ;返回到DOS
INT 21H
MYISR PROC NEAR ;中断处理程序MYISR
INC CSC
CMP CSC,6000
JNE OVER
MOV CSC,0
JMP OVER
OVER: CALL SHOW
MOV DX,PCI_INTCSR
SUB DX,19H
IN AL,DX
MOV DX,PCI_INTCSR ;清PCI卡中断控制寄存器标志位
ADD DX,2
MOV AX,003FH
OUT DX,AX
MOV DX,INTR_OCW2 ;向PC机内部8259发送中断结束命令
MOV AL,20H
OUT DX,AL
MOV AL,20H
OUT 20H,AL
IRET
MYISR ENDP
SHOW PROC NEAR
PUSH AX
PUSH BX
PUSH DX
MOV AX,CSC
MOV DX,0
MOV BX,1000
DIV BX
MOV SI,AX
OR AL,30H
PUSH DX
MOV DL,AL
MOV AH,02H
INT 21H
MOV DX,MY8255_A
MOV AL,0FEH
OUT DX,AL
MOV DX,MY8255_B
MOV AL,TIME1[SI];
OUT DX,AL
CALL DALLY
POP DX
MOV AX,CSC
MOV DX,0
MOV BX,100
DIV BX
MOV SI,AX
OR AL,30H
PUSH DX
MOV DL,AL
MOV AH,02H
INT 21H
MOV DX,MY8255_A
MOV AL,0FDH
OUT DX,AL
MOV DX,MY8255_B
MOV AL,TIME2[SI];
OUT DX,AL
CALL DALLY
POP DX
MOV AX,CSC
MOV DX,0
MOV BX,10
DIV BX
MOV SI,AX
OR AL,30H
PUSH DX
MOV DL,AL
MOV AH,02H
INT 21H
MOV DX,MY8255_A
MOV AL,0FBH
OUT DX,AL
MOV DX,MY8255_B
MOV AL,TIME1[SI];
OUT DX,AL
CALL DALLY
POP DX
MOV AX,DX
MOV SI,AX
OR AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DX,MY8255_A
MOV AL,0FBH
OUT DX,AL
MOV DX,MY8255_B
MOV AL,TIME1[SI];
OUT DX,AL
CALL DALLY
POP DX
POP BX
POP AX
RET
SHOW ENDP
DALLY PROC NEAR ;软件延时子程序
PUSH CX
MOV CX,0FFH
D1: MOV AX,0FFH
D2: DEC AX
JNZ D2
LOOP D1
POP CX
RET
DALLY ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -