MC6800 ROMモニタ自作 その5 〜フェーズ2の16進入力処理を入れてみる〜

前回はフェーズ2の最初の段階として、] プロンプトを出して、1行入力して、検証用に = 付きで返すところまで実装しました。
あの段階でも「対話している感じ」は出ていたのですが、まだ中身としては単なる行バッファでした。今回はそこから一歩進めて、入力した文字列をちゃんと 16 進数として解釈するところまで進めました。
つまり今回やったのは、1〜4桁の16進文字列を受け付け、大文字小文字どちらでも通して、16bit 値として RAM に保持し、空入力、不正文字、桁数オーバーでは ? を返す、というあたりです。
今回やりたかったこと
前回の最小 CLI では、Enter を押すと入力バッファの中身をそのまま返していました。これは検証用としては分かりやすかったのですが、モニタとして次にやりたいことを考えると、やはり「1行の文字列」ではなく「アドレスや値」として扱える必要があります。
そこで今回は、フェーズ2の残りとして、16進入力処理を先に固めることにしました。
今回の見た目
正常な入力なら、基本的には何も言わずに次のプロンプトへ戻ります。
`*
] 1234
] abcd
] 00ff
] `
一方で、空 Enter や不正文字、5桁以上の入力はエラーにして、短く ? を返します。
`]
?
] 12G4
?
] 12345
?
] `
このへんは、いかにも昔ながらのモニタっぽくて良いですね。長いメッセージを出すより、短く ? だけ返す方が雰囲気も合いますし、ROM 容量的にもやさしいです。
今回工夫したところ
- 1〜4桁だけに絞って 16bit 値として扱いやすくした
- 大文字小文字の両方を受け付けるようにした
- 不正文字や空入力、桁数オーバーは短く
?で返すようにした - 4bit ずつ左シフトしながら nibble を積み上げる形にした
今回の実装
今回追加した RAM 作業領域はこのへんです。
`CHR_QUESTION equ '?'
HEX_VALUE_HI equ LINE_LEN+1
HEX_VALUE_LO equ HEX_VALUE_HI+1
HEX_NIBBLE equ HEX_VALUE_LO+1`
前回の行バッファの続きに、16bit の結果と一時 nibble を置いています。
メインループはこうなりました。
`MAIN_LOOP:
jsr PRINT_PROMPT
jsr READ_LINE
jsr PARSE_HEX_LINE
bcs MAIN_LOOP_ERROR
bra MAIN_LOOP
MAIN_LOOP_ERROR:
jsr SHOW_ERROR
bra MAIN_LOOP`
流れとしては、プロンプトを出して、1行読んで、16進として解釈して、失敗なら ?、成功ならとりあえず何も言わず戻る、です。
16進変換ルーチン
今回の中心は PARSE_HEX_LINE です。最初に、空入力と桁数超過を弾いています。
`PARSE_HEX_LINE:
ldab LINE_LEN
beq PARSE_HEX_FAIL
cmpb #5
bhs PARSE_HEX_FAIL`
そのあと結果をクリアして、各文字を nibble に直しながら、4bit 左シフトして積み上げていきます。
`PARSE_HEX_LOOP:
ldaa 0,x
jsr HEX_TO_NIBBLE
bcs PARSE_HEX_FAIL
staa HEX_NIBBLE`
このあと asl / rol を4回繰り返して 4bit 左へずらし、最後に nibble を足しています。8bit CPU っぽさがかなり出るところですね。
文字を nibble にする処理
文字の判定は HEX_TO_NIBBLE に切り出しました。数字、大文字、小文字の順に見ています。
`HEX_TO_NIBBLE:
cmpa #'0'
blo HEX_TO_NIBBLE_FAIL
cmpa #'9'
bls HEX_TO_NIBBLE_DEC
cmpa #'A'
blo HEX_TO_NIBBLE_LOWER
cmpa #'F'
bls HEX_TO_NIBBLE_UPPER`
小文字も通るようにしてあるので、入力のストレスがだいぶ減ります。
エラー表示も最小にした
今回のエラー表示はかなり小さくて、ただ ? を出して改行するだけです。
`SHOW_ERROR:
ldaa #CHR_QUESTION
jsr OUTEEE
ldaa #CHR_CR
jsr OUTEEE
rts`
でも、今回のフェーズ2としてはこれで十分ですし、むしろこのくらいの簡潔さの方がよい気もします。
今回のまとめ
- フェーズ2の最小 CLI に 16進入力処理を追加した
- 1〜4桁の16進文字列を 16bit 値へ変換できるようにした
- 大文字小文字の両方を受け付けるようにした
- 空入力、不正文字、桁数超過では
?を返すようにした - 次のフェーズでアドレスや値を扱うための土台ができた
今回の対応点はgithubのこちらをご覧ください。
今後の予定
次は、今回パースした 16bit 値を使って、コマンド文字の判定、短いエラー表示の整理、メモリダンプ、メモリ変更あたりへ進めていきたいです。
少しずつですが、「ROM モニタを作っている感」が出てきていて良い感じです。