MSXで文字を描画するには、いくつかの方法があります。ここでは文字描画のBIOS呼び出しではなく、VDP直接アクセスでもなく、BIOS経由でVRAM書き込みをして描画したいと思います。
MSXは画面モードが複数あり、それによって当然ながら処理も異なってくるのですが、今回は起動直後のモードである「GRAPHIC 1(SCREEN 1)」で行なってみます。
【参考】4章 V9938の画面モード - MSX Datapack wiki化計画(外部サイト)
void main()
{
#asm
LD A, 41h ; 'A'
LD HL, 1825h ; x=5; y=1; 1800h + y * 0x20 + x = 1825h
CALL 004Dh ; WRTVRM
#endasm
}
#asmから#endasmで囲った部分はC言語ではなくアセンブリ言語として解釈されます。つまり、今回のソースは全てアセンブリ言語です。
「CALL 004Dh」は、BIOSの「WRTVRM」という機能を呼び出します。これはVRAMに1バイト書き込む処理になります。Aレジスタに文字コード、HLレジスタにアドレスを指定します。
文字コードは普通のASCIIコードですが、8bit目も有効でMSXの場合、カタカナの他にひらがなも存在します。
アドレスは1800hから始まり、32桁x24行ぶんのコードが順番に並んでいます。そのため、計算式は以下のようになります。
0x1800 + y * 0x20 + x
例えば、x=5;y=1;なら
0x1800 + 1 * 20x + 5 = 0x1825
となります。
#016 【MSX,Z88DK】C言語でゲームループとFPS制御
#012 【MSX,Z88DK】C言語でHelloWorld