在 TASM 8086 中获取输入的计时器

问题描述 投票:0回答:1

我需要为 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
assembly input timer x86-16 tasm
1个回答
0
投票
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
    看起来很不合适。
  • 此 BIOS 功能仅 checks 击键。击键保留在键盘缓冲区中,该缓冲区很快就会被填满。

对于轮到玩家的超时,您可以使用几个嵌套循环,就像我在下面的代码片段中写的那样。

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
  • (*) 大多数情况下,新参考仅比先前参考多 1,但在午夜前后并非如此。
  • 此代码现在使用 AX、BX、CX、DX 和 SI。如有必要,请保留不应修改的内容。
  • 我认为这段代码是您应该切换播放器的正确位置。例如。如果 TURN 是 0 或 2(基于您存储的 AX),您可以:
 xor  TURN, 2
GET_INPUT ENDP
© www.soinside.com 2019 - 2024. All rights reserved.