このエミュレータの目玉はSB側から操作する「デバッガ機能」です。SB上でアセンブラとデバッガを作ってオリジナルの統合開発環境を作成すると楽しいかと思います。
またゲームコントローラーの情報を実行ファイル中に設定出来たり、PinP表示出来たりと別の方向性で、機能を拡張しています。
Z80-CPUの基本的な命令はもちろん、IXH/IXLなどを扱う隠し命令の実行及び逆アセンブラにも対応しています。
メモリマップ
基本的にMZ-80Cを基準にしています。よってRAM容量は48KiBになっています。
なおROM領域は、EMU内で書き換えは出来ませんが、SB上から書き換えが可能です。
(emumem命令)
$0000~$0FFF | ROM (HAL-MONITOR) |
$1000~$CFFF | RAM |
$D000~$DFFF |
VRAM ($400SIZEでLAP) |
$E000~$E008 | Memory Maped I/O |
$E010~$E012 | PCG Access |
Memory Maped I/O
物理的に搭載されていないCMT関連とLED関連には対応していません。
8255のモード設定値は $8A固定です。
8253のモード設定値は、CH0:$34、CH1:$74、CH2:$B0固定です。
$E000:8255 PA
bit7:カーソル点滅用タイマ(NE555) 1=リセットしない 0=リセットする
bit6:---
bit5:---
bit4:---
bit3:PA3 キーカラム指定用
bit2:PA2 キーカラム指定用
bit1:PA1 キーカラム指定用
bit0:PA0 キーカラム指定用
$E001:8255 PB
bit7:PB7 キーデータbit7
bit6:PB6 キーデータbit6
bit5:PB5 キーデータbit5
bit4:PB4 キーデータbit4
bit3:PB3 キーデータbit3
bit2:PB2 キーデータbit2
bit1:PB1 キーデータbit1
bit0:PB0 キーデータbit0
$E002:8255 PC
bit7:PC7 (R) /VBLANK
bit6:PC6 (R) カーソル点滅用タイマのステータスビット(NE555)
bit5:PC5 (R) 未対応(カセット装置からの読取りデータ)
bit4:PC4 (R) 未対応(カセット装置のRecord/Playボタンの検出)
bit3:PC3 (W) 未対応(カセット装置のモータをON/OFFするためのパルス)
bit2:PC2 (W) 未対応(英数/カナのLED状態 1=緑、0=赤)
bit1:PC1 (W) 未対応(カセット装置への書込みデータ)
bit0:PC0 (W) /VGATE
$E003:8255のモード設定($8A固定です。書き込んでも動作しません)
$E004:サウンド用周波数設定
$E005:8253 CH1(LSB&MSB/AUTOLOOP/16bitの$74で動作固定)
$E006:8253 CH2(LSB&MSB/ONESHOT/16bitの$B0で動作固定)
$E007:8253のモード設定(全チャンネル動作固定なので動作しません)
$E008:
bit0: READ時:テンポ用NE555タイマのステータスビット
WRITE時:サウンド出力のON/OFF
ロード/セーブファイルのヘッダ形式
基本的にMZTフォーマットに準拠したMZHフォーマットとなっています。
大きな違いはゲームコントローラーの情報を内包した所です。
typedef struct {
u8 type; // 00:バイナリ、01:機械語、02:BASIC u8 filename[16]; // ファイル名 ASCII文字列 終端は0x0D u8 term; // 0x0D固定 u16 length; // データサイズ(ヘッダー128Byteを抜いたファイルサイズ) u16 load; // ロード先アドレス u16 exec; // 実行アドレス u8 reserve1[8]; // 0x00固定 u8 joypad[16];// |7:USE|6-4:PB|3-0:PA| u8 reserve2[80]; // 0x00固定 } EMU_STORAGE_MZH; |
---|
実行の流れ
エミュレータの1フレームは擬似フレーム時間で管理しており、動作クロックの2MHzからTSTATE換算で1フレーム分の命令を一気に実行します。その後自プロセスを休止させ、別プロセスへ切り替わります。
また表示期間とVBLANK期間の切り替わりも、換算したTSTATEを基準にして切り替えています。
サウンドはフレーム内で最終的にリクエストされた音がサウンドプロセスによって発音されています。よって基本的に発音の更新時間は1/60となります。