PC-6000,6600情報誌 SAVE第27号特別版

  季節もすっかり秋になってしまいました。だんだんと寒くなっていきます。
こういう時期は風邪が流行るものです。風邪には気をつけましょう。

 <バグ情報>

 26号に誤りがありました。お詫びして、訂正いたします。

◆ビデオゲームのプログラミング 中、「ガンのCPU」「ガンのROM容
量」等の「ガン」は「が、こ」の間違いです。

◆MUSICランダムコーナー 中、
30 if peek(&hfd1b)<>0 then 30
  網掛け部分を訂正して下さい。

 以上、大変ご迷惑をおかけしました。(編集担当)

 <MUSICランダムコーナー>

 19号に載せました音楽演奏ルーチンプログラムの動かし方がわからない
という方がいますので今回はこれを使えるようにします。
 まず19号のプログラムを入力します。これだけでは音楽データや音符デ
ータが入っていません。音符データについて説明します。音符データといっ
ても音データなのですが、このデータはDPLAYというルーチン名に入っ
ています。(プログラムではD700H)ここに書き込むわけですが、AX
−7ポリス&ギャングでは次のようになっています。(16進数)
音番号  アドレス   データ   PLAY文データに近い音
 01    D702,3       F5,02           O3E
 02      D704,5       D3,02           O3F
 03      D706,7       7C,02           O3G
 04      D708,9       35,02           O3A
 05      D70A,B       FC,01           O3B
 06      D70C,D       DA,01           O4C
 07      D70E,F       AA,01           O4D
 08      D710,1       7D,01           O4E
 09      D712,3       67,01           O4F
 0A      D714,5       3C,01           O4G
 0B      D716,7       1C,01           O4A
 0C      D718,9       00,01           O4B
 0D      D71A,B       EF,00           O5C
 0E      D71C,D       D5,00           O5D
音番号  アドレス   データ   PLAY文データに近い音
 0F      D71E,F       BE,00           O5E
 10      D720,1       B2,00           O5F
 11      D722,3       A0,00           O5G
 12      D724,5       8F,00           O5A
 13      D726,7       7E,00           O5B
 14      D728,9       78,00           O6C
 15      D72A,B       2D,01           O4G#
 16      D72C,D       15,02           O3A#
 17      D72E,F       0D,01           O4A#
 18      D730,1       55,01           O4F#
 19      D732,3       C7,00           O5D#

 以上のようになっていますが、音符データを増やしたい時は、アドレスを
変えてデータを増やすとよいでしょう。データについては表1・2を参考に
して下さい。

                【表1】
ョ「ホ「「「ホ「「「ホ「「「ホ「「「ホ「「「ホ「「「イ    
、O、  C  、 C# 、  D  、 D# 、  E  、  F  、    
セ「゙「「「゙「「「゙「「「゙「「「゙「「「゙「「「ニ    
、1、E8,0E 、12,0E 、48,0D 、89,0C 、D5,0B 、2B,0B 、    
セ「゙「「「゙「「「゙「「「゙「「「゙「「「゙「「「ニ    
、2、74,07 、09,07 、A4,06 、45,06 、EB,05 、96,05 、    
セ「゙「「「゙「「「゙「「「゙「「「゙「「「゙「「「ニ    
、3、BA,03 、85,03 、52,03 、22,03 、F5,02 、CB,02 、    
セ「゙「「「゙「「「゙「「「゙「「「゙「「「゙「「「ニ    
、4、DD,01 、C2,01 、A9,01 、91,01 、7B,01 、65,01 、    
セ「゙「「「゙「「「゙「「「゙「「「゙「「「゙「「「ニ    
、5、EF,00 、E1,00 、D5,00 、C9,00 、BD,00 、B3,00 、    
セ「゙「「「゙「「「゙「「「゙「「「゙「「「゙「「「ニ    
、6、77,00 、71,00 、6A,00 、64,00 、5F,00 、59,00 、    
セ「゙「「「゙「「「゙「「「゙「「「゙「「「゙「「「ニ    
、7、3C,00 、38,00 、35,00 、32,00 、2F,00 、2D,00 、    
セ「゙「「「゙「「「゙「「「゙「「「゙「「「゙「「「ニ    
、8、1E,00 、1C,00 、1B,00 、19,00 、18,00 、16,00 、    
カ「ヨ「「「ヨ「「「ヨ「「「ヨ「「「ヨ「「「ヨ「「「コ    
MEMO
「「「「「「「「「「「「「「「「「「「「「「「「「「「「「
「「「「「「「「「「「「「「「「「「「「「「「「「「「「「
「「「「「「「「「「「「「「「「「「「「「「「「「「「「「
「「「「「「「「「「「「「「「「「「「「「「「「「「「「「
「「「「「「「「「「「「「「「「「「「「「「「「「「「「「
「「「「「「「「「「「「「「「「「「「「「「「「「「「「「
「「「「「「「「「「「「「「「「「「「「「「「「「「「「「
「「「「「「「「「「「「「「「「「「「「「「「「「「「「「
「「「「「「「「「「「「「「「「「「「「「「「「「「「「「
※表1の続きは、次のページの表2です。
                         【表2】
