2017년 4월 29일 토요일

MMC/SD Drive V3 제작 #14 - BIOS 폰트 교체 테스트

일단 서론부터...


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 쪽만 적용하는걸로 진행해야될 듯 합니다.


그럼, 즐거운 주말되셔요!!


2017년 4월 22일 토요일

paraMSX-R 제작 #9 - 폰트롬 I/O 구현

대부분의 MSX2 이상의 본체에는 16x16 사이즈의 폰트롬이 내장되어있습니다.

일제 기종은 JIS1 128KB 일어/한자 폰트가 들어있구요. (FS-A1 등의 저가 모델은 없어요 ㅎ.ㅎ)

2+, turboR 기종에는 JIS2 128KB가 추가되어있습니다. 합하면 256KB 사이즈가 되겠네요.

12x12 또는 24x24 폰트도 함께 들어있는 경우도 있다고 합니다. (안써봐서 자세히는 모릅니다요~)


국내 기종은 유일하게 X-II 시리즈(CPC-400/400S)에 256KB의 한글/한자 폰트가 들어있습니다.


만약 본체에 폰트롬이 없는 경우는 한자롬 카트리지를 꽂으면, Kanji 드라이버, 폰트 등을 쓸 수 있는걸로 알고 있어요.

제가 만든 FontPack을 쓰면 1.5MB 사이즈의 대용량 폰트를 쓸 수도 있구요. ㅎ.ㅎㅋ


그러면 여기서 한가지 의문이 생깁니다.

이런 폰트롬이 내장되어 있으면 이걸 제거하거나 다른 폰트롬으로 교체하려면 어떻게 해야되나요?


롬을 뽑아서 교체? 사실 그냥 롬만 바꾸는건 의미가 없습니다.

각각의 폰트 처리용 H/W가 조금씩 다르거든요.

물론 내장된 폰트의 모양만 바꾼다면, 롬만 새로 구워서 교체해도 되긴합니다.


이 문제는 폰트롬뿐만 아니라, 수퍼임포즈, RS-232C 등의 기기가 내장되는 경우에도 발생하는데요.

사실은...ㅋ

MSX가 내장 기기를 H/W OFF하고, 외장 기기가 구동될 수 있도록 만들어져있습니다.


바로 포트 F5H에 들어간 System control 레지스터입니다.


http://map.grauw.nl/resources/msx_io_ports.php#systemcontrol





MSX의 메인 BIOS가 부팅 할때 이런식으로 진행이 됩니다.

1. 내장 기기를 모두 OFF

2. 외장 기기가 존재하는지 체크

3. 외장 기기가 없으면, 내장 기기를 ON


간단하죠? ㅎ.ㅎ


오~~ 그럼 paraMSX-R에서 폰트롬 구현할 때, F5H 포트로 내장 폰트 꺼버리면 OK 겠군~ 유후~~


.

.

.

.

아름답게 해피엔딩이 될 것 같았지만, 실제 구현해보니 눈물만...ㅜ.ㅜ



암튼 본론으로 들어갑니다!!


System control 포트(F5H)로 내장 기기를 끌 수 있는지, 먼저 확인을 해야겠죠?


1. 제가 주력으로 쓰는 A1GT -> JIS1/2 끄니까 한자안나오네요. 잘 동작합니다.


2. A1WSX -> JIS1/2 역시나 잘 되네요. 아마 MSX2+ 이후 기종들은 정상 지원되지 않을까 싶으네요.


3. OCM -> 안됩니다. VHDL 소스를 대충 뒤져봐도 구현 자체가 안된 것 같네요.


4. X-II 실제 테스트는 못해봤지만, 매뉴얼 상으로 봤을 때는 안될 확률이 높은 것 같네요.




X-II 매뉴얼에 보면 F5H 포트는 언급이 안되어있네요. 그냥 예약된 포트라고만 되어있습니다.

수퍼임포즈의 F7H 포트는 자세하게 설명이 된걸로 봤을 때, 아마 F5H는 안넣었을 확률이 높아요.

작동되는(?) X-II 가지신 분 있으시면 한번 테스트해보셔요.


BASIC에서 OUT &HF5,&HFC 입력하면 폰트롬 I/O가 OFF됩니다.

이 상태에서 SCREEN 9:WIDTH 64 하셔서 명조체 한글이 나오는지 보시면 되겠습니다.

만약 X-II에서 F5H 포트 컨트롤이 된다면, Kanji롬 카트리지를 꽂으면 내장한글을 죽일 수 있을겁니다요. ㅎ.ㅎ


참... blueMSX 등의 에뮬에서는 F5H 지원이 안되니 테스트해보지 마셔요.

에뮬에서는 부팅하면 Kanji 롬 등의 H/W는 내장이 아닌, 외장 기기로 인식됩니다.

그래도 동작에는 문제없으니까, 일반 사용의 경우는 별 차이없다고 보면 됩니다.



으흠... OCM이랑 X-II를 포기하는게 좋을지 잠시 고민하면서~~ㅋ

일단 paraMSX-R에서 폰트롬 I/O를 넣고 제 A1GT에서 테스트해보기로 합니다.


CPLD는 제대로 구현한 것 같은데, 이거 뭔가 동작이 안되네요. -_-

