1
0
mirror of https://frontier.innolan.net/github/AmigaExamples.git synced 2025-11-24 00:47:13 +00:00
Files
AmigaExamples/018.vert_scroll/vert_scroll.s
2016-03-20 21:11:56 +11:00

92 lines
1.5 KiB
ArmAsm

include "../include/registers.i"
include "hardware/dmabits.i"
include "hardware/intbits.i"
include "constants.i"
entry:
lea CUSTOM,a6
bsr init
.mainLoop:
bsr waitVerticalBlank
bsr scrollPlayfield
bra .mainLoop
scrollPlayfield:
movem.l d0-a6,-(sp)
move.l vpos,d0
lea copper(pc),a0
bsr pokeBitplanePointers
cmp.l #1,directionUp
beq .up
add.l #SCROLL_SPEED*SCREEN_WIDTH_BYTES*SCREEN_BIT_DEPTH,vpos
cmp.l #SCREEN_WIDTH_BYTES*SCREEN_BIT_DEPTH*256,vpos
bge .switchToUp
bra .done
.switchToUp:
move.l #1,directionUp
move.l #SCREEN_WIDTH_BYTES*SCREEN_BIT_DEPTH*256,vpos
bra .done
.up:
sub.l #SCROLL_SPEED*SCREEN_WIDTH_BYTES*SCREEN_BIT_DEPTH,vpos
cmp.l #0,vpos
ble .switchToDown
bra .done
.switchToDown:
move.l #0,directionUp
move.l #0,vpos
bra .done
.done:
movem.l (sp)+,d0-a6
rts
include "init.s"
include "utils.s"
pokeBitplanePointers:
;; d0 = scroll offset
;; a0 = BPLP copper list address
movem.l d0-a6,-(sp)
lea bitplanes(pc),a1
add.l d0,a1
moveq #SCREEN_BIT_DEPTH-1,d0
.bitplaneloop:
move.l a1,d1
move.w d1,2(a0)
swap d1
move.w d1,6(a0)
lea SCREEN_WIDTH_BYTES(a1),a1
addq #8,a0
dbra d0,.bitplaneloop
movem.l (sp)+,d0-a6
rts
installColorPalette:
include "out/image-palette.s"
rts
vpos:
dc.l 0
directionUp:
dc.l 0
copper:
;; bitplane pointers must be first else poking addresses will be incorrect
dc.w BPL1PTL,0
dc.w BPL1PTH,0
dc.w BPL2PTL,0
dc.w BPL2PTH,0
dc.w BPL3PTL,0
dc.w BPL3PTH,0
dc.w BPL4PTL,0
dc.w BPL4PTH,0
dc.w BPL5PTL,0
dc.w BPL5PTH,0
dc.l $fffffffe
bitplanes:
incbin "out/image.bin"