ョ「ホ「「「ホ「「「ホ「「「ホ「「「ホ「「「ホ「「「イ    
、O、 F# 、  G  、 G# 、  A  、 A# 、  B  、    
セ「゙「「「゙「「「゙「「「゙「「「゙「「「゙「「「ニ    
、1、8A,0A 、F3,09 、64,09 、DD,08 、5E,08 、E6,07 、    
セ「゙「「「゙「「「゙「「「゙「「「゙「「「゙「「「ニ    
、2、45,05 、FA,04 、B2,04 、6F,04 、2F,04 、F3,03 、    
セ「゙「「「゙「「「゙「「「゙「「「゙「「「゙「「「ニ    
、3、A3,02 、7D,02 、59,02 、37,02 、18,02 、FA,01 、    
セ「゙「「「゙「「「゙「「「゙「「「゙「「「゙「「「ニ    
、4、51,01 、3E,01 、2D,01 、1C,01 、0C,01 、FD,01 、    
セ「゙「「「゙「「「゙「「「゙「「「゙「「「゙「「「ニ    
、5、A9,00 、9F,00 、96,00 、8E,00 、86,00 、7E,00 、    
セ「゙「「「゙「「「゙「「「゙「「「゙「「「゙「「「ニ    
、6、54,00 、50,00 、4B,00 、47,00 、43,00 、3F,00 、    
セ「゙「「「゙「「「゙「「「゙「「「゙「「「゙「「「ニ    
、7、2A,00 、28,00 、26,00 、23,00 、21,00 、20,00 、    
セ「゙「「「゙「「「゙「「「゙「「「゙「「「゙「「「ニ    
、8、15,00 、14,00 、13,00 、12,00 、11,00 、10,00 、    
カ「ヨ「「「ヨ「「「ヨ「「「ヨ「「「ヨ「「「ヨ「「「コ    

 例えば、O4Cの音を出したいとき、SOUND0,&HDD:SOUND
1,&H01:SOUND8,10 とすれば出ます。音番号にする時は、
O1Cから順に入力していくと、O8Bは68Hとなります。
 例えば上のデータをD000Hからにして、音楽データをD800Hから
にすると、音楽演奏ルーチンのCF3B、CHを00、D0Hとし、CF9
2、93Hを00、D8Hにすればよいです。
 それから、音符の伸ばしについてですが、F1H〜FFHで値が大きいほ
ど伸びが大きくなります。

 結論としては19号のプログラムにD700H〜D733Hまでのデータ
を入力し、(D700、01Hは00Hにする)D734Hから音楽データ
を入力すればよいのです。私が作ってみたのでこのデータを入力して下さい。
D734: 06 07 08 09 0A F1 0A F1 0B 09 0D 0B
D740: 0A F3 0B 09 0D 0B 0A F3 0A 09 09 09 09 08 08 08
D750: 08 07 08 07 06 08 0A F1 0A 09 09 09 09 08 08 08
D760: 08 07 08 07 06 F3 00
そこで、すべて入力し終わったらEXEC&HCFF8で実行します。
  テンポの説明をします。このテンポは音符のきざみのテンポです。各デー
タアドレスの次のLD A の値、例えばMUSIC1ではCF95Hを変
えます。値は1〜9で数字が大きいほどきざみテンポが早くなります。それ
から、データの終わりには必ず、00Hを入れて下さい。
 テンポ、データのアドレスについては、表3を参考にして下さい。
                         【表3】
ョ「「「ホ「「「「「「「ホ「「「「「「「「「「「「「「「イ
、曲番号、テンポ,初期値、データアドレス,初期値        、
セ「「「゙「「「「「「「゙「「「「「「「「「「「「「「「ニ
、 1  、CF95H,8、CF92、93H,D734H  、
セ「「「゙「「「「「「「゙「「「「「「「「「「「「「「「ニ
、 2  、CF9BH,8、CF99、9AH,D858H 、
セ「「「゙「「「「「「「゙「「「「「「「「「「「「「「「ニ
、 3  、CFA3H,9、CFA0、A1H,D905H  、
セ「「「゙「「「「「「「゙「「「「「「「「「「「「「「「ニ
、 4  、CFAAH,6、CFA7、A8H,D813H  、
セ「「「゙「「「「「「「゙「「「「「「「「「「「「「「「ニ
、 5  、CFB1H,9、CFAE、AFH,D8C1H  、
カ「「「ヨ「「「「「「「ヨ「「「「「「「「「「「「「「「コ

 最終的に19号で載せたプログラムに次のプログラムを付け加えるとプロ
グラムは走ります。(D700H〜D96FH)

