📄 gundong.asm
字号:
ioport equ 0c400h-0280h
proth equ ioport+290h
protlr equ ioport+298h
protly equ ioport+2a0h
io8253a equ ioport+280h
io8253b equ ioport+281h
io8253c equ ioport+283h
io8255a equ ioport+288h;a端口输出
io8255b equ ioport+28bh
io8255c equ ioport+28ah;c端口输入
DATA SEGMENT
MESS DB ' -------------------------------------------------',0AH,0DH
DB ' *************************************************' ,0AH,0DH
DB 0AH,0DH
DB ' This program displays "3 2 1 0 Go!"',0AH,0DH
DB 0AH,0DH
DB ' To return to DOS, please press "r".',0AH,0DH
DB 0AH,0DH
DB 0AH,0DH
DB ' *************************************************' ,0AH,0DH
DB ' -------------------------------------------------','$'
min1 DB 00h,01h,02h,03h,04h,05h,06h,07h
three DB 0H,0H,7eH,52H,42H,66H,0H,0H ;显示数据
two DB 0H,0H,72H,5aH,4eH,66H,0H,0H
one DB 0H,0H,0H,7EH,20H,0H,0H,0H
zero DB 0H,0H,7eH,42H,42H,7cH,0H,0H
g6 db 0h,7ah,60h,0h,0ch,12h,12h,0ch
g5 DB 7ah,60h,0h,0ch,12h,12h,0ch,0h
g4 DB 60h,0h,0ch,12h,12h,0ch,0h,0eh
g3 DB 0h,0ch,12h,12h,0ch,0h,0eh,4ah
g2 db 0ch,12h,12h,0ch,0h,0eh,4ah,42h
g1 db 12h,12h,0ch,0h,0eh,4ah,42h,3ch
flag db 01h ;当前显示的是第几个字
flag1 db 00h
DATA ENDS
;============================================================
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
;============================================================
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MESS
MOV AH,09
INT 21H ;显示提示信息
;============================================================
;对要显示的字进行判断
main: call delay_8253
mov ah,flag ;d1-d10为红色显示区
d1: cmp ah,01h ;判断是否显示第一个字
jne d2
mov bx,offset three
mov dx,protlr
jmp display
d2: cmp ah,02h ;判断是否显示第二个字,以下类推
jne d3
mov bx,offset two
mov dx,protlr
jmp display
d3: cmp ah,03h
jne d4
mov bx,offset one
mov dx,protlr
jmp display
d4: cmp ah,04h
jne d5
mov bx,offset zero
mov dx,protlr
jmp display
d5: cmp ah,05h
jne d6
mov bx,offset g1
mov dx,protlr
jmp display
d6: cmp ah,06h
jne d7
mov bx,offset g2
mov dx,protlr
jmp display
;
d7: cmp ah,07h
jne d8
mov bx,offset g3
mov dx,protlr
jmp display
d8: cmp ah,08h
jne d9
mov bx,offset g4
mov dx,protlr
jmp display
d9: cmp ah,09h
jne d10
mov bx,offset g5
mov dx,protlr
jmp display
d10: cmp ah,0ah
jne d11
mov bx,offset g6
mov dx,protlr
jmp display
;;;;; ;以下为黄色显示区
d11: cmp ah,0bh ;判断是否显示第一个字
jne d12
mov bx,offset three
mov dx,protly
jmp display
d12: cmp ah,0ch
jne d13
mov bx,offset two
mov dx,protly
jmp display
d13: cmp ah,0dh
jne d14
mov bx,offset one
mov dx,protly
jmp display
d14: cmp ah,0eh
jne d15
mov bx,offset zero
mov dx,protly
jmp display
d15: cmp ah,0fh
jne d16
mov bx,offset g1
mov dx,protly
jmp display
d16: cmp ah,10h
jne d17
mov bx,offset g2
mov dx,protly
jmp display
d17: cmp ah,11h
jne d18
mov bx,offset g3
mov dx,protly
jmp display
d18: cmp ah,12h
jne d19
mov bx,offset g4
mov dx,protly
jmp display
d19: cmp ah,13h
jne d20
mov bx,offset g5
mov dx,protly
jmp display
d20: mov bx,offset g6
mov dx,protly
;===================================================================
;显示部分程序
display: call delay_8255
test al,01h ;读取8255,当输出为低电平时继续显示当前字,当为
jnz main1 ;高电平时跳到main1
mov ah,01h
mov cx,0008h
mov si,offset min1
next_b: mov al,[si]
xlat ;得到第一行码
push dx
mov dx,proth
out dx,al
pop dx
mov al,ah
out dx,al ;显示第一行红
shl ah,01
inc si
push cx
mov cx,0ffffh
delay2: loop delay2 ;延时
pop cx
loop next_b
mov ah,01 ;有无键按下
int 16h
jz display ;没有键按下跳转到显示程序
mov ah,00h
int 16h
cmp al,72h ;有键按下判断是否按下的键为“r”
je p_out ;为“r”跳转,结束程序
jmp display ;不是“r”跳转到显示程序
main1: mov al,00 ;对dx清0,重新对8253赋值
out dx,al
;==============================================================
return: mov al,flag
cmp al,14h
;判断8个显示的字是否完成
je back ;显示完跳转
inc al
mov flag,al
jmp main ;没有显示完, flag + 1,跳转,显示下一个字
;==============================================================
;对最后显示字进行处理
back: mov al,flag1 ;对 flag1 进行判断
cmp al,0ffh
jne next ;当 flag1为00h跳转到next
mov al,00h ;flag1 为01h ,则把flag1重新赋值为00h,并把01h给flag,跳转到main重新从第一个字显示
mov flag1,al
mov al,01h
mov flag,al
jmp main
next: xor al,0ffh ;al 的值为0h,对al 取反,把值重新给flag1
mov flag1,al
jmp main ;跳到main 时,直接显示最后一个字,从而使最后一个字的显示时间比其它的长一倍
;=================================================================
delay_8253 PROC NEAR
mov dx,io8253c ;向8253写控制字
mov al,36h ;使0通道为工作方式3
out dx,al
mov ax,400h ;写入循环计数初值400
mov dx,io8253a
out dx,al ;先写入低字节
mov al,ah
out dx,al ;后写入高字节
mov dx,io8253c
mov al,70h ;设8253通道1工作方式0
out dx,al
mov ax,400 ;写入循环计数初值400
mov dx,io8253b
out dx,al ;先写低字节
mov al,ah
out dx,al ;后写高字节
RET
delay_8253 ENDP
;==============================================================
delay_8255 PROC NEAR
push dx
mov dx,io8255b ;写控制字.设8255为C口输入,A口输出
mov al,8bh
out dx,al
mov dx,io8255c ;从C口输入一数据
in al,dx
pop dx
ret
delay_8255 endp
;===========================================================
p_out: MOV AH,4CH ;返回
INT 21H
CODE ENDS
END START
;=============================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -