ポーズ
ポーズ音の処理は少し特殊で、ポーズすると演奏全て停止、ポーズ解除で演奏していた全てのチャンネルが演奏の続きから復帰するという動作になります。
大まかな処理の流れはフェードアウト中かをチェックし、その状態は(E280H)b3[ポーズ時フェードアウト中フラグ]に記録しb0[フェードアウトフラグ]は処理が進まないように一旦解除。ポーズ音はSCC Ch.Aのみで演奏されるので現在のSCC Ch.Aのワークエリアを(E200H)以降へバックアップ。
PSG Ch.A/B/Cの(+0DH)の下位4bitを保存し(+0CH)[音量データ]のb4を0にしてハードウェアエンベロープoff(音量はそのまま)。SCCはCh.BからCh.Eまでの音量レジスタを直接0に設定します。
PSGはレジスタに出力する音量はそのままですが、トーン/ノイズ両方offになるので音が出なくなり、SCCは直接レジスタの音量が0にされて以降は、書き込みフラグ判定によりレジスタが変更されないので無音のままとなります。
フラグやワークエリアの準備ができたら、通常の曲設定と同じようにポーズ音を設定します。
ドライバの処理は、ポーズ中をフラグで判定すると、各チャンネルの処理へ行く前に分岐し、ポーズ音専用のルーチンに流れます。
そこではSCC Ch.Aのみ処理が実行されるルーチンとなり、他のチャンネルの処理は実行されません。
そのため、他のチャンネルは無音状態から動作しなくなり、SCC Ch.Aのみポーズ音を演奏します。
ポーズ解除ではフラグとワークエリアを戻します。フェードアウト中であったのならフェードアウトフラグも復帰させます。
SCC Ch.Aはポーズ音を演奏したのでワークエリアのデータをバックアップから戻すとともに、波形を再書き込みするようにフラグを変更。
SCCのレジスタ書き込みフラグを全て有効にし、レジスタ書き込み処理へジャンプします。
これらのコントロールも曲番号のセットで行っています。82H番でポーズ設定、81H番でポーズ解除です。
因みにPSG Ch.A/Bの(+0DH)下位4bitの保存にバグがあるようです。これらのデータを(E2BBH)に上位4bit[Ch.B]下位4bit[Ch.A]に合成して保存する時、ORを使うところをANDにしているので(多分)、(E2BBH)に必ず0が保存されてしまいます。
復帰する時に、次の音まで音が出ないという状況になるかと思われますが、PSGは短い間隔で次の音を鳴らすことが多いので影響はさほどないのかもしれません。
ついでにスペースマンボウではどうなっているのかと見たところ、1バイトずつ個別に保存するように変わっているようでした。