汇编源代码
否是下方向键
jz short @ok ;如果是则继续下落
jmp short @goon ;不是则进入下一次延时
@down: sub bx,2*40 ;恢复新方块原来位置
call @dispb ;显示新方块
xor ax,ax ;进入判断是否有一行已满
mov dx,ax ;ax=dx=0
mov si,2*(40*2+15) ;si=中间空框的起始屏幕偏移位置
@nextl: mov di,si ;di=当前判断的屏幕偏移位置
mov cl,11 ;判断10次(10+1)
repnz scasw ;扫描一行
jz short @skip ;如果有空位则跳出
pusha ;进入消除一行部分
mov si,di
sub si,2*40 ;si=上一行屏幕偏移位置
mov cx,si ;cx=移动字符个数
std
rep movsb ;移下一行
cld
mov di,2*(40*2+15) ;di=中间空框最上一行的屏幕偏移位置
mov cl,10 ;一行10个方块
rep stosw ;清除最上一行
popa ;退出消除一行部分
inc dx ;分数基值+1
add dh,dl ;累计当前分数
@skip: add si,2*40 ;下一行偏移位置
cmp si,2*(40*22) ;判断是否判断完所有行
jb short @nextl ;没有则继续下一行判断
and dx,dx ;判断是否有得到当前的分数
jz short @t_ ;没有则跳过
@t00: mov di,2*(40*23+21) ;数码位屏幕偏移位置(第2位)
@t0: mov byte ptr[di],30h ;置0
dec di ;进一位(倒退2个字节长度)
dec di
cmp di,2*(40*23+20) ;判断是否进入第3位
jnz short @t000 ;如果不是则跳过
dec byte ptr cs:[@goon+1];每100分等待次数减1(加速)
@t000: inc byte ptr[di] ;当前数码位+1
cmp byte ptr[di],3ah ;判断数码位是否超过9
jz short @t0 ;如果是则跳转(进位)
dec dh ;当前分数累计值-1
jnz short @t00 ;如果分数没加完则继续累加
@t_: jmp @rernd ;继续产生下一个新方块
@isok: mov si,bp ;判断是否能放置方块子模块
shl si,2 ;si=方块形状标号*4(占4个字节)
xor ax,ax
mov dx,ax ;ax=dx=0
add si,offset bks ;si=方块形状位置描述指针
push cx ;保存cx
mov cl,4 ;cl=方块数(4)
@nextb: db 2eh ;lod
sb cs: (al<=cs:[si])
lodsb ;载入方块位置描述(位置偏移)
mov di,ax
or dx,[di+bx] ;判断小方块是否冲突
loop @nextb ;继续判断下一个位置描述
pop cx