SSブログ

認めたくないものだな、自らの若さゆえの過ちと言うものを… [雑記]

思い返してみると、初めてパソコンに打ち込んで走らせてみたプログラムは、「RAM」という雑誌に載っていたゲームだ。(名前は忘れました^^;)

学校帰りに友人達と立ち寄った書店で、目に留まったのがパソコン雑誌の表紙に書かれた「ガンダムゲーム」の文字。
普通なら真っ先に「I/O」を手に取るところなのだが、そばにあった「RAM」の方へ目が行ってしまい、「ガンダム」に惹かれて購入してしまった。

初めて購入したパソコン雑誌は「I/O」だった。(詳細は「思い起こせば…」へどうぞ)
その時も「ルービックキューブ」の文字に釣られて買ったのだが、この時も前年に放送していた「ガンダム」という文字についつい吸い寄せられてしまったのだ。




「ガンダム」それは、数ヶ月前に Y 君が休み時間に M 君と話していた「昨日見たアニメ」。
「今までのアニメと違って、単純な勧善懲悪じゃない」
「敵役のシャアがカッコイイ」
…そんな言葉に薦められて見るようになったのだが、放送が進むにつれドップリとはまり込んでしまった。




「ガンダム」に惹かれて購入してしまったものの、もちろんウチでカタカタと入力できる環境も無く、まだ友人達もパソコンを持っていなかったので、何が書かれているのか分からない BASIC のプログラムリストをぼんやりと眺めているだけの日々が続いた。

ある週末の土曜日、友人が「明日、寺町へいかへんか?」と言うので、先日買った「RAM」をもって行き、店頭で打ち込んで遊んでみようという話になった。

当時、京都・寺町の電気店街にもマイコンブームの影響で「マイコンコーナー」を設ける店が増えつつあり、「ヒエン堂」や「ニノミヤ無線」等はオーディオコーナーやパーツコーナーを削るような形でマイコンのコーナーを設置していた。

日曜の午前中に友人の家へ集合し、三人でバスに乗り四条河原町へと向かう。
新京極のファストフード店で昼食を済ませ、寺町の「ニノミヤ無線」へ足を速めた。

2Fのマイコンコーナーへ上がると、休日だというのに人影はまばらで、お目当ての「PC-8001」は電源を入れられてから誰も触れていないらしく「NEC PC-8001 BASIC Version 1.0」という起動ロゴを表示したままの状態で鎮座していた。

早速カバンから「RAM」を取り出し、三人がかりで打ち込み始めたのだが、まだ三人ともキーボードの使い方がよく分かっていなかった。
SHIFTキーを押せば大文字が打てることぐらいは一度経験すれば分かるのだが、「"」や「$」等の記号の打ち方はおろか、アルファベットやカナの位置さえ分からず、「'V' はどこ?」「'O' はどこ?」と、ひたすら文字探しを繰り返す羽目になってしまった。

たかだか2ページ弱の BASIC のリストを打ち込むのに二時間以上を費やし、やっと打ち込み終わったものの、三人の頭の中には「LOAD」「SAVE」という概念さえなく、プログラムが動いている状態が早く見たい一心で「f・5」キーを押してみることにした。

画面がクリアされ、左端に文字が表示され始めたところで、「ピー」。
エラーメッセージが表示され停止する。

「'Syntax error' ってなんや?」
「たしか、'Syntax' は文法って意味やぞ」
一番頭の良い Y 君がさらりと言う。

「文法って英語の文法か?」
「コンピュータと文法がどう関係するんや?」
三人の頭の中は?マークが飛び回っていた。

「ここに 'in 140' って書いてあるから、140 のところが間違ってるってこととちゃうか?」
「…そうか」
「そんなら、140 のところ読んでみて」
「140 W、I、D、T、H」
「あっ、'I' が '1' になってた」

f・5キー押下&審判の瞬間…「ピー」

「今度はなんや?」
「'Illegal function call' なんて読むんや?」
「分からんけど、'function' は関数って意味や」
またまた Y 君がさらりと言う。

「今度は関数?、さっきは文法?」
「コンピュータやるには、数学と英語の知識がいるんか?」
「そういえば '#' もあったなぁ」
論理的思考に長けた M 君の頭の中は?マークだけでなく、数学記号や音楽記号までもが飛び回っていたに違いない。


