2023년 9월 11일 월요일

Ponpoko Remake #5 - 완성

완성판을 영상으로 보여드려요~

부팅 로고도 살짝 넣었습니다. Ponpoko 일러스트도 함께 나오구요 ㅎ.ㅎ




그리고 치트키도 지원됩니다. (어떤 키를 눌러야하는지 나중에 찾아보세요ㅋ)


XXX키 -> 스테이지 넘기기

YYY키 -> 타이머 멈추기    (한번 더 누르면 해제)

ZZZ키 -> 화난 너구리 모드 (한번 더 누르면 해제)


아래 스샷은 타이머 멈춤과 화난 너구리 모드를 켠 상태입니다~




Ponpoko 리메이크는 이렇게 완료되었습니다.

이번 작업은 기존과는 다른 방식이라서, 나름 재미가 있었네요.


그럼, 즐거운 저녁 되세요! ㅎ.ㅎ/


2023년 9월 10일 일요일

Ponpoko Remake #4 - 사운드 추가

이제 오리지널 3채널 사운드를 MSX쪽에서 구현하면 되겠습니다.


오리지널 보드에서는 각채널의 주파수가 16BIT로 설정됩니다.

볼륨은 4BIT로 설정이 되구요. 뭔가 PSG랑 비슷하죠? ㅎ.ㅎ

이걸 부가 H/W를 쓰지않고 그냥 본체의 PSG로 출력해보아요~


아시다시피 PSG의 레지스터는 주파수(Frequency)가 아닌 주기(Period)를 설정하도록 되어있습니다.

구형파(HIGH/LOW)가 바뀌는 시간을 클럭 카운트 수로 표현하는거죠.


그러면 이 카운터를 구하려면 나눗셈(1/주파수)을 해야하는데, Z80으로 느릿느릿하면 안좋겠죠?

그냥 결과값만 모아서 테이블로 만들어둡시다~

참고로, 이번 Ponpoko 리메이크는 메가롬 카트리지로 제작될 예정입니다 ㅎ.ㅎ


16BIT 주파수를 입력하면 12BIT PSG 카운터(2바이트)이 나오는 테이블입니다.

테이블 계산이 쉽도록 16BIT 주파수에서 하위 12BIT를 잘라서 테이블 주소값으로 사용하고,

상위 4BIT는 메가롬 매퍼의 페이지값으로 넣으면 쉽게 찾을 수 있겠네요.


결과적으로 8KB 테이블 16개가 나옵니다.

이걸 걍 롬에 때려넣어요. 16K 매퍼를 쓰고 있어서, 실제 롬에서는 256KB를 차지합니다 ㅎ.ㅎㅋ



모든 파형을 PSG의 구형파로 출력하니까, 조금 날카롭게 들립니다만... 이대로도 괜찮네요.

근데 볼륨이 이상한지, 채널간 밸런스가 엉망이군요.


왜 그럴까... MAME의 사운드 보드 설명을 읽어보니,

4BIT DAC과 볼륨 조절이 선형(linear)으로 출력되도록 만들어져있네요.

PSG에서 비슷하게 맞도록 조절해줍니다 ㅎ.ㅎ

참고로, PSG 출력 그래프에 직선을 그어보연 이정도로 꽤 차이가 납니다.




이제 대충 밸런스가 맞는 듯 하군요.

그리고, 이 사운드가 PSG로 출력되니까...

PSG I/O로 동작하는 사운드 카트리지(예: T-Wave)가 있으면 좀 더 재밌게 들을 수 있습니다 ㅎ.ㅎ


Ponpoko는 게임 중에는 BGM없이 효과음만 나오는데요.

이게 원래 의도된건지, 프로그램 용량제약 등 다른 문제로 사운드가 간단해진건지 궁금하네요.

스테이지 클리어 하면 짧은 음악이 또 나오긴해요.

근데 움직일 때 '띠띠띠~' 효과음만 나오는게 나름 잘 어울립니다 ㅎ.ㅎ


