汇编源代码
循环等待次数
jae short @wait ;确认cl不小于40
mov cl,40h
@wait: call @dispb ;显示当前新方块
push cx ;进入等待状态
xor cx,cx ;cx=等待时间(微秒)低字
mov dx,1000 ;dx=等待时间(微秒)高字
mov ah,86h
int 15h ;等待
pop cx ;退出等待状态
@t4: mov ah,1
int 16h ;判断键盘缓冲区是否有字符
jz short @loop ;没有按键则跳出键盘处理部分
xor ax,ax
call @disp ;清除新方块的显示
int 16h ;读取键盘缓冲区字符=>ah
mov al,ah ;al=ah
cmp al,$up ;判断是否是上方向键
jnz short @k1 ;不是则跳转
push bp ;保存当前新方块的摆放形状
movzx bp,cs:[bp+bkv] ;改变新方块的摆放形状
call @isok ;判断是否能放置
jz short @loop_ ;能放置则跳出键盘处理部分
pop bp ;不能放置则恢复新方块原来形状
loop @wait ;继续下一次等待
@k1: push bx ;保存当前新方块的位置
cmp al,$left ;判断是否是左方向键
jnz short @k2 ;不是则跳转
dec bx ;新方块左移一个位置(2个字节)
dec bx
@test: call @isok ;判断是否能放置
jz short @loop_ ;能放置则跳出键盘处理部分
pop bx ;不能放置则恢复新方块原来位置
loop @wait ;继续下一次等待
@k2: cmp al,$right ;判断是否是右方向键
jnz short @k3 ;不是则跳转
inc bx ;新方块右移一个位置(2个字节)
inc bx
jmp short @test ;剩下的处理同"左方向键"
@k3: pop bx ;恢复新方块原来位置
cmp al,1 ;判断是否是ESC键
jz short @end ;如果是则跳转到退出程序段
jmp short @ok ;如果是其他按键则跳出延时状态
@loop_: pop ax ;清除保存的新方块位置
@loop: loop @wait ;继续下一次等待
@ok: push ax ;保存按键扫描码
xor ax,ax ;延时过后进入方块下落部分
call @disp ;清除新方块的显示
add b
x,2*40 ;新方块下移一个位置(2个字节)
call @isok ;判断是否能放置
pop ax ;恢复按键扫描码
jnz short @down ;如果不能放置新方块则跳转
cmp al,$down ;判断是