SCV:Super Cassette Vision(スーパーカセットビジョン)(注)回路図は参考程度にして下さい。
尚、今回の解析にあたって武田さん、333さんの協力があり感謝します。
CPU μ7801Gへ(仮)
テキストへ(仮)
Super Cassette Visionのスペック
CPU | uPD7801G 4MHz |
VDC | EPOCH TV-1 14.31818MHz |
SOUND G | UPD1771C 6MHz |
ROM | 4KB (CPU内蔵) |
RAM | 128B(ワーキングレジスタ) |
V-RAM | 2KB*2+2KB |
かなりシンプルに構成され、メインCPUにCOM−87系のμPD7801Gを使用
VDCにはカスタムを使用、サウンドは4ビットCPUを使用?
ただ、クロックがそれぞれ3つあるのでノイズ等に不安がある。
本体にセレクト12キーというキーもついてあるのも特徴の一つでもある。
CPU周り
CPUはNECのμPD7801G クロックは4MHz
CPU内に4KBのROMが内蔵しており、RAMも128B本体に内蔵
またCPU内のRAMはワーキングレジスタと呼ばれ汎用のレジスタとして使用されます。
PA0−PA7はコントローラー、セレクト12キーのスキャン
PB0−PB7はコントローラー、セレクト12キーのスキャン
PC0はPAUSEキー
PC2は不明(リージョン用?)
PC3はサウンドCPUに繋がっています。
PC5−PC7はカセット端子に繋がっています。
PC5、PC6はROMカセットのバンク切り換えに使用
コントローラ、セレクト12キー
CPUの入出力ポートを使用して、ポートAでそれぞれ選択してポートBでスキャンします。
またポーズキーはポートCのPC0を読みます。
VDDは8.5Vで本体内で5Vに変換されます。
VDC EPOCH TV−1
NEC製のカスタムチップでおそらく専用のチップのようであり
ここにS−RAM 2KBが2つ繋がっています。(更にVDCに2KBのRAMがあるようです)
使用クロックは省いていますが14.31818MHzです。
20ピン、22ピン〜27ピンはRFモジェレータ部分μPC1076Cに繋がっており、映像出力端子になります
(注)端子名は分からないので勝手につけています。
割り込み
SCVには3つの割り込みとタイマ割り込みとソフトウェア割り込みがあります。
INT0:カセット 拡張用 ハイレベルが掛かります。
INTT:タイマ キー入力に使用 タイマーがオバーフローしたときに掛かります。
INT1:サウンド CPU 立ち上がりで掛かります。
INT2:VDC 立ち上がり、立ち下りでなく常にソフトでESで切り換える為、変化するたびに割り込みが掛かるようです。
INTS:シリアル
(注)ソフトウェア割り込みはBIOSがサポートしていない為使用出来ません。
ROMカートリッジ ノーマル16KB PROMタイプ(コミックサーカス、ウィリーレーサetc)
VCCが独立していますが本体ではショートされていますが、カセットからROMを焼く事が出来るように設計されています。
ROMカートリッジ 32KB+8KBタイプ(熱血カンフーロード)
PC5を使ってバンク切り換えをしています。
32KB RAMカートリッジ 回路
AB15にインバータの74HC04ではなく74HC00なのは16KB用の部品を流用したためです。
これで通常のROMカセット(256KBitまで)のソフトならRAMカートリッジで動きます。
32KB+8KB RAMカートリッジ 回路 (注)何もチェックはしていないので参考です
128KB RAMカートリッジ 回路 (注)何もチェックはしていないので参考です
これだと熱血カンフーロードタイプがそのままではできません。(32KBごとのバンク切り替えの為)
そこで、あらかじめ展開しておけば動作すると思います。(回路を書いただけなので責任は持てません)
ROMカセットの認識方法
ROMカセットの認識はBIOSがチェックしており
先頭アドレス(08000H)に048H(アスキーコードで'H')があれば08001Hへジャンプするようになっています。
RAMカートリッジを使ったBIOSの吸い出し方法
RAMカートリッジのアドレスに次のプログラムを書きます。(SCV本体では08000Hになります。)
0000:48 48 24 34 00 00 24 00 90 14 FE 0F 31 52 FD 34
0010:00 36 7F B0 FA
RAMカートリッジに書きこんだらSCV本体に挿して電源を入れます。
すぐポーズ音が連続して鳴り続けましたらBIOSの転送が終わっていますので、SCV本体電源を切り
RAMカートリッジを吸い出して01000H-01FFFHのBIOSデータを抽出すれば終わりです。
ソースは下記のようになり00000H-00FFFHを09000H-09FFFHに転送してポーズ音を鳴らし続けるだけです。
8000 48 DB 'H' ;Header
;+++++++++++++++++
;+ Program Start +
;+++++++++++++++++
8001 48 24 DI
;++++++++++++++++++++++++
;+ Trans BIOS -> 09000H +
;++++++++++++++++++++++++
8003 34 00 00 LXI H,00000H ;BIOS Start Add
8006 24 00 90 LXI D,09000H ;Store Add
8009 14 FE 0F LXI B,00FFEH
800C 31 BLOCK
800D 52 DCR B
800E FD JR 0800CH
;--------------------
;+ Loop PAUSE Sound +
;--------------------
800F 34 00 36 LD H,03600H ;HL=Sound Port
8012 7F B0 CALF 0FB0H ;PAUSE Sound
8014 FA JR 0800FH
END
不完全なメモリ マップ(想像込み)
00000H-00FFFH:システムROM
02000H-027FFH:BG スプライト用 キャラクタジェネレータ
スプライト1枚は単色で16*16ドットでアトリビュートで32*32として使用できます。
1バイトは
-------------
|D7|D6|D5|D4|
|--+--+--+--|
|D3|D2|D1|D0|
-------------
となり、この横4ドット*縦2ドットをPnnとすると16*16ドットは
P00,P01,P02,P03
P04,P05,P06,P07
P08,P09,P10,P11
P12,P13,P14,P15
P16,P17,P18,P19
P20,P21,P22,P23
P24,P25,P26,P27
P28,P29,P30,P31
と、16*16ドット1枚の定義に32バイト必要になります。
このスプライト16*16を縦と横にそれぞれ2つに連結して32*32ドット1枚として使用できたりします。
02800H-02FFFH:CHR スプライト用 キャラクタジェネレータ
スプライト16*16を縦と横にそれぞれ2つに連結して32*32ドット1枚として使用できたり
2枚重ねて2色の16*16ドット1枚として使用できます。
03000H-031FFH:テキスト エリア 32*16/ブロック エリア
テキスト画面
0302Hで指定した表示範囲内にキャラクターコードを書くだけで,細かい事は03400H-03403Hで設定します。
キャラクターコードは基本はアスキーコードになっていて範囲は000H-07FHです。
1行は2ライン分で表示されますのでどうしても1ラインスペースがあいてしまいます。
テキストのキャラ解像度は8*8ドットです。
セミグラフィック(ブロック)画面
03402Hで指定した表示範囲外がセミグラフィック(ブロック)画面になります。
03400HのBit1が0でセミグラフィック画面
03400HのBit1が1でブロック画面
でどちらかの選択になります。
画面は手前から、CHRスプライト、BGスプライト、テキストの順です。
03200H-032FFH:スプライト BG アトリビュート 4バイト構成
+0 Bit7-Bit1 Y座標(0〜128、ただし0は表示しない)、Bit0 スプライトの連結(0=しない,1=する)
+1 Bit7-Bit4 上から何ライン*2表示しない、Bit3-Bit0 カラー
+2 Bit7-Bit1 X座標(0〜128)、Bit0 スプライトの連結(0=しない,1=する)
+3 Bit7-Bit1 キャラクターNo(0〜128)、スプライトの下側の表示(0=しない,1=する)
03300H-033FFH:スプライト CHR アトリビュート 4バイト構成
+0 Bit7-Bit1 Y座標(0〜128、ただし0は表示しない)、Bit0 スプライトの連結(0=しない,1=する)
+1 Bit7-Bit4 上から何ライン*2表示しない、Bit3-Bit0 カラー
+2 Bit7-Bit1 X座標(0〜128)、Bit0 スプライトの連結(0=しない,1=する)
+3 Bit7スプライトの分割、Bit6-Bit0 キャラクタ#(0〜128)
アトリビュートのアドレスが後ろになるほど前に表示されるようです。
16*16のスプライトをSnとすると
-------
|S0|S1|
|--+--|
|S2|S3|
-------
が32*32ドット分となります。
そこでS0のアトリビュートのX座標、Y座標、キャラクタ#の最下位ビットのフラグの組み合わせとスプライトの表示は
0,0,0
----
|S0|
----
0,0,1
----
|S2|
----
0,1,0
-------
|S0|S1|
-------
0,1,1
-------
|S2|S3|
-------
1,0,0
----
|S0|
----
|S2|
----
1,0,1
----
|S2|
----
|S2|
----
1,1,0
-------
|S0|S1|
|--+--|
|S2|S3|
-------
1,1,1
-------
|S2|S3|
|--+--|
|S2|S3|
-------
2色モード
03400Hのbit5を1にすると各スプライトATBの後半が2色モードになり1枚分のスプライトATBで2枚(2色分)表示する事ができます。
スプライトATBは1枚分で2枚目は設定する必要がありません(1枚目のATBで2枚目の表示するスプライト#を指定します)
アトリビュートのX座標、Y座標、キャラクタ#の最下位ビットのフラグの組み合わせで2枚目のスプライト#がきまります。
キャラクタ#は16個で1グループになり一番最初を#0-0,次のキャラクタを#0-1,#1-0,#1-1...#7-0,#7-1計16個とします。
----------- キャラクタジェネーレータ内(1枚あたり16*16ドットの32バイト)
|#0-0|#0-1|
|----+----|
|#1-0|#1-1|
|----+----|
|#2-0|#2-1|
|----+----|
|#3-0|#3-1|
|----+----|
|#4-0|#4-1|
|----+----|
|#5-0|#5-1|
|----+----|
|#6-0|#6-1|
|----+----|
|#7-0|#7-1|
-----------
キャラクタは1枚目を選択するとそれに対応したスプライトが表示されます。
例えばキャラクタ#3を1枚目に表示するように選択すると
0,0,0で#3-0のみ(もう1枚は透明?)
0,0,1で#3-1のみ(もう1枚は透明?)
0,1,0で#3-0,#7-0
0,1,1で#3-1,#7-1
1,0,0で#3-0,#3-1
1,0,1で#3-1,#3-0
1,1,0で#3-0,#7-1
1,1,1で#3-1,#7-0
になり、また#7を1枚目を表示すると2枚目は#3になります。この16個のスプライト内でそれぞれ対応しています。
#0は#4
#1は#5
#2は#6
#3は#7
カラーの選択は1枚目のATBで設定したカラーと各スプライトATBによって2枚目のカラーが決まります。
#n+#mで#nは2色モードで選択した1枚目のカラー、+#mは2枚目の対応するカラー
BGスプライトATB後半 03280H〜032FFH
#0+#0 | #1+#F | #2+#C | #3+#D
#4+#A | #5+#B | #6+#8 | #7+#9
#8+#6 | #9+#7 | #A+#4 | #B+#5
#C+#2 | #D+#3 | #E+#1 | #F+#1
CHRスプライトATB後半 03380H〜033FFH
#0+#0 | #1+#1 | #2+#8 | #3+#B
#4+#2 | #5+#3 | #6+#A | #7+#9
#8+#4 | #9+#5 | #A+#C | #B+#D
#C+#6 | #D+#7 | #E+#E | #F+#F
03400H:VDC ポート
Bit7:テキスト範囲の頂点Y 0=上,1=下
Bit6:テキスト範囲の頂点X 0=右,1=左
Bit5:スプライト画面 0=32*32単色モード,1=16*16重ね2色モード
Bit4:スプライトの全表示 0=Off,1=On
Bit3:スプライトのATBの参照 0=参照しない 1=参照する
Bit2:CHR スプライト画面の表示 0=On,1=Off
Bit1:テキスト スクリーンモード 0=セミグラフィック,1=ブロック
Bit0:セミグラフィックまたはブロック画面の表示 0 =Off,1=On
*Bit3のスプライトのATBの許可はINT2フックで処理をしているようで
これをしないとスプライトのATBが参照されず、表示されないようです。
ただし定義はされています。
*Bit0はテキスト表示は影響ありません。セミグラフィックもしくはビロック画面の表示です。
03401H:GRAPHIC COLOR
Bit7-4:セミグラフィックのカラー
Bit3-0:セミグラフィック(ブロック)画面のバックカラー
セミグラフィックまたはブロック画面のカラー設定を行います。
ただしセミグラフィックは画面全体のカラーでブロック画面は下位4ビットのみが有効です。
03402H:TEXT POINT
Bit7-4:テキスト範囲Y(上から何ライン分テキスト表示するか)
Bit3-0:テキスト範囲X(左から何カラム*2分テキスト表示するか)
テキスト範囲のポインタを設定します。
そして03400HのBit7とBit6でこのポインタがテキスト表示範囲のどの角か設定します。
03403H:TEXT COLOR
Bit7-4:テキストカラー
Bit3-0:バックカラー
テキストのカラーを表示します。(テキスト画面全体しか変えられません。)
バックカラーはテキストの範囲内です。
03410H-035FFH:不明
03600H:SOUND CPUへのポート
-037FFH:不明 恐らく空き領域
04000H-07FFFH:不明 未使用?
08000H-0FFFFH:ROMカセット領域(0E000H-0FFFFHはカセットによってはPC5を使ってバックアップRAMやROMとのバンク切り替え)
BIOS
00084H:乱数 Out A=乱数データ
00100H-001FFH:乱数表
00200H-006FFH:スプライト定義用 英数カナ記号CGデータ
00A1BH:テキストエリア クリア(03000H-031FFHを000Hで埋める)
00A29H:スプライトアトリビュート クリア(03200H-033FFHを00Hで埋める)
00A4AH:スプライトキャラクタジェネレータ クリア(02000H-02FFFHを000Hで埋める)
00A59H:アスキーコードからスプライト定義(英数カナ記号)
00EB6H:32バイトブロック転送 In:H=Data Address DE=Store Address
00FB0H:ポーズ音(前もってHL=03600Hにすること)
ワーク
0FF4EH:??? VDC
0FF64H:??? VDC Counter
0FFD2H:Stack Pointer
0FFD4H:??? Controller
0FFD5H:BIT7
BIT6
BIT5 PB5 CONTROLLER
BIT4 PB4
BIT3 PB3
BIT2 PB2
BIT1 PB1
BIT0 PB0
0FFD6H:BIT7 PB7 12KEY
BIT6 PB6
BIT5
BIT4
BIT3
BIT2
BIT1
BIT0
0FFD7H:12Key
0FFD8:BIT7
BIT6
BIT5 1P Trigger
BIT4 1P Trigger
BIT3
BIT2
BIT1
BIT0
0FFDAH:INTT用 Bit7=Key Read ready Bit6-Bit4=? Bit3-0 Table Jump#
0FFDBH:INT2 ES=1 Inc
0FFDCH:TIME 1/100Sec (BCD)
0FFDDH:TIME Sec(BCD)
0FFDEH:TIME Min(BCD)
0FFDFH:TIME Hour(BCD)
0FFE0:03400H Data:000H (It doesn't use it in BIOS)
0FFE1:03401H Data:000H (It doesn't use it in BIOS)
0FFE2:03402H Data:000H (It doesn't use it in BIOS)
0FFE3:03403H Data:000H (It doesn't use it in BIOS)
0FFE4H:Randomで使用
0FFE7H:Counter
0FFE8H:
0FFE9H:
0FFEAH:Set Sprite CG Counter(本体DEMOで使用)
0FFEBH:
0FFEFH:Counter
0FFF0H:Color Cheange Wait Counter:32 (本体DEMOで使用)
0FFF1H:INT0 ROMカセットのフック
0FFF4H:INTTのフック(主にキースキャンで使用)
0FFF7H:INT1 SOUNDのフック
0FFFAH:INT2 VDCのフック
0FFFDH:INTSのフック
A0080: DW A09F4 ;Waiting Full Time INT2
A0082: DW A09FD ;Waiting 1st Time INT2
A0084: DW A0A02 ;Random Out:A=Random
A0086: DW A0F62 ;SLL A*4
A0088: DW A0F6B ;SLR A*4
A008A: DW A0CCE ;Reverse 32Byte Data In:DE=Data Addrss
A008C: DW A0A1B ;Clear Text Area
A008E: DW A0A28 ;Clear Sprite ATB Area
A0090: DW A0A4A ;Clear CG Area
A0092: DW A0A30 ;??? Clear Block Screen2
A0094: DW A00CA ;???Tabel Jump In:A=Task#nn
A0096: DW A0AAF
A0098: DW A0AD9
A009A: DW A0AF4
A009C: DW A0B46
A009E: DW A0B19
A00A0: DW A0B6A
A00A2: DW A0BA1
A00A4: DW A0BE3
A00A6: DW A0BE7
A00A8: DW A0A59 ;
A00AA: DW A00E6
A00AC: DW A00F2
A00AE: DW A00EA
A00B0: DW A00F6
A00B2: DW A0D2C
A00B4: DW A0D48
A00B6: DW A0D4F
A00B8: DW A0D6B
A00BA: DW A0D72
A00BC: DW A0D96
A00BE: DW A0DD4
A00C0: DW A0DE0
A00C2: DW A0E81
A00C4: DW A0E98
A00C6: DW A0E31
A00C8: DW A0E2E
Home へ戻る