16N.アルゴリズム
「でも、不思議ですね。このコンピューターが出来ることって数を足したり引いたりするだけです。何故そんなに色々なことが出来るようになるのでしょう?」
モンさんがぽつりと呟いた。
アイルさんがのコンピューターの説明を聞いて、コンピューターというものは凄そうだと思った。
だけど、確かにモンさんの言う通りだ。
先刻渡されたニーモニックの表を見た。
演算と記載されている場所には、ADC,SBCといったものがある。足し算と引き算か?
AND,ORA,EORというのは演算に並んでいるのだが、これは何をするものだろう?
どうであれ、どのニーモニックも1ワードの数字の計算をしているだけだ。
こんなもので一体何が出来るんだろう。
アイルさんが言っていた様々な事が出来るようになるとは思えない。
どうやらメンバー全員が同じ事を思ったみたいだ。皆が渡されていたニーモニックの説明が記載されている書類を見ている。
「疑問は分かります。
コンピューターは突き詰めると数を足したり引いたりしているだけと言えばその通りです。
コンピューターに何かをさせようと思った場合に重要なのは、分岐処理と割り込みなんです。
この二つの処理を使うことでコンピューターに様々な事をさせられるようになるんです。
その説明をしますね。」
分岐?処理?
割り込み?
何のことだろう?
分岐というのは……木じゃないよな。二股に分かれた道も分岐と言うことがあるんだが……。
割り込みというのは?無理矢理人を押し退けてという感じだけれど……
それこそコンピューターに何の関係があるんだ?
「割り込みの話は少しややこしいので、先にジャンプやサブルーチンジャンプの説明をします。
JMPやBCC,BCSなどが分岐の為のニーモニックなんですよ。」
それからアイルさんは、ニーモニックが並んでいる表を基に説明をしてくれる。JMPというのは単純に別な場所に記載されたプログラムを実行する。
他にその時の状態を見て分岐するニーモニックがあって、BCC,BCSなど8種類の説明をしてくれた。
その時々の状態で分岐する。確実に分岐する条件を確定するために、直前でCMPやCPYというニーモニックを使用して主レジスタやインデックスレジスタの値を調べることも多い。
つまり、メモリーの上にある数やレジスタにある数、演算をした結果によって実施するプログラムを変えることが出来る。
特殊な分岐にJSRというものがある。これはサブルーチンジャンブと言うのだそうだ。ジャンプした先にRTSというニーモニックが出てくると、呼び出した場所に戻る。
JSRは特殊なニーモニックで、このニーモニックが出てくると元に戻る為にプログラムカウンターの中身がスタックに積まれる。
このスタックレジスタは一旦使われると自動的に値が1増える。
いや、JSRというニーモニックを実行する時にそういう操作を一括してやっているのか?
サブルーチンから戻るにはRTSというニーモニックを使う。スタックレジスターの値を1つ減らして、プログラムカウンターの値を元に戻す。
「コンピューターというものは、随分と細かく動いているんですね。」
モンさんが呆れ顔で言う。
「コンピューターのプログラムはそういう物です。色々なプログラムを作って、それらを組合せていくことで、複雑なことが出来るようになっていくんです。
割り込みの場合はさらに複雑な処理を行ないます。」
「割り込みって何ですか?」
マラッカが質問した。
「割り込みが発生すると、その時に実施していた内容を保存するために、スタックで全てのレジスタを退避させます。
割り込みの処理が終了したら、RTIのニーモニックのところで元に戻します。
スタックに積み上げてあったデータを全て戻して元の作業に戻る訳です。」
多分、マラッカが訊いたのはそういう事じゃないんじゃないかな。
「えーと、そもそも割り込みっていうのは何なんですか?」
マラッカが再び訊いた。
「えっ、そもそも……ですか?」
「そうです。割り込みって、順番を待っている人の前に割り込んだりする時に使う言葉ですよね。コンピューターの割り込みって何なんですか?」
「あっ、そういう事ですね。
割り込みというのは、コンピューターの動作を一時的に中断して、他の作業を実行する仕組みです。
モニタープログラム以外の他のプログラムが動いている時には、キーボードを叩いてもコンピューターは動作を変えてくれないんです。
もし、他のプログラムの動作をキーボードで制御するには、コンピューターにキーボードを叩いたのを知らなきゃならないでしょう?
一定の周期でキーボードを見に行くようにプログラムを作っても良いんですけれど、そうなると即時性が無くなります。
そんな場合には、キーボードを叩いたという信号で割り込みを掛ければ、対応できるようになるんですよ。
一応、リセットスイッチとは違ってマスカブルな割り込みにしてあります。
この図面のUARTに信号線があるのが分かりますか?
これが割り込みの信号線なんです。
キーボードのスイッチが押されると、フリップフロップで押された情報を保持したまま信号をコンピューターに送ります。
リセットする信号線もあって、コンピューターの方でキーボードコードを処理するとプログラムでリセットしているんです。」
「...」
また何時も通りに、新たな単語が突然、しかも大量に出てきたな。
アイルさんの話を聞いている内にマラッカは困惑顔になっていった。
再度訊いてみるのは諦めたみたいだ。
オレは内容が気になったので、執拗に訊いてみた。アイルさんから何かを教わろうと思ったら質問を諦めてはダメなんだよな。
割り込みというのは主に外部の道具との遣り取りに必要なものなのだそうだ。
何かのプログラムが動いている時に、外部からの入力があった時に対処するために仕組みだ。
これは、無視することも出来るらしい。
マスカラブルインタラプトと言っていた。
割り込みが発生した場合にどの場所にあるプログラムを実行するのかは、以前特殊な領域と言っていたアドレスが$00000000から$000000FFのメモリーに記載することになっている。
無視出来ない割り込みもあって、それはアンマスカラブルインタラプトと言うのだそうだ。
プログラムに誤りがあった場合に、コンピューターが止まらなくなってしまうことがあるらしい。
そんな場合にはリセットと言うボタンを押すと強制的にプログラムは停止して最初の状態に戻すことが出来るのだそうだ。
この割り込みをプログラムの中で発生させることも出来るらしい。
ただ、それはかなり特殊な場合に使う。
工夫をすると、この割り込みを使用してコンピューターで複数のプログラムを動かすことも出来ると言っていた。
この割り込みが発生した時には、
それまで実行していた作業を中断して、決められたプログラムを実行するのだそうだ。
この割り込みの時はスタックに全てのレジスタの内容、プログラムカウンターの値がスタックに積み上げられる。
そして、その決められたプログラムの中のRTIを実行すると、スタックに積み上げられた全てのレジスターの内容を回収して元のプログラムに戻る。
何だか普通の仕事と似ていると思った。
以前王宮に居た時には、仕事をしている最中に上司から呼び出しを受けるなんて事は多かった。
上司から呼ばれたら、その時の仕事は途中で放り出して中断しなきゃならない。
そんな場合に肝心なのは、後で仕事を再開出来るよう整頓する事なんだが、コンピューターも同じなのか。
この割り込みに合わせてステータスレジスタの説明をしてくれた。
フラグと言っていたのだが、ステータスレジスターの特定のビットには其々意味があって、そのビットが0なのか1なのかを判断するニーモニックがある。
キャリーフラグというのは足し算をした時に1ワードで収まり切らなくなったり、引き算の時にマイナスになる場合にセットされる。
他にも演算結果がゼロになる場合にセットされるフラグや、割り込みの時に使われるフラグ等があった。
「本当は正式版の6502の様にd10進計算できるモードを作りたかったんですよね。だけど今の状況ではちょっと難しかったんです。
でもファミコンのチップには無かったんでまあ良いかなと思ってます。」
何だか不思議な話をアイルさんが言い出した。6502?ファミコン?それって何だ?
訊いてみたけれど、不思議な表情をしながら、忘れてくださいと言っていた。
何なのだろうか?
1時ほどして一通りの説明が終わった。
一通りアイルさんの説明を聞いたのだが、まだ実感として様々な事が出来ると思えない。
ただ、ディスプレイに文字を表示するのも、プリンターで文字を描くのもプログラムで実施しているということだったので、プログラムを作っていけば色々出来る様にはなるんだろうか?
「それじゃあ、簡単な練習問題を出しますね。皆さんで相談しながらプログラムを作ってみてください。」
その練習問題というのは、二つのメモリにある数の積算の結果を別なメモリに格納するというものだった。
注意書きには1ワードの数を積算した場合には2ワードになるのでそれに対応することと、シフト演算を上手く使うこととあった。
「掛け算ですか……。そう言えばコンピューターってこのままだと掛け算は出来ませんね。」
モンさんの言葉を聞いてニーモニックの表を見直した。確かに足したり引いたりするだけで掛け算のニーモニックは無い。
「だからプログラムってやつを作るんじゃないのか?」
アンゲルがモンさんに応えた。
「先刻の話だとジャンプをすれば同じことが出来るんでしょ。だったら、最初の数を後の数の回数足していけば良いんじゃないかしら?」
マラッカが提案をした。
コンピューターは多分文句を言うことなく、同じ数を足し続けられるんだろうけれど、何だかムダな気がする。
「それでも計算できるだろうけど、1ワードって0からd31,W13(=65,535)までの数字なんだろう?最悪d31,W13回足し算をすることになるんじゃないか?
筆算の掛け算みたいにする方が計算の数が減ると思うんだけどな。」
「それだとエバエバの表(=九九の表の12進数版)みたいなものが必要になるんじゃない?」
エバエバの表を準備するのは確かに面倒かも知れないな。
「いや、それは要らないよ。コンピューターの中の数って2進数だろ。注目している桁の数が1だったら足して0だったら足さないだけだよ。」
マラッカの質問にハムが応えた。
そうか。確かにコンピューターの中の数は2進数だと言っていたな。2進数で数を表わすと0か1しか無い。掛け算も簡単になる。
それからオレ達は、具体的にプログラムを組み始めた。
1ワードの数同士の掛け算であれば、その結果は2ワードを越えることは無い。
結果を格納するための2ワードのメモリを準備してゼロを入れる。
掛ける数を別な場所にある2ワードのメモリの下の方に格納する。
そして足し算のサブルーチンを実行していく。
掛けられる数の一番下のビットが1なのか0なのかで、結果を格納するための場所に掛ける数を足すか足さないかを決める。
掛ける数を右にシフトさせて、掛ける数の2ワードを左にシフトさせる。
これをd14回繰り返す。
注意したのは、2ワードの演算をする為にキャリーフラグを含めた演算をすることだ。
「何か、計算できそうな感じになってないか?」
試行錯誤して最終的に書き上げたプログラムのコードを見ながらアンゲルが言った。
「じゃあ、実際にコンピューターに入れて計算してみましょうよ。あっ、だけどこのプログラムをオペコードというやつに変更しなきゃならないのよね。」
そう言いながら、マラッカが出来上がったニーモニックが並んでいるプログラムの脇にオペコードを書き始めた。
「サブルーチンのアドレスって、どこでも良いのよね?」
「そうじゃないかな。プログラムを置く場所や数字を入れる場所から離しておけば良いんだと思うな。」
マラッカが作業をしながらハムに訊いていた。
出来上がったd14進数の記号をコンピューターのモニターを使ってコンピューターの中に入れていく。
「じゃあ動かすわね。」
先刻から見ていると、マラッカはかなり積極的だな。
計算は一瞬で終った。
結果の部分のメモリーを表示させて、ハムが筆算で掛け算をして確認した。
「合ってますね。ちゃんと掛け算したみたいです。」
メンバー全員で歓声が上がった。
何だか分からないが無性に嬉しかった。
初めてのプログラムが動いた。
「だけど、他の数でも確認してみないと。」
ハムはそう言うと、数を変えて何度かプログラムを動かして結果の確認をしていった。
「どうだ?他の数でも結果は合っているか?」
アンゲルがハムの作業を見ながら声を掛けた。
「ええ。大丈夫ですね。数を変えても結果は合ってますよ。」
「じゃあ、掛け算はあのプログラムで合ってるってことだな?」
「そうですね。」
ハムも皆も嬉しそうに微笑んだ。
「こうやって、細かなサブルーチンを作っていくとアイルさんが言っていた様に色々な事が出来るようになっていくのでしょうか?」
「そうじゃないかな。」
モンさんの言葉にオレが応えた。
「ですが、随分と細かな作業になりそうですね。」
モンさんの懸念はその通りだろう。
あのニーモニックを組み合わせてプログラムを作っていけば、色々なことが出来そうだけど、プログラムってやつは異常に細かな記述をしなきゃならない。
オレ達は出来上がったプログラムをアイルさんに見せに行った。
アイルさんは、机で何かを書いていた。
「あっ、課題が出来たんですね。見せてもらいます。」
オレ達が書いたプログラムをアイルさんは暫く見ていた。
「良いですね。ちゃんと動きましたか?」
「ええ。幾つかの数で確認してみましたが、どの結果も合ってました。」
ハムが先刻まで確認した内容を伝えた。
「そうですか。皆さんに課題を渡した回答は、単純に足し算を繰り返すプログラムになるんじゃないかと思ってました。けれども効率的なアルゴリズムになってます。このアルゴリズムを良く思い付きましたね。」
アルゴリズム?
「アルゴリズムって何ですか?」
オレはアイルさんに訊いた。
「アルゴリズムっていうのは、プログラムを記載する手法のことです。
掛け算の場合には片方の数をもう一方の数だけ足し合わせるといのもアルゴリズムの一つです。
アルゴリズムの善し悪しで作業に掛かる時間が大きく違ってきます。
皆さんが採用したアルゴリズムは効率的、つまり作業時間が短いものになってますから効率的と言えます。
これは筆算の掛け算を応用していますよね?それにしてもシフト命令を上手く使ってます。予想以上の出来です。」
これって、褒められているんだよな。
褒められているらしい事に気付いたメンバー全員が笑みを見せた。
「これなら、プログラムの作成に期待が出来そうですね。」
そう言いながら、先刻までアイルさんが書いていた書類をオレ達に見せた。
そこには、沢山のサブルーチンについて記述されているリストがあった。
そして、それらのサブルーチンを組み合わせて機能を果たすサブルーチンといったものが並んでいる。
「これは、外部記憶を使い易くするためのものです。
全てのサブルーチンが作れたら、文書に名前を付けて外部記憶に格納したり、不要な文書を消去したり、格納されている文書の名前のリストを表示したりできます。」
「文書を外部記憶に保管できるようになるんですか?」
「今のままでも、保管することは出来るんですけど、使うのには不便ですからね。」
「えーと。それじゃあ、便利に使えるようにするためのプログラムという事ですか?」
「今の状態は、外部記憶にメモリーの内容を保管するには、トラックとかセクターを指定して、一定の領域しか保管できません。それに内容についても別に記録して置かないと、どこに何を保管したか分からなくなってしまいます。
外部の記憶の道具を使えるようにするプログラムの事をDOSと言います。
そのDOSを作る作業を手伝ってもらいます。
私は今ラインエディタというプログラムを作ってます。
それが出来たら、文書をコンピューターを使って書くことが出来るようになります。
いて、文書を外部記憶に保管して、その文書をプリンターで書き出したり出来るようになリます。」
「えっ、それじゃあ報告書をコンピューターを使って書いたり、報告書を保管しておいたり、過去に書いた報告書を修正してプリンターで書き出しが出来るようになるんですか?」
マラッカが少し興奮気味に質問した。
「まあ、そうなります。出来れば皆さんが居る内にそうなれば良いんですけれども。」
「凄いわ。あっ、でもコンピューターって組み立てようと思ったら、先週した様な大変な作業が必要になるんですよね。それじゃぁ簡単には使えないですね。」
「量産出来れば良いんですけれど、まだ、その準備が出来てないんです。
ニケにも新しい基板用の素材を作ってもらわないとならないし……あれ?魔物レジンって使えるのかな……確認してなかったな……まあ、後で良いか、それは……」
アイルさんは最後にはブツブツ言いだした。
コンピューターと呼べるものは、今ここにある8台だけだ。
かなりの貴重品だ。報告書を書くための道具という訳ではない。
それに、アイルさんの話では、分析化学研究室に何台か移設する予定だと言っていた。
その日はそのサブルーチンのリストを受け取ったところで終業時間になった。
翌日から午前中の講義が復活した。
午後からはメンバーで相談しながら沢山あるサブルーチンプログラムを作っていった。
ジーナが研究室に訪ねてきた。
「あら、何だか記号だらけね。これは何をしているの?」
ジーナはオレの手元にある紙を見て質問してきた。
オレはジーナにプログラムを作っていることや、コンピューターの話をした。
「へぇ。それじゃあ、考案税申請書をコンピューターに保管できるって訳?」
「そうだな。それに特定のキーワードで篩い分けすることもできるようになるみたいだ。」
「そうなの?それってカードより便利かしら?」
「カード?何だそれは?」
ジーナはカードについて説明してくれた。
掌ぐらいの大きさの厚手の紙に、考案税申請書の簡単な要約と申請年月日、承認された年月日、書庫にある申請書の番号を記載したものだ。
厚紙の上端と左右両端の部分に切り欠きか穴が空いていて、穴に通る太さの棒をカードの束に差し込んで持ち上げると特定の領域のカードを取り出せるようになっている。
「へぇ、便利な方法があるんだな。それって昔からあったのか?」
「そんなことある訳ないでしょ。厚手の紙なんてマリムじゃなきゃ手に入らないわよ。」
それはそうだ。忘れてしまいそうになるが、以前は文書は木簡に書いていた。それもそれ程前のことじゃない。
「そうだったな。」
「昔は過去の申請書の木簡をとっかえひっかえ読んでたわ。ミケルこそ昔の事件の記録はどうやって管理してたの?」
「いや、多分誰も管理なんてしてなかったんじゃないかな。
そもそも事件って相互に関係していることって殆ど無いから。
関係者に事情を訊いて、過去の事件と関係していると分った時に昔の事件の記録を読むなんてことはあったけれど、本当に稀な事だった。
だから、法律と判例さえ頭に入ってれば仕事になったんだ。その記憶と判例が保管されている木簡倉庫頼みだな。
そこらへんは過去に申請された申請書の確認が必要な考案税とは違うんだよ。
だけど凄いな、カードだっけ?そんな方法で管理しているのか。」
「ふふふ。でも、これってニケさんに教えてもらった方法なのよね。」
はにかんだ様にジーナが笑った。
そうか、自分で考えた方法って訳じゃないのか。
「それで、今日は何か用事かな?」
「あっ、そうそう、リーサが新居のための日用品を準備してくれるって言っていたんだけど。ミケルが必要なものって何かある?」
生活に必要なものって……それはオレもジーナも同じ様なものを使うんじゃないか?
ジーナが持っていないものでオレだけが持っているのって髭剃りの道具ぐらいじゃないかな。
以前は、青銅で出来ていた刃物で髭を剃っていた。
これが結構曲者で、直ぐに錆びて切れ味が悪くなる。
専門の工房に持ち込んで錆取りと研磨をしてもらっていた。
世の中には硬い石で作られているものもあるにはあるのだが、高価な希少品で手が出なかった。
マリムに来てからはステンレスの刃物に変わった。
噂では高級品の石の髭剃りよりも切れ味が良いって話だ。
これは錆ない上、切れ味も悪くならない。
愛用の品だ。
だけど、これは今使っているものを持っていくだけだよな。
「それは、今のオレの宿舎から持っていくから大丈夫だと思う。」
「そうなの?男性だけが使う日用品って私には分からないのよ。」
「髭剃り道具ぐらいじゃないか。それは持っているから新規には必要なものじゃないな。」
「髭剃りの道具は流石に私は使わないわね。それで本当に他には無いの?」
しつこく訊かれたので、オレが宿舎で使っている日用品を伝えてた。大した種類がある訳じゃない。
案の定、髭剃りの道具以外の物はジーナのところにもあるみたいだ。
「じゃあ、ミケルのものは用意しなくても良いってリーサには伝えておくわね。」
その日はジーナはそう言って他の研究室に向かった。
それから、毎日、講義とプログラム作り、そして時々ジーナの訪問という毎日が続いた。
ジーナは、来る度に色々相談をしてくる。
結婚式の後の宴会は、同期のマリエーレが準備してくれているらしい。
宴会に誰を呼ぶのかと訊かれた。
まだ、何も考えていなかった。
一緒に居たアンゲルが、
「オレ達は呼んでもらえるんだよな?」
と訊いてきた。
「それは当然だ。しかし、宴会って知り合いを誘うんだよな。他に誰を呼ぼうか……。」
「殿下はどうするんだ?」
「えっ?」
アンゲルが言っている殿下って……。
「そうよ。随分親しくしてたじゃない?」
マラッカまでそんな事を言い出した。
「オレから殿下を呼ぶのか?
それは流石に畏れ多いんじゃないか?」
「それは大丈夫じゃないかしら?
ただ、私もそんな事は考えたことも無いから分からないけど。」
「殿下って、何方の事?」
ジーナが訊いてきたので、サッカーでエリオ殿下と知り合ったことを伝えた。
「へぇ、ミケルってそんな人とも知り合いになってたの。」
「偶々だよ。」
「でも、サッカーの試合に誘われてたじゃない。ハムも仲間みたいなものじゃないの。」
とマラッカ。
「そうですね。王太孫ですけれど、かなり気さくな方ですね。」
それに応じてハムも話す。
「やっぱり呼んだ方が良いわよ。」
マラッカが勧めてきた。
「そうか……じゃあ誘ってみようかな。だけど、メーテスって試験の後って半月程休暇じゃなかったか?王都に戻っていて不在だったりしないか?」
「アイルさん。メーテスの授業ってどうなってますか?」
オレの代りにマラッカがアイルさんに訊いた。
プログラムを作っていたアイルさんが顔を上げてマラッカの質問に応えた。
「メーテスの授業ですか?
それなら今週から再開されてますよ。
それがどうかしましたか?」
「ジーナさんとミケルの結婚式の後で行なう宴会にエリオ殿下を誘ったらと話してたんです。」
「へぇ、皆さんはエリオ殿下と知り合いなんですか。誘われたら良いと思いますよ。殿下も喜びそうです。」
アイルさんもエリオ殿下とは知り合いなのか。いや、それは当然のことか。
「ほら。誘ったら良いのよ。」
マラッカがオレに再度勧めてきた。
「そうなのか……じゃあ明日にでも誘ってみるよ。」
前回に引き続き、更新が遅くなってしまいました。申し訳ないです。
今回は、使っている 10年以上前の iMac の OS が飛びました。既にApple のサポートから外れてます。そんな訳で Linux を OS にしていたんですが、それがアップデートを境にして緘黙状態になってしまいました。
幸い、クラウドにデータは全て保管されていたのですが、使っていた OSの openSUSE を再インストールを試みるも動かず。
色々試して Ubuntu が動作したのでそれに乗り換えたら、今度はクラウドにアクセス出来ず。
この一週間スッタモンダしてました。
何とか暫定的に執筆出来る環境を作って、書き始めることが出来ました。ただ、未だに安定して動作する方法が決まってない状況で、何とかこんな状況から抜け出そうとジタバタしてます。
次回も更新が遅くなってしまうかも知れませんが、この状況をどうにかしようと足掻いているんだと思ってもらえれば有り難いです。




