21:天外魔境 ZIRIA(SCDバージョン)/表示が変

最終状態:完了
report#21.1
投稿者:na6ko
時刻:2018-02-08 16:04:16
状態:新規
頻度:必ず起きる
再現方法:
ゲームを開始して、最初のビジュアルシーンを飛ばし、メイン画面を出す
画面表示がおかしく、1歩歩くとエラーと文字列がでて進行不可能.
report#21.2
投稿者:na6ko
時刻:2018-02-11 16:03:12
状態:受付済
頻度:必ず起きる
状態変更
report#21.3
投稿者:na6ko
時刻:2018-02-24 03:14:02
状態:受付済
頻度:必ず起きる
解析に使っているMAMEでも同様の動作が起きました.
比較用のデバッグ機能付きエミュレータを探す必要があります.
report#21.4
投稿者:na6ko
時刻:2018-02-24 04:44:36
状態:受付済
頻度:必ず起きる
mame と mednafen の CPU からの memory を全て dump して差分をみたところ
$c000 と $d7ff で image からの転送が1byteずれていました.

003b40:14 56 39 01 00 ff 01 00-00 00 02 00 00 00 03 00
      :14 57 63 01 00 ff 01 00-00 00 02 00 00 00 03 00
009d00:68 53 40 60 00 a0 0b 07-04 00 00 ff a5 64 30 07
      :68 53 40 60 b0 09 a9 07-04 00 00 ff a5 64 30 07
00c000:0a c0 52 c0 52 c0 e0 c5-60 c6 52 c3 9a c3 d0 c3
      :ff 0a c0 52 c0 52 c0 e0-c5 60 c6 52 c3 9a c3 d0
00c010:de c3 ec c3 fa c3 08 c4-34 c4 58 c4 66 c4 74 c4
      :c3 de c3 ec c3 fa c3 08-c4 34 c4 58 c4 66 c4 74
00d710:07 00 38 00 3f 00 c0 01-c7 01 f8 01 ff 01 00 00
      :00 07 00 38 00 3f 00 c0-01 c7 01 f8 01 ff 01 00
00d800:ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff
      :00 ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff
report#21.5
投稿者:na6ko
時刻:2018-02-24 06:34:03
状態:受付済
頻度:必ず起きる
6280 から ADPCM RAM へ書き込む処理がこのソフトにはあるのですが、bios にこのルーチンはありませんでした.
address が 1 つずれる問題は write pointer の初期化の処理がおかしいようです. address 0x1ff80d.w へ書く際に bit1 = 1 で write pointer 設定, bit0 は次の IO port (address 0x1ff80c) への書込みを無視するかのフラグのようです.
bios では bit0 = 1 となっており次の書込みを無視しませんが,この場合は次の書込みを無視します. MAME の場合はソース上はそうなっているようですが、処理がおかしかったです. sta $108a を nop;nop;nop にかえたら動作しました.

upergrafx での処理の場合、 tsb $180d で RAM の pointer の設定にいきまして, sta $180a を内部処理として同期するかという話になっていましてここの調整をすれば動作すると思われます.

00C243: 
	stx  $1808
	sty  $1809
	lda  #$02
	tsb  $180D
	sta  $180A <- 無視される書込み
	lda  #$05
00C253: 
	dea
	bne  $C253
	lda  #$02
	trb  $180D
00C25B: 
	jsr  $C26F
	sta  $180A
	bsr  $C292
	beq  $C26D
00C265: 
	tst  #$04 $180C
	bne  $C265
	bra  $C25B
00C26D: 
	cla
	rts
report#21.6
投稿者:na6ko
時刻:2018-02-24 06:47:53
状態:受付済
頻度:必ず起きる
address 0x1ff80d の read pointer と write pointer の設定はエミュレータでは次の読み書きを無視するという処理をしていますが、実際のハードウェア上で設定が完了にするは短すぎるため tsb $180d 直後の lda/sta $180a は無視されているかもしれないのもとにハードウェアとして実装をしております.
ここの RAM はシーケンシャルアクセス用の DRAM でコマンド設定を何度か分けることがあること、たまにリフレッシュのために同期できる時間が一定ではないことが理由です.
ソフトエミュレータの場合は時間制御に余裕があるため1命令単位で同期をとれます.
report#21.7
投稿者:
時刻:2018-02-25 01:57:58
状態:修正済
頻度:必ず起きる
address 0x1ff80d へ bit1 = 1 を書いた後に次の書込みを有効にする条件を下記のいずれかに変更.
- address 0x1ff80c へ書込み
- address 0x1ff80d.w.1 = 0 に書込み
- address 0x1ff80d.w.7 = 1 に書込み (+ reset, 書込みは無効)

0x1ff80d の bit0 の解釈はエミュレータと同じでいいのか判断に困りましたのでこの通りです. この対処によってゲームが正常に動作するようになりました.

#5
> 6280 から ADPCM RAM へ書き込む処理がこのソフトにはあるのですが、bios にこのルーチンはありませんでした.
うそでした. PC $f715 あたりにありました.

6280 から ADPCM RAM へ書き込む処理で address 0x1ff80c へ無視する書込みがあるのは手元で確認した物は HCD2023 のこれとロードス島戦記(1作目)の2つのみでした.
report#21.8
投稿者:na6ko
時刻:2018-04-10 00:04:09
状態:完了
頻度:必ず起きる
終了