D700: 00 00 F5 02 D3 02 7C 02 35 02 FC 01 DA 01 AA 01
D710: 7D 01 67 01 3C 01 1C 01 00 01 EF 00 D5 00 BE 00
D720: B2 00 A0 00 8F 00 7E 00 78 00 2D 01 15 02 0D 01
D730: 55 01 C7 00 0A F3 04 F3 0A F3 03 F3 0A F1 03 F1
D740: 0A F1 03 F1 0A F1 03 F1 0A F1 03 F1 03 07 07 08
D750: 07 06 06 08 09 0B 0D 0B 0B 0A 0A F1 0B 05 05 0B
D760: 0A 06 06 08 08 07 08 07 08 07 08 07 03 07 07 08
D770: 07 06 06 08 09 0B 0D 0B 0B 0A 0A F1 0B 05 05 0B
D780: 0A 06 06 08 08 07 08 07 07 06 06 F1 0F F1 0D F1
D790: 0B F1 0A F1 0A 07 08 09 08 07 06 F1 0F F1 0D F1
D7A0: 0B F1 0A F1 18 0A 0B 0C 0D 0D 0D F1 0F F1 0D F1
D7B0: 0B F1 0A F1 0A 07 08 09 08 07 06 F1 0F F1 0D F1
D7C0: 0B F1 0A F1 18 0A 0B 0C 0D 0C 0D 0C 0D 0C 0D 0C
D7D0: 0D 0C 0D 0C 0D F1 03 F1 06 F3 07 09 08 07 0A F1
D7E0: 0A F1 0A 0B 08 09 07 F1 07 F1 07 09 08 07 06 0D
D7F0: 0C 0B 0A 09 08 07 06 F3 07 09 08 07 0A F1 0A F1
D800: 0A 0B 08 09 07 F1 07 F1 07 09 08 07 06 0A 07 08
D810: 06 F3 00 08 F5 0B F1 0D F5 0B F1 15 F5 0B 0C 0B
D820: F7 09 F5 0A 0B 08 F7 07 F1 06 F1 05 F2 08 04 F7
D830: 08 F5 0B 0D 0F F5 0D F1 0C F5 0D 0E 0D F7 0B 0C
D840: 0D 0B 15 0B 0C 15 18 15 0B 18 08 18 15 08 07 F1
D850: 06 F1 05 F2 08 04 F7 00 0B F2 0C 0D F2 0B 0D 0D
D860: 0C 0B 0C F1 08 F1 0C F2 0D 0E F2 0C 0E 0E 0D 0C
D870: 0B F3 0F F1 12 F1 11 F1 12 11 10 10 0F 0E 0F F1
D880: 0B F2 10 F1 0E 0F F2 0D 0C 08 0D 0C 0B F3 0D F3
D890: 0C F1 0B F1 15 F2 0B 0C F1 08 F1 0E F3 0D F1 0C
D8A0: F1 0B F2 0C 0D F1 08 F1 0D F3 0C F1 0B F1 15 F2
D8B0: 0B 0C F1 08 F1 15 F2 0B 0C F1 0B 15 0B F5 08 F1
D8C0: 00 0F 0D 0A 0F 0D 0A 0F 0D 0E 0C 0A 0E 0C 0A 0E
D8D0: 0C 10 0E 0A 10 0E 0A 10 0E 0F 19 F1 0E 19 F3 0F
D8E0: 0D 0A 0F 0D 0A 0F 0D 0E 0C 0A 0E 0C 0A 0E 0C 11
D8F0: 0E 0A 11 0E 0A 11 0E 10 0F F1 19 0F F3 00 00 00
D900: FF 06 01 03 FF 0A 0D 0F 11 F1 11 12 11 F1 10 0F
D910: 11 F1 11 F2 0A 0D 0F 11 F1 11 12 11 F1 10 0F 10
D920: F4 0A 0C 0E 10 F1 10 11 10 F1 0F 0E 10 F1 10 F3
D930: 11 10 0F F1 0E 0D 0E F1 0D 0C 0D F4 0D 0C 17 0B
D940: 0D 0D 0E 0D F2 0B 0A F1 0F F5 0A 0E 0E 0F 0E F2
D950: 0D 0F F5 0B 0D 0D 0E 0D F2 0B 0A F1 0F F5 0D 0D
D960: 0D 0E 0F F1 0E 0D 0E F4 00 00 FF FF FF FF FF FF

 皆さんの中で、このプログラムを使って曲を作った方がいらっしゃいまし
たら、ぜひSAVEまでお送り下さい。

 <ビデオゲームのプログラミング>
  ・第2回  1/60秒の世界・       かえる
 SAVEの会員の皆さん、夏休みは有意義に過ごされたでしょうか。私は
病み上がりということもあって(前回の原稿は入院中に書いたのです。)あ
まりに金が無くて、どこにも行けないので会社で寝てました。AMショーが
近いこともあって、休みとは無関係に人がけっこういて退屈せずにすみまし
た。なんと悲しい夏!

 さて、今回はこれといった質問も来てないため(質問下さい!何でもいい
ですから)前回の予告通り、「1/60秒の世界」ということで進めていき
ます。
           【図1】
                   この1/60秒、これが何の時間
かと言うと、知っている方も多いと思いますが、ブラウン管の中の電子銃が
画面全体を掃引する時間、つまり一画面の表示に要する時間なのです。電子
銃は1本しかないため、図1のように動いて画面を表示します。この方式を
ラスタースキャンといい、通常のディスプレイ装置はほとんどこの方式を用
いています。(対する方式としてベクタースキャンという方式があります。
アタリのスターウォーズやバンダイの光速船のように、全て線画で表示しま
す)                         【図2】

つまり、1コマ1/60秒であるということは、それより短い時間で画面の
描き換えをしても無意味だということです。また、上から順番に描いている
わけですから、走査線が走っている間(図でいうA−B間、これを表示期間
という)にゲーム画面の描き換えやオブジェクトの移動、スクロール等行う
と、例えば図2の例のように、上と下で絵がずれたりといった不都合が生じ
ます。これはとてもみにくいですね。(最も、これはこれでラスタースクロ
ール等様々なテクニックに応用できるのですがこれについては次号あたりで
いろいろ説明します。)このような不都合を防ぐには、画面の描き換えは必
ず表示期間以外で行えばよいことになります。これを帰線期間(正確には垂
直帰線期間)といい、図1でいうB−A間に相当します。

 ということはつまり、CPUが帰線期間にのみ動作すれば何の問題もない
ことになりますが、それは処理能力の無駄というものです。帰線期間は表示
期間の1/5程度の時画しかありません。現実には、スクロールレジスタや
オブジェクトのレジスタ、パレットNo.等画面表示に関係するレジスタと
同じ大きさのバッファをRAM上に確保して、それに対してCPUが表示期
内容を対応するレジスタに一気に転送しているのです。こうするとCPUか
らは見かけ上いつレジスタをいじっても、画面が乱れることはありません。
またこのため、ビデオゲームのプログラムというのは、
 表示期間中に計算→帰線期間に描画→表示期間中に計算→…
