2015년 10월 3일 토요일

프리뷰가 나오는 멀티롬팩을 만들어보아요~

이제 저희 애들이 많이 커서, 지들끼리 MSX 겜도 잘 합니다. ㅎ.ㅎㅋ

MSX 게임팩은 70개쯤 있지만... 좀 더 편하게 쓸 수 있도록 멀티롬팩을 하나 만들었습니다.

애들 수준에 맞는 겜으로 24개를 모아보았어요.


팩에 사진도 한장 프린트해서 붙이고~ 으흐흐..ㅋ

이런 모습입니다! ㅎ.ㅎ




일반 멀티롬팩(합팩)과 차이라면....

게임 선택 메뉴에서 실제 게임샷을 볼 수 있다는 점인데요.

실제 실행하면, 아래처럼 나옵니다.

화면 2/3는 게임 모습이구요. 아래쪽 1/3 화면에 게임 목록이 표시되겠습니다요.




멀티롬팩이야..뭐, 플래쉬롬만 큰거 달면 쉽게 만들수 있겠죠?

지난번 폰트팩 만들다가 남은 보드 재활용해서 쓰도록합니다. 1MB 플래쉬롬 사용할꺼에요.


음... 그럼, 다음 문제는 각 게임의 화면을 캡쳐하는 일인데... 어떻게 하면 쉽게 가능할까요?

80년대에는 좀 힘들었겠지만, 지금은 21세기가 아닙니까요? 걍 에뮬레이터로 갑니다~ ㅋ


paraMSX를 이용하면 VDP 레지스터와 VRAM 내용을 그대로 덤프할 수 있습니다.

아래 스크린샷 참고하셔요.




VDP 레지스터 설정만 알면, 필요한 데이터들을 추출할 수 있겠지요?

걍 윈도용 프로그램하나 만들어서 돌립니다~




패턴 네임, 패턴 제너레이터, 컬러 테이블의 메모리 영역을 확인해서,

스크린2 화면의 상단 2/3 영역을 파일로 뽑습니다.


아래 스크린 샷 참고하셔요.

VRAM0.BIN -> 패턴 네임 데이터

VRAM1.BIN -> 패턴 제너레이터 데이터

VRAM2.BIN -> 컬러 테이블 데이터




전체 24개의 게임들의 스크린샷을 추출하면, OK!!

이제 남은 건, 실제 MSX에서 구동될 런처 프로그램이네요.


화면 출력용 ASCII 폰트 하나 집어넣고, (왠지 BIOS 내장 폰트 쓰면 좀 누추해 보일까봐서요..ㅎ.ㅎ;;)

키 또는 조이스틱 입력받아서 선택/실행할 수 있도록 간단하게 만들었습니다.


실제 구동한 모습은 동영상으로 보여드립니다.

국딩 때, 학교 PC실에서 친구랑 트윈비 많이 했었는데... 이제 저희 애들이 겜하는 모습을 보니 감회가 새롭네요~




그럼, 즐거운 주말 되셔요~ ㅎ.ㅎ


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 명령 하나만 램으로 옮겨져있습니다.

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


오늘은 여기까지입니다.

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