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


PPU2C02へ ファミリーコンピュータ ディスクシステムへ ファミリー ベーシックへ ファミコン ステーション(仮)へ シャープ C1(仮)へ マッパー0(HVC−NROM)へ マッパー2(HVC−UNROM)へ マッパー3(HVC−CNROM)へ マッパー87へ ファミリーコンピュータのスペック
CPU 2A03 1.789772MHz
PPU 2C02
ROM 無し
RAM 2KB
V-RAM 2KB
CPUは6502の機能を一部削り、サウンドジェネレータ、スプライトDMA、I/Oポート等を追加かなりの機能を誇る。 ただし、コストダウンの為、本体はフルデコードされなかったり一部のポートが固定 色々と機能が削られているのが不満といえば不満。 割り込み 2A03は6502と同様な割り込みができます。 $FFFA−$FFFB:NMI(PPUから割り込み要求がきます) $FFFC−$FFFD:リセット(電源オン) $FFFE−$FFFF:BRK/IRQ  優先順位   リセット>NMI>BRK/IRQ  NMIとBRK/IRQは割り込みが掛かるとPC上位、PC下位、PSRがスタックに退避されます。  RTI命令はPSR、PC下位、PC上位をスタックから取り出す事になります。  もし割り込みでRTSで帰る場合はスタックの操作が必要になります。
CPU周り  *CPUの30ピンのX OUTとなっています。 LS139でメモリ、I/Oのデーコードをいます。 CPUが$8000−$FFFFをアクセスすると/ROMSELが0になりROM空間のアクセス CPUが$2000−$3FFFをアクセスすると/DBEが0になりPPUのI/Oアクセス CPUが$0000−$1FFFをアクセスすると/RAMSELになりワークRAMのI/Oアクセス となります。 ワークRAM RAM領域は$0000−$1FFFなのですが2KBのRAM$0000−$07FFを載せています デコードされていないので$0800−$1FFFがミラーイメージになります。 ファミリーコンピュータ以外の機種ではデコードされているのもあります。 尚アクセスタイムは150nsのSRAMを使用
PPU周り 2C02の39ピンALEで下位アドレスバスとデータバスを切り換えて使用しているのがわかります。 PPU内のアドレスの設定が上位、下位の順からみると6809のMPU用として開発された? また/VRAM CSとPA13はカセットでショートされていることがほとんどで PPUアドレス$2000−$3FFFのアクセスをすると本体内のVRAMをセレクトする様になっています。 VA10はカセットのスクロールのジャンパでVA10とPA10で水平、VA10とPA11で垂直の選択になります。 17ピンのVD GNDはビデオ用のGNDでココをGNDに繋いだりしないと表示されない?(未確認)  $2000:PPUコントロール1(出力)        Bit7:VBLANK時に割り込みの発生     1=発生する        、0=発生しない        Bit6:PPU セレクト           *1=スレーブ        、0=マスター        Bit5:スプライトサイズ            1=8×16ドット     、0=8×8ドット        Bit4:BGパターンテーブルアドレス      1=$1000       、0=$0000        Bit3:スプライトパターンテーブルアドレス   1=$1000       、0=$0000        Bit2:PPUアクセス時のアドレスの増加する値 1=Y方向にINC(+32)、0=X方向にINC(+1)        Bit1:基準ネームテーブル D1          11=$2C00        Bit0:基準ネームテーブル D0          10=$2800                                   01=$2400                                   00=$2000        *スレーブ、マスターはBG2枚用か?  $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ドットのスプライトクリップ   1=クリップしない、0=クリップする        Bit0:画面モード                1=モノクロ、0=カラー  $2002:PPUステータス(入力)        Bit7:VBLANK             1=VBLANK中  READ後クリアされる、0=スキャンライン描画中        Bit6:スプライト$00ヒット        1=ヒット、0=ヒットしていない        Bit5:スキャンラインスプライト数      1=9個以上、0=8個以下        Bit4:スクロールライン224オーバーD4  ポート$2005(垂直)で$E0より上の数値$00−$1F        Bit3:スクロールライン224オーバーD3        Bit2:スクロールライン224オーバーD2        Bit1:スクロールライン224オーバーD1        Bit0:スクロールライン224オーバーD0         スクロールライン224オーバーはポート$2005(垂直)で書き込んだ値によって出力されます         ポート$2005(垂直)に$00から$E0を書き込んだ場合 $00                      $E1から$FFを書き込んだ場合 $01から$1Fになる  $2003:スプライトRAMアドレス(出力)   スプライトRAMにアクセスする場合にアドレスを指定する。  $2004;スプライトRAMアクセス(出力)   スプライトRAMにデータを出力します。  $2005:スクロール(出力)   $2002を読むとリセットされ水平スクロール値(0−255)を書き込み   その次に垂直スクロール値(0−240)の順に書き込む。  $2006(出力) PPUアドレスレジスタ   PPU内のアドレスをセットします。   $2002を読み(リセット)、上位アドレス、下位アドレスでセットします。  $2007(出力) PPUデータセット   $2006でセットしたPPU内のアドレスのデータを書きます。  $2007(入力) PPUデータリード   $2006でセットしたPPU内のアドレスのデータを読みます(ただし一番最初のデータは無効なので最初は2回読む事が必要)
APUポート周り  $4000:APU Ch1矩形波        Bit7-6 デュティー比             11=25.0%             10=50.0%             01=75.0%             00=87.5%        Bit5  カウンタ (1=有効、0=無効)        Bit4  音響        Bit0-3 音量  $4001:APU Ch1矩形波        Bit7  周波数変化 (1=可変する、0=可変しない)        Bit6-4 周波数変化速度        Bit3  周波数変化 (1=増加する、0=減少する)        Bit2-0 周波数範囲  $4002:APU Ch1矩形波        周波数下位データ  $4003:APU Ch1矩形波        Bit7-3 再生時間        Bit0-3 周波数上位データ  $4004:APU Ch2矩形波        Bit7-6 デュティー比             11=25.0%             10=50.0%             01=75.0%             00=87.5%        Bit5  カウンタ (1=有効、0=無効)        Bit4  音響        Bit0-3 音量  $4005:APU Ch2矩形波        Bit7  周波数変化 (1=可変する、0=可変しない)        Bit6-4 周波数変化速度        Bit3  周波数変化 (1=増加する、0=減少する)        Bit2-0 周波数範囲  $4006:APU Ch2矩形波        周波数下位データ  $4007:APU Ch2矩形波        Bit7-3 再生時間        Bit0-3 周波数上位データ  $4008:APU Ch3三角波        Bit7  カウンタ (1=有効、0=無効)        Bit6-0 再生時間  $4009:APU Ch3三角波  $400A:APU Ch3三角波        周波数下位データ  $400B:APU Ch3三角波        Bit7-3 再生時間        Bit0-3 周波数上位データ  $400C:APU Ch4ノイズ  $400D:APU Ch4ノイズ  $400E:APU Ch4ノイズ  $400F:APU Ch4ノイズ  $4010:APU Ch5DMC  $4011:APU Ch5DMC  $4012:APU Ch5DMC  $4013:APU Ch5DMC  $4014:スプライトDMAレジスタ(出力)   CPUメモリからスプライトRAMへDMA転送を行います。   CPUメモリのアドレス上位をセットします。  $4015:APUチャンネル、IRQスイッチ        Bit7 IRQDMC ステータス        Bit6 IRQフレーム ステータス        Bit5        Bit4 Ch5DMC 1=オン、0=オフ        Bit3 Ch4ノイズ 1=オン、0=オフ        Bit2 Ch3三角波 1=オン、0=オフ        Bit1 Ch2矩形波 1=オン、0=オフ        Bit0 Ch1矩形波 1=オン、0=オフ
I/Oポート周り 40H368を使用しているためポートは1方向(入力)です。 出力はOUTnになります。  $4016:        Bit7:未使用        Bit6:未使用        Bit5:未使用        Bit4:未使用        Bit3:未使用        Bit2:MIC IN (入力)|OUT2(出力)        Bit1:4016 D1(入力)|OUT1(出力)        Bit0:4016 D0(入力)|OUT0(出力)  $4017:        Bit7:未使用      |フレームシーケンサのモード (出力)        Bit6:未使用       |IRQ 1=禁止、0=許可(出力)        Bit5:未使用        Bit4:4017 D4(入力)        Bit3:4017 D3(入力)        Bit2:4017 D2(入力)        Bit1:4017 D1(入力)        Bit0:4017 D0(入力)
コントローラ、その他 コントローラは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 へ戻る