画面表示がおかしく、1歩歩くとエラーと文字列がでて進行不可能.
解析に使っているMAMEでも同様の動作が起きました.
比較用のデバッグ機能付きエミュレータを探す必要があります.
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
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
address 0x1ff80d の read pointer と write pointer の設定はエミュレータでは次の読み書きを無視するという処理をしていますが、実際のハードウェア上で設定が完了にするは短すぎるため tsb $180d 直後の lda/sta $180a は無視されているかもしれないのもとにハードウェアとして実装をしております.
ここの RAM はシーケンシャルアクセス用の DRAM でコマンド設定を何度か分けることがあること、たまにリフレッシュのために同期できる時間が一定ではないことが理由です.
ソフトエミュレータの場合は時間制御に余裕があるため1命令単位で同期をとれます.
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つのみでした.