2021년 10월 24일 일요일

FontPack 제작 #14 - 롬매퍼 변경

폰트팩 V1은 ASCII 16K 매퍼와 동일하게 구현되어 있고,

전체 주소영역을 반으로 나눠서 플래쉬롬과 SRAM이 2MB씩 사용합니다.


지난 6년(?)간 폰트팩을 사용해본 결과, ASCII 16K 매퍼를 활용하는 경우가 별로 없네요.

MMC/SD V4의 메가램도 용량이 2MB라서, ASCII 매퍼 테스트 목적으로 폰트팩을 쓸 이유도 사라졌구요.


폰트팩 V2에서는 롬이 8MB로 늘어났기 때문에,

ASCII 16KB 매퍼를 삭제하고 폰트팩 전용의 롬매퍼가 탑재되었습니다.

이렇게 변경되면서 V1에 있던 128KB 유저 메가램 기능도 함께 삭제되었습니다.

뭐, 바뀐 매퍼로 인해 사용자가 따로 신경 쓸 부분은 없어요. ㅎ.ㅎ


전체 8MB 플래쉬롬에서,

2MB는 기존 V1과 동일한 BIOS + CP949 관련 테이블/폰트가 들어가겠구요.

5MB는 V2 전용의 유니코드 테이블/폰트가 들어갑니다.

그럼 1MB가 남게 되는데요.


요기는 간단하게 활용할 수 있는 1MB짜리 멀티롬 하나를 넣어놨습니다.

제가 카트리지 배포할 때 넣어드리는건 아니고, 사용자가 직접 다운로드하셔야 됩니다요~

어차피 처음에 폰트롬 생성하고 다운로드 해야되니까 필수 작업이긴 하겠네요.


멀티롬은 요놈이 들어가니까 참고하시구요.





요약: V2에서는 '유저롬 128KB' 기능이 '멀티롬 1MB'으로 변경됨.


즐거운 주말 되세요~


2021년 10월 22일 금요일

FontPack 제작 #13 - 컨트롤 레지스터 변경

폰트팩 V2는 기본적으로 V1과 호환이 됩니다.

예전 S/W들을 그대로 쓸 수 있습니다. (죄다 제가 만든 것 뿐이지만요ㅋㅋ)


V2는 이 상태에서 유니코드 기능이 추가로 들어가게 되었는데요.

이걸 직접 컨트롤하는 경우는 어떻게 해야하는지 잠깐 알아보겠습니다요~

(사실 모르셔도 됩니다ㅋ)



아래는 V1 호환 모드일 때의 레지스터입니다.




포트를 4개 사용하는 것은 기존 폰트팩 V1과 동일하구요.

MOD 레지스터에 VER(BIT7)값이 추가되었습니다.

기본값은 0으로 되어있구요. 위의 표에서 처럼 V1과 똑같이 동작합니다.

기존 V1의 BIT7 값은 0으로 고정되어 있으니까,

값을 바꿔서 적용이 되는지 체크하는 것으로, 보드 버전을 디텍션 할 수 있습니다.



아래는 V2 모드로 설정했을 때의 레지스터입니다.




VER(BIT7)을 1로 바꾸면 V2 모드가 됩니다.

유니코드는 0000H ~ FFFFH 영역을 모두 사용하기 때문에,

V1 호환모드의 FSEL(BIT7)은 존재하지 않습니다.

따라서 0000H ~ 7FFFH 문자도 플래쉬롬의 폰트가 사용됩니다.


V1의 KOR 레지스터와 V2의 UNI 레지스터의 동작방식은 동일합니다.

BPP에 맞춰 컬러가 적용된 폰트 데이터를 스트림으로 읽어냅니다.


V1 모드에서 문자 코드 변환기로 동작하는 CCV 레지스터는

V2 모드에서 WID 레지스터로 동작하며, 요놈은 기능이 전혀 다릅니다.

폰트의 가로폭 처리 시, VRAM 주소의 옵셋을 얻어옵니다.

그러니까 폰트를 그린 후, 다음 VRAM 주소값을 계산하는 용도로 쓰이는거죠.


CP949에서는 ASCII 문자가 한글/한자 폭의 절반으로 되어있어서,

