📄 game.asm
字号:
;汇编课程设计
;指法练习程序
ctr_port equ 43h ;choose timer1
timer2 equ 42h
timer1 equ 41h
timer0 equ 40h
mode12 equ 74h ;timer1 ,mode 2
lock1 equ 40h
dseg segment
position dw ? ;initial position (maybe from 8253 )
char db ?
knock_times dw ?
hit_times dw ?
char_num dw ?
colour db 40h,41h,42h,43h,45h,46h,47h,48h
db 49h,4ah,4bh,4ch,4dh,4eh,4fh
line_on db ?
row_on db ?
n db ?
dseg ends
eseg segment
enter_return db 5 dup(00h),11 dup(0ah),'$'
for_dispn dw ?
Msg1 db '*** ***',0dh,0ah
db 34 dup(0),'* ** *',0dh,0ah
db 33 dup(0),'* WELCOME! *',0dh,0ah
db 34 dup(0),'* *',0dh,0ah
db 36 dup(0),'* *',0dh,0ah
db 39 dup(0),'**',0dh,6 dup(0ah)
db 28 dup(0),'Class 03-2 Sign:20032270',0dh,0ah
db 38 dup(0),'Satan',0dh,0ah
db 29 dup(0),"Press 'enter' to start:",0dh,0ah
db 30 dup(0),"Press 'esc' to exit:",0dh,0ah
len1 dw $-Msg1
Msg2 db '*************************',0dh,0ah
db 28 dup(0),'*Text is over,thank you!*',0dh,0ah
db 28 dup(0),'*************************',0dh,0ah
db 28 dup(0),'Record:'
len2 dw $-Msg2
eseg ends
;sseg segment
; dw 512 dup(?)
;sseg ends
cseg segment
assume cs:cseg,ds:dseg,es:eseg
main proc far
push ds
sub ax,ax
push ax
mov ax,dseg
mov ds,ax
call welscreen
call init_53
mov ah,00
mov al,03
int 10h
mov ah,09
mov al,0
mov bh,0
mov bl,70
mov cx,2000
int 10h
begin:
call erase
call pro_position
mov dx,position
call show
ret
main endp
;-------------------------------------------------------------
;*********************在屏幕上显示出字符**********************
show proc near
push ax
push bx
push cx
push dx
push di
mov di,n
; mov ah,0fh
; int 10h
; mov line_on,dh
; mov row_on,dl
mov_show:
mov ch,00010000b
mov cl,0h
mov ah,1
int 10h
mov ah,2
mov bh,0
int 10h
mov ah,09
mov al,char
mov bh,0
mov bl,colour[di]
mov cx,1
int 10h
mov line_on,dh
mov row_on,dl
call dly_q
call erase
inc char_num ;掉落的字符数
jmp again
again:
cmp dh,24
jZ begin
mov ah,1 ; check the keyboard
int 16h
jz mov_show
inc knock_times ;敲击键盘的次数
cmp al,1Bh ;is it 'esc' ? if so, exit
jz exit
mov ah,0
int 16h
cmp al,char
jnz mov_show
inc hit_times ;击中字符的次数
mov ah,2
mov bh,0
mov dh,line_on
mov dl,row_on
int 10h
mov ah,9 ;在光标位置显示字符
mov al,char
mov bl,0bfh ;闪烁
mov cx,1
int 10h
call dly_q
call erase
call sound
jmp begin
exit:
call htpercent
mov ah,4ch
int 21h
pop di
pop dx
pop cx
pop bx
pop ax
ret
show endp
;-------------------------------------------------------------
;**********************清除显示的字符*************************
erase proc near
mov dh,line_on
mov dl,row_on
erasr_next:
mov ah,09
mov al,00
mov bh,0
mov bl,70 ;用背景色来显示空字符,即清除
mov cx,1
int 10h
inc line_on
mov dh,line_on
mov dl,row_on
ret
erase endp
;-------------------------------------------------------------
;************************延迟一个周期*************************
dly_q proc near
push cx
push dx
mov dx,2000h
dl1: mov cx,1024h
dl2: loop dl2
dec dx
jnz dl1
pop dx
pop cx
ret
dly_q endp
;-------------------------------------------------------------
;********************** 计数器计数赋值************************
pro_position proc
push ax
push bx
mov al,lock1
out ctr_port,al
in al,timer1 ;低八位--row
mov bl,al
in al,timer1
mov bh,0
mov position,bx
add al,61h ;a,b,c,.....
;add al,41h ;A,B,.......
mov char,al
mov bh,15
div bh
mov n,ah
pop bx
pop ax
ret
pro_position endp
;-------------------------------------------------------------
;************************* 访问8253 **************************
init_53 proc
push ax
mov al,mode12
out ctr_port,al
mov al,80
out timer1,al
mov al,23
out timer1,al
pop ax
ret
init_53 endp
;-------------------------------------------------------------
;*********************** 输入正确声音 ************************
sound proc
push dx
push ax
push cx
push bx
push di
mov di,423
mov bx,200
mov al,0b6h
out 43h,al
mov dx,12h
mov ax,533h*896
div di
out 42h,al
mov al,ah
out 42h,al
in al,61h
mov ah,al
or al,3
out 61h,al
wait1: mov cx,2801
delay: loop delay
dec bx
jnz wait1
mov al,ah
out 61h,al
pop di
pop bx
pop cx
pop ax
pop dx
ret
sound endp
;-------------------------------------------------------------
;************************* 欢迎界面 **************************
welscreen proc
push ax
push bx
push cx
push dx
push bp
push es
mov al,03h
mov ah,00h
int 10h
mov bp,seg Msg1
mov es,bp
mov bp,offset Msg1
mov cx,len1
mov dx,0323h ;begin line and row
mov bl,0bh ;property
mov bh,0
;mov al,1 ;parameter in 13
mov al,0
mov ah,13h
int 10h
wait:
mov ah,1
int 21h
cmp al,1bh
jz exit1
cmp al,0dh
jnz wait
jmp done
exit1:
mov al,03h
mov ah,00h
int 10h
mov ah,4ch
int 21h
done:
pop es
pop bp
pop dx
pop cx
pop bx
pop ax
ret
welscreen endp
;-------------------------------------------------------------
;************************** 退出界面 *************************
htpercent proc
push ax
push bx
push cx
push dx
push bp
push es
mov al,03h
mov ah,00h
int 10h
mov bp,seg Msg2
mov es,bp
mov bp,offset Msg2
mov cx,len2
mov dx,081ch ;begin line and row
mov bl,0bh ;property
mov bh,0
mov al,0
mov ah,13h
int 10h
; mov ax,seg enter_return
; mov es,ax
; mov dx,offset enter_return
; mov ah,9
; int 21h
mov ah,2
mov bh,0
mov dx,0b23h
int 10h
mov ax,hit_times
mov for_dispn,ax
call change
mov dl,'/'
mov ah,2
int 21h
mov ax,knock_times
mov for_dispn,ax
call change
pop es
pop bp
pop dx
pop cx
pop bx
pop ax
ret
htpercent endp
;--------------------------------------------------------------
;******************* 二进制转化为十六进制 *********************
change proc
push ax
push bx
push cx
push dx
mov bx,for_dispn
mov cl,4
mov ch,4
again1:
rol bx,cl
mov dl,bl
and dl,0fh
cmp dl,10
jge next
add dl,30h
jmp down
next:
add dl,37h
down:
mov ah,2
int 21h
dec ch
cmp ch,0
jnz again1
mov ah,2
mov dl,'h'
int 21h
pop dx
pop cx
pop bx
pop ax
ret
change endp
;------------------------------------------------------------
cseg ends
end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -