今回は、BIOSコール使ってHello Worldを表示してみる!w

BIOSコールでは、1文字出力というのがあって文字列はなさそーなのでこれを繰り返し呼んで出力するようにする。

Aレジスタに文字コードを入れて、メインROMの00A2Hをコールすると1文字出力される。

CHPUT:1文字出力(MAIN:00A2H)
  入力:A:文字コード
  戻り値:なし
  破壊レジスタ:なし

つぎにMSX-DOSだとメインROMはRAMの裏側に隠れていて直接呼べないので、インタースロットコールというのを使って呼んでやる。
IYレジスタにメインROMのスロット情報を入れてIXレジスタに呼び出すアドレス(00A2H)を入れてコールしてやる。
メインROMのスロット情報は0FCC1Hにあるのでそれを取得して使用する。

CALSLT:インタースロットコール(001CH)
  指定したスロットの指定したアドレスをコールする
	入力:IYの上位8ビット:スロット
		 IX:コールするアドレス
	戻り値:コールするルーチンしだい
	破壊するレジスタ:コールするルーチンしだい

MSX-DOSのシステムコールだと$までの文字列を出力するだったが、今回作るのは00Hまでを出力するようにしたいと思う。

こんな感じになった。

            ; プログラムの開始アドレス
            ORG     0100H

            ; 1文字出力(MAIN:00A2H)
            ;   入力:A:文字コード
            ;   戻り値:なし
            ;   破壊レジスタ:なし
CHPUT       EQU     00A2H

            ; MAIN-ROMのスロット
EXPTBL      EQU     0FCC1H

            ; インタースロットコール
            ;   指定したスロットの指定したアドレスをコールする
            ;   入力: IYの上位8ビット:スロット
            ;         IX:コールするアドレス
            ;   出力: コールするルーチンしだい
            ;   破壊するレジスタ:コールするルーチンしだい
CALSLT      EQU     001CH

            ; 表示する文字列のアドレスをHLに入れる
            LD      HL, HELLO

            ; 1文字Aレジスタに読み込む
LOOP:       LD      A,(HL)
            
            ; 読み込んだ値(Aレジスタ)が0なら終了
            OR      A
            RET     Z
            
            ; インタースロットコールの準備
            LD      IX, CHPUT
            LD      IY, (EXPTBL-1)
            
            ; 1文字出力(インタースロットコール)
            CALL    CALSLT
            EI              ; MSX1だと割り込み禁止で帰ってくるらしいのでEIを実行。
                            ; MSX2以降だと呼び出し前の状態を保つことになっているらしいけど
                            ; 割り込み禁止で帰ってくることもあるらしい
            
            ; 次の文字へアドレスを進める
            INC     HL

            JR LOOP

            ; 表示する文字列(0で終わる)
HELLO:      DB      "Hello World.",0
            END