그럼, 다음편에서 ...


PS. 실제 소리는 다음편에서 영상으로 보여드릴게요 ㅎ.ㅎ/


Ponpoko Remake #3 - 그래픽 작업

메인 화면은 스크린4를 212라인 모드로 구동합니다.

8 x 8 패턴 처리는 MSX1 TMS9918의 스크린2와 비슷합니다.

TMS9918은 모든 스크린이 192라인으로 고정되어있어서, BASIC 명령어도 거기에 맞춰 구성이 되어있어요.


V9938에서는 수직 해상도를 212라인으로 늘려서 쓸 수 있지만, BASIC에서는 지원하지 않습니다.

인터레이스 모드도 BASIC으로는 아무것도 못하니까, 국딩 때는 이걸 어케 쓰는건지 궁금했던 추억도 있습니다요ㅋ


근데, 스크린4에서 패턴 테이블을 4개 쓰더라도, 수직 스크롤을 쓰지 않는다면...

화면 하단에 20라인(212 - 192)이 추가로 보여지는 것 뿐인데요.

패턴 관리에 필요한 CPU 로드는 33%(3장 -> 4장)가 늘어나지만 보여지는 스크린은 약 10% 증가 ㅎ.ㅎ


게임중에 변경이 필요한 부분들은 패턴 4장 모두 똑같이 고정하고,

장면전환 등 CPU 로드가 늘어도 상관없는 때만 패턴을 변경하는 식으로 처리하면 사실 큰 부담은 안됩니다요.


보통 비트맵 그래픽을 작업할 때는 DD구락부를 많이 썼는데요.

이번엔 패턴 편집이 대부분이라, 윈도용 폰트 에디터 yy-chr을 썼습니다.



영문 폰트처럼 여러가지 컬러를 써야하는 경우는, 미리 중복패턴으로 채웠습니다.

아무래도 컬러 테이블(8바이트)을 변경하는 것 보다는, 패턴 코드(1바이트)를 변경하는게 빠르거든요.

게다가 한 테이블에서 서로다른 색의 문자가 나오는 경우도 있으니, 무조건 이렇게 구성해야합니다요!

화면상단에 나오는 타이머 막대기는 짧아지면 색이 바뀌는데요. 이건 팔레트를 바꾸는식으로 처리했습니다.


기본 패턴에 컬러를 입혀서 표시하면 이렇게 나오게 됩니다.



과일 패턴을 4개씩 모아서 찍으면 요렇게 볼 수 있구요.

도트를 열심히 찍었지만, 8도트에 2컬러 제약때문에 품질이 떨어지는 부분도 조금 있습니다요ㅋ



이제 스프라이트도 넣어야겠죠?


오리지널 4컬러 스프라이트는 V9938의 스프라이트 모드2에서 레이어 2개를 겹치면 똑같이 구현가능합니다.

OR되는 픽셀 컬러를 휴리스틱 알고리듬으로 잘(!) 선택해서 배치하면 이렇게 되네요.


0. 0000 = 검정 

1. 0001 = 타이머 전용  -> 파랑/노랑/빨강

2. 0010 = 오렌지       -> 당근, 감, 옥수수, 파인애플, 오렌지

3. 0011 = 연보라       -> 가지, 포도, 복숭아

4. 0100 = 녹색         -> 완두콩

5. 0101 = 살구색

6. 0110 = 갈색         -> 밤, 땅콩

7. 0111 = 파랑         -> 가지

8. 1000 = 짙은 하늘색  -> 멜론, [사다리], [층바닥]

9. 1001 = 갈색         -> 너구리 전용

A. 1010 = 빨강         -> 너구리 전용

B. 1011 = 흰색         -> 너구리 전용

C. 1100 = 흰색         -> 무, 문자열

D. 1101 = 빨강         -> 앵두, 버섯, 수박, 딸기, 사과, [압정]

E. 1110 = 하늘색       -> [외벽], [스코어 숫자]

