2023년 10월 30일 월요일

지난 20년 개발의 추억 #4 - MMC/SD Drive V3

추억팔이 #4편이 나갑니다요~ ㅎ.ㅎ


이전글을 보시려면, 아래 링크를 눌러주세요!

https://sharksym.blogspot.com/2023/07/20-1.html

https://sharksym.blogspot.com/2023/08/20-2.html

https://sharksym.blogspot.com/2023/10/20-3.html




[본론]


11. MMC/SD V3 제작


2007년에 MMC/SD V2가 나온지 8년이 지났네요.

저의 MSX 환경은 1024KB램 증설된 A1GT와 확장6슬롯으로 조금 지겨워지고 있었습니다ㅋ

주변기기는 MMC/SD V2 + SCC-I + MoonSound + MPX + RS-232C + Music Module 조합으로 붙박이었네요.

.

.

.

이런저런 생각들이 하나 둘 쌓이다가 이런 결론에 도달하게 됩니다.

'필요한 기능을 모아서 새로운 MMC/SD를 만들어보자!'


참고: 이하 MMC/SD Drive V2 및 V3는 V2, V3로 줄여서 쓰겠습니다.




11.1 메가램 합체


게임을 위해, 메가램이든 플래쉬 롬팩을 쓰다보면 조금 귀찮은 부분이 있습니다.

본체를 리셋하더라도 메가램에 다운로드된 게임이 재구동 되니까,

본체전원을 끈 후 메가램의 내용이 지워(파괴)지도록 조금 기다렸다가 다시 켜야하는 작업이죠.


그냥 본체리셋만으로 메가램의 재실행을 방지하고 DOS로 부팅되면 편하지않을까요?

사실 이건 V2에서 플래쉬롬을 멀티롬(디스크롬 + 게임롬)으로 바꿔서 구동하는 기능으로 이미 구현되어있어요.

V3에서는 여기에 메가램을 추가하는겁니다요ㅋ


메가램/롬 매퍼는 최대 2048KB이구요. FlashROM 1024KB + SRAM 1024KB 조합입니다.

실제 V3 보드에는 FlashROM 1024KB x 2 + SRAM 512KB가 들어갑니다.

SRAM은 1024KB로 확장이 가능하구요. (약간의 납땜 작업이 필요합...니다.)


V3에서는 전원을 켜면 항상 DOS2 디스크롬으로 구동이 되며,

MMCSD.COM 프로그램으로 ROM을 다운로드 후 메가램 모드로 전환 재부팅이 가능합니다.

참고로, 메가램 모드로 바뀌면 디스크롬은 보이지않게 됩니다.

소프트 리셋을 하는 경우는 메가램 모드가 계속 유지되구요, 하드 리셋의 경우에는 디스크롬 모드로 복귀됩니다.


이제 좀 편해졌군욤~ 흐흐...



11.2 서브롬 


V2의 메인 플래쉬롬을 쪼개서 구현한 멀티롬 기능은 V3에서 삭제됩니다.

대신 별도의 1024KB의 플래쉬롬을 넣어서 전체를 하나의 게임팩처럼 쓸 수 있도록 해봅니다.

가끔 쓰일 경우가 있으니까요.

.

.

.

라고 생각하며 넣었는데요.

나중에 이 서브롬을 이용해서 KOEI 게임의 롬 + SRAM 모드를 구현하거나,

1.5MB 등의 사이즈가 큰 롬을 플래쉬롬과 SRAM에 나눠 다운로드해서 구동하는 모드가 들어가게됩니다.

(서브롬 안 넣었으면 어쩔뻔?ㅋ)



11.3 디스크 파티션 변경


V2에서는 최대 2GB의 SD(SDSC)를 720KB씩 분할해서 할당하는 파티션(최대 4095개) 개념을 넣었는데요.

V3에서는 고용량의 SDHC를 지원하게 되어서, 이 방식을 포기하게 됩니다.

만약 이 방식으로 32GB의 SDHC를 720KB로 분할하면, 대략 4만6천개의 파티션이 생성되는 사태가 벌어지겠죠 ㅎ.ㅎ


