その他情報コーナ-VBこぼれ話 |
私が、Basic に関わって来たこと、およびこぼれ話。
目 次 |
第一章 大学時代
第一章 大学時代 |
私がこんなタイトルを書いたのは、それなりに理由があります。
昭和54年のある日、突然、父が私を呼びました。
父「おーい」
私「なんだ、おやじ」
父「パソコン買わないか?」
私「え、パソコンて何!」
私が大学3年の時でした。
突然の事で、私も訳が分かりませんでしたが、よくよく聞いてみると、
父「パソコンとは、自宅で使えるコンピュータだ!」
との事です。
当時、私の父は、会社のシステム部の部長で、パソコンには以前から興味を持っていたらしいのです。訳も分からず、私は父と運転手の母(当時、私は免許を持っていませんでした)と秋葉原に向かいました。とりあえず、秋葉原のNECのショップ、「Bit
INN」に行って、初めてPC8001というパソコンを見せてもらいました。その時の感想は、
「これで、いったい何ができるのだろう」
という気持ちだけでした。
残念ながら「Bit INN」には在庫が無かったのですが、他の店を2〜3店探してみると、駅から歩いてから1分の「つくも電気」という店に在庫がありました。
本体標準価格は168,000円と以外と低価格なのですが、周辺機器がすべて別売でした。合計金額は、本体とモニタ、カセットテープ(これが補助記憶装置)を合わせて約20万円ぐらいだったと記憶してます。CPUはZ80という8ビットのプロセッサです。このCPUの場合、円周率の400桁の計算に4時間近くかかりましたが、最近のCPUは一秒もかかりません。RAMは16K、画面の解像度は160X100で、表示可能な色数は8色です。(ただし、テレビが白黒だったもので、モノクロの8階調で使用していました。)
OSは、今のようなWindowsとかDOSとかは無く、起動すると N-BASIC という BASIC言語の環境がすぐに立ち上がります。なんとN-BASICの作成者は、いまや世界一儲かっているソフトウェア会社、マイクロソフト社です。もちろん、外国のソフトウェアなので、漢字は表示できません。表示できるのはせいぜい半角のカナ文字だけです。
参考になる資料は、BASICのリファレンスマニュアルだけなので、ここの命令以外、文法もなにもわかりません。試行錯誤を重ねて最初に分かったのは、プログラムの読込み方でした。まず、プログラムの入っているカセットテープをセットして、
?LOAD
と入力します。5分ぐらい待たされ、画面に OK
と表示されると読込み完了です。(ああ、かったるい
^^;)
とりあえず、おまけのゲームを読み込んで、
私「おお、ゲームができる!」
と感動しました!この時、まさか、この出会いが私の人生を決めてしまうとは夢にも思いませんでした。
運命の出会いというのは、別の理由もあります。
私の父は、会社創立に貢献し、将来は社長候補とも言われた人材でした。ところが、椎間板ヘルニアという病気の為に、歩行が自由にできない体となってしまいました。従って、体を使う総務部長から頭脳労働が主なシステム部の部長に配転してました。結局、社長になることはできませんでしが、その代わりと言っては何ですが、私はパソコンと出会う事ができて、現在の職業につくことができたのです。それまでは、運動も勉強もあまりとりえの無かった私が、現在こうして仕事をできているのは、ひとえに父のおかげと言っても過言ではありません。
当時「パソコンを使うきっかけは、ゲーム」と言う人は結構いました。私も例外にもれずゲームが最初のきっかけでした。そういえば、現在も
Windows
にソリティアなどのゲームが付いてきますが、あのゲームは、マイクロソフトの新入社員がマウス操作に慣れるために作られたという噂があります。(真偽のほどは不明
^^;)。
最初に、私はPC8001に付属のテープに入っていたゲームを遊んでいましたが、あまり面白いゲームが無かったので、雑誌を買ってきて雑誌に掲載されているゲームを打ち込む(雑誌に書かれているゲームのコーディング見て、自分で同じコーディングを入力する事)ことにしました。今みたいに、付録のCD−ROMは無かったのでとんでもない苦労をしてました。
ゲームを打ち込んでも、そのままでは動きません当然、入力ミスによるバグ(プログラムの間違い)があるんです。これを丹念に探して、修正して、やっとプログラムが動くようになります。今思うと、これがとっても勉強になっていたようです。
ところで、当時のPC8001の編集機能には、入力しているプログラムの右端が欠けてしまうという、重大なバグがありました。なんとNECは、このバグを2年近くも修正せずにいました。2年後に修正されたROMができた時も有償で、何と5000円もとられました。今では、考えられない対応です(もう、時効ですがね
^^;)。
雑誌のゲームは、最初 BASIC
で書かれていたのですが、そのうちプログラムのスピードを早くするため、機械語でゲームが書かれるようになりました。機械語とは、文字どおり機械の判別できる言語のなので、全て16進数の数字で入力する必要があります。雑誌の見開きの頁いっぱいに16進数の数字がびっしりと書かれていました。入力するのは、もう地獄です(^^;
一つ数字を間違えるだけで、プログラムは動かなくなってしまいます。数字の数は、多い時で1万個以上もありました。「間違えるな!」と言うほうが無理です。
そのうち、機械語の入力も便利な方法が出てきました。チェックサムという方法です。チェックサムとは、データの数字16個を合計して16進数の1000で割った余りです。この値が雑誌に掲載されるようになりました。
丁度次のような感じです。
1000 | B5 | 89 | 94 | 4A | 4D | C6 | 04 | C3 | D1 | B6 | 0C | 6A | DD | CA | 60 | F6 | 8F0 | |
1010 | DF | 0E | F3 | 5D | 86 | C4 | 0E | 98 | 78 | 4C | 9F | A6 | 44 | 48 | D4 | D3 | 869 | |
1020 | 97 | FC | E9 | 3A | B2 | FB | 3E | 89 | 1B | 00 | AD | 04 | 93 | 1A | 1A | D3 | 88A | |
1030 | 49 | 0C | 4C | 62 | 4D | F3 | FB | 67 | 47 | 29 | 2A | A6 | 69 | 6A | B6 | 54 | 6C2 |
最初の4桁の数字が入力するアドレス、次の16個の数字がデータ、最後の3桁の数字がチェックサムです。データ入力後、チェックサムを計算するプルグラムを使って、自分の入力したデータのチェックサムを計算します。雑誌に書かれているチェックサムと同じならば、データが正しく入力されたという意味です。これで、ほぼ99.9%のプログラムは正しく動くようになりました。
アスキーと聞けば、業界の人は文字コードの規格か雑誌を思い出すと思いますが、私の場合はやっぱり雑誌の方ですね(^^
当時の数少ないパソコン雑誌の中でトップでしたので、私も毎回楽しみにしていました。
そんな中でもゲームの投稿には毎回目を光らしていたのですが、なんと、私の父も同様に目を光らしていました。といっても、私はゲームを使う方で、父は、ゲームを作るほうに熱中していました。なんと、努力の甲斐があって、とうとうアスキーに父の作成したソフトが掲載されました。
その名は「コイコイ」というゲームです。
「コイコイ」とは、いわゆる花札ゲームで、画面に四角い枠で札を表示し、その札の中にカタカナで「マツ」とか「キリ」とかを書いていました。丁度こんな感じです。
|
今のように、美しいグラフィックは無かったのですが、なかなか楽しめました。(数ヶ月後に、他の人によりグラフィックス版も発売されました。)
さらにアスキーから1本3000円のテープで「コイコイ」が発売されるようになりました。これが、結構売れたようです。父の所には印税で数ヶ月に一回、X万円の収入がありました。
やがて、私もゲーム作りに参加するのですが、これがなかなかできない(;_;
最初に作ったのは、トランプゲームでしたが、無計画に作るので、52枚のカードが画面に入らなかったり、カードが消えたり、得点がいつのまに画面からはみ出したりで、めちゃくちゃでした(^^;
一方、父は自分の趣味であるトランプの一人占いをアスキーに投稿し、またまた本に載る事になりました。「ゲームブック」という本に2本ほど掲載され、またもや、印税でウハウハです(^^;。
やはり、父は偉大だとなおさら痛感しました。
そんな父のやり方を見て判ったのは、コイコイもトランプゲームも、PC8001に付属していたサンプルゲームを参考にして作っていたようです。いわゆる、パクリという方法です。なるほど、どんな勉強もスポーツもまずは真似から入るものです。最近、パソコンの講習会でもよくやるのは、まず人の作ったプログラムを直して、どう動くかを勉強する方法があります。そうすると、他人のプログラムの良い点、悪い点が自然と学べるようです。
私もゲームが作れるようになったのは、その後、約6ヶ月ぐらいでしょうか?
最初の作品は
「ルーレットゲーム」です。このゲームは、忘れもしない志賀高原のスキー場のロッジに置いてあったゲームです。なんと100円を入れて当たると2倍から30倍のお金が返ってくるゲームです(いいのでしょうか
^^;)、当時、貧乏学生だった私がこのゲームに何万円も取られ、あまりの悔しさにゲームにしたというわけです(^^
ここは、ちょと専門知識がいるのでプログラムに興味の無い方は読み飛ばしてください(^^;
当時の Basic には、今の Basic
には無い色々な命令がありました。もっとも、今の Visual Basic
に追加された命令の方がはるかに多いですが(^^;
例えば、次のような命令がありました。
?Load、?Save
前にも書きましたが、カセットテープからの読込み、保存を行います。10Kぐらいのプログラムでも5分から10分もかかります。
BLoad、BSave
?Load、?Save と同様カセットテープからの読込み、保存を行いますが、機械語で作成されたプログラムの読込み、保存を行います。当時、機械語は全て16進の数字を入力していましたが、入力が終わったら、直ぐにこの命令で保存です。たまに BLoad と BSave を間違えて泣いたこともありました(;_;
List
文字どおり、入力したプログラムを表示する命令です。今のように、スクロールバーは無かったので、画面に必要なプログラムを表示しては、修正を行っていました。
RUN
作成したプログラムを実行する命令です。
TRON,TROFF
これは、映画の題名ではありません(^^、プログラムを修正するために、現在実行している行番号を表示・非表示にする命令です。TRON を行うと、以後実行されたプログラムの行番号が画面いっぱいに表示されます。丁度こんな感じです。
|
今は、シングルステップとかブレークポイントなんかあって便利ですね(^^
PEEK、POKE
指定したメモリの番地のデータを読み書きする命令です。この命令を使って、PC8001のハードのメモリを直接書き換えてしまうことができます。Windows の世界では絶対に許せないことが、当時はがんがんできました。
Data、Read
この命令は、VBから無くなってしまったのは非常に残念です。Data命令で書いたデータを、Read で読込めます。初期値を一度に設定するには便利でした。
10 FOR I = 0 TO 10
20 READ A(I)
30 NEXT
40 END
50 DATA 100,110,200,300,230
60 DATA 400,410,60012,1
こんな具合に使用します。VBでも、Array とか Choose で似たようなことができますが(参考: Tips の関数編)、Data と Read のほうがスマートだったような気がします。
ところで、当時の Basic にあった GOSUB という命令が、今でもVBで使用できるのを知っていますか?この命令は、Goto と同様に、関数内に定義したラベルにジャンプして、Retrun で戻ってくる命令です。次のように使います。
Private Sub Command1_Click()
Dim i%, j%
i = 1
j = 2
GoSub PR
i = 3
j = 4
GoSub PR
Exit Sub
PR:
Debug.Print i
Debug.Print j
Return
End Sub
また、行番号は今でも使えます。これを知っていれば、デバッグの時に便利です。というのも、Erl という変数は、エラーのあった行番号を返してくれるので、エラーの発生した場所を知るには便利です。特に、デバッグ時には発生しなくて、EXEにすると発生するような場合に有効です。
Private Sub Command2_Click()
Dim s As String
On Error GoTo Command1_Click_Err
120 s = "TEST"
110 s = Left(s, -1)
Exit Sub
Command1_Click_Err:
MsgBox "エラー:" & Err.Description & " エラー行:" & Erl
Exit Sub
End Sub
こう見えても(見えないか
^^;)、私は理科系の出身で、一応授業でコンピュータを勉強していました。と言っても、当時の大学の制度で、大学2年と3年の初めに「コンピュータ
WEEK」という2〜4週間の集中授業で勉強しました。内容としては、コンピュータの基礎から簡単な演習問題です。
記憶にあるカリキュラは次の通り。
・使用言語は大学2年はFORTRAN(*1)、大学3年はCOBOL(*2)
・流れ図(*3)の作成方法。
・2次元連立方程式の解(机上演習)
・2分検索による平方根の解(机上演習)
・実習
さて、問題は授業の内容より、最後の実習です。実習の手順は次のような方法です。
1.命題が与えられます。
2.流れ図を作成します。
3.指定の用紙にプログラムを記述します。
4.作成したプログラムをマークカードに鉛筆で入力します。
5.コンピュータのあるマシンルームに並びます。
6.満足行く結果が出るまで、マークカードでプログラムを修正します。
最大の難関は、4.のマークカードの入力で。マークカード上部の5ミリぐらいの隙間に、まず鉛筆でプログラムを書きます。平均して、約1100枚ぐらいのカードにプログラムを書いたら、次に、対応するカードの欄を鉛筆で塗りつぶすのです。これが、地獄です(^^;。まず、間違いなく指は痛くなるし、カードを落としたら、並べ直すのに一苦労です(^^;。おまけに、プログラムをコンパイル(*4)できるのは1時間に一回です。というのも、1クラス約50人が1台のコンピュータを使っているのでどうしても一人当たりの利用時間が短くなってしまいます。従って、1つエラーがあっても、マシンルームに並ぶため、1時間待つ必要があります。
そこで登場したのが、PC8001です。PC8001の使用できる言語は
BASIC という言語でしたが、この言語が演習で使用していた
FORTRAN 言語に似ているのです(ラッキー
^^)。私は、まず演習のプログラムをPC8001で作成して間違いがないことを確認してから、マークカードに書くことにしました。そのおかげで、エラーが少なくなって、マシンルームに並ぶ時間も節約することができたのです。
はっきり言って、勉強したことは、授業よりPC8001の方が多かったようです。
今では、大学もPCを大量に購入して、昔のような不便は無くなったようですね。ただ、あまりにも安易にプログラムが組めるようになったので、近頃の若い者にも、もっと慎重にプログラム作成してもらいたいものです(急におやじになりましたが
^^)。
あと、当時大学には、EDP研究クラブというコンピュータのお勉強クラブがありましたが、私は参加していませんでした。なぜなら、私はラグビー部で、ばりばりの体育会でしたので、お勉強なんかの時間はありませんでした。今思うと、プログラマーに必要な体力を鍛えていたようです。勉強ならば、社会人になってからで充分ですよ(^^
(*1)科学技術計算等に便利な言語
(*2)事務計算等に便利な言語
(*3)プログラムの動きを図示する方法
(*4)コンピュータがプログラムのミスをチェックしたり、言語で作成したプログラムをコンピュータにわかる数字に置換えること。
今では、アセンブラのプログラムを作成する人は、少なくなりましたが、当時のパソコンで使用できる言語は Basic の次が、アセンブラでした。ご存知の方も多いと思いますが、アセンブラとはコンピュータの理解できる機械語と1対1の命令を持つ言語です。アセンブラには Basic のように、文字型とか浮動小数を持つ変数なんかありません。あるのは、レジスタという名前もサイズも変更できない固定数の変数です(厳密に言うとちょっと違いますが ^^;)。
Z80のレジスタ |
名前 | 長さ(bit) |
用途 |
A | 8 | アキュームレータという、主に演算用のレジスタ。 |
BC | 16 | 汎用レジスタ。BとCを8bit づつ別々に使うこともできる。 |
DE | 16 | 汎用レジスタ。DとEを8bit づつ別々に使うこともできる。 |
HL | 16 | 汎用レジスタ。HとLを8bit づつ別々に使うこともできる。このレジスタを使った特殊な命令がある。 |
IX | 16 | インデックスレジスタその1、主にアドレスの基底アドレスに使用される。 |
IY | 16 | インデックスレジスタその2、主にアドレスの基底アドレスに使用される。 |
F | 8 | フラグレジスタ。計算結果や演算結果の状態が保存される。 |
また、標準関数もなければ、関数も作れない、ましてや便利なコンポーネントなんかありません。ただただ、命令を並べて、面倒なプログラムを地道に作成しなければなりません。PC8001には、Z80というCPUが使われていたので、アセンブラはZ80の命令を使います。
Z80 の主な命令 |
命令 |
用途 |
LD | レジスタまたはアドレスに値を代入する。 |
ADD | 足し算命令。INC という命令で1足すこともできる。 |
SUB | 引き算命令。DECという命令で1引くこともできる。 |
AND | レジスタ間やメモリの値の論理積。 |
OR | レジスタ間やメモリの値の論理和。 |
JP | 指定されたアドレスにジャンプ。演算結果によるジャンプ命令もある。 |
PUSH | レジスタの値を一時退避。 |
POP | 退避した値を戻す。 |
IN | 入力命令。 |
OUT | 出力命令。 |
そんなアセンブラですが、魅力はなんといってもスピードです。前の章で、円周率の計算に4時間もかかった話をしましたが、アセンブラなら10分もかかりません。30倍のもスピードアップができるのです。
余談ですが、このZ80は、現在はゲームボーイのCPUとしても使われているので、今でも現役のCPUです。今のアセンブラは、多少進んでいて、人間にわかる言葉で書くと、機械語に翻訳するソフトがありますが、当時はこの作業を人間が行う必要がありました。
例えば、次のようにまず、人間にわかる言葉でプログラムを書きます。
ADDSUB: | LD | A , 0 | ; A に 0 を代入 |
LD | C , 10 | ; C に 10 を代入 | |
LOOP: | ADD | A , 10 | ; A に 10 を足す |
DEC | C | ; C から 1 を引く | |
JP | NZ , LOOP | ; Cが0で無ければ、LOOPにジャンプ | |
RET | ; 呼んだ場所に戻る |
そして、Z80の命令と機械語の対応表を見ながら、次のような機械語を手で書きます。
3E | 00 | ADDSUB: | LD | A , 0 | ; A に 0 を代入 | |
0E | 0A | LD | C , 10 | ; C に 10 を代入 | ||
C6 | 0A | LOOP: | ADD | A , 10 | ; A に 10 を足す | |
0D | DEC | C | ; C から 1 を引く | |||
C2 | 08 | 80 | JP | NZ , LOOP | ; Cが0で無ければ、LOOPにジャンプ | |
C9 | RET | ; 呼んだ場所に戻る |
最後にこの 3E、00、0E、0A、C6、0A、0D、C2、08、80、C9
という数字を、PC8001に入力します。この例では、約10個の数字ですが、実際には数百の数字を入力する必要があります。
どうです。面倒でしょう(^^;
さらに、これでプログラムが正しく動く保証はありません。プログラムは間違う可能性があります。特に、命令が足りなかった時がたいへんです。うっかりすると、翻訳をしなおすか。入力をやりなおす必要があります。
でも、必殺の技があります。それは、パッチという方法で、挿入したい場所の命令をつぶして、プログラムのジャンプ命令を入れます。ジャンプ先で、つぶした命令と、挿入したい命令を入れて、元の場所に戻るジャンプ命令を書きます。
これも、慣れてくると命令の機械語を覚えてしまうので、直接、機械語を入力してパッチすることができます。
プロフェショナルでしょう(^^
余談ですが、その昔、真空管の大型コンピュータがあった時代には、真空管の光を見て、プログラムが解読できる人がいたという噂があります。
その後、翻訳は相変わらず手作業でしたが、入力したプログラムを逆に人間にわかる言葉にする、逆アセンブラというツールができたので、正しく入力できたかどうかの確認は楽になりました。
そうそう、当時私は、LIFE
GAMEというシュミレーションゲームを Basic
作成しましたが、あまりに遅いのでアセンブラに作り直しました。なんと5分かかっていた処理が1秒になったのを覚えています。その時の感動は忘れません。感動して、朝まで画面を眺めていました(^^
つづく