2016년 9월 9일 금요일

MMC/SD Drive V3 제작 #10 - 테입 로딩을 해보자

MSX로 카세트 테입으로 게임 해보셨죠?

어린시절 기억이겠지만요~ ㅎ.ㅎ

저는 국딩 때, 테입 게임이 열몇개 정도 있었어요.

나중에 쓸모가 없어져서, 아마 고딩 때였던 것 같네요, 다 내다버렸었지요.

한 두개는 기념품으로 남겼어야하는데...바보같이 ㅜ.ㅜ

보람소프트 테입이 보고싶군요~


그래서!! 이번엔~~

MMC/SD V3로 테입으로 된 게임실행에 도전해봤습니다.

사실 지난 4월 정모에 우유속의소주님이셨나요?

테입 게임은 지원 안되냐고 하셔서리, 한번 해봤어요. ㅎ.ㅎ



아래 내용을 구현하면 되겠네요.

1. MMCSD.COM 유틸로 CAS 파일을 MegaRAM으로 로딩

2. BIOS TAPIxx 루틴을 MegaRAM의 CAS 데이터를 쓰도록 구현

3. 이상한 게임들은 테입 루틴을 직접 패치



구현에 앞서, 기존 테입 게임들이 어떤 구조로 되어있는지 분석이 필요하겠습니다.

크게 나누면 두 종류의 게임이 있어요.


1. 처음부터 MSX 용으로 만든 게임

  - MSX 롬팩이었던 16KB/32KB 게임을 덤프한 해적판 테입

  - MSX 테입 전용 게임 (ZARTH 등)


  얘들은 MSX 표준 환경에 맞춰서 돌아갑니다.

  특별한 문제가 없다면 저장매체를 바꾸는건 별 문제가 되지 않아요.


2. 타 기종의 S/W를 포팅한 게임

  이부분은 확실하진 않지만...

  대부분 ZX 스펙트럼 게임을, MSX에서 구동되도록 VDP 부분을 수정한 것으로 생각됩니다.

  그래픽 구현이 ZX 스펙트럼이랑 똑같아요. 스프라이트 없는 8x8 단색 패턴 -_-

  ZX 스펙트럼 쪽은 VRAM이 CPU 메모리맵 I/O로 직결되는걸로 아는데,

  이걸 MSX VDP쪽으로 옮기면 포트 I/O가 되어서 속도가 상당히 떨어지게됩니다.

  그 때문인지 이런 게임들은 실행해보면 많이 느릿느릿 하더라구요.



일단 MSX BIOS의 TAPIxx 루틴들을 변경해야, 기존 테입루틴 대신 MMC/SD의 메가램을 쓸수 있는데요.

아시다시피 MSX의 하위 디바이스 I/O 루틴은 훅이 없습니다.

결론부터 얘기하면 별도의 H/W 도움없이는 힘들다는 얘기죠.

하지만 MMC/SD V3는 MSX 슬롯처럼 16KB 페이지의 뱅킹으로 메가램을 구동할 수 있습니다.

사실 이부분이 예전 MMC/SD V1/V2에서는 지원이 안되던거였죠. (SCC 매퍼로는 못 만듭니다.)


암튼 가짜 BIOS를 구동해서 테입을 실행해봤습니다.

롬팩 덤프한 파일들은 귀찮아서 안돌려봤구요. 안될 이유가 없으니~ㅋ

일단 ZARTH랑 잡다 소용량 게임들 돌려봤습니다.

잘 되군요! 오호~ ㅎ.ㅎ (사진은 없어요 ㅋ)


MSX의 BIOS/WORKAREA/HOOK 이런 표준이 참 좋은 구조같아요.

이리저리 코드가 많이 구동되어서 속도가 떨어지는 단점은 있지만,

지금 21세기에 이런저런 기능들을 추가해서 돌리는게 얼마나 큰 장점인지...

옛날 사람들 존경합니다! ㅎ.ㅎb

언젠가 만나게 되면, 코리안 떡볶기를 대접해드리는걸로~ ㅎ.ㅎ



그럼 본격적으로 유럽에서 유통되던 게임들을 돌려봐야겠지요.


1차 시도는 After Burner로 정했습니다.

일단 한번 실행해볼까요?

아래는 터보알에서 MMC/SD로 구현한 TAPIxx 바이오스로 구동한 모습입니다.

BASIC에서 BLOAD까지는 당연히 잘 됩니다요!





문제는 그 다음인데, 바로 먹통이네요. 으어~~

디버깅하려면 윈도의 영원한 친구 blueMSX가 필수죠! ㅋ


대충 살펴보니 가관이네요 ㅜ.ㅜ

