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

📄 rossq.asm

📁 用汇编实现俄罗斯方块游戏
💻 ASM
📖 第 1 页 / 共 2 页
字号:
cdos macro k
mov ah,k
int 21h
endm;.....................宏
 
crlf macro
mov dl,0dh
cdos 2
mov dl,0ah
cdos 2
endm;...................................宏

sta segment para stack
dw 200h dup(?)
sta ends;...............................................堆栈结束

data segment;...........................数据开始
color db ?
squ dw 8 dup(?)
temshape db ?
nextp db 8 dup(?)
speed db ?
speedf db ?
timer db ?
scotable db 6 dup(0)
scnum db 0
roxy db 2 dup(?)
tempxy db 8 dup(?)
litp db 2 dup(?)
litclr db ?
xy db 8 dup(?)
next db,0
state db 200 dup(0)
exitp db 0
right db ?
left db ?
lrotate db ?
rrotate db ?
shape db 0
datanum dw $-color

exist db ?
fail db ?
handle dw ?
rotable db 1,-1,0,-1,-1,-1,1,0,0,0,-1,0,1,1,0,1,-1,1
path db 'C:\ross.txt',00
str7 db 'continue the old game?(y/n):$'
str8 db 'you must start a new game!',13,10,'$'
str5 db 'reset timer:(max 99)$'
str2 db 'reset left key:$'
str3 db 'reset lrotate key:$'
str4 db 'reset rrotate key:$'
str6 db 'set speed up key:$'
str1 db 'reset right key:$'
startp dw 70
scodisp dw sc0,sc1,sc2,sc3,sc4,sc5,sc6,sc7,sc8,sc9
betable dw be0,be1,be2,be3,be4,be5,be6
nbetable dw nbe0,nbe1,nbe2,nbe3,nbe4,nbe5,nbe6
mark db 10,30,80,150
data ends;..........................................数据段.

code segment;..........................................................代码段
main proc far
assume cs:code,ds:data,ss:sta
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
mov ax,0a000h
mov es,ax
lea dx,str7
cdos 9
cdos 1
cmp al,'y'
jnz moloop
call readd
cmp exist,0ffh
jnz moloop1
call init
call score
call restore
call nbegin
cdos 7
jmp pmovep
moloop1:crlf
mov dx,offset str8
cdos 9

moloop:crlf
lea dx,str1
cdos 9
cdos 1
mov right,al
crlf
lea dx,str2
cdos 9
cdos 1
mov left,al
crlf
lea dx,str3
cdos 9
cdos 1
mov lrotate,al
crlf
lea dx,str4
cdos 9 
cdos 1
mov rrotate,al
crlf
lea dx,str6
cdos 9 
cdos 1
mov speedf,al
crlf
lea dx,str5
cdos 9 
cdos 1
sub al,30
mov dl,al
cdos 1
cmp al,0dh
jz timeloop
sub al,30
mov bl,al
mov al,10
mul dl
add al,bl
mov timer,al
jmp timenext
timeloop:mov timer,dl


timenext:
call init 
call score
call rand
mloop1:mov next,0
mov al,temshape
mov shape,al
call begin
call rand
call nbegin
mloop:mov exitp,0
call delay
cmp exitp,0ffh
jz mexit
pmovep:call movep
cmp next,0ffh
jz mloop1
jmp mloop


 mexit:
ret
main endp;..............................................主程结束.

restore proc near;.......................................恢复子程
mov dl,10
mov bx,0
mov cx,200
mov litclr,0fh
resloop1:cmp state[bx],0
jz resloop
mov ax,bx
div dl
mov litp[0],al
mov litp[1],ah
call draw
resloop:
inc bx
loop resloop1
mov color,0fh
call disp
ret
restore endp

 
init proc near
mov ah,0
mov al,13h
int 10h
mov bx,startp
mov ax,17
mov cx,93
mov dx,320
mul dx
add bx,ax
mov al,04h
loop2: 
mov es:[bx],al
inc bx 
loop loop2
add bx,227
mov cx,182
loop1:
mov es:[bx],al
add bx,92
mov es:[bx],al
add bx,228
loop loop1
ret
init endp;..............................................初始化结束.

      
rand proc near;.............改为near
push ax
push dx
mov al,36h
out 43h,al
nop
in al,40h
nop
mov ah,0
mov dl,7
div dl
mov temshape,ah
pop dx
pop ax
ret
rand endp;...........................随机数结束.

readd proc near;.........................................从硬盘读出数据
mov ah,3dh
lea dx,path
mov al,0
int 21h
jnc read
mov exist,0
jmp rend
read:mov handle,ax
mov bx,handle
mov ah,3fh
mov cx,datanum
lea dx,color
int 21h
jnc read1
mov exist,0
jmp rend
read1:mov bx,handle
mov ah,3eh
int 21h
jnc read2
mov exist,0
jmp rend
read2:mov exist,0ffh
rend:ret
readd endp

