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

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



[第10回]


●最も基本的なサブルーチン(1)

今回からはいよいよTINY BASICプログラム本体の説明に取り掛かります。
今までの文法の説明と同様、まずはオリジナルの英文の原文をもとにして説明を進めることにします。

ところで。
ND80Z3.5のCPUはZ80です。
命令コードレベルでは8080互換です。
ND8080のCPUは8080なので、ND80Z3.5もND8080もオリジナルのTINY BASICがそのまま走って当然と思われるのですが。
そういうわけにもいかない事情があります。
主に2つの大きな理由があります。

その1つはオリジナルのTINY BASICはアドレス0000から始まるプログラムなのですが、ND80Z3.5もND8080もそこはシステムROMプログラムの開始アドレスなので、ND80Z3.5対応版(ND8080も同じ)の開始アドレスはユーザーRAMアドレス(8000以降)に置かなければならないという点です。
アセンブラで作成するならばORGを8000に変えればよいじゃないかとお思いかもしれませんが、どっこいそんなに簡単ではないのです。
それについてはのちほど説明をいたします。

2つめの理由は入力と出力の部分が完全にハードウェアに依存している点です。
オリジナルのTINY BASICでは入力と出力はRS232Cを経由しておそらく昔のテレタイプのような装置につながっていたと推察されます。
入力はタイプライタのようなキーボードで出力はプリンタ装置だったと思われます。
さらに外部記憶装置として紙テープリーダー/パンチャーも接続可能だったようです。
一方ND80Z3.5やND8080はUSB経由でWindowsパソコンの画面に表示出力を行い、Windowsのキーボードから入力します。
その入力と出力に関係する部分は書き換えなければどうしようもないでしょう。
とりあえずはUSB接続版としてプログラムを直していきますが、最終的には独立化セットのもとでも実行できるように考えたいと思っています。
その場合にも入力と出力の部分は書き換えることになるかと思います。

そういう事情でオリジナルのTINY BASICプログラムに必要な変更を加えてND80Z3.5版(ND8080その他版)を作成していくことにします。
そのND80Z3.5版はとりあえずやっと動作するところまでできたのですが、まだ完成ではありません。
これから完成に向けて作業を進めていきます。

以上のことを理解していただいたうえで、いよいよTINY BASICプログラムの説明を開始いたします。
まずは雑誌に掲載されたオリジナルのプログラムリストをもとにして必要な説明をしたのちに、それを変更したND80Z3.5版プログラムについての説明をしていくという流れでいきたいと思います。
オリジナルのプログラムリストには実に懇切丁寧なコメントがつけられていますので、それを読んでいただければそれ以上に説明する必要はないのではとも思います。
しかしなかには「横文字はどうも苦手で」とお思いの方もいらっしゃるかと思います(実は私も苦手なのですけれど)。
ですのでせっかく丁寧なコメントがついていることでもありますからその丁寧な英語のコメントを意訳しつつさらに必要と思われるところには追加の説明をはさんでいきたいと思います。

まずは今回のテーマであります、プログラム先頭の「最も基本的なサブルーチン」について説明をいたします。
以下は原文の冒頭部分とそれに続くプログラムの先頭部分のリストです。
説明を書いていくうちにオリジナルのプログラムリストのコピーがずっと下のほうにいってしまいました。
一度ずっと下の方まで行っていただいて、リストのコピーをざっとながめていただいてから、もう一度ここまで戻ってきてください。


8080(Z80)のアドレス0000〜0038には1バイトのCALL命令のエントリアドレスが配置されています。
1バイトのCALL命令とは本来は割込命令として用意されたRST 0〜RST 7の8命令のことです。
普通のCALL命令は2バイトのアドレスを含む3バイトの命令(CDXXXX)ですがRST 0〜RST 7は同じサブルーチンCALLの機能を1バイトの命令コードで実現しています。
その代わりに通常のCALL命令が任意のアドレスのサブルーチンをCALLできるのに対してRST 0〜RST 7は0000〜0038の固定アドレスをCALLすることしかできません。
各命令は以下のアドレスに割り当てられています。
0000 RST 0
0008 RST 1
0010 RST 2
0018 RST 3
0020 RST 4
0028 RST 5
0030 RST 6
0038 RST 7
たとえばプログラムの中でRST 1が実行されると、アドレス0008から書かれたサブルーチンがCALLされます。
RST命令の中では、RST 0だけは特殊で、アドレス0000はCPUがリセットされると最初に実行されるアドレスです。
ですからここは必然的にシステムのエントリアドレスになっていて、つまりRST 0が実行されるということはソフトウェアによるリセットが実行されることになります。
ここには通常はシステムプログラムのエントリプログラムへのジャンプ命令が置かれます。

このTINY BASICではRST 0以外のRST 1〜RST 7はシステムプログラムの中でCALLされる最も基本的なサブルーチンとして使われています。
もちろん基本的なサブルーチンでもそのようにRST命令によってCALLされなければならないということは全くありません。
たとえシステム内で多用されるサブルーチンであっても普通のCALL命令で呼ばれる通常のアドレスに置いても全く構いません。
ただ当時はメモリがとても高価でROMもまだやっと2KBの2708が普及しかかったという時代でした。
そういう時代ではいかにしてプログラムを短く仕上げるかということには大きな意味がありました。
プログラム内で多用されるサブルーチンをCALLするのに3バイトのCALL命令を使うところを1バイトのRST命令で置き換えれば1回のCALLについて2バイトの節約になりますからRST命令を使うメリットはそれなりにあったはずです。
今はメモリサイズにそれほどこだわらなくてもよいので、あえてRST命令を使う意味はそれほどありません。
そこはもっと自由に考えてよいと思います。

なおRST命令は上で書きましたように8バイト毎のアドレスに割り当てられていますから、それぞれのサブルーチンはよほど短いものでない限りはどこか別のアドレスに置いたサブルーチン本体へのジャンプ命令程度のものしか書くことができません。
JMP命令は3バイトですからそれを引くと残りは5バイトです。
おそらくなんらかの初期設定命令を書いたあとはすぐにJMP命令を書くという構造になると思います。

上で書きましたようにRST 0〜RST 8のエントリアドレスは0000〜0038ですがTINY BASICではそれに続くメモリアドレスも含めて185バイトのエリア(0000〜00B9)にRST 1〜RST 7に加えてあと2つの基本的なサブルーチンを置いています。
このあとその基本的なサブルーチンについての説明をしていくことになるのですが、本日は時間がなくなってしまいました。
次回も以下のコピーをそのまま再掲したうえで具体的な説明に入るつもりです。

それまでに皆様におかれましても各命令の横にびっしりと書き込まれたコメントを読み解いていただいて、一体なにをしているサブルーチンなのだろうかというような探りを入れていただくと、より理解が深まるのではと思います。







復活!TINY BASIC[第10回]
2020.5.29upload

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