;; 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