Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save RGBA-CRT/c7b50d0fdc2095feaf3c163c8b90ee31 to your computer and use it in GitHub Desktop.
Save RGBA-CRT/c7b50d0fdc2095feaf3c163c8b90ee31 to your computer and use it in GitHub Desktop.
Zanacのサウンドテストとその他解析メモ
;61e0に以下を配置。タイトル画面のキーUpdateの後ろの処理をフックする(ファイルオフセット9B3Aあたりに4C E0 61 EA EA EA)
;左右で曲セレクト、ステージの数値が変わる
;Aボタンで再生
;SEL+STARTでステージセレクト反映
;エンディングの隠しメッセージ当たりのデータを上書きしているので注意。
LDA $F5
AND #$03
BEQ ch2
LDA $F5
AND #$02
ADC $77
SEC
SBC #$01
STA $77
jsr $CE54; update screen
ch2:
LDA $F5
AND #$80
BEQ ch
JSR snd_stop
lda $77
JSR snd_play
ch:
LDA $F5
AND #$10
BEQ exit
JMP $CB52
exit:
JMP $CB4A
https://www.youtube.com/watch?v=N1a3EraemyQ 曲名準拠
BGM LIST(FDS)
0: 無音 サイズ:0xa
1: ステージ1 サイズ:0xF1 << NES版01(0xf6)
2: ラストステージ (Last Stage)
3: タイトル
4: ゲームオーバー
5: ラスボス
6: SE(0番武器など)
7: ステージ開始ファンファーレ
10: ED
25(19): ステージBGM 2 (Stage BGM 2))(0xF2) << NES版31(0x67)
26(1A): ボス戦
27(1B): ボス撃破
29(1D): ステージBGM 3 (Stage BGM 3) DISK ver. / MSX ステージBGM B (126h)  << NES版32(0x133
30(1E): Stage Clear
おそらくポインタ終了。マックス1Eまで
NES版は31(??)から追加BGM
NES版BGMテーブル
F0FE
seq:
hader: https://sankichi.backdrop.jp/zanacsound-nes2fds.html
00: KEY OFF
01~60h: NOTE
80 jump
E0: ???
E1~: 休符
ーーー
NES版のBGMをFDS版に移植したい
1. ステージ1をNES版に差し替え
ちょっと容量増えてるのでダメならキーを下げる
2. ステージ2をNES版の31に差し替え
3. ステージ3をNES版の32に差し替え
4. Stage Clearを13バイトずらす
5. 曲のアサインが気に入らなかったらポインタをスワップする
とするとFDS版に追加BGMが実現できるかも??
--------
fds bgm tbl7
0. D5D1 64h bytes??
1. D635 f2h bytes??
2. D727 6dh bytes??
3. D794 e0h bytes??
4. D874 7fh bytes??
5. D8F3 4fh bytes??
6. D942 17h bytes??
7. D959 65h bytes??
8. D9BE 2dh bytes??
9. D9EB 35h bytes??
10. DA20 deh bytes??
11. DAFE 39h bytes??
12. DB37 3bh bytes??
13. DB72 eh bytes??
14. DB80 10h bytes??
15. DB90 14h bytes??
16. DBA4 13h bytes??
17. DBB7 13h bytes??
18. DBCA 19h bytes??
19. DBE3 15h bytes??
20. DBF8 10h bytes??
21. DC08 11h bytes??
22. DC19 13h bytes??
23. DC2C 16h bytes??
24. DC42 15h bytes??
25. DC57 f2h bytes??
26. DD49 87h bytes??
27. DDD0 5ch bytes??
28. DE2C 23h bytes??
29. DE4F 126h bytes??
30. DF75
---
nes bgm tabl
0. F180 89h bytes??
1. F209 f6h bytes??
2. F2FF 73h bytes??
3. F372 e6h bytes??
4. F458 80h bytes??
5. F4D8 53h bytes??
6. F52B 19h bytes??
7. F544 67h bytes??
8. F5AB 2dh bytes??
9. F5D8 35h bytes??
10. F60D e2h bytes??
11. F6EF 39h bytes??
12. F728 3dh bytes??
13. F765 eh bytes??
14. F773 10h bytes??
15. F783 14h bytes??
16. F797 13h bytes??
17. F7AA 13h bytes??
18. F7BD 1bh bytes??
19. F7D8 15h bytes??
20. F7ED 10h bytes??
21. F7FD 11h bytes??
22. F80E 13h bytes??
23. F821 16h bytes??
24. F837 15h bytes??
25. F84C f6h bytes??
26. F942 8fh bytes??
27. F9D1 5ch bytes??
28. FA2D 23h bytes??
29. FA50 12ah bytes??
30. FB7A 61h bytes??
31. FBDB 67h bytes??
32. FC42 133h bytes??
33. FD75 e7h bytes??
34. FE5C 15h bytes??
35. FE71
@RGBA-CRT
Copy link
Author

RGBA-CRT commented May 5, 2024

seq
- 00    : note off
- 01-7f : note on
- 80-af : ???, 引数1byte
  - 例:8DというOpcodeを読んだ場合
  - 8Dを右シフトして1Aにして
  - スタックに固定値D15Dを積む -> これは関数ポインタの戻りが次のコマンド処理に戻れるよう
  - D187+1A~D188+1Aのアドレスをスタックを積む → 関数テーブル_D187[0x1A]
  - 8Dの隣の値、例として06を引数としてAレジスタに読み込む
  - 関数テーブルにジャンプ
  - X:関数テーブルIdx , Y:読み込みIdx
- B0-FF : 休符??


関数テーブル
-   :80 (2byte): D1A2: アドレス引数。絶対ジャンプ
-   :81 (2byte): D1AD: ループ付きジャンプかな? カウンタは$0477+(opcode<<1)に保存。途中で0x80コマンドにジャンプしている。
-   :82        : D2B4: 推測: 1byte
-   :83        : D1C0: 推測: 1byte
-   :84        : D1FB: 推測: 1byte
-   :85        : D1C4: 推測: 1byte
-   :86 (1byte): D1C8: 推測: 1byte
-   :87        : D1D6: 推測: 1byte
-   :88        : D443: 推測: 1byte, snd_playなのでSE鳴らすか次の曲?
- 12:89 (1byte): D1D2: 推測: 1byte, 8Aコマンドのテーブルのサイズ設定では?
- 14:8A (2byte): D226: アドレスの先をノートの増減テーブルとして設定。ループする
-   :8B        : D1FF: 推測: 2byte
-   :8C        : D218: 推測: 2byte
- 1A:8D (1byte): D24B: 引数を$04a7+($0401)に加算
- EOT, 以降プログラムなので違うだろう。

チャンネルのシーケンスは80の絶対ジャンプをもって終了のように見えるが、実際には次のトラックのシーケンスが始まる前にデータが挟まっていることがある
例:d702-d70a
三角波ベースのコードとかにつかっていそう

↑89コマンドでテーブルサイズ設定、8Aコマンドでテーブルアドレス指定
三角波と矩形波2chのアルペジオで共有していてコード的な使い方をしていそう

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment