2015년 9월 18일 금요일

MMC/SD Drive V3 제작 #2 - 전송 속도를 올려보자

구상한 것들을 대강(?) 테스트 할 수 있도록, 보드를 하나 준비했습니다.


아래처럼 생겼습니다요.

어라... 어디서 본 것 같다구요? 에이... 설마요 ㅎ.ㅎㅋ




SD 카드 소켓 근처의 넙쩍한 부품은 OSC(오실레이터)입니다.

책상에 굴러다니는 48MHz 짜리 하나 붙였어요. FULL size type이라 꽤 큽니다. ㄷㄷ

최종 보드에는 작은 걸(SMD type)로 달아줄 생각입니다.


기존 v2 기기에서는 OSC가 따로 없고, MSX 슬롯의 CPU CLOCK을 사용하였지요.

일반 MSX2 및 터보알에서는 3.58MHz 고정이구요.

OCM 고속모드 또는 WSX의 5.37MHz 터보 모드에서는 좀 더 빠르게 동작했습니다.

이번 v3에서는 그냥 외부 OSC 48MHz 고정된 동작 클럭을 사용하게 됩니다.


SD 카드 인터페이스는 SPI를 사용합니다. 기존 v2랑 동일합니다.

4BIT SD 모드를 쓸까 잠시 고민했었는데요.

CRC 로직도 넣어야하고, CMD용 1BIT, DATA용 4BIT 모두 만들려면 귀찮겠더라구요. 깨끗하게 포기 ㅋ

대신 SPI SCLK 클럭을 올리면, 쉽게 고속 전송을 구현할 수 있습니다.


SD카드 스펙 상으로는 25MHz 까지는 기본 지원이라 MSX에서는 충분하다고 생각되네요.

48MHz OSC를 2분주한 24MHz가 실제 v3 SPI SCLK 속도가 되겠습니다.


제대로 만드는 것 보다, 일단 동작 테스트부터 해보는게 재밌겠죠? ㅎ.ㅎㅋ 

이번에는 MBR 파티션 테이블을 지원합니다.

간단하게 2GB SD카드에 32MB 파티션 하나 넣고 돌려보았습니다.


아래는 DOSSCAN 프로그램으로 전송속도 측정한 모습입니다.


Z80 모드에서 151KB/sec가 나오네요.

기존 v2가 132KB/sec 정도니까 약 15% 정도는 빠른 셈이군요.



아래는 R800 DRAM 터보모드에서 테스트한 것입니다.

참고로 디스크 액세스 시, Z80 모드로 전환되지 않도록 미리 패치한 상태입니다. (R800-DR 툴 사용)


307KB/sec 나오네요. 기존 v2는 238KB/sec 였습니다.

디스크 루틴이 외부 슬롯에서 구동되는 상황인데도, 의외로 꽤 빨라지네요.

사실 이건 예상 못했습니다.



아래 사진이 중요합니다. ㅎ.ㅎ

v3에서 빨라진 SPI 인터페이스를 제대로 활용하기 위해서는, 디스크 액세스 루틴을 더 빠르게 돌릴 방법이 필요한데요.

터보알에서는 이게 가능합니다.

외부 슬롯은 3.58MHz로 느리게 동작하지만(호환성 목적), 내장 메모리에서는 7.16MHz로 두배 빠르게 동작합니다.

R800의 빠른 머신 싸이클을 그대로 쓸 수 있습니다.

(외부 슬롯에서는 3.58MHz에 동기하느라 불필요한 wait가 들어가게됩니다.)



무려 518KB/sec가 나오네요. 기존 v2의 238KB/sec 비하면 두배 이상 빠른 속도네요.

op code fetch만 내부램으로 바뀐 것 뿐인데... 흐..ㅋ

참고로, 실제 코드 상으로는 디스크 루틴 LDIR 명령 하나만 램으로 옮겨져있습니다.

나중에 전체적인 최적화를 하게되면 얼마나 빨라질지 상당히 기대됩니다요~


오늘은 여기까지입니다.

다음편을 기대해주셔요~ ㅎ.ㅎ

2015년 9월 2일 수요일

MMC/SD Drive V3 제작 #1 - 구상

MMC/SD Drive를 처음 만든게 2004년 여름이니까, 이제 11년쯤 지났네요.

한동안 잘 쓰고 있었지만, 이제 새 버전이 나와야할 시대가 온 것 같네요. 넘 늦었나요? ㅎ.ㅎ;


MMC/SD Drive 역사(?)를 되짚어보면...ㅋ

2004년 - V1 개발 (2DD DSK 이미지 에뮬)

2007년 - V2 개발 (속도 증가)

2008년 - V2.2 개발 (DOS2 커널 포함, FAT16 지원)

2009년 - 멀티롬 구현 및 DISKMAN 파티션 재설계

2012년 - 멀티롬-II 구현

2015년 - V3 ??


MMC/SD Drive V3에서는 기능이 약간 바뀔 예정입니다.

- DOS1 지원 제거

- SCC 칩 제거 (사운드 기능 없음)

- DISKMAN 파티션 방식의 2DD 에뮬 제거 (새로운 2DD 에뮬로 대체)

- 멀티롬 및 멀티미디어(동영상/PCM) 기능 제거

- SDHC 카드 지원 (MicroSD 슬롯 1개)

- MBR 파티션 지원

- turboR 전용 고속 전송 루틴 추가


기존 V2.2는 이것저것 기능이 복잡했지만, V3는 디스크 관련 기능만 넣으려고 합니다.

사용법은 기존보다 간단해서 쉬워질거라 예상합니다요~


PS. 기능 관련으로 의견있으시면, 덧글 달아주세요~!!


2015년 8월 23일 일요일

FontPack 제작 #6 - ANSI 스크린

FontPack....

M, HV 프로그램 외에는 활용하는 프로그램이 없어서 심심하셨죠? 아니라구요? 음... ㅎ.ㅎㅋ


이번에는 ANSI escape 코드를 지원하는 스크린 드라이버를 구현해봅시다.

참고로 ANSI 코드(ANSI escape sequences)는 아래 링크에서 확인할 수 있습니다.

궁금하신 분을 클릭하셔요.

http://ascii-table.com/ansi-escape-sequences.php


대강 요렇게 구현되겠습니다.

- 스크린7(VDP G6), 인터레이스 모드

- CP949 코드, 6x12(영문), 12x12(한글) 폰트

- 화면 사이즈는 85컬럼 35라인

- MSX-DOS 모드 지원 (스크린7)


아래는 보너스 모드입니다.

- 스크린6(VDP G5), 인터레이스 모드

- CP949 및 조합 코드, 8x16(영문), 16x16(한글) 폰트

- 화면 사이즈는 64컬럼 24라인

- MSX-DOS 및 BASIC 텍스트 모드 지원 (Fake 스크린0)


문자 입출력 관련 Hook으로 구현되기 때문에 호환성 문제가 생길 수 있습니다.

따라서, 기본으로 OFF 상태로 부팅하도록 합니다.

ANSI 스크린 설정은, 아래처럼 DOS 용 프로그램 또는 BASIC의 CALL 명령을 사용합니다.



아래는 실제로 구현/동작하는 영상입니다.

아직 ANSI 코드, BASIC 지원이 100% 완료된 상태는 아니구요, 기본 기능 몇가지만 구현된 상태입니다. 참고하셔요~