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

MC6800 ROMモニタ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 モニタを作っている感」が出てきていて良い感じです。

MC6800 ROMモニタSBC6800