📄 rossq.asm
字号:
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 + -