PC에서 사용하는 일반적인 디스크 파티션을 그대로 사용하도록 변경되었구요.

해당 파티션은 자동으로 디스크 드라이브로 마운트됩니다. A: B: C: D: ... 이런순으로요~


참고로, 메인 플래쉬롬의 롬디스크를 A: 드라이브로 마운트하는 기능은 여전히 지원됩니다.

이 경우에는 SD카드가 B: C: D: E: ... 순으로 밀리게 되겠네요.


A: 드라이브는 DOS2 부팅을 위해 FAT12로 포맷이 되어야합니다.

V3의 롬디스크로 부팅해서 SD카드 초기화(INSTALL) 작업을 진행하면,

자동으로 32MB 파티션을 할당하고 FAT12로 포맷이 되니까 참고하셔요.



11.4 FDD 에뮬 변경


V2에서는 부팅 드라이브(A:)의 파티션을 2DD로 할당된 파티션으로 바꿔서 FDD 에뮬을 했습니다만,

이제 이 방식은 쓸 수 없으니, 다르게 구현해봅니다요.


일반 파일로 저장된 디스크 이미지(*.DSK)를 그대로 R/W해서 FDD 에뮬을 처리하는 것이죠.

PC용 MSX 에뮬(예:paraMSX)에서 DSK 파일을 마운트하는 것과 똑같은 방식입니다. 멀티디스크 지원도 동일하구요.

실기에서 구동된다는 차이만 있을 뿐이죠 ㅎ.ㅎ


물론 뭐, MSX 실기에서 이걸 구현하려면...

DOS2와는 별개로 V3의 디스크롬에서 FAT12/FAT16의 디렉토리, 파일 엔트리를 처리해야 하니까 조금 부담이 됩니다.

근데 이렇게 하는 것보다 나은 방법이 없으니 Z80 풀파워로 구현해봅니다요 ㅎ.ㅎ


아마 사용자 입장에서도 이렇식의 FDD 에뮬이, 가장 직관적인 사용법이 아닐까싶으네요.

약간의 걸림돌이라면, 기존 V2에서 만들어뒀던 SD카드는 V3에서 못 쓴다는 점이겠죠ㅋ



11.5 turboR 최적화


V2에서  디스크 속도에 대한 큰 불편함은 없었는데, V3에서는 대용량 FAT16 디스크를 주로 써야하구요.

메가램 로딩, FDD 에뮬 등으로 디스크 R/W 부담이 늘게 되니, 디스크 속도를 올려야 덜 답답하겠더라구요.

기리고, turboR 구조에서 이득을 볼 수 있도록 설계했습니다.


결론적으로 turboR에서 디스크 Read 속도가 약 530KB/sec 정도가 되었습니다.

MSX2/2+에서는 속도가 155KB/sec 쯤 됩니다. 

V2의 속도가 130KB/sec 수준이었으니, turboR에서 V3는 상당히 쾌적하게 되었습니다~


MSX2/2+에서는 V3가 V2보다 조금 빨라진 정도니까, FAT16 드라이브를 쓰려면 좀 인내심이 필요합니다요.

사실 Z80 3.58MHz로는 좀 버겁습니다.



11.6 GameRunner


기존 GameRunner는 본체의 메인램과 VRAM을 사용하는 GRUN.COM 프로그램이었습니다.

이 프로그램과 비슷한 방식으로 V3의 메가램을 활용하는 GameRunner가 추가해봅니다.


기존 GRUN 프로그램이 V3의 추가기능을 지원하는 방식은 아니구요.

V3 전용 툴(MMCSD.COM)에 V3용 GameRunner가 포함되는 방식입니다. (MMCSD.COM의 /G 옵션 사용)



11.7 외부 SCC 사운드 처리


V2에는 SCC 칩이 들어있어서, 코나미 게임을 실행할 때 SCC 사운드를 그대로 들을 수 있습니다.

근데 V3에서는 SCC가 없어요ㅋ

대신 메가롬 및 GameRunner 모드에서 다른 슬롯에 장착된 SCC 사운드를 처리할 수 있는 기능이 들어갑니다.

