2023년 10월 6일 금요일

지난 20년 개발의 추억 #3 - 램상주 폰트의 시작과 끝

연휴는 잘 보내셨나요? 그럼 #3편이 나갑니다요~ ㅎ.ㅎ

이전글을 보시려면, 아래 링크를 눌러주세요!

https://sharksym.blogspot.com/2023/07/20-1.html

https://sharksym.blogspot.com/2023/08/20-2.html



[본론]


8. M 파일매니저에 잡다 기능을 통합해보자


컴퓨터 활용에 가장 걸림돌이 되는 것이 뭘까요? 역시 귀차니즘이겠죠ㅋ

이젠 S/W 개발에 불편함이 없으니, 더 편하게 쓰는 쪽으로 나가봅니다.

흩어져 있던 기존 프로그램들을 개선하느니, 걍 M 파일매니저에 다 때려넣는거죠 ㅎ.ㅎ



8.1 MP3 플레이어 통합


기존 MPXP 프로그램은 파일명을 커맨드라인으로 받아서 처리합니다.

별도의 UI 없이 ESC를 누르면 종료하는 식이었죠.

이 MPXP를 M 파일매니저에 통합해서, 백그라운드 재생을 해보아요~


MP3, WMA 등의 음악을 들으면서, 디렉토리 브라우징을 할 수 있게되니 좋네요 ㅎ.ㅎ

듣고싶은 파일들을 선택해서 연속재생까지 해놓으니 손도 편해졌구요.



8.2 IMS 플레이어 통합


MPXP처럼 IMSP 프로그램도 M에서 백그라운드 재생으로 해보아요~

MP3 재생 시에는 파일을 읽어서 바로 디코더(MPX 카트리지)로 전달하면 끝입니다만...

IMS는 파일 전체를 메모리에 로딩 후 처리합니다. 대부분 파일이 128KB 이하니까 크게 부담은 안되겠죠?

혹시 이게 부담되는 환경이라면, 아마 기존 M, IMSP를 실행하는 것도 힘드셨을테니 어차피 상관없을 듯요ㅋ


M에 IMSP를 통합해서 백그라운드 처리로 구현해보니, Z80에서는 조금 부담이 되네요.

최대한 인라인 어셈으로 때워서 막아봅니다.

.

.

혹시 GT가 필요하시면 지금이라도 일옥으로 달리세요! ㅎ.ㅎ



8.3 M LITE 버전


시간이 흐르니 MSX2/2+에서도 M을 쓰시는 분들이 조금씩 늘어나더라구요.

그.래.서. 결국 그래픽과 메모리 사용량을 줄인 M LITE 버전을 만들게 됩니다.


넌인터레이스 그래픽으로 처리하면 화면처리 속도가 2배 넘게 빨라지니까, MSX2/2+에서도 쾌적합니다요.

물론 turboR에서는 겁나 빠른 속도로...ㅎ


참고로, 2013년 초에는 M 기본 버전과 LITE 버전의 실행파일을 따로 릴리스했습니다만,

이제는 M 실행파일 하나로 통합되어있습니다. 메모리 용량이 모자라면 자동으로 LITE모드로 전환합니다.


M.INI 파일에서 넌인터레이스 설정으로 바꿀 수도 있으니, 인터레이스 출력이 안좋은 모니터에서도 도움이 되겠습니다.

그리고, M에 내장된 영문폰트가 맘에 안들면, 외부 폰트를 로딩할 수도 있으니 참고하시고~



9. KS X 1001


80년대 대우 MSX2에서는 조합형 한글이 사용되었습니다.

현재 M 파일매니저에서도 한글 출력을 위해 844 조합형 폰트를 사용합니다만,

한글 코드는 조합형, 완성형 모두 지원이 됩니다.


한글 윈95 시절부터는 폴더, 파일명에 MS CP949가 기본으로 사용되고, 긴파일명(LFN)에서는 유니코드가 쓰입니다.