delay proc near;.............改为near
push bx
push ax
push dx
push cx
cmp speed,0ffh
jz dexit1
mov bl,timer
mov bh,0;......................改变延时参数.
looop:mov dx,04ffh
lloop2:mov cx,05fh
push bx
push cx
push dx
mov bx,0
mov ax,5
int 33h
test bx,1
jnz mouloop
mov bx,1
 mov ax,5
   int 33h
test bx,1
jz key 
 pop dx
pop cx
pop bx
 jmp mouexit
 mouloop:
            mov ah,7
                int 21h
                cmp al,20h
                jz key
               cmp al,1bh
                 jnz mouloop
           pop dx
pop cx
pop bx
jmp back


              key:  pop dx
pop cx
pop bx
mov ah,0bh

                int 21h
                inc al
                jz dloop
here:loop here
             dec dx
             jnz lloop2
             dec bx
              jnz looop
             jmp dexit
dloop:mov ah,7
          int 21h
          cmp al,20h
          jnz dloop1
 dloop3:mov ah,7
                int 21h
                cmp al,20h
                jz here
               cmp al,1bh
               jz mouexit
             cmp al,'z'
            jnz dloop3
               call save
            cmp fail,0ffh
             jz dloop3
                  
  mouexit:       jmp back
dexit1:jmp dexit
dloop1:mov ah,right
              cmp al,ah
              jnz dloop4
              call mright
                 jmp here
dloop4:mov ah,left
          cmp al,ah
          jnz dloop5
              call mleft
       jmp here
 dloop5:mov ah,rrotate
                  cmp al,ah
             jnz dloop6
             call mrrotate
              jmp here
dloop6:mov ah,lrotate
               cmp al,ah 
             jnz dloop7
                  call mlrotate
                jmp here
     dloop7:cmp al,1bh
              jnz dloop8
            jmp back
dloop8:cmp al,speedf

           jnz here
         mov speed,0ffh
             jmp dexit
 back:mov exitp,0ffh
dexit:
pop cx
pop dx
pop ax
pop bx
ret
delay endp;............................延时结束

save proc near;......................................数据存进硬盘
mov ah,3ch
mov cx,2
lea dx,path
int 21h
jc nosave
mov handle,ax
mov bx,handle
lea dx,color
mov cx,datanum
mov ah,40h
int 21h
jc nosave
mov bx,handle
mov ah,03eh
int 21h
jc nosave
mov fail,0
jmp savend
nosave:mov fail,0ffh
savend:ret
save endp


begin proc near;......................................................开始子程
push bx
push ax
mov bl,shape
shl bl,1
mov bh,0
jmp betable[bx]
be0:
mov xy[0],0
mov xy[1],4
mov xy[2],0
mov xy[3],5
mov xy[4],1
mov xy[5],4
mov xy[6],1
mov xy[7],5
call cacul
jmp   beexit
be1:
mov xy[0],0
mov xy[1],3
mov xy[2],0
mov xy[3],4
mov xy[4],0
mov xy[5],5
mov xy[6],0
mov xy[7],6
call cacul
jmp beexit
be2:
mov xy[0],0
mov xy[1],4
mov xy[2],0
mov xy[3],5
mov xy[4],0
mov xy[5],6
mov xy[6],1
mov xy[7],5
call cacul
jmp beexit
be3:
mov xy[0],0
mov xy[1],4
mov xy[2],0
mov xy[3],5
mov xy[4],1
mov xy[5],5
mov xy[6],1
mov xy[7],6
call cacul
jmp beexit
be4:
mov xy[0],0
mov xy[1],6
mov xy[2],0
mov xy[3],5
mov xy[4],1
mov xy[5],4
mov xy[6],1
mov xy[7],5
call cacul
jmp beexit
be5:
mov xy[0],0
mov xy[1],4
mov xy[2],0
mov xy[3],5
mov xy[4],0
mov xy[5],6
mov xy[6],1
mov xy[7],6
call cacul
jmp beexit
be6:
mov xy[0],0
mov xy[1],4
mov xy[2],0
mov xy[3],5
mov xy[4],0
mov xy[5],6
mov xy[6],1
mov xy[7],4
call cacul
mov color,0fh
beexit:call disp
pop ax
pop bx
ret
begin endp;........................................................开始程序结束

nbegin proc near;......................................................下一个开始子程
push bx
push ax
push cx
mov litclr,0
mov cx,4
mov bx,0ffffh
nbloop1:inc bx
mov al,nextp[bx]
mov litp,al
inc bx
mov al,nextp[bx]
mov litp[1],al
call draw
loop nbloop1