そんなこんなで40分ほど悪戦苦闘したが、結局まともに動かすことはできず、三人は栄養を使い果たした脳ミソのまま家路に着いたのである。

これが私の初めてのプログラミング体験です。




もう、あれから30年程の月日が流れましたが、当時は「ガンダム」が大ヒットするとは夢にも思わず、ましてパソコン等の情報機器が生活必需品となる日が来るなんて、夢のまた夢…。
良い時代になったものだと、つくづく感じながら昔を思い出してみました。

追記
映画「機動戦士ガンダムII 哀・戦士編」の主題歌の作編曲を手がけられた井上大輔氏が亡くなられて早10年。
今日は命日なので残りの時間を「哀・戦士」を聞きながら過ごすことにします。 合掌...

タグ:雑誌 RAM PC-8001

デバッグ用ユーティリティ [雑記]

5インチフロッピーを整理してたら DUAD-88 のソースファイルが入ったのフロッピーが見つかったのですが、当時作っていたユーティリティのソースの最新版だけが行方不明でした。
満杯になったから別のディスクにセーブしたんだろうか…。

TRON コマンドのあまりの無能さに「もう少しまともなモノが欲しい」と思って作っていたデバッグユーティリティなのですが…。


仕様は、

書式:ON CMD GOSUB …
機能:コマンド毎の割り込みルーチンの開始行を定義する


書式:CMD ON / OFF / STOP
機能:コマンド毎の割り込みの許可/禁止/停止を設定する


…と、これだけです(笑)

どういう具合に使用するかと言えば、プログラム内のデバグしたい部分の最初に 'CMD ON' を、終端に 'CMD OFF' を書いておくだけです。

まぁ、コマンドリファレンスだけだと分かりにくいので、プログラムでの使用例を載せておきます。
'
' ON CMD GOSUB sample #1
'
DEFINT A-Z
ON CMD GOSUB *TRAP
    |
MAX=1000
DIM A(MAX)
    |
なんたら
かんたら
    |
' Bubble sort
*BUBLESORT
  FOR I=1 TO MAX-1
    FOR J=2 TO 1000 - I + 1
      IF A[J] < A [J - 1] THEN CMD ON:SWAP A[J], A[J - 1]:CMD OFF
    NEXT
  NEXT
RETURN
    |
*TRAP
  PRINT USING "Swap ####:##### <-> ####:#####"; J-1, A[J-1], J, A[J]
RETURN
    |
END:RUN


これを実行すると、

Swap  916:15628 <-> 115:12832
Swap  629:29847 <-> 590:28359
Swap  182:21759 <-> 308:13172

(テキトーだな^^;)

という具合に、出力されます。


また、別の使い方としては、

'
' ON CMD GOSUB sample #2
'
DEFINT A-Z
DEF FNLN=PEEK(&HE656)*256+PEEK(&HE656) ' 実行中の行番号
ON CMD GOSUB *TRAP
    |
CMD ON
    |
なんたら
かんたら
    |
CMD OFF
    |
*TRAP
  PRINT USING "#####:X=###, Y=###";FNLN, X, Y
RETURN
    |
END:RUN


これを実行すると、
10000:X=240, Y=100
10000:X=240, Y=100
10000:X=240, Y=100
10010:X=240, Y=100
10010:X=240, Y=200
10020:X=240, Y=200
10020:X=240, Y=200
10030:X=240, Y=200
10040:X=240, Y=200

という具合に、どこで変数の内容が変更されているかが分かりやすくなります。




昔、これを作っていた時、KCB メンバーの S 氏に見せたら、「これ、おもしろいから ASCII に投稿したら…」と言われたのですが、「使い方説明の原稿を書くのが面倒くさいなぁ」と、ボツにしたんだよなぁ。

今だったら、丸1日あれば完成しちゃうんだけどな。
PC-8801 用なのですが、誰か使います?(笑)

タグ:PC-8801

新プロダクト進行中 [近況報告]

前回、アセンブラのバグのせいで苦労している話を書きましたが、バグを回避するために試行錯誤している中で新たなプランを思いつきました。


元々は、機種毎に Dash-80 / Dash-80mk2 / Dash-80SR / Dash-88… と、複数のプロダクトを開発しようと計画していました。 しかし、機種毎のバージョン管理が煩雑になる事と、アセンブラのバグのせいで開発が思うように進まない事から、「Dash-80 補完計画」で書いたように、一旦ディスク版の開発を停止して ROM 版の開発に移行しようと決意しました。




