2024年03月17日
Laboratoryテーマ7「水平ライン4枚(MSX2は8枚)を超えてSPRITEを表示させたい」そのB
Laboratoryテーマ7「水平ライン4枚(MSX2は8枚)を超えてSPRITEを表示させたい」そのBです。
前回、実際に点滅する仕組みを作りましたが、ゴミが表示されるため、その解消法を検討します。
これも例えば、表スプライトアトリビュートテーブル(&H1B00)表示中に、裏スプライトアトリビュートテーブル(&H1C00)を書き換え、裏の書換えが終わったところで、表裏のスプライトアトリビュートテーブルのアドレスを書き換える(ページングと呼ばれる手法。)など、いくつかの方法があります。
しかし、シャッフルしながらVRAMへ転送をかけていると、タイミング取りの「NOP」の余り時間が無駄になり積み重なるとそれなりの無駄時間になります。
そこで、私のやり方は仮想スプライトアトリビュートテーブル(&HC900)とは別に、シャッフル用の仮想スプライトアトリビュートテーブル(&HC980)をもう一個用意します。
仮想スプライトアトリビュートテーブルからシャッフル用仮想スプライトアトリビュートテーブルに、メモリ上でシャッフル処理を行い、シャッフルした結果をニーモニックでいうところの「OTIR」命令(連続転送)でVRAM上のスプライトアトリビュートテーブルに一括転送します。
VRAMを扱うのはこの一括転送時のみ、シャッフル処理もメモリ間で行うため、早いです。
ただ、128バイト余分にメモリを消費します。
メモリに余裕があるゲームを作るならこちらがお奨めです。
メモリがない時は、上記ページングでやるしかないかな?
これで綺麗に表示されるようになりました。
このロジックを走査線割込みの中に組み込めば、普通にゲームを作るだけでSPRITEが水平方向に5枚以上並べば勝手に点滅してくれます。
1/60毎に毎回128バイトVRAMへ転送しているとは思えない速度ですよね。
走査線割り込みを使用したサンプルプログラムです。
「SPRITE.BAS」【ダウンロード】
戦闘機を動かす部分、スペースバーで全機止まります。
BASIC部です。
これで、横スクロールアクションも作れるようになりました。
2024年03月16日
Laboratoryテーマ7「水平ライン4枚(MSX2は8枚)を超えてSPRITEを表示させたい」そのA
Laboratoryテーマ7「水平ライン4枚(MSX2は8枚)を超えてSPRITEを表示させたい」そのAです。
前回、素数入替法の説明をしましたので、具体的にプログラムを組んでいきます。
このSPRITE面の入替は常時行っています。
よって、処理が早くないとゲーム全体の速度に影響します。
そこで、処理の遅い「BIOS」は使いません。
ニーモニックでいうところの「OUT」命令などを使います。
HRAさんのページに「スプライトが5枚以上並んだときに点滅表示で擬似的に5枚以上見えるようにする方法」の具体的なロジックの説明がありましたので(流石です。)、それを基に組んでみました。
まず、メモリ上に仮想スプライトアトリビュートテーブルを用意します。
この仮想スプライトアトリビュートテーブルから素数入替法に則り、VRAM上のスプライトアトリビュートテーブルへ1面につき4バイトずつシャッフルしながら32面分転送していきます。
こちらがその結果。
点滅はしていますが、それ以外のところにもなんだかゴミみたいなものが表示されてる…。
これはVDPの表示期間中にVRAM上のスプライトアトリビュートテーブルを書き換えると、意図しない中途半端な状態で表示が実行されてしまうためです。
では、次回は解消方法を検討します。
2024年03月15日
Laboratoryテーマ7「水平ライン4枚(MSX2は8枚)を超えてSPRITEを表示させたい」その@
「3Dダンジョンロールプレイングゲーム」完成後に、Laboratoryテーマ7「水平ライン4枚(MSX2は8枚)を超えてSPRITEを表示させたい」をする予定だったのですが、余りにも時間空け過ぎてすっかり忘れてました。
Laboratoryテーマ7「水平ライン4枚(MSX2は8枚)を超えてSPRITEを表示させたい」です。
MSX1で横スクロールのシューティングゲームやアクションゲームを作る際には、必須の機能です。
MSX1のSPRITE機能は非常に便利ですが、1枚につき1色であったり、水平方向に4枚までしか表示できないなど、制約が多いです。
特に問題なのは、後者「水平方向に4枚までしか表示できない」の方で、シューティングゲームの敵の弾とか見えなくなってはゲームになりません。
SPRITEはFONTを表示するテキスト面の前に、32枚分の表示面があり前から0面〜31面となります。
水平方向に5枚以上並んだ時は、面番号が小さい面が優先し表示されます。
(SPRITE面11、2、4、14、25、8と6枚並んだ時は、11、2、4、8が表示される。)
そこで、水平方向に5枚以上並んだ時に点滅させて疑似的に5枚以上表示させる方法がよく見られます。
全く見えなくなるよりは、点滅して見難くても見えた方が良いですよね。
やり方はルールに則って、SPRITEの表示面を入替えるだけです。
その方法で有名なのが「素数入替法」。
あるキャラクタを表示する時、どの表示面に表示するかの決定に、素数を利用する方法です。
0面から開始して、例えば17を足して32以上になったら32引くようにしていくと、32面目で元の数字に戻ります。(下表の「表示素数」)
面白いですね。
これを利用すると、例えば自機を表示する時、初回は0面に表示、次は17面、次は2面...となり、優先順位が高くなったり低くなったりで点滅すると言う訳です。
(キャラクタ側の面は+1でも良いのですが、こちらも別の素数でやるとバラけていい感じに点滅します。)
この方法の良いところは、何と言っても加算だけで表示面を決められること。
ただでさえメモリ→VRAM間の転送は遅いのに、その転送準備に時間をかけると、処理速度がどんどん遅くなってしまいます。
シャッフルするのに乱数や乗除算を使うと、毎回32回ループすることを考えるとマシン語とは言え負荷が大きいです。
因みに、この方法は1例です。
拙作「PAC-MAN」はこれとは別の方法で点滅させています。(確か4面単位で後ろにシフトする方法だったと思います。(記憶が薄い。))
自分の好きな方法を使うといいです。
では、次回は具体的に組んでみます。
2024年03月14日
Laboratoryテーマ28「マシン語でフロッピーディスクを制御したい」そのA
今回は、Laboratoryテーマ28「マシン語でフロッピーディスクを制御したい」そのAです。
マシン語で、フロッピーディスクからメモリへの読込と、メモリからフロッピーディスクへの書出を行うサンプルプログラムです。
「DISK.BAS」【ダウンロード】
読み込み時は、前回説明した「FCB」にドライブ番号と、ファイル名、拡張子をセットし「&H0F」でシステムコール(&HF37D)。
フロッピーディスク内にあるファイルから「FCB」にファイル情報が読み込まれます。
ファイルの読み込み先アドレスをセットし、「&H1A」でシステムコール。
「FCB」に読み込みに必要な情報をセットし、「&H27」でシステムコール。
書き出し時は、「FCB」にドライブ番号と、ファイル名、拡張子をセットし「&H16」でシステムコール。
フロッピーディスクに新たなファイルが作成されます。(強制上書)
メモリの書き出し元アドレスをセットし、「&H1A」でシステムコール。
「FCB」に書き出しに必要な情報をセットし、「&H26」でシステムコール。
書き出し時は、最後に「&H10」でシステムコールし、ファイルを閉じます。
簡単です。
BASIC部です。
2024年03月13日
Laboratoryテーマ28「マシン語でフロッピーディスクを制御したい」その@
今回は、Laboratoryテーマ28「マシン語でフロッピーディスクを制御したい」その@です。
以前にも書きましたが、私は過去作品でマシン語からフロッピーディスクを制御したことがありません。
完成品、未完成品含めすべてです。
フロッピーディスクからデータを読む必要がある時は、「3Dダンジョンロールプレイングゲーム」でやっていた通り、一旦BASICに戻っていました。
特にそれで不便を感じませんでしたし、不都合もありませんでした。
でも、やはりマシン語からBASICへ戻るには、コール内からは直接戻れないし、スタックポインタも全てクリアしないといけないなど制約が多いのも確か。
そこで、Laboratoryのテーマにあげました。
しかし、私自身知識が全くないので、あちこちのサイトやブログを探し回りましたが、フロッピーディスク制御に関して詳しく書かれたところは見つかりませんでした。
やむなく、「MSX2 TEchnical Hand Book」とにらめっこ。
今まで聞いたことのない専門用語が多く、本の解説も上級者向けの為、なかなか理解できませんでした。
それこそ「トライ&エラー」の連続でした。
そして何十回目かのトライで、これまでの努力が実り、やっと成功しました。
泣きそう…。
このロジックが「3Dダンジョンロールプレイングゲーム」や「無人島脱出アドベンチャーゲーム」で使えていれば、「BE」や「SC」、「SV」スクリプト命令がもっと簡単に組めていたかと思います。
今回はDISK-BASICから「FCB」(ファイルコントロールブロック)を利用して、ファイル名で読み書きできる方法を採用しました。
「FCB」は37バイトで、構成は下表の通り。
0 | ドライブ番号 |
1〜8 | ファイル名 |
9〜11 | 拡張子 |
12〜13 | カレントブロック |
14〜15 | レコードサイズ(1〜65535) |
16〜19 | ファイルサイズ(1〜4294967296) |
20〜21 | 日付 |
22〜23 | 時刻 |
24 | デバイスID |
25 | ディレクトリロケーション |
26〜27 | ファイルの開始クラスタ番号 |
28〜29 | 最後にアクセスしたクラスタ番号 |
30〜31 | ファイルの先頭クラスタからの相対位置 |
32 | カレントレコード |
33〜36 | ランダムレコード |
システムコールはファンクション番号をCレジスタに設定し、下表アドレスをコール
DISK-BASIC | &HF37D |
MSX-DOS | &H0005 |
ファンクション番号は下表の通り。
&H00 | システムリセット |
&H01 | コンソールから 1 文字入力 (入力待ちあり、エコーバックあり、コントロールコードチェックあり) |
&H02 | コンソールへ 1 文字出力 |
&H03 | 補助入力装置から 1 文字入力 |
&H04 | 補助出力装置へ 1 文字出力 |
&H05 | プリンタへ 1 文字出力 |
&H06 | コンソールから 1 文字入力 (入力待ちなし、エコーバックなし、コントロールコードチェックなし) / 1 文字出力 |
&H07 | コンソールから 1 文字入力 (入力待ちあり、エコーバックなし、コントロールコードチェックあり) |
&H08 | コンソールから 1 文字入力 (入力待ちあり、エコーバックなし、コントロールコードチェックあり) |
&H09 | 文字列出力 |
&H0A | 文字列入力 |
&H0B | コンソールからの入力チェック |
&H0C | バージョン番号の獲得 |
&H0D | ディスクリセット |
&H0E | デフォルト・ドライブの選択 |
&H0F | ファイルのオープン |
&H10 | ファイルのクローズ |
&H11 | ワイルドカードに一致する最初のファイルの検索 |
&H12 | ワイルドカードに一致する 2 番目以降のファイルの検索 |
&H13 | ファイルの抹消 |
&H14 | シーケンシャルなファイルの読み出し |
&H15 | シーケンシャルなファイルの書き込み |
&H16 | ファイルの作成 |
&H17 | ファイル名の変更 |
&H18 | ログイン・ベクトルの獲得 |
&H19 | デフォルト・ドライブ名の獲得 |
&H1A | DMA アドレスの設定 |
&H1B | ディスク情報の獲得 |
&H1C〜&H20 | 無効 |
&H21 | ランダムなファイルの読み出し |
&H22 | ランダムなファイルの書き込み |
&H23 | ファイルサイズの獲得 |
&H24 | ランダムレコード・フィールドの設定 |
&H25 | 無効 |
&H26 | ランダムブロック書き込み |
&H27 | ランダムブロック読みだし |
&H28 | ランダムなファイルの書き込み (不要部を 00H で埋める) |
&H29 | 無効 |
&H2A | コンソールから 1 文字入力 (入力待ちあり、エコーバックあり、コントロールコードチェックあり) |
&H01 | 日付の獲得 |
&H2B | 日付の設定 |
&H2C | 時刻の獲得 |
&H2D | 時刻の設定 |
&H2E | ベリファイ・フラグの設定 |
&H2F | 論理セクタの読み出し |
&H30 | 論理セクタの書き込み |
例えば、ファイル読込は一旦ファイル名を設定しシステムコール(&H0F)し、読込先アドレスを設定し再度システムコール(&H1A)、必要な設定を追加して三度システムコール(&H27)することで読込み出来ます。
出来てしまえば非常に単純で簡単でした。
次回、サンプル公開しますね。
2024年03月12日
細かく修正S
「ダウンロード」の「新作」に、新規公開した「無人島からの脱出」記事へのリンク追加。
先日、「ゲーム制作」のタイトルメニューを製作したので、トップページのグローバルメニューの飛び先をそちらに変更しました。
同じく「Laboratory」の飛び先も、テーマメニューページに変更しました。
(カテゴリ全記事は右サイドバーにある「カテゴリーアーカイブ」から参照できます。)
「Laboratory」のテーマメニューに新しく1テーマを追加。
「ゲーム制作」の「無人島脱出アドベンチャーゲーム」の前後回へのリンク切れがあったので修正。
それ以外は、画像の貼り直しや、記事の誤記の修正程度です。
2024年03月11日
ゲーム制作メニュー
2024年03月10日
Laboratory新テーマ追加
「ゲーム制作」カテゴリで制作していた「3Dダンジョンロールプレイングゲーム」制作中に「やります」と言っていた、マシン語からフロッピーディスクを制御する方法です。(2023年10月10日記事参照「マシン語からのファイル制御」)
私自身過去作でやった事がないので、本当の意味での「Laboratory」です。
年齢のせいか、新しいことを覚えるのが最近億劫になってきたのですが、ここはひとつ気張って頑張ります。
テーマ | ||||
28 | マシン語でフロッピーディスクを制御したい |
フロッピーディスク何枚組とかの、大規模なゲームを作成する時には必要な機能ですね。
2024年03月09日
【ゲーム制作】無人島脱出アドベンチャーゲーム あとがき
無人島脱出アドベンチャーゲーム あとがき
MSX1でグラフィックに力を入れたゲームと言う事で、アドベンチャーゲームを作りましたが、いかがだったでしょう?
難解な謎もなく、あちこち動き回ってアイテムを集めるだけなので、アドベンチャーゲームと言うよりは、ロールプレイングゲームに近いかも。
最近のアドベンチャーゲームは、背景画像上に人物を表示して、誰と誰が会話しているか解り易くしています。
出来ればそれやりたいのですが、MSX1でやろうとするとディスクのロード、回数も時間も半端ないと思います。
ディスク読み込み時間を飛ばせるエミュレータ(例えばBlueMSX)でプレイすれば、全く気にならないでしょうが、実機だとストレスあるかも?
まぁ、一度チャレンジしてみても良いかも知れませんね。
さて、今作製作開始から1カ月強で完成しました。
私の限られた開発時間でも、このレベルの物なら大量生産可能ですね。(しないけど…。)
しかし、一番時間が掛かったのが、グラフィックの加工…、と、思いきや、実は素材集めでした。
当然ですが、フリー素材なだけに、思い通りの写真がない。
そこは最終、あちこちの写真の切り貼りで作成するしかない。
でもMSX1にコンバートすると、元写真と大きくかけ離れてしまい、元画像がどれか分からなくなるものもあり、そんな画像は著作権表示いるかな?と、思ってしまいました。(素晴らしい元素材の提供者に申し訳なくて…。)
開発時間の配分は大体…、
・素材集め:2週間
・写真加工:5日
・BGM作曲:3日
・他作業(設計、プログラミング、スクリプト組み等):10日
こんな感じです。
1日の作業時間は大体1〜2時間、休みの日で4〜5時間です。(ブログ更新の作業時間込み。)
設計からプログラミング、スクリプト組みまで、全てで10日程度…。
こちらは前作のベースがあるので早いですね。
次回アドベンチャーゲームを作る事があるなら、探偵モノ(推理モノ)にチャレンジしたいですね。
次回作については、また、少し休憩してから考えたいと思います。
今の気分だと「アクションゲーム」が有力かな?
「ゲーム開発再開するなら「ケベロン」シリーズ!」って思ってたんだけど、本格再開に至っていないので、どうしよう…。(2023年4月22日記事参照「ゲームデータが見付からない…」)
そういえば「Laboratory」のテーマがいくつか放りっぱなしになっているので、そちらもしていかないとですね。
2024年03月08日
【ゲーム制作】無人島脱出アドベンチャーゲーム 公開
「ゲーム制作」カテゴリで制作していた無人島脱出アドベンチャーゲームが完成しました!
フリー写真素材と「BMP to MSX」をフル活用した習作となります。
MSX1でグラフィック重視のゲームって珍しいですよね。
▲タイトル画面
■主な新テクニック
・MSX1で初アドベンチャーゲーム
・「BMP to MSX」使用による全場面・全画面グラフィック
・MSX1で初アドベンチャーゲーム
・「BMP to MSX」使用による全場面・全画面グラフィック
写真を「BMP to MSX」でコンバートするための1次加工について、試行錯誤の末良い感じに出来るようになったと思います。
次回は推理ものを作りたいな。
▲コマンド選択画面
▲フル画像画面
タイトル | 『 無人島からの脱出 』 | 新作 | 2 | |
ストーリー | 船旅の途中嵐に合い、無人島に流されてきた主人公が、無人島から脱出するために冒険する。 | |||
操作方法 | ■タイトル画面 タイトルで、「スペース」バー若しくはAボタンでゲーム開始 以降、開始したコントローラーでのみ操作可能です ■共通操作 ・メニューウィンドウ 「↑」「↓」:「」を動かし選択 「スペース」バー若しくはAボタン若しくは「→」:決定 「GRAPH」キー若しくはBボタン若しくは「←」:キャンセル メニューウィンドウの上枠に「▲」、下枠に「▼」が表示されたら、その方向にまだ選択項目があります・メッセージ表示後、右下に「▼」が表示されたら「スペース」バー若しくはAボタンで処理進行 | |||
対応機種 | MSX1、MSX2、MSX2+ | 製作年 | 2024年 | |
ダウンロード | リンク先へ | ジャンル | アドベンチャーゲーム | |
ライセンス | 画像出典: 『ゆんフリー写真素材集』 https://yunphoto.net/jp/jouken.html |
※ゲーム内のキャラクタ、音楽は制作当時の物です。 公開前提に製作していないため、雑誌等から流用している物もあるかも知れませんので、著作権侵害の恐れのあるものは、ご連絡をお願いします。 |