2020.6.11
前へ
次へ
ホームページトップへ戻る

[新連載]復活!TINY BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
すべてはここからはじまりました。
中日電工も。
40年前を振り返りつつ新連載です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜



[第18回]


●入力バッファとTEXTエリア(3)

前回の終わりのところで、「(入力バッファの先頭の)31がそのまま残ってしまうのは、TEXTエリアにコピーする段階で先頭の2バイトは行番号(16進数)になり、その後ろは余分なスペースを外してすぐにプログラム命令が続くように入力バッファで整えたあとTEXTエリアにコピーするため」と書きました。
しかしそのすぐあとに続けて、「それではまずい点がある」ことに気が付きました、と書いてそこで終りました。
気が付いた「まずい点」とはこういうことです。
前回の例では入力バッファの先頭には
31 30 20 があってその後ろに命令の本体が続いていました。
先頭の31 30 を0A 00 に置き換えてその後ろの20を取って後ろに詰めた結果、31がそのまま残って
31 0A 00
になったのでした。
先頭の行番号は必ず16進数2バイトに置き換えられます。
それではもし置き換え前の行番号部分が1バイトしかなかったなら?(そんなことがあるのでしょうか?ー実はあるのです)
A)その場合には1バイト不足してしまうため、16進数に変換するためには入力バッファの中身全体を1バイト後ろにシフトしなければならないのではないか?(これはノーマルな対処ですがプログラム的には余り賢くはありません)
B)あるいはひょっとすると「構わずそのまま前に1バイトはみ出させてしまう」のではないか?(逆転の発想ですが、こちらのほうが賢いやり方です)
そこのところがどうなっているのか、前回と同じ方法で確認してみました。



今回は
5PRINT A,
と入力してブレークしたあと入力バッファを確認してみました。
入力バッファの先頭は
35 50 52 …
なので先頭の35を16進数2バイトに変換するためにはやっぱり1バイト不足します。
続いて変換後にどうなったかを確かめてみました。
すると。
入力バッファの中身は前回の例とは逆に前に1バイトはみ出していました。
上に書いたB)の方法が使われていました。

しかしこれで本当によいのでしょうか?



今度はブレークポイントを設定せず、そのままRTコマンドを入力してTINY BASICに戻りました。
そのあとLISTコマンドを入力してみました。
入力したプログラム行が正しく表示されました。

これでやっと合点がいきました。
実はシステムのワークエリアのアドレスで一箇所疑問に思っていたところがありました。



アドレス1366が DS 55 になっていて、その下に入力バッファ(139D〜)が続いています。
DSは必要なバイト数のメモリ範囲を確保するためのアセンブラの擬似命令です(ND80Z3.5などに附属のアセンブラにはDSはありません)。
1366にはVARBGNのラベルがついています。
ここは配列@(0)と変数A〜Zの格納エリアです。
A〜Zは26文字でそれに@(0)を加えると合計27変数です。
各2バイトですから必要なメモリは54バイトです。
それなら DS 54 でよいではないか?
なぜに55バイト?(1バイト余分?)
ということが疑問だったのですが、ようやく謎が解けました。
今回の例のように入力バッファの前に1バイトはみ出すことがあるということを考慮して、そのための1バイトが確保されていたのでした!
なるほど。
ガッテン、です。

復活!TINY BASIC[第18回]
2020.6.11upload

前へ
次へ
ホームページトップへ戻る