image image


概要

SC-3000+SF-7000/SG-1000/Othello Multivision/SEGA MARIII/MASTER SYSTEM/GAME GEARをエミュレートします。

作成済みのモジュールで動かせるものを探していたら、NGPocketで作成したZ80と音源(SN76489とほとんど同じ)が使用でき、VDPの仕様書は簡単に手に入ると言うことで、作成したものです。




エミュレート状況

機能状況
Z80
SN76479
TMS9918※1
ROM管理※2
キーボード
データレコーダー
※1全ての機能を実装しているつもり。
スプライトヒットに未対応。見直したら対応してました。
※2システム構成ファイルで各モジュールを繋げるだけで実現しているため、ROMを管理しているソフトは動きません。
また、メモリーマップが良く分からないため、とりあえずROMを0x0000-0x7fff、RAMを0x8000-0xffffにしてあります。

ROMサイズ 40KB,48KB,128KB,256KB,512KBに対応(セーブは未対応)対応。

2021/12/11

GAME GEARを追加。
Raspberry Pi PicoでGAME GEARを動かそうと思い、SEGA MARKIIIとGAME GEARの違いを調べたら、VDPのパレットとI/O(通信と拡張コネクタ、STARTボタンなど)のみだったのでvdmgrで動かせるようにしました。

また、久しぶりにSMS VDP TestとZEXALLを動かしたら、NGになる項目が増えていた。
以前動作していた時のCPU、VDPに戻してもNGになる。なぜ?


2017/02/18

SMS Power!さんのサイトのHomebrewに、便利なツール Scroll Test Program、SMS VDP Test、ZEXALLがありましたので、動作できるようにタイミングを修正しました(SMS VDP Test内にタイミングが詳しく書いてありますので、大変助かります)。

ただ、現在のZ80モジュールは、フェッチ・デコード・実行・書き込みなどの動作をまとめて行っているため、SMS VDP Testのいくつかのテストは通りません。
修正は可能ですが、修正が面倒なので今の所無視しています。

ZEXALL は、BIT n,(HL)だけ通りません。
この命令での変化は全く意味がないのと、変化の内容が良く分からないので無視しています(Z80を動かして動作確認をすれば良いのですが、動作環境がWindows95頃のものなので、環境をを整えるのが面倒なので無視)。

2017/02/05

スプライトの垂直がラップアラウンドしていなかったのを修正。


2017/01/09

BGでパレット1を使用している時に、背景の優先順位がおかしくなるのを修正しました。

VDPのタイミングを大きく修正しています。
(今までは描画後に水平割り込みを発生していましたが描画開始時に変更、描画中はy方向のスクロールを変更することができないようなので描画前にy座標記憶、描画中のBLANKフラグ変更はできないが、水平割り込み発生時に有効になるなど色々。)
また、行・列の固定画面のスクロールを修正しました。

今回からSF-7000をサポートしました(要ROMイメージ(8KB)で、bios/sf7000.rom、またはbios/sf7000.scへ置く必要があります)。

現在のFDCはタイミングなどは適当で、以下のコマンドのみサポートしていますが、SF-7000で読み書き・フォーマットは行えると思います。



SF-7000は、SEGA MARKIIIと共存できないので、SF-7000ありをSC-3000+SF7000とし、VDPの色は今まで通り。
SF-7000なしをSG-1000/SEGA MARKIIIでとし、VDPモード4以外の色をSEGA MARKKIII仕様にあわせ、別のシステムとしました。


2017/01/09

垂直・水平割り込みをVSync、HSyncの信号と勘違いしていたため、割り込みタイミングが大きくずれていました(NTSCのタイミングで考えていたため。vdmgrの表示を開発用にした時はNTSCに合わせています(フロントポーチ・同期・バックポーチ・表示期間の順))。
現在は、ACTIVE DISPLAYが終了した所で割り込みを発生させています。

SRAMの保存は、0xfffcでRAM設定を行い、SRAMへ書き込みを行っているものをファイルへ保存しています。

FM音源は詳しくないので、当分の間対応予定なし(対応すればVRC7、MSXも対応できるが)。

メモ)
ネームテーブルのベースアドレス(VDPレジスタ2)のbit0は、VDPのアドレスのbit10とANDしている為、bit0に0を指定すると、ネームテーブルの前半部しか使用しない(ネームテーブルは0x0000-0x06ffバイトなので、bit10を0にすると0x0000-0x03ffバイトになるため)。

レジスタバンクの制御を行う0xfffc-0xffffは読み込み専用だが、書き込んだ時にRAMへも書き込まれるため、読み書きできるように見える。

RAMは0xc000-0xdfffだが、0xe000-0xffffがミラーとなるため、0xffffへ書き込んでから0xdfffを読んでも同じ値が読める。
ただし、バンク切り替えは0xfffc-0xffffなので、0xdffc-0xdfffへ書き込んでもバンクは切り替わらない。

VRAM読み込みのコマンドは、コマンドを書き込んだ時にアドレスの設定後、VRAMの内容を読み込み、アドレスをインクリメントまで行う(読み込んだVRAMの内容を取得できるのは、次のVRAM読み込み時)。
VRAM書き込みのコマンドは、コマンドを書き込んだ時にアドレスの設定のみ。


2017/01/04

SEGA MARKIIIとSG-1000はVDP以外ほぼ同じなので、SEGA MARKIIIのVDPの仕様を見るとたいした機能がないので実装してみました(2倍表示は未実装)。
SEGA MARKIIIはHSyncの割り込みがあるため、VDPの動作クロックを10.738635MHz、CPUのZ80は3分周した3.579545MHzにあわせました。


2015/01/18

システム構成ファイルだけで、32KB以上のROMサイズや周辺機器に対応するのが面倒なのでSG-1000モジュールを作成。


2014/11/02

開発向けに、走査線の表示と、VDPの内容を表示できるようにしました(システム名はSG-1000(開発用))。
サブウィンドウ左上がネームテーブル、右上がパターンデータ0-767+スプライトパターン0-255、左下がパレットとスプライト×32となっています。
表示位置やサイズ、表示するウィンドウは、HVC-001と同様、.iniファイルを編集することで可能になります。



補足


ディスクイメージへの書き込みは、直接ディスクイメージへ書き込みます(ディスクイメージへの書き込みタイミングは、イジェクト時)。

ディスクイメージはSF7とD88形式をサポートしていますが、SF7はべた形式なので問題ありませんが、D88形式を完全に把握しているわけではない(どこかに正式なドキュメントがあるのでしょうか?)ので、ディスクイメージを破壊する恐れがあります。
必ずマスターディスクのコピーを使用してください。

ファイルが読み取り専用かzip形式の場合、ライトプロテクトありとして処理します。

ディスクのSide-AとSide-Bは、D88形式で複数枚の時に有効になります(vdmgrのブランクディスクの作成は、2枚組のブランクディスクを作成)。




参考資料

今回作成するにあたり、下記サイトを参考に作成しました。
大変貴重な情報を公開していただき有難うございます。