VDP(315−5124)
もう1個VDPを追加して2つで連動して動作する様に設計されており、
VDPを一個しか搭載していないMARK IIIでは
あまり意味を持たない機能などが存在したり
スプライトのアトリビュートの並び方が若干変な構成をしているのは
恐らくこの為である。
使用RAM:16KB+VDPチップ内蔵カラーパレットメモリ(32B)
カラー64色中16パレット(BG)+16パレット(スプライト、ボーダーカラー)
キャラクターパターン最大512キャラクター(実際には448キャラクター)
ハードウェアスクロール機能:有り
PSG内蔵(SN76489コンパチ)
I/Oポート
07EH:現在のVカウンター(リードのみ)
07FH:現在のHカウンター(リードのみ)
0BEH:データ レジスタ
0BFH:コマンド レジスタ(ライト時)/ステータス レジスタ(リード時)
アクセスの方法
MARKIIIはTMS9918とほぼ同じ動作するモードを持ち、
アクセスの方法はTMS9918とほぼ同じです
レジスタ(以降 R#nn)の設定方法
ポート0BFHにデータを入れて、次にコマンドコードを入れてアクセスします
MARKIIIの画面モードの設定はTMS9918で未使用の部分を割り当てているので、
その部分をセットすることでMARKIIIの画面モードに切り替えを行います
コマンド コード:000H〜03FH VDPがリードするメモリの上位アドレス、下位アドレスはデータでセットします
コマンド コード:040H〜07FH VDPがライトするメモリの上位アドレス、下位アドレスはデータでセットします
コマンド コード:080H〜08AH VDPレジスタにnnのデータをセットする
コマンド コード:0C0H カラーパレットの上位アドレス下位アドレスはnn(000H〜01FH)
ポート0BFH コマンド フォーマット
1回目:データ
d7:D7
d6:D6
d5:D5
d4:D4
d3:D3
d2:D2
d1:D1
d0:D0
2回目:コマンド コード
d7:M1 ;M1〜M0:11=カラーパレットのアクセス、 D13−0がアドレス、ポート0BEHの内容がデータになる
d6:M0 ;M1〜M0:10=VDP R#nnのアクセス、D13−8がR#nn、D7−0がデータになる。
d5:D13 ;M1〜M0:01=V−RAMのライト、 D13−0がアドレス、ポート0BEHの内容が出力データになる
d4:D12 ;M1〜M0:00=V−RAMのリード、 D13−0がアドレス、ポート0BEHの内容が入力データになる
d3:D11
d2:D10
d1:D9
d0:D8
VRAMのアクセス方法
ポート0BFHにアドレスの下位を入れて、次にポート0BFHにアドレスの上位
アドレスの上位に読みこむ場合は+000H、書き込む場合+040H、(カラーパレットの場合は+0C0H)
ポート0BEHにデータを書き込む(または読む)
<例>VRAM 01234Hに0FFHを出力する場合
DI
LD A、34H ;下位アドレス
OUT (0BFH)、A
LD A、52H ;上位アドレス 012H + 040H
OUT (0BFH)、A
LD A、FFH ;データ
OUT (0BEH)、A
EI
<例>VRAM 01234Hの内容をAレジスタに入力する場合
DI
LD A、34H ;下位アドレス
OUT (0BFH)、A
LD A、12H ;上位アドレス
OUT (0BFH)、A
IN A、(0BEH)
EI
(注)アクセスの途中で割り込みが掛かると正確にアクセスが出来ない事がります
レジスタ
VDPを制御するレジスタはR#0〜R#10までありますが、
まだ詳しいことが解っていません。
R#00
d7:VSI 縦スクロール時に画面右端64ドット(BG8桁)を固定 1=オン、0=オフ
d6:HSI 横スクロール時に画面上端16ドット(BG2行)を固定 1=オン、0=オフ
d5:LCB 画面左端8ドット(BG1桁)のマスク 1=オン、0=オフ
d4:IE1 H−LINE割り込み(VDP R#10の設定が必要) 1=オン、0=オフ
d3:SS 全てのスプライトを左へ8ドットシフト 1=オン、0=オフ
d2:1 MK IIIモード(0=9918モード) 1=オン、0=オフ
d1:1 常に1(9918モードではM2)
d0:ES External Sync 1=オフ、0=オン
R#01
d7:1
d6:BLANK(画面表示) 1=オン、0=オフ
d5:IE V−BLANK割り込み 1=オン、0=オフ
d4:常に0 (9918モード M1)1=224ライン、0=192ライン
d3:常に0 (9918モード M3)1=240ライン、0=192ライン
d2:常に0
d1:SZ 9918モード 1=16×16、0=8×8ドット
MK IIIモード 1=8×16、0=8×8ドット
d0:常に0 (9918モードMAG)1=オン、0=オフ
IE(Interrput Enable)
IE1、IE=1、1 H−LINE、V−BLANK割り込み
1、0 H−LINE割り込みのみ
0、1 V−BLANK割り込みのみ
0、0 割り込み無し
R#02 ネームテーブル・ベース
d7:不明、常に1 d7〜4、0はメイズウォーカで反転したりする
d6:不明、常に1
d5:不明、常に1
d4:不明、常に1
d3:ネームテーブル AD13(224ラインの場合AD3)
d2:ネームテーブル AD12(224ラインの場合AD2)
d1:ネームテーブル AD11(224ラインの場合 無効 )
d0:1=d3−1をネームテーブルで使用
0=不明 イースで使用(ネームテーブル?)上から17ブロック目から1ブロック目のラインを表示
・−−−−−−−−−−−−・
|データ |ネームテーブル|
|−−−−+−−−−−−−|
|0F1H| 00000H|
|0F3H| 00800H|
|0F5H| 01000H|
|0F7H| 01800H|
|0F9H| 02000H|
|0FBH| 02800H|
|0FDH| 03000H|
|0FFH| 03800H|*通常は0FFHを設定する
・−−−−−−−−−−−−・
R#03 ???キャラクタの重ね合わせ
カラーも分断されてキャラクタを重ねるようにしています。
d7−3=??? キャラクタコード上位5ビットのパターン
d2−0=キャラクタコード下位4ビットのパターン
R#04
不明すべて1にセット
R#05 スプライトアトリビュートテーブルベース
d7:不明、常に1
d6:スプライトアトリビュートテーブルベース A13
d5:スプライトアトリビュートテーブルベース A12
d4:スプライトアトリビュートテーブルベース A11
d3:スプライトアトリビュートテーブルベース A10
d2:スプライトアトリビュートテーブルベース A9
d1:スプライトアトリビュートテーブルベース A8
d0:不明、常に1
R#06 スプライトパターンジェネレータテーブルベース
d7:不明、常に1
d6:不明、常に1
d5:不明、常に1
d4:不明、常に1
d3:不明、常に1
d2:スプライトパターンジェネレータテーブルベース A13
d1:不明、常に1
d0:不明、常に1
スプライトパターンジェネレータテーブルベース A13を0にするとCGバンク0がスプライト用のCG
スプライトパターンジェネレータテーブルベース A13を1にするとCGバンク1がスプライト用のCGになります
R#07 カラー
d7:不明、常に0
d6:不明、常に0
d5:不明、常に0
d4:不明、常に0
d3−0:ボーダーカラー、スプライト用のカラーパレット番号(0から15)を使用
R#08 水平スクロール
000H−0FFH
R#09 垂直スクロール
000H−0FFH
R#10 水平同期カウンタ
何ライン目で水平同期割り込みを発生するか設定します
000H=1−191
001H=2−190
002H=3−189
003H=4−188
|
0C0H〜0FFH=無し(0FFHは割り込み無し)
ステータスレジスタ
d7:F 1=VBLANK割り込み、0=H−LINE割り込み
d6:9S スプライトオーバーフロー 8つ以上のスプライトが 1=並んだ、0=並んでいない
d5:C スプライト衝突フラグ 1=衝突した、0=衝突してない
d4:−
d3:−
d2:−
d1:−
d0:−
カラーパレット
カラーパレットは全部で32個有り、アドレスは00000H〜0001FHで
前半16バイトがバンク0(主にBG画面用)
後半16バイトがバンク1(スプライト用)に割り当てており、
バックカラー はバンク0のパレットに割り当てられます
ボーダーカラーはバンク1のパレットに割り当てられます
カラーデータは下記の様になります。
d7:−
d6:−
d5:B1
d4:B0
d3:G1
d2:G0
d1:R1
d0:R0
00=COLOR OFF
01=1/3の明るさ
10=2/3の明るさ
11=一番明るい
スクリーン設定>
MARK III以降の画面モードにするにはR#0のBit2(M4)を1にしなければいけません
M4が0ならTMS9918のモードになります
またM3からM1で細かい設定が出来ます
市販ソフトの設定例
(例)北斗の拳
R#00=016H,R#01=0A0H,R#02=0FFH,R#03=0FFH,R#04=0FFH,R#05=0FFH
R#06=0FBH,R#07=000H,R#08=000H,R#09=000H,R#10=0FFH
(例)HANG−ON
R#00=066H,R#01=082H,R#02=0FFH,R#03=0FFH,R#04=0FFH,R#05=0FFH
R#06=0FBH,R#07=00CH,R#08=000H,R#09=000H,R#10=0FFH
(例)Woody Pop
R#00=006H,R#01=0E0H,R#02=0FFH,R#03=0FFH,R#04=0FFH,R#05=0FFH
R#06=0FBH,R#07=000H,R#08=000H,R#09=000H,R#10=0FFH
キャラクタ パターン(VRAM 00000H〜037FFH)
任意のBGやスプライトのキャラクタを定義する場所です。
背景およびスプライトは8×8ドットの512パターンで構成されますが
MARK IIIは最大448パターンまでパターンを定義出来ます
512パターンはVDPを2つ使用するときに可能の様です
各パターンはプレーン構成され、それぞれカラーパレットに対応します
また、ネームテーブルの設定でパターン数が変ります
BGの左上だけにパレットNo15のドットを打つDATAは、
080H,080H,080H,080H...以降28バイトは000H
BGの左上だけにパレットNo14のドットを打つDATAは、
000H,080H,080H,080H...以降28バイトは000H
つまり最初の1バイトはカラーパレットのビット0が1ライン、2バイト目がカラーパレットのBit2となって
カラーパレットは16個なのでBit0−3で4バイトで1ラインの構成となります
1ラインで4バイト、1パターンで32バイトとなります
全部で1ライン(4バイト)×8ライン×448パターン=14336(03800H)バイトとなります。
CGバンク0=00000H〜01FFFH
CGバンク1=02000H〜037FFH
ネームテーブル (よく使われるアドレス:VRAM03800H〜03EFFH)
キャラクタ パターンで定義したキャラクタを画面の何処に表示するか指定する場所です
192ラインモードではVDP R#02のBit3−1がテーブルアドレスのAD13−AD11になりますが
224ラインモードではVDP R#02のBit3−2の組み合わせでテーブルアドレスが決まります(MASTER SYSTEM2以降?)
ADB3〜2:00=00700H
ADB3〜2:01=01700H
ADB3〜2:10=02700H
ADB3〜2:11=03700H
BGは1ブロック(8×8ドット)から構成されます。
ネーム・テーブルは32×28ブロック分で画面に表示されるのはVDPの設定によって変ります
192ラインモードでは32×24ブロック、残りの32×4ブロックは表示されません
224ラインモードでは32×28ブロック(MASTER SYSTEM2以降?)
240ラインモードでは32×32ブロック(MASTER SYSTEM2以降かつPAL仕様?)
またスクロールは球面スクロールになりますので表示されない部分に前もって描いておけば
次のBGを描画している所は見えないように延々とスムーズスクロールが出来ます。
1キャラクタ表示するのに2バイト必要となります。
第1バイト
d7:CH7
d6:CH6
d5:CH5
d4:CH4
d3:CH3
d2:CH2
d1:CH1
d0:CH0
第2バイト
d7: − (未使用だがいくつかのゲームはフラグとして使用)
d6: − (未使用だがいくつかのゲームはフラグとして使用)
d5: − (未使用だがいくつかのゲームはフラグとして使用)
d4:PRI プライオリティフラグ 1=スプライトの前に表示、0=スプライトの後ろに表示
d3:CPT カラーパレットの選択
d2:RVV 垂直反転 1=オン、0=オフ
d1:RVH 水平反転 1=オン、0=オフ
d0:CH8
CH8〜0で512キャラクタまで選択できますが
MRAKIIIではキャラクタパターン容量の都合で448キャラクタまで
1ブロック(2バイト)×32ブロック(横ライン)×28ブロック(縦ライン)=1792(0700H)バイト
またプライオリティ・フラグを1にしてスプライトの前に表示出来るようした場合
カラーパレットNo.00のドット部分が透明になります
スプライトアトリビュートテーブル (よく使われるアドレス:VRAM03F00H〜03FFFH)
各スプライトは32個まで定義でき、スプライト属性テーブルに定義されます。
03F00H〜03F3FH:スプライト#nnのY座標 32バイト分使用
03F40H〜03F7FH:未使用(おそらく拡張用 MARKIIIでは空き領域)
03F80H〜03FFFH:スプライト#nnのX座標、パターン・インデックス
Y座標は実際には+1足され表示されます。したがって、Y座標0の値ではスキャンライン0ではなく、
スキャンライン1にスプライトを表示します
スキャンライン0から表示するには255(0FFH)をセット
Y座標が208(0D0H)にすると、そのスプライトの優先度の低いスプライトは表示されません
スプライト#10のY座標が208ならそれ以降のスプライト#10〜#31が表示されません(192ドット・モードのみ)
224モードおよび240モードでは、Y座標の208は特別な意味はありません
X座標が248(0F8H)を越える場合、
画面表示外のスプライトは、残りの部分は表示されません
VDP R#0 d3=1の場合、
スプライトのX座標は8マイナスされて扱われます
左端での表示の場合、画面表示以外の残りの部分は表示されません
パターン・インデックスは、使用する256のパターンのうちの1つを選択します
VDP R#6のビット2のスプライトパターンジェネレータテーブルベース A13は
スプライトのキャラクタ パターンのアドレスを決めます
アドレスはA13しかないので00000Hか02000Hの2種類のみ
00000Hだとパターン0〜255ですが02000Hだと256〜512(正しくは256〜448)まで
VDP R#1のビット1が1の場合(8×16モード)パターン・インデックスのビット0が無視されます。
パターン・インデックスは、8×16スプライトのトップのために使用されるパターンを選択します。
VDP R#1のビット0が1の場合、スプライトのドットはサイズを2倍にするために拡大します。
8×8スプライトは16×16ドット(8×16スプライトの場合16×32ドット)です。
ただし8×16ドットの時動作がおかしくなるらしい。どうやらTMS9918の名残りか、2つのVDPを
連動するときの為であろうと思われます。(TMS9918も連動することが出来る)
MARK III/マスターシステムのVDPがマスターシステムII、ゲームギア等のVDPと比較して、
スプライトの拡大の部分に、若干違いがある様です
スプライトの衝突
2つのスプライトからの2の透明でないドットが重なったとき、VDP R#0のd5=1になる
最初の重なったスプライトだけ有効で、フレーム毎に1つのスプライトの重なりをみているだけである
市販のゲームのキャラクターデータ
カードゲーム等の小容量では少しでもデータ量を削減する為にソフトでデータ圧縮を行なっています
まずデータを読み、000HならDataの終わり、
d7が0なら次のデータを前のデータ分(最大128)セット(データフィル)
d7が1なら次のデータを前のデータ分以降(d7を無視するので最大128)をセット
以降000Hがでるまで繰り返しをします。
データが008H,0FFH,000Hなら、0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
データが084H,000H,001H,002H,0003H,000Hなら000H,001H,002H,0003H
データが084H,000H,001H,002H,0003H,004H,0FFH,000Hなら000H,001H,002H,0003H,0FFH,0FFH,0FFH,0FFHになります
MARK IIIのコーナへ
Home へ戻る