playlength を再生完了にせず随時停めている.
length が 0 に達しない状態で address 0x1ff80d.w data 0x60 -> 0 を頻発.
ソフト自体は bios を使っていてかなりきれい.
address 0x1ff80d.w data 0x60 -> 0 の処理自体は HDL ソース上でも問題がない事が判明. この問題は 6280 が address 0x1ff80d.w data 0x60 のままにしていることが原因だと思われる.
メインループで回している ADPCM controller status の reset 条件を満たしていないため、ADPCM の再生が停まらないのが原因.
5425
jsr $e045
tay
beq $5432
cpx #4
bne $5432
jsr $e030 <- adpcm reset, A==0x20 && X==0x04
lda $4f91
5432
....
具体的な部分は jsr $e045 内部の lda $1803. 対象 address 0x1ff803.r.3:2 の実装がよくなかった. この bit は ADPCM の再生状態を得るのだが bit3 に関してはその前の $180c (address 0x1ff80c.r.0) で得られるため利用されることは少ないと思われる.
bit3 は ADPCM length register bit15:0 == 0 && (fifo status)
bit2 は ADPCM length register bit15 == 0 && (fifo status)
この値は IRQ2 の発生原因と使われるため下記の手順で加工する.
IRQ2 mask(address 0x1ff803.w.3:2) とstatus を and にする.
各bitを OR で 1 bit にしてIRQ2の線に渡す.
修正前の実装では address 0x1ff803.r.3:2 の値を and の後の値をいれていたが and の前をいれるべきであり、これは単純な実装ミスである. この bit を使うCDソフトは少ないらしくバグ修正の優先度も低く気付かなかった.
E045: jmp $F6DB
F6DB:
lda $180C
and #$01
bne $F6E7
lda $1803
and #$04
F6E7:
tax
lda $180D
and #$20
bne $F6F4
lda $180C
and #$08
F6F4:
rts
address 0x1ff803.r.3 は and 後の値にしないとたくさんのソフトのADPCM再生完了のあとの処理がおかしかったので要調査.
address 0x1ff803.r.2 は影響範囲は不明.(少ないと思われる)
address 0x1ff803.r.3 を純粋な ADPCM 再生フラグとして再実装.
IRQ2 ラインの接続を変更することによって、他のソフトの動作も基に戻った.