2015년 6월 12일 금요일

FontPack 제작 #2 - 문자 인코딩과 폰트롬 구조

이번에는 문자 인코딩 및 폰트팩에서 사용될 폰트롬에 관한 얘기입니다.


요즘은 유니코드가 기본으로 사용되지만,

 80~90년대에는 KSSM으로 불리던 상용조합 코드와 KS완성형(KS C 5601) 코드가 주로 쓰였습니다.


80년대에 정부에서 완성형 한글 코드를 표준으로 채택했지만, 90년대초까지 조합형 한글도 많이 썼던걸로 기억합니다.

그러다가 윈95에서 MS가 완성형 한글을 확장한 CP949 인코딩(MS 949로도 불림)을 사용하게 되면서,

국내에서 오랫동안 CP949의 완성형 한글이 쓰이게 되었습니다.


한글 윈도는 파일명을 설정할 때, 메모장 등에서 텍스트 문서 저장할 때 아직도 CP949를 기본으로 씁니다.

결국, MSX에서 지원할 문자 인코딩을 선택한다면, 최소한 CP949는 있어야 쓸모가 있겠습니다.


얘기 나온김에 위키에서 긁어온 그림 몇장 첨부합니다.


아래는 EUC-KR 인코딩에서 쓰이는 코드입니다.

KS X 1001 문자셋이 예전 KS C 5601로 불리던 KS완성형 코드를 의미합니다.

(세로축이 High 8bit, 가로축이 Low 8bit로 되어있습니다.)

출처: 위키백과



KS X 1001은 특수문자 + 한글 + 한자 조합으로 되어있구요.

아시다시피 완성형 한글 2350자 밖에 없어서, "펲시콜라" "똠방각하" 이런걸 표시할 수가 없었지요.ㅋ

출처: 위키백과



아래는 CP949 인코딩입니다. KS X 1001에 빠진 한글을 대충 구겨넣은 모습이죠? ㅋ

출처: 위키백과



참고로, 아래는 조합형입니다.

15bit 문자 코드로 가능한 한글 조합이 모두 들어있어서, 코드 영역도 많이 차지하고 있습니다.

출처: 위키백과



아래는 폰트팩에서 고려한 사항들입니다.

1. CP949 인코딩 (완성형 한글)

2. 조합형 인코딩

3. 비트맵 폰트 16 x 16 사이즈

4. 비트맵 폰트 12 x 12 사이즈

5. 폰트롬 용량 2MBytes


만약 MSX에서 문자 표시를 하게 된다면, 12 x 12 크기의 폰트가 상당히 중요합니다.

고해상도 모드인 스크린 7을 쓰더라도, 80컬럼 표시를 하려면 12픽셀 폭의 문자가 있어야 되니까요.

일단 12 x 12 완성형 넣고 보니, 조합형 폰트랑 16 x 16 크기의 폰트를 모두 넣기에는 롬이 너무 많이 필요하더군요.


롬을 2MB 사이즈로 끊기 위해 ㅋ

조합형 폰트는 포기하고, 대신 CP949/조합코드 변환 테이블을 넣기로 했습니다.

최종 결정된 폰트롬 구조는 아래와 같습니다.




총 2MB 플래쉬롬 + 128KB SRAM으로 구성됩니다.

문자 코드 하나 당 32byte를 차지합니다.

32bytes면 비트맵 16 x 16 폰트 글자 한개 사이즈입니다.

ASCII 영문 문자의 경우는 가로폭 절반으로 구성됩니다.


CP949 코드는 롬 주소와 1:1로 매핑되도록 되어있습니다.

ASCII 코드는 비어있는 영역에 배치하였구요.

코드 변환은 128KB 테이블 4개로 구성됩니다.

ASCII 코드 및 CP949/조합 코드 변환은 CPLD가 해주게 됩니다.

유니코드 변환은 CPLD 용량 부족으로 약간의 SW 도움이 필요합니다.ㅋ


SRAM 128KB 영역은 16 x 16 크기 문자 4096개를 넣을 수 있습니다.

사용자 프로그램이나, 기타 OS 등에서 폰트 가속이 필요할 때 활용할 수 있겠습니다.