というふうに、必ず画面表示と同期して動いているのです。つまり、1/6
0秒ごとに1度の処理を画面と完全に同期させているのです。ここでいう1
度の処理とは、敵や自分の移動、スティック入力、クレジット管理、その他
ゲームに必要なすべての処理のことです。1/60秒というのは極めて短い
ため、スティック入力は1/60秒遅れて結果が画面に出ているわけですが、
人間には同時に感じられるのです。この同期したプログラムと処理の速さが、
ビデオゲームの快適さを生み出していると言えます。
 例えば、キャラクタが少なくなったからといっていきなり処理が速くなっ
たりしません。(ただし、処理が1/60秒で間に合わないときは、次の同
期を待つため、きっちり2倍、3倍と遅くなります。シューティングゲーム
でキャラが多くなるとよくこうなります。)また、この画面は0.5秒表示、
このキャラは1秒で120ドット動く、等あらゆる数値を厳密に調整できた
りするわけです。
 今回は、非常に大事な、1/60秒の意味について説明しました。以後、
この連載では1/60秒=1インターと定義し、こちらの用語を使っていき
ます。しばしば出てくるので、覚えておいて下さい。次回は、少し柔らかい
話をしたいと思いますので、いろんなタイプのゲームを具体例に挙げながら
「このゲームのこの処理はこうやっている!!」というふうなことを解説し
ていきたいと思います。家庭用、業務用、どちらでも構いません。リクエス
トがあればSAVE事務局まで。質問、意見等も待っています。

次回取り上げようと思っている処理(1回じゃ無理かも…)
・ドライブゲームの画面処理…ポールポジション、アウトラン
                ウイニングラン、F−ZERO
・コンシューマー機の限界に挑む!!
     …PCエンジンでの2重スクロール、拡大、回転。
      限界を超えた昨今のファミコン
            ソニック・ザ・ヘッジホッグの特殊プログラミング
                                                      等
・テーブルゲームの演出の世界…ゼクセクス                        ストリートファイター2    
           その他、リクエストがあればやります。
 あと、付録として、ビデオゲームのプログラムの超基本的なフローチャー
トを付けておきます。(編集担当・なお紙面の都合上、1部変更してありま
すが、フローチャートの内容には変更はありません。)

 <便長ユーティリティー>

 今回はBASICによるスクロールアップ&ダウン機能プログラムを紹介
します。これは88以降のROLL UP  ROLL DOWN等のキーと同じ機能が使える
ということです。使い方は表1、2の通りで特徴としては次の通りです。
(1)このプログラムはオールマシン語で、キー割り込みで機能するように
なっています。常駐部のプログラムサイズは770バイトとコンパクト(自
画自賛)です。
(2)CTRL−A,V,W,X,Y,Zのいずれかを押すことによって機
能します。(表2参照)
(3)プログラムはリロケータブルになっていますが、通常はBASICテ
キストエリアの先頭よりロードして実行します。初期設定でBASICプロ
グラム開始アドレス(FA5FH,FA60H)を書き替えるようになって
います。
(4)スクロールアップ/ダウンの開始行番号ポインタは現在表示中の最上
行または最下行のBASIC行番号を採用しています。


(5)シングルウインドウは
  CONSOLE 0,19
   マルチウインドウは
  CONSOLE 0,10(またはCONSOLE10,9)の範囲で、
アクティブウインドウ(エディタが有効な領域)は白、ノンアクティブウイ
ンドウは黄色になります。
(6)空白行挿入機能もサポートしました。

 入力は次のマシン語プログラムを入力して各々セーブして下さい。
 最後に次の事項に注意して使用して下さい。

 スクロールダウン(CTRL−A)のとき画面表示が上下するのはプログ
ラムの不良ではなく、次の理由からです。
●BASICテキストは内部型式なので、ディスプレイ表示が2行になるか
どうか分からない。したがって、無条件に2行スクロールダウンさせます。
●BASICテキストをディスプレイに表示し、1行の場合はスクロールア
ップして行間を詰めています。

 次のエリアを書き替えないで下さい。
◆キー割り込み用フックエリア(FA02H,FA03H)

◆テキストエディタ出口フックエリア(FF94H,FF95H)
◆ワークエリア(FA00〜FA01H,FA0AH〜FA0CH)

 初期設定時にRS−232C用バッファエリア(FBF9H〜FC00H)
を使用しています。
ADRS:+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F:SUM
8000:21 E1 E5 22 FB FB 21 22 F9 22 FD FB 21 FB C9 22:5C
8010:FF FB CD FB FB 2A F9 FB 11 EE 02 19 E9 00 F3 C5:96
8020:06 00 F5 CD 78 0E 4F D5 E5 B7 CA 2B 0F C5 FE 01:D6
8030:CA 20 01 FE 16 CA 0D 02 FE 1A 28 48 FE 18 28 50:EE
8040:FE 19 CA 9C 00 FE 17 28 0A 21 1E 00 22 02 FA C1:E2
8050:C3 C2 0E CD D5 00 6C 3A A8 FD 2D BD 38 20 6F CD:FE
8060:DA 02 CD 88 11 CD DA 11 3A A5 FD BD 28 DB E5 21:CC
8070:28 00 19 EB CD DA 11 E1 2C CD DA 02 18 CB 6F CD:B9
8080:DD 01 18 C5 2A A8 FD E5 01 0F 0F 21 01 13 18 16:F1
8090:21 05 01 E5 01 0B 0F 21 01 0A 18 0A 21 0F 01 E5:8B
80A0:01 0F 0B 21 0B 13 22 00 FA CD D5 00 E1 CD 6D 11:44
80B0:F3 3E DD D3 F0 3A 91 FD 67 2E 00 70 C5 01 8F 01:F4
80C0:E5 D1 13 ED B0 23 13 C1 71 01 67 01 ED B0 3E 11:23
80D0:D3 F0 C3 49 00 21 B5 0E 22 02 FA CD 81 11 21 10:61
80E0:01 22 93 FD 2A 00 FA 22 A4 FD C9 CD F2 01 ED 4B:5B
80F0:0A FA 21 57 FF 7E B8 38 23 20 05 2B 7E B9 38 1C:E7
-------------------------------------------------------
SUM :68 09 F1 1C 36 64 1D 74 C2 A5 3E 64 57 0B 38 49:95

