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 へ戻る