2014-11-09 4 views
0

어셈블리에서 애니메이션을 처리하려고합니다. 아래 코드에서 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 

답변

0

사용중인 BIOS 기능은 실제로 키보드에서 키를 사용할 수있을 때까지 중단됩니다. 그것은 그렇게 작동하도록되어 있습니다.
함수 1을 대신 사용해보십시오. 이 키는 즉시 반환되고 키가 대기중인 경우 제로 플래그 ZF를 통해보고합니다. 그래서 ZF = 1이면 아마 TT로 돌아갈 것입니다.

mov ah,1 
int 16h 
jz TT 
mov ah,0 
int 16h 
0

int 16h에 ah = 1 함수를 사용하십시오. ah = 0을 사용했다면, 함수 ah = 1이 호출 될 때까지 키가 눌려지면, ZF가 설정되고 AX는 설정 될 값을 포함합니다. 그렇지 않으면 키를 누르지 않으면 ZF가 설정되지 않고 AX에 유용한 값이 포함되지 않습니다. 주의 : 함수 ah = 1을 사용한다면, 키가 눌려 졌을 때, 함수 ah = 0을 사용해야 만합니다. 그렇지 않으면 키 버퍼가 변경되지 않습니다.

관련 문제