⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 game.asm

📁 1) 从屏幕上方以一定的时间间隔随机落下可显示字符
💻 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 + -