ADRS:+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F:SUM
8100:C5 E1 7E BB 20 16 23 7E BA 20 11 2B 2B 2B 2B 7E:CB
8110:A7 20 09 23 E5 C1 5E 23 56 EB 37 C9 CD 01 05 C9:F7
8120:CD D5 00 E5 CD 99 02 D1 D5 E5 6B D4 B4 02 E1 30:80
8130:0B E1 2C 3A A5 FD BD 30 EA C3 49 00 CD EB 00 30:BF
8140:F0 D1 21 60 FA 7E B8 20 06 2B 7E B9 CA 49 00 C5:D2
8150:B7 ED 52 E5 C1 E1 E5 D1 2B 7A ED B9 C2 49 00 7E:07
8160:BB 20 F6 2B 7E A7 20 F1 23 E5 23 23 22 0A FA 2A:D0
8170:A4 FD CD DD 01 21 95 01 22 94 FF 3A A4 FD 3D 21:F1
8180:A8 FD 77 3E 01 23 77 2A 0A FA 5E 23 56 E1 ED 7B:43
8190:5B FA C3 E2 05 2A A4 FD 2C E5 CD B4 02 E1 38 13:8A
81A0:65 3A A5 FD 6F E5 CD E2 63 CD 01 00 E1 CD B8 11:EC
81B0:CD DA 11 3A A4 FD 6F 26 01 CD 6D 11 21 1E 00 22:D5
81C0:02 FA 21 A0 53 22 94 FF C3 57 04 22 94 FF 21 0C:C5
81D0:FA 7E A7 C4 39 27 AF 77 3A A5 FD 18 D9 3A A5 FD:12
81E0:67 CD 2F 64 CD B8 11 CD DA 11 CD 2F 64 F3 CD ED:22
81F0:02 C9 F3 3E DD D3 F0 11 F9 FC D5 01 05 00 ED B0:1A
-------------------------------------------------------
SUM :E4 AB C3 A7 00 97 2D 08 AF 53 C5 E9 FB 8B A5 9C:3C


 リストの続きは、次のページです。
ADRS:+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F:SUM
8200:3E 11 D3 F0 AF 32 FE FC E1 CD 06 0E C9 CD D5 00:1A
8210:6C E5 CD 99 02 D1 D5 E5 6B D4 B4 02 E1 30 0B E1:36
8220:2D 3A A4 FD BD 38 EA C3 49 00 CD EB 00 30 F0 D1:9C
8230:7E A7 20 07 23 7E A7 CA 49 00 2B E5 3A A5 FD 6F:02
8240:E5 CD B4 02 E1 38 18 CD B8 11 EB 01 28 00 3E DD:5E
8250:D3 F0 3E 20 ED A1 E2 71 02 28 F9 3E 11 D3 F0 ED:24
8260:5B A4 FD 6A 63 CD E2 63 CD 01 00 CD B8 11 CD DA:E6
8270:11 3E 11 D3 F0 E1 E5 5E 23 56 23 22 0A FA 1A A7:CA
8280:20 0B 13 1A A7 20 06 21 0C FA 3E 01 77 21 CB 01:EF
8290:22 94 FF 3A A5 FD C3 7E 01 CD B8 11 F3 EB 3E DD:62
82A0:D3 F0 7E FE 31 38 08 FE 3A 38 03 37 18 01 B7 3E:68
82B0:11 D3 F0 C9 7D 11 B5 FD FE 09 38 0A D6 08 13 FE:15
82C0:09 38 03 D6 08 13 3D B7 17 17 17 C6 47 21 D3 02:71
82D0:77 1A CB 4F 28 02 B7 C9 37 C9 E5 CD B4 02 3A D3:CA
82E0:02 E6 FE F6 80 32 EA 02 EB CB CE E1 C9 CD DA 02:51
82F0:3A A5 FD 7C 3C 95 6C E5 F5 CD C6 28 F1 E1 CD C6:8F
-------------------------------------------------------
SUM :5B B5 AD 9E 98 82 F5 6E FB B1 7A FD EC 96 69 23:09