BIOS에서 데이터 메모리로도 사용도 가능합니다.

SW 구현 시, 메모리가 많이 필요하게 된다면 유용하게 쓰일 수 있겠네요.

참고로 메모리 맵 I/O 상으로는 플래쉬롬 및 SRAM은 일반 롬팩처럼 동작합니다. (램이 내장된 롬팩으로 보면 되겠네요.)


마지막으로, 현재 제작된 폰트팩 proto-type 모습입니다.

SRAM은 32KB짜리가 달려 있습니다. 나중에 보드 뜨면, 128KB로 대체되겠습니다.




SRAM은 뒷면에 부착~ ㅋ




1MB 플래쉬롬 두개가 겹쳐있습니다.




오늘은 여기까지구요.

다음편엔 폰트팩의 I/O 동작에 관한 내용이 이어집니다. 기대해주셔요~ ㅋ


PS. 예고편으로 사진한장 투척합니다. ㅎ.ㅎ

    한글 뷰어인 HV 프로그램을 실행한 모습입니다.

    윈도 굴림체 9포인트(12 x 12) 폰트 기반으로 만들어진 폰트롬이 사용되었습니다.





2015년 6월 7일 일요일

FontPack 제작 #1 - 폰트 가속기

제가 주로 사용하는 MSX 본체가 일제 기기이다보니,

 한글이라던가 특수문자 등 KSC5601 셋을 활용하려면 뭔가 다른 방법이 필요한데요.


이제까지 DOS2의 메모리를 활용해서 폰트를 램상주 시키고, 프로그램에서 import하는 식으로 사용했습니다.

아래 글 참고하셔요~

http://sharksym.egloos.com/5250995

http://sharksym.egloos.com/5250996

http://sharksym.egloos.com/5251004


램상주 폰트를 사용하면, 응용 프로그램에서 폰트 공유를 할수 있어 좋지만...

메모리를 많이 점유한다는 점과 부팅할때마다 램에 로딩하는 시간때문에 답답하더군요.

실사용 시, DOS2 세그먼트 액세스하는 것도 코딩에 부담이 좀 되구요.

물론 제가 쓰는 HI-TECH C 환경으로는, LIB로 구현해놔서 쉽게 쓸 수 있지만...

아마 다른분들은 힘들겠...죠? ㅋ


결론은 "HW 폰트 메모리를 만들자!"가 되겠습니다.

일단 시작하려면 이름부터 지어야겠지요? ㅋ

그래서... 이름이 "FontPack" -_- 한참 고민해봤는데, 딱히 떠오르는게 없네요 ㅎ.ㅎ


기본적인 요구사항을 대충 적어보면,

 - KSC5601 완성형 한글/특수문자/한자 set (문자 코드 영역: A000H ~ FFFFH)

 - 조합형 한글/특수문자/한자 set (문자 코드 영역: 8400H ~ FFFFH)

 - ASCII 문자 set (문자 코드 영역: 00H ~ FFH)

 - 폰트 사이즈: 16 x 16, 1BPP 타입 문자 한개당 32bytes 사용

 - Z80 Port I/O 사용

정도가 되겠습니다.


그냥 이렇게 만들면, 기존 일제 MSX의 JIS KANJI롬 또는 X-II의 한글/한자롬의 디럭스 버전 정도가 되려나요?

그래서 기능을 좀 추가합니다.

 - MSX 스크린5,6,7 에서 픽셀 데이터를 바이트 단위로 뿌릴수 있는 2BPP/4BPP data 변환 기능

   IO port에서 읽은 data를 그대로 VRAM에 write하면 됩니다.

 - 한글 확장 BIOS: 조합 to 완성, 완성 to 조합 코드 변환, 844 조합형 한글처리 등

 - SRAM을 이용, 사용자 문자set 지원 (BIOS 또는 응용 프로그램 내에서 폰트 가속처리)

 - 12 x 12 폰트 지원. MSX에서 80컬럼 쓰려면 12픽셀폭 폰트가 필수입니다.


HW는,

 - ALTERA EPM3128 (CPLD)

 - 2MBytes 플래쉬메모리, 32KB SRAM

로 구성합니다.

CPLD 한개에 구겨넣을 수 있을지가 문제네요. 음...


