ファミリーコンピューター(仮)
ファミコンのPPUへ
ファミコン ディスクシステムへ
ファミリー ベーシックへ
ファミコン ステーション(仮)へ
シャープ C1(仮)へ
ファミリーコンピューターのスペック
| CPU | N2A03 1.789772MHz |
| PPU | RP2C02 |
| ROM | 無し |
| RAM | 2KB |
| V-RAM | 2KB |
CPUは6502の機能を一部削り、サウンドジェネレータ、スプライトDMA、I/Oポート等を追加かなりの機能を誇る。
ただし、コストダウンの為、本体はフルデコードされなかったり色々と機能が削られているのが不満といえば不満。
CPU周り
*CPU30ピンが/SPECIALとなっています。
未確認なのですがCPUの停止をするみたいです。(PC10で使用)
CPUによってはこの機能は無い可能性があります。(ファミコンでは関係はありません)
ワークRAM
$0000−$07FFの2Kバイトなのですがデコードされていないので
$0800−$1FFFがミラーイメージになります。
ただしファミコン以外の機種ではデコードされているのもあります。
PPU周り
RP2C02の39ピンALEで下位アドレスバスとデータバスを切り換えて使用しているのがわかります。
PPU内のアドレスの設定が上位、下位の順からみると68系のMPU用として開発された?
$2000:PPUコントロール1(出力)
Bit7 VBLANK時にNMIの発生 (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=+32、0=+1)
Bit1-0 基準ネームテーブル 11=$2C00
10=$2800
01=$2400
00=$2000
$2001:PPUコントロール2(出力)
Bit7-5 RGB強調 (000:強調なし)
Bit4 スプライト表示 (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後クリアされる、1=スキャンライン描画中)
Bit6 スプライト#0ヒット (1=ヒット、0=ヒットしていない)
Bit5 スキャンラインスプライト数 (1=9個以上、0=8個以下)
Bit4 VRAM書き込みフラグ (1=書き込み不可、0=書き込み可)
Bit3-0 未使用
$2003:スプライトRAMアドレス(出力)
スプライトRAMにアクセスする場合にアドレスを指定する。
$2004;スプライトRAMアクセス(出力)
スプライトRAMにデータを出力します。
$2005:スクロール(出力)
$2002を読むとリセットされ、
その後、X方向スクロール値(0−255)
その次にY方向スクロール値(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方向です。
$4016:INP0
Bit7 未使用
Bit6 未使用
Bit5 未使用
Bit4 未使用
Bit3 未使用
Bit2 MIC (入力)|OUT2(出力)
Bit1 P0 D1(入力)|OUT1(出力)
Bit0 J1 D0(入力)|OUT0(出力)
$4017:INP1/OUTP
Bit7 未使用 |フレームシーケンサのモード
Bit6 未使用 |IRQ 1=禁止、0=許可(出力)
Bit5 未使用
Bit4 P1 D4 (入力)
Bit3 P1 D3 (入力)
Bit2 P1 D2 (入力)
Bit1 P1 D1 (入力)
Bit0 P1 D0,J2 D0 (入力)
コントローラ、その他
コントローラは4021を使用してパラレルからシリアルにして転送します。
内容は、Iコンの場合”A”,”B”、”SELECT”、”START”、”下”、”上”、”左”、”右”の順
1だとボタンが押されていない、0=ボタンが押されている
IIコンの場合”A”,”B”、0、0、”下”、”上”、”左”、”右”の順
カートリッジコネクタ
カラオケスタジオの回路図
メインの回路図です。
尚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 へ戻る