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 정도겠군요. 요놈은 조금 계륵 같은 존재지만... 훗날을 기약합니다~


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


2026년 10월 20일 화요일

21세기 DOS 프로그래밍 #8 - ASO 리메이크

국딩 시절 잼나게 했던 슈팅게임이었는데, 아마 해보신 분들이 많으실 듯요.

아이큐2000의 비트맵 그래픽으로 멋진 슈팅을 만들어보는 것이 당시 어린이들의 꿈이었는데요.

BASIC으로는 스프라이트만 움직이는 것도 버거웠고, 최소한 어셈은 써야되었죠 ㅎ.ㅎ


ASO 같은 슈팅 게임을 만들어보려다 포기한 결정적인 이유는 이거였습니다.

컴파일에서 만든 자낙EX, 알레스트 같은 슈팅 게임을 본 후였죠.

상용게임 제작사도 MSX로는 오락실 수준의 슈팅게임은 무리였구나 ㅠ.ㅠ


그렇게 시간은 흘러, GT를 쓰게 되고 기본적인 주변기기들과 DOS2 프로그래밍 환경이 준비되었네요.

이제 다시 국딩 어린이의 꿈을 이뤄봅시다! ASO 리메이크 ㄱㄱㄱ


ASO 같은 세로 슈팅 게임들은 모니터를 90도 돌려서 사용합니다. 세로 해상도가 높아요.

VDP의 오버스캔 트릭을 쓰면 212라인이 아닌 240라인을 출력할 수 있습니다.

이렇게 해도 화면이 조금 잘려서 답답합니다만, 이게 최선이니...ㅋ


VDP가 블랭킹 없이 계속 디스플레이를 출력하면, VDP 커맨드가 가속되는 구간도 함께 사라집니다.

최대한 60프레임으로 게임을 구현하려면,

VDP 커맨드로 비트맵 복사하는 것과 CPU가 직접 VRAM을 R/W하는 것을 잘 섞어야합니다.

특히 turboR의 고속모드에서는 VRAM R/W에 WAIT가 걸리니까, 이걸 최소한으로 줄여야죠.


스프라이트 컬러, 어트리뷰트 테이블만 업뎃(복사)하는 것도 부하가 꽤 됩니다.

이 테이블들은 VRAM에 더블버퍼로 넣어놨는데요.

처음 설계할 때, 60fps가 불가능하면 30fps로 구현하려고 계획했던 것 때문이었습니다요.

스프라이트도 페이지 플립을 할 수 있으니까요.

근데 실제로 돌려보니, 60과 30프레임의 차이가 하늘땅 차이 수준이라서 60fps 최적화로 갔습니다.


스프라이트 32개로는 화면에 움직이는 캐릭터(총알 포함)를 모두 표시하는 게 불가능합니다.

지상에서 움직이는 적들은 모두 비트맵이구요.

모든 총알들은 홀짝 프레임에 맞춰서 절반씩 교대로 표시합니다.

깜빡임으로 두배의 스프라이트를 쓰는 거죠.


공중에서 움직이는 적들은 모두 스프라이트 2장으로 처리합니다.

주인공 기체는 스프라이트 3장이구요.


보스는 화면의 절반을 덮을 정도로 큰 사이즈입니다.

이 녀석은 스프라이트나 비트맵 복사로는 60프레임으로 움직이는 게 불가능합니다.

그래서 보스의 움직임을 V9958의 H/W 스크롤로 처리하고,

나머지 스프라이트(주인공, 레이저, 총알 등)를 반대로 위치 보정해서 표시합니다.

게이머가 봤을 때에는 보스가 움직이는 것으로 느껴지겠죠?


마지막으로 사운드는 MAME 소스를 수정해서, 채널별 데이터를 덤프 후 가공해서 사용합니다.

오리지널이 OPL 사운드라서, MSX-Audio 또는 MoonSound 호환 카트리지로 구동할 수 있죠.


조이메가 지원도 넣어서, 기본 3버튼 + START 버튼(PAUSE 용도)으로 동작합니다.


ASO를 처음 해본 게 1986년으로 기억하는데요.

2012년이 되어서야 비슷하게 구현을 해보게 되었네요.

국딩 어린이의 꿈을 실현ㅋ turboR이 없었다면 시도도 안해봤을 작업이었습니다.


아래는 2022년에 출격씬을 추가한 버전의 영상입니다 ㅎ.ㅎ



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


2026년 10월 18일 일요일

21세기 DOS 프로그래밍 #7 - TETRIS

테트리스, 누구나 아는 게임이죠?

문자 출력, VDP 커맨드, SPRITE, BGM 등의 기본 라이브러리를 테스트하기 위해 만들어봤습니다.


사실은...

라이브러리 문서를 만들다가 '어차피 보는 사람도 없는데 왜 시간낭비를 하고 있을까' 생각이 들어서,

문서를 폐기하고 참고용 샘플 코드를 넣기로 했거든요. 그 결과입니다 ㅎ.ㅎ


그래픽은 스크린 5를 쓰고 있구요. 패턴 데이터는 코드로 내장됩니다.

사운드 데이터는 MML을 쓰도록 되어있어서, 별도의 컨버터는 필요하지 않습니다.

바꿔말하면 DOS 프로그램인데 외부 데이터 파일을 하나도 안쓴다는 얘기죠.

이 때문에 ROM 빌드 샘플에도 활용이 됩니다. (이 부분은 나중에 따로 글을 써야겠네요)


아래는 테트리스의 동작 모습입니다.



DOS2용 기본 코드는 아래를 참고하세요.

https://github.com/sharksym/CPMEMU_HI-TECH_C/tree/master/EXAMPLE/2TETRIS


ROM 빌드는 아래를 참고하세요.

32KB 롬에 맞추느라 PSG BGM라이브러리만 사용했습니다.

FM BGM을 쓰려면 48KB 롬으로 빌드하면 될 듯요.

https://github.com/sharksym/CPMEMU_HI-TECH_C/tree/master/EXAMPLE/0HELLO.ROM



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