前回作成したTiny monitorを実際に使ってみます。
合わせてユーザープログラムから使用できるサービスルーチン群を説明します。
モニタの使用例
モニタを書き込んだROMを取り付けて、SBC6303をリセットするとプロンプトが出力されます。
コマンドは0–fがメモリダンプ、lがSレコードの読み込みと実行の2つだけです。
"l"コマンド:Sレコードファイルの読み込みと実行
それではlでプログラムを読み込み・実行してみます。
今回は下記のようなテストプログラムを作ってみました。
一行入力を受け付け、エコーバックした後にswiでモニタに戻る簡単なものです。
read_line .eq $ffa9
write_char .eq $ffac
write_line .eq $ffaf
write_crlf .eq $ffb2
write_space .eq $ffb5
Rx_BUFFER .eq $0100 ; SCI Rx Buffer
main: ldx #MSG_TEST
jsr write_line
prompt: ldab #'$'
jsr write_char
jsr write_space
jsr read_line
ldx #Rx_BUFFER
jsr write_line
jsr write_crlf
swi
bra prompt
MSG_TEST .as "Line input & SWI Test",#CR,#LF
.az "Echo the input and then execute SWI.",#CR,#LF
アセンブルしてSレコードファイルを読み込んでください。
プログラムが読み込まれると即実行されます。
それではhelloと入力してリターンキーを押します。
入力したhelloがエコーバックされ、割り込み直前のレジスタ内容を表示した後にモニタに戻りました。これらの数値はswi命令によって自動的にスタックされた数値を表示しています。
スタックポインタの数値がふたつあるのは、割り込み直前の数値と現在の数値を表しています。
SWIおよびTRAP割り込みが発生中のみ使用できるrコマンドも表示されています。
"0-f"コマンド:メモリダンプ
Rx_buffer($0100
)を見てみましょう。1と入力します。
先ほど入力した"hello"
と終端文字の$00
が保存されています。
"r"コマンド:ブレークからプログラムへの復帰
rを入力するとプログラムに戻りました(bra promptでプログラム先頭に戻るだけですが)。
サービスルーチン群
モニタの実装に使ったルーチンを$ffa0
からのジャンプテーブルを通じて、ユーザープログラムからも簡単に使えるようにしています。
使用する際にはユーザープログラムの先頭で下記ジャンプテーブルの定義が必要になります。
init_sbc6303 .eq $ffa0
mon_main .eq $ffa3
read_char .eq $ffa6
read_line .eq $ffa9
write_char .eq $ffac
write_line .eq $ffaf
write_crlf .eq $ffb2
write_space .eq $ffb5
write_byte .eq $ffb8
write_word .eq $ffbb
is_alphabetic_char .eq $ffbe
is_decimal_char .eq $ffc1
is_hexadecimal_char .eq $ffc4
以下各ルーチンの説明です。
init_sbc6303
SBC6303を初期化します。
PORT1を出力に、SCIを9,600bpsにセットします。
割り込みベクタのフックもここで設定します。
mon_main
tiny monitorに戻ります。
read_char
SCIから一文字受信し、Bレジスタに代入します。
read_line
SCIから一行受信し、Rx_Buffer($0100
~)に保存します。最大72文字です。
write_char
Bレジスタの内容をSCIに出力します。
write_line
Xレジスタが示す文字列をSCIに出力します。終端文字は$00
です。
write_crlf
CR+LFをSCIに出力します(改行します)。
write_space
空白文字($20
)をSCIに出力します。
write_byte
Bレジスタの値を2桁の16進数字としてSCIに出力します。
write_word
Dレジスタの値を4桁の16進数字としてSCIに出力します。
is_alphabetic_char
Bレジスタの内容がアルファベット(小文字)かどうかを判定します。
真:C=1
、偽:C=0
です。
is_decimal_char
Bレジスタの内容が数字かどうかを判定します。
真:C=1
、偽:C=0
です。
is_hexadecimal_char
Bレジスタの内容が16進数字(小文字)かどうかを判定します。
真:C=1
、偽:C=0
です。
コメント