ベーシックマスターの文字列出力は$04が終端文字(ベーシックマスター開発 その46)

BASICMASTER, 昔のパソコン

最近、Quoraを読んでいたら以下のような質問があった。

  • C言語の文字列は、何故、文字列長を含めたデータ構造にしなかったのでしょうか?

昔からのプログラマだと、MS-BASICやUCSD Pascalは文字列長+文字だったなあ、とか、その前は文字列を扱うのはそもそも大変だったんだよ、とか、Cになって便利になったなあと思い出すような問題である。

gauce(schemeインタプリタ)の開発者である、shiroさんがこれに回答していて、その中に次の一文があった。

なお、Cの前身となったBでも文字列表現は終端文字形式でした(Bでは終端文字はEOT, ASCII 0x04)

C言語の文字列は、何故、文字列長を含めたデータ構造にしなかったのでしょうか?に対するShiro Kawaiさんの回答 – Quora

$04が終端文字列といえば、ベーシックマスターである。今回はそれに関する記事。

MESOUTサブルーチン

ベーシックマスターのモニタには文字列を出力するサブルーチン(MESOUT)がある。このルーチンは$04で終端された文字列を表示する。

ベーシックマスターL2II/Jrでは、このルーチンは$F20Bから格納されている。L2では$F20E。
(余談だが、モニタルーチンのアドレスが異なっていて互換性がないのはプログラムを書く上では問題だった。まだ互換性を重視する時代ではなかったとはいえ、キツかった)

以下はモニタの該当部分の逆アセンブルリスト。IXから1文字ずつAccAに入れて、ASCOUTで表示。インデックスを増やしながら繰り返すというよくあるルーチンである。

ループの繰り返しが、サブルーチンエントリアドレスより前から始まっているのがアセンブラっぽい。


ZF20B   BSR     jASCOUT_1                ;F20B: 8D F6          '..'
        INX                              ;F20D: 08             '.'
; message output from IX, 04 terminate.
MESOUT  LDAA    ,X                       ;F20E: A6 00          '..'
        CMPA    #$04                     ;F210: 81 04          '..'
        BNE     ZF20B                    ;F212: 26 F7          '&.'
        RTS                              ;F214: 39             '9'

余談だが、Cだとこう書くかな。これを上記のようにコンパイルできるCコンパイラ欲しい。


        while ( (a = *ix++)!=0x04 ){
          ascout(a);
        }


なぜ終端が$04なのか

現代的な目で見ると、終端が$00でなくて$04なのは不自然。C言語でも終端0だし。
$00であれば、CMPAを省略できて 2バイト縮む。

(細かいことを言えば、AccBを使った方がいいんだけど、それはMC6809がAccA:Bをペアレジとして使った後の話)

また、BASICでもこのルーチンを使っているため、CHR$($01)で出力モードを変更しても、CHR$($04)だけ表示できない。実に不便。

BASICMASTER MB-6881 ベーシックマスターレベル2II取扱説明書 P.46より引用



$04は、ASCIIコードではEOT(End of Text)になっていて、これが終端文字列の由来だと思われるが、$00にして欲しかった。

いまさらBASICMASTERには、いろいろと改良して欲しいところがあるのだ。