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 레지스터가 제대로 복구안될테니, 실제 가능한 게임은 몇개 안될지도요...ㅋ)


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


댓글 없음:

댓글 쓰기