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 테이블 등도 바꿀 수 있습니다.

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


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


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






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

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

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


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