ADRS:+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F:SUM
8300:28 C9 00 2A F9 FB 01 15 00 B7 ED 42 E5 C1 22 F9:CC
8310:FB 21 78 03 09 3E FF 5E 23 56 BA 28 12 23 E5 EB:9B
8320:09 E5 5E 23 56 EB 09 EB E1 73 23 72 E1 18 E8 CD:3B
8330:58 10 ED 5B F9 FB 21 D2 03 01 1E 00 ED B0 F3 21:6A
8340:1E 00 22 02 FA 21 0C FA AF 77 21 01 13 22 00 FA:DA
8350:21 03 03 22 5F FA 21 FF FF 22 0A FA 3A 93 FF FE:B1
8360:C3 28 0F 2A F9 FB 22 94 FF 22 C3 01 21 93 FF 3E:A4
8370:C3 77 CD CE 34 C3 42 04 31 00 36 00 43 00 4A 00:06
8380:54 00 60 00 7A 00 80 00 AA 00 21 01 D3 00 EC 00:39
8390:25 01 2C 01 3A 01 3D 01 4D 01 5D 01 73 01 76 01:63
83A0:9B 01 AA 01 BD 01 EF 01 0E 02 13 02 1A 02 28 02:60
83B0:2B 02 38 02 42 02 57 02 69 02 8E 02 97 02 CE 02:68
83C0:DC 02 DF 02 E6 02 EE 02 37 03 40 03 51 03 6A 03:D5
83D0:FF FF C9 E5 21 B5 FD ED 5B A4 FD 7B FE 0B 28 04:18
83E0:CB CE 18 03 23 CB DE 7A 3C 93 63 CD B2 28 E1 C9:7D
-------------------------------------------------------
SUM :2E 54 F2 B5 B4 7E 87 2E 21 7B CB 29 6E 2F F5 DD:0F

これは結構便利です。とくに、98や88を使った後P6を使うとLIST
したあとESCでいちいち止めていくのが面倒になることがよくあります。
これは、打ち込んで損はないです。
                                         (編集担当)

 <ビデオゲームのプログラミングの続き>
〔ゲームプログラミングQ&A〕

 このコーナーに会員の方からいろいろ質問が寄せられました。こちらとし
ても嬉しい限りです。まずは会員番号6046の北見さんの質問から。

 かえるさんどうも会員番号6046の北見です。新しい連載の”ビデオゲ
ームのプログラミング”に期待しているP6とX68Kのユーザーです(最
近はX68Kの方ばかり使っていますが)。今まで近くにプログラムを組め
る人がいなかったので、これからいろいろと質問すると思いますが宜しくお
願いします。
 少し、自分のPRをすると現在使える言語は、BASICとZ80AとM
C68000のマシン語です。今はX68Kを使って簡単なシューティング
ゲーム等(オール・アセンブラ)を作れる程度です。

 さて、余談はこれくらいとして質問します。

 前に書いたようにシューティングゲームを作っているのですが、現段階で
はジョイスティックかキーボードで自機の操作ができて、スクロールやスプ
ライトの書換えは垂直帰線期間を見て処理しているのでガタついていません。
ここまでは、多分市販ソフトと同じような処理をしているのでいいのですが、
敵や障害物などの処理はどうやっているのですか?
 敵は、一定の間隔で敵(のデータ)を発生させて、そして敵の移動等はメ
モリにジャンプ・テーブルを用意して敵の種類によって別の処理にブランチ
すれば良いのですか?

 次に障害物は上下スクロールがなければ出来るのですが上下スクロールが
入るとグラフィック(X68KではBG)を書き換えなければいけないし、
スプライトも仮想画面を使って計算して表示するようにするとプログラムが
とても汚くなります。ビデオゲームではどうやっているのですか?(ビデオ
ゲームはVRAMがメチャクチャデカイからこんな心配はないのかもしれな
い)

 あと、障害物の当たり判定はキャラクター番号によってデータを変えてや
れば良いのですか?私は次の方法で当たり判定を行っていますけどこれでよ
いのですか?

〔BASIC版〕
EX、EYを 敵のX,Y座標
 X、 Yを自機のX,Y座標とすると、