F. 1111 = 노랑         -> 바나나, 맥주


스프라이트 OR 컬러의 경우, 너구리를 예로 들면요...

갈색(9번) 레이어와 빨간색(10번) 레이어가 사용되는데요.

픽셀이 겹치는 부분은 OR연산으로 흰색(11번)으로 표시됩니다.

이런식이죠.




전체 스프라이트 패턴은 아래처럼 볼 수 있습니다.



실제 데이터는 이런 테이블이 4장 들어갑니다. 8 x 8 패턴이 1024개!

게임 내에서는 너구리가 좌우, 상하 반전되는 것 때문에 그렇습니다요.

오리지널 Ponpoko에서는 스프라이트를 패턴 개별로 XY flip 처리되는 속성이 있어서, H/W가 그냥 해주더라구요.

H/W가 딸리는 MSX2에겐 대용량 VRAM 128KB으로 떼우는 방법이...ㅋ

결국 Ponpoko 리메이크에서는 스프라이트를 4페이지로 구성했다는 얘기였습니다.


여담이지만,

MSX2 BASIC에서는 비트맵 스크린의 ACTIVE, VIEW 페이지 명령어가 있는데요.

사실 V9938은 패턴맵 테이블, 스프라이트 패턴, Attrib 테이블 등도 바꿀 수 있습니다.

게임에서는 이런 테이블을 여러개로 만들어서 페이징을 하게 됩니다. 참고하세요~


도트 작업(막노동ㅋ)을 하다보면 언젠가는 끝이 납니다 ㅎ.ㅎ


그럼, 실제 화면에서는 패턴 그래픽과 스프라이트가 어떻게 나오는지 보시죠!






아마 나중에 동영상으로 보시면 확인되겠지만,

스프라이트의 레이어 우선순위도 오리지널과 똑같게 구성했습니다.

너구리가 앞쪽, 항아리/뱀은 중간에, 애벌레는 뒷쪽 레이어로 나옵니다 ㅎ.ㅎ


그럼, 다음편에서 보아요~


2023년 9월 9일 토요일

Ponpoko Remake #2 - 소스없이 포팅

게임을 공식적으로 리메이크를 하게되면, 원본 소스(코드, 그래픽 등)를 포팅(이식)하게 됩니다.

근데 비공식으로 리메이크하게되면, 원본 소스가 없으니 사실상 게임을 새로 만드는 것과 비슷합니다.


게임을 새로 기획하거나, 캐릭터를 새로 디자인하는게 아니니까,

간단한 게임의 리메이크라면... 프로그래머 한명으로도 가능합니다요.

제작하는데 시간이 많이 걸리느냐, 적게 걸리느냐 정도의 차이는 있겠네요 ㅎ.ㅎ


이 경우 리메이크의 완성도를 결정하는 것은,

프로그래머가 그 게임을 얼마나 잘 알고 있느냐의 정도라고 생각되네요.


그럼, Ponpoko 리메이크는 어떻게 진행하면 좋을까요?

늘 하던대로 눈카피? ㅎ.ㅎ


먼저 아래 스샷을 보시죠. MAME에서 실행하면 처음에 나타나는 게임정보입니다.




먼저, 리메이크를 만들 때 가장 중요한 부분은 비디오쪽입니다.

아무래도 게임에서 그래픽이 차지하는 비중이 높은데, 이게 쉽게 되면 좋죠 ㅎ.ㅎ

제가 지난글에서도 그래픽부터 언급한 이유가 그 때문입니다.

사실 이게 안되면 걍 포기해야됩니다요~~ㅋ


사운드 정보는 간단하게 남코의 96KHz H/W로 나오는데요.

보드 내부적으로는 파형샘플을 주파수에 맞춰 3개 채널을 믹스해서 최종 모노 오디오를 만듭니다.

결국 3채널짜리 SCC를 보드로 만들었다고 생각하시면 되겠네요.

