mirror of
https://frontier.innolan.net/github/AmigaExamples.git
synced 2026-01-12 11:36:18 +00:00
1554 lines
29 KiB
ArmAsm
1554 lines
29 KiB
ArmAsm
include "includes.i"
|
|
|
|
xdef BigBang
|
|
|
|
xdef pathwayRenderPending
|
|
xdef pathwayXIndex
|
|
xdef pathwayFadeCount
|
|
xdef pathwayClearPending
|
|
xdef InstallTilePalette
|
|
|
|
xdef copperList
|
|
xdef mpanelCopperList
|
|
xdef copperListBpl1Ptr
|
|
xdef copperListBpl2Ptr
|
|
|
|
xdef copperListBpl1Ptr_MP
|
|
xdef copperListBpl1Ptr2_MP
|
|
xdef copperListBpl2Ptr_MP
|
|
xdef copperListBpl2Ptr2_MP
|
|
|
|
xdef foregroundOnscreen
|
|
xdef foregroundOffscreen
|
|
xdef foregroundScrollX
|
|
|
|
xdef foregroundMapPtr
|
|
xdef pathwayMapPtr
|
|
xdef startForegroundMapPtr
|
|
xdef startPathwayMapPtr
|
|
|
|
xdef mapSize
|
|
xdef moving
|
|
xdef foregroundScrollPixels
|
|
|
|
|
|
byteMap:
|
|
dc.l Entry
|
|
dc.l endCode-byteMap
|
|
|
|
Entry:
|
|
lea userstack,a7
|
|
lea CUSTOM,a6
|
|
|
|
move #$7ff,DMACON(a6) ; disable all dma
|
|
move #$7fff,INTENA(a6) ; disable all interrupts
|
|
|
|
lea Level3InterruptHandler,a3
|
|
move.l a3,LVL3_INT_VECTOR
|
|
|
|
|
|
if 0
|
|
lea Level4InterruptHandler,a3
|
|
move.l a3,LVL4_INT_VECTOR
|
|
endif
|
|
|
|
|
|
;; move.w #(INTF_SETCLR|INTF_VERTB|INTF_INTEN),INTENA(a6)
|
|
|
|
jsr StartMusic
|
|
jsr ShowSplash
|
|
jsr BlueFill
|
|
|
|
;; d0 - fg bitplane pointer offset
|
|
;; d1 - bg bitplane pointer offset
|
|
move.l #0,d0
|
|
move.l #1,d1
|
|
jsr SwitchBuffers
|
|
|
|
move.w #(DMAF_BLITTER|DMAF_SETCLR!DMAF_MASTER),DMACON(a6)
|
|
|
|
lea panelCopperListBpl1Ptr,a0
|
|
lea panel,a1
|
|
jsr PokePanelBitplanePointers
|
|
|
|
lea panelCopperListBpl1Ptr_MP,a0
|
|
lea panel,a1
|
|
jsr PokePanelBitplanePointers
|
|
|
|
|
|
lea mpanelCopperListBpl1Ptr,a0
|
|
lea mpanel,a1
|
|
jsr PokePanelBitplanePointers
|
|
|
|
bsr ShowMessagePanel
|
|
|
|
|
|
jsr Init ; enable the playfield
|
|
jsr InstallSpriteColorPalette
|
|
|
|
move.w #(DMAF_SPRITE|DMAF_BLITTER|DMAF_SETCLR|DMAF_COPPER|DMAF_RASTER|DMAF_MASTER),DMACON(a6)
|
|
|
|
|
|
Reset:
|
|
lea livesCounterText,a0
|
|
bsr DecrementCounter
|
|
move.w #218,d0
|
|
lea livesCounterShortText,a1
|
|
jsr RenderCounter
|
|
lea player1Text,a1
|
|
move.w #192,d0
|
|
jsr RenderCounter
|
|
|
|
move.l startForegroundMapPtr,foregroundMapPtr
|
|
move.l startPathwayMapPtr,pathwayMapPtr
|
|
move.w #0,pathwayRenderPending
|
|
move.w #0,pathwayClearPending
|
|
move.w #0,moving
|
|
move.w #-2*FOREGROUND_MOVING_COUNTER,movingCounter
|
|
move.l #playareaFade,playareaFadePtr
|
|
move.l #panelFade,panelFadePtr
|
|
move.l #flagsFade,flagsFadePtr
|
|
move.l #tileFade,tileFadePtr
|
|
move.l #0,foregroundScrollX
|
|
move.l #-1,frameCount
|
|
bsr InitAnimPattern
|
|
jsr ResetBigBangPattern
|
|
jsr BlueFill
|
|
jsr InstallGreyPalette
|
|
jsr HidePlayer
|
|
cmp.l #'0000',livesCounterText
|
|
bne .notGameOver
|
|
bra GameOver
|
|
.notGameOver:
|
|
lea message,a1
|
|
jsr Message
|
|
|
|
|
|
MainLoop:
|
|
MOVE.W #$0024,BPLCON2(a6)
|
|
move.l #0,frameCount
|
|
|
|
SetupBoardLoop:
|
|
add.l #1,frameCount
|
|
move.l frameCount,d6
|
|
move.l #(FOREGROUND_SCROLL_PIXELS*16)-1,foregroundScrollPixels
|
|
bsr HoriScrollPlayfield
|
|
jsr SwitchBuffers
|
|
move.l foregroundScrollX,d0
|
|
move.w #1,moving
|
|
bsr Update
|
|
bsr RenderNextForegroundFrame
|
|
cmp.l #FOREGROUND_PLAYAREA_WIDTH_WORDS,frameCount
|
|
bge .gotoGameLoop
|
|
bra SetupBoardLoop
|
|
.gotoGameLoop:
|
|
add.l #1,d6
|
|
jsr WaitVerticalBlank
|
|
cmp.l #50,d6
|
|
ble .gotoGameLoop
|
|
jsr ReadJoystick
|
|
btst.b #0,joystick
|
|
beq .gotoGameLoop
|
|
move.w #0,moving
|
|
move.l #FOREGROUND_SCROLL_PIXELS,foregroundScrollPixels
|
|
bsr HideMessagePanel
|
|
|
|
FadeInLoop:
|
|
add.l #1,frameCount
|
|
move.l frameCount,d6
|
|
|
|
move.l #0,d0
|
|
.loop:
|
|
jsr WaitVerticalBlank
|
|
dbra d0,.loop
|
|
bsr InstallNextGreyPalette
|
|
cmp.l #FOREGROUND_PLAYAREA_WIDTH_WORDS+25,d6
|
|
bne .c1
|
|
jsr InitialisePlayer
|
|
jsr EnableItemSprites
|
|
|
|
lea frameCounterText,a0
|
|
bsr ResetCounter
|
|
lea verticalBlankCounterText,a0
|
|
bsr ResetCounter
|
|
|
|
bra GameLoop
|
|
.c1:
|
|
bra FadeInLoop
|
|
|
|
GameLoop:
|
|
lea frameCounterText,a0
|
|
bsr IncrementCounter
|
|
lea frameCounterText,a1
|
|
move.w #31,d0
|
|
jsr RenderCounter
|
|
lea verticalBlankCounterText,a1
|
|
move.w #101,d0
|
|
jsr RenderCounter
|
|
|
|
add.l #1,frameCount
|
|
move.l frameCount,d6
|
|
move.l #FOREGROUND_SCROLL_PIXELS,foregroundScrollPixels
|
|
|
|
jsr WaitVerticalBlank
|
|
|
|
MOVE.W #2,AUD3LEN(a6) ;Set length in words
|
|
move.l #emptySound,AUD3LCH(a6)
|
|
|
|
if TIMING_TEST=1
|
|
move.l #4000,d0
|
|
.looooo:
|
|
dbra d0,.looooo
|
|
move.w #$0f0,COLOR00(a6)
|
|
endif
|
|
|
|
bsr HoriScrollPlayfield
|
|
jsr SwitchBuffers
|
|
move.l foregroundScrollX,d0
|
|
lsr.l #FOREGROUND_SCROLL_SHIFT_CONVERT,d0 ; convert to pixels
|
|
and.b #$f,d0
|
|
cmp.b #$f,d0
|
|
bne .s2
|
|
move.w #0,moving
|
|
.s2:
|
|
|
|
jsr ProcessJoystick
|
|
if 0
|
|
btst.b #0,joystick
|
|
bne .setMoving
|
|
endif
|
|
cmp.w #PLAYER_INITIAL_X+16*3,spriteX
|
|
bge .setMoving
|
|
addq.w #1,movingCounter
|
|
cmp.w #FOREGROUND_MOVING_COUNTER,movingCounter
|
|
bge .setMoving
|
|
bra .notMoving
|
|
.setMoving:
|
|
move.w #0,movingCounter
|
|
move.w #1,moving
|
|
.notMoving:
|
|
|
|
|
|
|
|
|
|
bsr Update
|
|
bsr RenderNextForegroundFrame
|
|
jsr RenderNextBackgroundFrame
|
|
|
|
|
|
cmp.w #0,pathwayClearPending
|
|
beq .dontClearPathway
|
|
bsr ClearPathway
|
|
.dontClearPathway:
|
|
|
|
cmp.w #0,pathwayRenderPending
|
|
beq .dontRenderPathway
|
|
jsr RenderPathway
|
|
.dontRenderPathway:
|
|
|
|
|
|
|
|
if 0
|
|
move.w pathwayYIndex,d6
|
|
cmp.w #0,d6
|
|
beq .dontRenderMapTile
|
|
move.w pathwayXIndex,d5
|
|
bsr RenderMapTile
|
|
.dontRenderMapTile:
|
|
endif
|
|
|
|
if TIMING_TEST=1
|
|
move.w #$f00,COLOR00(a6)
|
|
move.w #$f00,COLOR02(a6)
|
|
endif
|
|
|
|
bra GameLoop
|
|
|
|
Update:
|
|
jsr UpdatePlayer
|
|
|
|
.backgroundUpdates:
|
|
add.l #BACKGROUND_SCROLL_PIXELS,backgroundScrollX
|
|
btst #FOREGROUND_DELAY_BIT,d6
|
|
beq .skipForegroundUpdates
|
|
;; ---- Foreground updates ----------------------------------------
|
|
.foregroundUpdates:
|
|
move.l foregroundScrollX,d0
|
|
lsr.l #FOREGROUND_SCROLL_SHIFT_CONVERT,d0 ; convert to pixels
|
|
andi.l #$f,d0
|
|
|
|
cmp.w #0,moving
|
|
beq .c1
|
|
move.l foregroundScrollPixels,d0
|
|
add.l d0,foregroundScrollX
|
|
|
|
jsr ScrollSprites
|
|
|
|
move.l foregroundScrollX,d0
|
|
lsr.l #FOREGROUND_SCROLL_SHIFT_CONVERT,d0 ; convert to pixels
|
|
andi.l #$f,d0
|
|
cmp.b #0,d0
|
|
bne .c1
|
|
bsr ResetAnimPattern
|
|
bsr ResetDeAnimPattern
|
|
rts
|
|
.c1:
|
|
.skipForegroundUpdates:
|
|
|
|
cmp.w #PATHWAY_FADE_TIMER_COUNT,pathwayFadeCount
|
|
blt .dontInstallNextPathwayColor
|
|
jsr InstallNextPathwayColor
|
|
.dontInstallNextPathwayColor:
|
|
add.w #1,pathwayFadeCount
|
|
jsr CheckPlayerMiss
|
|
|
|
rts
|
|
|
|
|
|
GameOver:
|
|
lea gameOverMessage,a1
|
|
jsr Message
|
|
|
|
move.l #100,d0
|
|
.pause:
|
|
jsr WaitVerticalBlank
|
|
dbra d0,.pause
|
|
|
|
.waitForJoystick:
|
|
jsr ReadJoystick
|
|
btst.b #0,joystick
|
|
bne .gotJoystick
|
|
bra .waitForJoystick
|
|
.gotJoystick:
|
|
move.l #foregroundMap,startForegroundMapPtr
|
|
move.l #pathwayMap,startPathwayMapPtr
|
|
move.l #'0004',livesCounterText
|
|
bra Reset
|
|
|
|
ShowMessagePanel:
|
|
jsr WaitVerticalBlank
|
|
lea mpanelCopperList,a0
|
|
move.l a0,COP1LC(a6)
|
|
rts
|
|
|
|
|
|
HideMessagePanel:
|
|
jsr WaitVerticalBlank
|
|
lea copperList,a0
|
|
move.l a0,COP1LC(a6)
|
|
rts
|
|
|
|
HoriScrollPlayfield:
|
|
;; d0 - fg x position in pixels
|
|
;; d1 - bg x position in pixels
|
|
move.l backgroundScrollX,d0
|
|
lsr.l #BACKGROUND_SCROLL_SHIFT_CONVERT,d0 ; convert to pixels
|
|
move.w d0,d2
|
|
lsr.w #3,d0 ; bytes to scroll
|
|
and.w #$F,d2 ; pixels = 0xf - (hpos - (hpos_bytes*8))
|
|
move.w #$F,d0
|
|
sub.w d2,d0 ; bits to delay
|
|
move.w d0,d5 ; d5 == bg bits to delay
|
|
|
|
move.l foregroundScrollX,d0
|
|
lsr.l #FOREGROUND_SCROLL_SHIFT_CONVERT,d0 ; convert to pixels
|
|
move.w d0,d2
|
|
lsr.w #3,d0 ; bytes to scroll
|
|
and.w #$F,d2 ; pixels = 0xf - (hpos - (hpos_bytes*8))
|
|
move.w #$F,d0
|
|
sub.w d2,d0 ; bits to delay
|
|
lsl.w #4,d5
|
|
or.w d5,d0
|
|
move.w d0,copperListScrollPtr
|
|
move.w d0,copperListScrollPtr_MP
|
|
move.w d0,copperListScrollPtr2_MP
|
|
rts
|
|
|
|
|
|
InitAnimPattern:
|
|
lea animIndex,a0
|
|
move.l #7,d0
|
|
.loop:
|
|
move.l #0,(a0)+
|
|
dbra d0,.loop
|
|
move.l #animIndexPattern,animIndexPatternPtr
|
|
rts
|
|
|
|
ResetAnimPattern:
|
|
lea animIndex,a0
|
|
move.l #animIndexPattern,a1
|
|
move.l #7,d0
|
|
.loop:
|
|
move.l (a1)+,(a0)+
|
|
dbra d0,.loop
|
|
add.l #8*4,animIndexPatternPtr
|
|
cmp.l #$ffffffff,(a1)
|
|
bne .s1
|
|
lea animIndexPattern,a0
|
|
move.l a0,animIndexPatternPtr
|
|
.s1:
|
|
rts
|
|
|
|
ResetDeAnimPattern:
|
|
lea deAnimIndex,a0
|
|
move.l deAnimIndexPatternPtr,a1
|
|
move.l #7,d0
|
|
.loop:
|
|
move.l (a1)+,(a0)+
|
|
dbra d0,.loop
|
|
add.l #8,deAnimIndexPatternPtr
|
|
cmp.l #$ffffffff,(a1)
|
|
bne .s1
|
|
lea deAnimIndexPattern,a0
|
|
move.l a0,deAnimIndexPatternPtr
|
|
.s1:
|
|
rts
|
|
|
|
|
|
ResetBigBangPattern:
|
|
lea bigBangIndex,a0
|
|
move.l verticalBlankCount,d0
|
|
andi.l #$fff0,d0
|
|
move.l #MainLoop,a1
|
|
add.l d0,a1
|
|
move.l #(FOREGROUND_PLAYAREA_WIDTH_WORDS/2)-1,d1
|
|
.loop1:
|
|
move.l #FOREGROUND_PLAYAREA_HEIGHT_WORDS-1,d0
|
|
.loop:
|
|
move.l (a1)+,d2
|
|
and.l #3,d2
|
|
move.l d2,(a0)+
|
|
dbra d0,.loop
|
|
dbra d1,.loop1
|
|
rts
|
|
|
|
|
|
RenderNextForegroundFrame:
|
|
move.l foregroundMapPtr,a2
|
|
move.l foregroundScrollX,d0
|
|
lsr.l #FOREGROUND_SCROLL_TILE_INDEX_CONVERT,d0
|
|
lsr.l #1,d0
|
|
and.b #$f0,d0
|
|
add.l d0,a2
|
|
move.l 0,d3
|
|
.loop:
|
|
move.l d3,d2
|
|
bsr RenderForegroundTile
|
|
bsr ClearForegroundTile
|
|
jsr RenderItemSprite
|
|
add.l #2,a2
|
|
add.l #1,d3
|
|
cmp.l #FOREGROUND_PLAYAREA_HEIGHT_WORDS,d3
|
|
blt .loop
|
|
rts
|
|
|
|
RenderPathway:
|
|
move.w pathwayXIndex,d5 ; x index
|
|
;;sub.w #1,pathwayRenderPending
|
|
.loopX:
|
|
move.w #6,d6 ; y index
|
|
move.w #0,d7 ; number of rows without a pathway
|
|
.loopY:
|
|
move.l pathwayMapPtr,a2
|
|
bsr GetMapTile
|
|
move.l d0,a2
|
|
move.w (a2),d0
|
|
cmp.w #0,d0
|
|
beq .dontBlit
|
|
|
|
lea foregroundTilemap,a1
|
|
add.w d0,a1 ; source tile
|
|
|
|
move.l foregroundScrollX,d0
|
|
lsr.w #FOREGROUND_SCROLL_SHIFT_CONVERT,d0 ; convert to pixels
|
|
lsr.w #3,d0 ; bytes to scroll
|
|
move.l foregroundOffscreen,a0
|
|
add.l d0,a0
|
|
|
|
move.l #-BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH*8,d0
|
|
move.w d5,d4
|
|
mulu.w #2,d4
|
|
add.l d4,d0
|
|
add.l #10,d0
|
|
add.l d0,a0
|
|
move.l #10,d2
|
|
sub.l d6,d2
|
|
jsr BlitTile
|
|
bra .next
|
|
.dontBlit:
|
|
cmp.w pathwayXIndex,d5 ; skip the start column
|
|
beq .next
|
|
add.w #1,d7
|
|
cmp.w #7,d7
|
|
beq .skip
|
|
.next:
|
|
dbra d6,.loopY
|
|
add.w #1,d5
|
|
cmp.w #(FOREGROUND_PLAYAREA_WIDTH_WORDS/2)-0,d5 ; don't render pathways off the play area
|
|
beq .pathwayNotComplete
|
|
bra .loopX
|
|
.skip:
|
|
sub.w #1,pathwayRenderPending
|
|
rts
|
|
.pathwayNotComplete:
|
|
rts
|
|
|
|
|
|
ClearPathway:
|
|
sub.w #1,pathwayClearPending
|
|
move.w pathwayXIndex,d5 ; x index
|
|
.loopX:
|
|
move.w #6,d6 ; y index
|
|
.loopY:
|
|
move.l foregroundMapPtr,a2 ;; todo: this will be too slow, it will render too many tiles
|
|
bsr GetMapTile
|
|
move.l d0,a2
|
|
move.w (a2),d0
|
|
cmp.w #0,d0
|
|
beq .dontBlit
|
|
|
|
lea foregroundTilemap,a1
|
|
add.w d0,a1 ; source tile
|
|
|
|
move.l foregroundScrollX,d0
|
|
lsr.w #FOREGROUND_SCROLL_SHIFT_CONVERT,d0 ; convert to pixels
|
|
lsr.w #3,d0 ; bytes to scroll
|
|
move.l foregroundOffscreen,a0
|
|
add.l d0,a0
|
|
|
|
move.l #-BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH*8,d0
|
|
move.w d5,d4
|
|
mulu.w #2,d4
|
|
add.l d4,d0
|
|
add.l #10,d0
|
|
add.l d0,a0
|
|
move.l #10,d2
|
|
sub.l d6,d2
|
|
jsr BlitTile
|
|
bra .next
|
|
.dontBlit:
|
|
cmp.w pathwayXIndex,d5
|
|
beq .next
|
|
.next:
|
|
dbra d6,.loopY
|
|
dbra d5,.loopX
|
|
rts
|
|
|
|
|
|
RenderMapTile:
|
|
;; d5 - x map index
|
|
;; d6 - y map index
|
|
|
|
move.l foregroundMapPtr,a2
|
|
bsr GetMapTile
|
|
move.l d0,a2
|
|
move.w (a2),d0
|
|
cmp.w #0,d0
|
|
beq .dontBlit
|
|
|
|
lea foregroundTilemap,a1
|
|
add.w d0,a1 ; source tile
|
|
|
|
move.l foregroundScrollX,d0
|
|
lsr.w #FOREGROUND_SCROLL_SHIFT_CONVERT,d0 ; convert to pixels
|
|
lsr.w #3,d0 ; bytes to scroll
|
|
move.l foregroundOffscreen,a0
|
|
add.l d0,a0
|
|
|
|
move.l #-BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH*8,d0
|
|
move.w d5,d4
|
|
mulu.w #2,d4
|
|
add.l d4,d0
|
|
add.l #10,d0
|
|
add.l d0,a0
|
|
move.l #10,d2
|
|
sub.l d6,d2
|
|
jsr BlitTile
|
|
.dontBlit:
|
|
rts
|
|
|
|
GetMapTile:
|
|
;; d5 - x board index
|
|
;; d6 - y board index
|
|
;; a2 - map
|
|
;;
|
|
;; d0 - pathwayOffset
|
|
|
|
|
|
;; calculate the a2 offset of the top right tile based on foreground scroll
|
|
move.l foregroundScrollX,d0
|
|
lsr.l #FOREGROUND_SCROLL_TILE_INDEX_CONVERT,d0
|
|
lsr.l #1,d0
|
|
and.b #$f0,d0
|
|
add.l d0,a2
|
|
|
|
move.l #(FOREGROUND_PLAYAREA_WIDTH_WORDS/2)-1,d1
|
|
sub.w d5,d1 ; x column
|
|
mulu.w #FOREGROUND_PLAYAREA_HEIGHT_WORDS*2,d1
|
|
sub.l d1,a2 ; player x if y == bottom ?
|
|
|
|
sub.l d1,d1
|
|
move.w #FOREGROUND_PLAYAREA_HEIGHT_WORDS-1,d1
|
|
sub.w d6,d1 ; y row
|
|
lsl.w #1,d1
|
|
add.l d1,a2
|
|
|
|
;; a2 now points at the tile at the coordinate
|
|
move.l a2,d0
|
|
rts
|
|
|
|
|
|
RenderNextForegroundPathwayFrame:
|
|
move.l pathwayMapPtr,a2
|
|
move.l foregroundScrollX,d0
|
|
lsr.l #FOREGROUND_SCROLL_TILE_INDEX_CONVERT,d0
|
|
lsr.l #1,d0
|
|
and.b #$f0,d0
|
|
add.l d0,a2
|
|
move.l 0,d3
|
|
.loop:
|
|
move.l d3,d2
|
|
bsr RenderForegroundTile
|
|
add.l #2,a2
|
|
add.l #1,d3
|
|
cmp.l #FOREGROUND_PLAYAREA_HEIGHT_WORDS,d3
|
|
blt .loop
|
|
rts
|
|
|
|
|
|
RenderForegroundTile_NoAnim:
|
|
;; a2 - address of tileIndex
|
|
move.l foregroundScrollX,d0
|
|
lsr.w #FOREGROUND_SCROLL_SHIFT_CONVERT,d0 ; convert to pixels
|
|
lsr.w #3,d0 ; bytes to scroll
|
|
move.l foregroundOffscreen,a0
|
|
add.l d0,a0
|
|
lea foregroundTilemap,a1
|
|
add.w (a2),a1 ; source tile
|
|
add.l #(BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH*(256-(16*8)+32)/4)+BITPLANE_WIDTH_BYTES-FOREGROUND_PLAYAREA_RIGHT_MARGIN_BYTES,a0
|
|
jsr BlitTile
|
|
rts
|
|
|
|
RenderForegroundTile:
|
|
;; a2 - address of tileIndex
|
|
move.l foregroundScrollX,d0
|
|
lsr.w #FOREGROUND_SCROLL_SHIFT_CONVERT,d0 ; convert to pixels
|
|
lsr.w #3,d0 ; bytes to scroll
|
|
move.l foregroundOffscreen,a0
|
|
add.l d0,a0
|
|
lea foregroundTilemap,a1
|
|
move.w (a2),d0
|
|
cmp.l #0,d0
|
|
beq .s2
|
|
add.w (a2),a1 ; source tile
|
|
add.l #(BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH*(256-(16*8)+32)/4)+BITPLANE_WIDTH_BYTES-FOREGROUND_PLAYAREA_RIGHT_MARGIN_BYTES,a0
|
|
lea animIndex,a4
|
|
move.l d2,d1
|
|
lsl.l #2,d1
|
|
add.l d1,a4
|
|
move.l (a4),d1
|
|
lsr.l #2,d1 ; anim scaling (speed)
|
|
cmp.l #10,d1
|
|
bge .s1
|
|
add.l d1,a1
|
|
jsr BlitTile
|
|
cmp.l #2,(a4)
|
|
blt .s2
|
|
.s1:
|
|
sub.l #2,(a4)
|
|
.s2:
|
|
rts
|
|
|
|
|
|
PostMissedTile:
|
|
jsr SelectNextPlayerSprite
|
|
bra Reset
|
|
|
|
|
|
|
|
BigBang:
|
|
jsr PlayFalling
|
|
move.l #10,d0
|
|
.loop:
|
|
jsr WaitVerticalBlank
|
|
dbra d0,.loop
|
|
|
|
MOVE.W #2,AUD3LEN(a6) ;Set length in words
|
|
move.l #emptySound,AUD3LCH(a6)
|
|
|
|
jsr ResetItems
|
|
move.w #0,moving
|
|
move.l #0,frameCount
|
|
.bigBangLoop:
|
|
add.l #1,frameCount
|
|
cmp.l #BIGBANG_POST_DELAY,frameCount
|
|
beq PostMissedTile
|
|
move.l frameCount,d6
|
|
jsr WaitVerticalBlank
|
|
bsr HoriScrollPlayfield
|
|
jsr SwitchBuffers
|
|
jsr UpdatePlayerFallingAnimation
|
|
|
|
move.l foregroundMapPtr,a2
|
|
move.l foregroundScrollX,d0
|
|
lsr.l #FOREGROUND_SCROLL_TILE_INDEX_CONVERT,d0
|
|
lsr.l #1,d0
|
|
and.b #$f0,d0
|
|
add.l d0,a2
|
|
add.l #(FOREGROUND_PLAYAREA_HEIGHT_WORDS-1)*2,a2
|
|
|
|
move.l foregroundScrollX,d0
|
|
lsr.w #FOREGROUND_SCROLL_SHIFT_CONVERT,d0 ; convert to pixels
|
|
lsr.w #3,d0 ; bytes to scroll
|
|
move.l foregroundOffscreen,a0
|
|
add.l d0,a0
|
|
lea foregroundTilemap,a1
|
|
add.l #(BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH*(256-(16*8)+32)/4)+BITPLANE_WIDTH_BYTES-FOREGROUND_PLAYAREA_RIGHT_MARGIN_BYTES,a0
|
|
|
|
|
|
move.l #(FOREGROUND_PLAYAREA_WIDTH_WORDS/2),d5
|
|
|
|
move.l #BIGBANG_ANIM_DELAY,d0
|
|
|
|
lea bigBangIndex,a4
|
|
.loop3:
|
|
jsr WaitVerticalBlank
|
|
dbra d0,.loop3
|
|
|
|
|
|
.loop1:
|
|
move.l #FOREGROUND_PLAYAREA_HEIGHT_WORDS-1,d2
|
|
.loop2:
|
|
bsr ClearForegroundTile3
|
|
sub.l #2,a2
|
|
dbra d2,.loop2
|
|
sub.l #2,a0
|
|
dbra d5,.loop1
|
|
bra .bigBangLoop
|
|
|
|
|
|
ClearForegroundTile3:
|
|
;; a4 - pointed to animation offset for tile
|
|
lea foregroundTilemap,a1
|
|
sub.l d0,d0
|
|
move.w (a2),d0
|
|
add.l d0,a1
|
|
move.l foregroundMapPtr,a3
|
|
add.l #FOREGROUND_PLAYAREA_WIDTH_WORDS*FOREGROUND_PLAYAREA_HEIGHT_WORDS,a3
|
|
move.l (a4),d1
|
|
cmp.l #10,d1
|
|
bge .s1
|
|
add.l d1,a1
|
|
add.l #2,(a4)
|
|
add.l #4,a4
|
|
bra .s2
|
|
.s1:
|
|
lea foregroundTilemap,a1
|
|
;; add.w #21520,a1 ; source tile
|
|
add.w #$0,a1
|
|
.s2:
|
|
jsr BlitTile
|
|
rts
|
|
|
|
|
|
ClearForegroundTile:
|
|
;; a0 - pointer to tile just rendered (on the screen right) in destination bitplane
|
|
lea foregroundTilemap,a1
|
|
move.l a2,a4
|
|
sub.l #FOREGROUND_PLAYAREA_WIDTH_WORDS*8,a4
|
|
sub.l d0,d0
|
|
move.w (a4),d0
|
|
add.l d0,a1
|
|
move.l foregroundMapPtr,a3
|
|
add.l #FOREGROUND_PLAYAREA_WIDTH_WORDS*FOREGROUND_PLAYAREA_HEIGHT_WORDS,a3
|
|
cmp.l a3,a2 ; don't clear until the full play area has scrolled in
|
|
blt .s3
|
|
sub.l #FOREGROUND_PLAYAREA_WIDTH_WORDS,a0
|
|
lea deAnimIndex,a4
|
|
|
|
move.l d2,d1
|
|
lsl.l #2,d1
|
|
add.l d1,a4
|
|
move.l (a4),d1
|
|
lsr.l #2,d1 ; anim scaling (speed)
|
|
cmp.l #10,d1
|
|
bge .s1
|
|
add.l d1,a1
|
|
add.l #2,(a4)
|
|
bra .s2
|
|
.s1:
|
|
lea foregroundTilemap,a1
|
|
;; add.w #21520,a1 ; source tile
|
|
add.w #$0,a1
|
|
.s2:
|
|
jsr BlitTile
|
|
.s3:
|
|
rts
|
|
|
|
|
|
Level3InterruptHandler:
|
|
movem.l d0-a6,-(sp)
|
|
lea CUSTOM,a6
|
|
.checkVerticalBlank:
|
|
move.w INTREQR(a6),d0
|
|
and.w #INTF_VERTB,d0
|
|
beq .checkCopper
|
|
|
|
.verticalBlank:
|
|
move.w #INTF_VERTB,INTREQ(a6) ; clear interrupt bit
|
|
add.l #1,verticalBlankCount
|
|
lea verticalBlankCounterText,a0
|
|
bsr IncrementCounter
|
|
jsr SetupSpriteData
|
|
jsr P61_Music
|
|
.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
|
|
|
|
|
|
if 0
|
|
Level4InterruptHandler:
|
|
movem.l d0-a6,-(sp)
|
|
lea CUSTOM,a6
|
|
.checkVerticalBlank:
|
|
move.w INTREQR(a6),d0
|
|
and.w #INTF_AUD0,d0
|
|
beq .interruptComplete
|
|
|
|
move.l #1000,d0
|
|
.loop:
|
|
dbra d0,.loop
|
|
|
|
move.w #INTF_AUD0,INTREQ(a6) ; clear interrupt bit
|
|
MOVE.W #2,AUD0LEN(a6) ;Set length in words
|
|
move.l #jump,AUD0LCH(a6)
|
|
move.w #INTF_AUD0,INTENA(a6)
|
|
|
|
if 0
|
|
move.w #DMAF_AUD0,DMACON(a6)
|
|
|
|
lea verticalBlankCounterText,a0
|
|
bsr IncrementCounter
|
|
|
|
if 0
|
|
MOVE.W #1,AUD0PER(a6)
|
|
MOVE.W #0,AUD0VOL(a6) ;Use maximum volume
|
|
MOVE.W #2,AUD0LEN(a6) ;Set length in words
|
|
endif
|
|
endif
|
|
.interruptComplete:
|
|
|
|
movem.l (sp)+,d0-a6
|
|
rte
|
|
endif
|
|
|
|
Message:
|
|
;; a0 - bitplane
|
|
;; a1 - text
|
|
;; d0 - xpos
|
|
;; d1 - ypos
|
|
|
|
move.w #(32*4)<<6|(320/16),d0
|
|
lea mpanelOrig,a0
|
|
lea mpanel,a2
|
|
jsr SimpleBlit
|
|
|
|
lea mpanel,a0
|
|
move.w #128,d0
|
|
move.w #11,d1
|
|
jsr DrawMaskedText8
|
|
bsr ShowMessagePanel
|
|
rts
|
|
|
|
|
|
RenderCounter:
|
|
lea panel,a0
|
|
move.w #20,d1
|
|
jsr DrawText8
|
|
rts
|
|
|
|
|
|
ResetCounter:
|
|
move.l #"0000",(a0)
|
|
rts
|
|
|
|
IncrementCounter:
|
|
move.l a0,a1
|
|
add.l #3,a0
|
|
.loop:
|
|
sub.l d0,d0
|
|
move.b (a0),d0
|
|
addq.b #1,d0
|
|
cmp.b #'9',d0
|
|
ble .done
|
|
move.b #'0',d0
|
|
move.b d0,(a0)
|
|
sub.l #1,a0
|
|
cmp.l a1,a0
|
|
blt .startOfText
|
|
bra .loop
|
|
.done:
|
|
move.b d0,(a0)
|
|
.startOfText:
|
|
rts
|
|
|
|
|
|
DecrementCounter:
|
|
move.l a0,a1
|
|
add.l #3,a0
|
|
.loop:
|
|
sub.l d0,d0
|
|
move.b (a0),d0
|
|
cmp.b #'0',d0
|
|
beq .dontWrap
|
|
subq.b #1,d0
|
|
bra .done
|
|
.dontWrap:
|
|
move.b #'9',d0
|
|
move.b d0,(a0)
|
|
sub.l #1,a0
|
|
cmp.l a1,a0
|
|
blt .startOfText
|
|
bra .loop
|
|
.done:
|
|
move.b d0,(a0)
|
|
.startOfText:
|
|
rts
|
|
|
|
|
|
player1Text:
|
|
dc.b "P1"
|
|
dc.b 0
|
|
align 4
|
|
|
|
player2Text:
|
|
dc.b "P2"
|
|
dc.b 0
|
|
align 4
|
|
|
|
message:
|
|
dc.b "LETS PLAY!"
|
|
dc.b 0
|
|
align 4
|
|
|
|
gameOverMessage:
|
|
dc.b "GAME OVER"
|
|
dc.b 0
|
|
align 4
|
|
|
|
livesCounterText:
|
|
dc.b "00"
|
|
livesCounterShortText:
|
|
dc.b "04"
|
|
dc.b 0
|
|
align 4
|
|
|
|
frameCounterText:
|
|
dc.b "0000"
|
|
dc.b 0
|
|
align 4
|
|
|
|
verticalBlankCounterText:
|
|
dc.b "0000"
|
|
dc.b 0
|
|
align 4
|
|
|
|
|
|
copperList:
|
|
panelCopperListBpl1Ptr:
|
|
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 BPLCON1,0
|
|
dc.w DDFSTRT,(RASTER_X_START/2-SCREEN_RES)
|
|
dc.w DDFSTOP,(RASTER_X_START/2-SCREEN_RES)+(8*((SCREEN_WIDTH/16)-1))
|
|
dc.w BPLCON0,(4<<12)|COLOR_ON ; 4 bit planes
|
|
dc.w BPL1MOD,SCREEN_WIDTH_BYTES*4-SCREEN_WIDTH_BYTES
|
|
dc.w BPL2MOD,SCREEN_WIDTH_BYTES*4-SCREEN_WIDTH_BYTES
|
|
panelCopperPalettePtr:
|
|
include "out/panel-copper-list.s"
|
|
dc.w $5bd1,$fffe
|
|
|
|
|
|
dc.w BPL1MOD,BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH-SCREEN_WIDTH_BYTES-2
|
|
dc.w BPL2MOD,BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH-SCREEN_WIDTH_BYTES-2
|
|
|
|
dc.w BPLCON1
|
|
copperListScrollPtr:
|
|
dc.w 0
|
|
copperListBpl1Ptr:
|
|
;; this is where bitplanes are assigned to playfields
|
|
;; http://amigadev.elowar.com/read/ADCD_2.1/Hardware_Manual_guide/node0079.html
|
|
;; 3 bitplanes per playfield, playfield1 gets bitplanes 1,3,5
|
|
dc.w BPL1PTL,0
|
|
dc.w BPL1PTH,0
|
|
dc.w BPL3PTL,0
|
|
dc.w BPL3PTH,0
|
|
dc.w BPL5PTL,0
|
|
dc.w BPL5PTH,0
|
|
copperListBpl2Ptr:
|
|
;; 3 bitplanes per playfield, playfield2 gets bitplanes 2,4,6
|
|
dc.w BPL2PTL,0
|
|
dc.w BPL2PTH,0
|
|
dc.w BPL4PTL,0
|
|
dc.w BPL4PTH,0
|
|
dc.w BPL6PTL,0
|
|
dc.w BPL6PTH,0
|
|
|
|
dc.w DDFSTRT,(RASTER_X_START/2-SCREEN_RES)-8 ; -8 for extra scrolling word
|
|
dc.w DDFSTOP,(RASTER_X_START/2-SCREEN_RES)+(8*((SCREEN_WIDTH/16)-1))
|
|
dc.w BPLCON0,(SCREEN_BIT_DEPTH*2<<12)|COLOR_ON|DBLPF
|
|
|
|
|
|
if TIMING_TEST=1
|
|
dc.l $fffffffe
|
|
endif
|
|
|
|
|
|
playAreaCopperPalettePtr1:
|
|
include "out/foreground-copper-list.s"
|
|
include "out/background-copper-list.s"
|
|
|
|
;; top flag row has it's own palette
|
|
dc.w $84d1
|
|
dc.w $fffe
|
|
flagsCopperPalettePtr1:
|
|
include "out/foreground-copper-list.s"
|
|
include "out/background-copper-list.s"
|
|
dc.w $94d1
|
|
dc.w $fffe
|
|
;;
|
|
|
|
|
|
playAreaCopperPalettePtr2:
|
|
include "out/foreground-copper-list.s"
|
|
include "out/background-copper-list.s"
|
|
|
|
|
|
;; bottom flag row has it's own palette
|
|
dc.w $f4d1
|
|
dc.w $fffe
|
|
flagsCopperPalettePtr2:
|
|
include "out/foreground-copper-list.s"
|
|
include "out/background-copper-list.s"
|
|
dc.w $ffdf
|
|
dc.w $fffe
|
|
dc.w $04d1
|
|
dc.w $fffe
|
|
|
|
playAreaCopperPalettePtr3:
|
|
include "out/foreground-copper-list.s"
|
|
include "out/background-copper-list.s"
|
|
|
|
|
|
dc.l $fffffffe
|
|
|
|
|
|
mpanelCopperList:
|
|
panelCopperListBpl1Ptr_MP:
|
|
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 BPLCON1,0
|
|
dc.w DDFSTRT,(RASTER_X_START/2-SCREEN_RES)
|
|
dc.w DDFSTOP,(RASTER_X_START/2-SCREEN_RES)+(8*((SCREEN_WIDTH/16)-1))
|
|
dc.w BPLCON0,(4<<12)|COLOR_ON ; 4 bit planes
|
|
dc.w BPL1MOD,SCREEN_WIDTH_BYTES*4-SCREEN_WIDTH_BYTES
|
|
dc.w BPL2MOD,SCREEN_WIDTH_BYTES*4-SCREEN_WIDTH_BYTES
|
|
include "out/panel-grey-copper.s"
|
|
dc.w $5bd1,$fffe
|
|
|
|
|
|
dc.w BPL1MOD,BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH-SCREEN_WIDTH_BYTES-2
|
|
dc.w BPL2MOD,BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH-SCREEN_WIDTH_BYTES-2
|
|
|
|
dc.w BPLCON1
|
|
copperListScrollPtr_MP:
|
|
dc.w 0
|
|
copperListBpl1Ptr_MP:
|
|
;; this is where bitplanes are assigned to playfields
|
|
;; http://amigadev.elowar.com/read/ADCD_2.1/Hardware_Manual_guide/node0079.html
|
|
;; 3 bitplanes per playfield, playfield1 gets bitplanes 1,3,5
|
|
dc.w BPL1PTL,0
|
|
dc.w BPL1PTH,0
|
|
dc.w BPL3PTL,0
|
|
dc.w BPL3PTH,0
|
|
dc.w BPL5PTL,0
|
|
dc.w BPL5PTH,0
|
|
|
|
copperListBpl2Ptr_MP:
|
|
;; 3 bitplanes per playfield, playfield2 gets bitplanes 2,4,6
|
|
dc.w BPL2PTL,0
|
|
dc.w BPL2PTH,0
|
|
dc.w BPL4PTL,0
|
|
dc.w BPL4PTH,0
|
|
dc.w BPL6PTL,0
|
|
dc.w BPL6PTH,0
|
|
|
|
dc.w DDFSTRT,(RASTER_X_START/2-SCREEN_RES)-8 ; -8 for extra scrolling word
|
|
dc.w DDFSTOP,(RASTER_X_START/2-SCREEN_RES)+(8*((SCREEN_WIDTH/16)-1))
|
|
dc.w BPLCON0,(SCREEN_BIT_DEPTH*2<<12)|COLOR_ON|DBLPF
|
|
|
|
|
|
playAreaCopperPalettePtr1_MP:
|
|
include "out/foreground-grey-copper.s"
|
|
include "out/background-grey-copper.s"
|
|
|
|
dc.w $84d1
|
|
dc.w $fffe
|
|
flagsCopperPalettePtr1_MP:
|
|
include "out/foreground-grey-copper.s"
|
|
include "out/background-grey-copper.s"
|
|
dc.w $94d1
|
|
dc.w $fffe
|
|
|
|
playAreaCopperPalettePtr2_MP:
|
|
include "out/foreground-grey-copper.s"
|
|
include "out/background-grey-copper.s"
|
|
|
|
|
|
mpanelWaitLinePtr:
|
|
dc.w MPANEL_COPPER_WAIT
|
|
dc.w $fffe
|
|
|
|
mpanelCopperListBpl1Ptr:
|
|
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 BPLCON1,0
|
|
dc.w DDFSTRT,(RASTER_X_START/2-SCREEN_RES)
|
|
dc.w DDFSTOP,(RASTER_X_START/2-SCREEN_RES)+(8*((SCREEN_WIDTH/16)-1))
|
|
dc.w BPLCON0,(4<<12)|COLOR_ON ; 4 bit planes
|
|
dc.w BPL1MOD,SCREEN_WIDTH_BYTES*4-SCREEN_WIDTH_BYTES
|
|
dc.w BPL2MOD,SCREEN_WIDTH_BYTES*4-SCREEN_WIDTH_BYTES
|
|
mpanelCopperPalettePtr_MP:
|
|
include "out/mpanel-copper-list.s"
|
|
|
|
dc.w $BAd1,$fffe
|
|
|
|
|
|
dc.w BPL1MOD,BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH-SCREEN_WIDTH_BYTES-2
|
|
dc.w BPL2MOD,BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH-SCREEN_WIDTH_BYTES-2
|
|
|
|
dc.w BPLCON1
|
|
copperListScrollPtr2_MP:
|
|
dc.w 0
|
|
copperListBpl1Ptr2_MP:
|
|
;; this is where bitplanes are assigned to playfields
|
|
;; http://amigadev.elowar.com/read/ADCD_2.1/Hardware_Manual_guide/node0079.html
|
|
;; 3 bitplanes per playfield, playfield1 gets bitplanes 1,3,5
|
|
dc.w BPL1PTL,0
|
|
dc.w BPL1PTH,0
|
|
dc.w BPL3PTL,0
|
|
dc.w BPL3PTH,0
|
|
dc.w BPL5PTL,0
|
|
dc.w BPL5PTH,0
|
|
|
|
copperListBpl2Ptr2_MP:
|
|
;; 3 bitplanes per playfield, playfield2 gets bitplanes 2,4,6
|
|
dc.w BPL2PTL,0
|
|
dc.w BPL2PTH,0
|
|
dc.w BPL4PTL,0
|
|
dc.w BPL4PTH,0
|
|
dc.w BPL6PTL,0
|
|
dc.w BPL6PTH,0
|
|
|
|
dc.w DDFSTRT,(RASTER_X_START/2-SCREEN_RES)-8 ; -8 for extra scrolling word
|
|
dc.w DDFSTOP,(RASTER_X_START/2-SCREEN_RES)+(8*((SCREEN_WIDTH/16)-1))
|
|
dc.w BPLCON0,(SCREEN_BIT_DEPTH*2<<12)|COLOR_ON|DBLPF
|
|
|
|
playAreaCopperPalettePtr3_MP:
|
|
include "out/foreground-grey-copper.s"
|
|
include "out/background-grey-copper.s"
|
|
|
|
|
|
dc.w $f4d1
|
|
dc.w $fffe
|
|
flagsCopperPalettePtr2_MP:
|
|
include "out/foreground-grey-copper.s"
|
|
include "out/background-grey-copper.s"
|
|
dc.w $ffdf
|
|
dc.w $fffe
|
|
dc.w $04d1
|
|
dc.w $fffe
|
|
|
|
playAreaCopperPalettePtr4_MP:
|
|
include "out/foreground-grey-copper.s"
|
|
include "out/background-grey-copper.s"
|
|
|
|
|
|
dc.l $fffffffe
|
|
|
|
InstallSpriteColorPalette:
|
|
jsr InstallPlayerColorPalette
|
|
include "out/sprite_coin-1-palette.s"
|
|
rts
|
|
|
|
InstallColorPalette:
|
|
lea playAreaCopperPalettePtr1,a1
|
|
lea playAreaCopperPalettePtr2,a2
|
|
lea playAreaCopperPalettePtr3,a3
|
|
lea playAreaPalette,a0
|
|
add.l #2,a1
|
|
add.l #2,a2
|
|
add.l #2,a3
|
|
move.l #15,d0
|
|
.loop:
|
|
move.w (a0),(a1)
|
|
move.w (a0),(a2)
|
|
move.w (a0),(a3)
|
|
add.l #2,a0
|
|
add.l #4,a1
|
|
add.l #4,a2
|
|
add.l #4,a3
|
|
dbra d0,.loop
|
|
rts
|
|
|
|
InstallGreyPalette:
|
|
lea playAreaCopperPalettePtr1,a1
|
|
lea playAreaCopperPalettePtr2,a2
|
|
lea playAreaCopperPalettePtr3,a3
|
|
lea playareaFade,a0
|
|
add.l #2,a1
|
|
add.l #2,a2
|
|
add.l #2,a3
|
|
move.l #15,d0
|
|
.loop:
|
|
move.w (a0),(a1)
|
|
move.w (a0),(a2)
|
|
move.w (a0),(a3)
|
|
add.l #2,a0
|
|
add.l #4,a1
|
|
add.l #4,a2
|
|
add.l #4,a3
|
|
dbra d0,.loop
|
|
|
|
InstallPanelGreyPalette:
|
|
lea panelCopperPalettePtr,a1
|
|
lea panelGreyPalette,a0
|
|
add.l #2,a1
|
|
move.l #15,d0
|
|
.loop:
|
|
move.w (a0),(a1)
|
|
add.l #2,a0
|
|
add.l #4,a1
|
|
dbra d0,.loop
|
|
|
|
|
|
InstallFlagsGreyPalette:
|
|
lea flagsCopperPalettePtr1,a1
|
|
lea flagsCopperPalettePtr2,a2
|
|
lea flagsFade,a0
|
|
add.l #2,a1
|
|
add.l #2,a2
|
|
move.l #15,d0
|
|
.loop:
|
|
move.w (a0),(a1)
|
|
move.w (a0),(a2)
|
|
add.l #2,a0
|
|
add.l #4,a1
|
|
add.l #4,a2
|
|
dbra d0,.loop
|
|
|
|
rts
|
|
|
|
|
|
|
|
InstallTilePalette:
|
|
move.l #tileFade,tileFadePtr
|
|
lea playAreaCopperPalettePtr2,a1
|
|
add.l #6,a1 ; point to COLOR01
|
|
lea tileFade,a0
|
|
move.l #1,d0
|
|
.loop:
|
|
move.w (a0),(a1)
|
|
add.l #2,a0
|
|
add.l #4,a1
|
|
dbra d0,.loop
|
|
rts
|
|
|
|
InstallNextPathwayColor:
|
|
lea playAreaCopperPalettePtr2,a1
|
|
add.l #6,a1 ; point to COLOR01
|
|
move.l tileFadePtr,a0
|
|
lea tileFadeFadeComplete,a5
|
|
cmp.l a5,a0
|
|
bge .reset
|
|
move.l #1,d0 ; 2 colors to update
|
|
.loop:
|
|
move.w (a0),(a1)
|
|
add.l #2,a0
|
|
add.l #4,a1
|
|
dbra d0,.loop
|
|
add.l #2*2,tileFadePtr
|
|
bra .done
|
|
.reset:
|
|
;; move.l #tileFade,tileFadePtr
|
|
.done:
|
|
rts
|
|
|
|
InstallNextGreyPalette:
|
|
lea playAreaCopperPalettePtr1,a1
|
|
lea playAreaCopperPalettePtr2,a2
|
|
lea playAreaCopperPalettePtr3,a3
|
|
move.l playareaFadePtr,a0
|
|
lea playareaFadeComplete,a5
|
|
cmp.l a5,a0
|
|
bge .done
|
|
add.l #2,a1
|
|
add.l #2,a2
|
|
add.l #2,a3
|
|
move.l #15,d0
|
|
.loop:
|
|
move.w (a0),(a1)
|
|
move.w (a0),(a2)
|
|
move.w (a0),(a3)
|
|
add.l #2,a0
|
|
add.l #4,a1
|
|
add.l #4,a2
|
|
add.l #4,a3
|
|
dbra d0,.loop
|
|
add.l #16*2,playareaFadePtr
|
|
.done
|
|
|
|
InstallNextGreyPanelPalette:
|
|
lea panelCopperPalettePtr,a1
|
|
move.l panelFadePtr,a0
|
|
lea panelFadeComplete,a2
|
|
cmp.l a2,a0
|
|
bge .done
|
|
add.l #2,a1
|
|
move.l #15,d0
|
|
.loop:
|
|
move.w (a0),(a1)
|
|
add.l #2,a0
|
|
add.l #4,a1
|
|
dbra d0,.loop
|
|
add.l #16*2,panelFadePtr
|
|
.done
|
|
|
|
|
|
InstallFlagGreyPalette:
|
|
lea flagsCopperPalettePtr1,a1
|
|
lea flagsCopperPalettePtr2,a2
|
|
move.l flagsFadePtr,a0
|
|
lea flagsFadeComplete,a5
|
|
cmp.l a5,a0
|
|
bge .done
|
|
add.l #2,a1
|
|
add.l #2,a2
|
|
move.l #15,d0
|
|
.loop:
|
|
move.w (a0),(a1)
|
|
move.w (a0),(a2)
|
|
add.l #2,a0
|
|
add.l #4,a1
|
|
add.l #4,a2
|
|
dbra d0,.loop
|
|
add.l #16*2,flagsFadePtr
|
|
.done
|
|
rts
|
|
|
|
|
|
|
|
foregroundOnscreen:
|
|
dc.l foregroundBitplanes1
|
|
foregroundOffscreen:
|
|
dc.l foregroundBitplanes2
|
|
foregroundTilemap:
|
|
incbin "out/foreground.bin"
|
|
panel:
|
|
incbin "out/panel.bin"
|
|
mpanel:
|
|
incbin "out/mpanel.bin"
|
|
mpanelOrig:
|
|
incbin "out/mpanel.bin"
|
|
pathwayMap:
|
|
include "out/pathway-map.s"
|
|
dc.w $FFFF
|
|
foregroundMap:
|
|
include "out/foreground-map.s"
|
|
dc.w $FFFF
|
|
itemsMap:
|
|
include "out/items-indexes.s"
|
|
dc.w $FFFF
|
|
mapSize:
|
|
dc.l itemsMap-foregroundMap
|
|
foregroundMapPtr:
|
|
dc.l 0
|
|
pathwayMapPtr:
|
|
dc.l 0
|
|
startForegroundMapPtr:
|
|
dc.l foregroundMap
|
|
startPathwayMapPtr:
|
|
dc.l pathwayMap
|
|
|
|
|
|
|
|
foregroundScrollPixels:
|
|
dc.l FOREGROUND_SCROLL_PIXELS
|
|
foregroundScrollX:
|
|
dc.l 0
|
|
frameCount:
|
|
dc.l 0
|
|
verticalBlankCount:
|
|
dc.l 0
|
|
movingCounter:
|
|
dc.w 0
|
|
moving:
|
|
dc.w 0
|
|
pathwayRenderPending:
|
|
dc.w 0
|
|
pathwayXIndex
|
|
dc.w 0
|
|
pathwayClearPending:
|
|
dc.w 0
|
|
pathwayFadeCount:
|
|
dc.w 0
|
|
|
|
tileFadePtr:
|
|
dc.l tileFade
|
|
playareaFadePtr:
|
|
dc.l playareaFade
|
|
panelFadePtr:
|
|
dc.l panelFade
|
|
flagsFadePtr:
|
|
dc.l flagsFade
|
|
bigBangIndex:
|
|
ds.l FOREGROUND_PLAYAREA_HEIGHT_WORDS*FOREGROUND_PLAYAREA_WIDTH_WORDS,0
|
|
|
|
animIndex:
|
|
ds.l 16,0
|
|
deAnimIndex:
|
|
ds.l 16,0
|
|
|
|
animIndexPatternPtr:
|
|
dc.l animIndexPattern
|
|
animIndexPattern:
|
|
dc.l 0
|
|
dc.l 8*4
|
|
dc.l 10*4
|
|
dc.l 16*4
|
|
dc.l 12*4
|
|
dc.l 14*4
|
|
dc.l 16*4
|
|
dc.l 0
|
|
dc.l 0
|
|
dc.l 16*4
|
|
dc.l 10*4
|
|
dc.l 6*4
|
|
dc.l 2*4
|
|
dc.l 16*4
|
|
dc.l 14*4
|
|
dc.l 0
|
|
dc.l 0
|
|
dc.l 8*4
|
|
dc.l 10*4
|
|
dc.l 16*4
|
|
dc.l 12*4
|
|
dc.l 14*4
|
|
dc.l 16*4
|
|
dc.l 0
|
|
dc.l 0
|
|
dc.l 16*4
|
|
dc.l 10*4
|
|
dc.l 8*4
|
|
dc.l 12*4
|
|
dc.l 4*4
|
|
dc.l 12*4
|
|
dc.l 0
|
|
dc.l $ffffffff
|
|
|
|
deAnimIndexPatternPtr:
|
|
dc.l deAnimIndexPattern
|
|
deAnimIndexPattern:
|
|
dc.l 0
|
|
dc.l 0*4
|
|
dc.l 2*4
|
|
dc.l 4*4
|
|
dc.l 2*4
|
|
dc.l 6*4
|
|
dc.l 2*4
|
|
dc.l 0
|
|
dc.l 0
|
|
dc.l 8*4
|
|
dc.l 4*4
|
|
dc.l 6*4
|
|
dc.l 2*4
|
|
dc.l 4*4
|
|
dc.l 2*4
|
|
dc.l 0
|
|
dc.l 0
|
|
dc.l 0*4
|
|
dc.l 4*4
|
|
dc.l 2*4
|
|
dc.l 4*4
|
|
dc.l 2*4
|
|
dc.l 6*4
|
|
dc.l 0
|
|
dc.l 0
|
|
dc.l 6*4
|
|
dc.l 0*4
|
|
dc.l 2*4
|
|
dc.l 2*4
|
|
dc.l 8*4
|
|
dc.l 2*4
|
|
dc.l 0
|
|
dc.l $ffffffff
|
|
|
|
panelGreyPalette:
|
|
include "out/panel-grey-table.s"
|
|
|
|
playAreaPalette:
|
|
include "out/foreground-palette-table.s"
|
|
include "out/background-palette-table.s"
|
|
|
|
playareaFade:
|
|
include "out/playarea_fade.s"
|
|
|
|
flagsFade:
|
|
include "out/flags_fade.s"
|
|
|
|
panelFade:
|
|
include "out/panelFade.s"
|
|
|
|
tileFade:
|
|
include "out/tileFade.s"
|
|
|
|
align 2
|
|
emptySound:
|
|
dc.l 0
|
|
|
|
|
|
section .bss
|
|
foregroundBitplanes1:
|
|
ds.b IMAGESIZE
|
|
foregroundBitplanes2:
|
|
ds.b IMAGESIZE
|
|
startUserstack:
|
|
ds.b $1000 ; size of stack
|
|
userstack:
|
|
|
|
end |