AmigaExamples/001.simple_image/image.s

69 lines
1.5 KiB
ArmAsm

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"