include "../include/registers.i" include "hardware/dmabits.i" include "hardware/intbits.i" LVL3_INT_VECTOR equ $6c SCREEN_WIDTH_BYTES equ (320/8) SCREEN_BIT_DEPTH equ 5 entry: lea level3InterruptHandler(pc),a3 move.l a3,LVL3_INT_VECTOR ;; install copper list and enable DMA lea CUSTOM,a1 lea copper(pc),a0 move.l a0,COP1LC(a1) move.w COPJMP1(a1),d0 move.w #(DMAF_SETCLR!DMAF_COPPER!DMAF_RASTER!DMAF_MASTER),dmacon(a1) .mainLoop: bra.b .mainLoop level3InterruptHandler: movem.l d0-a6,-(sp) .checkVerticalBlank: lea CUSTOM,a5 move.w INTREQR(a5),d0 and.w #INTF_VERTB,d0 beq.s .checkCopper .verticalBlank: move.w #INTF_VERTB,INTREQ(a5) ; clear interrupt bit .resetBitplanePointers: lea bitplanes(pc),a1 lea BPL1PTH(a5),a2 moveq #SCREEN_BIT_DEPTH-1,d0 .bitplaneloop: move.l a1,(a2) lea SCREEN_WIDTH_BYTES(a1),a1 ; bit plane data is interleaved addq #4,a2 dbra d0,.bitplaneloop .checkCopper: lea CUSTOM,a5 move.w INTREQR(a5),d0 and.w #INTF_COPER,d0 beq.s .interruptComplete .copperInterrupt: move.w #INTF_COPER,INTREQ(a5) ; clear interrupt bit .interruptComplete: movem.l (sp)+,d0-a6 rte copper: dc.w DIWSTRT,$2c81 dc.w DIWSTOP,$2cc1 dc.w BPLCON0,(SCREEN_BIT_DEPTH<<12)|$200 ; set color depth and enable COLOR dc.w BPL1MOD,SCREEN_WIDTH_BYTES*SCREEN_BIT_DEPTH-SCREEN_WIDTH_BYTES dc.w BPL2MOD,SCREEN_WIDTH_BYTES*SCREEN_BIT_DEPTH-SCREEN_WIDTH_BYTES include "out/image-copper-list.s" dc.l $fffffffe bitplanes: incbin "out/image.bin"