?? 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 + -