今回は、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
コメント