폴더이름이 한글로 되어있으면, 윈도와 MSX의 M 파일매니저에도 똑같이 볼 수 있으니 편하죠.


근데, M에 IMSP, MP3 플레이어를 넣다보니... 한글 외 특수문자 또는 한자를 표시해야되는 경우가 종종 생기더라구요.

한글은 조합형 폰트가 12KB 정도라서, 프로그램에 넣어도 부담이 없는데요.

KS X 1001 (KS C 5601)의 특수문자(37KB)와 한자(153KB)를 모두 넣으면 용량이 꽤 됩니다.


어떻게 할까 고민을 해보니...

폰트는 램상주로 올려놓고, 여러 프로그램들이 공용으로 사용하면 괜찮을 것 같더라구요.

아무래도 파일이 크니까, 부팅할 때 한번만 로딩하는 편이 좋겠죠? ㅎ.ㅎ

일단 텍스트뷰어(HV)와 M 파일매니저는 해결이 되겠고... 추후 DOS2용 게임을 만들 때도 활용을?!


그렇게 램상주 폰트가 만들어지게 되었습니다 ㅎ.ㅎ



9.1 램상주 폰트 로더


특수문자 로더인 KS_SPE 프로그램입니다.

https://sharksym.blogspot.com/2014/10/ksspe-v10-ks5601.html


한자 로더인 KS_HANJA 프로그램입니다.

https://sharksym.blogspot.com/2014/10/kshanja-v10-ks5601.html



9.2 램상주 폰트... 이대로 좋은가?


특수문자와 한자표시를 할 수 있어서 좋은데, 약간의 애로사항이 있네요.

부팅 시 매번 폰트를 로딩하는 시간이 걸린다는 것과, 여전히 메모리 점유의 부담이죠.

저야 뭐 1MB의 GT라서 걱정 NoNo입니다만...

반년정도 상황을 지켜보니, 저 외엔 폰트로더를 쓰시는 분이 한명도 없더라구요 ㅎ.ㅎ;


MSX에서 MP3나 IMS를 듣는 사람이 별로 없으니...

M, HV에 내장된 한글지원 정도면 충분하다고 생각하시는 거겠죠? ㅎ.ㅎ



10. 한글 폰트팩(FontPack V1)을 만들어보자.


부담없이 한글/한자를 쓸 수 있도록 H/W의 도움을 받아보도록 합시다.

자세한 내용은 아래 블로그 글들을 보셔도 되겠습니다.

https://sharksym.blogspot.com/search/label/_FontPack



10.1 폰트롬 I/O


Kanji 폰트처럼, I/O 포트를 사용합니다.

전체 용량은 2MB입니다. 유저 폰트를 128KB SRAM에 로딩할 수도 있습니다.

자작 프로그램에서 런타임으로 폰트를 변경하는 등으로 활용할 수 있겠네요.


폰트팩의 폰트롬은 Kanji 폰트처럼 1bit의 데이터로 저장됩니다.

대신 스크린6의 2BPP 컬러, 스크린5,7의 4BPP 컬러 변환 기능을 H/W로 넣어보아요~


MSX1의 패턴맵 그래픽은 1BPP로 된 폰트를 읽어서 바로 쓰면 되지만,

MSX2의 비트맵 그래픽은 2BPP, 4BPP, 8BPP입니다.

화면에 표시하려면 컬러로 계산 후 메모리에 써넣어야하죠.


이걸 폰트 I/O에서 직접 처리하면 편할 것 같더라구요.

Fore Color, Back Color 레지스터만 설정하면, 컬러가 적용된 폰트 데이터를 포트로 읽을 수 있습니다.

이 값을 그냥 VRAM에 써넣으면 OK! ㅎ.ㅎ



10.2 문자 코드는 확장 완성형 (CP949)


