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