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 리메이크 버전"에서

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


2011년 5월 9일 월요일

SNK의 슈팅게임 ASO

ASO를 아시나요?

 

제가 국딩 시절 정말 재밌게 했던 게임인데용.

가장 문화적(?) 충격이 컷던 슈팅 게임을 꼽으라면, 전 ASO가 1등입니다.

 

아침 일찍 오락실에 가서, 혼자 신나게 즐겼던 추억이 있습니다요.

오락실 독차지하면, 배경음악도 또렷하게 들을수 있는 장점(?)이 있었지요. ㅎ.ㅎ

 

참고로 ASO는 수직 스크롤 형태의 비행 슈팅입니다.

3단으로 조각난 ARMOR(특수 무기)를 모아서 기체를 강화하는 방식을 쓰고 있습니다.

 

당시에 정말 참신한 시스템이었다고 생각이 듭니다.

레이져와 로켓, 스피드 업그레이드도 각각 가능했었고,

아이템 잘못 먹으면 다운그레이드 되는 처절함...

 

특이하게도, 수직 스크롤을 빨리감기/되감기도 가능했었지요.

 

보스에 따라 특정 ARMOR가 없으면 깨는게 불가능했던 것도 있어서,

아이템 운이 안따라주면 포기해야했던 스테이지도 있었지요.

 

간만에 생각이 나서 MAME로 몇판 해봤습니다.

국딩 때의 기억이라 그런지, 아이템 위치나 클리어 노하우는 머리속에 그대로 남아있군요. 핫핫...ㅎ

어릴때는 기억력이 좋았던건지... 나이들어 술먹기 시작하면서 머리가 나빠진건지...암튼 그렇습니다. ㅋ

 

 

ASO를 한번도 못해보신 분이라면,

MAME 에뮬로 한번 즐겨보시는걸 추천드리고요...

 

혹시나해서 유튜브 검색하니, 동영상 하나 나오는군요.



그리고, 아래 PS 나갑니다. ㅡ.ㅡㅋ

 

PS. 갑자기 ASO 얘기를 꺼내게 된건,

    MSX로 한번 리메이크를 하고싶은 생각이 들었기 때문이에요. ㅎ.ㅎ

    수직 스크롤이니, MSX로도 어느정도 가능할 것 같은 느낌도 들고...

    게다가 지금은 터보알이 있으니, 코딩 노가다 좀만 하면 실현이 될 것 같다는 생각이 들었습니다.


    일단 스테이지1의 배경 그래픽을 몽땅 캡쳐해서(MAME 만세!!)

    16x16 타일 정리하고, 팔레트 만들고 있습니다요.


    언제 완성될지는 모르겠지만, 제작 상황은 게시판에 가끔 알려드리겠습니다요~ ㅎ


2011년 4월 23일 토요일

IMS Player for MoonSound/Dal-So-Ri

OPL2 용 음악파일인 IMS 연주기입니다.

Download: IMSP4_v0.3.zip


OPL4 칩을 사용하는 문사운드 또는 달소리 카드에서 구동됩니다.

프로그램은 DOS2 환경에서만 동작되며, IMS 파일 크기 만큼 메모리를 더 사용하게 됩니다.

 

예: 100KB IMS 파일 재생시 메인 메모리 256KB 이상 필요.

 

메인 메모리 여유가 된다면, IMS 파일 크기에는 제한이 없지만,

악기 데이터는 최대 128개 까지만 로딩이 가능합니다.

 

실행은 아래 처럼 하면 되겠습니다.

IMSP4 ims-filename [리턴]

 

IMS 파일이름과 같은 BNK 파일이 발견되면, 해당 BNK파일을 로딩하게 되며,

BNK파일이 없는 경우는, IMSP4.COM 파일이 있는 디렉토리의 STANDARD.BNK 파일을 로딩하게 됩니다.

 

참고로, 압축파일에는 제가 쓰던 STANDARD.BNK 파일이 포함되어있습니다.

 

그리고, 소스 대부분이 C로 코딩된 탓인지, 터보알 외의 일반 MSX2 기종에서는 제 속도로 연주가 불가능합니다.

참고하세요. ㅎ.ㅎ;

아마 문사운드 갖고 계신분은 터보알도 있으시겠지용? ㅎ.ㅎ;;;

 

준성님은 OCM 터보 모드에서 구동하시면 될 것 같습니다. ㅎ.ㅎㅋ

 

아래는 제 터보알 + 문사운드로 실행되는 모습입니다.