📄 dabanew.asm
字号:
;***********************;
;* 移动打靶 1.0 *;
;* 作者:黄儒 *;
;* 学号:08005432 *;
;***********************;
;8255CS-288h PB7-PB0接发光二极管L7-L0 PA7接led dp PA6-PA0接led g-a PC7-PC4接led位选 s3-s0
;8253Cs-280h clk0-1Mhz gate0-vcc out0-IRQ
;点阵行选—290h 红选-298h
;ls244 k0-2,k1-4,k2-6,k3-8,k4-11,k5-13,k6-15,k7-17;
; D0-18,D1-14,D2-16,D3-12,D4-9,D5-7,D6-5,D7-3
;2A0h~ 和!IOR相或接ls244的19,1 ls244的10-GND 20-Vcc
;单脉冲接PC0
ioport equ 0c800h-0280h
io8253a equ ioport+280h
io8253b equ ioport+281h
io8253c equ ioport+283h
proth equ ioport+290h
protlr equ ioport+298h
io8255c equ ioport+28ah;c口
io8255b equ ioport+28bh;控制寄存器
io8255a equ ioport+288h;a口
io8255bb equ ioport+289h
ls244 equ ioport+2a0h
data segment
int_vect EQU 0dH ;中断0-7 的向量为:08h-0fh,中断8-15 的向量为:70h-77h
irq_mask_2_7 equ 011011111b ;中断掩码,中断0-7 时从低至高相应位为零,中断8-15 时第2 位为零
irq_mask_9_15 equ 011111111b;中断0-7 时全一,中断8-15 时从低至高相应位为零
ioport_cent equ 0c400h ;tpc 卡中9054 芯片的io 地址
msgbb db 0dh,0ah,'YiDongDaBa 1.0',0dh,0ah,'$'
msgzz db 0dh,0ah,'Written by HuangRu(08005432)',0dh,0ah,'$'
msgz1 db 0dh,0ah,'8255CS-288h PB7-PB0接发光二极管L7-L0 PA7接led dp PA6-PA0接led g-a PC7-PC4接led位选 s3-s0',0dh,0ah,'$'
msgz2 db 0dh,0ah,'8253Cs-280h clk0-1Mhz gate0-vcc out0-IRQ',0dh,0ah,'$'
msgz3 db 0dh,0ah,'点阵行选-290h 红选-298h',0dh,0ah,'$'
msgz4 db 0dh,0ah,'ls244 k0-2,k1-4,k2-6,k3-8,k4-11,k5-13,k6-15,k7-17',0dh,0ah,'$'
msgz5 db 0dh,0ah,'ls244 D0-18,D1-14,D2-16,D3-12,D4-9,D5-7,D6-5,D7-3',0dh,0ah,'$'
msgz6 db 0dh,0ah,'2A0h~和!IOR相或接ls244的19,1 ls244的10-GND 20-Vcc 单脉冲接PC0',0dh,0ah,'$'
msgkg db 0dh,0ah,'Press The Switch To Begin The Game!',0dh,0ah,'$'
msg1 db 0dh,0ah,'Start!',0dh,0ah,'$'
msg2 db 0dh,0ah,'Score!',0dh,0ah,'$'
msg3 db 0dh,0ah,'Pressed',0dh,0ah,'$'
msg_choose1 db 0dh,0ah,'7:Hard 8:middle 9:easy',0dh,0ah,'$'
msg_choose2 db 0dh,0ah,'Choose mode(play key 1 or 2 or 3)',0dh,0ah,'$'
sym_end db 0;结束标志
led_now db 0;当前开关状态
key11 db 0;是否打靶
counter_time db 0;时间计数
counter_mov db 0;靶移动计数
num_mov db 0;靶移动计时
random_en db 0;随机使能
counter_max1 db 0;规定时间高位
counter_max2 db 0;规定时间低位
counter_score1 db 0;计分高位
counter_score2 db 0;计分低位
table_key dw 0;开关状态偏移地址
table_led dw 0;发光二极管表的偏移地址
led_number db 0;发光二极管表码数目
key_now db 0;当前开关状态按键状态,用键盘打靶时可改为开关状态对应ascii码值
key_en db 0;按键是否有效
led1 db 80h,40h,20h,10h,08h,04h,02h,01h,02h,04h,08h,10h,20h,40h;发光二极管输出
led2 db 80h,20h,08h,02h,01h,04h,10h,40h;发光二极管输出
key1 db 80h,40h,20h,10h,08h,04h,02h,01h,02h,04h,08h,10h,20h,40h;当前发光二极管对应的开关状态,用键盘打靶时可改为对应的ascii码
key2 db 80h,20h,08h,02h,01h,04h,10h,40h;当前发光二极管对应的开关状态,用键盘打靶时可改为对应的ascii码
led DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;七段数码管断码
csreg dw ?
ipreg dw ? ;旧中断向量保存空间
data ends
stacks segment
db 100 dup (?)
stacks ends
code segment
assume cs:code,ds:data,ss:stacks,es:data
main proc far
;Enable Local Interrupt Input
.386
start: cli
mov ax,data
mov ds,ax
mov es,ax
mov ax,stacks
mov ss,ax
mov dx,io8255b ;将8255设为A口输出,c7-4out,c3-0in
mov al,81h
out dx,al
mov dx,io8253c ;向8253写控制字
mov al,34h ;使0通道为工作方式3
out dx,al
mov ax,60000 ;写入循环计数初值60000
mov dx,io8253a
out dx,al ;先写入低字节
mov al,ah
out dx,al ;后写入高字节
mov dx,ioport_cent+68h ;设置 tpc 卡中9054 芯片io 口,使能中断
in ax,dx
or ax,0900h
out dx,ax
mov al,int_vect ;保存原中断向量
mov ah,35h
int 21h
mov ax,es
mov csreg,ax
mov ipreg,bx
mov ax,cs ;设置新中断向量
mov ds,ax
mov dx,offset int_proc
mov al,int_vect
mov ah,25h
int 21h
in al, 21h ;设置中断掩码
and al, irq_mask_2_7
out 21h, al
in al, 0a1h
and al, irq_mask_9_15
out 0a1h, al
mov ax,data
mov ds,ax;ds指向数据段
mov dx,offset msgbb ;显示提示信息
mov ah,09
int 21h
mov dx,offset msgzz ;显示提示信息
mov ah,09
int 21h
mov dx,offset msgz1 ;显示提示信息
mov ah,09
int 21h
mov dx,offset msgz2;显示提示信息
mov ah,09
int 21h
mov dx,offset msgz3 ;显示提示信息
mov ah,09
int 21h
mov dx,offset msgz4 ;显示提示信息
mov ah,09
int 21h
mov dx,offset msgz5;显示提示信息
mov ah,09
int 21h
mov dx,offset msgz6;显示提示信息
mov ah,09
int 21h
mov dx,offset msgkg ;显示提示信息
mov ah,09
int 21h
read_start: mov dx,io8255c
in al,dx
mov dx,io8255c
in al,dx
test al,01h
jz read_start
mov ax,data
mov ds,ax;ds指向数据段
mov dx,offset msg1 ;显示提示信息
mov ah,09
int 21h
restart1: mov ax,data
mov ds,ax;ds指向数据段
mov dx,offset msg_choose1 ;显示提示信息
mov ah,09
int 21h
read_choose: mov ah,07h
int 21h
cmp al,37h;h
jnz choose1
mov num_mov,15;耙移动计时,
jmp read_choose2n
choose1: cmp al,38h;m
jnz choose2
mov num_mov,30;耙移动计时,
jmp read_choose2n
choose2: cmp al,39h;e
jnz read_choose
mov num_mov,50;耙移动计时,
read_choose2n: mov dx,offset msg_choose2;显示提示信息
mov ah,09
int 21h
read_choose2: mov ah,07h
int 21h
cmp al,31h;1
jnz choose22
mov random_en,0
mov table_key,offset key1;开关表偏移地址
mov table_led , offset led1;发光二极管表的偏移地址
mov led_number ,14;发光二极管表数目
jmp csh
choose22: cmp al,32h;2
jnz choose23
mov random_en,0
mov table_key,offset key2;开关表偏移地址
mov table_led , offset led2;发光二极管表的偏移地址
mov led_number ,8;发光二极管表数目
jmp csh
choose23: cmp al,33h;3
jnz read_choose2
mov random_en,1
mov table_key,offset key1;开关表偏移地址
mov table_led , offset led1;发光二极管表的偏移地址
;初始化数据
csh:
mov sym_end , 0;结束标志
mov led_now,0
mov key11 ,0
mov counter_time,0;时间计数
mov counter_mov ,0;靶移动计数
mov counter_max1 , 09h;规定时间高位
mov counter_max2,09h;规定时间低位
mov counter_score1,0;计分高位
mov counter_score2 , 0;计分低位
mov key_now , 0
mov key_en ,0;按键是否有效
mov si,0
sti
main2: mov dx,io8255c
in al,dx
mov dx,io8255c
in al,dx
test al,01h;是否结束程序
jnz exit
;************显示部分*********************************
display0: mov al,00h;全部禁止显示
mov dx,io8255c
out dx,al
mov bx,offset led
mov al,counter_max1
xlat
mov dx,io8255a
out dx,al;送断码
mov al,80h;送位码
mov dx,io8255c
out dx,al
call delay
display1: mov al,00h;全部禁止显示
mov dx,io8255c
out dx,al
mov bx,offset led
mov al,counter_max2
xlat
mov dx,io8255a
out dx,al;送断码
mov al,40h;送位码
mov dx,io8255c
out dx,al
call delay
display2: mov al,00h;全部禁止显示
mov dx,io8255c
out dx,al
mov bx,offset led
mov al,counter_score1
xlat
mov dx,io8255a
out dx,al;送断码
mov al,20h;送位码
mov dx,io8255c
out dx,al
call delay
display3: mov al,00h;全部禁止显示
mov dx,io8255c
out dx,al
mov bx,offset led
mov al,counter_score2
xlat
mov dx,io8255a
out dx,al;送断码
mov al,10h;送位码
mov dx,io8255c
out dx,al
call delay
cmp key11,01h;轨迹显示,是否有键按下
jnz llll
mov dx, protlr;有键按下(打靶)
mov al,key_now
out dx,al
mov dx,proth
mov al,0ffh
out dx,al
call delay
mov key11,00h
jmp main1
llll: mov dx, protlr;未打靶
mov al,led_now
out dx,al
mov dx,proth
mov al,80h
out dx,al
;*************以上为显示部分*****************88888888
main1: cmp sym_end,1
jnz main12
jmp main2;一轮结束
main12: cmp key_en,01h
jz main13
jmp main2;按键无效
main13:
mov dx,ls244 ;读开关状态
in al,dx
main11:
test al,0ffh
jz main2;是否打靶
mov key_now,al
mov key11,01h
mov bx,table_key
mov ax,si
xlat
cmp al,key_now
jz main111;对应键按下
jmp main2
main111: cmp key_en,01h
jnz main2
mov dx,offset msg2 ;显示提示信息
mov ah,09
int 21h
cmp counter_score2,9
jnz main112
mov counter_score2,0;得分
dec counter_score2
inc counter_score1
main112: inc counter_score2
and key_en,00h;以后按键无效
jmp main2
exit: cli
mov bl, irq_mask_2_7 ;恢复中断掩码
not bl
in al, 21h
or al, bl
out 21h, al
mov bl, irq_mask_9_15
not bl
in al, 0a1h
or al, bl
out 0a1h, al
mov dx,ipreg ;恢复原中断向量
mov ax,csreg
mov ds,ax
mov ah,25h
mov al,int_vect
int 21h
mov dx,ioport_cent+68h ;设置 tpc 卡中9054 芯片io 口,关闭中断
in ax,dx
and ax,0f7ffh
out dx,ax
mov ax,4c00h
int 21h
main endp
int_proc proc far ;中断处理程序
cli
push ax
push dx
push ds
mov ax,data ;ds指向数据段
mov ds,ax
cmp sym_end,01h
jz exit1;一轮结束
int1: inc counter_time
inc counter_mov
mov al,num_mov
cmp counter_mov,al;是否到靶移动时间
jnz int2
mov counter_mov,00h
cmp random_en,01h
jnz ran1
call iRand;调用随机子程序
jmp int3
ran1: inc si
mov ax,si
cmp al,led_number;是否到表顶
jnz int3
mov si,0
int3: mov key_en,01h
mov key11,00h
mov dx,ls244 ;读开关状态
in al,dx
mov key_now,al
mov bx,table_key
mov ax,si
xlat
cmp al,key_now
jnz int31;对应键未按下
mov key_en,00h;以后按键无效
mov dx,offset msg3 ;显示提示信息pressed
mov ah,09
int 21h
int31:
mov bx,table_led;输出靶
mov ax,si
xlat
mov led_now,al;记录放光二极管状态
mov dx,io8255bb
out dx,al;输出靶
mov dx,protlr
out dx,al
mov dx,proth
mov al,80h
out dx,al
int2: cmp counter_time,100;是否到一秒
jnz exit1
mov counter_time,00h
cmp counter_max2,00h ;一秒到,低位是否为0
jnz int22
cmp counter_max1,00h;低位是0,高位是否为0
jnz int221;
mov sym_end,1;一轮结束
jmp exit1
int221: mov counter_max2,09h;低位0,高位不为0
dec counter_max1
jmp exit1
int22: dec counter_max2;一秒到,低位不为0
exit1:
mov al,20h ;Send EOI
out 0a0h,al
out 20h,al
pop ds
pop dx
pop ax
sti
iret
int_proc endp
iRand proc near;随机数子程序
push ax
push dx
push ds
mov ah,2ch;取系统时间做种子
int 21h
mov ax,dx
mov cx, 23 ; X = cx = 23
mul cx ; ax = ax * X
add ax, 7 ; ax = ax + Y (Y = 7)
mov cx,14
xor dx, dx ; dx = 0
div cx ; ax = ax mod Z (余数在dx里面)
add dx, 0 ; 修正产生的随机数的范围
mov si, dx ; si = Rand_Number
pop ds
pop dx
pop ax
ret
iRand endp
delay PROC NEAR ;延迟子程序
push cx
mov cx,0ffffh
ccc: loop ccc
pop cx
ret
delay ENDP
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -