*
*  VBL based abort handler for ORIGAMI
*  if installed: calls function ori_abort when both SHIFT keys
*  are pressed
*
*  (C) 1991 by M. Schwingen - public domain
*

      EXPORT vbl_enable,vbl_disable
      IMPORT ori_abort
      
      TEXT

vbl_enable:
      movem.l d1/a0,-(sp)
* get OS version, determine address of KBSHIFT value
      movea.l $04F2,a0            ; SYSHDR
      move.l  $24(a0),kbshift_adr ; Kbshift value
      cmpi.w  #$0100,$02(a0)      ; OS-version = 1.0 ?
      bne     vbl_enab2
      move.l  #$0E1B,kbshift_adr  ; KBSHIFT addr. for OS 1.0
vbl_enab2:
      move.w  $0454,d0
      movea.l $0456,a0
      subq.w  #1,d0
      move.w  d0,d1
      asl.w   #2,d0
      adda.w  d0,a0               ; A0 = last vbl vector

test_vbl:
      tst.l   (a0)
      beq     found_vbl           ; found empty VBL slot - install our routine
      subq.w  #4,a0
      dbra    d1,test_vbl
* no empty VBL slot found - abort
      moveq   #0,d0               ; return 0 = no success
      move.w  #-1,vbl_nr          ; means we are not installed
      movem.l (sp)+,d1/a0
      rts

found_vbl:
      move.w  d1,vbl_nr
      move.l  #vbl_handler,(a0)
      moveq   #1,d0               ; return 1 = success
      movem.l (sp)+,d1/a0
      rts


vbl_disable:
      move.l  a0,-(sp)
      movea.l $0456,a0            ; ptr. to VBL slot list
      move.w  vbl_nr,d0           ; our VBL slot nr.
      bmi     disable_vbl2        ; abort if not installed
      asl.w   #2,d0
      clr.l   0(a0,d0.w)          ; clear VBL slot
      move.w  #-1,vbl_nr          ; means we are not installed
disable_vbl2:
      movea.l (sp)+,a0
      rts

vbl_handler:
      movem.l d0/a0,-(sp)
;  eor.w #1,$ffff8240
      movea.l kbshift_adr,a0
      move.b  (a0),d0             ; get SHIFT key status
      and.b   #3,d0
      cmp.b   #3,d0               ; both pressed ?
      bne     vbl_handler2
      movem.l d1-d7/a1-a6,-(sp)
      jsr     ori_abort           ; call ORIGAMI abort routine
      movem.l (sp)+,d1-d7/a1-a6
vbl_handler2:
      movem.l (sp)+,d0/a0
      rts


      DATA
vbl_nr:
      DC.W -1
kbshift_adr:
      DC.L 0