물론 다른 슬롯의 기기(SCC)니까, 이걸 H/W적으로 처리는 불가능하구요. S/W 패치로 구현하게 됩니다.

MMCSD.COM에서 롬파일을 다운로드할 때, 다른 슬롯에 SCC가 발견되면 해당 기능이 자동으로 롬패치되어 구동됩니다.




[결론]


V2를 수년간 쓰면서 불편(귀찮아)했던 것들을 개선하고, 대용량 SDHC를 편하게 쓸 수 있도록 만드는게 주목적이었네요.

그렇게 2015년은 쓰윽~ 흘러갔습니다...


긴 글 읽어주셔서 감사합니다요~ ㅎ.ㅎ


2023년 10월 6일 금요일

지난 20년 개발의 추억 #3 - 램상주 폰트의 시작과 끝

연휴는 잘 보내셨나요? 그럼 #3편이 나갑니다요~ ㅎ.ㅎ

이전글을 보시려면, 아래 링크를 눌러주세요!

https://sharksym.blogspot.com/2023/07/20-1.html

https://sharksym.blogspot.com/2023/08/20-2.html



[본론]


8. M 파일매니저에 잡다 기능을 통합해보자


컴퓨터 활용에 가장 걸림돌이 되는 것이 뭘까요? 역시 귀차니즘이겠죠ㅋ

이젠 S/W 개발에 불편함이 없으니, 더 편하게 쓰는 쪽으로 나가봅니다.

흩어져 있던 기존 프로그램들을 개선하느니, 걍 M 파일매니저에 다 때려넣는거죠 ㅎ.ㅎ



8.1 MP3 플레이어 통합


기존 MPXP 프로그램은 파일명을 커맨드라인으로 받아서 처리합니다.

별도의 UI 없이 ESC를 누르면 종료하는 식이었죠.

이 MPXP를 M 파일매니저에 통합해서, 백그라운드 재생을 해보아요~


MP3, WMA 등의 음악을 들으면서, 디렉토리 브라우징을 할 수 있게되니 좋네요 ㅎ.ㅎ

듣고싶은 파일들을 선택해서 연속재생까지 해놓으니 손도 편해졌구요.



8.2 IMS 플레이어 통합


MPXP처럼 IMSP 프로그램도 M에서 백그라운드 재생으로 해보아요~

MP3 재생 시에는 파일을 읽어서 바로 디코더(MPX 카트리지)로 전달하면 끝입니다만...

IMS는 파일 전체를 메모리에 로딩 후 처리합니다. 대부분 파일이 128KB 이하니까 크게 부담은 안되겠죠?

혹시 이게 부담되는 환경이라면, 아마 기존 M, IMSP를 실행하는 것도 힘드셨을테니 어차피 상관없을 듯요ㅋ


M에 IMSP를 통합해서 백그라운드 처리로 구현해보니, Z80에서는 조금 부담이 되네요.

최대한 인라인 어셈으로 때워서 막아봅니다.

.

.

혹시 GT가 필요하시면 지금이라도 일옥으로 달리세요! ㅎ.ㅎ



8.3 M LITE 버전


시간이 흐르니 MSX2/2+에서도 M을 쓰시는 분들이 조금씩 늘어나더라구요.

그.래.서. 결국 그래픽과 메모리 사용량을 줄인 M LITE 버전을 만들게 됩니다.


넌인터레이스 그래픽으로 처리하면 화면처리 속도가 2배 넘게 빨라지니까, MSX2/2+에서도 쾌적합니다요.

물론 turboR에서는 겁나 빠른 속도로...ㅎ


참고로, 2013년 초에는 M 기본 버전과 LITE 버전의 실행파일을 따로 릴리스했습니다만,

이제는 M 실행파일 하나로 통합되어있습니다. 메모리 용량이 모자라면 자동으로 LITE모드로 전환합니다.


M.INI 파일에서 넌인터레이스 설정으로 바꿀 수도 있으니, 인터레이스 출력이 안좋은 모니터에서도 도움이 되겠습니다.

