実機の動作だと、主人公が左に移動してから、「おはよう~」と音声が再生されますが、主人公が移動せず、「おはよう~」と音声が再生されてフリーズする場合と、音声が再生されずクラッシュする場合の2パターンの不具合を確認しました。
手元で確認しましたが再現しませんでした.
頻度は本当に必ず起きるのでしょうか?
romdumperでスーパーシステムカードを内蔵した状態では100%再現しました。スーパーシステムカードの実物を挿した状態では再現しませんでした。なので、スーパーシステムカードを挿せば回避できるようです。
なるほど. その機能の有無で変わるとは想定していませんでした.
様子をみて直すとか、投稿フォームに手を入れるなど対応をしようと思います.
問題の確認をいたしました.
SUPER SYSTEM CARD 内蔵機能は UGX-01 相当の開発機では見られないため、簡単に解析してみます. 深い解析が必要な場合は UGX-02 相当の開発機を準備してから対応となります.
ほかに内蔵システムカードで動かないとといわれたソフトはYAWARAとレッドアラートですがこれらは私の環境では動いてます. (twitter に書こうか悩んだのでこっちにかく)
内蔵システムカードと本物のシステムカードの思い当たる挙動の違いを調べたが、RAM は CPU の stack 領域(address 0x1f0100-0x1f01ff)ぐらい. PCE のレジスタは BIOS がきれいに初期化しているので問題がない.
となると現状は不明.
この件は内蔵システムカードだと動作がおかしくなる報告が別途来るまで保留とします.
1件のみで回避方法があるとなると,専用の機材を用意するまでの優先度が低くなってしまいます.
GPRAM のうち、 SUPER SYSTEM CARD の RAM 部全領域を data 0x00 で埋めてみたが動作に違いはなかった.
内蔵システムカードだとアルマナの牙の動作もおかしいことが判明.
原因は調査できないので不明.
内蔵システムカードの転送が実は安定しないことがあったので、データ転送をハードウェア (CD-ROM2 の read 機能の流用)化してこれを回避して安定化させてみた.
しかし不具合は再現する. 計測環境がないとどこを直していいかわからない.
開発機を UGX-Q5 相当で用意したので調査再開.
00] 00 00 00 00 00 00
disc #0005
DE.00]x01
DE.01]x01
DE.02]x02
08> 000E0C 02-> 6280
08> 000E0E 03-> 6280
DE.02]x01
08> 001E0E 20-> 6280
D8> track21
D9> track22 play+IRQ2
audio play
drive stop
08> 002D0E 0C-> 6280
08> 00240E 4E-> 6280
D8> track18
D9> track19 play+IRQ2
audio play
drive stop
08> 000E8E 40-> 6280
08> 000F8E 4E-> 6280
08> 004E0E 20-> ADPCM RAM 02
08> 004E2E 10 ここで停止
MCU の暴走はなく、PCE が純粋に暴走しているらしい.
内蔵システムカードでのみ起きる以外は <BTS:86> の相関性はなさそう.
最初のセクタを呼んだ直後に address 0x99000 に RAM があるか確認するコードを発見.
4105:
lda #$3C
sta $DFFF
lda $FFE5
tam #$80
lda #$00
sta $10
lda #$F2
sta $11
bsr $4177
beq $4139
lda #$00
sta $10
lda #$F4
sta $11
bsr $4177
beq $4139
4127:
lda #$00
sta $10
lda #$F0
sta $11
lda ($10) address $4c:$f000->0x99000, data = 0x0f
eor #$FF
sta ($10)
cmp ($10) returns 0??
bne $415F
4139:
smb7 $20
ldx $E011
lda $E012
cmp #$FF
beq $414D
cmp #$3C
beq $414D
bsr $416D
bra $414F
414D:
bsr $4164
414F:
stx $3C2F
sta $3C30
lda #$0D
sta $E011
lda #$3C
sta $E012
415F:
lda $22
tam #$80
rts
上記のあとRAM がある場合はフラグを立てておく. ゲーム開始時にフラグを参照し意図的に止まる(か、開発専用デバイスをみる?)プログラムが組まれていた.
Super System Card の memory map 0x80000-0xbffff と 0x90000-0xfffff は 実際に dump したところで mirror であるのは確認したがエミュレータとは異なった.
address 0x80000-0xbffff はエミュレータでは mirror ではなく未定義となっていてそれと同じにしてもこの問題が起きないことを確認. 今回のコードでこの領域は書き込みのみ無効にするほうがより正確だと思われる.
以上の対策によって改善した.
自分が書いたSuper System Card についての文書も改訂した.
http://d.hatena.ne.jp/na6ko/20180710
Dadiv 氏のご指摘により PC:$410a lda $ffe5 はバグで本来は lda $fff5 をとるべきだというです.
マジクールが内蔵システムカードで正常に動きませんでした.
この件と関連しているか気になります.
マジクールの件.
upergrafx_20181007.pacでは内蔵システムカードでも正しく動くことを確認.
開発途中のものでは正常に内蔵システムカード+読み込み速度FASTで異常が発生
. 本物のシステムカード+読み込み速度FASTでは正常.
あとMAMEで起動しないのでデバッグ情報が得られにくい.
マジクールは回避策がたくさんありそうなので保留.
完了.
18,19番にマジクールがうんぬんとありましたがメモリカード個別の問題でしたので無関係でした.