2015년 9월 21일 월요일

MMC/SD Drive V3 제작 #3 - 최대 전송 속도??

속도 관련, 숫자 계산을 한번 해봤습니다.

LDI 명령 하나만 수행 했을 때의 시간으로 계산했습니다.


참고로 LDI는 Z80 2바이트로 된 명령인데요.

  HL 주소의 1바이트를 읽어서 DE 주소에 저장 및

  HL, DE 주소값은 1씩 증가,

  BC 카운터는 1 감소

하는 명령어입니다.


실제 프로그램에서 디스크 1섹터(512바이트)를 전송하려면, LDI 명령을 512번 실행하면 되겠지요?


표에서 DOSSCAN 결과는 실제 디스크롬으로 사용 시 값입니다.

Z80 모드일때는 3.58MHz, R800 모드일때는 7.16MHz 클럭입니다. 참고하셔요.




괄호 안의 I-E-I 등의 표시는 메모리 위치가 본체 내부(I) DRAM인지 외부(E) 슬롯인지 나타냅니다.

Op code, Source, Destination 순의 메모리위치입니다.

wait clock 값은 아래 링크 참고하시면 되겠습니다.

http://map.grauw.nl/resources/z80instr.php


#1 값은 외부슬롯 접근시 wait 4클럭 일때구요.

#2 값은 wait 5클럭일 때의 결과잆니다.

delay + BUS 클럭 align 으로 인한 wait값이라 실제 동작 시 어떤 클럭이 맞을지는 알수 없어요. ㅎ.ㅎㅋ


모든 메모리가 내부 DRAM인 경우, 계산치로는 998KB/sec인데,

실제 DOS2 램디스크 테스트 시, 520KB/sec 정도밖에 속도가 안나오네요.

메모리 매퍼 설정(IO port)하느라 느려진게 아닐까 의심됩니다.


그럼, 이만~ ㅎ.ㅎ

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. 기능 관련으로 의견있으시면, 덧글 달아주세요~!!