2023年06月30日
Laboratoryテーマ??6「自機に向かって飛んでくる敵弾」その?B
Laboratoryテーマ??6「自機に向かって飛んでくる敵弾」その?B、最終回です。
前回は、BASICで組んだサンプルを公開しました。
今回はBASICで組んだサンプルを基に、マシン語に組み直しました。
考え方とロジックはそのまま、マシン語化しただけです。
ただ、まったくBASICと同じだとあまり面白くないので、SPRITEとFONTを設定し、キャラクタを8×8ドットを16×16ドットに変更。
さらに、敵が弾を16発撃つようにしました。
さすがマシン語、これだけ弾出しても速度的には余裕ですね。(これでもまだウェイト負荷掛けてあります。)
BASIC部分のサンプルプログラムです。
「STSMPL.BAS」【 ダウンロード 】
変数表です。
昔は手書きでしたが、便利な世の中になったものです…。
因みに昔製作途中で終わった、「SPACE WARS」と言うシューティングゲームのSPRITEを流用しています。
ロジックも、そちらから必要な部分だけ抜き取り加工しています。
マシン語のサンプルです。
起動すると、STSMPL.BINを作成します。
「BINSET.BAS」【 ダウンロード 】
「マシン語の割り算」の8ビットで計算しきれず、「マシン語の割り算(16ビット版)」に変更した時に、処理速度が遅くなると書きましたが、これだけ弾出してても、特に処理速度的な問題はなさそうです。
今回の主な用途はシューティングゲーム等の弾道計算用なので、弾幕シューティングでもない限り弾道計算がそこまで頻発することもないので、大して問題にならないと思います。
(MSXではSPRITEの制限(横4個(MSX2は8個)以上でチラつく、同時表示32個まで(走査線割込み使えば対応可ですが))の為、弾幕シューティング自体を私は見たことがない…。)
因みに、ここまでできれば、4方向弾、8方向弾、16方向弾はすぐできます。
簡単なのでちょっと撃ってみた。
では、前回記事で書いた通り、ここで一旦Laboratoryは中断して3DダンジョンRPGの制作に専念します。 (2023年6月26日記事参照「 開発案件広げすぎ… 」)
再開後は、Laboratoryテーマ??7「水平ライン4枚(MSX2は8枚)を超えてSPRITEを表示させたい」です。
MSXのSPRITEの弱点に、同一水平ライン上に4枚(MSX2は8枚)以上並ぶと、それ以上のSPRITEが表示されなくなると言った仕様があります。
その対処方法として、市販ゲームではキャラクタをチラつかせて、完全に見えなくなるのを防いでいます。
このテーマは、そのやり方です。
2023年06月29日
Laboratoryテーマ??5「16ビットアドレス値の10進数表示」
さて、今回はLaboratoryテーマ??5「16ビットアドレス値の10進数表示」です。
16ビットアドレス(HLレジスタ)の16進数値を10進数値に変換して、指定の座標に5桁表示するサブルーチンです。
5桁表示の後ろに「00」を表示し、7桁にしてスコア表示していました。
色々なロジックがあると思いますが、私のやり方は単純に10,000の桁から10,000を引いて、引けた数をカウント、次に1,000の桁…とする単純なロジックです。
最大ループ数は10,000の桁=6、1,000の桁=9、100の桁=9、10の桁=9の計33回となります。
他にも、 HRAさん 紹介の2分法ロジックもありますが(最大値の半分ずつ引いていくロジック(10,000の桁なら6が最大の為、半分の30,000を引く))、プログラムが長くなるので私はこちらを使っていました。
それに、毎回最大ループする訳はないし、例えば表示する値が11,111の場合、断然こちらのロジックの方が早いです。
まぁ、一長一短ですね。
16進数を10進数に変換し、尚且つ指定座標に5桁表示するのサンプルプログラムです。
「10PTSMPL.BAS」【 ダウンロード 】
マシン語での計算結果と、検算用にBASICで単純計算した結果を列記します。
マシン語のサンプルです。
起動すると、10PRINT.BINを作成します。
数字表示用に5個8ビット変数を利用しているので、サブルーチンとしてアドレス変更する際は、そこの変更を忘れないように気を付けてください。(&HBF90:2ヵ所)
IN
OUT
HL
表示する値
なし
B
表示するX座標(0〜31)
C
表示するY座標(0〜23)
「10PRINT.BAS」【 ダウンロード 】
マシン語のサブルーチンとして必要なのは&HBF00~&HBF77までです。
&HBF80~&HBF8Fは表示元値を代入してサブルーチンコールします。
では、次回はLaboratoryテーマ??6「自機に向かって飛んでくる敵弾」その?Bです。
2023年06月28日
Laboratoryテーマ??11「マシン語の割り算(16ビット版)」
さて、今回はLaboratoryテーマ??11「マシン語の割り算(16ビット版)」です。
前回の「マシン語の割り算」では、割られる数が8ビット(0〜255)でした。 (2023年6月22日記事参照「 Laboratoryテーマ??3「マシン語の割り算」 」)
ただ、それでは大きい値の計算が出来ないので急遽Laboratoryテーマ??11として、「マシン語の割り算(16ビット版)」をテーマに新規追加しました。 (2023年6月27日記事参照「 しまった 」)
考え方は8ビット版と同じで、「8回ループ」を「16回ループ」に変更しただけです。
それに伴い、ビットシフト(ローテイト)が1回(8bit)で良かったところ、すべて2回(16bit)になったのでロジック長くなっています。
16ビット割り算のサンプルプログラムです。
「WARISMPL.BAS」【 ダウンロード 】
マシン語での計算結果と、検算用にBASICで単純計算した結果を列記します。
マシン語のサンプルです。
起動すると、WARIZAN.BINを作成します。
16ビットへのロジック変更の際、レジスタペア数が足りなかったので、2個16ビット変数を利用しているので、サブルーチンとしてアドレス変更する際は、そこの変更を忘れないように気を付けてください。(&HBF4C:3ヵ所、&HBF4E:3ヵ所)
変数使わない手もありますが、煩雑になるので楽で解り易い方法を選択しました。
IN
OUT
HL
割られる数
BC
商
B
割る数
HL
余り
「WARIZAN.BAS」【 ダウンロード 】
マシン語のサブルーチンとして必要なのは&HBF00~&HBF37までです。
&HBF38~&HBF4Fは計算元値を代入してサブルーチンコールします。
では、次回はLaboratoryテーマ??5「16ビットアドレス値の10進数表示」です。
2023年06月27日
しまった
Laboratoryテーマ??6「自機に向かって飛んでくる敵弾」のマシン語サンプル作ってて思い出しました…。
「三平方の定理」使って弾道計算するなら、「割り算で計算結果が小数点にならないように、16ビット演算しなきゃいけない」のをすっかり忘れてました…。
なぜ16ビット計算が必要なのかを、「テーマ??6「自機に向かって飛んでくる敵弾」その?@」での数字を使って説明します。 (2023年6月12日記事参照「 テーマ??6「自機に向かって飛んでくる敵弾」その?@ )
1移動当りの弾移動量を計算します。
Y方向 = 72(a)÷ 120(c)= 0.6
X方向 = 96(b)÷ 120(c)= 0.8
Y方向 = 72(a)÷ 120(c)= 0.6
X方向 = 96(b)÷ 120(c)= 0.8
記事内のこの部分、これです。
マシン語は小数点を扱えませんので、小数点にならないよう事前に割られる数に「×100」若しくは「×10」しておく必要があります。
そのためには、8ビットだと0〜255までの値しか使用できないため、16ビットにする必要があるのです。
Y方向 = 7,200(a×100)÷ 120(c)= 60
X方向 = 9,600(b×100)÷ 120(c)= 80
X方向 = 9,600(b×100)÷ 120(c)= 80
「テーマ??6「自機に向かって飛んでくる敵弾」その?A」のサンプルBASICプログラムでは何も考えずに普通に×100を組み込んでいました…。 (2023年6月14日記事参照「 テーマ??6「自機に向かって飛んでくる敵弾」その?A )
MSXプログラミングから離れて久しいので、8ビットの制約を忘れてました。
Windowsプログラミングだと、特に気にする必要ありませんからね…。
なんたって、マシン語で掛け算、割り算ができるし、マシン語使わなくても処理が早いので、ラジアン計算、三角関数(Sin、Cos、Tan)が普通言語で使えますからね…。
後日、16ビットの割り算サブルーチンLaboratryで公開します。
それと、実は私は自作シューティングゲームの弾道計算にこのロジックを使っていません。(おい。)
Laboratoryテーマ??9「32方向弾」の時に説明すると思いますが、処理速度と簡易性を重視した「なんちゃって弾道計算」ロジックを使っていました。
「なんちゃって」ですので、あまり人にお勧めできるものではないというのが正直なところですが。
2023年06月26日
開発案件広げすぎ…
最近、本業が忙しい…。
これからMSXでプログラミングを始める方(いるのか?)用に始めた「Laboratory」ですが、サンプルプログラム作りがなかなか厳しいです。
サンプルなので、適当に簡単なものを用意すればいいところを、なんか変なところに拘って制作に時間かかってしまう…。
ただでさえ会社からの帰宅時間が遅いのに、そこから更に遅くなって深夜まで制作していることも多くなってきました…。
しかも同時進行で3DダンジョンRPG制作もやっているので、一層遅れてしまう…。
うーん、一気にコンテンツ広げすぎました…。
ちょっと整理しますね。
Laboratoryはここで止めるのは切りが悪いので、テーマ??6までは進めます。
(サンプルプログラムがほぼ完成間近なので…。)
テーマ??6公開後、そこで一旦止めてゲーム制作に集中します。
(まぁ、MSXプログラミングの勘を戻すための習作として始めた3DダンジョンRPGですが、実のところLaboratoryのサンプルプログラム製作でほぼ勘は戻ってますが…。)
そしてゲーム完成後に、テーマ??7以降を再開することとしますね。
2023年06月25日
作品?H「平安京エイリアン」
次はこれ。
「平安京エイリアン」を作ってみました。
前作で、やっとSPRITEを使ったのに、今作でまた使わないという…。
友人の依頼で懐かしいゲームを真似て作りました。
個人レベルの模写で、利益も得ていないけど著作権てどうなるのかな?
「平安京エイリアン」を作ってみました。
■主な新テクニック
・復活時無敵モード実装
・移動方向を向く自機キャラクタを実装
・復活時無敵モード実装
・移動方向を向く自機キャラクタを実装
前作で、やっとSPRITEを使ったのに、今作でまた使わないという…。
友人の依頼で懐かしいゲームを真似て作りました。
個人レベルの模写で、利益も得ていないけど著作権てどうなるのかな?
タイトル
『 エイリアン 』
作品??
9
内容
街に現れたエイリアンを、自機を操作し穴を掘り、エイリアンが落ちたところを素早く埋めて退治して下さい。
操作方法
起動し、しばらくしてタイトルが表示されたら、十字キーでプレイヤー数を選択し、Aボタンで決定
2プレイヤーを選択すると、コントローラーの選択となりますので、それぞれのプレイヤーが使用するコントローラーのAボタンを押し、ゲーム開始
十字キーで、自機移動
Aボタンで、穴掘り
Bボタンで、穴埋め対応機種
MSX1、MSX2、MSX2+
製作年
1988年
ライセンス
平安京エイリアンは株式会社ハイパーウェアの登録商標です。
※ゲーム内のキャラクタ、音楽は制作当時の物です。
公開前提に製作していないため、雑誌等から流用している物もあるかも知れませんので、著作権侵害の恐れのあるものは、ご連絡をお願いします。2023年06月24日
2023年06月23日
Laboratoryテーマ??4「マシン語の平方根の求め方」
さて、今回はLaboratoryテーマ??4「マシン語の平方根の求め方」です。
マシン語での平方根の求め方の考え方とロジックは、HRAさんのホームページで詳しく解説されているのでご覧ください。
トップページから「MSX関連」—「Z80 Coding Tips」—「[2020年8月16日] Z80で平方根を求めるには?」にあります。
平方根の求め方のサンプルプログラムです。
「HEISMPL.BAS」【 ダウンロード 】
マシン語での計算結果と、検算用にBASICで単純計算した結果を列記します。
マシン語のサンプルです。
起動すると、HEIHOU.BINを作成します。
1個8ビット変数を利用しているので、サブルーチンとしてアドレス変更する際は、そこの変更を忘れないように気を付けてください。(&HBF87:3ヵ所)
IN
OUT
BC
平方根を求める値
A
平方根
「HEIHOU.BAS」【 ダウンロード 】
マシン語のサブルーチンとして必要なのは&HBF30~&HBF67までです。
&HBF68~&HBF77は計算元値を代入してサブルーチンコールします。
では、次回はLaboratoryテーマ??5「16ビットアドレス値の10進数表示」です。
2023年06月22日
Laboratoryテーマ??3「マシン語の割り算」
さて、今回はLaboratoryテーマ??3「マシン語の割り算」です。
マシン語での割り算の考え方とロジックは、HRAさんのホームページで詳しく解説されているのでご覧ください。
トップページから「MSX関連」—「Z80 Coding Tips」—「[2020年8月15日] Z80で除算するには?」にあります。
割り算のサンプルプログラムです。
「WARISMPL.BAS」【 ダウンロード 】
マシン語での計算結果と、検算用にBASICで単純計算した結果を列記します。
マシン語のサンプルです。
起動すると、WARIZAN.BINを作成します。
IN
OUT
A
割られる数
D
商
B
割る数
E
余り
「WARIZAN.BAS」【 ダウンロード 】
マシン語のサブルーチンとして必要なのは&HBF00~&HBF17までです。
&HBF18~&HBF27は計算元値を代入してサブルーチンコールします。
では、次回はLaboratoryテーマ??4「マシン語の平方根の求め方」です。
2023年06月21日
Laboratoryテーマ??2「マシン語の掛け算」
さて、今回はLaboratoryテーマ??2「マシン語の掛け算」です。
マシン語での掛け算の考え方とロジックは、HRAさんのホームページで詳しく解説されているのでご覧ください。
トップページから「MSX関連」—「Z80 Coding Tips」—「[2020年8月15日] Z80で乗算するには?」にあります。
掛け算のサンプルプログラムです。
「KAKESMPL.BAS」【 ダウンロード 】
マシン語での計算結果と、検算用にBASICで単純計算した結果を列記します。
マシン語のサンプルです。
起動すると、KAKEZAN.BINを作成します。
IN
OUT
A
掛けられる数
HL
積
B
掛ける数
「KAKEZAN.BAS」【 ダウンロード 】
マシン語のサブルーチンとして必要なのは&HBF18~&HBF2Fまでです。
&HBF30~&HBF3Fは計算元値を代入してサブルーチンコールします。
では、次回はLaboratoryテーマ??3「マシン語の割り算」です。