mov bl,temshape
shl bl,1
mov bh,0
jmp nbetable[bx]
nbe0:
mov nextp[0],5
mov nextp[1],15
mov nextp[2],5
mov nextp[3],16
mov nextp[4],6
mov nextp[5],15
mov nextp[6],6
mov nextp[7],16
jmp   nbeexit
nbe1:
mov nextp[0],5
mov nextp[1],15
mov nextp[2],5
mov nextp[3],16
mov nextp[4],5
mov nextp[5],17
mov nextp[6],5
mov nextp[7],18
jmp nbeexit
nbe2:
mov nextp[0],5
mov nextp[1],15
mov nextp[2],5
mov nextp[3],16
mov nextp[4],5
mov nextp[5],17
mov nextp[6],6
mov nextp[7],16
jmp nbeexit
nbe3:
mov nextp[0],5
mov nextp[1],15
mov nextp[2],5
mov nextp[3],16
mov nextp[4],6
mov nextp[5],16
mov nextp[6],6
mov nextp[7],17
jmp nbeexit
nbe4:
mov nextp[0],5
mov nextp[1],17
mov nextp[2],5
mov nextp[3],16
mov nextp[4],6
mov nextp[5],15
mov nextp[6],6
mov nextp[7],16
jmp nbeexit
nbe5:
mov nextp[0],5
mov nextp[1],15
mov nextp[2],5
mov nextp[3],16
mov nextp[4],5
mov nextp[5],17
mov nextp[6],6
mov nextp[7],17
jmp nbeexit
nbe6:
mov nextp[0],5
mov nextp[1],15
mov nextp[2],5
mov nextp[3],16
mov nextp[4],5
mov nextp[5],17
mov nextp[6],6
mov nextp[7],15
nbeexit:mov litclr,0fh
mov cx,4
mov bx,0ffffh
nbloop:inc bx
mov al,nextp[bx]
mov litp,al
inc bx
mov al,nextp[bx]
mov litp[1],al
call draw
loop nbloop
pop cx
pop ax
pop bx
ret
nbegin endp;........................................................开始程序结束


disp proc near;..............显示子程
                     push ax
                     push bx
                     push cx
                     push dx
                     push di
                     push si
                     mov si,4
                     mov bx,0fffeh
beloop1:add bx,2
            mov ax,320
            mov di,squ[bx]
            add bx,2
            mul di
            mov di,ax
            add di,squ[bx]
            mov dx,8
beloop:mov cx,8
            mov al,color
               cld
              rep stosb
               add di,312
               dec dx
               jnz beloop
                dec si
             jnz beloop1
pop si
pop di
pop dx
pop cx
pop bx
pop ax 
ret 
disp endp;..................................................显示结束

draw proc near;......................................................小显示.
push ax
push bx
push cx
push dx
push di
mov bx,8
mov al,litp[0]
mov cl,litp[1]
mov ch,9
mul ch
add al,19
xchg al,cl
mul ch
add al,72
adc ah,0
mov ch,0
xchg ax,cx
mov dx,320
mul dx
add ax,cx
mov di,ax
litloop:cld
mov al,litclr
mov cx,8
rep stosb
add di,312
dec bx
jnz litloop
pop di
pop dx
pop cx
pop bx
pop ax
ret 
draw endp

mleft proc near;......................................左移
local num:word
push dx
push di
push ax
push bx
push cx
push si
mov cx,4
mov bx,0fffeh
mleloop1:add bx,4
mov ax,squ[bx]
cmp ax,80
jbe mleexit
loop mleloop1
mov cx,4
mov bx,0ffffh
mov si,10
mleloop2:add bx,1
mov al,xy[bx]
mov ah,0
add bx,1
mul si
mov dl,xy[bx]
mov dh,0
sub dx,1
add ax,dx
mov di,ax
mov al,state[di]
cmp al,0ffh
jz mleexit
loop mleloop2
mov color,0
call disp
mov cx,4
mov bx,0fffeh
mleloop3:add bx,4
shr bx,1
dec xy[bx]
shl bx,1
loop mleloop3
call cacul
mov color,0fh
call disp
mleexit:pop si
pop cx
pop bx
pop ax
pop di
pop dx
ret
mleft endp;..................................左移子程结束


mright proc near;..........................右移
local rnum:word
push dx
push di
push ax
push bx
push cx
push si
mov cx,4
mov bx,0fffeh
mriloop1:add bx,4
mov ax,squ[bx]
cmp ax,152
jae mriexit
loop mriloop1
mov cx,4
mov bx,0ffffh
mov si,10
mriloop2:add bx,1
mov al,xy[bx]
mov ah,0
add bx,1
mul si
mov dl,xy[bx]
mov dh,0
add dx,1
add ax,dx
mov di,ax
mov al,state[di]
cmp al,0ffh
jz mriexit
loop mriloop2
mov color,0
call disp
mov cx,4
mov bx,0fffeh
mriloop3:add bx,4
shr bx,1
inc xy[bx]
shl bx,1
loop mriloop3
call cacul
mov color,0fh
call disp
mriexit:pop si
pop cx
pop bx
pop ax
pop di
pop dx
ret
mright endp



movep proc near;..........................下移
local mnum:word
push dx
push di

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -