- NES Tetris의 킬 스크린 충돌이 단순한 게임 종료가 아니라, 수정하지 않은 하드웨어와 카트리지에서 새 동작을 실행하는 진입점으로 활용됨
- 레벨 155 이후 점수 계산이 프레임 사이에 끝나지 않으면 제어 흐름이 깨지고, 게임이 의도치 않은 RAM 위치를 명령처럼 읽는 임의 코드 실행으로 이어질 수 있음
- Famicom의 확장 컨트롤러 포트 입력 RAM이 점프 루틴 위치와 겹쳐, 3·4번 컨트롤러 버튼 입력으로 충돌 뒤 이동할 주소를 조작할 수 있음
- Displaced Gamers는 점프 대상을 하이스코어 테이블로 보내 이름과 점수 데이터를 NES CPU opcode처럼 읽게 하는 개념증명 코드를 공개함
- 입력 가능한 문자와 숫자, 저장 장치 부재 때문에 실용성은 제한적이지만, 충돌 회피 패치나 RAM 전체 제어로 확장될 가능성이 있음
킬 스크린 충돌이 코드 실행으로 바뀌는 과정
- NES Tetris의 충돌은 점수 처리기가 새 점수를 프레임 사이에 계산하는 데 너무 오래 걸릴 때 발생할 수 있음
- 이 상황은 레벨 155 이후에 나타날 수 있음
- 지연이 생기면 제어 코드 일부가 새 프레임 쓰기 루틴에 의해 중단됨
- 이후 게임은 다음 명령을 찾기 위해 의도하지 않은 RAM 위치로 점프함
- 일반적으로 이 예기치 않은 점프는 RAM 앞부분의 쓰레기 데이터를 코드처럼 읽게 만들어 빠른 충돌로 이어짐
- Displaced Gamers의 최근 영상은 NES Tetris가 하이스코어 테이블을 기계어 명령처럼 읽도록 만드는 절차를 공개함
- 비슷한 임의 코드 실행 글리치는 과거 Super Mario World, Paper Mario, The Legend of Zelda: Ocarina of Time에서도 알려진 바 있음
- NES Tetris에 외부 코드를 넣는 기본 방법은 최소 2021년부터 공개적으로 이론화되어 있었고, 커뮤니티 내부에는 RAM 전체 제어 방법도 오래전부터 알려져 있었다고 전해짐
Famicom 입력 처리로 점프 위치 제어
- 이 해킹은 Tetris의 충돌 방식뿐 아니라 Famicom 입력 구조에도 의존함
- 일본판 Famicom은 미국판 NES와 달리 컨트롤러 2개가 본체에 고정 연결되어 있었고, 서드파티 컨트롤러는 전면 확장 포트에 연결할 수 있었음
- Tetris 코드는 이 “추가” 컨트롤러 포트의 입력을 읽음
- 어댑터를 쓰면 표준 NES 컨트롤러 2개를 추가로 연결할 수 있음
- Famicom에는 Bullet-Proof Software의 별도 Tetris 버전이 있었지만, 이 입력 처리 특성은 NES Tetris 코드에서 작동함
- 추가 컨트롤러 입력을 처리하는 RAM 영역은 충돌 시 사용되는 점프 루틴의 메모리 위치와 겹침
- 충돌로 점프 루틴이 중단되면 해당 RAM에는 컨트롤러에서 눌린 버튼을 나타내는 데이터가 들어 있음
- 플레이어는 이 값을 이용해 충돌 뒤 게임 코드가 이동할 위치를 정밀하게 제어할 수 있음
하이스코어 테이블을 실행 코드처럼 읽기
- Displaced Gamers의 점프 제어 방식에는 특정 컨트롤러 입력이 필요함
- 3번 컨트롤러에서
up을 누름 - 4번 컨트롤러에서
right,left,down을 누름 left와right를 동시에 입력하려면 컨트롤러 조작이 필요함
- 3번 컨트롤러에서
- 이 입력은 점프 코드를 게임의 하이스코어 목록 이름과 점수가 저장된 RAM 영역으로 보냄
- B-Type 하이스코어 테이블의 목표 위치에
(G를 넣으면, 게임은 하이스코어 테이블의 다른 영역으로 다시 점프함 - 이후 게임은 이름과 점수를 순차적으로 읽고, Displaced Gamers가 “bare metal” 코드라고 부른 방식으로 NES CPU의 opcode처럼 처리함
개념증명이 보여준 가능성과 한계
- 하이스코어 이름 입력 영역에는 43개 기호만 사용할 수 있고, 점수에는 10개 숫자만 들어갈 수 있음
- 이 제약 때문에 NES에서 가능한 opcode 중 일부만 하이스코어 테이블에 “코딩”할 수 있음
- 제한된 입력만으로도 짧은 개념증명 코드는 가능했음
- 예시 데이터에는
))"-P)라는 이름과 A-Type 2위 점수 8,575가 포함됨 - 이 루틴은 게임 점수의 상위 자릿수 두 개를 0으로 만듦
- 점수 처리 시간을 낮춰 충돌 원인을 줄이지만, 계속 플레이하면 점수는 다시 충돌 “위험 구간”에 도달함
- 예시 데이터에는
- 기본 NES Tetris에는 배터리 백업 저장 장치가 없어, 전원을 켤 때마다 필요한 하이스코어와 복잡한 이름을 직접 만들어야 함
- 하이스코어 테이블 공간도 제한적이어서 Tetris 실제 코드 위에 복잡한 프로그램을 직접 넣기는 어려움
- HydrantDude는 특정 하이스코어 이름과 숫자 조합으로 부트스트래퍼를 만들고, 다시 다른 부트스트래퍼를 만들어 RAM 전체 제어를 얻는 방식이 있다고 씀
충돌 회피를 넘어선 재프로그래밍 가능성
- RAM 전체 제어가 가능해지면 상위권 플레이어가 NES Tetris의 충돌 버그를 패치하도록 게임을 다시 코딩할 수도 있음
- 이 방식은 레벨 255를 넘어가려는 플레이어에게 특히 도움이 될 수 있음
- 레벨 255 이후 게임은 다시 Level 0으로 돌아감
- 같은 원리를 더 확장하면 Super Mario World 스피드러너 사례처럼 Tetris를 Flappy Bird로 바꾸는 식의 변형도 가능함