확실히 "난 MSX게임이 아니야"라고 아우성치는 듯 합니다.

Page3의 WORKAREA 다 날리고 시작하네요.

BIOS의 ENASLT, CALSLT 이런 것 다 필요없습니다.

그냥 포트 A8H 출력으로 슬롯 바꾸고, CALL xxxx 이렇게 다이렉트로 돌아가네요.

게다가 스택을 Page1이랑 Page3 번갈아서 씁니다.

어허허... MMC/SD를 Page2에 매핑해야하나...


blueMSX만 뚫어져라 보니, 완전 방법이 없는건 아니더라구요.

메모리 마지막 부분 수십 바이트는 안쓰고 있군요. ㅎ.ㅎ

ZX 스펙트럼이 이쪽에 IO가 있나... 확인해보진 않아서 잘 몰겠지만요.

암튼 이쪽으로 코드를 우회해서 돌아가도록 해봤습니다.


결과는?

.

.

.

체크썸 에러! ㅋ

아~~ 데이터를 조금 바꿨는데, 이걸 로더가 체크썸으로 확인하는군요.

역시 테입 로딩과 헤더 조절 드라이버는 절친인 걸로~ ㅎ.ㅎ


체크썸 루틴도 마저 패치했습니다.

다시 구동!!


결과는? 아래 사진이 증거가 되겠습니다요.




오~~~ 돌아가네요.

한판 끝나면, 테입을 REWIND 해달라고 띄우네요. ㅎ.ㅎ;;

이건 게임 많이 하지말라는 얘기겠죠? 하루에 한판만? ㅋ

뭐, 이건 나중에 구현하는걸로 약속하고 다른 게임으로 넘어갑니다.



2차 시도는 PAC MANIA입니다.

며칠전에 게시판에서 본 기억도 나고해서리... 도전해봅니다.

요건 유럽 아저씨들이 남코 라이선스 받아서 만든거네요.

회사 이름이 GRANDSLAM ㄷㄷㄷ


윈도 에뮬로는 잘 돌아가는거라, 바로 터보알로 구동!

.

.

.

안되네요. 얘들도 이상한 구조로 되어있나봅니다.

blueMSX 출동!!

아... 얘도 "난 MSX 출신이 아님"이라고 외치고 있습니다.

스택을 Page1에서 돌리는 경우도 있네요.

문제는 테입에서 데이터 로딩하는데, 메모리 FFFEH 까지 덮어씁니다.

애프터버너는 양반이었네요. ㅎ.ㅎ;;;


음... 자세히 보니, 다행하게도 메모리 끝부분은 게임에서 쓰는 데이터가 아닌걸로 보입니다.

일단 데이터 잘라내고 돌려봅니다.


결과는?

흐흐... 돌아가네요.

참고로 이 게임은 터보알 고속모드에서 쾌적하게 돌아갑니다. 마치 이게 원래 속도라는 듯이요~



게임 두개 분석하는 것도 시간이 꽤 걸리네요.

그나마 다행인건 다른 게임도 좀 봤더니, 구조가 비슷해보였습니다.

안돌아가는 애들은 심심할 때 하나씩 분석하면 재밌을 듯 하네요.

.

.

.

라고는 하지만 연말에 paraMSX-R을 만들면 그냥 구동될게 뻔하니... 시간을 아끼도록 하겠습니다. ㅎ.ㅎ


그리고 한가지 테입 로딩을 편하게 할 수 있도록,

BASIC으로 전환 후, RUN"CAS:", CLOAD + RUN, BLOAD"CAS:",R 을 자동으로 실행합니다.

이 테입을 어케 로딩하더라? 기억할 필요없습니다. 그냥 M에서 리턴키 한방으로 끝! ㅎ.ㅎb


백문이 불여일견이죠?

테입 게임 구동하는 모습을 영상으로 담았습니다.





그럼, 즐거운 불금되셔요!


2016년 8월 31일 수요일

FS-A1GT RAM 1024KB 확장하기

파나소닉 A1GT는 메인램이 512KB입니다.

이걸 두배로~ 1024KB로 개조하는 내용입니다.


저의 A1GT는 2004년 쯤에 램 1024KB 확장해서 지금까지 쓰고 있습니다.

개조하기 앞서, 아래 내용을 꼭 알고 계셔야합니다.


1. A1ST와는 달리, A1GT는 보드 H/W적으로 쉽게 1024KB 증설이 가능하다.

2. A1GT의 메모리 매퍼 레지스터 출력은 6BIT로 16KB x 64 (1024KB)까지 동작한다.

