2012년 4월 23일 월요일

GRUN으로 메가롬 게임도 세이브/로드가 가능할까요?

어제 GRUN v1.1 동작영상 찍으면서 생각해본 것인데요.

메가롬팩 게임도 잘 굴려보면, 상태저장/복구가 가능할 것 같다는 생각이 들었습니다.ㅋ


몇가지 추가로 구현이 필요하지만 MSX1 용 메가롬팩은 가능할 것 같네요.


참고로 MSX2 용 게임은 VRAM 128KB 전체 백업해야되는 문제랑,

VDP 레지스터 몽땅 백업해야 되는 문제가 있어서 불가능 확률 99%입니다.ㅋ


VDP 레지스터의 경우 분명히 게임 내에서는 shadow 레지스터 처럼 램에 백업을 해놓겠지만,

해당 위치를 알수가 없으니 다시 복구가 불가능합니다.

그리고 팔레트 레지스터는 램에 저장안할 확률이 높고요. 


암튼, MSX1용 메가롬팩으로 제한을 합니다.

메가롬은 메모리에서 실행하는게 불가능하니, MMC/SD의 멀티롬 또는 SCC메가플래쉬롬 등이 있어야겠군요.


문제는 메가롬 매퍼 레지스터를 백업하는 방법인데,

이것도 게임롬의 매퍼 처리하는 루틴을 패치하면 가능합니다.

FLASHMAN의 경우 매퍼 패치를 필수로 해야되기 때문에 별로 어려운건 아닙니다.

그러니까 멀티롬으로 실행되는 게임은 일단 다 된다고 보시면 되겠네요.

매퍼 레지스터는 GRUN 처럼 BIOS를 램에 올린후 후반 영역(3F00H ~ 3FFFH 등)을 활용합니다.


이렇게 되면 GRUN같은 DOS용 프로그램으로 겜이 시작되는게 아닌...

MMC/SD의 멀티롬에서 게임 시작하는 방식으로 밖에 구현이 안되겠지요.


결국 MMC/SD BIOS내에 GRUN 의 기능이 기본으로 포함되어야겠구요.

FLASHMAN에서 롬 다운로드할때는,

 GRUN 루틴으로 실행할지, 기존의 롬 BIOS 에서 실행할지 선택해서,

 각각 패치를 적용하면 되겠습니다.


쓰고보니 SCC 메가플래쉬 용으로는 안되겠군요. 흐...

불가능한건 아니지만, 다운로더를 따로 만들어야되겠지요.


근데 MSX1용 메가롬 게임이 꽤되나요? 그라디우스 시리즈 정도밖에 생각나는게 없네요. 으흠... 몽대륙이랑~


2012년 4월 22일 일요일

GRUN v1.1 release



Download: GRUN_v1.1.zip


----------------------------------------------------------------

    Game Runner v1.1 (MSX-DOS2용 게임 로더 2012.04.22)

        By 서영만 (E-mail:sharksym@hitel.net)

----------------------------------------------------------------


* Game Runner (GRUN)


  GRUN은 MSX1용 16KB 또는 32KB의 MSX1 용 롬이미지 로더입니다.

  게임 실행 중 DOS로 복귀가 가능하며,

  게임 속도 조절 및 상태 저장/복구 기능을 지원합니다.



* 요구 사항


  MSX-DOS2가 구동되는 MSX2(VRAM 128KB) 이상의 기종.

  메모리 매퍼 사용하지 않음.



* 사용법


  DOS2 프롬프트에서 아래처럼 입력하면 롬파일이 실행됩니다.

  GRUN filename.rom


  특수키 입력

  ESC : 게임을 강제 종료하고 DOS2로 복귀

  1   : 일시 정지

  0   : 게임 속도를 원래의 60프레임으로 복귀

  2   : 게임 속도를 30프레임으로 낮춤

  3   : 게임 속도를 40프레임으로 낮춤

  4   : 게임 속도를 45프레임으로 낮춤

  5   : 게임 속도를 48프레임으로 낮춤

  6   : 게임 속도를 50프레임으로 낮춤

  7   : 게임 속도를 52프레임으로 낮춤

  F4  : 게임 상태를 저장

  F5  : 게임 상태를 복구



* 마지막으로


  MSX 메인 BIOS를 패치 후 램에서 구동하므로,

  제대로 실행안되는 게임도 있습니다.

  코나미, 남코 등의 게임은 대부분 동작합니다.

 

  GRUN 에서는 turboR의 CPU 모드를 변경하지 않습니다.

  속도가 빨라지는 현상이 생기는 게임은,

   로딩 전에 미리 CPU모드를 Z80으로 변경하세요.


  

2012년 4월 16일 월요일

GRUN - 게임 상태를 세이브/로드 할 수 있다면?

메인 BIOS/BASIC 롬을 램에 복사해서 놀던 시절이 있었습니다.