100 D1=EX-X : D2=EY-Y
110 IF D1<-16 THEN 160
120 IF D1> 16 THEN 160
130 IF D2<-16 THEN 160
140 IF D2> 16 THEN 160
150 ? "Hit !"   /* 当たり!
160 end

〔MC68000版〕
D1、D2を 敵のX,Y座標
D3、D4を自機のX,Y座標とすると、
        sub.w   d3,d1
        sub.w   d4,d2
        lea.l   DAT(pc),a0
        cmp.w   $00(a0),d1
        blt     Skip
        cmp.w   $02(a0),d1
        bgt     Skip
        cmp.w   $04(a0),d2
        blt     Skip
        cmp.w   $06(a0),d2
        bgt     Skip
        jsr     HIT(pc)         * 当たり
Skip:   rts
        .data
DAT:    dc.w    -16,+16,-16,-16

 また、この方法だと四角形の範囲しか判定出来ませんが大きい物や複雑な
形のときは複数合わせるのですか?それとも別の方法で判定するのですか?
教えて下さい。

 今回は時間が少ないのでこれくらいにします。解答は出来れば簡単なプロ
グラムを付けて下さい(MC68000でもZ80Aでも構いません)。

              EOF

 どれもゲームを作る上では避けられない問題ですね。まず最初の質問、敵
の処理についてですが、これは北見さんの考えられている通りでよいのです。
敵の出現は、1/60秒毎に加算されるカウンタを1つ用意して、これがい
くつのときどのような敵がどこに出現するか、等を記述したデータテーブル
を参照すればよいでしょう。そして、出現した敵についてはその種類(番号)
に応じたルーチンに飛ばして処理してやればよいのです。障害物に関しては、
「破壊できない特殊な敵」とすることで敵と同様に処理できます。(ここで
いう障害物とはスプライトで表示する場合の物です。)

 次の質問はつまりスクロール面とのヒットチェックをするにはどうすれば
よいか、ということですよね?確かに、上下に限らず、スクロールをさせる
とやがては背景の描き換えをせねばならず、自機の位置に対するスクロール
面のアドレス計算もややこしくなり、わけがわからなくなります。しかし、
スクロール面に背景や障害物が出る、ということは、そのためのデータがプ
ログラム中にあって、それを元にBG面に表示しているということですね。
ならばその元のデータはスクロール面サイズとは無関係に連続に存在してい
ますよね。そちらを参照してやれば、背景とのヒットチェックは可能です。
このとき、BGに定義するキャラクタも自機とのヒットのあるものを先頭に
固めて定義する、などとすればキャラクターコードの範囲でヒットチェック
できるので楽です。この方法の欠点はヒットの範囲が最小で8×8ドットに
なってしまうことですが、実質的な問題はないでしょう。
 ビデオゲームの場合、背景の絵が複雑で、キャラクタコードでの判定は現
実的でないことが多いため、背景画のデータとは別に絵に合わせたヒットチ
ェック用のデータを持つこともあります。こうすると、ヒットの範囲を自由
に設定できたり、圧縮をかけた背景画を使えたりといったメリットがありま
す。ちなみに、ビデオゲームがVRAMが大きくて楽、なんてことはまった
くありません。第1回でも書いたように、スクロール面なんてせいぜい64
×64キャラ、画面から少しはみ出るくらいしかないのですから。

 さて、最後の質問、敵とのヒットチェックですが、これはもう北見さんの
作ったプログラムの通りで十分です。ゲームのプログラムといえどもこのよ
うな地味な処理の繰り返しでしかないのです。なお、当たり判定は、実際の
キャラの大きさより少し小さめに取った方が、納得できる判定になるようで
す。大きなキャラに関しても、四角形をいくつか組み合わせて判定します。
例えば、ストリートファイター2では、身体各部で分けた3つないし4つの
四角形をヒットの範囲として持っています。

 ちなみに、北見さんのMC68000版サンプルプログラムを、自分なら
どう書くか、考えてみました。

X_HIT_RANGE   egu     16
Y_HIT_RANGE   egu     16
hit_check_x
              sub.w   d3,d1
              addi.w  #X_HIT_RANGE,d1
              bmi.s   skip
              cmpi.w  #X_HIT_RANGE*2,d1
              bgt.s   skip
hit_check_y
              sub.w   d4,d2
              addi.w  #Y_HIT_RANGE,d2
              bmi.s   skip
              cmpi.w  #Y_HIT_RANGE*2,d2
            bgt.s   skip

              jsr     hit(pc)
skip
              rts

 これで特に速くなったわけではありませんが、範囲が8×8ドット以内の
ときはaddiの代わりにaddgが使えるので少し速くなります。また、
プログラム中に16などといった具体的な数値ではなくあえてラベルで書い
てあるのは、ビデオゲームの 場合、そのような数値をプログラマー以外に
も企画者がいじったりすることもあるからで、たいていは別ファイルにして
おきます。

 さて、それ以外にもいくつか質問が来ています。

Q. プログラム開発には、アセンブラがほとんどだと思いますが、他の言
語(C言語等)は使用しないのでしょうか?

A. その高速さとハードウェアの直接操作のしやすさから、ビデオゲーム
の開発にアセンブリ言語は不可欠です。しかし、非常に少ないながらも、会
社によってはC言語でプログラムされたゲームが発売された例もあります。
(秘密事項につき、具体的にゲーム名は挙げられませんが)また、アセンブ
ラで三角関数等を扱う場合、速度的な都合から0〜90度までのsinの値
をすべてデータで持たせたりしますが、そのよう  なデータテーブルを作
成するプログラムをC言語で書く、などはよくある話です。ここからは余談
ですが、数年以内に、CPUが現在主流のCISCチップではなくRISC
チップを使用したビデオゲーム基板が出る、という予測があります。簡単に
説明すると、CISCとはあまり速くはないが命令セットの豊富なプロセッ
サで、RISCとは単純な命令しか実行できないが超高速なプロセッサです。
もしRISCチップが搭載されれば、開発の大半はC言語で行われるように
なることでしょう。この方がCISCでアセンブラで書くより速くなるので
す。(しかも割に安い)
   さらに余談ですが、98でCで書くより、68でアセンブラで書く方
が100倍楽です。

Q. ビデオゲームのハードを開発する際、コストダウンの面で努力してい
る事はどのようなことでしょうか?(例えばマザーボード化する、etc)

A. 基板を安く作ることは、オペレーター(ゲームセンター経営者等)に
販売する際にも安価にできるということで、非常に高い競争力を持てるとい
うことです。特にこれは海外をターゲットにした場合、ゲームの質以上に重
要なことです。
     マザーボード化するというのはすでに当然のことです。そのマザーボ
ードをいかに安価に作るか、ということが重要です。基板の価格というのは
性能ではなく、単純に基板の面積と部品数で決まります。従って、可能な限
りカスタムチップ化して部品数を減らし、ROMも大容量の物を少数個、I
Cソケットなども極力使わずフラットパッケージの物を基板に直付けする、
というふうにしてコストダウンを計ります。

それでは、今回はこの辺で。質問があれば、どんどんお寄せ下さい。


 <雑談コーナー>

 プロ野球、セリーグはすごいですね。ヤクルト、阪神、巨人の三つ の戦
いです。この中から抜け出るのはどのチームでしょうか。SAVEが発行さ
れるまでには優勝が決まっている事でしょう。とにかく巨人以外に優勝して
もらいたい。

 プロ野球は巨人が勝てるでしょうか。と書きたかったのですが、もう負け
は決定してしまいました。こんにちは、編集担当です。いきなり 雑談をお
願いします!と、きたのでここに出ているわけです。台風の被害は今年はあ
まりなかったように思えます。それより、冬の方が心配です。その理由の1
つめは、気候の変化が、ここ数年変化してきたこと、2つめは、寒くなるの
が早すぎることです。山の初雪が早いと冬は寒くなる、というデータがあり
ます。今年は平年より平均1〜2カ月も早いそうです。ただ、寒くても、東
京の雪は心配ない、といわれていまして、これは、東京の積雪は1年おきに
大雪が降るのだそうです。大雪ではない年は、0〜5cm程度しか降ってい
ません。去年は記録的な大雪(この日、電車が走らず、1時間半かけて学校
にいきました。)だったので、今年は降らない、というのだそうです。しか
し、前にのべました通り、最近の気候はおかしくなってきていますので、こ
のデータもいつか狂うのではないかと思います。話は変わりますが、P6を
生かさなくてはなりません。そのために、どうするかを考えるのは、私達P
6ユーザーではないかと思います。私としては、P6の音楽はあたたかみが
感じられる(私だけでしょうか)ので、音楽に使う、他には、身近な科学を
知るには、目でみるのが一番なので、P6で絵を描きみんなに科学を知って
もらうという(いわゆる所さんの目がテン!、日本テレビ系、東京土曜日朝
7:00、東京だけかも?)のを考えています。何かいい方法がありました
ら、たとえ、無理とわかるような事でもSAVEに送って下さい。もしかす
ると、改良の余地があるかも知れませんから。


 <PSG効果音集>

      地下鉄の発車ベル《モード1〜5・ページ任意》
10 RESTORE 60
20 FOR LP=0 TO 13
30 READ DT
40 SOUND LP,DT
50 NEXT LP
60 DATA 160,0,161,0,162,0,0,56,10,10,10,0,0,0

 <お知らせ>

・『RS−232C情報』原因不明のバグが出まして現在難航しています。
しかも、ハード担当はプロトタイプの配線を「これどこだっけ」などと言
って解析し直しているという無責任なことをしています。現在プロトタイプ
2号を制作中でいま、パーツを集めているところです。
・現在、P6のミュージックデータをMIDIデータに変換させようと思っ
ていますが、ハードがわかりません。その辺に詳しい人がいればアドバイス
を下さい。

                  【SAVE事務局会則】

                     第1章  総則

第1条〔名称〕 本会は「SAVE事務局」と称する。

第2条〔目的〕  SAVE事務局はPC-6000,PC-6600シリーズの情報提供の
ために定期的会報「SAVE」を発行し、会員間の交 流を図ることを目的
とする。

第3条〔組織〕 SAVE事務局の会員はPC-6000,PC-6600シリーズのパソコ
ン所有者で、会費を納入した者とする。

                     第2章 役員

第4条〔役員構成〕 SAVE事務局は以下の役員構成とする。
   (1)代表
   (2)編集担当
   (3)MUSIC担当
   (4)ハード担当
   (5)システム担当
   (6)総務担当



第5条〔役員役割〕 各役員の役割は次の通りとする。
   (1)代表は全ての担当を指揮し、各担当のサポートを行う。
   (2)編集担当は会報SAVEの編集作業を行う。
   (3)MUSIC担当はパソコンMUSICやMIDIによるMUS
ICのサポートを行う。
     (4)ハード担当はハード全体のサポートを行う。
     (5)システム担当はソフト全体のサポートを行う。
      (6)総務担当は会報SAVEの印刷、郵送、SAVE各サービスの
管理、会計を行う。

第6条〔役割人数〕 役員は基本的には各1名だが、各担当は兼任すること
が可能である。但し、代表は全担当をサポートするものとする。

                     第3章 会計

第7条 会費は会報SAVEの料金をもって会費とする。

第8条 会報SAVEの料金は1部200円とする。

第9条 会費の納入は会員期限の切れる前に納入するものとする。また、会
員期限は納入者が自由に選定することが出来る。その 場合は相当分の会費
を納入するものとする。


第10条〔脱会について〕 会員は会員期限が切れた時点で脱会したものとす
る。

第11条〔復会について〕 脱会した会員は再び会費を納入することにより復
会したものとする。

                     第4章 事業

第12条 SAVE事務局は次の業務内容を主とし活動を行う。
      (1)会報SAVEの発行

                   第5章 その他

第13条 本則は代表の意見により自由に変更を可能とする。

 付則
本則は平成4年10月1日から施行する。



                     編集後記

・やっと就職も決まり、あとは卒業にむけて頑張るだけとなりました。皆さ
ん、P6を使った何かいいアイデアはないでしょうか。もう少しP6を活用
させたいものです。             (代表)

・P6は三途の川を目の前にしています。誰か、助けられないものでしょう
か。スペースが余りまくったのでここに書きますが、多分N60−BASI
Cシリーズを使っている限り、三途の川を越えてしまうでしょう。いま、ア
センブリを勉強しようと思っていますが、そういう本がなかなかないので
(前、本屋をSAVEで紹介していましたが、出来れば地図を送って欲し
い。)まったくわかりません。もうこの際、P6に1M位のRAMを付けて、
N88−BASIC(86)やMS−DOSを搭載させるぐらいしないとB
ASICでは生き残れないのでしょうか。P6SRで64kB、98VM以
降は640kB〜1M(最大2Mから4M)、標準でも98の1/10のR
AMしかないのです。誰か、ちょっとでもアセンブリやマシン語を知ってい
る方がいれば、教えてくれませんか。せめてSAVEの中だけでも、せっか
くP6をSAVEする(守る)という意味のSAVEなのですから。
 それでは、もし誤字・脱字がありましたらお知らせ下さい。また、今回は、
私のせいで1ページの半分も余らしてしまってどうもすみませんでした。                           (編集担当)

・SAVE28号は12月上旬発行予定です。

  • 26号に戻る
  • 28号に行く