메모리 위를 걷다 – 슈퍼 마리오 랜드 2

레트로 게임의 작동원리를 어셈블리어 수준까지 자세하면서도 이해하기 쉽게 가시화해서 설명해주는 유튜브채널 Retro Game Mechanics Explained의 영상. 게임보이 슈퍼 마리오 랜드 2에는 특정 조건을 만족시키면 발생하는 버그가 있는데, 이 버그를 쓰면 램과 카트리지 롬이 그대로 맵 타일로 등장하고 심지어 수정할 수도 있게 되어서 이를 이용해 게임을 클리어하게 만들 수 있다.

슈퍼 마리오 랜드 2의 초기 버젼은 파이프에 들어가는 도중 스테이지를 나오게 되면 (공격을 받아 죽거나, 혹은 이미 클리어한 스테이지라면 스타트+셀렉트로 스테이지를 그만두면) 다른 스테이지를 시작할 때 마리오가 아까 그 파이프의 아래 방향으로 떨어지게 된다. 만약 파이프 아래쪽에 다른 타일이 없다면 마리오는 계속 아래로 떨어지게 되는데, 어디까지 떨어지게 되는걸까?

게임보이의 16비트 메모리는 위 그림과 같이 할당되어있다. 위부터 차례대로:

  • 절반인 32kb는 롬 이미지. 16kb는 롬의 뱅크 0, 16kb는 롬의 다른 뱅크 중 하나이다. 이 구조를 통해 카트리지 롬의 용량이 32kb를 넘는 것이 가능하게 됨
  • 8kb의 비디오 램
  • 8kb의 확장 램. 카트리지의 내용을 불러온다. 게임을 끄고 카트리지를 빼도 그 내용이 남게 됨
  • 8kb의 작업 램
  • 7.5kb의 에코 램. 위의 작업 램의 첫 7.5kb를 복붙하는데, 나중에 다른 용도로 쓸 수도 있도록 남겨둔 부분이다
  • 160바이트의 Object Attribute Memory. 백그라운드의 위쪽에 어떤 오브젝트를 표시할 것인지를 지정
  • 96바이트의 공백
  • 128바이트의 콘솔 하드웨어 레지스터
  • 127바이트의 하이 램
  • 1바이트의 프로세스 인터럽트 스위치

슈퍼 마리오 랜드 2의 경우, 확장 램의 절반은 세이브 파일이나 음악 등 보통 작업 램에있을 내용들이 할당되고 나머지 절반은 그 아래의 작업 램과 합쳐져 총 12kb의 레벨 데이터에 쓰인다. 그 아래의 에코 램은 이 맵의 약 2/3가 카피되어 나타나게 된다. 그래서 레벨의 맵 타일 수는 12288=256*48개로 한정되고, 게임보이 메모리에 그대로 매핑되어 각각의 바이트가 레벨의 타일 하나에 대응된다. 메모리에 있는 내용을 그대로 해당되는 타일로 변환해 스테이지가 표시되는데, 여기서 앞서 언급한 파이프 버그를 쓰면 레벨 데이터에 할당된 영역을 벗어나 위쪽의 다른 메모리로 이동할 수 있게 된다. ($FF00-$FFFF 줄 아래로 넘어가면 다시 $0000-$00FF가 등장함) 참고로 메모리의 값이 변경돼도 실시간으로 화면에 해당되는 타일이 바뀌지 않는데, 마리오가 그 위로 도착한다든지 등 상호작용을 하게 되면 그 때 해당 어드레스의 값이 반영된다. (영상에서는 실시간으로 반영된다면 어떻게 보여질지도 다룬다)

골때리는 부분은 마리오가 단순히 이 메모리를 탐험만 할 수 있는게 아니라 게임에서 할 수 있는 액션(블록을 부순다든가)을 통해 그 값을 바꾸는 것까지 가능하다는 것. 값 $00에 해당하는 타일은 벽돌 블록이고, 이 블록을 부수면 빈 공간에 해당하는 값 $60으로 바뀌게 된다. 이 레벨 데이터 외부의 부분은 의도치 않은 공간이기 때문에 예상치 못한 일들이 일어나고 어쩔 땐 게임이 뻗어버리기도 한다.

어드레스 $A2D5에는 디버그 플래그가 할당되고, 이 값을 바꾸면 엔딩 시퀀스로 직행할 수 있다. 이 어드레스에 해당하는 값이 $00에서 바뀌면 엔딩 시퀀스를 불러오는데, 이 말은 곧 $A2D5 타일을 찾아 부수면 값이 $60으로 바뀌고 이 상태에서 스테이지를 나가면 강제로 엔딩을 볼 수 있는 것.

그래서 이 버그를 이용해 어떻게 $A2D5로 빠르게 가야하는지가 슈퍼 마리오 랜드 2의 Any% 타임어택의 관건이 된다. 중간에 등장하는 파이프 블록을 잘 이용해서 부술 수 없는 블록 아래로 이동해야 하고, 또한 쓸데없는 블록을 건드려서 게임이 뻗지 않도록 신경을 써야한다.

Source: https://www.speedrun.com/sml2#Any

현재 RTA 기록은 Oh_DeeR의 2분 42.9초. 참고로 이 버그를 안 쓰는 Any% Glichless 기록은 같은 사람의 26분 27.6초이다.

트윗 타래를 정리. (2018/07/19)


메모리 위를 걷다 – 슈퍼 마리오 랜드 2”의 1개의 생각

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중