見出し画像

SGDK学習メモ:No.7、VRAMのマッピングについて確認してみる

*以下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 #13
SPRITE ATTRIBUTE TABLE Varies by H Resolution
  Base address designated by REGISTER #5
PATTERN 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の"980 bytes in V30 cell mode"は"960 bytes in V30 cell mode"のはず、980 bytesでは計算が合わない、P.46にも"H SCROLL DATA TABLE Max 960 Byte"とある。


要点は

  • VRAM中には7項目がマッピングされる

  • 各項目が必要とする容量は画面の解像度などにより異なる場合がある

となります。


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(64x28x2) 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→(960Bytes/(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.15
VSRAMはVRAM内ではなく
独立してメモリが確保されています
GENESIS Technical Overview ,P.24
垂直スクロールと水平スクロールの
設定用レジスタは共に#11です、
垂直スクロールは全画面 or 2CELL単位(LINE単位の設定はない)、
水平スクロールは全画面 or 1CELL単位 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

不足した情報や間違いに気づいた場合、随時修正をしていく予定です。

【了】

この記事が気に入ったらサポートをしてみませんか?