【エミュレータについて】

【エミュレータについて】

 このエミュレータの目玉は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となります。