我需要为 2 名玩家制作轮流游戏。每个玩家每个回合都应该有一个计时器,允许他们在提供的时间内玩(按下一个键)(比如 20 秒,它可以是任何时间)。我怎样才能使 int116h(ah=1) 持续我想要的时间而不是永远?
我试图让程序在调用中断后按我想要的时间“休眠”,但是,就像在中断之后一样,它永远不会停止。之后我尝试循环 N 次,最后它睡了 1 秒,但它仍然在输入中断之后,所以它永远不会循环。
我想要计时的代码片段:
GET_INPUT PROC FAR
MOV AH, 1
MOV SI, TURN
INT 16H
MOV INPUT[SI], AL
GET_INPUT ENDP
GET_INPUT PROC FAR MOV AH, 1 MOV SI, TURN INT 16H MOV INPUT[SI], AL GET_INPUT ENDP
mov ah, 1
与 int 16h
相邻。那个mov si, TURN
看起来很不合适。对于轮到玩家的超时,您可以使用几个嵌套循环,就像我在下面的代码片段中写的那样。
GET_INPUT PROC FAR
;; push ...
mov bx, 364 ; Timeout of 20 seconds == 18.2 * 20 ticks
OuterLoop:
mov ah, 00h ; BIOS.GetTickCount
int 1Ah ; -> CX:DX
mov si, dx ; New reference tick
InnerLoop:
mov ah, 01h ; BIOS.CheckKeystroke
int 16h ; -> AX ZF
jnz GotKey
mov ah, 00h ; BIOS.GetTickCount
int 1Ah ; -> CX:DX
cmp dx, si ; Compare current tick with the reference tick
je InnerLoop ; While not changed, stay in the inner loop
dec bx
jnz OuterLoop ; Go get a new reference (*)
xor ax, ax ; Returning 0 for 'no key pressed'
jmp Done
GotKey:
mov ah, 00h ; BIOS.GetKeystroke (removes the key from the buffer)
int 16h ; -> AX
Done:
mov bx, TURN
mov INPUT[bx], ax
;; pop ...
GET_INPUT ENDP
xor TURN, 2
GET_INPUT ENDP