1chipMSXにROMディスク その22017年01月23日 23:47

思ったより簡単にできた。

内蔵ROMディスクはROMディスクなので読み取り専用書き込み不可。
SDカード刺さってないとなんか動作おかしい。
ディスクサイズは256KBだけど、内蔵BIOSサイズ制限で128KBくらいしかファイルおけなかった。
BIOSロード機能使えば256KBフルに使うことも可能。(理屈上512KB位まではいけそう)

BIOSロード機能時の並び順は
DISKROM(128KB)+ROMDISK(256KB)+MAINROM(32K)+SUBROM(16K)+FM(16K)+Dummy1(64K)+KANJIROM(128K)+Dummy2(64K)

需要があるかどうかはわからないけど、ダウンロードはここから


1chipMSXとドラゴンクエスト22017年01月26日 22:22

れふてぃさんから新しい宿題をもらった。

お題は「1chipMSXでMSX2版のドラゴンクエスト2を実行するとタイトル画面の画像が崩れる」という現象。
どうもこれは1chipMSX、というより似非PLDシステムの頃からの問題の様で、1chipMSXのVDPの開発者のKuniさんのサイトにあるVDPソースに含まれている開発メモにも記述がある。

そのメモには原因まで書かれていて、
ステータスレジスタ#0のbit6、第5スプライト判定ビットが1になるタイミングの問題らしい。
また、暫定処置としてbit6を常に'0'になるようにすることで画面崩れがなくなるという記述もあった。

ステータスレジスタ#0の内容は以下の通り。
              ┏━━┯━━┯━━┯━━┯━━┯━━┯━━┯━━┓
              ┃bit7│bit6│bit5│bit4│bit3│bit2│bit1│bit0┃
              ┣━━┿━━┿━━┿━━┷━━┷━━┷━━┷━━┫
        S#0┃ F │5S│ C │    5th sprite    ┃
              ┗━━┷━━┷━━┷━━━━━━━━━━━━━━┛
		F          : 垂直帰線割り込みフラグ
				垂直帰線割り込みが発生
				S#0を読むとリセットされる
		5S         : 第5スプライトフラグ
				スプライトが5個(9個)並ぶとセット
		C          : 衝突フラグ
				スプライトが衝突するとセット
		5th sprite : 5番目のスプライト番号

んで、bit6=1になる条件を調べていたら、MRCのWikiTMS9918のデータシートに興味深い記述があった。
以下はMRCのステータスレジスタbit6の説明
* Set to 1 when the F flag is equal to 0 and there are more than 4 or 8 sprites aligned on the same horizontal line 
ステータスレジスタのbit6が1になるのはbit7が0、つまり割り込みが発生しておらず、かつ規定数以上スプライトが横並びになった場合とのこと。

以上まで調べがついたところで、1chipMSXのソースを眺めてみると、bit6のオンオフにbit7の値が関与している形跡がなかった。
そこで、ソースを以下のように修正した。
(対象はHRA!氏のemsx_top_20080511_001のvdp_register.vhd)
DBI <= (NOT REQ_VSYNC_INT_N) & VDPS0SPOVERMAPPED & VDPS0SPCOLLISIONINCIDENCE & VDPS0SPOVERMAPPEDNUM;
        ↓
DBI <= (NOT REQ_VSYNC_INT_N) & (VDPS0SPOVERMAPPED AND REQ_VSYNC_INT_N) & VDPS0SPCOLLISIONINCIDENCE & VDPS0SPOVERMAPPEDNUM;

※REQ_VSYNC_INT_Nは真偽値逆転しているので、割り込み発生時に0。

これでビルドしたところ、ドラゴンクエスト2のタイトル画面の画像乱れはなくなった。
あと、ついでに10MHzにクロックアップした際のキャラクタのちらつきもなくなった。

この修正を含めた1chipNextorMSXのVer1.0.3は週末にアップ予定。

1chipMSXにROMディスク その32017年01月26日 23:54

内蔵BIOSにROMディスクを含めると一気にサイズが大きくなる。
大きくなりすぎて圧縮後サイズが256KB超えてしまい2+のBIOSを含めることができなくなった。

対処方法としてKDLさんの所でやっているようにEPCSの開始アドレスを&h4000hから&h34000hに変更。
これで圧縮後304KBまでのBIOSを内蔵できる。

あと、DIPSW5をOFFにするとSDだけでなくROMDISKも無効になる。
いろいろできるようにROMDISKだけを無効にするとか実装できないかな?

ちょっと考えてみよう。

1chipNextorMSX更新 (Ver1.03)2017年01月28日 19:48

Ver1.0.3
 VDPステータスレジスタ#0の5Sフラグ(bit6)の成立条件を修正
 ベータ版としてROMディスク内蔵版を同梱
 ※ROMディスクに搭載したMMは2.07_K(日本語版)です。

ダウンロードはこちら

1chipMSXにROMディスク その42017年01月29日 10:41

ROMディスクの切り離し機能を付けてみた。
起動時(2番目のLEDが点灯している間)にF9押下で切り離し。
あと、音量は最大で固定にした。

ダウンロードはこちら
※前回のPOFとURL一緒。

切り離しはBIOS側ではなく、HW側で処理。(っていうかそんな解析できない)
仕掛けは単純で、切り離しキー押されたら、以降ROMDISKのアドレス空間へのアクセス時はデータをすべて0に置換しているだけ。

これで問題でないならVer1.04でROMディスク機能としてマージしようか…
※BIOSロード機能用のBIOSの様式がまた変更になるけど…

以下メモ。

物は試しでNextor+ROMDISKでROMDISKのRAM化ができるかちょっと試してみた。
とはいえ、NEXTORのBIOSは全く理解していないで、BlueMSXのESERAM上にNextor+ROMDISKを構築してMKDIR発行しながらデバッグウインドウで適当に当たりを付けてレジスタの値を書き換えて反応見る程度。
で、書き込み可のFDとROMDISKで返値が違った&h3977(バンク05)のルーチンにこれまた適当にパッチを当てたところ、ROMDISK上にディレクトリが作れたように見えた。
けどドライブ変更したりすると作ったディレクトリが消えるので、実際のディスクは書き換えれていない模様。
※メモリ上のFATのキャッシュだけ書き換わっている?

で、このBIOSを1chipMSXに書き込んだところ、ROMDISKには書き込みできないんだけど、LOCKしているはずのSDカードに書き込みができてしまった。(SDカードWindwosに持って来てもフォルダ増えてるのが確認できる)
…自分はいったい何をしたんだ?
訳も分からずBIOS書き換えなんてするもんじゃないなぁ…