ユーザ用ツール

サイト用ツール


フルーツフィールド_for_pc-6001mkii

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
フルーツフィールド_for_pc-6001mkii [2020/12/10 10:58] – [タイマー割込み] arakiフルーツフィールド_for_pc-6001mkii [2022/09/15 18: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|出力:A(ビットマップ)| |キー入力|1061H|出力:A(ビットマップ)|
 +|ジョイパッド入力|1CA6H|出力:A(ビットマップ)|
 |キー入力|0FBCH|出力:A=文字コード| |キー入力|0FBCH|出力:A=文字コード|
 |キーバッファクリア|1058H| |キーバッファクリア|1058H|
行 179: 行 180:
 |ロード用ファイル名エリア|FED1H-FED6H|6bytes| |ロード用ファイル名エリア|FED1H-FED6H|6bytes|
 |キークリック音|FA2DH|0:OFF/1:ON| |キークリック音|FA2DH|0:OFF/1:ON|
 +
 +==== 開発環境 ====
 +
 +フルーツフィールドは、ローダの書き込みにN60m-BASICを利用している以外は、すべてアセンブラで開発されています。
 +コードエディターはVisual Studio Codeを、アセンブラを含む開発ツール一式は、WSL2の上に展開したUbuntu上に用意しています。
 +アセンブラは[[https://github.com/Megatokio/zasm|ZASM]]です。
 +普通に、''git clone https://github.com/Megatokio/zasm.git'' して、ビルドしてあります。
 +MINGWなどで、Windows版を用意してもいいかと思いますが、WSL2は慣れるともう戻れないですね。
 +Windowsネイティブのバイナリが必要でないなら、WSL2で十分だし、便利だと思います。
 +
 +WSL2はWindowsとのファイルの交換が容易なので、ビルドしたコードを即座にWindows上のエミュレータに送り込むことができます。
 +WSL2側からは ''/mnt/<ドライブ名>/<パス>''で、Windows側からは ''\\wsl$\Ubuntu\<パス>''でそれぞれ、互いのファイル空間にアクセス可能です。
  
 ==== ローダー  ==== ==== ローダー  ====
行 612: 行 625:
 PSGの操作は、ポート''A0H''にレジスタ番号を出力して選択したレジスタに対して、ポート''A1H''経由で値を出力するという手順で行います。 PSGの操作は、ポート''A0H''にレジスタ番号を出力して選択したレジスタに対して、ポート''A1H''経由で値を出力するという手順で行います。
 このレジスタの選択からデータの出力までの間に割込みが入って、向こう側でもPSGをたたいてくれると、こちらで選択したはずのレジスタじゃないものが選ばれた状態で帰ってくる可能性があります。 このレジスタの選択からデータの出力までの間に割込みが入って、向こう側でもPSGをたたいてくれると、こちらで選択したはずのレジスタじゃないものが選ばれた状態で帰ってくる可能性があります。
 +これが消音 -- ボリューム0を出力する処理 -- の最中に来たら、意図しないレジスタに0を出力してしまい、期待しない作用を引き起こす可能性がありますし、肝心のレジスタに0が出ずに音が止まらないということになります。
 +ビープ音鳴りっぱなしはエラー感、バグバグ感たっぷりでいただけません。
  
 なので、最初に試したのが、レジスタの選択からデータの出力までの区間を割込み禁止 -- ''di''~''ei''で括る -- です。 なので、最初に試したのが、レジスタの選択からデータの出力までの区間を割込み禁止 -- ''di''~''ei''で括る -- です。
行 701: 行 716:
 なので、フルーツフィールド内でも同様にしていますが、とりあえず問題は起きてないので良いことにしておきます。 なので、フルーツフィールド内でも同様にしていますが、とりあえず問題は起きてないので良いことにしておきます。
  
 +==== キー入力とジョイパッド ====
 +
 +PC-6001にはゲーム用のキー入力ルーチンがあり、Aレジスタにビットマップ値でキー入力を返してくれます。
 +フルーツフィールドでもこれを利用していますが、[[DevTerm]]についているジョイパッドに対応するために、ジョイパッドの入力を拾うルーチンも呼び出す必要が発生しました。
 +このルーチンもジョイパッドの操作をAレジスタにビットマップとして返してくれるのですが、このマッピングが、キー入力のそれと違うのです。
 +NECは何を考えて異なるビットマップを返すようにしたのでしょう?
 +
 +^-^0^1^2^3^4^5^6^7^
 +|キー|SHIFT|STOP|↑|↓|→|←|-|SPACE|
 +|ジョイパッド|↑|↓|←|→|A|B|-|-|
 +
 +上のようなビットマップなんです。
 +いやらしいのは、そもそも方向とトリガー相当のもののマッピングがずれているし、右左が逆になっていたりするところ。
 +
 +都度、それぞれの処理を書くのは面倒なので、既に、キー入力に合わせて処理を組んでいるので、ジョイパッドの入力をキー入力に合わせるように変換するコードを書いて、対応しました。
 +
 +<code>
 +;;; gamekeypad
 +gamekeypad:
 +        call    gamekey
 +        and     a
 +        ret     nz        ; キー入力があったら戻る
 +
 +        ld      a,1       ; ジョイパッド#1からの入力を見る
 +        call    joystick
 +        and     a
 +        ret             ; 何も押されてなければ戻る
 +        push    bc
 +        ld      b,0
 +        ld      c,a
 +        rlc             ; 左に1bitローテートして 10hでマスクして→を取り出す。  |-|-|-|-|→|-|-|-|
 +        ld      a,10h
 +        and     c
 +        ld      b,a
 +        rlc             ; 左に1bitローテートして 0chでマスクして↑↓を取り出す。 |-|-|↑|↓|-|-|-|-|
 +        ld      a,0ch
 +        and     c
 +        or      b
 +        ld      b,a
 +        rlc             ; 左に1bitローテートして 0a3hでマスクして←とABを残す。 |B|-|-|-|-|←|-|A|
 +        ld      a,0a3h
 +        and     c
 +        or      b                                                              |B|-|↑|↓|→|←|-|A|
 +        pop     bc
 +        ret
 +</code>
 ===== 技術的ではないボヤキのようなもの  ===== ===== 技術的ではないボヤキのようなもの  =====
  
フルーツフィールド_for_pc-6001mkii.1607565538.txt.gz · 最終更新: 2020/12/10 10:58 by araki