1
0
mirror of https://frontier.innolan.net/github/AmigaExamples.git synced 2026-01-12 06:43:41 +00:00
Files
AmigaExamples/028.bs/menu.s
2016-06-03 13:22:59 +10:00

399 lines
7.9 KiB
ArmAsm

include "includes.i"
xdef ShowMenu
xdef levelCounter
SPLASH_COLOR_DEPTH equ 5
SPLASH_SCREEN_WIDTH_BYTES equ 40
PLAY_COPPER_WORD equ $aad1
MENU_SELECTED_TOP_COLOR equ $be0 ;$e71
MENU_SELECTED_BOTTOM_COLOR equ $9d4 ;$fe7
MENU_TEXT_COLOR equ $7ef
MENU_TEXT_BOTTOM_COLOR equ $5cd
MENU_OFFSET equ tutorialTopColor-playTopColor
MENU_BOTTOM_OFFSET equ (playBottomColor-playTopColor)
ShowMenu:
lea CUSTOM,a6
jsr ReloadSplashScreen
jsr RestoreSplashMenuSection
jsr ResetSound
move.l #0,frameCount
ReShowMenu:
jsr WaitVerticalBlank
;; set up default palette
include "out/menu-palette.s"
;; set up playfield
move.w #(RASTER_Y_START<<8)|RASTER_X_START,DIWSTRT(a6)
move.w #((RASTER_Y_STOP-256)<<8)|(RASTER_X_STOP-256),DIWSTOP(a6)
move.w #(RASTER_X_START/2-SCREEN_RES),DDFSTRT(a6)
move.w #(RASTER_X_START/2-SCREEN_RES)+(8*((SCREEN_WIDTH/16)-1)),DDFSTOP(a6)
move.w #(SPLASH_COLOR_DEPTH<<12)|$200,BPLCON0(a6)
move.w #0,BPLCON1(a6)
move.w #SPLASH_SCREEN_WIDTH_BYTES*SPLASH_COLOR_DEPTH-SPLASH_SCREEN_WIDTH_BYTES,BPL1MOD(a6)
move.w #SPLASH_SCREEN_WIDTH_BYTES*SPLASH_COLOR_DEPTH-SPLASH_SCREEN_WIDTH_BYTES,BPL2MOD(a6)
;; poke bitplane pointers
lea splash,a1
lea splashCopperListBplPtr(pc),a2
moveq #SPLASH_COLOR_DEPTH-1,d0
.bitplaneloop:
move.l a1,d1
move.w d1,2(a2)
swap d1
move.w d1,6(a2)
lea SPLASH_SCREEN_WIDTH_BYTES(a1),a1 ; bit plane data is interleaved
addq #8,a2
dbra d0,.bitplaneloop
;; install copper list, then enable dma
lea splashCopperList(pc),a0
move.l a0,COP1LC(a6)
;; jsr WaitVerticalBlank
move.w #(DMAF_BLITTER|DMAF_SETCLR!DMAF_COPPER!DMAF_RASTER!DMAF_MASTER),DMACON(a6)
move.w #(INTF_SETCLR|INTF_VERTB|INTF_INTEN),INTENA(a6)
bsr RefreshDifficulty
bsr RenderMenu
.wait:
jsr WaitVerticalBlank
jsr _ProcessJoystick
RenderMenu:
;; small restore
move.l backgroundOffscreen,a0
add.l #((64)*(96/16)*5),a0
lea splash,a2
add.l #((134+32)*40*5)+((320-96)/16),a2
WaitBlitter
move.w #(BC0F_SRCA|BC0F_DEST|$f0),BLTCON0(A6)
move.w #0,BLTCON1(a6)
move.l #$ffffffff,BLTAFWM(a6) ;no masking of first/last word
move.w #0,BLTAMOD(a6) ;A modulo
move.w #(320-96)/8,BLTDMOD(a6) ;D modulo
move.l a0,BLTAPTH(a6) ;source graphic top left corner
move.l a2,BLTDPTH(a6) ;destination top left corner
move.w #((32*5)<<6)|(96/16),BLTSIZE(a6)
RenderVersion
lea menu,a1
lea splash,a0
move.w #(320/2)-(6*8)+4,d0
move.w #150-16,d1
jsr DrawMaskedText85
lea tutorial,a1
move.w #(320/2)-(6*8),d0
add.w #16,d1
jsr DrawMaskedText85
lea difficulty,a1
move.w #(320/2)-(6*8),d0
add.w #16,d1
jsr DrawMaskedText85
lea levelCounter,a1
move.w #(320/2)-(6*8)+(8*8),d0
jsr DrawMaskedText85
move.w #(320/2)-(6*8),d0
lea music,a1
add.w #16,d1
jsr DrawMaskedText85
lea credits,a1
add.w #16,d1
move.w #(320/2)-(6*8)+4,d0
jsr DrawMaskedText85
if TRACKLOADER=0
lea quit,a1
add.w #16,d1
move.w #(320/2)-(6*8),d0
jsr DrawMaskedText85
endif
rts
MenuUp:
cmp.l #playTopColor,selectedPtr
beq .done
PlaySound Jump
move.l selectedPtr,a0
move.w #MENU_TEXT_COLOR,(a0)
add.l #MENU_BOTTOM_OFFSET,a0
move.w #MENU_TEXT_BOTTOM_COLOR,(a0)
sub.l #MENU_OFFSET,selectedPtr
move.l selectedPtr,a0
move.w #MENU_SELECTED_TOP_COLOR,(a0)
add.l #MENU_BOTTOM_OFFSET,a0
move.w #MENU_SELECTED_BOTTOM_COLOR,(a0)
.done:
rts
MenuDown:
if TRACKLOADER=0
cmp.l #quitTopColor,selectedPtr
else
cmp.l #creditsTopColor,selectedPtr
endif
beq .done
PlaySound Jump
move.l selectedPtr,a0
move.w #MENU_TEXT_COLOR,(a0)
add.l #MENU_BOTTOM_OFFSET,a0
move.w #MENU_TEXT_BOTTOM_COLOR,(a0)
add.l #MENU_OFFSET-MENU_BOTTOM_OFFSET,a0
move.w #MENU_SELECTED_TOP_COLOR,(a0)
add.l #MENU_BOTTOM_OFFSET,a0
move.w #MENU_SELECTED_BOTTOM_COLOR,(a0)
add.l #MENU_OFFSET,selectedPtr
.done:
rts
ToggleMusic:
eor.w #1,musicOnFlag
cmp.w #1,musicOnFlag
beq .musicOn
.musicOff:
move.w #-2,fadeMusic ; fade out
lea musicOff,a0
lea music,a1
bsr StrCpy
bra .done
.musicOn:
move.w #2,fadeMusic ; fade in
lea musicOn,a0
lea music,a1
bsr StrCpy
bra .done
.done:
bsr RenderMenu
rts
ToggleDifficulty:
PlaySound Jump
add.l #4,nextLevelInstaller
lea levelCounter,a0
jsr IncrementCounter
cmp.l #nextLevelInstaller-8,nextLevelInstaller
ble RefreshDifficulty
move.l #levelInstallers,nextLevelInstaller
move.l #"0001",levelCounter
RefreshDifficulty:
bsr RenderMenu
rts
ButtonPressed:
cmp.l #playTopColor,selectedPtr
beq .playButton
cmp.l #musicTopColor,selectedPtr
beq .musicButton
cmp.l #levelTopColor,selectedPtr
beq .difficultyButton
cmp.l #creditsTopColor,selectedPtr
beq .creditsButton
cmp.l #tutorialTopColor,selectedPtr
beq .tutorialButton
if TRACKLOADER=0
cmp.l #quitTopColor,selectedPtr
beq .quitButton
endif
bra .done
if TRACKLOADER=0
.quitButton:
jmp QuitGame
endif
.difficultyButton:
bsr ToggleDifficulty
bra .done
.musicButton:
bsr ToggleMusic
bra .done
.creditsButton:
PlaySound Jump
jsr Credits
bra ReShowMenu
.done:
bra _ProcessJoystick
.playButton:
jmp StartGame
.tutorialButton:
move.l #tutorialLevelInstallers,nextLevelInstaller
jmp StartGame
WaitForButtonRelease:
.joystickPressed:
jsr WaitVerticalBlank
jsr PlayNextSound
jsr ReadJoystick
btst.b #0,joystick
bne .joystickPressed
rts
WaitForJoystickRelease:
move.b joystickpos,-(sp)
.wait:
jsr WaitVerticalBlank
jsr PlayNextSound
jsr ReadJoystick
move.b (sp),d0
cmp.b joystickpos,d0
beq .wait
move.b (sp)+,d7
rts
_ProcessJoystick:
bsr WaitForButtonRelease
.wait:
jsr ReadJoystick
jsr WaitVerticalBlank
jsr PlayNextSound
btst.b #0,joystick
bne .pressed
cmp.b #1,joystickpos ; up
bne .notUp
bsr MenuUp
bsr WaitForJoystickRelease
.notUp:
cmp.b #5,joystickpos ; down
bne .notDown
bsr MenuDown
bsr WaitForJoystickRelease
.notDown:
bra .wait
.pressed:
bra ButtonPressed
rts
StrCpy:
;; a0 - src
;; a1 - dest
.loop:
cmp.b #0,(a0)
beq .done
move.b (a0)+,(a1)+
bra .loop
.done:
rts
levelCounter:
dc.b "0001"
dc.b 0
align 2
musicOnFlag:
dc.w 1
menu:
dc.b " PLAY NOW! "
dc.b 0
difficulty:
dc.b "LEVEL - "
dc.b 0
tutorial:
dc.b " TUTORIAL "
dc.b 0
music:
dc.b "MUSIC - ON "
dc.b 0
credits:
dc.b " CREDITS "
dc.b 0
musicOn:
dc.b "MUSIC - ON "
dc.b 0
musicOff:
dc.b "MUSIC - OFF "
dc.b 0
if TRACKLOADER=0
quit:
dc.b " QUIT "
dc.b 0
endif
align 4
splashCopperList:
splashCopperListBplPtr:
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.w PLAY_COPPER_WORD,$fffe
dc.w COLOR31
playTopColor:
dc.w MENU_SELECTED_TOP_COLOR
dc.w PLAY_COPPER_WORD+(($1000/4)*3),$fffe
dc.w PLAY_COPPER_WORD+(($1000/4)*3),$fffe
dc.w COLOR31
playBottomColor:
dc.w MENU_SELECTED_BOTTOM_COLOR
dc.w PLAY_COPPER_WORD+$1000,$fffe
dc.w COLOR31
tutorialTopColor:
dc.w MENU_TEXT_COLOR
dc.w PLAY_COPPER_WORD+$1000+(($1000/4)*3),$fffe
dc.w PLAY_COPPER_WORD+$1000+(($1000/4)*3),$fffe
dc.w COLOR31,MENU_TEXT_BOTTOM_COLOR
dc.w PLAY_COPPER_WORD+$2000,$fffe
dc.w COLOR31
levelTopColor:
dc.w MENU_TEXT_COLOR
dc.w PLAY_COPPER_WORD+$2000+(($1000/4)*3),$fffe
dc.w PLAY_COPPER_WORD+$2000+(($1000/4)*3),$fffe
dc.w COLOR31,MENU_TEXT_BOTTOM_COLOR
dc.w PLAY_COPPER_WORD+$3000,$fffe
dc.w COLOR31
musicTopColor:
dc.w MENU_TEXT_COLOR
dc.w PLAY_COPPER_WORD+$3000+(($1000/4)*3),$fffe
dc.w PLAY_COPPER_WORD+$3000+(($1000/4)*3),$fffe
dc.w COLOR31,MENU_TEXT_BOTTOM_COLOR
dc.w PLAY_COPPER_WORD+$4000,$fffe
dc.w COLOR31
creditsTopColor:
dc.w MENU_TEXT_COLOR
dc.w PLAY_COPPER_WORD+$4000+(($1000/4)*3),$fffe
dc.w PLAY_COPPER_WORD+$4000+(($1000/4)*3),$fffe
dc.w COLOR31,MENU_TEXT_BOTTOM_COLOR
dc.w PLAY_COPPER_WORD+$5000,$fffe
if TRACKLOADER=0
dc.w COLOR31
quitTopColor:
dc.w MENU_TEXT_COLOR
dc.w $ffdf,$fffe
dc.w $06df,$fffe
dc.w COLOR31,MENU_TEXT_BOTTOM_COLOR
else
dc.w $ffdf,$fffe
dc.w $06df,$fffe
endif
dc.w $22df,$fffe
dc.w COLOR31,$bbb
dc.w $26df,$fffe
dc.w COLOR31,$999
dc.l $fffffffe
selectedPtr:
dc.l playTopColor