일단 서론부터...
MSX의 비디오는 VDP 칩에서 출력된다는건 다 아시죠?
VDP 칩 내부에는 문자용 패턴 데이터가 없으니, VRAM에 폰트 데이터를 로딩해서 사용합니다.
VDP를 텍스트 모드로 쓰던 그래픽 모드로 쓰던 어쨌거나 문자를 표시하려면, 폰트가 필요합니다.
8 x 8 도트의 1BPP 데이터로 만들면, 256문자를 위해 2048바이트 데이터가 필요한데요.
메인 BIOS롬에 국가 규격에 맞는 폰트가 들어있어서, 기본적으로 이걸 활용하게 됩니다.
근데 갑자기 이 얘기를 왜 하냐구요? ㅎ.ㅎㅋ
지난 3월에 봄정모가 있었죠? 그 때 키티야님이 하신 말씀이...
"BIOS의 폰트를 쓰는 게임은 한글화가 불가능한데, 이걸 해결할 수 있는 방법이 있을까요?
에를 들어 FontPack을 활용한다거나..."
그.래.서.
약간의 테스트를 해보게 되었습니다. ㅎ.ㅎ
지금부터 본론입니다...
시스템의 폰트 데이터를 읽으려면 두가지 방법이 있는데요.
1. BIOS 롬의 문자 패턴을 그대로 읽어서 활용
BIOS의 0004H 번지에 16BIT 주소값이 들어있는데, 그게 폰트 데이터의 테이블 주소값입니다.
슬롯0(또는 슬롯0-0)에서 해당 번지를 확인 후 읽어서 쓰면 되겠죠.
2. MSX는 부팅 후, 폰트 데이터를 변경할 수 있습니다.
특정 슬롯에 폰트롬을 장착 후, WORKAREA의 아래 2개의 시스템 변수를 세팅하면 됩니다.
이 변수는 메인 BIOS에서 텍스트 모드 전환할 때, 해당 테이블을 자동으로 VRAM에 로딩하기 때문에 편리합니다.
아래는 일제 MSX1 ROM의 기본값입니다.
F91FH CGPNT: DEFB 00H ; Slot ID
F920H DEFW 1BBFH ; Address
여기에 설정된 슬롯에서 데이터를 읽어서 쓰면 됩니다.
근데 실제 게임에서 BIOS의 폰트를 가져오는 경우가 많을까요?
그건 저도 몰라요. ㅎ.ㅎ
게임에서 쓰는 문자가 아스키코드 128개 정도라면, 1024바이트 용량으로 충분하니까...
왠만한 게임은 자기만의 폰트 데이터를 갖고 있다고 봐야겠죠.
특히 메가롬 게임처럼 용량이 크다면 BIOS 폰트를 쓸 필요가 거의 없겠죠? ㅋ
일단 BIOS 폰트를 쓰는 게임 몇개를 찾아봤습니다.
도마에 오른건 블랙 오닉스, 람보, 던전 마스터 3개입니다.
하나씩 테스트해봅니다. 두가지 방법을 썼습니다.
1. GameRunner 모드 전용 BIOS의 폰트를 바꾸는 방법
BIOS 롬 자체를 해킹하는 방법입니다.
2. FontPack의 메모리에 로딩하는 방법
WORKAREA의 CGPNT를 재설정하는 방식이죠. 저기 위에 2번에서 설명했던 방법이요.
사용자의 편의를 위해,
롬 파일과 이름이 같은 폰트 파일(확장자 FNT)이 있으면, MMCSD.COM에서 자동으로 로딩하도록 만들었습니다.
아래는 블랙 오닉스를 실행하는 모습이네요.
테스트로 쓰인 폰트는 아래처럼 생겼어요.
* 블랙 오닉스의 테스트 결과입니다.
아래는 폰트를 바꾸지 않고 그냥 실행한 모습입니다.
BIOS 폰트의 점 하나도 바꾸지 않고 그냥 쓰고 있네요! ㅎ.ㅎ
아래는 GameRunner의 폰트 로딩으로 실행한 모습입니다.
글자가 바뀐게 보이시죠?
이번에는 FontPack에 로딩한 모습입니다.
글자가 엉망이 됐군요. 버그겠죠. ㅎ.ㅎ;
폰트 로딩 시 슬롯0로 고정해놨거나 뭐 그런 이유가 아닐까 싶은데... 게임 디버깅은 PASS~
* 람보의 테스트 결과입니다.
아래는 폰트를 바꾸지 않고 실행한 모습인데요.
FontPack에 로딩을 해도 폰트가 바뀌지 않네요.
WORKAREA의 설정값을 무시하고, BIOS 롬 내부의 폰트 데이터를 쓰는걸로 생각됩니다.
아래는 GameRunner의 폰트 로딩으로 실행한 모습입니다.
제대로 폰트 변경이 되어있네요.
* 던전 마스터의 테스트 결과입니다.
아래는 폰트를 바꾸지 않고 실행한 모습입니다.
BIOS의 폰트를 두껍게 만들어서 쓰고 있네요. 예전 BASIC 게임들이 이런식으로 많이 썼었던 기억이납니다.
코드 서너줄로 글자를 이쁘게 만들 수 있으니까요~ ㅎ.ㅎ
아래는 GameRunner 및 FontPack의 폰트 로딩으로 실행한 모습입니다.
두 경우 모두 아래처럼 폰트가 제대로 변경이 되었어요.
WORKAREA의 테이블값을 제대로 활용하는 게임이 되겠습니다! 와우~ ㅎ.ㅎb
결론입니다...
시스템(WORKAREA)에 설정된 최종 폰트 데이터를 사용하는 게임도 있고, 아닌 경우도 있네요.
실제로 적용해본다면, FontPack으로 로딩하는건 포기하는게 맞을 것 같구요.
GameRunner 쪽만 적용하는걸로 진행해야될 듯 합니다.
그럼, 즐거운 주말되셔요!!