MC68000 Maniacs!
OLD GAME(MD,DC,etc)と OLD PC(SE/30,X68K,etc)関連の情報を中心に発信しています。
MC68000 Maniacs! FunnyPlace Channel Vintage Computer LLC
 



突然思い立って「N60-BASIC」なんぞを弄りはじめてみました。学生の頃までは日常的に接していたプログラム言語だったので,言語仕様はだいたい記憶済み。「ベーマガ」から他人のテクニックを盗みつつ,ゲームプログラムや音楽プログラムをいっぱい作っていた記憶があります。「PC-6001mkII」の実機はすでに手元にありませんし,当時作成したプログラムを保存したカセットテープも10年以上前に全て廃棄してしまったので,現在は「何も残っていない」状態なのですが,エミュレータ「PC6001VW」の動作環境を保存してあったので,プログラミングはエミュレータ上で実施しています。エミュレータの起動も2008年の「ベルーガ」以来だったのでバージョンが古いまま(笑)。とりあえず最新の「307a2」にアップデートしておきました。

「N60-BASIC」は覚えているんだけど,細かいプログラムテクニックを結構忘れていますね。特にカーソルキー入力を読み込むルーチンをすっかり忘れていて,ツイッターにて救援を求めたところ,複数の有志の方に助けて頂きました。ありがとうございます。STICK関数を使えば簡単なんですが,当時は「特定アドレスをEXECした後,PEEKで入力値を拾う」方法を好んで使っていました。何故そうしたのかは覚えていません。たしか・・・STICK関数よりはほんの少しレスポンスが良かったからだったと思います。色々と思い出しながら組んだテストプログラムは以下のとおり。

【PC-6001テストプログラム】

10 CLEAR:SCREEN1,1,1:CONSOLE0,16,0,0:CLS
20 MX=4:MY=10:M$="O":S$="**":SC=0:SC$="":RO=1:RO$=""
30 LOCATE 0,0:PRINT "SCORE:00000000";
40 LOCATE 0,1:PRINT " LIFE:*****";
50 RO$=RIGHT$("0"+MID$(STR$(RO),2,LEN(STR$(RO))),2)
60 LOCATE 0,12:PRINT "ROUND:"+RO$;
100 LOCATE 0,11:PRINT "-------------------------------";
110 LOCATE MX,MY:PRINT M$;
120 EXEC &H1061:ST=PEEK(&HFECA)
130 IF ST=128 THEN GOSUB 300
140 LOCATE MX,MY:PRINT " ";
150 MX=MX+(ST=32)-(ST=16)
160 MX=MX-(MX<0)+(MX>30)
180 GOTO 110
300 REM *** ATTACK
310 FOR I=MX+1 TO 29
320 LOCATE I,MY:PRINT S$;
330 LOCATE I,MY:PRINT " ";
340 NEXT I
350 LOCATE I,MY:PRINT " ";
360 SC=SC+(INT(RND(1)*9)+1)*10
370 SC$=RIGHT$("0000000"+MID$(STR$(SC),2,LEN(STR$(SC))),8)
380 LOCATE 6,0:PRINT SC$;
390 RETURN

当時,ザナドゥのボス戦のようなゲームを目指して,サイドビューのアクションゲームを作ろうなどど,無茶を考えていました。上記のテストプログラムは,自キャラの左右移動と攻撃のルーチンを簡単に書いてみたものです。当時のプログラムも同じような組み方をしていたハズですが,細かいことはさすがに覚えていません。前述のカーソルキー読み込みの部分は,行番号110~180の個所にあたります。

110 LOCATE MX,MY:PRINT M$;
120 EXEC &H1061:ST=PEEK(&HFECA)
130 IF ST=128 THEN GOSUB 300
140 LOCATE MX,MY:PRINT " ";
150 MX=MX+(ST=32)-(ST=16)
160 MX=MX-(MX<0)+(MX>30)
180 GOTO 110

変数「ST」に帰ってくる値でキー入力を判定します。カーソルキーの上が「4」,下が「8」,右が「16」,左が「32」です。スペースキーは「128」が返されます。複数キーを同時に入力すると其々の値が「合算」されて返されます。「こんにちはマイコン」の「スカッシュゲーム」では,INKEY$を使っていた関係上,キーを押しっぱなしにするとキーバッファに入力が溜まってしまい,一時的に入力を受け付けなくなったりしていましたが,EXEC&H1058で強制的にキーバッファをクリアして回避していました。上記の方法においては,キーを押しっぱなしにしても入力を受け付けなくなるような事象は起きません。自キャラの移動ルーチンを論理演算式で記述するのはベーマガのお約束です。

行番号360~380がスコア表示のルーチン。右詰め表示で空白は「0」で埋めるような感じですね。
数値をSTR$で文字変換すると先頭1バイトに空白が入っちゃうので,それを除去するのがポイントです。
もっと簡単な方法がありそうですが,当時はこんなやり方をしていたと思います。

360 SC=SC+(INT(RND(1)*9)+1)*10
370 SC$=RIGHT$("0000000"+MID$(STR$(SC),2,LEN(STR$(SC))),8)
380 LOCATE 6,0:PRINT SC$;

たまにプログラミングしてみると楽しいですね。(≧∇≦)
現在,敵キャラを動かすルーチンをどう組んでいたか,ひたすら思い出し中(笑)。
移動パターンをDATA化して配列に読み込んでいた・・・ような気がします。


【関連リンク】

 ・Burnout. ・・・ PC6001VW の公式Webページ


コメント ( 2 ) | Trackback ( 0 )