폰트 data는,

 - 16 x 16 사이즈: 완성형 및 조합형 한글/특수문자/한자 set, ASCII set

 - 12 x 12 사이즈: 완성형 한글/특수문자/한자 set, ASCII set

                    (조합형 코드는 용량문제로 포기ㅋ, 조합 to 한글 코드 변환으로 때워야...)


플래쉬 메모리는 16KB 매퍼가 필요하니, 별도 매퍼 만들기보다는...

그냥 ASCII 16KB 매퍼를 구현하도록 합니다.

(CPLD 용량 딸리면...바뀔지도 몰겠네요 ㅋ)


대충 스펙을 정했으니, 제작에 돌입합니다~~ ㅎ.ㅎ


만능기판을 한장 준비해서 CPLD를 붙입니다.

EPM3128 TQFP 타입이라 DIP 변환기판 썼습니다. (한장에 7000원짜리 변환기판 ㄷㄷㄷ)

JTAG 핀헤더도 붙여주고요.




뒷면입니다.

CPLD 그라운드 배선을 했네요.

심시티 도로 깔때처럼 이쁘게~ 이쁘게~ 고가다리도 하나 보이네요.ㅋ




정신줄 놓고 바느질 하다보면, 어느새 플래쉬롬이 나타납니다.

만능기판에 붙이려고 SOP 500mil 타입을 찾았습니다.

1MBytes라서 두개를 포개서 납땜해야됩니다.

아래처럼 다리를 위/아래/위위/아래/ 벌리면 기판에 착~ 달라붙어요~




바느질이 끝난 모습입니다.

SLTSL(슬롯 선택) 신호에 스위치 하나 달았구요. 동작 표시(또는 디버깅) 용으로 LED하나 붙였습니다.




보면 귀신나올 것 같지만, 이쁘게 하려면 시간이 많이 걸리는 작업이라 ㅡ.ㅡ

걍 대충 납땜합니다.




터보알에 꽂아본 모습이네요.

이...이런... JTAG 핀헤더가 슬롯에 묻히네요 ㅡ.ㅡ

대충 붙였더니 이런 참사가...ㅋ 슬롯에 꽂은 상태로 CPLD 다운로드는 불가능하겠습니다.




ASCII 16KB 매퍼는 간단한거니, 대충 VHDL 코드를 만들었어요.

FontPack 툴도 대충 만들어서~ 바로 테스트 들어갑니다.


뱅킹 필요없는 일반 16KB 롬(킹스밸리) 먼저 확인!




잘되네요~




1메가겜인 갈포스도 돌려봅니다.



ASCII 16KB 매퍼는 잘 동작하네요.




마지막으로 2메가바이트 전체용량을 채워봅니다.




음... 잘 되는군요.

근데 테스트해보니, Pointless Fighting 롬을 1메가바이트만 넣어도 실행은 되더라구요. ㅎ.ㅎ

참고만 하셔요.




이거 실기로 처음 돌려봤는데, 문사운드 효과음도 깨끗하고 좋습니다.

캐릭터 움직임도 오락실 스파2랑 비슷하구요. 나이스하네요.


오늘은 여기까지구요, 다음 편에는 폰트 처리가 이어집니다~

그럼, 즐거운 하루 되셔요...



 

2015년 5월 25일 월요일

DOS2 램디스크 간단 활용 및 버그(?) 소개

일단 서론 나갑니다. ㅎ.ㅎㅋ


DOS2부터 커널에서 메모리 매퍼를 지원합니다.

근데, 대부분의 DOS프로그램들은 TPA(기본 메모리 64K 이하 영역) 만으로 구동되기 때문에,

메모리를 많이 확장하더라도 그다지 활용되지 않습니다.


20여년 전 국내 상황에서는 turboR 기종이 아니면, DOS2 사용하기가 힘들었던 것도 이유가 되겠구요.

DOS2 용 프로그램 만들어봐야 구동 가능한 사용자가 별로 없으니,

차라리 재미나 램카드를 활용하는 프로그램이 더 유용했을 것 같기도 하네요. ㅎ.ㅎ


