Tiny Monitorの作成(2)

HD6301/HD6303

前回作成したTiny monitorを実際に使ってみます。
合わせてユーザープログラムから使用できるサービスルーチン群を説明します。

モニタの使用例

モニタを書き込んだROMを取り付けて、SBC6303をリセットするとプロンプトが出力されます。

モニタ実行画面(プロンプトの表示)

コマンドは0fがメモリダンプ、lがSレコードの読み込みと実行の2つだけです。

本モニタは小文字で動作します

"l"コマンド:Sレコードファイルの読み込みと実行

それではlでプログラムを読み込み・実行してみます。

モニタ実行画面(Loadコマンド)

今回は下記のようなテストプログラムを作ってみました。
一行入力を受け付け、エコーバックした後に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です。

コメント

タイトルとURLをコピーしました