Merge pull request #122 from Bonta0/msuresume
MSU: Enable track resuming
This commit is contained in:
@@ -81,7 +81,12 @@ db #$20, #$19, #$08, #$31 ; year/month/day
|
|||||||
!REG_MSU_PACK_COUNT = $7F50AA
|
!REG_MSU_PACK_COUNT = $7F50AA
|
||||||
!REG_MSU_PACK_CURRENT = $7F50AB
|
!REG_MSU_PACK_CURRENT = $7F50AB
|
||||||
!REG_MSU_PACK_REQUEST = $7F50AC
|
!REG_MSU_PACK_REQUEST = $7F50AC
|
||||||
!REG_SPC_LOADING = $7F50AD
|
!REG_MSU_LOADED_TRACK = $7F50AD ; 2 bytes
|
||||||
|
!REG_SPC_LOADING = $7F50AF
|
||||||
|
!MSU_LOADED_TRACK = $7F5400
|
||||||
|
!MSU_RESUME_TRACK = $7F5401
|
||||||
|
!MSU_RESUME_TIME = $7F5402 ; 4 bytes
|
||||||
|
!MSU_RESUME_CONTROL = $7F5406
|
||||||
!REG_MUSIC_CONTROL = $012B
|
!REG_MUSIC_CONTROL = $012B
|
||||||
;!REG_MUSIC_CONTROL = $012C
|
;!REG_MUSIC_CONTROL = $012C
|
||||||
!REG_MUSIC_CONTROL_REQUEST = $012C
|
!REG_MUSIC_CONTROL_REQUEST = $012C
|
||||||
@@ -130,7 +135,6 @@ incsrc swordswap.asm
|
|||||||
incsrc stats.asm
|
incsrc stats.asm
|
||||||
incsrc scratchpad.asm
|
incsrc scratchpad.asm
|
||||||
incsrc map.asm
|
incsrc map.asm
|
||||||
incsrc msu.asm
|
|
||||||
incsrc dialog.asm
|
incsrc dialog.asm
|
||||||
incsrc entrances.asm
|
incsrc entrances.asm
|
||||||
incsrc clock.asm
|
incsrc clock.asm
|
||||||
@@ -198,6 +202,7 @@ incsrc elder.asm
|
|||||||
incsrc toast.asm
|
incsrc toast.asm
|
||||||
incsrc darkroomitems.asm
|
incsrc darkroomitems.asm
|
||||||
incsrc fastcredits.asm
|
incsrc fastcredits.asm
|
||||||
|
incsrc msu.asm
|
||||||
warnpc $A58000
|
warnpc $A58000
|
||||||
|
|
||||||
;org $228000 ; contrib area
|
;org $228000 ; contrib area
|
||||||
|
|||||||
132
msu.asm
132
msu.asm
@@ -116,12 +116,15 @@
|
|||||||
|
|
||||||
!FLAG_MSU_PLAY = #$01
|
!FLAG_MSU_PLAY = #$01
|
||||||
!FLAG_MSU_REPEAT = #$02
|
!FLAG_MSU_REPEAT = #$02
|
||||||
|
!FLAG_MSU_RESUME = #$04
|
||||||
!FLAG_MSU_STATUS_TRACK_MISSING = #$08
|
!FLAG_MSU_STATUS_TRACK_MISSING = #$08
|
||||||
!FLAG_MSU_STATUS_AUDIO_PLAYING = #$10
|
!FLAG_MSU_STATUS_AUDIO_PLAYING = #$10
|
||||||
!FLAG_MSU_STATUS_AUDIO_REPEATING = #$20
|
!FLAG_MSU_STATUS_AUDIO_REPEATING = #$20
|
||||||
!FLAG_MSU_STATUS_AUDIO_BUSY = #$40
|
!FLAG_MSU_STATUS_AUDIO_BUSY = #$40
|
||||||
!FLAG_MSU_STATUS_DATA_BUSY = #$80
|
!FLAG_MSU_STATUS_DATA_BUSY = #$80
|
||||||
|
|
||||||
|
!FLAG_RESUME_CANCEL = #$01
|
||||||
|
!FLAG_RESUME_FADEIN = #$02
|
||||||
|
|
||||||
!REG_CURRENT_MSU_TRACK = $010B
|
!REG_CURRENT_MSU_TRACK = $010B
|
||||||
!REG_CURRENT_VOLUME = $0127
|
!REG_CURRENT_VOLUME = $0127
|
||||||
@@ -145,6 +148,40 @@
|
|||||||
!VAL_VOLUME_HALF = #$80
|
!VAL_VOLUME_HALF = #$80
|
||||||
!VAL_VOLUME_FULL = #$FF
|
!VAL_VOLUME_FULL = #$FF
|
||||||
|
|
||||||
|
;================================================================================
|
||||||
|
; Check if A has an overworld track
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
IsOverworldTrack:
|
||||||
|
CMP #02 : BEQ .yes ; 2 - Hyrule Field
|
||||||
|
CMP #03 : BEQ .yes ; 3 - Time of Falling Rain
|
||||||
|
CMP #04 : BEQ .yes ; 4 - The Silly Pink Rabbit
|
||||||
|
CMP #05 : BEQ .yes ; 5 - Forest of Mystery
|
||||||
|
CMP #07 : BEQ .yes ; 7 - Kakariko Village
|
||||||
|
CMP #09 : BEQ .yes ; 9 - Dark Golden Land
|
||||||
|
CMP #15 : BEQ .yes ; 15 - Dark Woods
|
||||||
|
CMP #60 : BEQ .yes ; 60 - Light World OW (after ped pull)
|
||||||
|
CMP #61 : BEQ .yes ; 61 - Dark World OW (with all crystals)
|
||||||
|
.no
|
||||||
|
CLC : RTS
|
||||||
|
.yes
|
||||||
|
SEC : RTS
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
;================================================================================
|
||||||
|
; Check if the track in A should be resumed
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
IsResumableTrack:
|
||||||
|
PHA
|
||||||
|
LDA MSUResumeType : BEQ +
|
||||||
|
PLA
|
||||||
|
JSR IsOverworldTrack
|
||||||
|
RTS
|
||||||
|
+
|
||||||
|
PLA
|
||||||
|
SEC
|
||||||
|
RTS
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
;================================================================================
|
;================================================================================
|
||||||
; Extended OST/SPC fallback, decide which track to actually play
|
; Extended OST/SPC fallback, decide which track to actually play
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
@@ -402,6 +439,12 @@ StoreMusicOnDeath:
|
|||||||
MSUInit:
|
MSUInit:
|
||||||
PHP
|
PHP
|
||||||
|
|
||||||
|
LDA #$00
|
||||||
|
STA !MSU_LOADED_TRACK
|
||||||
|
STA !MSU_RESUME_TRACK
|
||||||
|
STA !MSU_RESUME_TIME : STA !MSU_RESUME_TIME+1 : STA !MSU_RESUME_TIME+2 : STA !MSU_RESUME_TIME+3
|
||||||
|
STA !MSU_RESUME_CONTROL
|
||||||
|
|
||||||
LDA NoBGM : BNE .done
|
LDA NoBGM : BNE .done
|
||||||
|
|
||||||
REP #$20
|
REP #$20
|
||||||
@@ -465,6 +508,41 @@ MSUInit:
|
|||||||
|
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
;================================================================================
|
||||||
|
; Stop MSU-1 audio track and save the current position when approriate
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
MSUStopPlaying:
|
||||||
|
PHA : XBA : PHA
|
||||||
|
LDA !MSU_LOADED_TRACK
|
||||||
|
JSR IsResumableTrack : BCC +
|
||||||
|
; dont save if we already saved recently
|
||||||
|
REP #$20
|
||||||
|
LDA !MSU_RESUME_TRACK : AND #$00FF : BEQ ++
|
||||||
|
LDA !NMI_COUNTER : !SUB !MSU_RESUME_TIME : PHA
|
||||||
|
LDA !NMI_COUNTER+2 : SBC !MSU_RESUME_TIME+2 : BNE +++
|
||||||
|
PLA : CMP MSUResumeTimer : !BLT .too_early
|
||||||
|
BRA ++
|
||||||
|
+++
|
||||||
|
PLA
|
||||||
|
++
|
||||||
|
; saving
|
||||||
|
LDA !NMI_COUNTER : STA !MSU_RESUME_TIME
|
||||||
|
LDA !NMI_COUNTER+2 : STA !MSU_RESUME_TIME+2
|
||||||
|
SEP #$20
|
||||||
|
|
||||||
|
LDA !MSU_LOADED_TRACK : STA !MSU_RESUME_TRACK
|
||||||
|
LDA #$00 : STA !MSU_LOADED_TRACK ; dont take this path if we're calling again
|
||||||
|
LDA !FLAG_MSU_RESUME : STA !REG_MSU_CONTROL ; save this track's position
|
||||||
|
PLA : XBA : PLA
|
||||||
|
RTS
|
||||||
|
.too_early
|
||||||
|
SEP #$20
|
||||||
|
+
|
||||||
|
LDA #$00 : STA !REG_MSU_CONTROL
|
||||||
|
PLA : XBA : PLA
|
||||||
|
RTS
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
;================================================================================
|
;================================================================================
|
||||||
; Play MSU-1 audio track
|
; Play MSU-1 audio track
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
@@ -475,6 +553,7 @@ MSUMain:
|
|||||||
LDA !REG_MSU_ID_01 : CMP !VAL_MSU_ID_01 : BEQ .continue
|
LDA !REG_MSU_ID_01 : CMP !VAL_MSU_ID_01 : BEQ .continue
|
||||||
.nomsu
|
.nomsu
|
||||||
SEP #$30
|
SEP #$30
|
||||||
|
-
|
||||||
JML SPCContinue
|
JML SPCContinue
|
||||||
.continue
|
.continue
|
||||||
LDA !REG_MSU_ID_23 : CMP !VAL_MSU_ID_23 : BNE .nomsu
|
LDA !REG_MSU_ID_23 : CMP !VAL_MSU_ID_23 : BNE .nomsu
|
||||||
@@ -486,16 +565,28 @@ MSUMain:
|
|||||||
LDA !REG_MSU_DELAYED_COMMAND : BEQ .do_fade
|
LDA !REG_MSU_DELAYED_COMMAND : BEQ .do_fade
|
||||||
|
|
||||||
.check_busy
|
.check_busy
|
||||||
LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_BUSY : BEQ .ready
|
LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_BUSY : BNE -
|
||||||
JML SPCContinue
|
|
||||||
.ready
|
.ready
|
||||||
LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BEQ .start
|
LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BNE -
|
||||||
JML SPCContinue
|
|
||||||
.start
|
.start
|
||||||
|
LDA !MSU_RESUME_CONTROL : BIT !FLAG_RESUME_CANCEL : BEQ +
|
||||||
|
EOR !FLAG_RESUME_CANCEL : STA !MSU_RESUME_CONTROL
|
||||||
|
REP #$20 : LDA !REG_MSU_LOADED_TRACK : STA !REG_MSU_TRACK : SEP #$20
|
||||||
|
BRA -
|
||||||
|
+
|
||||||
LDA !VAL_VOLUME_FULL
|
LDA !VAL_VOLUME_FULL
|
||||||
STA !REG_TARGET_VOLUME
|
STA !REG_TARGET_VOLUME
|
||||||
|
|
||||||
|
LDA !MSU_RESUME_CONTROL : BIT !FLAG_RESUME_FADEIN : BEQ +
|
||||||
|
EOR !FLAG_RESUME_FADEIN : STA !MSU_RESUME_CONTROL
|
||||||
|
LDA #$00
|
||||||
|
BRA ++
|
||||||
|
+
|
||||||
|
LDA !VAL_VOLUME_FULL
|
||||||
|
++
|
||||||
STA !REG_CURRENT_VOLUME
|
STA !REG_CURRENT_VOLUME
|
||||||
STA !REG_MSU_VOLUME
|
STA !REG_MSU_VOLUME
|
||||||
|
|
||||||
LDA !REG_CURRENT_MSU_TRACK : DEC : PHA
|
LDA !REG_CURRENT_MSU_TRACK : DEC : PHA
|
||||||
AND.b #$07 : TAY
|
AND.b #$07 : TAY
|
||||||
PLA : LSR #3 : TAX
|
PLA : LSR #3 : TAX
|
||||||
@@ -522,7 +613,7 @@ MSUMain:
|
|||||||
LDA !REG_TARGET_VOLUME : BRA .set
|
LDA !REG_TARGET_VOLUME : BRA .set
|
||||||
.mute
|
.mute
|
||||||
STZ !REG_CURRENT_VOLUME
|
STZ !REG_CURRENT_VOLUME
|
||||||
STZ !REG_MSU_CONTROL
|
JSR MSUStopPlaying
|
||||||
BRA .set
|
BRA .set
|
||||||
.increment
|
.increment
|
||||||
ADC !VAL_VOLUME_INCREMENT : BCS .max
|
ADC !VAL_VOLUME_INCREMENT : BCS .max
|
||||||
@@ -568,7 +659,7 @@ MSUMain:
|
|||||||
CPX !REG_CURRENT_MSU_TRACK : BNE +
|
CPX !REG_CURRENT_MSU_TRACK : BNE +
|
||||||
- : CPX #27 : BEQ +
|
- : CPX #27 : BEQ +
|
||||||
TXA
|
TXA
|
||||||
BRA .done+1
|
JMP .done+1
|
||||||
+
|
+
|
||||||
CPX !REG_CURRENT_COMMAND : BEQ -
|
CPX !REG_CURRENT_COMMAND : BEQ -
|
||||||
LDA.b #$00 : XBA
|
LDA.b #$00 : XBA
|
||||||
@@ -577,6 +668,8 @@ MSUMain:
|
|||||||
!SUB !REG_MSU_PACK_COUNT : BRA -
|
!SUB !REG_MSU_PACK_COUNT : BRA -
|
||||||
+
|
+
|
||||||
|
|
||||||
|
JSR MSUStopPlaying
|
||||||
|
|
||||||
PHX : PHA : TXA : PLX
|
PHX : PHA : TXA : PLX
|
||||||
REP #$20
|
REP #$20
|
||||||
BEQ +
|
BEQ +
|
||||||
@@ -585,10 +678,35 @@ MSUMain:
|
|||||||
DEX : BNE -
|
DEX : BNE -
|
||||||
+
|
+
|
||||||
STA !REG_MSU_TRACK
|
STA !REG_MSU_TRACK
|
||||||
|
STA !REG_MSU_LOADED_TRACK
|
||||||
SEP #$20
|
SEP #$20
|
||||||
|
|
||||||
STZ !REG_MSU_CONTROL
|
|
||||||
PLX
|
PLX
|
||||||
|
TXA : CMP !MSU_RESUME_TRACK : BNE + ; dont resume if too late
|
||||||
|
REP #$20
|
||||||
|
LDA !NMI_COUNTER : !SUB !MSU_RESUME_TIME : PHA
|
||||||
|
LDA !NMI_COUNTER+2 : SBC !MSU_RESUME_TIME+2 : BNE ++
|
||||||
|
PLA : CMP MSUResumeTimer : !BGE +++
|
||||||
|
SEP #$20
|
||||||
|
LDA !FLAG_RESUME_FADEIN : BRA .done_resume
|
||||||
|
++
|
||||||
|
PLA
|
||||||
|
+++
|
||||||
|
SEP #$20
|
||||||
|
LDA !FLAG_RESUME_CANCEL
|
||||||
|
.done_resume:
|
||||||
|
STA !MSU_RESUME_CONTROL
|
||||||
|
LDA #$00 : STA !MSU_RESUME_TRACK
|
||||||
|
+
|
||||||
|
CPX #07 : BNE + ; Kakariko Village
|
||||||
|
LDA $10 : CMP #$07 : BNE +
|
||||||
|
; we're in link's house -> ignore
|
||||||
|
LDA #$00
|
||||||
|
BRA ++
|
||||||
|
+
|
||||||
|
TXA
|
||||||
|
++
|
||||||
|
STA !MSU_LOADED_TRACK
|
||||||
STX !REG_CURRENT_MSU_TRACK
|
STX !REG_CURRENT_MSU_TRACK
|
||||||
LDA !REG_MSU_PACK_CURRENT : CMP #$FE : !BLT +
|
LDA !REG_MSU_PACK_CURRENT : CMP #$FE : !BLT +
|
||||||
LDA #$00 : BRA ++
|
LDA #$00 : BRA ++
|
||||||
|
|||||||
11
tables.asm
11
tables.asm
@@ -992,8 +992,14 @@ db $00 ; $00 = BGM enabled (default) $01 = BGM disabled
|
|||||||
org $30821B ; PC 0x18021B
|
org $30821B ; PC 0x18021B
|
||||||
FastFanfare:
|
FastFanfare:
|
||||||
db $00 ; $00 = Normal fanfare (default) $01 = Fast fanfare
|
db $00 ; $00 = Normal fanfare (default) $01 = Fast fanfare
|
||||||
|
org $30821C ; PC 0x18021C
|
||||||
|
MSUResumeType:
|
||||||
|
db $01 ; Type of tracks to resume #$00 = Everything - #$01 = Overworld (default)
|
||||||
|
org $30821D ; PC 0x18021D
|
||||||
|
MSUResumeTimer:
|
||||||
|
dw $0708 ; Number of frames on a different track until we no longer resume (0x708 = 1800 = ~30s)
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
; 0x18021C - 0x18021F (unused)
|
; 0x18021F - 0x18021F (unused)
|
||||||
;================================================================================
|
;================================================================================
|
||||||
; $308220 (0x180220) - $30823F (0x18023F)
|
; $308220 (0x180220) - $30823F (0x18023F)
|
||||||
; Plandomizer Author Name (ASCII) - Leave unused chars as 0
|
; Plandomizer Author Name (ASCII) - Leave unused chars as 0
|
||||||
@@ -1522,8 +1528,9 @@ dw #9999 ; Rupee Limit
|
|||||||
; $7F5100 - $7F51FF - Block Cypher Buffer
|
; $7F5100 - $7F51FF - Block Cypher Buffer
|
||||||
; $7F5200 - $7F52FF - RNG Pointer Block
|
; $7F5200 - $7F52FF - RNG Pointer Block
|
||||||
; $7F5300 - $7F53FF - Multiworld Block
|
; $7F5300 - $7F53FF - Multiworld Block
|
||||||
|
; $7F5400 - $7F540F - MSU Block
|
||||||
|
|
||||||
; $7F5400 - $7F56FF - Unused
|
; $7F5410 - $7F56FF - Unused
|
||||||
|
|
||||||
; $7F5700 - $7F57FF - Dialog Buffer
|
; $7F5700 - $7F57FF - Dialog Buffer
|
||||||
;
|
;
|
||||||
|
|||||||
Reference in New Issue
Block a user