    ;; This example shows how Z80 interrupt mode 2 can be used
    ;; on the CPC and KC Compact.
    ;;
    ;; This code is compatible with the CPC+, and will function
    ;; the same if standard raster interrupts are used.
    ;;
    ;; The hardware of the CPC and KC Compact does not generate
    ;; a interrupt vector to be used with Z80 mode 2. The 8-bit
    ;; vector read from the bus, when the interrupt is acknowledged,
    ;; can't be guaranteed.
    ;;
    ;; This example shows how the standard raster interrupts
    ;; can be used safely with this mode. The program will
    ;; continue to function correct even if a device is connected
    ;; which does generate a 8-bit vector as long as the device
    ;; is not activated.
    ;;
    ;; (c) Kevin Thacker, 2001-2002
    ;;
    ;; This source is released under the GNU Public License v2.

    org &4000
    nolist

    ;;------------------------------------------------------------
    ;; Setup interrupt handler - required

    ;; disable interrupts
    di

    ;; set interrupt mode 2
    im 2

    ;; set I register. This is the most significant byte
    ;; of the address of the interrupt handler table and forms
    ;; bit 15..8 of the lookup address.
    ;; the table will cover &8000-&8100 inclusive.
    ld a,&80
    ld i,a

    ;; setup interrupt vector table
    ;;
    ;; as proved, bits 15..8 of the interrupt handler must
    ;; be the same as bits 7..0. Therefore the table is
    ;; filled with a single byte. In this example this is &81.
    ;;
    ;; the interrupt handler in this example is at &8181.
    ld hl,&8000
    ld e,l
    ld d,h
    inc de
    ld (hl),&81
    ld bc,257       ;; 257 because of the case where 8-bit vector is &FF.
                    ;; (interrupt handler will be formed from
                    ;; bytes at &80FF and &8100).
    ldir

    ;; this is not necessary if the interrupt handler
    ;; is located at &8181, but this is included to make this
    ;; example complete.

    ld a,&c3				;; JP instruction
    ld hl,interrupt_handler	;; interrupt handler location
    ld (&8181),a			;; poke JP instruction
    ld (&8182),hl

    ;; enable interrupts
    ei

    ;;----------------------------------------------------
    ;; the following code has been added so that the example will
    ;; assemble and function. This code is optional. You can
    ;; replace this with your own code.
    ;;
    ;;
    ;; This code will change the colour of pen 0 at each
    ;; interrupt. The result is thick horizontal bars
    ;; of colour.
    ;;

    ;; select pen 0
    ld bc,&7f00
    out (c),c

    .main_loop
    ;; wait for start of vsync
    ld b,&f5
    .ml
    in a,(c)
    rra
    jr nc,ml

    ;; wait for interrupt
    halt
    ;; set pen 0 to "Blue"
    ld bc,&7f44
    out (c),c

    ;; wait for interrupt
    halt
    ;; set pen 0 to "Bright Blue"
    ld bc,&7f55
    out (c),c

    ;; wait for interrupt
    halt
    ;; set pen 0 to "Sky Blue"
    ld bc,&7f57
    out (c),c

    ;; wait for interrupt
    halt
    ;; set pen 0 to "Pastel Cyan"
    ld bc,&7f5b
    out (c),c

    ;; wait for interrupt
    halt
    ;; set pen 0 to "Pastel yellow"
    ld bc,&7f43
    out (c),c

    ;; wait for interrupt
    halt
    ;; set pen 0 to "Bright while"
    ld bc,&7f4b
    out (c),c

    jp main_loop

    ;;----------------------------------------------------
    ;; the interrupt handler - required

    .interrupt_handler
    ei                  ;; re-enable interrupts
    reti                ;; reti is required if interrupt mode 2 is used. This
                        ;; is a safety measure because some devices will
                        ;; monitor the z80 databus for this instruction
                        ;; and will not operate correctly if it is not present.
                        ;; Although this program assumes that these devices
                        ;; are not being used