3. A1GT의 메모리 매퍼 레지스터 입력은 5BIT로 16KB x 32 (512KB)까지 동작한다. 


DOS1 시절에 만들어진 프로그램 등의 일부 S/W에서는,

매퍼 레지스터를 읽어서 메인 메모리 용량을 확인하는 경우가 있습니다.

이건 MSX 표준에서는 금지된 것이지만, 대부분의 MSX2 이상의 본체들은 레지스터 읽기를 지원합니다.

이 때문에 기존 A1GT 512KB 상태에서는 동작하던 S/W가 A1GT 램 1024KB 확장 후 동작안되는 경우도 발생합니다.

이 경우, 매퍼 레지스터의 5번 BIT를 별도 H/W로 구현하면 될거라 예상하지만, 실제 테스트해보진 않았습니다.

참고하세요!



그럼 개조 방법 설명입니다.


1. 보드 전면(앞면)

  

- R800 아래 위치한 J302 점퍼를 연결(납땜으로 떡칠!)합니다.


- 기존 DRAM LH64256 칩 4개를 제거합니다.

  저는 기존 DRAM을 제거하지 않고 R373, R372를 분리했습니다.


- DRAM GM71C440 두개를 추가합니다.

  각 칩의 CAS는 보드에 납땜하지 않고 별도의 선으로 서로 연결합니다.

  연결된 CAS는 R373 출력과 연결합니다.


아래는 작업된 보드의 사진입니다.







2. 보드 후면(뒷면)


- R370 저항을 제거합니다. 저는 살짝 때서 옆에 붙여놨어요. (도망 금지~)


- R352의 저항을 때서, R353에 붙여줍니다. 저항을 옮기는거에요.


아래는 작업된 보드의 사진입니다.







여기까지 되면, 부팅 시 1024KB 램 확인할 수 있습니다.

램이 부족한(?) GT를 좀 더 여유롭게 만드시려면 한번 도전해보세요.

사실 별로 어렵지 않습니다만, 보드를 뒷면(등짝!)을 봐야해서 좀 귀찮아요. ㅎ.ㅎ


-끝-


PS. 첨부된 파일은 일본 유저가 만든 램확장 문서입니다. ST/GT 내용 모두 있어요.

Download: FS-A1STGT_1MB_RAM_expansion_(JP).zip


2016년 8월 24일 수요일

PAC-V 제작 #7 - IMSP/MPXP에서 LED 구동

일단 사진 한장 올라갑니요~ ㅎ.ㅎ

M에서 MP3 재생하는 모습이네요.




PAC-V는 본체에서 YM2413(OPLL) 칩을 액세스 하는 순간을 캡쳐해서 LED를 구동합니다.

아래는 OPLL 칩의 레지스터인데요, PAC-V에서 사용하는 부분은 빨간색으로 표시했습니다.




예를 들어, 게임에서 OPLL 채널 0번으로 소리를 낸다면,

30H 레지스터의 악기/볼륨 세팅 후 20H 레지스터의 Key ON을 설정하게 되겠죠?

그러면, PAC-V는 여기에 맞춰, 볼륨 설정에 따르는 LED 출력을 시작하게 됩니다.


기본적으로, PAC-V의 LED는 OPLL 사운드를 들을 때 동작하지만,

사용자가 임의로 LED를 컨트롤 할 수도 있습니다.


OPLL I/O로 사용되는 포트는 7CH, 7DH 두개인데요.

PAC-V는 해당 포트 외 5CH(7CH 미러), 5DH(7DH 미러) 포트를 사용해도 동작이 됩니다.

그러니까 5CH, 5DH 포트를 사용하면 OPLL 소리를 내지 않고도 PAC-V의 LED를 켤 수 있는거죠~



M에 내장된 IMSP와 MPXP 코드에 PAC-V LED 컨트롤을 넣어봤습니다.

IMS 음악은 원래 11채널이라서, 9채널인 PAC-V로는 마지막 2채널은 표시가 불가능...이라는게 ㅋ

결국 9개 채널의 출력에 따라 출렁이는 LED를 볼 수 있겠습니다요~


MPXP의 경우는 VS1033c 칩의 스펙트럼 애널라이저 플러그인을 사용했구요.

밴드 9개로 설정해서 동작시켰습니다.

참고로 VS1033c은 MPX R1.1 카트리지에 들어있구요. 구버전 MPX R1.0에는 VS1003 칩이 들어있을꺼에요.


아래는 M에 코드 적용 후 구동한 모습입니다.

초반엔 IMS 파일 재생이 나오구요. 후반엔 MP3 재생입니다.




그럼, 즐거운 저녁되셔요~ ㅎ.ㅎ