S/W가 폰트의 폭을 이미 알고 있습니다. VRAM 주소를 계산하는데 H/W 도움이 필요없죠.


근데 유니코드의 폰트는 모양에 따라 폭이 결정되니까,

이걸 기반으로 VRAM 주소를 계산하도록 도와주는 레지스터 WID가 필요하게 되었네요.

BPP에 맞춰 값이 출력되기 때문에 포트에서 읽은 값을 기존 주소값에 더하면 끝입니다요.


그 외 BPP, PX12 등의 폰트 설정은 V1, V2 방식은 똑같구요.

CNV 설정은 V2에서도 변경이 가능하지만, 컨버터 데이터를 읽을 때는 V1 모드로 전환해야합니다.

코드 컨버터를 사용해야하는 경우가 어차피 CP949 또는 조합형 코드를 사용하는 경우일테니...

이렇게 해도 별 무리는 없을거에요.



그럼, 유니코드의 WID 레지스터를 활용하는 프로그램의 동작 모습을 보시죠.





폰트팩 V2 카트리지의 개발은 요렇게 마무리되겠습니다~


2021년 10월 20일 수요일

FontPack 제작 #12 - 유니코드 용 폰트 넣기

유니코드는 다국어 기본 평면(BMP, Basic Multilingual Plane)이 필요합니다.

부가 평면을 추가해도 되겠지만, 현재 MSX 활용 상황(ㅋ)를 볼 때 BMP만 있어도 충분할 것 같네요.


아래 그림이 폰트팩에서 실제 사용하는 유니코드(BMP) 폰트를 그림파일로 추출한 것입니다.




참고로, CP949 코드의 폰트는 1/4 정도의 영역만 사용합니다.




폰트 크기는 기존 폰트팩 V1과 같은 사이즈인 16 x 16 및 12 x 12 픽셀을 사용합니다.

BMP의 U+0000 ~ U+FFFF 문자를 16 x 16 사이즈의 비트맵으로 만들면 용량이 2MB가 됩니다.

결국 폰트팩 V2에서는 플래쉬롬의 4MB가 유니코드 폰트로 쓰이게 되는거죠.



폰트롬을 생성하는 방법은 FontPackTool 2.0 프로그램을 이용합니다.

기존 버전에서 유니코드 용 폰트를 선택하는 기능과 V2 롬을 생성하는 버튼이 추가되어있습니다.


고정폭의 폰트를 써야하니까 선택의 여지가 별로 없는건 똑같아요 ㅎ.ㅎ

굴림체, 돋움체, 바탕체, 궁서체 4개입니다.





V1 ROM으로 생성하면, 2MB의 파일이 나오구요. V2 ROM일때는 8MB입니다.

아래는 폰트팩 V2 롬을 다운로드 하는 모습입니다.

FONTPACK.COM 프로그램은 V1, V2 카트리지를 자동인식해서 동작합니다.

사용자가 따로 옵션에 신경 쓸 필요는 없어요.





기존 V1의 기능들은 이미 동작모습을 보셨으니, 유니코드가 제대로 동작하는지만 보겠습니다요~


U+AC00 문자입니다. 한글 영역입니다.




U+9752 문자입니다. 한자 영역이죠. 잘 나오네욤 ㅎ.ㅎ





이번엔 유니코드를 지원하는 프로그램에서 어떻게 출력되는지 봅시다요!

테스트 용으로 쓰인 문서는 첨부파일로 넣었으니 참고하시구요. (UTF16-LE 인코딩)

Download: UTF16LE.TXT


한글문서 뷰어인 HV의 동작 모습입니다.

아래는 기존 폰트팩 V1을 썼을 때의 출력입니다.

폰트팩에서 유니코드를 CP949로 코드변환을 지원합니다만...

CP949에 존재하지 않는 문자는 출력이 되지않겠죠.




아래는 폰트팩 V2의 유니코드 폰트를 이용하여 제대로 출력된 모습입니다.




음... 사진의 문자열이 익숙한 분이라면, 마츠다 세이코의 노래도 잘 아시겠네요 ㅎ.ㅎ

(노래 듣는데 제목이 제대로 안보여서, 폰트팩 V2를 만들었다는 소문이...ㅋ)



그럼, 편안한 밤 되세요~ ㅎ.ㅎ