MSXには画面表示などのBIOS(API的なもの)が用意されていますが、I/Oポートを通じてVDPと直接お話することも許されているそうです。で、あれば、BIOSを一切使わないクリーンなコードで作れば、MIXでもMSXでも動くアプリができるはず。
できました!
no-bios.asm をZMAでアセンブルし、生成された no-bios.rom を設定した NO-BIOS_JP.xml をopenMSXに登録し、-machine オプションに指定して、起動しています。(サンプルプログラムの使用フォントは IchigoJam-font CC BY IchigoJam!)
リセット時、アドレス0から動き始めるZ80くん。割り込み用発生時のジャンプ先を設定し、パラレルインターフェイス(PPI)を使って、64KBのメモリ空間を4分割した各ページを、ROMカセットに32KB、RAMに16KB割り当てて、ROMカセットの起動アドレスへジャンプ!
フォントパターンも自前で用意してもらうスタイルなので、NO-BIOSのZ80 ZMAニーモニックのソースコードは35行しかありません。
; NO-BIOS org 0x0000 ; 割り込み禁止 di ; I/O初期化 ; PPI 8255 (PortA: slot, PortB: in keyboard, PortC: out keyboard and caps) ld a, 0b1_00_0_0_0_1_0 ; PortA: out, PortB: in, PortC: out out [0xab], a ; パラレルポート8255(PPI)のモード設定 ; 各スロットのページ設定 (NO-BIOS/ROM1-1/ROM1-2/RAM) ld a, 0b11_01_01_00 ; P3=3, P2=1, P1=1, P0=0 out [0xa8], a ; パラレルポート ポートA で制御 ; スタックポインタ初期化 ld sp, 0xf380 ; 0xf380-0xffff の3200byteはシステム予約 ; タイマー割り込みの初期設定 H_TIMI = 0xfd9f ld hl, H_TIMI ld [hl], 0xc9 ; 何もせずリターン ; 割り込み許可 ei ; ROMの実行アドレスへジャンプ ld hl, [0x4002] push hl ret ; 割り込み処理 space 0x38 - $ jp H_TIMI
C-BIOSのようにMSX互換を目指すもよし、何か特殊なBIOSを持つZ80マシンにするもよし。
理想のパソコンづくりを楽しみましょう!
links
- MIX - 超軽量MSXエミュレーター with Z80.js