image  image


概要

SG-1000/SEGA MARIIIをエミュレートします。

作成済みのモジュールで動かせるものを探していたら、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に対応(セーブは未対応)対応。

2014/11/02

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


2015/01/18

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


2017/01/04

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


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書き込みのコマンドは、コマンドを書き込んだ時にアドレスの設定のみ。




補足




参考資料

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