フルーツフィールド_for_pc-6001mkii
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| フルーツフィールド_for_pc-6001mkii [2020/12/10 01:57] – [タイマー割込み] araki | フルーツフィールド_for_pc-6001mkii [2022/09/15 09:40] (現在) – [キー入力とジョイパッド] araki | ||
|---|---|---|---|
| 行 137: | 行 137: | ||
| * 2020/11 初版 | * 2020/11 初版 | ||
| * 2020/12/09 BGMを鳴らすようにした。 | * 2020/12/09 BGMを鳴らすようにした。 | ||
| + | * 2020/12/10 ゲーム中の効果音もタイマー割込み側でならすように変更した。 | ||
| ===== 技術資料 | ===== 技術資料 | ||
| ==== メモリーマップ | ==== メモリーマップ | ||
| 行 163: | 行 163: | ||
| |グラフィックエリア|6000H-7FFFH| | |グラフィックエリア|6000H-7FFFH| | ||
| |キー入力|1061H|出力: | |キー入力|1061H|出力: | ||
| + | |ジョイパッド入力|1CA6H|出力: | ||
| |キー入力|0FBCH|出力: | |キー入力|0FBCH|出力: | ||
| |キーバッファクリア|1058H| | |キーバッファクリア|1058H| | ||
| 行 179: | 行 180: | ||
| |ロード用ファイル名エリア|FED1H-FED6H|6bytes| | |ロード用ファイル名エリア|FED1H-FED6H|6bytes| | ||
| |キークリック音|FA2DH|0: | |キークリック音|FA2DH|0: | ||
| + | |||
| + | ==== 開発環境 ==== | ||
| + | |||
| + | フルーツフィールドは、ローダの書き込みにN60m-BASICを利用している以外は、すべてアセンブラで開発されています。 | ||
| + | コードエディターはVisual Studio Codeを、アセンブラを含む開発ツール一式は、WSL2の上に展開したUbuntu上に用意しています。 | ||
| + | アセンブラは[[https:// | ||
| + | 普通に、'' | ||
| + | MINGWなどで、Windows版を用意してもいいかと思いますが、WSL2は慣れるともう戻れないですね。 | ||
| + | Windowsネイティブのバイナリが必要でないなら、WSL2で十分だし、便利だと思います。 | ||
| + | |||
| + | WSL2はWindowsとのファイルの交換が容易なので、ビルドしたコードを即座にWindows上のエミュレータに送り込むことができます。 | ||
| + | WSL2側からは ''/ | ||
| ==== ローダー | ==== ローダー | ||
| 行 612: | 行 625: | ||
| PSGの操作は、ポート'' | PSGの操作は、ポート'' | ||
| このレジスタの選択からデータの出力までの間に割込みが入って、向こう側でもPSGをたたいてくれると、こちらで選択したはずのレジスタじゃないものが選ばれた状態で帰ってくる可能性があります。 | このレジスタの選択からデータの出力までの間に割込みが入って、向こう側でもPSGをたたいてくれると、こちらで選択したはずのレジスタじゃないものが選ばれた状態で帰ってくる可能性があります。 | ||
| + | これが消音 -- ボリューム0を出力する処理 -- の最中に来たら、意図しないレジスタに0を出力してしまい、期待しない作用を引き起こす可能性がありますし、肝心のレジスタに0が出ずに音が止まらないということになります。 | ||
| + | ビープ音鳴りっぱなしはエラー感、バグバグ感たっぷりでいただけません。 | ||
| なので、最初に試したのが、レジスタの選択からデータの出力までの区間を割込み禁止 -- '' | なので、最初に試したのが、レジスタの選択からデータの出力までの区間を割込み禁止 -- '' | ||
| 行 620: | 行 635: | ||
| 多分BGMがおかしなことになるでしょう。 | 多分BGMがおかしなことになるでしょう。 | ||
| - | '' | + | '' |
| + | 大体、レジスタを選択してからワークエリアを更新するまでの間に割り込まれたら何の解決にもありません。 | ||
| 割込みでPSGを操作して戻るときにチャンネルAの音量を0にするというのはよさげにも思えましたが、場合によっては音が鳴らないかもしれません。 | 割込みでPSGを操作して戻るときにチャンネルAの音量を0にするというのはよさげにも思えましたが、場合によっては音が鳴らないかもしれません。 | ||
| 行 700: | 行 716: | ||
| なので、フルーツフィールド内でも同様にしていますが、とりあえず問題は起きてないので良いことにしておきます。 | なので、フルーツフィールド内でも同様にしていますが、とりあえず問題は起きてないので良いことにしておきます。 | ||
| + | ==== キー入力とジョイパッド ==== | ||
| + | |||
| + | PC-6001にはゲーム用のキー入力ルーチンがあり、Aレジスタにビットマップ値でキー入力を返してくれます。 | ||
| + | フルーツフィールドでもこれを利用していますが、[[DevTerm]]についているジョイパッドに対応するために、ジョイパッドの入力を拾うルーチンも呼び出す必要が発生しました。 | ||
| + | このルーチンもジョイパッドの操作をAレジスタにビットマップとして返してくれるのですが、このマッピングが、キー入力のそれと違うのです。 | ||
| + | NECは何を考えて異なるビットマップを返すようにしたのでしょう? | ||
| + | |||
| + | ^-^0^1^2^3^4^5^6^7^ | ||
| + | |キー|SHIFT|STOP|↑|↓|→|←|-|SPACE| | ||
| + | |ジョイパッド|↑|↓|←|→|A|B|-|-| | ||
| + | |||
| + | 上のようなビットマップなんです。 | ||
| + | いやらしいのは、そもそも方向とトリガー相当のもののマッピングがずれているし、右左が逆になっていたりするところ。 | ||
| + | |||
| + | 都度、それぞれの処理を書くのは面倒なので、既に、キー入力に合わせて処理を組んでいるので、ジョイパッドの入力をキー入力に合わせるように変換するコードを書いて、対応しました。 | ||
| + | |||
| + | < | ||
| + | ;;; gamekeypad | ||
| + | gamekeypad: | ||
| + | call gamekey | ||
| + | and a | ||
| + | ret | ||
| + | |||
| + | ld a,1 ; ジョイパッド# | ||
| + | call joystick | ||
| + | and a | ||
| + | ret | ||
| + | push bc | ||
| + | ld b,0 | ||
| + | ld c,a | ||
| + | rlc | ||
| + | ld a,10h | ||
| + | and c | ||
| + | ld b,a | ||
| + | rlc | ||
| + | ld a,0ch | ||
| + | and c | ||
| + | or b | ||
| + | ld b,a | ||
| + | rlc | ||
| + | ld a,0a3h | ||
| + | and c | ||
| + | or b |B|-|↑|↓|→|←|-|A| | ||
| + | pop bc | ||
| + | ret | ||
| + | </ | ||
| ===== 技術的ではないボヤキのようなもの | ===== 技術的ではないボヤキのようなもの | ||
フルーツフィールド_for_pc-6001mkii.1607565458.txt.gz · 最終更新: by araki