한참을 삽질하다가 혹시나해서 A1WSX에 꽂아봤더니, 그냥 돌아갑니다. 어허허허~~~


내 GT가 보드 불량이려나...

JIS1/2 폰트를 끄는건 되는데, 외장 폰트 데이터가 전혀 읽히지 않습니다.

포트 값들이 죄다 FFH로 들어오네요.


설마설마... 하는 마음으로 회로도를 봤더니 -_-;;;;;;;;;

A1GT에 뭔가가 들어있습니다. 웃기는게 A1ST에는 없구요. 아마 ST에서는 정상 동작할걸로 예상됩니다.

그게 뭐냐면 폰트롬 I/O로 쓰이는 DxH 포트가 회로적으로 막혀있네요~ 으잉!!


아래 사진을 보시죠.

외부 슬롯의 /IORQ 출력 조건에 DxH 포트는 제외가 되어있습니다.

ST는 이 회로가 없는데요. 아마 회로 버그가 GT에서 임시로 막아놓은게 아닐까 싶습니다.

외부 폰트롬 충돌 문제이거나 뭐 그렇겠죠.




파나소닉 이놈들 ㅜ.ㅜ 잊지않겠다! (까지는 아니고, GT 만들어주셔서 감사~ ㅎ)

GT에서는 폰트쪽을 업그레이드 기기로 쓸 수가 없네요.

GT가 안되면 말짱 꽝~ ㅋ


어차피 OCM, X-II도 안되는데 걍 다른 방법으로 구현하기로 합니다.


paraMSX-R의 사실상 주 기능은, Z80 명령어를 가로채서 바꾸는 기능인데요.

이게 구현이 되어서, PPI, 메모리매퍼 등의 포트를 다르게 구동하고 있죠.


JIS1/2, 한글/한자 폰트롬은 포트 D8H,D9H,DAH,DBH 4개 포트를 사용합니다.

이걸 paraMSX-R의 다른 포트로 구현해서 바꿔치기하면 동작이 되겠죠?


플래쉬롬 여유가 많기 때문에,

JIS1/2 폰트 3종류랑 X-II의 한글/한자 폰트 다 넣었습니다.

256KB x 4셋 다 넣어도 1024KB 밖에 안됩니다요. ㅎ.ㅎ

JIS1/2는 메이저 제작사인 파나소닉,소니,산요 정도로 넣으면 좋구요.


그럼, 동작하는 모습을 한번 볼까요?


Kanji는 이제 지겨울테니, X-II 한글/한자를 띄워봅니다.

테스트 프로그램을 만든건 아니구요. 그냥 대우 데모 디스크를 실행해봤습니다. ㅎ.ㅎ

명조체 한글과 한자가 잘 보이시죠?





삽질을 꽤 했지만, 의지의 한국인! 결국 다 때려넣었습니다. 해피엔딩~ㅎ


마지막으로 제 GT에서 동작하는 모습을 영상으로 담았습니다.

대우 데모 프로그램은 GT의 내장 FDD에서 실행됩니다. 참고하셔요.





그럼, 즐거운 주말되세요~ ㅎ.ㅎ


2017년 4월 16일 일요일

paraMSX-R 제작 #8 - 디럭스박스 4메가로 달려~달려~

재미나 디럭스박스(DeluxeBox) 아시죠?

램을 넣어서 만든 메가롬팩인데요.

FDD 또는 카세트로 롬 이미지를 로딩해서 구동하는 방식입니다.


paraMSX-R에는 4메가 버전의 디럭스박스를 에뮬레이션합니다.

4메가니까 128 x 4 = 512KBytes 용량이 되겠습니다.


참고로 paraMSX-R에는 2048KB의 SRAM이 들어있습니다.

그 중 1024KB는 메인 메모리 매퍼로 쓰이구요,

나머지 용량 중 512KB를 디럭스박스로 사용합니다.


오리지널 디럭스박스와 H/W 동작이 같도록 만들었습니다.

그러니까 80년대 재미나에서 발매했던 로더 프로그램을 그대로 사용가능합니다.


아래는 CPC-400 머신 세팅으로 버블보블을 로딩하는 모습입니다.






사용 편의를 위해서 PARAMSXR.COM 실행할 때,

슬롯1이 비어있으면 디폴트로 디럭스박스를 세팅하도록 했습니다.


아래는 에뮬을 종료한 상태의 레지스터 및 기본슬롯 상태를 보여주는데요.

페이지0 = 슬롯0-0 (메인 BIOS)

페이지1 = 슬롯1 (디럭스박스)

페이지2 = 슬롯1 (디럭스박스)

페이지3 = 슬롯0-2 (메인 램)

으로 동작하고 있네요. ㅎ.ㅎ



마지막으로 제 GT에서 구동하는 영상을 올려봅니다.

1. X-II + 디럭스박스 + FDD에서 재미나 램카드 테스트 프로그램 구동 (RAMTEST)

2. X-II + 디럭스박스 + FDD에서 버블보블 실행

3. IQ-2000 + 디럭스박스 + FDD에서 불새 실행





그럼, 다음편에서 또 만나겠습니다요~ ㅎ.ㅎㅋ