기억하시나요? ㅎ.ㅎ


MSX 파워업 테크닉 책에서도 내용이 소개됐던걸로 기억합니다.


보통 롬팩 게임을 꽂고 켜게 되면,

메인 BIOS는 각 슬롯을 체크해서 롬SW 존재하는지 확인합니다.

4000H, 4001H 번지에 AB 문자가 들어있는걸로 체크하는데요.

여기서 SW가 발견되면, 해당 슬롯의 INIT 루틴을 실행하도록 되어있어요.


보통 BASIC을 확장하는 롬팩이라면 INIT 루틴 처리 후 BIOS로 다시 복귀되는데,

대부분의 게임은 INIT에서 곧장 메인 게임 루틴으로 가버립니다.


참고로, FDD등이 장착된 경우 대게 슬롯2,3 등에 DISKROM이 존재하는데,

만약 슬롯1에 게임팩이 있으면, DISKROM이 실행안되는 것도 이런 이유때문입니다.


암튼 본론은~ ㅎ.ㅎ

MSX-DOS 상에서 16KB 게임 롬 이미지를 로딩해서 실행하는 경우,

PAGE0을 메인 BIOS 슬롯(SLOT0)으로 전환하는 대신,

BIOS 를 PAGE0 램에 복사해놓으면, 어떻게 될까? 입니다.


결국 메모리는 아래처럼 되겠죠?

PAGE0: 램 (슬롯0의 BIOS 16KB 복제함)

PAGE1: 램 (게임 롬 이미지 16KB 로딩)

PAGE2: 램 (사용 안함)

PAGE3: 램 (Workarea 및 게임에서 사용될 메모리)


만약 게임에서 PAGE0을 슬롯 전환하거나 그러지않는다면, 겜 실행은 평소처럼 잘 되겠죠? ㅋ

실제로 간단한 프로그램을 만들어서 실행해보니, 코나미의 16KB 게임 몇개는 잘 돌아가는군요.

(king's valley랑 road fighter 로 테스트해봤습니다.)



그럼 이제 본론2 입니다. ㅋ

이렇게 해서 게임을 실행하면 뭐가 달라질까요? (물론 겜 실행시, 호환성 낮아지는건 열외로 놓구요..ㅋ)


PAGE0 코드가 BIOS이긴 하지만, 램 상태라서 변경(패치)이 가능합니다.

대부분 게임들은 타이머에 동기해서 움직이도록 구현되어 있기 때문에 H.KEYI 훅이 필수적으로 사용됩니다.

참고로, 게임 실행중에는 VDP의 V-blank 인터럽트만 주로 쓰입니다.


H.KEYI 훅 자체는 게임 실행중에 설정이 되니까, 게임 로더에서 미리 변경하는건 불가능합니다.

근데 훅을 실행하는 메인 BIOS 코드는 변경이 가능합니다. PAGE0이 램이니까요...ㅋ


또 간단한 코드(ㅡ.ㅡ)를 만들어서 테스트해봤습니다.


H.KEYI 훅 실행하기 전에 키보드 입력을 체크해서,

훅 실행을 주기적으로 막도록 해봤습니다.


근데, 훅 실행을 막으면 어떻게 될까요?

게임에서는 60Hz V-blank 인터럽트 때에 매번 호출 되는 줄 알고 있으니...

훅 실행을 안해주면 그대로 게임이 멎게 됩니다. 시간이 안가는거죠.ㅋ


실제 코드는,

0~7  사이 숫자 키 입력을 받아서, 훅을 주기적으로 skip 하도록 했습니다.

예를 들어 2를 눌러주면, 인터럽트 2번 뜰때마다 skip 됩니다.

그러면, H.KEYI 실행 빈도가 1초에 60번이 아닌 30번이 되겠죠?

겜 속도가 절반으로 떨어지게됩니다.


암튼 요렇게 해보니 나름 재미가 있네요. ㅎ.ㅎ



그럼, 좀더 BIOS 확장을 한다면 게임 실행중에 여러가지 기능을 넣을수가 있겠죠?

게임 실행 중 특정 키를 누르면, 메모리 복구하고 다시 DOS로 복귀 한다거나,

스크린 샷을 찍어서 RAM에 담아놓거나 등등 재밌는 걸 할수 있을 것 같네요.


PAGE3의 메모리랑 PC 만 잘 복구할수 있다면,

에뮬레이터 처럼 게임을 순간 저장했다가 복구할수도 있을겁니다.

멀티 태스킹으로 게임을 여러개 돌린다거나 그럴수도 있겠고요.

(물론 VDP랑 PSG 레지스터가 제대로 복구안될테니, 실제 가능한 게임은 몇개 안될지도요...ㅋ)


암튼, 이런 저런 삽질을 해봤습니다. ㅎ.ㅎ