FENIX Ver0.2 Copyright (C) 1991-1998 S.Uchida
fsh Ver0.2 Copyright (C) 1991-1998 S.Uchida
これはある程度はしようがないもので、あまりにも丁寧に細部に渡って書きすぎると肝心な部分がぼやけて余計にわかりにくくなる、というのはよくあることです。
しかし難しく書いてあると初心者にはわかりにくいのは当然です。 そこでここでは、初心者向けに実例を交えて初歩的なところから説明したいと思います。
一言で言ってしまえばデータやプログラムのことです。
シェルの load コマンドによってロードして、ps で表示されるものは全てオブジェクトです。 大した意味はありませんのであまり気にしない方がいいでしょう。 プログラムを組むとなると、重要な意味を持っているのですが。
MZは8KB単位でメモリを管理できますが、管理するためにはそのメモリブロックに番号をつける必要があります。
ここで、FENIXは各オブジェクトが持っているメモリブロックに対してそれぞれ0から始まる番号をつけています。
他のオブジェクトがどんなメモリブロックを持っていても関係なく、そのオブジェクト固有の番号が決まっているのでローカルなメモリブロックと呼ぶのです。
MZはメインRAMを最大256KB、グラフィック表示用RAMを最大128KB、そしてEMMを増設すると更に640KBのRAMを使うことができます。 FENIXではこれらを統一して管理して、最大1MBのRAMを扱うことができます。 しかし、これらのメモリは種類によって性質が異なるので、プログラムによっては特定の種類のRAMでないと使えない、という事態がよく起きます。
例えばマシン語のプログラムはメインRAMの上でないと走りませんので、GRAMやEMMにマシン語プログラムを置いておくのは意味がない、ということになります。
しかしFENIXでは沢山のプログラムをメモリ上に置いておくことができます。 ですから、いくらマシン語プログラムはメインRAMの上でしか動かないからと言ってもGRAMやEMMが余っているのに普通のRAMが余っていないからロードできない、というのではちょっと融通が利きませんね。
一度にひとつのプログラムしか実行できないのですから、実行しないプログラムはメインRAMの上に置いておかなくても、GRAMやEMMの上に置いておけばいいじゃないですか。 実行するときだけメインRAMの上にあればいいのです。
これがメモリスワップの考え方です。 あるオブジェクトがメモリを使おうという時に、必要な種類のメモリが足りなければ最近動いていないプログラムを追い出してメモリを確保します。
実際にはどんなメモリを利用できるかを示すマッピングモードというものが各メモリブロックに設定されていて、少々複雑なアルゴリズムでスワップが起きるのですが、ただ使うだけなら、スワップは全自動で行われますからあまり気にする必要はありません。
しかし、プログラムによっては実行後も消去されずに残るものがあります。 これが常駐オブジェクトで、メモリ上に居座って何か特別な動作をします。 そのようなオブジェクトをシェルから消す方法はありませんので、消したい場合は各プログラムのマニュアルを参照して下さい。 常駐解除の方法というのがあるはずです。
常駐オブジェクトの多くはTSRとして実現されます。 TSRとは、常駐して特殊な動作をするもので以下の3種類に大別されます。
ソフトウェア割り込みとは、他のオブジェクトから呼び出されて何らかの動作を行うもので、0.1秒タイマ割り込みは0.1秒単位で動作するもの、そしてハードウェア割り込みはZ80の割り込み機能を用いて何らかの動作を行うものです。 これらの割り込みを使用しているオブジェクトの場合、ps で表示した場合それぞれ
ソフトウェア割り込み ... Sft 0.1秒タイマ割り込み ... Tim ハードウェア割り込み ... PIO , SIO , VBL , INT , PRT , RTC , MCP のいずれか
というタイプで表示されます。
簡単に言いますと、標準入力は普段はキーボードにつながっている入力用デバイスで、標準出力は普段はテキスト画面につながっている出力用デバイスです。
これでも何のことだか分かりませんね。実例を挙げて説明しましょう。
fsh には ls というコマンドがあります。 ディレクトリの内容を表示するコマンドですね。 しかし正確に言うと、あれは表示しているのではなく標準出力に出力しているのです。
では確かめてみましょう。 fsh は標準入出力をリダイレクトする機能を持っています。リダイレクトとは、デバイスをつなぎ換えることです。
ls > file
として下さい。するとディレクトリの内容が表示されません。 バグか!?と思ってもう一度 ls とやってみると、今度はちゃんと表示されます。 しかし、あれ?なんか "file" という変なファイルができていますね。 cat file として中をのぞいてみると、なんとディレクトリの内容が入っています。 これがリダイレクトの結果なのです。
">" は標準出力のリダイレクトを表す記号です。最初の ls での "> file" は、
「普段はテキスト画面につながっている標準出力の出力先をfile というファイルに変更しなさい」
という意味です。
これによって、テキスト画面に出力されるはずだったディレクトリの内容は、file というファイルに対して書き込まれたわけです。
だんだん分かってきたでしょうか。もっと分かりやすい例を示しましょう。 プリンタをお持ちの方は紙をセットして下さい。
とすると、おお!プリンタにディレクトリの内容が出力されました! リダイレクトは、単にコマンドの出力をファイルに保存しておくだけではなく、こんな具合にプリンタに出力したりもできるんですね。ls > LPT:
標準出力については大体分かったでしょうか? では今度は標準入力です。
cat を使ってみましょう。 cat file とすると、file(BSDに限る)の内容を標準出力に出力します。 ですから、cat file > LPT: とするとプリントアウトできるというのも分かりますね。
cat は引数を指定しなければ標準入力からデータを読んで標準出力に出力します。 では cat とだけ入力してみましょう。
単にカーソルが点滅しているだけですね。何か変だと思いつつ適当に abc とでも 打ち込んでリターンキーを押すと、あら?また abc と表示されました。
これは、標準入力(キーボード)から abc という入力があったので、 標準出力(テキスト画面)に abc と出力した、という意味です。
しかしこれでは単にこちらが打ち込んだ文字をオウム返ししているだけですね。 面白くないからやめましょう。
…あれ?これはどうやって止めたらいいんでしょう? 何を打ち込んでもオウム返ししてくるだけでは、永遠に抜け出すことはできません!
この場合には方法は2つあって、
では2番はどういう意味でしょう? 以下のような入力をしてみて下さい。
この ctrl+Q で入力されるデータががEOFコードというものです。 (EOF・・・End Of File の略) キーボードから標準入力する場合の、これでデータは終わりですよ、という合図です。 これで cat は標準入力からの入力が終わったことを知り、処理を終わったのです。
ちょっと使いづらいですね。何の役に立つんでしょうか? これはリダイレクトしてみると分かります。 そう、標準入力も標準出力と同様にリダイレクトすることができるのです。 そのキャラクタは "<" です。
cat < file としてみましょう。 今までの話から考えると、これはさっきまでキーボードから入力していたものを代わりに file というファイルから入力するように切り換えるものですね。
実行してみると、あれ? 最初に cat file とした時と同じく file の内容が表示されましたね。 これは
ということで、結果的に同じ動作をしています。 しかし意味は違うということを覚えておいてください。
cat file .... file の内容を標準出力に出力する。 cat < file .... 標準入力に file をつなぎ、標準入力から得たデータを標準出力に出力する。
もっとリダイレクトを使ってみましょう。
これはどうでしょう? file から読んだ内容を file2 に出力しています。なんとファイルコピーです。cat < file > file2
これは、引数として与えられた3つのファイルを順番に標準出力に出力します。 その標準出力は files というファイルにリダイレクトされていますから… おお、3つのファイルを結合してひとつのファイルにしています!cat file1 file2 file3 > files
今度はこれです。
標準出力はリダイレクトしています。cat 自身に引数は与えられていませんから入力は標準入力からとなります。 リダイレクトしていないのでキーボードから、ということになりますが… あれ? これはキーボードから入力したデータをファイルに書き込む、一言で言えばラインエディタもどきになっているではありませんか!cat > file0
簡単なテキストファイルならこれで充分に書くことができます。 シェルスクリプトなんかを書くのにも使えるでしょう。
リダイレクトのおかげで cat ひとつで実に多彩なことができます。 標準入出力、リダイレクトとはどういうものか、お分かりになったでしょうか?
本当はリダイレクトにも色々とモードがあります。 詳しくはfsh manualを参照して下さい。
そのような場合に役に立つのがヒストリ機能です。 fsh は1KBのヒストリバッファを持っていて、昔打ち込んだコマンドを1KB分だけ覚えていてくれています。 普通、ひとつひとつのコマンドはせいぜい十数文字くらいのものですから、かなりの数のコマンドを覚えていてくれます。
history 及び ! がヒストリに関するコマンドです。 マニュアルを読んでぜひ使いこなしましょう。
ここで言う変数は、BASIC風に言えば配列型文字変数といったところでしょう。 そして、set,unset という命令が変数に関する命令です。 早速使ってみましょう。
としてみて下さい。そして、今度は set とだけ入力してみます。 多分、PATH や TEMP といったことが書かれた行があると思いますが、とりあえず無視して下さい。 test abc と書かれた行が表示されたはずですから、そこに注目しましょう。 これは、test という変数に abc という値が代入されているということを示しています。 もう一度やってみましょう。set test abc
そこでまた set とだけ入力します。今度は test 10 と表示されたはずです。 これは、test という変数に 10 という値が代入されているということなんですが、ここで間違えてはならないのは、これは "10" という文字列であって数値ではないということです。 実際は数値かどうかはそれを解釈する側によって決まるのですが。set test 10
と、言うとそこで疑問がわくと思います。変数を解釈する側とは何か、つまり、「変数は誰が使うのか」ということです。 別にシェルでBASICのようなプログラムが組めるわけではありませんしね。
結論を言いますと、アプリケーションが使うのです。変数に値を入れておくと、アプリケーションがその値を読んで利用するわけです。 主にアプリケーションの設定を行ったりするのに使われます。 実はシェル自身も変数を利用しています。さっき出てきたPATH と TEMP がそうです。
としてみて下さい。この括弧は、PATH という変数に "1:","1:bin","2:","2:bin" という4個の値を代入することを意味しています。 このように、一つの変数に複数の値を一度に代入することができます。 これが、先ほど配列型文字変数だと言った理由です。set PATH ( 1: 1:bin 2: 2:bin )
さて、このように設定するとどうなるのでしょう。 ここで、ドライブ2の bin というディレクトリに "TEST" という実行型ファイルがあるとしましょう。 そして、現在のカレントディレクトリがドライブ1のルートディレクトリだとして、"TEST" を実行したいとします。 普通なら、2:bin/TEST という風にパス名を加えて入力しないと実行できませんが、ここで TEST とだけ入力してみます。 すると、何やらドライブ1・2のアクセスランプがチカチカします。 そして、ちゃんと TEST が起動できるではないですか。
これは、実は TEST と入力されたとき、パス名が何もつけられていなかったのでシェルが変数 PATH の値を読んで、 1: , 1:bin , 2: , 2:bin の各ディレクトリを検索して TEST を探したのです。 このように、変数 PATH には実行ファイルの検索ディレクトリを指定するという働きがあります。 これは、load コマンドにも使えます。また、指定ディレクトリがなくても構いませんし、ドライブにディスクが入っていなくても大丈夫です。
他にも、TEMP などの変数がシェルで用いられています。詳しくはシェルのマニュアルを参照して下さい。
今後このマニュアルも充実させていきたいと思いますので、わかりにくい部分がありましたら作者までご連絡下さい。