1
0
mirror of https://frontier.innolan.net/github/AmigaExamples.git synced 2026-01-12 11:36:18 +00:00
Files
AmigaExamples/028.bs/game1.s
2016-05-02 18:56:03 +10:00

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