Famicom/NES

※このページは「すずめ愛好会」のアーカイブ
http://web.archive.org/web/20050214063019/http://suzume.net/
から復元したものです。


1.開発環境


開発にはアセンブラを使います。
6502用のアセンブラならどれを使っても問題ないと思いますが、NES用に開発されたアセンブラがあるのでそれを使いましょう。
ネットで探せば見つかると思いますが、サイズが小さいので
ここにも置いておきます。
ファミコンエミュレータのROMイメージで使われているINES形式のバイナリを直接吐き出すことができます。
サンプルソースも入ってるので一通り見ておきましょう。

INES形式ファイルのヘッダ情報も一緒に入っているので、他のアセンブラで作ったプログラムをエミュレータで動かすときは参考にしてください。



2.CPU


ファミコンのCPUは6502カスタムで、6502+サウンドチップといった感じです。
コア部分は6502とほとんど同じなので、ネットで探せばいい資料がたくさん見つかると思います。
アーキテクチャの詳細などはそちらを参考にしてください(^^;
ここには簡単な説明と命令表だけ書いておきます。



2-1.アーキテクチャ


○レジスタ
Aアキュムレータ。計算などに使うレジスタ。
X, Yインデクスレジスタ。主にメモリアクセスなどに使います。
Sスタックポインタ。スタックのアドレスを保持しておくレジスタ
レジスタは8bitで、スタックエリアは$0100-$01FFの間に取られ、下位8bitが保持されてます。
Pプロセッサステータスレジスタ。計算結果のフラグを保持してるレジスタ。

・ステータスレジスタ詳細
Bit7:ネガティブフラグ。アキュムレータの最上位ビットがセットされます。
Bit6:オーバーフローフラグ。演算結果が127を超えるか-128より小さくなったときにセットされます。
Bit4:ブレイクフラグ。BRKによって割り込み処理が起きたときにセットされます。IRQ割り込みかBRK割り込みかの識別に使います。
Bit3:デシマルモードフラグ。このフラグをセットするとBCD(2進化10進数)モードになります。が、ファミコンのCPUではBCDモードはサポートされてません。
Bit2:インタラプトフラグ。このフラグをセットすると割り込み不許可になります。
Bit1:ゼロフラグ。演算結果が0になるとセットされます。
Bit0:キャリーフラグ。キャリーが発生したときセットされます。また引き算命令ではボローが起きたときは0、起きなかったときは1になります。他にシフトはローテート命令でも使用されます。
○アドレッシングモード
名称書式説明
イミディエート#??値を直接指定
絶対アドレス????アドレスを直接指定
絶対アドレスX????, XアドレスにXレジスタの値を足したアドレスを指定
絶対アドレスY????, YアドレスにYレジスタの値を足したアドレスを指定
ゼロページアドレス??ゼロページ内のアドレスを8bitで指定します。命令長が短くなります。
ゼロページアドレスX??, XゼロページアドレスにXレジスタの値を足したアドレスを指定
ゼロページアドレスY??, YゼロページアドレスにXレジスタの値を足したアドレスを指定
間接アドレス(????)$????番地に入っているデータを指定。(2バイト)
$????番地のデータが下位8bitになり、$????+1番地のデータが上位8bitになります。
間接アドレスX(??, X)??とXレジスタの値を足した値をアドレスとして指定(2バイト)
間接アドレスY(??), Y$00??番地に入ってる値(2バイト)とYレジスタの値を足した値をアドレスとして指定
?は16進数の一桁を表します。??=1バイトです。
ゼロページとは8bitでアクセスできるページで、ファミコンの場合は$0000-$00FFになります。
○割り込み
6502には下の3つの割り込みがあります。
NMIVBlankの時に発生します。NTSCでは1/60秒毎、PALでは1/50秒毎に発生します。
RESET起動時とリセット時に発生します。
IRQ/BRKハードウェア割り込み(IRQ)とソフトウェア割り込み(BRK)によって発生します。
各割り込みが起きたときには特定のメモリにかかれたアドレスにジャンプします。
割り込みから復帰する場合はRTI命令を使います。
ファミコンでの各割り込みで参照されるメモリアドレスは下のようになります。
NMI$FFFA
RESET$FFFC
IRQ/BRK$FFFE



2-2.命令表


A, X, Y, S、Pはレジスタ、
Cはキャリーフラグ、Zはゼロフラグ、Vはオーバーフローフラグ、
Iはインタラプトフラグ、Dはデシマルモードフラグ、
Memはオペランドで指定したアドレスのメモリを表します


○ロード/ストア/レジスタコピー
LDAMem → A
LDXMem → X
LDYMem → Y
STAA → Mem
STXX → Mem
STYY → Mem
TXAX → A
TYAY → A
TAXA → X
TAYA → Y
TXSX → S
TSXS → X
○スタック命令
PHAAをスタックへプッシュ
PHPPをスタックへプッシュ
PLAAをスタックからプル
PLPPをスタックからプル
○演算命令
ADCA + Mem + C → A
SBCA - Mem - ~C → A
ANDA AND Mem → A
ORAA OR Mem → A
EORA XOR Mem → A
INCA + 1 → A
INXX + 1 → X
INYY + 1 → Y
DECA - 1 → A
DEXX - 1 → X
DEYY - 1 → Y
○比較命令
演算結果によるフラグをセットするだけで、結果は保存しない。
CMPA - Mem
CPXX - Mem
CPYY - Mem
BITA AND Mem
○シフト/ローテート
ASL左シフト。Bit0 = 0、C = Bit7、Bit[n] = Bit[n-1]
LSR論理右シフト。Bit7 = 0、C = Bit0、Bit[n] = Bit[n+1]
ROL左ローテート。Bit0 = C、C = Bit7、Bit[n] = Bit[n-1]
ROR右ローテート。Bit7 = C、C = Bit0、Bit[n] = Bit[n+1]
○ステータスビットセット/クリア
CLC0 → C
CLD0 → D
CLI0 → I
CLV0 → V
SEC1 → C
SED1 → D
SEI1 → I
○ジャンプ/条件分岐/サブルーチンコール/復帰
JMP指定アドレスへジャンプ
BCCC = 0のとき指定アドレスへジャンプ
BCSC = 1のとき指定アドレスへジャンプ
BEQZ = 1のとき指定アドレスへジャンプ
BNEZ = 0のとき指定アドレスへジャンプ
BMIN = 1のとき指定アドレスへジャンプ
BPLB = 0のとき指定アドレスへジャンプ
BVSV = 1のとき指定アドレスへジャンプ
BVCV = 0のとき指定アドレスへジャンプ
JSR指定アドレスのサブルーチンへ
RTSサブルーチンから復帰
RTI割り込み処理から復帰
○その他
BRKソフトウェア割り込み
NOP何もしない



2-3.メモリマップ


ファミコンのメモリマップは下のようになってます。
アドレスサイズ内容
$0000$0800RAM
$0800$0800RAM($0000-$07FFのミラー)
$1000$0800RAM($0000-$07FFのミラー)
$1800$0800RAM($0000-$07FFのミラー)
$2000$0008I/Oレジスタ
$2008$1FF8I/Oレジスタ($2000-2007のミラー×$03FF)
$4000$0020I/Oレジスタ
$4020$1FE0拡張ROM用
$6000$2000バックアップRAM用
$8000$4000プログラムROM
$C000$4000プログラムROM
特に$4020-$7FFFはカードリッジに入ってるメモリマップコントラーラ(マッパー)使われ方が違います。
プログラムROMは32KByteのリニアアドレスですが、16KByte単位でバンク切り替えを行うことができます。
切り替え方は搭載されてるマッパーによって違います。
主なマッパーの仕様はこれを見てください。



3.表示機能


ファミコンはBG1面と64個のスプライトが使えます。
BGの解像度は256x240で、8x8のタイルパターンは32x30個並べて作ります。
スプライトは8x8または8x16のパターンを使います。
使える色はBG、スプライト共に64色中16色で、1つのタイルパターンには4色使えます。
64色中4色が4種類持てるといった感じでしょうか。

表示処理はPPU(Picture Processing Unit)が行います。
PPUはCPUとは別のメモリ空間を持っていて、CPUからアクセスする場合はI/Oレジスタを使用します。



3-1.メモリマップ


PPUのメモリマップは下のようになっています。
アドレスサイズ内容
$0000$1000パターンテーブル0
$1000$1000パターンテーブル1
$2000$03C0ネームテーブル
$23C0$0040属性テーブル
$2400$03C0ネームテーブル
$27C0$0040属性テーブル
$2800$03C0ネームテーブル
$2BC0$0040属性テーブル
$2C00$03C0ネームテーブル
$2FC0$0040属性テーブル
$3000$0F00$2000-$2EFFのミラー
$3F00$0010BG用パレット
$3F10$0010スプライト用パレット
$3F20$00E0パレットミラー
$4000$C000$0000-$3FFFのミラー

○パレット
ファミコンは64色16色使えます。
BG、スプライトで使う色をここに格納します。
$3F00が0番パレットの色、$3F01が1番パレットの色・・・となります。
色は6bit(64色)で指定しますが、RGBでの指定ではなくあらかじめ決まっている64色の色の何番目の色を使うか指定します。

$3F20-$3FFFはパレットデータのミラーで、$3F00に書いたデータは$3F10,$3F20,$3F30...$3F08に書いたデータは$3F18,$3F28,$3F38...とミラーリングされます。

○パターンテーブル
BGやスプライトで使うパターンデータのテーブルです。
タイルパターンのサイズは8x8で、256x2個のパターンデータを持てます。
この部分は基本的にROMになっていて書き換えできません。
マッパーによってはバンク切り替えによりそれ以上のパターンを持つことができます。

パターンの色はパレット番号で指定しますが、タイルパターンには下位2bitだけ格納します。
よって1つのタイルパターンのデータは16バイトになり、
データの並びは
1ライン目の下位1bitのビットパターン
2ライン目の下位1bitのビットパターン
・・・
8ライン目の下位1bitのビットパターン
1ライン目の上位1bitのビットパターン
2ライン目の上位1bitのビットパターン
・・・
8ライン目の上位1bitのビットパターン
(例)文字”A”
アドレス(オフセット)データ(16進)データ(2進)表示データ
$0000下位1bitのデータ$1000010000
$0001$0000000000
$0002$4401000100
$0003$0000000000
$0004$FE1111111000010000
00202000
03000300
20000020
11111110
20000020
30000030
00000000
$0005$0000000000
$0006$8210000010
$0007$0000000000
$0008上位1bitのデータ$0000000000
$0009$2800101000
$000A$4401000100
$000B$8210000010
$000C$0000000000
$000D$8210000010
$000E$8210000010
$000F$0000000000

○ネームテーブル
ネームテーブルにはBGのタイルパターンの配置を格納します。
タイル番号(0-255)を32x30の配列にいれます。
この部分はRAMになっていて、CPUからI/Oレジスタを通して変更できます。

4つのネームテーブルがあり、下のような仮想BGを持っています。
ネームテーブル2ネームテーブル3
ネームテーブル0ネームテーブル1
しかし実際は2つ分のメモリしかなく、残りの2つはミラーになります。
ミラーのされ方はカードリッジの種類で変わります。カードリッジにネームテーブル用のRAMを追加し独立した4つのネームテーブルが使えるものもあります。
ミラーのタイプと各ミラーテーブルの実アドレスは下のようになります。
名前ネームテーブル0ネームテーブル1ネームテーブル2ネームテーブル3
水平ミラー$2000$2000$2400$2400
垂直ミラー$2000$2400$2000$2400
4スクリーン$2000$2400$2800$2C00
横スクロールゲームでは垂直ミラー、縦スクロールゲームでは水平ミラーを使うといいです。

○属性テーブル
属性テーブルはネームテーブルで並べられたタイルパターンのパレットの上位2bitを格納します。
1バイトに4x4タイル(32x32ドット)のデータを格納されていて、それが8x8の配列(計64バイト)で並んでいます。
各1バイトデータのビットの内容は下のようになります。
4x4タイルのデータを下のように名前をつけます。
グループ0
タイル0タイル1
タイル2タイル3
グループ1
タイル4タイル5
タイル6タイル7
グループ2
タイル8タイル9
タイルAタイルB
グループ3
タイルCタイルD
タイルEタイルF

この4x4タイルの属性データは下のようになります。
bit0-1グループ0のパレットの上位2bit
bit2-3グループ1のパレットの上位2bit
bit4-5グループ2のパレットの上位2bit
bit6-7グループ3のパレットの上位2bit

すなわち2x2タイルでは同じ4色パレットを使うことになります。



3-2.BGとスプライト


○BG
BGは下のような配置になっていて、そのうちの256x240ドットを表示できます。
ネームテーブル2ネームテーブル3
ネームテーブル0ネームテーブル1
表示エリアはI/Oレジスタ$2000で基準となるネームテーブルを指定し、
I/Oレジスタ$2005でX方向Y方向のスクロール値を指定します。

○スプライト
スプライトのデータは専用のRAMに格納されていて、I/Oレジスタを使ってデータを読み書きできます。
1つのスプライトは4バイトのデータで表され、64個分のデータが並んでます(計256バイト)。
スプライトデータの内容は下のようになってます。
1バイト目Y座標
2バイト目タイルインデクス番号
3バイト目bit7:垂直反転(1で反転)
bit6:水平反転(1で反転)
bit5:BGとの優先順位(0:手前、1:奥)
bit0-1:パレットの上位2bit
(他のビットは0に)
4バイト目X座標
座標はスプライトの左上の座標を指定します。
タイルインデクス番号はサイズが8x8の場合、I/Oレジスタ$2000でパターンテーブルを選びます。
サイズが8x16の場合、偶数がパターンテーブル0、奇数がパターンテーブル1になります。
00だとパターンテーブルの0と1、01だとパターンテーブル1の0と1、02だとパターンテーブル0の2と3・・・となります。
スプライトの優先順位は0が1番手前で、63が1番奥です。



4.パッド入力


パッド入力はI/Oレジスタの$4016と$4017を使います。
パッドによりいろいろ拡張されていますが、基本のパッドの説明だけします。

パッドの入力判定は1ボタンずつ行います。
$4016に1を書きこんだ後0を書きこむとパッド入力がリセットされ、
$4016,$4017のbit0を見ることによって入力判定をします。
何番目がどのパッドのデータを表すかは下のようになります。
1A
2B
3SELECT
4START
5UP
6DOWN
7LEFT
8RIGHT
9-16無効(マルチタップ用)
17-24パッド接続判定



5.サウンド


○サウンド機能
ファミコンは矩形波2チャンネル、三角波1チャンネル、ノイズ1チャンネルの音源を持ってます。
その他Delta Modulation Channel(DMC≒PCM?)を使うことができます。
音はすべて4bitDACにより出力されているので、ボリュームの値は0-15になります。

○矩形波の鳴らし方
波形の設定は$4000(矩形波1用)と$4004(矩形波2用)で行います。
$4000/$4004の内容は下のようになってます。
bit7-6: Dutyサイクル
bit5: 長さカウンタ無効/エンベロープDecayループ
bit4: エンベロープDecay無効
bit3-0: ボリューム/Decayレート
Dutyサイクルの設定(positive/negative)は
00: 2/14(12.5%)
01: 4/12(25%)
10: 8/ 8(50%)
11:12/ 4(75%)
になります。
bit4が1のときDecay(音の減衰)が無効になり、bit3-0のデータがそのままボリュームになります。
bit4が0のときDecayが有効となりbit3-0はDecay速度を表します。bit3-0の値がNのとき、(N+1)/240秒でボリュームが1下がります。
bit5は再生時間の設定フラグで、1のときは自分で出力を止めるまで鳴りつづけます。
0のときはDecay使用時は減衰によってボリュームが0になるか設定した時間($4003,$4007)でストップします。Decay未使用時は設定時間後ストップします。

周波数の設定は$4002,$4006と$4003,$4007のbit2-0の11bitで指定します。
$4002,$4006が下位8bit、$4003,$4007のbit2-0が上位3bitになります。
基本となる周波数はCPUクロック(1.79MHz)で、設定した11bitの数をNとすると、
再生周波数は 1.79MHz / ((N+1)*16)になります。
ただし矩形波の場合Nを8以下に設定できません。
よって再生できる周波数は54.6Hzから12.4KHzになります。

再生時間は$4003,$4007のbit7-3で指定します。
設定値と再生時間の関係は下のようになります。
bit3 = 1
bit7-4再生フレーム
0000$7F
0001$01
0010$02
0011$03
0100$04
0101$05
0110$06
0111$07
1000$08
1001$09
1010$0A
1011$0B
1100$0C
1101$0D
1110$0E
1111$0F
bit3 = 0
bit7-4再生フレーム
0000$05
0001$0A
0010$14
0011$28
0100$50
0101$1E
0110$07
0111$0E
1000$06
1001$0C
1010$18
1011$30
1100$60
1101$24
1110$08
1111$10

スイープの設定は$4001,$4005で行います。
bit7はスイープの有効/無効フラグで、1のときスイープが有効になります。
bit3はスイープ方向の設定で、0のとき波長を長く(音を低く)、1のとき波長を短く(音を高く)します。
bit6-4は変化の速さを指定します。bit6-4で指定した値をNとすると(N+1)/120秒単位でスイープを行います。
bit2-0は変化の大きさを指定します。bit2-0で指定した値をN、$4002/$4003,$4006/$4007で指定した波長をLとすると、変化量は(L >> N)になります。

○三角波の鳴らし方
三角波の波形は0,1,2....D,E,F,F,E,D...2,1,0,0,1,2...のような形になります。
周波数は$400Aを下位8bit、$400Bのbit2-0を上位3bitとする11bitで表し、1.79MHz / ((N+1)*32)が周波数になります。
音の長さは$400Bのbit7-3で表し、内容は矩形波の設定と同じです。
また三角波の場合は音の長さをリニアカウンタで設定することができます。
設定は$4008で行い、bit7が1にセットするとリニアカウンタを使用します。
音の長さはbit6-0で指定し、指定した値をNとすると、N/240秒再生します。
○ノイズの鳴らし方
ノイズは乱数ジェネレータが生成したビットを再生します。
エンベロープの設定や再生時間の設定は矩形波と同じです。
乱数のタイプは32kbitモードと93bitモードがあり、$400Eのbit7で指定します。bit7が0のとき32kbitモードになります。
周波数は$400Eのbit3-0で指定します。この値は11bitの数字に変換され、周波数は1.79MHz / 11bit値になります。
bit3-011bit値音程(オクターブ)
0002A(15)
1004A(14)
2008A(13)
3010A(12)
4020A(11)
5030D(11)
6040A(10)
7050F(10)
8065C(10)
907FA( 9)
A0BED( 9)
B0FEA( 8)
C17DD( 8)
D1FCA( 7)
E3F9A( 6)
F7F2A( 5)
○DMCの鳴らし方



6.I/Oレジスタ


○I/Oレジスタマップ
アドレスRead/Write内容
$2000WPPUコントロールレジスタ1
bit7: VBlank時にNMIを実行(0:実行しない,1:実行する)
bit6: PPUマスター/スレーブセレクト(常に1にする)
bit5: スプライトサイズ(0:8x8,1:8x16)
bit4: BGパターンテーブルアドレス(0:$0000,1:$1000)
bit3: スプライトパターンテーブルアドレス(0:$0000,1:$1000)
bit2: PPUアドレスインクリメント(0:+1,1:+32)
bit1-0: 表示するネームテーブルアドレス番号
$2001WPPUコントロールレジスタ2
bit7-5: bit0=1のとき背景色/bit0=1のとき色強調
000:なし
001:緑
010:青
100:赤
それ以外の数字は不可
bit4: スプライト表示(0:非表示,1:表示)
bit3: BG表示(0:非表示,1:表示)
bit2: スプライトクリップ(0:画面の左8ドットを表示しない,1:クリップなし)
bit1: BGクリップ(0:画面の左8ドットを表示しない,1:クリップなし)
bit0: ディスプレイタイプ(0:カラー,1:モノクロ)
$2002RPPUステータスレジスタ
bit7: VBlank発生(1:VBlank中、ただしRead後0クリアされる)
bit6: スプライト#0ヒット(0:ヒットなし,1:ヒット)
bit5: スキャンラインスプライト数(0:8個以下,1:9個以上)
bit4: VRAM書きこみフラグ(0:書き込み成功,1:書き込み失敗)
$2003WスプライトRAMアドレスレジスタ
$2004を使ってスプライトRAMに書きこむアドレスを指定する。
$2004WスプライトI/Oレジスタ
$2003で指定したスプライトRAMにデータを書きこむ
$2005WVRAMアドレスレジスタ1
BGのスクロール値をセットする。
このレジスタは2度書きレジスタでXのスクロール値、Yのスクロール値の順でセットする。
$2002をReadするとセットの順番はリセットされ、X値をセットする番になっている。
$2006WVRAMアドレスレジスタ2
$2007を使ってVRAMに書きこむアドレスを指定する。
このレジスタは2度書きレジスタで上位8bit、下位8bitの順でセットする。
$2002をReadするとセットの順番はリセットされ、上位8bitをセットする番になっている。
$2007R/W$2006で指定したアドレスのVRAMデータを読み書きする。
読み書き後$2000のbit2の値により、VRAMアドレスが1または32足される。
$4000R/W矩形波チャンネル1制御レジスタ1
bit7-6: Dutyサイクル(positive/negative)
00: 2/14
01: 4/12
10: 8/ 8
11:12/ 4
bit5: エンベロープDecayループ/長さカウンタ無効(1:ループ/無効)
bit4: エンベロープDecay無効(1:無効,0:有効)
bit3-0: ボリューム/Decayレート
$4001R/W矩形波チャンネル1制御レジスタ2
bit7: スイープ有効(0:無効,1:有効)
bit6-4: スイープレート
bit3: スイープ方向(1:decrease,0:increase)
bit2-0: スイープ右シフト値
$4002R/W矩形波チャンネル1周波数レジスタ1
チャンネル1で使う周波数の下位8bitをセットする。
$4003R/W矩形波チャンネル1周波数レジスタ2
bit7-3: 音の長さ
bit2-0: 周波数の上位3bit
$4004R/W矩形波チャンネル2制御レジスタ1
bit7-6: Dutyサイクル(positive/negative)
00: 2/14
01: 4/12
10: 8/ 8
11:12/ 4
bit5: エンベロープDecayループ/長さカウンタ無効(1:ループ/無効)
bit4: エンベロープDecay無効(1:無効,0:有効)
bit3-0: ボリューム/Decayレート
$4005R/W矩形波チャンネル2制御レジスタ2
bit7: スイープ有効(0:無効,1:有効)
bit6-4: スイープレート
bit3: スイープ方向(1:decrease,0:increase)
bit2-0: スイープ右シフト値
$4006R/W矩形波チャンネル2周波数レジスタ1
チャンネル1で使う周波数の下位8bitをセットする。
$4007R/W矩形波チャンネル2周波数レジスタ2
bit7-3: 音の長さ
bit2-0: 周波数の上位3bit
$4008R/W三角波制御レジスタ1
bit7: リニアカウンタスタート
bit6-0: リニアカウンタ
$4009未使用
$400AR/W三角波周波数レジスタ1
チャンネル1で使う周波数の下位8bitをセットする。
$400BR/W三角波周波数レジスタ2
bit7-3: 音の長さ
bit2-0: 周波数の上位3bit
$400CR/Wノイズ制御レジスタ1
bit7-6: 未使用
bit5: エンベロープDecayループ/長さカウンタ無効(1:ループ/無効)
bit4: エンベロープDecay無効(1:無効,0:有効)
bit3-0: ボリューム/Decayレート
$400D未使用
$400ER/Wノイズ周波数レジスタ1
bit7: 乱数タイプ選択(0:32Kmode,1:93bitmode)
bit6-4: 未使用
bit3-0: 波長選択
$400FR/Wノイズ周波数レジスタ2
bit7-3: 音の長さ
bit2-0: 未使用
$4010R/WDMC制御レジスタ1
$4011R/WDMC制御レジスタ2
$4012R/WDMCアドレスレジスタ
$4013R/WDMCデータ長レジスタ
$4014WスプライトDMAレジスタ
メモリからスプライトRAMへDMA転送を行う
このレジスタに書きこんだ値をNをすると、
N×$100のアドレスから256バイトをスプライトRAMへ転送する。
$4015R/Wサウンドレジスタ
bit7: DMC(Delta Modulation Channel)のIRQステータス(Readのみ)
bit4: DMC(0:無効,1:有効)
bit3: ノイズチャンネル(0:無効,1:有効)
bit2: 三角波チャンネル(0:無効,1:有効)
bit1: 矩形波チャンネル2(0:無効,1:有効)
bit0: 矩形波チャンネル1(0:無効,1:有効)
$4016R/WパッドI/O1
bit4: ガンコントリガー(0:ON,1:OFF)
bit3: ガンコンスプライト検出(0:検出なし,1:検出)
bit0: パッドデータ(0:OFF,1:ON)
$4017R/WパッドI/O2
bit4: ガンコントリガー(0:ON,1:OFF)
bit3: ガンコンスプライト検出(0:検出なし,1:検出)
bit0: パッドデータ(0:OFF,1:ON)


TOPページへ戻る inserted by FC2 system