그리고, M에 내장된 영문폰트가 맘에 안들면, 외부 폰트를 로딩할 수도 있으니 참고하시고~



9. KS X 1001


80년대 대우 MSX2에서는 조합형 한글이 사용되었습니다.

현재 M 파일매니저에서도 한글 출력을 위해 844 조합형 폰트를 사용합니다만,

한글 코드는 조합형, 완성형 모두 지원이 됩니다.


한글 윈95 시절부터는 폴더, 파일명에 MS CP949가 기본으로 사용되고, 긴파일명(LFN)에서는 유니코드가 쓰입니다.

폴더이름이 한글로 되어있으면, 윈도와 MSX의 M 파일매니저에도 똑같이 볼 수 있으니 편하죠.


근데, M에 IMSP, MP3 플레이어를 넣다보니... 한글 외 특수문자 또는 한자를 표시해야되는 경우가 종종 생기더라구요.

한글은 조합형 폰트가 12KB 정도라서, 프로그램에 넣어도 부담이 없는데요.

KS X 1001 (KS C 5601)의 특수문자(37KB)와 한자(153KB)를 모두 넣으면 용량이 꽤 됩니다.


어떻게 할까 고민을 해보니...

폰트는 램상주로 올려놓고, 여러 프로그램들이 공용으로 사용하면 괜찮을 것 같더라구요.

아무래도 파일이 크니까, 부팅할 때 한번만 로딩하는 편이 좋겠죠? ㅎ.ㅎ

일단 텍스트뷰어(HV)와 M 파일매니저는 해결이 되겠고... 추후 DOS2용 게임을 만들 때도 활용을?!


그렇게 램상주 폰트가 만들어지게 되었습니다 ㅎ.ㅎ



9.1 램상주 폰트 로더


특수문자 로더인 KS_SPE 프로그램입니다.

https://sharksym.blogspot.com/2014/10/ksspe-v10-ks5601.html


한자 로더인 KS_HANJA 프로그램입니다.

https://sharksym.blogspot.com/2014/10/kshanja-v10-ks5601.html



9.2 램상주 폰트... 이대로 좋은가?


특수문자와 한자표시를 할 수 있어서 좋은데, 약간의 애로사항이 있네요.

부팅 시 매번 폰트를 로딩하는 시간이 걸린다는 것과, 여전히 메모리 점유의 부담이죠.

저야 뭐 1MB의 GT라서 걱정 NoNo입니다만...

반년정도 상황을 지켜보니, 저 외엔 폰트로더를 쓰시는 분이 한명도 없더라구요 ㅎ.ㅎ;


MSX에서 MP3나 IMS를 듣는 사람이 별로 없으니...

M, HV에 내장된 한글지원 정도면 충분하다고 생각하시는 거겠죠? ㅎ.ㅎ



10. 한글 폰트팩(FontPack V1)을 만들어보자.


부담없이 한글/한자를 쓸 수 있도록 H/W의 도움을 받아보도록 합시다.

자세한 내용은 아래 블로그 글들을 보셔도 되겠습니다.

https://sharksym.blogspot.com/search/label/_FontPack



10.1 폰트롬 I/O


Kanji 폰트처럼, I/O 포트를 사용합니다.

전체 용량은 2MB입니다. 유저 폰트를 128KB SRAM에 로딩할 수도 있습니다.

자작 프로그램에서 런타임으로 폰트를 변경하는 등으로 활용할 수 있겠네요.


폰트팩의 폰트롬은 Kanji 폰트처럼 1bit의 데이터로 저장됩니다.

대신 스크린6의 2BPP 컬러, 스크린5,7의 4BPP 컬러 변환 기능을 H/W로 넣어보아요~


MSX1의 패턴맵 그래픽은 1BPP로 된 폰트를 읽어서 바로 쓰면 되지만,

MSX2의 비트맵 그래픽은 2BPP, 4BPP, 8BPP입니다.

화면에 표시하려면 컬러로 계산 후 메모리에 써넣어야하죠.


이걸 폰트 I/O에서 직접 처리하면 편할 것 같더라구요.