ところが、ROM 版作成のためにヘッダーファイルを書き直していた時に、あるアイディアが…
「おっ、これなら複数のプロダクトを管理しなくても良いじゃん!」
急遽ディスク版の IPL を作ってみると…うまく動いてる!!!

という訳で ROM 版の製作は後回しにして、先にワンプロダクトで複数の機種に対応できる「Dash-8X(仮称)」(どこかのエミュレータでも似たようなネーミングのモノがありましたが^^;)を製作することに決めました。
方針がころころ変わってスミマセンm(_~_)m
なぜこのアイディアを早く思いつかなかったんだろ…反省。

NEC の PC-8001 / PC-8801 シリーズ(PC-88VA シリーズに関しては未定)で「Dash-8X」をドライブに挿入して起動すれば、「Dash-80」と同じ機能がどの機種でも使用できる…。
これが実現すれば、みんなハッピーになれる…かもね^^




Dash の機能は、ほとんどの部分がインテリジェント型のディスクシステム側で動いてます。
PC-8001 / PC-8801 シリーズを通じてディスクシステムは、後期に 2HD がサポートされたことを除いては幸いなことにほとんど変更されていません。
そのため、ディスクシステム側がメインとなるような DOS システムを作成すれば、機種毎の差異を吸収する部分を用意するだけで、PC-8001 でも PC-8801 でも PC-8001mk2SR 動いてしまうのです。
まあ、本体側ルーチンは Dash システムの BIOS みたいなものですね。

ディスクシステム側に DOS の機能の大半を置いてしまう方法のもうひとつの利点は、BIOS 部分さえ用意すれば Disk-BASIC 下位互換の「Dash-80」に限らず、様々な DOS が一度に複数の機種に対応できるという事です。
まあ、そんなシステムを新たに構築しようなんて奇特な方はおられないでしょうが。




BIOS 部分の役割は BASIC の命令文を解析してディスクシステム側へリクエストを送る機能と、ディスクシステム側から送られてきたコマンドに従ってメッセージの表示やデータの転送を行う機能だけと言っても過言ではありません。
極端なことを言えば、PC-8001 / PC-8801 シリーズ用のインテリジェント型のディスクシステムを繋げる事ができるなら、どんな機種でも対応可能なはずです。

Z80 以外の CPU を使用している機種だと BIOS 部分を新たに書き起こさないといけませんがね(笑)

開発の 悩みの種は アセンブラ [雑記]

PC-8001 や PC-8801 のユーティリティ開発に利用している、ドイツ製の某アセンブラ。

フリーソフトなので無料で使えて、しかも様々な古い CPU に対応しているので、Dash-80 の開発にも使用していますが、 難点はマニュアルが分かりにくい事。

アセンブラ擬似命令の書式を確認するために、ソースコードを書いては直し、書いては直し…。
ちゃんと使えるようになるにはずいぶん時間が掛かりましたが、機能的には申し分ないです。




通常、アセンブラやコンパイラには、ソースコードを書き換えなくても条件を変えてアセンブル/コンパイルできるように、コマンドラインでシンボルを定義したり値を設定できるオプションが設けられています。

しかし、このアセンブラでは、そのオプションがうまく働かないという致命的な欠点を発見。

これまではひとつの機種だけしか対応していなかったので条件アセンブルをする必要はなかったのですが、今回は寄り道をして Dash-80 を PC-8001mkII と PC-8001mkIISR に移植しようと試みているので、これが正常動作しないのは非常に痛い…。

マニュアルどおりに、'-D' オプションに複数のシンボルを設定しようとして makefile に "-D $(MACHINE),$(DBG)" と書くと "invalid option: -D" なんてエラーになるし、値を設定しようと "-D MACHINE=$(MCODE)" と書くと、またもや "invalid option: -D"。

初登場から10年も経つのに、まだこんなバグがあるのかい!
しかし、他に"使える”アセンブラが無いのが実情… OTL




頭にきたので、ソースファイルを改造しようと DL してみたら、あらら… Pascalian なのね。
C のソースなのにパスカル風の書式と関数の使い方… OTL


ソースが汚くなるのは嫌なんですが、うまくバグを回避して使うしかないですね。

…って、なぜ世の中には「フリーの使える Z80 用アセンブラ」が無いんだぁ?

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。