📄 aaa.asm
字号:
jc closef
mov si,ax ;保存文件代号
mov bx,si
sub cx,cx
mov dx,76h
mov al,0 ;file指针移动
mov ah,42h
int 21h
mov dx,479
begin_dp:
;;;;;;读文件
mov di,dx
mov bx,si
mov cx,80
mov dx,offset tempmem
mov ah,3fh
int 21H
mov dx,di ;保护dx
sub di,di ;tempmem指针
; sub cx,cx ;x=0
mov cx,480
readmem:
mov bl,byte ptr[tempmem+di]
inc di
mov al,bl
shr al,1
shr al,1
shr al,1
shr al,1
and al,00001111b
mov ah,0ch
int 10h ;画点
push cx
inc cx
mov al,bl
and al,00001111b
mov ah,0ch
int 10h ;画点
pop cx
add cx,2
cmp cx,640
jne short readmem
dec dx
cmp dx,-1
jne short begin_dp
closef:
mov ah,3eh
int 21h ;关闭文件
ret
drawpic endp
;;;;;;;;;;;;;;;;;;;;;;按键处理
button proc near
but1:
cmp dx,163
jl fail_but
cmp dx,194
jg short but2
cmp cx,14+480
jl ext_but
cmp cx,45+480
jg short but11
not soundswitch ;sound
jmp ext_but
but11:
cmp cx,84+480
jl fail_but
cmp cx,107+480
jg but12
cmp vv,9
je ext_but
inc vv
call disvv
jmp ext_but
but12:
cmp cx,120+480
jl fail_but
cmp cx,145+480
jg ext_but
cmp vv,0
je ext_but
dec vv
call disvv
jmp ext_but
but2:
cmp dx,227
jl fail_but
cmp dx,306
jg short but3
cmp cx,53+480
jl fail_but
cmp cx,131+480
jg fail_but
cmp dx,267
jl butsave
;初始化背景
mov color,bkcol
mov dx,0101h
@abg:
call getxy
cmp bl,divit
jz @abg1
mov bx,divit
call setxyc
@abg1:
inc dh
cmp dh,29
jnz short @abg
mov dh,1
inc dl
cmp dl,29
jnz short @abg
call load
call gameresume
jmp ext_but
butsave:
call save
jmp ext_but
but3:
cmp dx,384
jl fail_but
cmp dx,48
jl ext_but
mov color,bkcol
mov dx,0101h
;初始化背景
@bbg:
call getxy
cmp bl,divit
jz @bbg1
mov bx,divit
call setxyc
@bbg1:
inc dh
cmp dh,29
jnz short @bbg
mov dh,1
inc dl
cmp dl,29
jnz short @bbg
call display
mov exitmain,1
mov musicn,'3'
call play
ext_but:
mov musicn,'8'
call play
jmp short realexit_play
fail_but:
mov musicn,'9'
call play
realexit_play:
ret
button endp
;;;;;;;;;;;;;;;;;;;显示游戏速度
disvv proc near
mov color,1001b
mov cx,wordx+32+17
mov dx,wordy+78
sub bh,bh
mov bl,vv
shl bx,1
mov di,ntable[bx]
call drawc
ret
disvv endp
;;;;;;;;;;;;;;;;;;;恢复游戏数据
gameresume proc near
;;;;;;;恢复背景
mov color,bkcol
mov dx,0101h
@bgr:
call getxy
cmp bl,divit
jz @bgr1
sub bh,bh
call setxyc
@bgr1:
inc dh
cmp dh,29
jnz short @bgr
mov dh,1
inc dl
cmp dl,29
jnz short @bgr
;;;;;;;;;;;;;;恢复文字
mov color,timecol
;score
dec score
call addscore
call disvv
;;;;;;;
mov ah,0ch
mov al,5 ;不等待,不回显
int 21h ;清空键盘缓存
mov exitmain,0
mov isover,0
cmp ispause,0ffffh
jnz exit_gameresume
call pause
exit_gameresume:
ret
gameresume endp
exit_main:
ret
exit_main endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; 模块2 游戏的存档和读档 制作:王洪飞 ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;存档
save proc near
lea dx,savefilename ;文件名
mov ah,3ch
mov cx,0 ;文件属性
int 21H ;创建
jc closesf ;失败
mov ax,3d01h
int 21H ;打开文件
jc closesf ;失败
mov bx,ax ;文件代号
mov ah,40h
mov dx,offset savedatabegin
mov cx,savedataend-savedatabegin
int 21h
closesf:
mov ah,3eh
int 21h ;关闭文件
ret
save endp
;;;;;;;;;;;;;;;;;;;;;;读档
load proc near
lea dx,savefilename ;文件名
mov ax,3d00h
int 21H ;打开文件
jc cloself ;失败
mov bx,ax ;文件代号
mov ah,3fh
mov dx,offset savedatabegin
mov cx,savedataend-savedatabegin
int 21h
mov ah,3eh
int 21h
cloself:
ret
load endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; 模块3 随机函数 制作:石慧 ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rnd proc near
push bx
push cx
push dx
mov ah,2
int 1ah ;调用系统时钟
mov ax,0
mov al,ch ;(ax)=当前小时
mov bl,60
mul bl ;化时为分
mov ch,0 ;清空(ch)后 (cx)=当前分
add ax,cx ;(ax)当前时到0时0分的总共分钟数
mov cx,0
mov cl,dl ;(cx)中保存dl中的秒钟数
mov bx,60
mul bx ;化分为秒,结果在(dx,ax) 0<=(dx,ax)<=86400
add ax,cx ;(cx)当前时到0时0分0秒的总共秒数(不考虑ax到dx总的加法进位)
mov bx,lastrnd ;lastrnd为产生上一个随机数时留下的数字,因为有可能在同一秒内多次调用此函数,使用lastrnd变量可防治出现相同随机数
;一个简单函数: (ax)=((dx,ax)/bx余数)+((dx:ax)/bx商)
div bx
add ax,dx
add al,ah ;返回值(al)=(al)+(ah) 不考虑加法溢出
mov ah,0 ;(ax)=(al)
mov bl,maxrnd ;maxrnd为随机数上限
div bl
mov al,ah ;(al)=((ax)/maxrnd余数) 则满足条件 0<=al<=maxrnd
;以下代码产生本次lastrnd的值
mov ah,0 ;(ax)=(al)
mov bx,lastrnd
add bx,ax
add bl,bh ;防止(ah)==0时,lastrnd保持不变
cmp bx,3000
jl @rnd
sub bx,1511 ;当lastrnd>3000时,lastrnd=lastrnd-511
@rnd:
cmp bx,100
jge rndfinish
add bx,333 ;当lastrnd<=100时,lastrnd=lastrnd+333
rndfinish:
mov lastrnd,bx
pop dx
pop cx
pop bx
ret
rnd endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; 模块4 音乐播放 制作:林海君 ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
play proc near
cmp soundswitch,0
jnz beg_play
ret
beg_play:
push ax
push bx
push cx
push dx
push si
push di
mov al,musicn
lea si,mus1 ;;;;;;回送有效地址
cmp al,'1' ;;;;;;;
je d1
cmp al,'2'
je d2
cmp al,'3' ;;;;;;;退出音乐
je d3
cmp al,'4' ;;;;;;;开始
je d4
cmp al,'5' ;;;;碰壁
je d5
cmp al,'6'
je d6
cmp al,'7' ;;;;;;吃到老鼠
je d7
cmp al,'8' ;;;;;;点击有效
je d8
cmp al,'9' ;;;;;点击无效
je d9
cmp al,'0' ;;;;;;键盘移动
je d0
d1: mov si,4 ;;;;;末地址
mov di,0 ;;;;;起始地址
mov bian,4000;;;;;赋变量,延迟时间长短
jmp loop1
d2: mov si,104 ;;;;末地址
mov di,52 ;;;;起始地址
mov bian ,10000
jmp loop1
d3: mov si,122
mov di,108
mov bian,4000
jmp loop1
d4: mov si,166
mov di,142
mov bian,3000
jmp loop1
d5: mov si,204
mov di,198
mov bian,1500
jmp loop1
d6: mov si,210
mov di,204
mov bian,5000
jmp loop1
d7: mov si,228
mov di,220
mov bian,1000
jmp loop1
d8: mov si,232
mov di,228
mov bian,3000
jmp loop1
d9: mov si,240
mov di,238
mov bian,5000
jmp loop1
d0: mov si,250
mov di,248
mov bian,5000
jmp loop1
loop1:
call sound
sub si,2
cmp si,di
jnz loop1
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
play endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;sound
sound proc near
mov al,0b6h ;;;;;;定时器2的方式寄存器初始化
out 43h,al
mov ax,533h
mov bx,896
mul bx ;;;;;;;计时常数533h*896
mov bx,[si]
div bx
out 42h,al
mov al,ah
out 42h,al
in al,61h
mov ah,al
or al,3 ;;;;;置0,1位为1
out 61h,al
mov bx,bian
wait1: mov cx,3801 ;;;;;;;延迟
delay: loop delay
dec bx
jnz wait1
mov al,ah
out 61h,al
ret
sound endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; 模块5 排行榜 制作:闫海涛 ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;
rank proc near
mov nam,'yh'
; mov score,89
lea si,store.hname
lea di,store.hname
call openh
call readh
mov dx,0 ;control the numer
mov cx,4
div cx
mov cx,ax
add cx,1
mov xh,cx
yht:
mov bp,[si+2]
mov bx,score
cmp bp,bx
jnl yht1
mov bp,nam
mov dx,score
mov ax,[si]
mov bx,[si+2]
mov nam,ax
mov score,bx
mov [si],bp
mov [si+2],dx
yht1:
add si,4d
loop yht
lea si,store
call writeh
call closeh
yht2:
mov ah,0 ;display the name
mov al,3
int 10h
mov bp,seg store
mov es,bp
mov bp,si
mov cx,2
mov dx,0
mov bl,0a8h
mov al,1
mov ah,13h
int 10h
call crc
call crc
call crc
call crc
mov bx,[si+2] ;display the score
mov cx,10000d
call decdiv
mov cx,1000d
call decdiv
mov cx,100d
call decdiv
mov cx,10d
call decdiv
mov cx,1d
call decdiv
mov dl,'0'
mov ah,2
int 21h
add si,4
call jjj
dec xh
cmp xh,0
jl yht2
ret
rank endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
openh proc near ;open the file
mov ah,3dh
mov al,2
mov dx,seg path
mov ds,dx
lea dx,path
int 21h
mov handle,ax
jc y1
ret
y1:
lea dx,error1
mov ah,9
int 21h
ret
openh endp
readh proc near ;read the file
mov ah,3fh
mov bx,handle
mov cx,40
mov dx,seg store
mov ds,dx
lea dx,store
int 21h
jc y2
ret
y2:
lea dx,error2
mov ah,9
int 21h
ret
readh endp
writeh proc near ;write the file
mov ah,40h
mov bx,handle
mov dx,seg store
mov ds,dx
lea dx,store
mov cx,40
int 21h
jc y3
ret
y3:
lea dx,error3
mov ah,9
int 21h
ret
writeh endp
closeh proc near
mov ah,3eh
mov bx,handle
int 21h
ret
closeh endp
crc proc near ;display blank
mov dl,' '
mov ah,2
int 21h
ret
crc endp
jjj proc near
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
ret
jjj endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;
decdiv proc near ;display the score
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al
add dl,30h
mov ah,2
int 21h
ret
decdiv endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; 模块6 鼠标键盘操作 制作:王博;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;由于程序需要,本模块已经内嵌入主程序的主循环段
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -