ファミリーコンピュータ(仮)


PPU2C02へ   ファミリーコンピュータ ディスクシステムへ ファミリー ベーシックへ   ファミコン ステーション(仮)へ シャープ C1(仮)へ   マッパー0(HVC−NROM)へ マッパー1(MMC1xx)へ マッパー2、94(HVC−UNROM−xx)へ マッパー3、66、185(HVC−CNROM−256K)へ マッパー87へ マッパー206(namcot 34xx)へ   ファミリーコンピュータのスペック
CPU 2A03 1.789772MHz
PPU 2C02
ROM 無し
RAM 2KB
V-RAM 2KB
  CPUは6502の機能を一部削り、サウンドジェネレータ、OBJ DMA、I/Oポート等を追加かなりの機能を誇る。 ただし、コストダウンの為、本体はフルデコードされなかったり一部のポートが固定 色々と機能が削られているのが不満といえば不満 割り込み 2A03は6502と同様な割り込みができます $FFFA−$FFFB:NMI    (PPUから割り込み要求がきます) $FFFC−$FFFD:RST    (電源オン時またはリセットボタン) $FFFE−$FFFF:BRK/IRQ    優先順位   RST>NMI>BRK/IRQ    NMIとBRK/IRQは割り込みが掛かるとPC上位、PC下位、PSRがスタックに退避されます  RTI命令はPSR、PC下位、PC上位をスタックから取り出す事になります  もし割り込みでRTSで戻る場合はスタックの操作が必要になります  
