2026년 10월 21일 수요일

21세기 DOS 프로그래밍 #9 - Ponpoko 리메이크

그래픽 라이브러리의 모든 기능을 테스트하려면, 실전을 치루는 게 제일 편합니다.

그래서 ASO 리메이크를 제일 먼저 해봤던 것이었구요.


스크린7,8,12 인터레이스 관련 루틴은 M 파일매니저에 모두 사용이 되었구요.

turboR을 쓰면서 스크린2,4의 패턴맵 그래픽을 쓸 필요가 있을까? 그런 생각을 해보다가 말았는데요.


그렇게 10년쯤 잊고 지내는 중, 게시판에 너구리 게임 얘기가 나왔습니다. Ponpoko!

오리지널 그래픽, 사운드 구조를 확인해보니, MSX2에서 비슷하게 구현이 가능하겠더라구요.


Ponpoko 리메이크는 포팅 수준으로 작업이 진행됩니다.

그리고, 잘 쓰이지 않던 ROM 빌드를 활용해봅니다.

DOS 프로그램을 롬으로 만들 때엔 디스크롬과 롬디스크 이미지를 합치면 간단히 만들 수 있는데요.


제가 만든 ROM 빌드 환경은 오리지널 디스크롬을 쓰지 않습니다.

대신 BDOS의 루틴 일부를 구현해서 최종 ROM에 포함이 되구요.

사용자의 실행파일(*.COM)은 별로의 로더로 메모리에 로딩되어 자동실행되는 방식입니다.


한줄로 요약하면,

메모리 매니저 + BDOS 에뮬 + COM 파일 로더 + 사용자 COM 파일이 하나의 ROM으로 변환된다고 보심 되겠습니다.


기존 DOS 빌드에 쓰였던 코드, 라이브러리를 쓰는 프로그램을 그대로 쓸 수 있다는 게 장점이겠네요.

나중에 다른 글에서 또 설명하겠지만, 메가롬 등의 대용량 롬을 쓰는 것도 가능합니다.


Ponpoko 리메이크는 8MB 플래쉬롬이 들어간 Oraksil 보드를 사용합니다.

처음 기동 시 오프닝 영상이 나오도록 해봤구요.

빠른 사운드 처리를 위해 숫자 계산루틴 대신 결과값을 롬에 테이블을 넣어버렸습니다.

... 넓은 롬 용량을 마구마구 써버렸다는 소리입니다요ㅋ


그래픽을 프로그래밍으로 구현하는 것은 그리 큰 작업은 아니었는데요.

새로운 타이틀 도트 작업이나, 스프라이트 도트 작업이 제일 귀찮았네요. 시간도 많이 걸렸구요 ㅎ.ㅎ


오리지널 Ponpoko 보드가 오락실 기판 치고는 성능이 안좋은 편이라서,

화면 전체 캐릭터를 V9938의 스프라이트2 모드로 구현이 가능합니다.

스프라이트 패턴 2개만 겹치면 되는데, 가로 라인에 캐릭터 최대 4개만 나와요.


문제되는 부분은 타이틀에서 너구리 7마리가 달려오는(?) 애니메이션인데...

걍 위아래로 캐릭터를 강제로 나눠서 보여줬습니다. 아래 스샷처럼이요.

이거 깜빡임으로 처리해서 한줄로 표시하면 너무 그지 같더라구요 ㅎ.ㅎ



메인 그래픽은 스크린4의 패턴맵 그래픽을 사용합니다.

오리지널 해상도는 288 x 224 도트로 되어있어서, 스크린4의 256 x 192 그대로 옮기는 건 안되겠더라구요.

근데 실제 게임에서는 수평 256도트만 사용하고 있어서 스크린4로 가능했습니다. 유후~


세로는 212라인 모드를 써도 아래쪽의 상태표시 라인을 보여주지 못합니다. 12라인이 부족하죠.

이걸 오버스캔 모드를 써야하나 고민했었는데...

그냥 상태표시 라인(남은 너구리 개수)을 우측 상단으로 옮기는 걸로 타협했습니다.

원작 게임에서는 2P SCORE가 표시되는 부분이지만, 이번 MSX 버전은 1P 전용이라 2P 영역은 삭제!


음... 근데 스크린4에서 212라인 모드를 쓰면, 패턴맵 4장이 표시된다는 거 알고 계시나요?

기본 192라인에서는 패턴맵 3장이죠. 256개 패턴 x 3 = 768 패턴

참고로 BIOS에서는 패턴맵 4장을 처리하는 기능이 없습니다.

그냥 스프라이트만 모드2가 쓰이도록 되어있어요.

패턴맵 4장을 쓰려면 VRAM 맵을 조절하면 됩니다. 스프라이트 영역도 당연히 옮겨야겠구요.

참고로, 스페이스 맨보우가 스크린4의 212라인 모드를 사용했습니다. 아마 다른 게임도 있을 듯 한데, 기억이 안나네요.


이렇게 Ponpoko 리메이크가 제작되었습니다.



이제 표준 MSX로 나왔던 기능들은 모두 써본 것 같네요.

안써본 기능이 MSX-Audio의 ADPCM 정도겠군요. 요놈은 조금 계륵 같은 존재지만... 훗날을 기약합니다~


그럼, 다음 편에서 이어집니다요~