어쨌거나 20여년이 지난 지금, 많은 분들이 DOS2 를 사용하고 계시지요. (맞나요? ㅋ)

DOS2는 자체적으로 램디스크를 지원합니다.

메모리 매퍼 일부분을 가상의 디스크로 만들어주는 것이지요.


기본적인 사용법은 DOS2 프롬프트에서 HELP RAMDISK 라고 입력하면, 도움말을 볼 수 있으니 참고하시구요.

그럼, 본론 나갑니다~


1) 램디스크 설정

   RAMDISK 숫자

   숫자는 KB단위로 인식됩니다. 128KB 램디스크를 만드려면, RAMDISK 128 입력하면 되겠습니다.

   램디스크는 항상 H: 드라이브로 생성이 됩니다.

   만약 H: 드라이브가 이미 존재한다면, 램디스크 추가가 불가능합니다.


2) 램디스크 해제

   RAMDISK /D

   입력하면 할당된 메모리가 해제되며, H: 드라이브는 더이상 사용 불가능합니다.

   임시로 저장했던 파일이 있다면, 미리 다른 물리 디스크로 복사해야 되겠지요.


3) 주의 사항

   FAT16 드라이버(Okei 씨 프로그램)를 함께 사용하려면,

     먼저 RAMDISK 설정 후 FAT16 드라이버를 실행해야합니다.

   FAT16 드라이버가 실행된 상태에서는 RAMDISK 설정/해제가 불가능합니다.


4) 실제 활용

   램디스크가 FDD보다는 훨 빠르지만,

     MMC/SD 드라이브, 선라이즈 IDE, OCM MEGA-SD 등의 기기보다는 느립니다.

   이 경우는 CPU, 메모리가 고속인 turboR에서만 램디스크 효과가 있겠습니다.


   DOS2에서 응용 프로그램 실행/종료가 되면 항상 COMMAND2 쉘 프로그램이 재로딩됩니다.

   이 때, COMMAND2가 램디스크에서 로딩되면 조금 더 쾌적한 환경이 됩니다.

   제 경우는 아래처럼 AUTOEXEC.BAT 및 REBOOT.BAT 설정하고 있습니다.

   SET SHELL 설정 참고하셔요.


[AUTOEXEC.BAT]

SET EXPERT=ON

SET SHELL=A:\COMMAND2.COM

SET PATH=B:\UTILS\;B:\M\;C:\

SET HELP=B:\HELP

MODE 80

VER

RAMDISK /D

RAMDISK 64

COPY COMMAND2.COM H:\

VOL H:RAM_Disk

FAT16

KS_SPE

KS_HANJA

REBOOT %1


[REBOOT.BAT]

SET SHELL=H:\COMMAND2.COM

SET PATH=H:\;B:\UTILS\;B:\M\;C:\

SET TEMP=H:\

C:

cd \

MODE 80

M



마지막으로, 램디스크의 버그로 보이는 동작 하나 소개합니다.

RAMDISK는 항상 H: 드라이브로 할당되도록 만들어져있는데요.

근데 램디스크 해제 명령인 RAMDISK /D는

 H: 드라이브가 실제 물리적인 디스크인 상태에서 실행하면, H: 드라이브를 날려버립니다.

H: 드라이브가 없어지면 접근이 불가능해집니다. 흐흠...


저는 요걸 터보알에서 유용하게 쓰고 있는데요.

부팅 시 MMC/SD 두대가 A: B: C: D: E: F: 로 할당되고,

G: H: 가 본체 내장 FDD로 할당됩니다. (FDD는 물리적인 디스크는 한개지만 가상으로 2개를 지원합니다.)


이 상태에서는 DOS2의 드라이브 문자가 모두 할당되어서 더이상 RAMDISK 설정이 불가능합니다.

근데 RAMDISK /D 를 실행하면, FDD인 H: 가 삭제됩니다. ㄷ ㄷ ㄷ

그러면 RAMDISK 설정 시, 에러나지않고 정상 할당이 됩니다.

저~~~기 위의 AUTOEXEC.BAT 내용에 RAMDISK /D가 포함된게 그 이유 때문이에요.


그럼, 줄입니다.

궁금한 점 있으시면, 덧글 달아주세요~ ㅎ.ㅎ