8:ラングリッサー 光輝の末裔/戦闘画面のADPCMが変

最終状態:完了
report#8.1
投稿者:na6ko
時刻:2018-02-08 13:09:27
状態:新規
頻度:必ず起きる
再現方法:
メインのゲーム画面での戦闘画面を出す
変な声がたくさん出る
report#8.2
投稿者:na6ko
時刻:2018-02-08 13:13:11
状態:新規
頻度:必ず起きる
概要名を訂正
report#8.3
投稿者:na6ko
時刻:2018-02-11 15:53:40
状態:新規
頻度:必ず起きる
状態変更
report#8.4
投稿者:na6ko
時刻:2018-02-11 15:53:59
状態:受付済
頻度:必ず起きる
状態変更
report#8.5
投稿者:na6ko
時刻:2018-03-29 19:08:17
状態:受付済
頻度:必ず起きる
playlength を再生完了にせず随時停めている. 
length が 0 に達しない状態で address 0x1ff80d.w data 0x60 -> 0 を頻発.

ソフト自体は bios を使っていてかなりきれい.
report#8.6
投稿者:na6ko
時刻:2018-03-29 20:14:32
状態:受付済
頻度:必ず起きる
address 0x1ff80d.w data 0x60 -> 0 の処理自体は HDL ソース上でも問題がない事が判明. この問題は 6280 が address 0x1ff80d.w data 0x60 のままにしていることが原因だと思われる.
report#8.7
投稿者:na6ko
時刻:2018-03-30 00:32:53
状態:修正済
頻度:必ず起きる
メインループで回している 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
report#8.8
投稿者:na6ko
時刻:2018-03-30 00:48:13
状態:修正済
頻度:必ず起きる
address 0x1ff803.r.3 は and 後の値にしないとたくさんのソフトのADPCM再生完了のあとの処理がおかしかったので要調査.
address 0x1ff803.r.2 は影響範囲は不明.(少ないと思われる)
report#8.9
投稿者:na6ko
時刻:2018-03-31 00:19:58
状態:修正済
頻度:必ず起きる
address 0x1ff803.r.3 を純粋な ADPCM 再生フラグとして再実装.
IRQ2 ラインの接続を変更することによって、他のソフトの動作も基に戻った.
report#8.10
投稿者:na6ko
時刻:2018-05-26 01:03:14
状態:完了
頻度:必ず起きる
おわり