*以下SGDKは記述時点で最新版のSGDK 2.00 (january 2024) を使用しています
前回の続きです。
今回はVRAMのマッピングについて確認してみます。 参考にするのは前回同様メガドライブのゲームの作り方 その2 - 画面モードとVRAMのマッピング | Arcade Cabinet
とGENESIS Technical Overview (*PDFファイル) です。
一部内容は前回と重複します。
SGDKのデフォルトのVRAMマッピングは以下のようになっています。
SGDKがVRAMマッピングを 変更する(してくれる)場合があります、 詳細は前回参照 GENESIS Technical OverviewのP.80及びP.81にもSetting exampleとしてマッピング例が記載されています。
VRAMマッピング概要 メガドライブのVRAM容量は64KiBです。VRAM中のマッピングはある程度自由に変更可能です。
VDP (Video Display Processor) (中略) • 64 KBytes of dedicated VRAM (Video Ram)
GENESIS Technical Overview ,P.2 5. VRAM MAPPING In VRAM, there are various TABLEs and PATTERN GENERATORs as stated below. Among those, the base address of PATTERN GENERATOR TABLE and SPRITE GENERATOR TABLE are 0000H and fixed. However, the other base addresses can be freely assigned in VRAM by setting VDP REGISTER. Also, AREA can be overlapped. Therefore, TABLE can be commonly used by SCROLL screen and WINDOW for example.VRAMマッピング VRAMには様々なTABLEsやPATTERN GENERATORsが存在します。PATTERN GENERATOR TABLEとSPRITE GENERATOR TABLEの基底アドレス (base address)は0000Hで固定です。その他の基底アドレスはVDPレジスタの設定によりVRAM内で自由に割り当てが可能です。またAREA(アドレス)は重複可能です。そのため例えばTABLEはSCROLL画面やWINDOWなどで共通に使用することができます。
GENESIS Technical Overview ,P.79 翻訳文と一部補足を追加 要点は
VRAMは64KiB、VRAMには複数の設定項目(後述)が存在するが、これらはVRAM中でのマッピングが変更可能
PATTERN GENERATOR TABLEとSPRITE GENERATOR TABLEの基底アドレスは0000H(0x0000)固定
設定項目のアドレスは重複可能(AREA can be overlapped)(*前回の"パターン1) スクロール面ごとに必要なVRAMが2KiB "中のWINDOWとSCROLL B参照)
あたりでしょうか。
VRAM中でマッピングされる項目は以下になります。
SCROLL A PATTERN NAME TABLE Max. 8K Byte. Base address designated by Register #2.SCROLL B PATTERN NAME TABLE Max. 8K Byte. Base address designated by REGISTER #4.WINDOW PATTERN NAME TABLE varies by H Resolution Base address designated by REGISTER #3.H SCROLL DATA TABLE 1K Byte Base address designated by REGISTER #13SPRITE ATTRIBUTE TABLE Varies by H Resolution Base address designated by REGISTER #5PATTERN GENERATOR TABLE Base address is 0000H (fixed).SPRITE GENERATOR TABLE Base address is 0000H (fixed). There are 1K Bytes for H SCROLL TABLE , however, as for display 896 Bytes in V28 cell mode and 980 bytes in V30 cell mode. There are 2K bytes for WINDOW PATTERN NAME TABLE in H32 cell mode, and 4K byte area in H 40 cell mode. For details refer to WINDOW. There are 512 bytes for SPRITE ATTRIBUTE TABLE in H32 cell and 1K byte area in H40 cell mode. However as for display, there are 640 bytes in H40 cell mode. トータル7つの項目(TABLE)が存在する(*後に説明するためここでは翻訳文を省略)。H SCROLL TABLE は1K Bytes確保されているが、表示のためにはV28(縦28 CELL)の場合896 Bytes、V30(縦30 CELL、PAL環境限定)の場合980 Bytesが使用される。WINDOW PATTERN NAME TABLE にH32(横32 CELL)の場合は2K Bytes、H40(横40 CELL、デフォルト)の場合は4K Bytes(最大)確保する。詳細は別ページのWINDOWの説明を参照。SPRITE ATTRIBUTE TABLE はH32の場合512 Bytes、H40の場合1K Bytes確保される。しかし表示のためにH40の場合640 Bytesが使用される。
GENESIS Technical Overview ,P.79 翻訳文を追加、翻訳は一部省略及び補足を追加 *H SCROLL TABLE の"98 0 bytes in V30 cell mode"は"96 0 bytes in V30 cell mode"のはず、980 bytesでは計算が合わない、P.46にも"H SCROLL DATA TABLE Max 96 0 Byte"とある。
要点は
となります。
VRAM中にマッピングされる7項目(TABLE)について VRAM中にマッピングされる7項目(TABLE)について確認していきます。
(No.1) SCROLL A PATTERN NAME TABLE と(No.2) SCROLL B PATTERN NAME TABLE (長いので以下SCROLL TABLEs )
スクロールするAとBの2面の情報を格納します。
前回 のスクロール面のサイズの設定とVRAMのマッピング(一部)について と重複する内容になりますが軽く説明しておきます。 スクロール面のサイズは32 CELL、64 CELL、128 CELLの組み合わせでトータル6パターンあり、幅*高さ(=解像度)によって必要なメモリ量が2KiB、4KiB、8KiB(最大)と変わります。
VRAMのマッピングとして指定するアドレスには項目ごとにルール(制限)があり、SCROLL TABLEs では0x2000(8192/8KiB)の倍数 を指定します。 *仮に必要なメモリ量が2KiBでも8KiBの倍数を指定する
doc/html/index.html 「SCROLL TABLEsのAとBの両方を使用する」 とした場合、AとBに指定する基底アドレスは0xC000、0xE000固定と考えて良さそうです。 SGDKのVDP_setPlaneSize()実行時、スクロール面の解像度を問わず SCROLL A PATTERN NAME TABLE → 0xE000(VDP_setBGAAddress(0xE000)) SCROLL B PATTERN NAME TABLE → 0xC000(VDP_setBGBAddress(0xC000)) となっています(デフォルト時も同値)。
(No.3) WINDOW PATTERN NAME TABLE
SCROLL Aの一部で、スクロールしない背景の情報を格納します。
WINDOW PATTERN NAME TABLE varies by H Resolution (中略) There are 2K bytes for WINDOW PATTERN NAME TABLE in H32 cell mode , and 4K byte area in H 40 cell mode .
GENESIS Technical Overview ,P.79 とあるように画面解像度によって必要なメモリ量が異なり、32 cell wide mode(H32)の場合2KiB、40 cell wide mode(H40)で4KiBとなります。
_ WINDOW PATTERN NAME _ (中略) The PATTERN NAME, the same as in SCROLL SCREEN, requires 2 bytes ( 1 Word ) per cell.
GENESIS Technical Overview ,P.59 1 CELLごとに2 BYTES使用します。
WINDOW PATTERN NAME TABLE に指定するアドレスは、40 cell wide modeの場合0x1000(4096/4KiB)の倍数 を指定します。
doc/html/index.html 32 cell wide mode(H32)の場合は0x800(2048/2KiB)の倍数
このWINDOW PATTERN NAME TABLEについてわからないことがあります。Hidecadeさんのサイトに
<ウインドウ面の設定> (中略) 最大40x28CELLの範囲を使用します。VRAMを横一行に40CELLではなく64CELL使用していため 、縦28CELL全部使用する設定だと、ウインドウ面用に3584(64 x28x2) BytesのVRAMを確保する必要があります。
https://ameblo.jp/arcade-cabinet/entry-12269462843.html とあります。”64CELL使用していため ”とありますが、この64 CELL がわかりません。スクロール面のサイズの幅でしょうか? WINDOWはスクロールしない 固定画面であり、必要となる最大メモリ量は私の計算だと H32 * V28 * 2 BYTES= 1792 BYTES(2KiBに収まる) H32 * V30(PAL限定) * 2 BYTES= 1920 BYTES(2KiBに収まる) H40 * V28 * 2 BYTES= 2240 BYTES(2KiBに収まらないので4KiB) H40 * V30(PAL限定) * 2 BYTES= 2400 BYTES(2KiBに収まらないので4KiB) のいずれかとなります。 仮に64 CELLがスクロール面の幅だとした場合 H128 * V30(PAL時) * 2 BYTES= 7680 BYTES も成り立ち
§ WINDOW Fir WINDOW display, the following register setting and VRAM areas are required. (中略) VRAM: WINDOW PATTERN NAME TABLE MAX 4K BYTES
GENESIS Technical Overview ,P.55 Firは恐らくForの誤字 の説明にある最大4KiBを超えてしまいます。 とりあえず今のところGENESIS Technical Overviewに従い「WINDOW PATTERN NAME TABLEには4KiBを割り当てる」ということにしておきます。 *ここは解決したら追記、修正します
(No.4) H SCROLL DATA TABLE
水平方向(Horizon/Horizontal)のスクロールのデータ の情報を格納します(垂直方向のスクロールについては後述)。
確保するメモリ量は固定で1KiBですが、実際に使用される最大メモリ量は縦解像度によって異なります(28CELL/V28で896 Bytes、 30CELL/V30で980 bytes、GENESIS Technical Overview ,P.79)。
③スクロールA面とスクロールB面の水平スクロール量(H SCROLL DATA TABLE ) 画面全体をまとめてスクロールするモードと、CELL単位でスクロールするモードと、ライン毎にスクロールするモードがあります。 ライン毎だと1 K Bytes(256 Lines x 2 Bytes x 2画面)使用。全画面だと4 Bytesのみです。
https://ameblo.jp/arcade-cabinet/entry-12269462843.html 「H SCROLL DATA TABLE は1KiBあれば足りる」 「1ラインごとに2Bytes必要」(全画面スクロールだと1画面ごとに2Bytesでトータル4Bytes) となります。 (28CELL→(896Bytes/(28CELL*8PIXEL))/2Screens = 2 Bytes per HLine、 30CELL→(96 0Bytes/(30CELL*8PIXEL))/2Screens = 2 Bytes per HLine)
H SCROLL DATA TABLE のアドレスには0x400(1024/1KiB)の倍数 の倍数を指定します。
doc/html/index.html
以下H SCROLL DATA TABLEに関連する補足です。
1)VSRAMについて & 垂直/水平の設定を行うレジスタについて 垂直方向(Vertical)のスクロール用メモリはVSRAM(Vertical Scroll RAM) としてVRAMではなくVDP内部 に確保されています。サイズは80Bytes(0x00-0x4F)(GENESIS Technical Overview ,P.79)です。 ただし垂直スクロール、水平スクロールの設定用レジスタは共通で#11です。
GENESIS Technical Overview ,P.15VSRAM はVRAM内ではなく 独立してメモリが確保されています GENESIS Technical Overview ,P.24 垂直スクロールと水平スクロールの 設定用レジスタは共に#11です、 垂直スクロールは全画面 or 2 CELL単位(LINE単位の設定はない)、 水平スクロールは全画面 or 1 CELL単位 or 1LINE単位 が選択できます 2)スクロールのモードとサンプルについて 水平スクロールのモード → 全画面、1 CELL単位、1 LINE単位 垂直スクロールのモード → 全画面、2 CELL単位(武者アレスタの3面とか ) が存在するのですが(上図 GENESIS Technical Overview ,P.24参照)、これらの実装サンプルはSGDK. Scroll of layers, tiles, lines. - Under-Prog.ru
がスクショも多く参考になります。 事前にVDP_setScrollingMode()でスクロールの設定を行い、VDP_setHorizontalScrollTile()やVDP_setHorizontalScrollLine()などで実際のスクロール処理を行う、という実装になっているようです。 あとで実際に手を動かして確認してみる予定です。
(No.5) SPRITE ATTRIBUTE TABLE
スプライトの情報を格納します。
画面の解像度によって表示できる最大スプライト数が異なるのですが
There are 64 sprites available when the screen is in 32 cell wide mode. Or 80 when the screen is in 40 cell wide mode.
GENESIS Technical Overview ,P.13 それに伴い必要となるメモリも以下のように異なります(すでに引用済みの部分もありますがもう一度引用しておきます)。
There are 512 bytes for SPRITE ATTRIBUTE TABLE in H32 cell and 1K byte area in H40 cell mode. However as for display, there are 640 bytes in H40 cell mode.
GENESIS Technical Overview ,P.79 ④スプライトアトリビュートテーブル(SPRITE ATTRIBUTE TABLE) スプライトの座標・使用パターン・パレット・セルの反転・表示優先順位・次に描画されるスプライトの番号を定義したデータをスプライトアトリビュートテーブルと呼び、1スプライトで8 Bytes使用します。80個のスプライトで 640 Bytes使用します。
https://ameblo.jp/arcade-cabinet/entry-12269462843.html 「SPRITE ATTRIBUTE TABLE は1KiBあれば足りる」 となります。 (32 CELL(H32) → 8 Bytes * 64 Sprites = 512 Bytes、40 CELL(H40) → 8 Bytes * 80 Sprites = 640 Bytes(確保メモリ量は1KiB))
SPRITE ATTRIBUTE TABLE のアドレスには40 cell wide mode(H40)の場合0x400(1024/1KiB)の倍数 の倍数を指定します。
doc/html/index.html 32 cell wide mode(H32)の場合は0x200(512)の倍数
(No.6) PATTERN GENERATOR TABLE と (No.7) SPRITE GENERATOR TABLE (長いので以下GENERATOR TABLEs )
スプライトと背景の画像データ情報を格納します。
§ 1 DISPLAY SPECIFICATION DISPLAY SPECIFICATION OUTLINE (中略) CHARACTER GENERATOR 8*8 CELLS 1300-1800 depending on general system configuration.
GENESIS Technical Overview ,P.13 とあるように、GENERATOR TABLEs に画像データとして格納できるCELL数は1300CELL~1800CELLとなっています。
_ PATTERN GENERATOR _ PATTERN GENERATOR has VRAM 0000H as ,base address, and a pattern is expressed on a 8x8 dot basis. To define a pattern, 32 bytes are required.
GENESIS Technical Overview ,P.53 _ SPRITE PATTERN GENERATOR _ The SPRITE PATTERN GENERATOR with VRAM OOOOH as BASE ADDRESS, expresses one pattern on a basis of 8x8 dots. 32 bytes are required to define one pattern.
GENESIS Technical Overview ,P.64 ⑤パターンジェネレーター(PATTERN & SPRITE GENERATOR TABLE ) スプライト・スクロールA面・スクロールB面の表示に必要なビットマップ画像を一般的にパターン(patterns) と呼んでいます。 スプライト に使用されるものをスプライトジェネレーター 、スクロール面 に使用されるものをパターンジェネレーター と呼びます。パターンデータは両者で共有されます 。先頭アドレスは0x0000固定です。がデータサイズは任意です。 データはセル単位の配置になります。 1CELLは16色(4bit)の8x8pixelで1CELLは 4 x 8 x 8 = 32 bytesのデータになります。
https://ameblo.jp/arcade-cabinet/entry-12269462843.html GENERATOR TABLEs のアドレス開始位置は0x0000固定で、終了位置は他のTABLEの設定により変わります。 1 CELLのデータサイズは32 Bytesです(←この1 CELL per 32Bytesという情報はGENESIS Technical Overviewには記載がないようです)。
SGDKのデフォルトだと以下のVRAMメモリマッピングとなります(すでに掲載済みですが、上にスクロールさせずに済むようにもう一度掲載しておきます)。
GENERATOR TABLEsの アドレスは0x000-0xBFFF 上図マッピングの場合GENERATOR TABLEsが保持できるCELL数は 49152(0xBFFF+1) BYTES / 32 BYTES = 1536 CELL となります(先の”1300CELL~1800CELL”とも合致する)。
SGDKではGENERATOR TABLEsの末尾に文字データ96 CELLが格納されています。
SGDKでのVRAMマッピングはデフォルト時の 状態でGensでVDPを表示している状態、 GENERATOR TABLEsの末尾は▶で0x05FF(1535)番目 (*0始まり) この文字列は上書き可だが書き換えると文字が表示できなくなる GENERATOR TABLEsのアドレスは先頭0x0000から他の項目(TABLE)までの空き領域が割り当てられるため、VDP_setXXXAddress()のようなメソッドはありません。
Unoccupied area is used as PATTERN GENERATOR and SPRITE GENERATOR.
GENESIS Technical Overview ,P.80 ,P.81 不足した情報や間違いに気づいた場合、随時修正をしていく予定です。
【了】