CPU周り  *CPUの30ピンはX OUTとしています(C1のゲーム基本配線図より)   またPC10では入力端子/SPECIALとなりタイムが0になると   強制ストップする為に使用しています   LS139でメモリ、I/Oのデーコードをいます。 CPUが$8000−$FFFFをアクセスすると/ROMSELが0になりROM空間のアクセス CPUが$2000−$3FFFをアクセスすると/DBE   が0になりPPUのI/Oアクセス CPUが$0000−$1FFFをアクセスすると/RAMSELが0になりワークRAMのI/Oアクセス   ワークRAM RAM領域は$0000−$1FFFなのですが2KBのRAM$0000−$07FFを載せています デコードされていないので$0800−$1FFFがミラーイメージになります。 ファミリーコンピュータ以外の機種ではデコードされているのもあります 尚アクセスタイムは150nsのSRAMを使用  
PPU周り 2C02の39ピンALEで下位アドレスバスとデータバスを切り換えて使用しているのがわかります また/VRAM CSとPA13はカセットでショートされていることがほとんどで PPUアドレス$2000−$3FFFのアクセスをすると本体内のVRAMをセレクトする様になっています。 VA10はカセットのスクロールのジャンパでVA10とPA10で水平、VA10とPA11で垂直の選択になります。 EXT0〜EXT3はPPUマスタとPPUスレーブ制御用   $2000 PPUコントロール1(出力)  Bit7:VBLANK時に割り込みの発生 1=発生する    、0=発生しない  Bit6:EXT端子データ方向      1=出力(スレーブ)、0=入力(マスタ)  Bit5:OBJサイズ          1=8×16ドット 、0=8×8ドット  Bit4:BG パターンテーブルアドレス 1=$1000   、0=$0000  Bit3:OBJパターンテーブルアドレス 1=$1000   、0=$0000  Bit2:オートインクリメント増加値   1=+32 下方向 、0=+1 右方向  Bit1:基準ネームテーブル d1     11=BG−D $2C00  Bit0:基準ネームテーブル d0     10=BG−C $2800                        01=BG−B $2400                        00=BG−A $2000  *EXT0〜EXT3のカラーパレットインデックス     $2001 PPUコントロール2(出力)  Bit7:Gフィルタ           1=オン、0=オフ  Bit6:Bフィルタ           1=オン、0=オフ  Bit5:Rフィルタ           1=オン、0=オフ  Bit4:OBJ表示           1=オン、0=オフ  Bit3:BG 表示           1=オン、0=オフ  Bit2:画面左端8ドットBG 表示   1=オン、0=オフ  Bit1:画面左端8ドットOBJ表示   1=オン、0=オフ  Bit0:グレイスケール モード     1=オン、0=オフ     $2002 PPUステータス(入力)  Bit7:VBLANK          1=VBLANK中、0=スキャンライン描画中  Bit6:OBJ$00ヒット       1=ヒットした  、0=ヒットしていない  Bit5:スキャンラインOBJ数     1=9個以上   、0=8個以下  Bit4:垂直ライン224オーバー d4  ポート$2005(垂直)で$E0より上の数値を書き込んだ値  Bit3:垂直ライン224オーバー d3   $00〜$E0の場合 $00  Bit2:垂直ライン224オーバー d2       $E1の場合 $01  Bit1:垂直ライン224オーバー d1          |  Bit0:垂直ライン224オーバー d0       $FFの場合 $1F     $2003 OBJ属性メモリ アドレス(出力)  OBJ属性メモリのアドレスを指定します(オートインクリメント)   $2004 OBJ属性メモリ データ (入力/出力)  OBJ属性メモリにデータを入出力を行います(ただし入力は古いロットによっては入力不可)     $2005 スクロール(出力)  $2002を読むとリセットされ  水平スクロール値(0−255)を書き込み  その次に垂直スクロール値(0−240)の順に書き込む  垂直スクロール値に$FFを書き込むとスクロールせずに先頭画面からの表示?     $2006 PPUアドレス(出力)  PPUのメモリアドレスをセットします  $2002を読み(リセット)、上位アドレス、下位アドレスでセットします  カラーパレット以外はVBLANK期間にセットしないとアドレスが流れ(増加)されます   $2007 PPUデータ (入力/出力)  $2006でセットしたPPUアドレスのデータを書きます(入力)  $2006でセットしたPPUアドレスのデータを読みます(出力)   ただし最初のデータは無効なので最初は2回読む事が必要  
APUポート周り $4000:APU Ch1矩形波(出力)  Bit7:デュティー比       d1   11=25.0%、10=50.0%  Bit6:デュティー比       d0   01=75.0%、00=87.5%  Bit5:エンベロープループ    1=有効    、0=無効($4003の再生時間)  Bit4:音量/エンベロープ切換え 1=エンベロープ、0=音量  Bit3:音量/エンベローブ減衰率 d3  Bit2:音量/エンベローブ減衰率 d2  Bit1:音量/エンベローブ減衰率 d1  Bit0:音量/エンベローブ減衰率 d0   $4001:APU Ch1矩形波(出力)  Bit7:周波数変化   1=有効、0=無効  Bit6:周波数変化速度 d2 111=遅い...001=速い、000=変化無し  Bit5:周波数変化速度 d1  Bit4:周波数変化速度 d0  Bit3:周波数変化方向 1=増加、0=減少  Bit2:周波数範囲   d2  Bit1:周波数範囲   d1  Bit0:周波数範囲   d0   $4002:APU Ch1矩形波(出力)  Bit7:周波数 d7  Bit6:周波数 d6  Bit5:周波数 d5  Bit4:周波数 d4  Bit3:周波数 d3  Bit2:周波数 d2  Bit1:周波数 d1  Bit0:周波数 d0   $4003:APU Ch1矩形波(出力)  Bit7:再生時間 d4  Bit6:再生時間 d3  Bit5:再生時間 d2  Bit4:再生時間 d1  Bit3:再生時間 d0  Bit2:周波数 d10  Bit1:周波数 d9  Bit0:周波数 d8   $4004:APU Ch2矩形波(出力)  Bit7:デュティー比       d1   11=25.0%、10=50.0%  Bit6:デュティー比       d0   01=75.0%、00=87.5%  Bit5:エンベロープループ    1=有効    、0=無効($4003の再生時間)  Bit4:音量/エンベロープ切換え 1=エンベロープ、0=音量  Bit3:音量/エンベローブ減衰率 d3  Bit2:音量/エンベローブ減衰率 d2  Bit1:音量/エンベローブ減衰率 d1  Bit0:音量/エンベローブ減衰率 d0   $4005:APU Ch2矩形波(出力)  Bit7:周波数変化   1=有効、0=無効  Bit6:周波数変化速度 d2 111=遅い、001=速い、000=変化無し  Bit5:周波数変化速度 d1  Bit4:周波数変化速度 d0  Bit3:周波数変化方向 1=増加、0=減少  Bit2:周波数範囲   d2  Bit1:周波数範囲   d1  Bit0:周波数範囲   d0   $4006:APU Ch2矩形波(出力)  Bit7:周波数 d7  Bit6:周波数 d6  Bit5:周波数 d5  Bit4:周波数 d4  Bit3:周波数 d3  Bit2:周波数 d2  Bit1:周波数 d1  Bit0:周波数 d0   $4007:APU Ch2矩形波(出力)  Bit7:再生時間 d4  Bit6:再生時間 d3  Bit5:再生時間 d2  Bit4:再生時間 d1  Bit3:再生時間 d0  Bit2:周波数 d10  Bit1:周波数 d9  Bit0:周波数 d8   $4008:APU Ch3三角波(出力)  Bit7:カウンタ 1=有効、0=無効  Bit6:再生時間d6  Bit5:再生時間d5  Bit4:再生時間d4  Bit3:再生時間d3  Bit2:再生時間d2  Bit1:再生時間d1  Bit0:再生時間d0   $4009:APU Ch3三角波   $400A:APU Ch3三角波(出力)  Bit7:周波数d7  Bit6:周波数d6  Bit5:周波数d5  Bit4:周波数d4  Bit3:周波数d3  Bit2:周波数d2  Bit1:周波数d1  Bit0:周波数d0   $400B:APU Ch3三角波(出力)  Bit7:再生時間 d4  Bit6:再生時間 d3  Bit5:再生時間 d2  Bit4:再生時間 d1  Bit3:再生時間 d0  Bit2:周波数d10  Bit1:周波数d9  Bit0:周波数d8   $400C:APU Ch4ノイズ(出力)  Bit7:  Bit6:  Bit5:カウンタ  Bit4:音響  Bit3:音量 d3  Bit2:音量 d2  Bit1:音量 d1  Bit0:音量 d0   $400D:APU Ch4ノイズ(未使用)   $400E:APU Ch4ノイズ(出力)  Bit7:モード 1=93Bit、0=32KBit  Bit6:  Bit5:  Bit4:  Bit3:長さ  Bit2:長さ  Bit1:長さ  Bit0:長さ   $400F:APU Ch4ノイズ(出力)  Bit7:長さ  Bit6:長さ  Bit5:長さ  Bit4:長さ  Bit3:長さ  Bit2:  Bit1:  Bit0:   $4010:APU Ch5DMC(出力)  Bit7:割込み  Bit6:ループ  Bit5:  Bit4:  Bit3:レート インデックス  Bit2:レート インデックス  Bit1:レート インデックス  Bit0:レート インデックス   $4011:APU Ch5DMC ロードカウンタ(出力)  Bit7:−  Bit6:カウンタ リセットが掛かるとカウンタは0になる  Bit5:カウンタ  Bit4:カウンタ  Bit3:カウンタ  Bit2:カウンタ  Bit1:カウンタ  Bit0:カウンタ   $4012:APU Ch5DMC サンプルアドレス(出力)  Bit7:A13 アドレスは$C000−$FFFFの範囲  Bit6:A12  Bit5:A11  Bit4:A10  Bit3:A9  Bit2:A8  Bit1:A7  Bit0:A6   $4013:APU Ch5DMC サンプルレングス(出力)  Bit7:長さ d15 サンプリングレングスは+1にしてセットされる  Bit6:長さ d14  Bit5:長さ d13  Bit4:長さ d12  Bit3:長さ d11  Bit2:長さ d10  Bit1:長さ d9  Bit0:長さ d8     $4014:OBJ属性メモリDMAレジスタ(出力)  Bit7:CPU A15  Bit6:CPU A14  Bit5:CPU A13  Bit4:CPU A12  Bit3:CPU A11  Bit2:CPU A10  Bit1:CPU A9  Bit0:CPU A8    VBLANK期間中にCPUメモリからOBJ属性メモリへDMA転送を行います  また転送中はCPUが止まります     $4015:APUステータス(入力)  Bit7:IRQDMC ステータス    1=DMC、0=IRQ  Bit6:IRQフレームステータス  Bit5:  Bit4:APU Ch5DMCステータス 1=出力、0=停止  Bit3:APU Ch4ノイズステータス 1=出力、0=停止  Bit2:APU Ch3三角波ステータス 1=出力、0=停止  Bit1:APU Ch2矩形波ステータス 1=出力、0=停止  Bit0:APU Ch1矩形波ステータス 1=出力、0=停止        :APUチャンネル(出力)  Bit7:  Bit6:  Bit5:  Bit4:APU Ch5DMCチャンネル 1=オン 、0=オフ  Bit3:APU Ch4ノイズチャンネル 1=オン 、0=オフ  Bit2:APU Ch3三角波チャンネル 1=オン 、0=オフ  Bit1:APU Ch2矩形波チャンネル 1=オン 、0=オフ  Bit0:APU Ch1矩形波チャンネル 1=オン 、0=オフ     APU Chnステータス、チャンネルはエンベロープ等で   音が出なくなると0になる  
I/Oポート周り 40H368を使用しているためポートは1方向(入力)、出力はOUTnになります   $4016:INP0(入力)  Bit7: −  Bit6: −  Bit5: −  Bit4: −  Bit3: −  Bit2:MIC IN  Bit1:4016 D1  Bit0:4016 D0        :OUT0〜2(出力)  Bit7: −  Bit6: −  Bit5: −  Bit4: −  Bit3: −  Bit2:OUT2  Bit1:OUT1  Bit0:OUT0     $4017:INP1(入力)  Bit7: −  Bit6: −  Bit5: −  Bit4:4017 D4  Bit3:4017 D3  Bit2:4017 D2  Bit1:4017 D1  Bit0:4017 D0        :APUフレーム(出力)  Bit7:モード 1=5ステップ、0=4ステップ  Bit6:IRQ 1=禁止   、0=許可  Bit5:  Bit4:  Bit3:  Bit2:  Bit1:  Bit0:       その他(未使用) $4018:CPU30ピンと関係? $4019:CPU30ピンと関係? $401A:CPU30ピンと関係?   $401B: $401C: $401D: $401E: $401F:
コントローラ、その他 コントローラは4021を使用してパラレルからシリアルにして転送します。  Iコンの場合OUT0を1−>0にして4021をシリアルモードに設定します。  読み込むデータ(ボタン)は8つなので読み込むシリアルデータはQ8になります。  4016 D0を1回読むと4016 CUPが1クロック動作するので1つのボタンを読む事になります。  8回読む事で全てのボタンを読む事になります。    IIコンの場合OUT0を1−>0にして4021をシリアルモードに設定します。  4017 D0を8回読みます    外付けIコンの場合OUT0を1−>0にして4021をシリアルモードに設定します。  4016 D1を8回読みます    外付けIIコンの場合OUT0を1−>0にして4021をシリアルモードに設定します。  4017 D1を8回読みます    Iコンの場合”A”,”B”,”SELECT”,”START”,”下”,”上”,”左”,”右”の順  IIコンの場合”A”,”B”,0,0,”下”,”上”,”左”,”右”の順  外付けIコン、IIコンの場合”A”,”B”,”SELECT”,”START”,”下”,”上”,”左”,”右”の順   1=ボタンが押されている   0=ボタンが押されていない   本体のコントローラと外付けコントローラは別々に判断出来ますが外付けのコントローラも使用できるように D0とD1を同時に読み込んでデータを合成しています。  
カートリッジコネクタ
ホリカード HJ−12 コントローラは本体のコントローラー同様4021を使用してパラレルからシリアルにして転送します。 OUT0を1−>0にして4021をシリアルモードに設定します。 読み込むデータ(ボタン)は8つなので読み込むシリアルデータはQ8になります。 4016 D1を1回読むと4016 CUPが1クロック動作するので1つのボタンを読む事になります。 8回読む事で全てのボタンを読む事になります。(IIコンの場合は4016が4017になります)  ”A”,”B”,”SELECT”,”START”,”下”,”上”,”左”,”右”の順   1=ボタンが押されている   0=ボタンが押されていない  
ハイパーショット JE−506
カラオケスタジオの回路図    メインの回路図です。  尚BANK3は実際には使われていないので違う場合があります。  当然マッパの端子名は不明なので勝手につけています。     $6000:入力ポート?    Bit2:???IN0 マイク    Bit1:IN1 START (Bボタン)    Bit0:IN2 SELECT (Aボタン)     $C000:バンク切り換え用 ポート    Bit4:1=M ROM(本体ROM)、0=E ROM(専用カセット)    Bit3:BANK3    Bit2:BANK2    Bit1:BANK1    Bit0:BANK0  *回路図を見て分ると思いますが、画面のミラーリングはポートによって切り換えることが出来ます。   恐らく$C000のBit5か6ぐらいに当てはまると思いますが不明です。    後ろにさすオプションの回路図です。(ただし手持ちは試作品のボードなので市販品と若干違うと思われます。)  
BB−10 バトルボックスの回路図    シリアルEEROMを2つ使用で16ビットモードなので128*16Bit*2つの容量(256ワード)です。   左のJKフリップ・フロップはOUT0が入力で2つあるシリアルEEROMのどちらかを選択します。   右のJKフリップ・フロップはP1 CLKが0から1になるたびにQと/Qの値が反転されます。   またOUT0は各シリアルEEROMの/CLKにも繋がっています。     シリアルEEROMにデータを書き込む    左のQはシリアルEEROMにデータを出力します。    左の/Qは$4017のBit4に繋がっており、データの出力した反対のデータを読むことが出来ます。    シリアルEEROMにデータ入力はP1 CLKで”1”と”0”が常にセットされることになります、    右のQと/Qは各EEROMの/CSなのでROMの選択。    OUT0がROMの選択、兼ROMの/CLKに使われます。    OUT0のデータをそのままにしておくとP1 CLKで動作する4027の出力データは反転されます。    したがってデータ入力はタイミングを見計らって($4017のBit4)、    シリアルEEROMの/CLK($4017のBit0)を制御する事になります。       シリアルEEROMのデータを読み込む    シリアルEEROMの/CLK($4017のBit0)を制御して、    P1 D3($4017のBit3)を読みます。   使用ポート  $4017    Bit7:−    Bit6:−    Bit5:−    Bit4:P1 D4 =DIの反転の状態で切り替わりのタイミングはP1 CLK(入力)    Bit3:P1 D3 =シリアルEEROMのDO(入力)    Bit2:−    Bit1:−    Bit0:P1 OUT0=シリアルEEROMの/CLK(出力)    シリアルEEROMなので/CLKとDIでコマンドを送ります。    Command1 Read     A0,A1,A2,A3,A4,A5,A6,0,1,0,0,0,0,0,0,0    Command2 Program     A0,A1,A2,A3,A4,A5,A6,0,0,1,1,0,0,0,0,0,D0,D1,D2,D3,D4,D5,..D14,D15    Command3 Chip Erase     /CLK*9,0,0,1,1,0,0,0,0    Command4 Busy Monitor     /CLK*9,1,0,1,1,0,0,0,0    Command5 E/W Enable     /CLK*9,1,0,0,1,0,0,0,0    Command6 Busy Monitor     /CLK*9,1,1,0,1,0,0,0,0  
ターボファイル      74HC368がコントロール、74HC573でシリアル転送、  4024と4040でアドレスのカウンタを行います。  つまり、アドレスの指定してのアクセスは出来ませんので  アドレスカウンタをリセットして  最初のアドレスからアクセスしてアドレスをカウントしていくしかありません。     アドレスカウンタリセット         LDA #$002         STA $4016         NOP*6           LDA #$000         STA $4016         NOP*6       データリード         LDY #$08    LOOP:LDA $4017         AND #$04         LSR A         LSR A         ORA #$06         STA $4016           AND #$03         STA $4016           LSR A         ROR WRITE_DATA         DEY         BNE LOOP       データライト         LDY #$08    LOOP:LDA READ_DATA         AND #$01         ORA #$06         STA $4016           AND #$03         STA $4016           LSR READ_DATA         DEY         BNE LOOP  
  Home へ戻る