2015년 6월 25일 목요일

FontPack 제작 #4 - 최종 스펙 정리

플래쉬롬의 빈 공간, SRAM, 코드 변환 등, 일주일정도 고민을 해봤는데요...

아래처럼 정리되었습니다. ㅋ


1. 코드 변환 테이블 5개 할당

  - 유니코드 -> CP949

  - 조합코드 -> CP949

  - CP949 -> 유니코드

  - CP949 -> 조합코드

  - CP949 한자 -> 한글독음


2. SRAM 영역 코드로 사용

  - 아스키16 매퍼 1메가롬팩 처럼 구동

  - 도스에서 다운로드 및 실행 


3. 유저 롬(128KB) 추가

 - 플래쉬롬에 유저 영역 128KB 할당.

 - 부팅 시 기본 BIOS 또는 유저 롬 선택 가능.

 - 유저 롬 선택 시, SRAM으로 롬코드 복사되어 실행


4. ASCII 폰트 셋 1개

 - 여러개 넣어봤자 크게 효용이 없을 듯....은 핑계구요.

   CPLD 용량이 꽉차서 -_- 폰트 셋 1개만 사용합니다.

   (8x16 한벌, 6x12 한벌)


그.래.서. 최종 레지스터 맵 나갑니다~ 빠빠빠~~




코드 변환 설정 용, BIT 영역이 좀 늘었구요.

SRAM을 메인 메모리 뱅크로 설정하는 기능이 들어갔습니다.

ASCII 16K 롬을 패치 없이 SRAM으로 로딩/구동이 가능합니다.



아래는 최종 메모리 맵입니다.




처음에 언급했던 USER ROM 영역(128KB) 추가되어있습니다.

사용자 취향에 따라 확장 BIOS롬 또는 일반 아스키16 메가롬 이미지를 넣으면 되겠습니다요.

부팅 시, "F" 키를 누르면, BIOS롬 대신 USER 롬이 구동됩니다.

물론 폰트 IO는 똑같이 동작하겠구요.


BIOS롬은 어떤 기능이 들어가게 될지 아직 정해진건 없습니다.

한글 입력기라던가.... KANJI 드라이버의 디스플레이(인터레이스 모드 등)에 한글 조합이라던가...

정도로 고려중입니다. ㅎ.ㅎ



아래는 코드변환 샘플 프로그램을 실행항 모습입니다

BASIC 프로그램이에요.



Hanja to Hangul 변환은 그냥 한자 음독이라고 생각하시면 되겠습니다.


아래는 실제 프로그램 소스입니다.

IO 포트 핸들링 참고하시면 되겠습니다.




머리털 나고 처음으로 PCB 한번 그려보았습니다.

왜 그렸냐구요? PCB 찍으려구요. ㅋㅋ

Eagle 캐드이구요. 오버리치님 케이스에 맞는 사이즈로 되어있습니다.




보드 오른쪽 공간에 SD카드 자리도 하나 넣었어요.

다른 개발 테스트 용도로...으헙...ㅎ.ㅎㅋ



아래는 PCB 실물 사진입니다.

납땜 실력이 메롱이라, CPLD 붙이는게 힘드네요.



비아홀이 Eagle 캐드 기본설정인데, 사이즈가 너무 크네요. -_-




여기까지입니다~

즐거운 밤 되셔요~ ㅎ.ㅎ


2015년 6월 16일 화요일

FontPack 제작 #3 - 문자 출력 테스트

이번에는 폰트팩의 문자 출력 및 코드 변환을 해보았습니다.


아래는 폰트팩의 I/O 레지스터 맵입니다.

기본적인 입출력은 I/O 포트를 통해 동작하도록 만들어져있습니다.




첫번째 레지스터(50H)는 read 시, 이전에 write한 값이 들어오지만,

그 외 레지스터(51H, 52H, 53H)들은 read/write 각각 기능이 다르게 동작합니다.

52H, 53H 레지스터는 읽을 때마다, 값이 변하게 되어있습니다.

레지스터 내부적으로는 메모리의 32bytes 공간을 순차적으로 read하도록 동작합니다. (1BPP 기준)

만약 4BPP 모드라면, 128번 read 가능합니다.



아래는 16 x 16 사이즈 폰트로 내장된 데이터입니다.

90년대 널리 쓰였던 844 조합 폰트로 만들어져있습니다.




아래는 간단한 BASIC 프로그램으로 폰트 데이터를 표시해주는 모습입니다.

1BPP 모드로 설정되므로, 글자 한개당 32bytes를 읽습니다.


문자코드 B0A1 '가' 입니다.




CP949 확장 코드인 8142 '갃' 입니다.




아래는 사용되었던 BASIC 프로그램 소스입니다.

한글 뷰어 HV로 표시한 모습입니다. (12 x 12 폰트 모드 사용)




아래는 컬러 레지스터를 활용하여, 4BPP 모드로 출력해본 모습입니다. (스크린 7 사용)

문자색이 설정되면, 포트에서 읽은 데이터에 이미 색이 입혀져(?) 있습니다.

VRAM에 그대로 써주면 되도록 만들어져있습니다.




같은 방식으로 아스키 문자를 표시한 모습이구요.

참고로 아스키 문자는 4벌이 들어있습니다.

모드 레지스터 설정으로 선택이 가능합니다.




아래는 한글뷰어(HV)로 16 x 16 및 12 x 12 폰트를 테스트한 모습입니다.

하이텔 파라동 시절 완성형 코드로 된 갈무리 문서를 표시했습니다.


16 x 16 사이즈~




요건 12 x 12 사이즈

폰트가 굴림체라서, 윈도 메모장 처럼 보이죠? ㅋ




아래는 조합형 코드를 사용하는 ISS 문서를 표시한 모습입니다.

ISS 파일 아시죠? IMS 음악 가사 파일이요. ㅎ.ㅎ



 

12 x 12 폰트로 표시한 모습~




아래는 12 x 12 폰트로 사용된 굴림체 데이터입니다.

원본 FNT 파일은 16 x 16 사이즈로 되어있지만, 폰트롬으로 변환할때는 12 x 12 외의 공백은 삭제되어 들어갑니다.




그럼, 이번에는 폰트팩 SRAM를 이용한 문자 출력 테스트입니다.

MS 도스시절 쓰이던 폰트의 특수 문자 몇개를 긁어왔습니다.ㅋ (4Kbytes)




아래처럼 FONTPACK.COM으로 다운로드 가능하구요.




아래는 4BPP 모드로 설정해서 표시한 모습입니다.

참고로 2bytes 문자 코드가 0000H ~ 7FFFH 사이값이면, 폰트팩 SRAM 데이터가 출력이 되구요.

코드가 8000H ~ FFFFH 사이값이면, 플래쉬롬의 데이터가 출력됩니다.




마지막으로 코드 변환 테스트입니다.

CP949 코드와 조합형 코드 사이 변환이 가능한 것을 볼수 있습니다.









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랑 비슷하구요. 나이스하네요.


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

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