mov ah,01h int16h,如何使用它来改变蛇的方向

.model small
.data
var db  '@', '$'

delaytime db 10
total db 0
col db 40
row db 12
.stack 100h
.code
delay proc
    mov ah, 00
    int 1Ah
    mov bx, dx

jmp_delay:
    int 1Ah
    sub dx, bx
    cmp dl, delaytime
    jl jmp_delay
    ret

delay endp

lefty proc
dec col
cmp col, 0
jle sn

leftyie:
mov dl , col
mov dh , row
xor bh, bh
mov ah, 02h
int 10h
ret 

sn:
mov col, 79
jmp leftyie
lefty endp



righty proc
inc col
cmp col,79
jg zero

rightyie:
mov dl,col
mov dh,row
xor bh, bh
mov ah, 02h
int 10h
ret 

zero: 
mov col,0
jmp rightyie
righty endp



upy proc
dec row
cmp row, 0
jl upzero

uptie:
mov dl,col
mov dh,row
xor bh, bh
mov ah, 02h
ret

upzero:
mov row,24
jmp uptie

upy endp


downy proc
inc row
cmp row, 24
jg gozero

downty: 
mov dl,col
mov dh,row
xor bh, bh
 mov ah, 02h
int 10h
ret 

gozero:
mov row,0
jmp downty
downy endp

video proc
mov al, 03h ;set video mode
  mov ah, 00h
  int 10h
  ret
 video endp

start proc
     ;starting coordinates
   mov dh, 12 ;row
   mov dl, 40 ;column
   xor bh, bh
   mov ah, 02h
   int 10h 
   ret
start endp

dashclear proc
mov ax, 0600h
mov bh, 07h
xor cx, cx
mov dx, 184fh
int 10h
ret
dashclear endp

getchar proc
mov ah, 00h
int 16h
ret
getchar endp


main  proc
mov ax, @data
mov ds, ax


 call video
 call start
   mov dx, offset var
   mov ah, 09h
       int 21h


 mov cx, 3200h  ;stop cursor blinking
 mov ah, 01h
 int 10h

call start
getinput:

call getchar ;get character


direct_change:
cmp ah, 72
je w 
cmp ah, 80
je s 
cmp ah, 75
je a 
cmp ah, 77
je d

cmp al, 119
je w 
cmp al, 115
je s 
cmp al, 97
je a 
cmp al, 100
je d

cmp al, 119
jne rak 
cmp al, 115
jne rak
cmp al, 97
jne rak 
cmp al, 100
jne rak


a:
call delay
call dashclear
call lefty
mov dx, offset var
mov ah, 09h
int 21h



jmp a


s:
call delay
call dashclear
call downy
mov dx, offset var
mov ah, 09h
int 21h

jmp s


d:
call delay
call dashclear

call righty
mov dx, offset var
mov ah, 09h
int 21h

jmp d


w:
call delay
call dashclear

call upy
int 10h
mov dx, offset var
mov ah, 09h
int 21h

jmp w

rak:
jmp getinput

main endp
end main

我有这个代码,使用w,a,s,d移动单个字符我该如何使用mov ah,01h int16h,这样我可以移动字符而字符自己移动,如果我不按任何键来改变它的方向。

我在想,应该有一个定时器,当定时器结束时,用户没有按下任何字符应该继续按下最后一个键的方向,如果用户按下了任何控制按钮,它应该改变方向


我在想,应该有一个定时器,当定时器结束时,用户没有按下任何字符应该继续按下最后一个键的方向,如果用户按下了任何控制按钮,它应该改变方向

这正是要走的路。 例如,您的角色会更新其位置,例如,在系统计时器的每个记号上。 如果在兼容PC(或仿真器)的PC上为实模式MS DOS编程,我假设您正在执行此操作,您可以等到使用HLT指令发生中断为止。 但是,不要发布任何CLI指令,否则您的程序将永远停留在HLT指令中。

Do forever
  HLT  ;waits until an interrupt triggers. Usually, every 55ms on IBM PC
  if key pressed
    update direction
  EndIf
  Update character
EndDo
链接地址: http://www.djcxy.com/p/62699.html

上一篇: mov ah,01h int16h, how to use it to change the direction of the snake

下一篇: Using Jump and Compare in Assembly Language