Files
AmigaExamples/023.slideshow/slideshow.s
T
2016-03-23 13:59:04 +11:00

184 lines
3.2 KiB
ArmAsm

include "includes.i"
include "P6112-Options.i"
xdef PokeBitplanePointers
xdef Level3InterruptHandler
xdef copperList
xdef copperListAlternate
xdef bitplanesp1
xdef bitplanesp2
xdef bitplanesp3
xdef Module1
byteMap:
dc.l Entry
dc.l endCode-byteMap
Entry:
move.l userstack,a7
lea CUSTOM,a6
move #$7ff,DMACON(a6) ; disable all dma
move #$7fff,INTENA(a6) ; disable all interrupts
move.w d0,COLOR00(a6) ; black screen
jsr LoadModule
lea Level3InterruptHandler,a3
move.l a3,LVL3_INT_VECTOR
;; initialise P61
lea Module1,a0
move.l (a0),a0
sub.l a1,a1
sub.l a2,a2
moveq #0,d0
jsr P61_Init
move.w #(INTF_SETCLR|INTF_VERTB|INTF_INTEN),INTENA(a6)
move.l bitplanesp2,a0 ; setup an empty bitplane
move.l #IMAGESIZE,d0
jsr ClearMemory ; clear it
jsr WaitBlitter ; make sure it's clear
move.l a0,a1
bsr SetupImage ; select it
jsr Init ; enable the playfield
move.l #50*10,d0
.loop:
jsr WaitVerticalBlank
dbra d0,.loop
jsr LoadNextImage
.mainLoop:
jsr WaitVerticalBlank
cmp.l #50*SECONDS_WAIT,counter
bne .updateCounter
jsr LoadNextImage
move.l #0,counter
bra .done
.updateCounter:
add.l #1,counter
.done:
bra .mainLoop
counter:
dc.l 0
Level3InterruptHandler:
movem.l d0-a6,-(sp)
lea CUSTOM,a6
.checkVerticalBlank:
move.w INTREQR(a6),d0
and.w #INTF_VERTB,d0
beq.s .checkCopper
.verticalBlank:
move.w #INTF_VERTB,INTREQ(a6) ; clear interrupt bit
movem.l d0-a6,-(sp)
;; jsr P61_Music ; and call the playroutine manually.
movem.l (sp)+,d0-a6
if INTERLACE==1
btst #VPOSRLOFBIT,VPOSR(a6)
beq.s .lof
lea copperListAlternate,a0
move.l a0,COP1LC(a6)
bra .done
.lof:
lea copperList,a0
move.l a0,COP1LC(a6)
.done
endif ; INTERLACE==1
.checkCopper:
move.w INTREQR(a6),d0
and.w #INTF_COPER,d0
beq.s .interruptComplete
.copperInterrupt:
move.w #INTF_COPER,INTREQ(a6) ; clear interrupt bit
.interruptComplete:
movem.l (sp)+,d0-a6
rte
PokeBitplanePointers:
; d0 = frame offset in bytes
; a0 = BPLP copper list address
; a1 = bitplanes pointer
movem.l d0-a6,-(sp)
add.l d0,a1 ; Offset for odd/even frames
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
Playrtn:
include "../shared/P6112-Play.i"
if INTERLACE==1
copperListAlternate:
;; 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.w BPL6PTL,0
dc.w BPL6PTH,0
dc.l $fffffffe
endif; INTERLACE==1
copperList:
;; 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.w BPL6PTL,0
dc.w BPL6PTH,0
dc.l $fffffffe
;; Module1:
;; incbin "../assets/P61.sowhat-intro" ;usecode $9410
align 4
bitplanesp1:
dc.l endCode
bitplanesp2:
dc.l endCode+(512)+IMAGESIZE
bitplanesp3:
dc.l endCode+(512*2)+(2*IMAGESIZE)
userstack:
dc.l endCode+(512*3)+(3*IMAGESIZE)+$1000
Module1:
dc.l endCode+(512*3)+(3*IMAGESIZE)+$1000+4