어셈블리에서 애니메이션을 처리하려고합니다. 아래 코드에서 move_object는 객체를 움직이게하고 move_arrow는 다른 객체를 움직입니다. 그러나 문제는 둘 다 동일한 타이머 기능을 사용합니다 (실제로 작동하는 방식을 이해하지 못했지만 소스에서 복사했습니다.) 두 경우 모두 정상적으로 실행됩니다. 하지만 내가하고 싶은 것은 객체가 시작부터 애니메이션을 유지할 것이지만 화살표는 사용자가 특정 키를 누를 때까지 기다릴 것입니다. 사용자가 해당 키를 누르면 화살표가 시작됩니다. 하지만 내가 키보드 누름 (MOV AH, 0 INT 16H)에 대한 인터럽트 기능을 호출 할 때마다 프로그램이 멈추고 사용자가 키를 누를 때까지 기다립니다. 그러나 나는 그 시간에 여전히 움직이기 위해 반대하는 이전의 것을 갖고 싶다. 하지만 아무리해도 코드를 작성하면 코드가 중단되고 다른 줄이 실행되지 않는 것처럼 보입니다. 아래 코드는 내 코드 조각입니다.애니메이션이 어셈블리에서 인터럽트 호출로 인해 중지됨
; dont know how it works , just know that it works as a timer :D
TIMER_TICK PROC
PUSH DS ; SAVE DS
PUSH AX
MOV AX,SEG TIMER_FLAG ; GET SEGMENT OF FLAG
MOV DS,AX ; PUT IN DS
MOV TIMER_FLAG,1 ; SET FLAG
; RESTORE REGISTER
POP AX
POP DS
IRET ; IT IS DIFFERENT FROM "RET". IF WE USE "IRET" THEN
; IF WILL REMAIN 1 WHICH MEANS IT CAN BE INTERRUPT AGAIN
TIMER_TICK ENDP
;; other codes
;WAIT FOR TIMER TICK BEFORE MOVING THE OBJECT
TT:
CMP TIMER_FLAG,1 ; TIMER TICKED?
JNE TT ; NO , KEEP TESTING
MOV TIMER_FLAG,0 ; YES, CLEAR FLAG
CMP LAP,1 ; CHECKS IF ARROW HAVE FINISHED CROSSING
JE GAME
CALL MOVE_OBJECT ;animates the object to a new position
CMP KEY,0
JNE CONT
MOV AH,0
INT 16H ;**whole program gets halted here untill user presses a key**
OR AL,AL
JNE EXIT
CMP AH,3BH
JNE GAME
MOV KEY,1
CONT:
; CHECK FOR KEYBOARD
CALL MOVE_ARROW ;animates the object in a new position
; DELAY 1 TIMER CLICK
TT2:
CMP TIMER_FLAG,1 ; TIMER TICKED?
JNE TT2 ; NO , KEEP TESTING
MOV TIMER_FLAG,0 ; YES , CLEAR FLAG
JMP TT ; GO GET NEXT OBJECT POSITION
;; other codes