SCC는 샘플램에 데이터를 매번 로딩해야하지만, Ponpoko는 롬샘플이라 CPU가 로딩할 필요가 없습니다.

지난글에서 구동환경을 MSX2 최소사양으로 잡았는데요.

만약 PSG 3채널로 그럭저럭 괜찮은 소리가 나온다면 좋겠네요 ㅎ.ㅎ


보통은 여기까지 생각하고 넘어갑니다만, 이번엔 하나를 더 봅시다요!

CPU 정보를 보니, 3MHz짜리 Z80 하나만 나와있네요?!

보통 오락실 기판에 Z80이 박혀있으면, 사운드 컨트롤 전용으로 쓰이는게 대부분인데요.

그게 아니면 여러개의 Z80 CPU가 들어있거나요.


근데 Ponpoko는 MSX의 3.58MHz 보다 느린 CPU입니다 ㅎ.ㅎ

이걸로 추측해볼 수 있는 것은...

CPU 로드가 낮다 -> H/W에 의존하는 그래픽, 사운드 외의 S/W 테크닉은 사용하지 않음!


네, 그냥 게임 로직을 돌리는거 외엔 별로 하는 일이 없다는 얘기입니다.

게임을 만들다보면 CPU 로드가 늘어나서 사양을 높이거나 다른 처리(그래픽, 사운드)를 삭제하게 되는데요.

Ponpoko 리메이크는 진짜 MSX2만으로 충분할 것 같은 느낌이라는거죠.



자! 그럼 작업을 시작합니다!!

너구리의 숏점프, 롱점프 움직임을 스샷으로 한프레임씩 잡고 데이터를 테이블로 정리!

적들(애벌레, 오리)의 프레임당 이동량을 확인! (참고로 애벌레는 속도가 다른 3종류가 나와요.)

이것만으로 힘들다면...?

MAME 디버그 창을 띄워놓고 프레임을 끊어서 변수값을 보거나,

소스를 수정해서 데이터를 직접 로그(파일)로 저장 등의 방법을 씁니다.

.

.

.

근데, 이번엔 이렇게 안했어요ㅋ


사실 로직이 워낙 단순해서 이렇게 해도 금방 만듭니다만...

방금 Ponpoko의 메인 CPU가 Z80이라고 했잖아요?


보통 게임을 눈카피하게 되면, 원작과 미세하게 차이가 나는 부분들이 생기게 마련입니다.

적 또는 아이템 충돌 범위가 다르거나, 점프할 때 적용되는 중력 가속도가 다르거나 등등이요.

만약 원본 코드를 가져다 쓸 수 있으면, 이 부분을 똑같이 구현할 수 있습니다.


공식 리메이크라면 소스를 가져와서 컴파일했겠지만,

이번 Ponpoko 리메이크는 비공식이니, 그냥 롬에 들어있는 Z80 머신코드를 가져다 쓰는거죠. (Z80 만세!)


그리고 이게 쉽게 되는 이유 중 하나가 더 있는데요.

Ponpoko의 주변 I/O는 모두 메모리맵 I/O이고 포트맵 I/O를 쓰지않습니다.

반대로 MSX는 대부분 주변 I/O가 포트맵 I/O이고 메모리맵 I/O들은 이미 슬롯으로 보호받고 있습니다.

그러니까 메모리맵 I/O만 잘 분리해주면, MSX에서 충돌하지 않는다는 얘기에요.

관련된 코드는 잘 정리(패치)를 해서 오동작하지 않도록 해주면 됩니다.

인터럽트 관련 코드도 마찬가지겠구요.


뭔가 일반적인 리메이크 작업과는 상당히 다르게 진행되는데요.

저도 이런식으로는 처음 해보는거라 꽤 재미있었습니다.


그럼, Ponpoko의 메인코드를 초간단 그래픽 에뮬을 넣어서 테스트해봅니다.

걸음마 떼는게 쉽게 되면, 나머지 구현은 시간문제니까요.


아래 스샷의 왼쪽은 MAME, 오른쪽은 MSX입니다.




