;; This example shows another way to handle the interrupts by hitting the hardware
;; directly.
;;
;; There are 6 interrupts per screen, one of which is triggered 2 HSYNCs after the start
;; of the VSYNC signal. We can use this to syncronise our interrupts.
;;
;; We first need to synchronise with the VSYNC, we can then enable our interrupts.
;; We now know exactly the order the interrupts will come and we can have 1 function for
;; each.

org &4000

start:
di				;; disable interrupts
im 1			;; Z80 interrupt mode (z80 calls to &0038 for each interrupt)

ld a,&c3	;; Z80 JP instruction
ld hl,int_fn	;; we always call this function for interrupt
ld (&0038),a	;; write JP instruction
ld (&0039),hl	;; write address
ei

;; delay
loop:
jp loop


;;--------------------------------------------------------------------------------------------

;; this is synchronised to happen 2 HSYNCs after VSYNC
int_fn:
push bc
ld b,&f5
in a,(c)
rra
jr nc,int_fn_not_vsync

;; this is the interrupt that has triggered 2 HSYNC after VSYNC
;; VSYNC must be at least 2 lines long for this to be true.

jp int_fn_end


int_fn_not_vsync:
;; int not in vsync

int_fn_end:
pop bc
ei
reti

end