はじめに
以前からサポーター会員の形でゲーム保存協会に協力していましたが、理事長さまからの強い要望により :) 昨年から正会員に加わりました UME-3 と申します。
今回、私の方にもパソコンミニの記事を書くよう仰せつかりまして、筆を取らせていただくことになりました。
私が主に興味のあるパソコンミニの技術的な話は、ウルサイ人(笑)がこれ以上ないくらいすばらしく濃い記事を既に書かれています。
他のいろいろな記事では、パソコンミニの紹介や使い方、内蔵ゲームソフトのレビューなどの記事が多いようです。
もちろんそれはそれでよいのですが、パソコンであればプログラミングも大きな楽しみ方の一つではないでしょうか。
パソコン黎明期には、ソフトというのは自分で作るものでした。マイコンBASICマガジンなどを参考に、ぽちぽちとBASICプログラムを作った経験のある方も多いことと思います。
内蔵のゲームやカセットテープから変換したゲームで遊ぶのもよいですが、せっかく電源ONですぐに使えるBASICがあることですし、ひとつなんか作って記事にしてみようか、と思い立ちました。
なお、私自身はPC-8801のN88-BASICやマシン語は扱っていますが、PC-8001のN-BASICを本格的に使うのは初めてです。
N-BASICでは画面クリアの命令がなくPRINT CHR$(12);で代用が必要とか、N88-BASICにはある便利な編集命令がないとか、変数は最初の2文字しか認識しないとかの制約はありますが、おおむね主要な命令はN-BASICにも実装されていましたので、慣れればそれほど困惑することもありませんでした。
ネタを考える
作ってみようと思いついても、まずはネタ出しが必要です。
さて何を作ろうか…と考えてみたわけですが、締め切りのある限られた時間内でアイデアをひねり出すというのはなかなか難しいものです。
少し考えた結果思いついたのが、学生の頃、つまらない授業の合間に:) ポケコン(PC-E500)のBASICで作ったワンキーゲームでした。
2000年頃までは定期的にポケコンの電池を交換してプログラムを維持していたのですが、それもやがて失われてしまい、当時のプログラムは現在は残っていません。
PC-E500用のデータレコーダやRS232Cのインターフェースは当時は持っておらず、バックアップも取れなかったのです。
しかしながら、当時作ったアイデアと、どうやって作ったかは今でもなんとなく覚えています。
それをベースに、ぽつぽつとプログラムを作り始めたのでした。
そのプログラムとはホームラン競争のゲーム。
単純に来たタマを打ち返すだけの単純なものですが、そこそこ丁寧に作ったこともあり、作り始めてから1週間くらいかかりました。
エミュレータやPC-8801実機などのN-BASICで作ってからパソコンミニに持ってくることもできるのですが、それだとパソコンミニの評価にならないので、製作はすべてパソコンミニ上で行いました。
まずはキャラクタパターン作りから
このゲームの元となったアイデアは、ノーマルキャラクタを連続でアニメーションぽく表示すれば、武骨なデザインでもそれっぽく見えるのではないか? という思いつきからです。
当時流行っていたス○2とかのキャラを、ポケコンの狭い画面で表示して、○どーけん とか ○ょーりゅーけん とか、雰囲気で動かしたりしていました。
というわけで最初にとりかかったのは、投球動作とバッティング動作のキャラクタパターン。
6つくらいのパターンを連続で表示するようにして、動きをチェックするところから始めました。
PC-E500の時は表示画面のサイズの関係で2×2で作った記憶がありますが、PC-8001だと画面が広く使えるので、40桁モードの3×3でデザインしています。
どんなもんかな。
キャラクタのパターンを作るには、できるだけ多くの種類の文字が使えた方がよいですが、ここで SHIFT + @, \, [, ] で入力する ~, |, {, }の各文字が入力できないことに気がつきました。
「バグじゃないのこれ」と思ったのですが、実はPC-8001初代やPC-8801のN-BASIC ver 1.2までは実機でもこれらの文字は入力できないのが仕様だそうで、後のPC-8001mkIIやPC-8801mkIIでは直接入力できるようになったのだそうです。なんと。
こんなところも後継機で地味に改良されたんですね。
直接入力できない文字は、
KEY 1,CHR$(&H7E)
などと、ファンクションキーに定義してから、F.1キーを押すことで入力するような小技もいまだになんとなく覚えています。
パソコンミニの公式のサポートサイトのキーボードレイアウトの説明は、2019/11/3現在では間違いがあるようです。
Insert,Delete,Home,End の各キーは実際にはINS,DEL,HOME,CLRとしては効きませんし、GRPHモード時のテンキー部の割り当てが、実際に入力されるキャラクタがWebの説明と違うようです。
101/106キーボードの説明ではUSBキーボードの刻印が表示されていないので、標準的なキーボード以外を使用している場合はどれがどのキーに相当するものなのか読み取れないのも困るところです。
USBキーボードとPC-8001で割り当てが違う特殊なキーについては、キーボードレイアウトの図に加えて、PC-8001とUSBキーボードのキー割り当ての対応表を掲載しておくと、より利便性が高まるのではないかと思います。
タマを投げて打つ
次に、スペースキーでタマを投げ、来た球を打ち返す部分を作ります。
ピッチャーとバッターを立たせて、ピッチャーがタマを投げ、バッターにスイングさせます。
燃えプ○のように「バントでホームラン」とかは実装として明らかにおかしいので、スイング開始からスペースキーをずっと押しっぱなしにしないと打球が飛ばないような仕組みもこの時に入れています。
ファ○スタでやるような、振り遅れを防ぐためにハーフスイング状態で構えても、やっぱり飛ばないようにしました。
簡単なゲームですし、ズルは許さんぜ。
スイングの動作が特定のパターンの時に当たるようにしていますが、このときのタマの位置で飛ぶ角度が変わるように仕込んでいます。
スイングを始めてから当たるまでに少しタイムラグがあることで、ゲームっぽくなった感じです。
タマを飛ばす
当たり判定をつけたら、次はタマを飛ばす動作です。
PC-8001のN-BASICにはテキスト画面を代用した160×100ドットのローレゾグラフィックがBASICの命令で手軽に使えます。
これは1つの文字キャラクタを 2×4 ドットのグラフィックパターンとして使うものなので、色をつけるのもこの1文字に相当する 2×4 の単位でしかできず、また色を変える回数も1行あたり最大20回までの制限があります。
後継のPC-8801のN88-BASICでは高精細なグラフィック画面がついたせいか、このようなローレゾグラフィックの命令はサポートされなくなってしまったのはちょっと残念ですね。
打ったタマの描画ですが、当時は理系の学生だったのでベクトルやら三角関数やらは普通に理解していたのですが、30年以上経過した昨今では「あれ、どうやって計算するんだっけ」と思い出すまで、頭の中の引き出しをひっかきまわす必要がありました。
結果的には大したことはやっていないんですが…。
また、単純に地平線だけで放物線を描くと、ゴルフみたいな感じになってしまうので、外野にフェンスをつけました。
が、このフェンスの当たり判定について、後にデバッグで苦労することになります。
最初はゲームとして、乱数の要素を入れずに純粋にテクニックだけで遊べるようにしたかったのですが、これだけ単純な動作だとタマを散らす要素が少なく、弾道がいつも決まったようなパターンになってしまいました。
そこで仕方なく乱数の要素を付け加えました。打球の初速と角度に色をつけることで、そこそこ弾道が散るようになったと思います。
その他の飾り
ゲームの本質と関係ありませんが、やっぱり体裁を整えるにはタイトル画面やらリザルト画面はあった方がいいかと思います。
手抜きですが、それっぽく実装しました。
N-BASICには行の色を反転するLINE命令があるのに気がついて、せっかくなので使ってみたり。
リプレイの確認のキーはY,y以外にもいろいろなキーが効くように、INSTR関数の小技を使ったりもしています。
ひたすら調整
タマを投げて打って、という基本的な動作ができるようになったところで、ここからはひたすら調整とデバッグです。
フェンスをつけたものの、フェンスの当たり判定がおかしくてタマがフェンスを突き抜けてしまったり、フェンスを越えたタマがおかしな動きをするようになったりしたので、その辺を地道に修正。
フェンスの位置や高さも変えられるようにして、最終的にフェンスは少し高めにしました。
横○スタジアムくらいの高さにはなったかな。フェンスの色を青にしたのもその影響です。
乱数の要素や初速等を調整して、なかなかホームランが出そうで出ない、くらいのいい感じになるようにしたつもりですが、どんなもんでしょうか。
このあたりはひたすらタマを投げて打って調整して、を繰り返していました。
キャラクタのパターンはもっといい表現ができないか、何度かいじっています。
なんとなくパターンの枚数も1枚増やして7枚にしてみたり。
いいアイデアが浮かばない時は、一晩ゆっくり寝るのがいいですね。
プロ生ちゃんの言うとおり、「プログラミングは心の整理整頓的な何か。」なのかもしれません。
ある程度満足したところで、完成とあい成りました。
つくってみて
というわけで、パソコンミニで1本プログラムを作ってみたわけですが、もろもろの所感など。
- パソコンミニでの全体的なN-BASICの動作速度は、実機と比べてやや遅く感じました。
これが意図的にそのように調整されたものなのか、エミュレータの動作の都合によるものなのか、ラズパイZEROの能力によるものかはちょっとわかりません。
が、調べたところによると、どうもPC-8001初代とPC-8001mkII以降でも動作速度は異なるようで、処理によってPC-8001初代の方が遅かったり、PC-8001mkII以降の方が遅いケースなどもあるようです。パソコンミニではPC-8001初代に合わせて調整されているのかもしれません。
- キーを押しっぱなしにしたときのキーリピートが効いたり効かなかったりするようです。
パソコンミニではPC-8001には本来存在しない←や↓のキーを押した場合、利便性を考慮してエミュレータが内部的にそれぞれSHIFT+→、↓のキーが押されたように変換しているようです。
このためファンクションキーを表示している状態(CONSOLE ,,1)ではファンクションキー表示が一瞬反転します。ここまではマニュアルにも記載があります。
ですが、キーリピートの不具合(?)か、キーを押しても表示が反転するだけでカーソルが移動しなかったり、SHIFTが判定されずに逆方向へカーソルが動きだすことがしばしばありました。
どうもキーを取りこぼしているような反応に見えます。ファンクションキー表示がされている状態では特に顕著です。
ファンクションキー表示を消す(CONSOLE,,0)ことで軽減できますし、表示のちらつきもなくなりますので、プログラムを行なうにはこちらの方がよいかもしれません。
キーリピート関連ではもう一つ、バッティングの際にSPACEキーの入力に当初INKEY$で検出しようと思って実装したところ、キーリピートが効かず1回分の入力にしかならなかったので、これもエミュレータの不具合かなと思ったのですが…
こちらはまた別で、実はここにもN-BASICの仕様が隠されていました。
(N-BASICはN88-BASICと似ているようでところどころ違うのでつまづきますね…)
実はN-BASICではINKEY$でキーリピートが効かないのは仕様だそうです。なんと。
N88-BASICや、他の機種でもINKEY$はキーリピートの効く機種が多かったので、びっくりしました。
今回のゲームではINKEY$の代わりにINP関数でキーボードI/Oを直接読むようにしましたが、これは正しい対応だったということになります。
なお、INKEY$の代わりにINPUT$(1)を使ってもキーリピートは効くそうです。
- プログラムのセーブはCMTファイルへのセーブのほかにステートセーブが使えるのは非常に便利です。
テープイメージからCLOADしなくても、前回の続きからプログラミングができます。
気をつけるべきは、ロードしようとしたにも関らずうっかりセーブを選択して上書きしてしまったりすること。またその逆もありえます。
これは作成中本当に注意して操作していました。もし実際にやらかした場合、ロードしようとしてセーブした場合はせっかく作ったプログラムがきれいさっぱり空の内容で上書きされてしまいますし、逆にセーブしようと思ってロードした場合はせっかく修正したプログラムが修正前の状態に戻ってしまいます。
プログラム作成中はステートセーブだけに頼らず、バックアップの意味でもCMTイメージへのセーブを併用するようにしていました。
不具合については私が使ってみた時点(初期版)ではこのような現象があった、というだけことですので、今後のバージョンアップなどで解消されるかもしれません。
期待したいところですね。
パソコンミニは、当時のBASICがメーカーに公式に認められている環境として使用できる点でも貴重なものだと思います。
今更40年前のBASIC? なんて声も聞こえてきそうですが、手軽に扱えますし、アイデア次第で「おおっ」というものも作れるかもしれません。
楽しいゲームのプレイの合間に、たまにはものづくりの楽しさに触れてみるというのはいかがでしょうか。
ゲーム保存協会 UME-3
【おまけの付録】プログラムリスト
UME-3さんのご厚意により、今回の製作したプログラムリストとCMTファイルを公開いたします。
宜しければこちらのデータを使って皆さんも遊んでみてくださいね。
▼ダウンロードはこちら
シフトJISだとグラフィックキャラクタが文字化