mirror of
https://frontier.innolan.net/github/AmigaExamples.git
synced 2026-09-12 23:32:52 +00:00
280 lines
5.4 KiB
ArmAsm
280 lines
5.4 KiB
ArmAsm
include "includes.i"
|
|
include "bob.i"
|
|
|
|
xdef AddBobCloud
|
|
xdef AddBobBaloon
|
|
xdef RenderBob
|
|
xdef ResetBobs
|
|
xdef ClearBobs
|
|
xdef RestoreBobBackgrounds
|
|
xdef bobBufferOffset
|
|
xdef EnableBobs
|
|
|
|
bob:
|
|
CLOUD_BOB 0
|
|
endBob:
|
|
CLOUD_BOB 1
|
|
CLOUD_BOB 2
|
|
baloonBob:
|
|
BALOON_BOB 3
|
|
dc.l 0
|
|
|
|
|
|
AddBobBaloon:
|
|
lea baloonBob,a5
|
|
cmp.l #BOB_IDLE_X,BOB_X(a5)
|
|
bne .continue
|
|
move.l #320<<BOB_SHIFT_CONVERT,BOB_X(a5)
|
|
lsl.w #4,d1
|
|
move.w d1,BOB_Y+2(a5)
|
|
move.l #BOB_BALLOON_DX,BOB_DX(a5)
|
|
rts
|
|
.continue:
|
|
rts
|
|
|
|
AddBobCloud:
|
|
lea bob,a5
|
|
.loop:
|
|
cmp.l #0,(a5)
|
|
beq .done
|
|
cmp.l #baloonBob,a5
|
|
beq .done
|
|
cmp.l #BOB_IDLE_X,BOB_X(a5)
|
|
bne .continue
|
|
move.l #320<<BOB_SHIFT_CONVERT,BOB_X(a5)
|
|
move.l #backgroundTilemap,a3
|
|
adda.w d0,a3
|
|
move.l a3,BOB_SOURCE_ADDRESS(a5)
|
|
move.l #bobMask,a3
|
|
adda.w d0,a3
|
|
move.l a3,BOB_MASK_ADDRESS(a5)
|
|
lsl.w #4,d1
|
|
move.w d1,BOB_Y+2(a5)
|
|
move.l #BOB_CLOUD_DX,BOB_DX(a5)
|
|
bra .done
|
|
.continue:
|
|
adda.l #endBob-bob,a5
|
|
bra .loop
|
|
.done:
|
|
rts
|
|
|
|
ClearBobs:
|
|
move.w bobsEnabled,-(sp)
|
|
move.w #2,bobsEnabled ; disables bob movement
|
|
bsr RestoreBobBackgrounds
|
|
eor.l #4,bobBufferOffset
|
|
move.l backgroundOffscreen,a0
|
|
move.l backgroundOnscreen,backgroundOffscreen
|
|
move.l a0,backgroundOnscreen
|
|
bsr RestoreBobBackgrounds
|
|
eor.l #4,bobBufferOffset
|
|
move.l backgroundOffscreen,a0
|
|
move.l backgroundOnscreen,backgroundOffscreen
|
|
move.l a0,backgroundOnscreen
|
|
move.w (sp)+,bobsEnabled
|
|
lea bob,a5
|
|
.loop:
|
|
cmp.l #0,(a5)
|
|
beq .done
|
|
lea BOB_LAST_DEST_ADDRESS(a5),a1
|
|
move.l #0,(a1)
|
|
adda.l bobBufferOffset,a1
|
|
move.l #0,(a1)
|
|
move.l #BOB_IDLE_X+1,BOB_X(a5)
|
|
adda.l #endBob-bob,a5
|
|
bra .loop
|
|
.done:
|
|
rts
|
|
|
|
ResetBobs:
|
|
move.w #2,bobsEnabled ; disables bob movement
|
|
bsr RestoreBobBackgrounds
|
|
bsr RenderBob
|
|
eor.l #4,bobBufferOffset
|
|
move.l backgroundOffscreen,a0
|
|
move.l backgroundOnscreen,backgroundOffscreen
|
|
move.l a0,backgroundOnscreen
|
|
bsr RestoreBobBackgrounds
|
|
bsr RenderBob
|
|
eor.l #4,bobBufferOffset
|
|
move.l backgroundOffscreen,a0
|
|
move.l backgroundOnscreen,backgroundOffscreen
|
|
move.l a0,backgroundOnscreen
|
|
move.w #0,bobsEnabled
|
|
lea bob,a5
|
|
.loop:
|
|
cmp.l #0,(a5)
|
|
beq .done
|
|
lea BOB_LAST_DEST_ADDRESS(a5),a1
|
|
move.l #0,(a1)
|
|
adda.l bobBufferOffset,a1
|
|
move.l #0,(a1)
|
|
move.l #BOB_IDLE_X+1,BOB_X(a5)
|
|
adda.l #endBob-bob,a5
|
|
bra .loop
|
|
.done:
|
|
|
|
rts
|
|
|
|
|
|
RestoreBobBackgrounds:
|
|
movem.l d0/a2,-(sp)
|
|
|
|
WaitBlitter
|
|
|
|
move.w #$ffff,BLTAFWM(a6)
|
|
move.w #$ffff,BLTALWM(a6)
|
|
move.w #BC0F_SRCA|BC0F_DEST|$f0,BLTCON0(a6)
|
|
move.w #0,BLTCON1(a6)
|
|
move.w #0,BLTAMOD(a6)
|
|
move.w #BITPLANE_WIDTH_BYTES-(BOB_BLIT_WIDTH_BYTES),BLTDMOD(a6)
|
|
|
|
lea bob,a5
|
|
.loop:
|
|
cmp.l #0,(a5)
|
|
beq .done
|
|
|
|
lea BOB_LAST_DEST_ADDRESS(a5),a1
|
|
adda.l bobBufferOffset,a1
|
|
cmp.l #0,(a1)
|
|
beq .skip
|
|
|
|
lea BOB_SAVE_BUFFER_ADDRESS(a5),a2
|
|
adda.l bobBufferOffset,a2
|
|
|
|
WaitBlitter
|
|
|
|
move.l (a2),BLTAPTH(a6) ; source
|
|
move.l (a1),BLTDPTH(a6) ; dest
|
|
move.w BOB_BLIT_SIZE(a5),BLTSIZE(a6)
|
|
move.l #0,(a1)
|
|
.skip:
|
|
|
|
adda.l #endBob-bob,a5
|
|
bra .loop
|
|
.done:
|
|
movem.l (sp)+,d0/a2
|
|
rts
|
|
|
|
SaveBobBackgrounds:
|
|
WaitBlitter
|
|
move.w #$ffff,BLTAFWM(a6)
|
|
move.w #$ffff,BLTALWM(a6)
|
|
move.w #BC0F_SRCA|BC0F_DEST|$f0,BLTCON0(a6)
|
|
move.w #0,BLTCON1(a6)
|
|
move.w #BITPLANE_WIDTH_BYTES-(BOB_BLIT_WIDTH_BYTES),BLTAMOD(a6)
|
|
move.w #0,BLTDMOD(a6)
|
|
|
|
|
|
lea bob,a5
|
|
.loop:
|
|
cmp.l #0,(a5)
|
|
beq .done
|
|
|
|
move.l BOB_X(a5),d2
|
|
cmp.w #2,bobsEnabled
|
|
beq .dontMoveBob
|
|
sub.l BOB_DX(a5),d2
|
|
.dontMoveBob:
|
|
cmp.l #BOB_IDLE_X,d2
|
|
bgt .dontReset
|
|
move.l #BOB_IDLE_X,d2
|
|
|
|
.dontReset:
|
|
move.l d2,BOB_X(a5)
|
|
add.l backgroundScrollX,d2
|
|
|
|
move.l d2,d0
|
|
lsr.w #BOB_SHIFT_CONVERT,d0 ; convert to pixels
|
|
lsr.w #3,d0 ; bytes to scroll
|
|
|
|
move.l backgroundOffscreen,a0
|
|
add.l d0,a0
|
|
|
|
move.l BOB_Y(a5),d1
|
|
mulu.w #BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH,d1
|
|
adda.w d1,a0
|
|
|
|
lea BOB_SAVE_BUFFER_ADDRESS(a5),a2
|
|
adda.l bobBufferOffset,a2
|
|
|
|
WaitBlitter
|
|
move.l a0,BLTAPTH(a6) ; source
|
|
move.l (a2),BLTDPTH(a6) ; dest
|
|
move.w BOB_BLIT_SIZE(a5),BLTSIZE(a6)
|
|
|
|
lea BOB_LAST_DEST_ADDRESS(a5),a2
|
|
adda.l bobBufferOffset,a2
|
|
|
|
move.l a0,(a2)
|
|
|
|
adda.l #endBob-bob,a5
|
|
bra .loop
|
|
.done:
|
|
rts
|
|
|
|
RenderBob:
|
|
cmp.w #0,bobsEnabled
|
|
beq .dontRenderBobs
|
|
movem.l d0-a5,-(sp)
|
|
|
|
|
|
bsr SaveBobBackgrounds
|
|
|
|
WaitBlitter
|
|
;; move.w #(48/8)-BOB_BLIT_WIDTH_BYTES,BLTAMOD(a6) ; mask
|
|
move.w #BACKGROUND_TILEMAP_WIDTH_BYTES-BOB_BLIT_WIDTH_BYTES,BLTAMOD(a6) ; mask
|
|
move.w #BOB_MODULO,BLTBMOD(a6) ; bob
|
|
move.w #BITPLANE_WIDTH_BYTES-BOB_BLIT_WIDTH_BYTES,BLTCMOD(a6) ; background
|
|
move.w #BITPLANE_WIDTH_BYTES-BOB_BLIT_WIDTH_BYTES,BLTDMOD(a6) ; dest
|
|
move.w #$ffff,BLTAFWM(a6)
|
|
move.w #$0000,BLTALWM(a6)
|
|
|
|
lea bob,a5
|
|
.loop:
|
|
cmp.l #0,(a5)
|
|
beq .done
|
|
move.l BOB_X(a5),d2
|
|
add.l backgroundScrollX,d2
|
|
|
|
lea BOB_LAST_DEST_ADDRESS(a5),a0
|
|
adda.l bobBufferOffset,a0
|
|
move.l (a0),a0
|
|
|
|
move.l d2,d0
|
|
;; lsr.w #BOB_SHIFT_CONVERT,d0 ; convert to pixels
|
|
lsl.w #8,d0 ; BLIT_SOURCE_SHIFT<<BLIT_ASHIFTSHIFT
|
|
;; lsl.w #4,d0 ; BLIT_SOURCE_SHIFT<<BLIT_ASHIFTSHIFT
|
|
|
|
WaitBlitter
|
|
move.w d0,BLTCON1(A6)
|
|
ori.w #BC0F_SRCA|BC0F_SRCB|BC0F_SRCC|BC0F_DEST|$ca,d0
|
|
move.w d0,BLTCON0(a6)
|
|
;; A(mask) B(bob) C(bg) D(dest)
|
|
|
|
move.l BOB_MASK_ADDRESS(a5),BLTAPTH(a6) ; mask
|
|
move.l BOB_SOURCE_ADDRESS(a5),BLTBPTH(a6) ; bob
|
|
move.l a0,BLTCPTH(a6) ; bg
|
|
move.l a0,BLTDPTH(a6) ; dest
|
|
move.w BOB_BLIT_SIZE(a5),BLTSIZE(a6) ;rectangle size, starts blit
|
|
|
|
|
|
adda.l #endBob-bob,a5
|
|
bra .loop
|
|
.done:
|
|
movem.l (sp)+,d0-a5
|
|
.dontRenderBobs:
|
|
|
|
rts
|
|
|
|
EnableBobs:
|
|
move.w #1,bobsEnabled
|
|
rts
|
|
|
|
|
|
bobBufferOffset:
|
|
dc.l 0 ; 0 or 4
|
|
bobsEnabled:
|
|
dc.w 0
|
|
bobMask:
|
|
incbin "out/backgroundMask-mask.bin"
|