Fore Color, Back Color 레지스터만 설정하면, 컬러가 적용된 폰트 데이터를 포트로 읽을 수 있습니다.

이 값을 그냥 VRAM에 써넣으면 OK! ㅎ.ㅎ



10.2 문자 코드는 확장 완성형 (CP949)


1995년 MS에서 윈도95를 만들 때 등장했던 코드입니다. 당시에는 논란이 많았던 코드죠?ㅋ

완성형 한글(KS C 5601)에 빠져있던 한글을 몽땅 때려박은...ㄷㄷ


20여년이 지났지만, 지금도 윈도의 파일 시스템에서 기본으로 쓰이는 한글입니다.

폰트롬은 이 코드영역의 문자를 그대로 넣습니다.

S/W에서 상호간 코드 변환(한글 조합, 유니코드 등)을 빠르게 할 수 있도록, 코드변환 I/O도 넣어줍니다.


윈도의 긴파일명(LFN) 또는 MP3 ID3v2의 유니코드를 표시할 때, 코드변환기를 활용하면 좋겠죠? ㅎ.ㅎ

M 파일매니저에서 LFN 표시가 지원된건 2022년이라는 게 함정이네요. (폰트팩 개발된지 7년이 지난ㅋ)



10.3 폰트의 픽셀사이즈는 16 x 16 및 12 x 12


고해상도 모드(가로 512픽셀)에서는 가로폭 16픽셀 폰트로는 64컬럼밖에 구현하지 못합니다.

12픽셀 폰트를 쓰면 85컬럼까지 가능합니다. 저해상도 모드에서도 40컬럼도 가능하겠구요.

이정도면 실사용에서는 충분할 것 같네요.



10.4 문자 출력용 DEVICE


그래픽 모드에서는 GRP라는 DEVICE를 사용합니다.

국딩 때 BASIC 좀 써보셨으면, OPEN"GRP:"AS#1 명령은 달달 외우셨겠죠? ㅎ.ㅎ


폰트팩에서는 FNP라는 DEVICE가 추가됩니다.

본체의 GRP DEVICE와 함께, OPEN"FNP:"AS#2으로 폰트팩 디바이스도 사용가능합니다.

일제 기종에서 일어와 폰트팩 한글을 동시에 출력할 수도 있다는 얘기죠.

대우 X-II에서는 본체의 명조체 한글과 폰트팩의 한글을 동시에 쓸 수 있겠구요.


80년대 만들어졌던 BASIC 프로그램들의 GRP 디바이스명을 FNP로 바꾸면,

폰트팩의 한글로 쉽게 대체할 수 있습니다.

일제 기종에서 아이큐교실 프로그램을 이렇게 구동할 수 있어요.





10.5 한글 IME


한글 출력을 H/W로 넣었으니, 한글 입력기도 S/W로 넣어봅니다.

2바이트 조합형과 CP949 모두 지원됩니다.

폰트팩이 없는 대우 MSX2용 한글 프로그램을 만들 때는 조합형으로 입력해야겠죠? ㅎ.ㅎ


IME 설정은 BASIC, DOS 모두 가능합니다요.

M에서 파일명 바꿀 때에도 한글을 입력할 수 있구요.



10.6 ANSI 스크린


BASIC 및 DOS등에서 활용가능한 ANSI 출력모드입니다.

조합형 한글, 완성형(CP949) 한글의 전환이 가능합니다.

초기에는 인터레이스 모드만 있었지만, 나중에는 넌인터레이스 모드도 추가되었습니다.

그래도 고해상도 모드(가로폭 512픽셀)라서 RGB 모니터가 아니라면 글씨를 읽기 힘들겠네요.




.

.

.


이렇게 램상주 폰트의 말로는 폰트팩의 탄생으로 연결되었습니다.

HV, M에서는 램상주 폰트를 지원하니까 에뮬 등에서 활용하시려면 한번 써보셔요.

(에뮬에서는 폰트팩을 지원안하니까요ㅋ)


2012년 ~ 2015년 사이의 작업들이었습니다.


긴 글 읽어주셔서 감사합니다요~ ㅎ.ㅎ