diff options
author | dannye <corrnondacqb@yahoo.com> | 2016-04-09 16:50:47 -0500 |
---|---|---|
committer | dannye <corrnondacqb@yahoo.com> | 2016-04-09 16:50:47 -0500 |
commit | 726756ab18609ec81c8292aeeb7203e75cfd1bf7 (patch) | |
tree | 030619f9c4d0c6c7ff4f5005bde160252c42e538 /src | |
parent | 9c57218a97f990348545e320a840ca7c0f46e50a (diff) |
Clarify how loop and call return addresses are handled
Diffstat (limited to 'src')
-rwxr-xr-x | src/audio/music1.asm | 113 | ||||
-rwxr-xr-x | src/audio/music2.asm | 113 | ||||
-rwxr-xr-x | src/wram.asm | 21 |
3 files changed, 134 insertions, 113 deletions
diff --git a/src/audio/music1.asm b/src/audio/music1.asm index 35a9a7b..5b0436c 100755 --- a/src/audio/music1.asm +++ b/src/audio/music1.asm @@ -151,8 +151,8 @@ Func_f407d: ; f407d (3d:407d) ld a, c cp $4 jr nz, .asm_f40bb - ld hl, Unknown_f4c20 - ld bc, wMusicReturnAddress + ld hl, Music1_ChannelLoopStacks + ld bc, wMusicChannelStackPointers ld d, $8 .asm_f40e2 ld a, [hli] @@ -291,10 +291,10 @@ Music1_PlaySong: ; f418c (3d:418c) ld [wMusicE8], a ld [wMusicVibratoDelay], a ld [wMusicEC], a - ld a, [Unknown_f4c20] - ld [wMusicReturnAddress], a - ld a, [Unknown_f4c20 + 1] - ld [wMusicReturnAddress + 1], a + ld a, [Music1_ChannelLoopStacks] + ld [wMusicChannelStackPointers], a + ld a, [Music1_ChannelLoopStacks + 1] + ld [wMusicChannelStackPointers + 1], a ld a, $8 ld [wMusicE9], a .noChannel1 @@ -317,10 +317,10 @@ Music1_PlaySong: ; f418c (3d:418c) ld [wMusicE8 + 1], a ld [wMusicVibratoDelay + 1], a ld [wMusicEC + 1], a - ld a, [Unknown_f4c20 + 2] - ld [wMusicReturnAddress + 2], a - ld a, [Unknown_f4c20 + 3] - ld [wMusicReturnAddress + 3], a + ld a, [Music1_ChannelLoopStacks + 2] + ld [wMusicChannelStackPointers + 2], a + ld a, [Music1_ChannelLoopStacks + 3] + ld [wMusicChannelStackPointers + 3], a ld a, $8 ld [wMusicE9 + 1], a .noChannel2 @@ -343,10 +343,10 @@ Music1_PlaySong: ; f418c (3d:418c) ld [wMusicE8 + 2], a ld [wMusicVibratoDelay + 2], a ld [wMusicEC + 2], a - ld a, [Unknown_f4c20 + 4] - ld [wMusicReturnAddress + 4], a - ld a, [Unknown_f4c20 + 5] - ld [wMusicReturnAddress + 5], a + ld a, [Music1_ChannelLoopStacks + 4] + ld [wMusicChannelStackPointers + 4], a + ld a, [Music1_ChannelLoopStacks + 5] + ld [wMusicChannelStackPointers + 5], a ld a, $40 ld [wMusicE9 + 2], a .noChannel3 @@ -368,10 +368,10 @@ Music1_PlaySong: ; f418c (3d:418c) ld [wMusicE8 + 3], a ld [wMusicVibratoDelay + 3], a ld [wMusicEC + 3], a - ld a, [Unknown_f4c20 + 6] - ld [wMusicReturnAddress + 6], a - ld a, [Unknown_f4c20 + 7] - ld [wMusicReturnAddress + 7], a + ld a, [Music1_ChannelLoopStacks + 6] + ld [wMusicChannelStackPointers + 6], a + ld a, [Music1_ChannelLoopStacks + 7] + ld [wMusicChannelStackPointers + 7], a ld a, $40 ld [wMusicE9 + 3], a .noChannel4 @@ -931,39 +931,39 @@ Music1_EndMainLoop: ; f45fd (3d:45fd) Music1_Loop: ; f4609 (3d:4609) pop de - ld a, [de] + ld a, [de] ; get loop count inc de push af - call Music1_GetReturnAddress - ld [hl], e - inc hl - ld [hl], d + call Music1_GetChannelStackPointer + ld [hl], e ; + inc hl ; store address of command at beginning of loop + ld [hl], d ; inc hl pop af - ld [hl], a + ld [hl], a ; store loop count inc hl push de - call Music1_SetReturnAddress + call Music1_SetChannelStackPointer jp Music1_PlayNextNote_pop Music1_EndLoop: ; f461e (3d:461e) - call Music1_GetReturnAddress + call Music1_GetChannelStackPointer dec hl - ld a, [hl] + ld a, [hl] ; get remaining loop count dec a - jr z, .asm_f4630 + jr z, .loopDone ld [hld], a ld d, [hl] dec hl ld e, [hl] pop hl - ld h, d - ld l, e + ld h, d ; + ld l, e ; go to address of beginning of loop jp Music1_PlayNextNote -.asm_f4630 +.loopDone dec hl dec hl - call Music1_SetReturnAddress + call Music1_SetChannelStackPointer jp Music1_PlayNextNote_pop Music1_jp: ; f4638 (3d:4638) @@ -974,12 +974,12 @@ Music1_jp: ; f4638 (3d:4638) jp Music1_PlayNextNote Music1_call: ; f463f (3d:463f) - call Music1_GetReturnAddress + call Music1_GetChannelStackPointer pop de ld a, e - ld [hli], a - ld a, d - ld [hli], a + ld [hli], a ; + ld a, d ; store address of command after call + ld [hli], a ; ld a, [de] ld b, a inc de @@ -988,20 +988,20 @@ Music1_call: ; f463f (3d:463f) ld e, b ld b, $0 push de - call Music1_SetReturnAddress + call Music1_SetChannelStackPointer jp Music1_PlayNextNote_pop Music1_ret: ; f4656 (3d:4656) pop de - call Music1_GetReturnAddress + call Music1_GetChannelStackPointer dec hl - ld a, [hld] - ld e, [hl] + ld a, [hld] ; + ld e, [hl] ; retrieve address of caller of this sub branch ld d, a inc de inc de push de - call Music1_SetReturnAddress + call Music1_SetChannelStackPointer jp Music1_PlayNextNote_pop Music1_musice4: ; f4667 (3d:4667) @@ -1126,10 +1126,11 @@ Music1_end: ; f46f4 (3d:46f4) pop hl ret -; returns the address where the address to -; return to is stored for the current channel -Music1_GetReturnAddress: ; f46fc (3d:46fc) - ld hl, wMusicReturnAddress +; returns the address of the top of the stack +; for the current channel +; used for loops and calls +Music1_GetChannelStackPointer: ; f46fc (3d:46fc) + ld hl, wMusicChannelStackPointers add hl, bc add hl, bc ld a, [hli] @@ -1137,12 +1138,11 @@ Music1_GetReturnAddress: ; f46fc (3d:46fc) ld l, a ret -; puts the address in hl where the address to -; return to is stored for the currentchannel -Music1_SetReturnAddress: ; f4705 (3d:4705) +; sets the current channel's stack pointer to hl +Music1_SetChannelStackPointer: ; f4705 (3d:4705) ld d, h ld e, l - ld hl, wMusicReturnAddress + ld hl, wMusicChannelStackPointers add hl, bc add hl, bc ld [hl], e @@ -1722,7 +1722,7 @@ Func_f49dc: ; f49dc (3d:49dc) call Music1_CopyData ld a, $0 ld [wdeac], a - ld hl, wMusicReturnAddress + ld hl, wMusicChannelStackPointers ld de, $dead ld a, $8 call Music1_CopyData @@ -1826,12 +1826,12 @@ Func_f4b01: ; f4b01 (3d:4b01) ld a, [wdeac] ld [wddef], a ld hl, $dead - ld de, wMusicReturnAddress + ld de, wMusicChannelStackPointers ld a, $8 call Music1_CopyData ld hl, $deb5 - ld de, $ddfb - ld a, $30 + ld de, wMusicCh1Stack + ld a, $c * 4 call Music1_CopyData ret @@ -1846,8 +1846,11 @@ Music1_CopyData: ; f4c18 (3d:4c18) jr nz, .asm_f4c19 ret -Unknown_f4c20: ; f4c20 (3d:4c20) -INCBIN "baserom.gbc",$f4c20,$f4c28 - $f4c20 +Music1_ChannelLoopStacks: ; f4c20 (3d:4c20) + dw wMusicCh1Stack + dw wMusicCh2Stack + dw wMusicCh3Stack + dw wMusicCh4Stack Unknown_f4c28: ; f4c28 (3d:4c28) INCBIN "baserom.gbc",$f4c28,$f4c30 - $f4c28 diff --git a/src/audio/music2.asm b/src/audio/music2.asm index 5bdc8d3..ca934de 100755 --- a/src/audio/music2.asm +++ b/src/audio/music2.asm @@ -151,8 +151,8 @@ Func_f807d: ; f807d (3e:407d) ld a, c cp $4 jr nz, .asm_f80bb - ld hl, Unknown_f8c20 - ld bc, wMusicReturnAddress + ld hl, Music2_ChannelLoopStacks + ld bc, wMusicChannelStackPointers ld d, $8 .asm_f80e2 ld a, [hli] @@ -291,10 +291,10 @@ Music2_PlaySong: ; f818c (3e:418c) ld [wMusicE8], a ld [wMusicVibratoDelay], a ld [wMusicEC], a - ld a, [Unknown_f4c20] - ld [wMusicReturnAddress], a - ld a, [Unknown_f4c20 + 1] - ld [wMusicReturnAddress + 1], a + ld a, [Music2_ChannelLoopStacks] + ld [wMusicChannelStackPointers], a + ld a, [Music2_ChannelLoopStacks + 1] + ld [wMusicChannelStackPointers + 1], a ld a, $8 ld [wMusicE9], a .noChannel1 @@ -317,10 +317,10 @@ Music2_PlaySong: ; f818c (3e:418c) ld [wMusicE8 + 1], a ld [wMusicVibratoDelay + 1], a ld [wMusicEC + 1], a - ld a, [Unknown_f4c20 + 2] - ld [wMusicReturnAddress + 2], a - ld a, [Unknown_f4c20 + 3] - ld [wMusicReturnAddress + 3], a + ld a, [Music2_ChannelLoopStacks + 2] + ld [wMusicChannelStackPointers + 2], a + ld a, [Music2_ChannelLoopStacks + 3] + ld [wMusicChannelStackPointers + 3], a ld a, $8 ld [wMusicE9 + 1], a .noChannel2 @@ -343,10 +343,10 @@ Music2_PlaySong: ; f818c (3e:418c) ld [wMusicE8 + 2], a ld [wMusicVibratoDelay + 2], a ld [wMusicEC + 2], a - ld a, [Unknown_f4c20 + 4] - ld [wMusicReturnAddress + 4], a - ld a, [Unknown_f4c20 + 5] - ld [wMusicReturnAddress + 5], a + ld a, [Music2_ChannelLoopStacks + 4] + ld [wMusicChannelStackPointers + 4], a + ld a, [Music2_ChannelLoopStacks + 5] + ld [wMusicChannelStackPointers + 5], a ld a, $40 ld [wMusicE9 + 2], a .noChannel3 @@ -368,10 +368,10 @@ Music2_PlaySong: ; f818c (3e:418c) ld [wMusicE8 + 3], a ld [wMusicVibratoDelay + 3], a ld [wMusicEC + 3], a - ld a, [Unknown_f4c20 + 6] - ld [wMusicReturnAddress + 6], a - ld a, [Unknown_f4c20 + 7] - ld [wMusicReturnAddress + 7], a + ld a, [Music2_ChannelLoopStacks + 6] + ld [wMusicChannelStackPointers + 6], a + ld a, [Music2_ChannelLoopStacks + 7] + ld [wMusicChannelStackPointers + 7], a ld a, $40 ld [wMusicE9 + 3], a .noChannel4 @@ -931,39 +931,39 @@ Music2_EndMainLoop: ; f85fd (3e:45fd) Music2_Loop: ; f8609 (3e:4609) pop de - ld a, [de] + ld a, [de] ; get loop count inc de push af - call Music2_GetReturnAddress - ld [hl], e - inc hl - ld [hl], d + call Music2_GetChannelStackPointer + ld [hl], e ; + inc hl ; store address of command at beginning of loop + ld [hl], d ; inc hl pop af - ld [hl], a + ld [hl], a ; store loop count inc hl push de - call Music2_SetReturnAddress + call Music2_SetChannelStackPointer jp Music2_PlayNextNote_pop Music2_EndLoop: ; f861e (3e:461e) - call Music2_GetReturnAddress + call Music2_GetChannelStackPointer dec hl - ld a, [hl] + ld a, [hl] ; get remaining loop count dec a - jr z, .asm_f8630 + jr z, .loopDone ld [hld], a ld d, [hl] dec hl ld e, [hl] pop hl - ld h, d - ld l, e + ld h, d ; + ld l, e ; go to address of beginning of loop jp Music2_PlayNextNote -.asm_f8630 +.loopDone dec hl dec hl - call Music2_SetReturnAddress + call Music2_SetChannelStackPointer jp Music2_PlayNextNote_pop Music2_jp: ; f8638 (3e:4638) @@ -974,12 +974,12 @@ Music2_jp: ; f8638 (3e:4638) jp Music2_PlayNextNote Music2_call: ; f863f (3e:463f) - call Music2_GetReturnAddress + call Music2_GetChannelStackPointer pop de ld a, e - ld [hli], a - ld a, d - ld [hli], a + ld [hli], a ; + ld a, d ; store address of command after call + ld [hli], a ; ld a, [de] ld b, a inc de @@ -988,20 +988,20 @@ Music2_call: ; f863f (3e:463f) ld e, b ld b, $0 push de - call Music2_SetReturnAddress + call Music2_SetChannelStackPointer jp Music2_PlayNextNote_pop Music2_ret: ; f8656 (3e:4656) pop de - call Music2_GetReturnAddress + call Music2_GetChannelStackPointer dec hl - ld a, [hld] - ld e, [hl] + ld a, [hld] ; + ld e, [hl] ; retrieve address of caller of this sub branch ld d, a inc de inc de push de - call Music2_SetReturnAddress + call Music2_SetChannelStackPointer jp Music2_PlayNextNote_pop Music2_musice4: ; f8667 (3e:4667) @@ -1126,10 +1126,11 @@ Music2_end: ; f86f4 (3e:46f4) pop hl ret -; returns the address where the address to -; return to is stored for the current channel -Music2_GetReturnAddress: ; f86fc (3e:46fc) - ld hl, wMusicReturnAddress +; returns the address of the top of the stack +; for the current channel +; used for loops and calls +Music2_GetChannelStackPointer: ; f86fc (3e:46fc) + ld hl, wMusicChannelStackPointers add hl, bc add hl, bc ld a, [hli] @@ -1137,12 +1138,11 @@ Music2_GetReturnAddress: ; f86fc (3e:46fc) ld l, a ret -; puts the address in hl where the address to -; return to is stored for the currentchannel -Music2_SetReturnAddress: ; f8705 (3e:4705) +; sets the current channel's stack pointer to hl +Music2_SetChannelStackPointer: ; f8705 (3e:4705) ld d, h ld e, l - ld hl, wMusicReturnAddress + ld hl, wMusicChannelStackPointers add hl, bc add hl, bc ld [hl], e @@ -1722,7 +1722,7 @@ Func_f89dc: ; f89dc (3e:49dc) call Music2_CopyData ld a, $0 ld [wdeac], a - ld hl, wMusicReturnAddress + ld hl, wMusicChannelStackPointers ld de, $dead ld a, $8 call Music2_CopyData @@ -1826,12 +1826,12 @@ Func_f8b01: ; f8b01 (3e:4b01) ld a, [wdeac] ld [wddef], a ld hl, $dead - ld de, wMusicReturnAddress + ld de, wMusicChannelStackPointers ld a, $8 call Music2_CopyData ld hl, $deb5 - ld de, $ddfb - ld a, $30 + ld de, wMusicCh1Stack + ld a, $c * 4 call Music2_CopyData ret @@ -1846,8 +1846,11 @@ Music2_CopyData: ; f8c18 (3e:4c18) jr nz, .asm_f8c19 ret -Unknown_f8c20: ; f8c20 (3e:4c20) -INCBIN "baserom.gbc",$f8c20,$f8c28 - $f8c20 +Music2_ChannelLoopStacks: ; f8c20 (3e:4c20) + dw wMusicCh1Stack + dw wMusicCh2Stack + dw wMusicCh3Stack + dw wMusicCh4Stack Unknown_f8c28: ; f8c28 (3e:4c28) INCBIN "baserom.gbc",$f8c28,$f8c30 - $f8c28 diff --git a/src/wram.asm b/src/wram.asm index dce68e1..fd102f6 100755 --- a/src/wram.asm +++ b/src/wram.asm @@ -1335,11 +1335,26 @@ wMusicPanning:: ; ddf1 wddf2:: ; ddf2 ds $1 -; 4 pointers to the addresses of the return point of the sub branch -wMusicReturnAddress:: ; ddf3 +; 4 pointers to the positions on the stack for each channel +wMusicChannelStackPointers:: ; ddf3 ds $8 - ds $58 +; these stacks contain the address of the command to return to at the end of a sub branch (2 bytes) +; and also contain the address of the command to return to at the end of a loop (2 bytes for address and +; 1 byte for loop count) +wMusicCh1Stack:: ; ddfb + ds $c + +wMusicCh2Stack:: ; de07 + ds $c + +wMusicCh3Stack:: ; de13 + ds $c + +wMusicCh4Stack:: ; de1f + ds $c + + ds $28 wde53:: ; de53 ds $1 |