MSX쪽은 스크린1을 212라인 모드로 전환해서 돌렸구요. 패턴 데이터는 BIOS 폰트 기본값입니다.

오른쪽 스샷을 매트릭스 네오의 눈으로 보면, 왼쪽이랑 똑같죠?ㅋㅋ



지난글의 댓글에서 제가 "느낌이 아케이드랑 99% 같을거에요. 이건 제가 보장합니다."라고 적었는데요.

왜 그런건지 이제 이해되시죠? ㅎ.ㅎ


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


2023년 9월 8일 금요일

Ponpoko Remake #1 - 너구리 게임을 아시나요?

[서론]


80년대 오락실에 있던 너구리 게임을 아시나요?

원제는 Ponpoko입니다.




단순한 그래픽, 사운드에 너구리의 스킬이라고는 숏점프, 롱점프 뿐이지만...

적들을 피하면서 고득점 보너스를 받으려고 발악(?)하는 재미가 있었지요 ㅎ.ㅎ

실력이 늘면 클리어 속도도 빨라집니다만, 그만큼 실수할 확률도 올라가서... 흐~


사실 이 게임을 한동안 잊고 있었는데요.

한달전에 게시판에서 Ponpoko 게임얘기가 나와서, 뭔가 팍 머리를 스쳐지나갑니다! 응?


여태 이 게임이 정식으로 리메이크가 나온적이 없더라구요.

이거 한국에서만 인기가 있었나? 뭐 그런 생각도 들었습니다.

심지어 그 흔한 ZX Spectrum 용 포팅도 없네요.


그럼, 뭔가 동기부여가 되는 느낌이죠? MSX용 Ponpoko 리메이크 제작에 대한 동기부여욤 ㅎ.ㅎㅋ



[본론]


Ponpoko는 이미 수십년(?) 전에 MAME에서 에뮬이 되고, 비디오, 오디오에 대한 분석도 끝난 게임이라...

지금와서 리메이크를 만드는 데에 별 어려움은 없습니다.


늘 그랬지만, 한가지 문제라면... 역시 MSX의 게임성능이겠죠?

구동 환경을 어느정도의 선에서 그어야 할지 일단 좀 살펴보아요~


12년 전에 ASO 리메이크를 만들 때는 turboR 외엔 답이 없는 게임이었지만,

Ponpoko는 조금 저사양을 타겟으로 만들어도 괜찮을 것 같습니다요.




80년대 흔했던 5층 아파트 구조입니다ㅋ 옥상을 포함하면 총 6층이네요.

각 층은 32라인으로 그려지고, 옥상도 동일합니다.

화면의 필수영역(빨간 박스)은 32라인 x 6 = 192라인(많이 보던 숫자?!)입니다.

가로 화면은 256픽셀이니까, 이거 최소 256 x 192 픽셀이 필요하다는 얘기죠.


전체 스크린은 256 x 224픽셀으로, V9938의 오버스캔 트릭을 쓰면 손실없이 모두 출력가능합니다만,

이번에는 오버스캔없이 정식 출력을 쓸 계획입니다.


1층의 하늘색 바닥을 그리지 않고, 스크린 테두리(Border)로 표현하면 1라인 여유가 있으니까...

여기에 스코어를 표시하면? MSX1의 스크린2 (256 x 192)에서도 대충 그려볼 수 있겠구요.


하단(녹색 박스)부분은 제외하고, 상단(노란색 박스)를 포함하면 256 x 208라인이 되는데요.

만약 V9938의 스크린4(그래픽3) 모드에서 212라인출력을 써서 구현하는 방법도 있겠습니다.

이 경우는 하단의 남은 너구리 표시는 우측 상단에 넣어도 되겠네요.

오리지널 Ponpoko는 2인 플레이 시 우측상단에 2P 스코어가 표시 되지만, MSX에서 굳이 넣을 필요는 없으니까요.



다음으로, 아이템과 움직이는 캐릭터를 봅시다.




