2011년 5월 13일 금요일

[강좌] 06. VDP의 수직 오버스캔 트릭

아시는 분도 있겠지만, 모르시는 분이 많을거라 생각되서...

점심 시간 여유를 타서 잠깐 소개를 해볼까 합니다. ㅎ.ㅎ

 

제목엔 트릭(Trick)이라고 썼지만, 사실 오버스캔은 일종의 VDP 버그입니다.

 

VDP는 최종 아날로그 RGB 화면을 출력할때,

그래픽이 표시되는 영역과 바깥쪽의 단색 테두리 영역이 있습니다.

 

여기서 테두리는 메인 화면의 상하좌우 바깥쪽에 표시되는데,

VDP 버그(!?)를 이용하면, 상하 영역의 테두리를 없애버릴수 있습니다.

 

스크린5 모드(그래픽 4 모드)의 경우, VRAM의 비트맵 영역은 256 x 256 픽셀인데요.

최종 출력시는 수직 192 또는 212 라인만 표시하고 나머지는 테두리 색이 출력됩니다.

이 상하의 테두리가 없어지고 원래의 수직 픽셀이 표시됩니다.

 

일반적인 NTSC 모드에서 한필드의 총 스캔라인은 약 262개인데요.

대개 가시 영역을 240개로 간주합니다.

인터레이스일때는 480i, 프로그레시브일때는 240p 라고 보통 표현합니다.

 

제가 RGB 모니터로 확인은 못했지만,

LCD TV에서 240라인까지 제대로 출력되는건 확인이 되었습니다.

RGB 모니터의 경우 수직 size를 조정하면 아마 256픽셀 근처까지 출력이 될 것 같네요.

 

이 오버스캔 트릭을 쓰는 프로그램으로는,

Unkown Reality의 일부 화면에서 볼수가 있습니다. (이건 유명하죠 ㅎ.ㅎ)

그외 Ark-A-Noah 랑 Sex Bomb Bunny 에서도 사용되었다고는 하는데 제가 확인은 못해봤어요.ㅋ

 

아래는 Unkown Reality에서 오버스캔을 쓴 모습입니다.

TV가 검정색이라 잘 안보이지만, 수직화면이 LCD 전체로 다 출력되는걸 볼수가 있습니다.

인터레이스 스크린7 모드라서 실제 수평라인이 480개가 출력되고 있어요. 한번 세어보세요. ㄷㄷㄷ



 


참고로 V9938의 데이터쉬트에는,

 212 라인모드와 192라인 모드의 스캔라인 위치가 정해져있습니다.

(참고로 출력 위치는 ADJUST 레지스터를 설정하면 상하(또는 좌우) 8픽셀 조정이 가능합니다.)

 

위치는 못 바꾸지만 첫 시작라인을 설정하는 레지스터를 사용하면,

수직으로 스크롤되는 효과를 얻을 수 있는데요.

오버스캔 모드에서는 수직 테두리가 없기 때문에 꼭 수직 위치를 바꾸는것 처럼 효과를 줄수 있습니다.

 

 

그럼, 이 오버스캔 트릭을 어떻게 구현하는지가 궁금하시겠죠? ㅎ.ㅎ

 

V9938에는 특정 수평 blanking 카운트에 인터럽트를 넣을 수 있습니다.

대개 스캔라인 인터럽트라고 얘기합니다.

 

이걸 이용하면, 특정 스캔 라인에 도달했을때 VDP 레지스터 설정을 하므로써

여러가지 특수(!!) 효과를 만들수 있는데요.

 

몇가지 예를 들어보면,

 

알레스터, 제비우스, 싸이코 월드, 스페이스맨보 등의 배경 스크롤:

-> 특정 부분은 스크롤 위치를 고정해서 안움직이는 것 처럼 만듭니다. 점수 표시판 등등.

 

싸이코 월드, 스페이스 맨보 그래픽 모드 2개 동시 출력:

-> 화면을 반으로 나눠서 스크린4 + 5, 또는 스크린 5 + 6 을 함께 표시.

 

싸이코 월드, 프린세스 메이커의 32개 팔레트:

-> 게임 배경과 하단의 아이템 화면의 서로 다른 16개 팔레트를 사용.

   (원래 MSX에서는 팔레트가 16개 밖에 없죠.)

 

정도가 되겠습니다. 실제 MSX2용 많은 게임들이 스캔라인 인터럽트를 쓰고 있죠.

 

그럼 오버스캔 모드를 만드는 방법은,

1. 스캔라인이 처음 시작할때는 192라인 출력 모드로 세팅합니다.

2. 스캔라인이 192라인에 도달하기 전에 (예: 100라인, 150라인 등)

   212라인 출력 모드로 바꿉니다.

   그러면, 스캔라인이 192를 넘어가더라도 화면이 계속 출력됩니다.

3. 스캔라인이 192를 지난 후 212 라인이 되기 전에, 다시 192라인 출력 모드로 세팅합니다.

   이러면 VDP의 라인 카운터가 오동작을 하게 되어,

   212라인이 넘어가더라도 수직 테두리가 표시되지 않고 계속 VRAM의 픽셀이 출력됩니다. ㅎ.ㅎㅋ

4. 3번에서 이미 192라인 모드로 설정했기 때문에, 다음 프레임 부터는 2~3번을 반복.

 

이러면, 상하 테두리 없는 넓은(?) 화면을 계속 볼수가 있습니다.

 

물론 장점이 있으면, 단점도 있겠지요? ㅋ

 

상하 테두리가 출력이 안되면서, VDP 내부의 수직 Blanking 인터럽트(보통 V-sync 인터럽트로 표현)

가 발생하지 않습니다.

MSX에서는 V-blank 인터럽트가 아주(!!) 중요한데요.

BIOS의 메인 타이밍 루틴이 모두 이 VDP의 인터럽트에 의존해서 구동됩니다.

 

따라서 오버스캔 모드가 동작중이면,

BIOS의 키 스캔 루틴이 동작안하게 되고, 타이머 관련 Jiffy 값이 안바뀌며,

PLAY 명령등의 사운드도 동작이 불가능해집니다.

타이밍에 따라 처리되는 디스크롬의 일부 루틴도 멎게 됩니다. ㅎ.ㅎ

하지만... 이 모든걸 게임중에는 안써도 되니까 별 상관은 없게 되겠지요. ㅋ

(FDD 액세스는 좀 주의를 해야겠네요.)

 

 

참고로, 현재 진행중인 "파라의 탑" 과 "ASO 리메이크 버전"에서

 오버스캔 모드를 사용하려고 계획 중입니다. ㅎ.ㅎ


댓글 없음:

댓글 쓰기