프로그래밍/SGDK 메가드라이브 개발

메가드라이브 게임 만들기 #2 - 화면 모드와 VRAM의 매핑

windship 2019. 6. 3. 23:33

 이번에는, 메가드라이브의 화면 표시에 대해, 화면 모드와 VRAM의 매핑에 대해서 정리해 봤습니다. 자신이 생각하는 대로 표시를 하기 위해서는, 메가드라이브의 이미지 표시 방식에 대해 어느 정도 이해를 할 필요가 있습니다.

 

<메가드라이브의 화면 모드>

 

1. GRAPHIC IV 모드 : 마스터 시스템과의 호환 모드

2. GRAPHIC V 모드 : 메가드라이브의 16비트 모드

 

이렇게 2종류가 있습니다만, 기본적으로는 GRAPHIC V 모드를 사용합니다.

 

 

 위 그림과 같이 (1) 스프라이트 레이어(SPRITE), (2) 윈도우 레이어(WINDOW), (3) 스크롤 A 레이어(SCROLL A), (4) 스크롤 B 레이어(SCROLL B)의 4개 레이어가 존재합니다. 각각의 레이어(스프라이트 레이어는 제외)를 플랜(PLAN) 이라 부릅니다.

 PRIORITY CONTROLLER가 표시 순서를 관리하고 있어, 스프라이트 레이어는 스프라이트 단위로, 그 외의 배경 레이어는 CELL(셀) 단위(8x8 도트를 1 CELL이라고 부릅니다)로 표시 순서를 임의로 설정 가능합니다. PRIORITY의 설정이 같은 경우, 위 그림의 순서대로 표시됩니다.

 다만, 윈도우 레이어(WINDOW)와 스크롤 A 레이어(SCROLL A)는, 공통의 플랜에 표시되고 있기 때문에 겹쳐서 표시하는 것은 불가능합니다.

 

<화면의 해상도 설정>

 

(1) 32x28 CELL(256x224 픽셀)과 (2) 40x28 CELL(320x224 픽셀)의 2종류 모드가 있습니다. 특징으로는 40x28셀 모드일 경우 스프라이트는 80장을 사용할 수 있고, 32x28셀의 경우에는 스프라이트 64장을 사용할 수 있습니다.

 

 SGDK에서는 다음과 같이 하여 해상도를 설정 가능합니다.

 

VDP_setScreenWidth320(); // 40x28셀 모드로 설정

VDP_setScreenWidth256(); // 32x28셀 모드로 설정

 

<스크롤 레이어의 사이즈 설정>

 

 스크롤 A 레이어(SCROLL A)와 스크롤 B 레이어(SCROLL B)는 사이즈 변경이 가능해서, 이하의 사이즈 중에서 선택이 가능합니다. 이 범위의 사이즈라면 한번에 이미지를 읽어들이는 것이 가능합니다. 다만, 판타지 존과 같이 배경 레이어가 넓은 경우(가로 256 CELL)는 한번에 읽어들일 수가 없으므로, 스크롤에 맞춰서 이미지를 다시 읽어줘야 할 필요가 있습니다. 범위가 넓어지면 당연히 VRAM의 사용량이 많아집니다. 보통은 64x32 셀로 설정하는 것으로 문제없지 않을까 라고 생각합니다.

 

(1) 32x32 셀 2Kbytes (32x32x2bytes = 2048 bytes 사용)

(2) 32x64 셀 4Kbytes 

(3) 32x128 셀 8Kbytes

(4) 64x32 셀 4Kbytes

(5) 64x64 셀 8Kbytes

(6) 128x32 셀 8Kbytes

 

 SGDK에서는 다음과 같이 하여 설정합니다.

 

VDP_setPlanSize(64, 32) // 64x32 셀로 설정

 

 

<윈도우 레이어의 설정>

 예를 들어, 판티지 존의 위쪽에 있는 스코어 패널의 표시 등에 사용합니다. 스크롤이 되지 않습니다. 설정 가능한 것은 4각형의 범위로, 한 군데 뿐입니다.

 화면에 대해서, 상단, 하단, 우측단, 좌측단, 좌상단, 우상단 같은 설정도 가능합니다. 최대 40x28 셀 범위에서 사용합니다. VRAM을 가로 한 줄로 40 셀이 아니라 64 셀을 사용하기 위해서, 세로 28 셀을 전부 사용하는 설정이라면, 윈도우 레이어에서 3584(64x28x2) bytes의 VRAM을 확보할 필요가 있습니다.

 

SGDK의 설정

 

VDP_setWindowVPos(FALSE, 5); // 상단의 5셀 부분을 윈도우 레이어로 사용

 

<VRAM의 매핑 설정>

 

 메가드라이브의 VRAM에는 64Kbytes의 용량이 있습니다. 매핑은 자유롭게 변경 가능하고, 이해의 내용이 VRAM에 사용됩니다.

 

(1) 스크롤 A 레이어의 패턴 네임 테이블(SCROLL A PATTERN NAME TABLE)

    각 플랜의 셀의 사용패턴, 파레트, 셀의 반전, 표시 우선순위 등을 정의한 데이터를 패턴 네임 테이블이라고 부르고, 1 셀로 2Bytes를 사용합니다. 최대 8Kbytes(128x32x2Btytes)

(2) 스크롤 B 레이어의 패턴 네임 테이블(SCROLL B PATTERN NAME TABLE). 최대 8k를 사용 가능.

(3) 스크롤 A 레이어와 스크롤 B의 수평 스크롤 양(H SCROLL DATA TABLE) 화면 전체를 한꺼번에 스크롤하는 모드, 셀 단위로 스크롤 시키는 모드, 그리고 라인 단위로 스크롤 시키는 모드가 있다.

(4) 라인 단위라면 1Kbytes(265x2x2화면) 사용. 전 화면이라면 4bytes 뿐입니다.

(5) 스프라이트 어트리뷰트 테이블(SPRITE ATTRIBUTE TABLE)

    스프라이트의 좌표, 사용 패턴, 파레트, 표시 우선순위, 다음에 묘화될 스프라이트의 번호를 정의한 데이터를 스프라이트 어트리뷰트 테이블이라고 부르고, 1 스프라이트에 8bytes 를 사용합니다. 80개의 스프라이트라면 640bytes를 사용하게 됩니다.

(6) 패턴 제네레이터(PATTERN & SPRITE GENERATOR TABLE

    스프라이트, 스크롤 A 레이어, 스크롤 B의 표시에 필요한 비트맵 이미지를 일반적으로 패턴(patterns)라고 부릅니다. 스프라이트에 사용되는 것을 스프라이트 제네레이터, 스크롤 레이어에 사용되는 것을 패턴 제네레이터라고 부릅니다. 패턴 데이터는 양쪽에서 공유 됩니다. 가장 첫 어드레스는 0x0000으로 고정입니다만 데이터 사이즈는 임의입니다.

    데이터는 셀 단위의 배치가 됩니다. 1 셀은 16tor(4비트)의 8x8 픽셀로, 1 셀은 4x8x8= 32bytes의 데이터가 됩니다.

 

SGDK의 설정

 

/* VRAM의 주소 설정 예 */

VDP_setWindowAddress(0xD000);
VDP_setAPlanAddress(0xC000);
VDP_setBPlanAddress(0xE000);

VDP_setHScrollTableAddress(0xF000);
VDP_setSpriteListAddress(0xFC00);

 

/* 스크롤 모드 설정의 예 *'

 

VDP_setScrollingMode(HSCROLL_PLANE, VSCROLL_PLANE);  

 

가로, 세로 양쪽 다 PLANE 전체로 스크롤하는 설정입니다.