과일 아이템은 16 x 16 그래픽인데, 내부적으로는 8 x 8 패턴 4개를 붙여서 만들어져있습니다.

그 외 작은 압정, 사다리 등도 8 x 8 패턴입니다.


Ponpoko의 아케이드 보드도 패턴 데이터를 출력하는 방식이라서,

VDP의 패턴 그래픽 모드를 비슷하게 활용해도 될 것 같네요.

아이템은 화면상의 8픽셀 단위로 그려집니다. 더이상 움직이지도 않구요. 패턴 그래픽에 딱맞는 그림이죠?


물론 VDP의 패턴모드에서는 수평 8픽셀에 컬러 2개 밖에 못 쓰니까, 실제 구현 시 안이쁘게 나올 여지는 있습니다.

사실 말이 컬러 2개지, 실제로는 1개랑 마찬가지에요. 배경에 다른색 하나 찍는거니깐ㅋ


참고로 Ponpoko 보드는 패턴에 4컬러를 쓸 수 있습니다.

검정 배경을 제외하면, 3개의 컬러가 한 패턴에 나올 수 있습니다.


주인공 너구리와 적 캐릭터(애벌레, 뱀)는 모두 1픽셀 단위로 이동이 되구요.

컬러는 패턴과 동일한 4컬러 출력을 사용합니다. 역시 투명색을 제외하면 3컬러가 출력되겠네요.


참고로, TMS9918에서 스프라이트로 3색을 구현하려면, 레이어 3개를 겹쳐야합니다.

TMS9918, V9938 모두 스프라이트 레이어가 32개 있으니...

캐릭터 하나당 3개씩 쓰면 화면상에 총 캐릭터 10개까지는 가능합니다.


사실 MSX의 스프라이트는 레이어 갯수 보다는, 수평 출력 제약때문에 구현이 좀 어렵습니다.

TMS9918처럼 같은 수평라인(Scanline)에 4개밖에 출력이 안되는 경우엔, 프레임을 나눠서 스프라이트 레이어를 섞어야하죠.

결과적으로 레이어 우선순위에 따라 캐릭터가 깜박거리게 됩니다만,

아예 안보이는 것 보다는 나으니까, 이렇게라도 해야겠지만요 ㅎ.ㅎ (사실 MSX1용 게임 99%가 이런식이죠.)


전체 스테이지 20개를 모두 스샷으로 잡아서 확인해보니,

수평라인에 스프라이트가 최대 4개까지만 나오네요 ㅎ.ㅎ

애벌레, 뱀이 각 층에 분산되어 최대 3마리만 나옵니다. 너구리까지 포함하면 수평으로 최대 4개가 표시되는거죠.


만약 이걸 MSX2의 스프라이트 모드2를 쓰게 되면, 라인 제약인 스프라이트 8개로 모든 컬러를 구현할 수 있겠습니다!!

사실 캐릭터가 빠르게 움직이는 경우(슈팅 게임)는 스프라이트가 좀 깜박이더라도 봐줄만 합니다만,

Ponpoko는 죄다 느리게 움직이는 애들이라, 실제로 깜박이면 상당히 짜증이 날거에요.

1982년산 허접해보이는 Ponpoko 스프라이트도, MSX1으로 구현하려면 ㅠ.ㅠ

좀 제대로 보이게 하려면, 스프라이트 모드2를 써야겠네요.


그럼 답은 나왔네요.

수직, 수평 스크롤이 필요한 게임도 아니니까, MSX2 기본사양(램 64KB)을 타겟으로 리메이크를 시작합니다!

최종 S/W는 카트리지로 구동이 되며, 디스크롬은 사용하지 않을 예정입니다.


.

.

.


일단 시작했으니, 타이틀 화면부터 만들어보아요~ ㅎ.ㅎ/




참고로, 화면에 나오는 "The 80s REVIVAL"은 이번 Ponpoko 리메이크를 제작한 팀 이름입니다.


그럼, 이만~