Files
AmigaExamples/023.slideshow/slideshow.s
T

174 lines
3.0 KiB
ArmAsm

include "includes.i"
include "P6112-Options.i"
xref PokeBitplanePointers
xref Level3InterruptHandler
xref copperList
xref copperListAlternate
xref bitplanesp1
xref bitplanesp2
xref bitplanesp3
xref 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 #50*10,d0
.loop:
jsr WaitVerticalBlank
dbra d0,.loop
jsr LoadNextImage
jsr Init
.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