ファミリーコンピュータ(仮)
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 へ戻る