1995년 MS에서 윈도95를 만들 때 등장했던 코드입니다. 당시에는 논란이 많았던 코드죠?ㅋ

완성형 한글(KS C 5601)에 빠져있던 한글을 몽땅 때려박은...ㄷㄷ


20여년이 지났지만, 지금도 윈도의 파일 시스템에서 기본으로 쓰이는 한글입니다.

폰트롬은 이 코드영역의 문자를 그대로 넣습니다.

S/W에서 상호간 코드 변환(한글 조합, 유니코드 등)을 빠르게 할 수 있도록, 코드변환 I/O도 넣어줍니다.


윈도의 긴파일명(LFN) 또는 MP3 ID3v2의 유니코드를 표시할 때, 코드변환기를 활용하면 좋겠죠? ㅎ.ㅎ

M 파일매니저에서 LFN 표시가 지원된건 2022년이라는 게 함정이네요. (폰트팩 개발된지 7년이 지난ㅋ)



10.3 폰트의 픽셀사이즈는 16 x 16 및 12 x 12


고해상도 모드(가로 512픽셀)에서는 가로폭 16픽셀 폰트로는 64컬럼밖에 구현하지 못합니다.

12픽셀 폰트를 쓰면 85컬럼까지 가능합니다. 저해상도 모드에서도 40컬럼도 가능하겠구요.

이정도면 실사용에서는 충분할 것 같네요.



10.4 문자 출력용 DEVICE


그래픽 모드에서는 GRP라는 DEVICE를 사용합니다.

국딩 때 BASIC 좀 써보셨으면, OPEN"GRP:"AS#1 명령은 달달 외우셨겠죠? ㅎ.ㅎ


폰트팩에서는 FNP라는 DEVICE가 추가됩니다.

본체의 GRP DEVICE와 함께, OPEN"FNP:"AS#2으로 폰트팩 디바이스도 사용가능합니다.

일제 기종에서 일어와 폰트팩 한글을 동시에 출력할 수도 있다는 얘기죠.

대우 X-II에서는 본체의 명조체 한글과 폰트팩의 한글을 동시에 쓸 수 있겠구요.


80년대 만들어졌던 BASIC 프로그램들의 GRP 디바이스명을 FNP로 바꾸면,

폰트팩의 한글로 쉽게 대체할 수 있습니다.

일제 기종에서 아이큐교실 프로그램을 이렇게 구동할 수 있어요.





10.5 한글 IME


한글 출력을 H/W로 넣었으니, 한글 입력기도 S/W로 넣어봅니다.

2바이트 조합형과 CP949 모두 지원됩니다.

폰트팩이 없는 대우 MSX2용 한글 프로그램을 만들 때는 조합형으로 입력해야겠죠? ㅎ.ㅎ


IME 설정은 BASIC, DOS 모두 가능합니다요.

M에서 파일명 바꿀 때에도 한글을 입력할 수 있구요.



10.6 ANSI 스크린


BASIC 및 DOS등에서 활용가능한 ANSI 출력모드입니다.

조합형 한글, 완성형(CP949) 한글의 전환이 가능합니다.

초기에는 인터레이스 모드만 있었지만, 나중에는 넌인터레이스 모드도 추가되었습니다.

그래도 고해상도 모드(가로폭 512픽셀)라서 RGB 모니터가 아니라면 글씨를 읽기 힘들겠네요.




.

.

.


이렇게 램상주 폰트의 말로는 폰트팩의 탄생으로 연결되었습니다.

HV, M에서는 램상주 폰트를 지원하니까 에뮬 등에서 활용하시려면 한번 써보셔요.

(에뮬에서는 폰트팩을 지원안하니까요ㅋ)


2012년 ~ 2015년 사이의 작업들이었습니다.


긴 글 읽어주셔서 감사합니다요~ ㅎ.ㅎ


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. 실제 소리는 다음편에서 영상으로 보여드릴게요 ㅎ.ㅎ/