롬 해킹 기초
이 블로그의 한글패치(슈퍼 마리오 RPG, 드래곤볼 Z 초오공전 돌격편, 드래곤볼 Z 초오공전 각성편, 제절초)를 만들면서 쓴 지식을 처음부터 풀어 쓴 가이드입니다. 16진수를 몰라도 그림으로 시작할 수 있고, 접어 둔 「더 깊이」를 펼치면 실제로 롬을 고칠 수 있는 데까지 들어갑니다.
이런 분께 맞습니다
- 롬 해킹이 궁금하지만 "16진수", "뱅크", "어셈블리" 같은 말에서 막힌 사람
- 한글패치 페이지의 「롬 분석 노트」를 읽다가 개념을 처음부터 알고 싶어진 사람
- 직접 번역 패치를 만들어 보고 싶은 사람
컴퓨터 구조를 미리 알 필요는 없습니다. 장마다 앞 장에서 배운 것만 씁니다. 처음이라면 0장부터 차례로 읽어 주세요.
한 장은 네 부분으로 되어 있습니다
같은 장 안에서 읽는 깊이를 고를 수 있습니다. 처음에는 「쉽게」만 읽고 넘어가도 다음 장을 따라오는 데 문제가 없습니다.
- 쉽게 그림과 비유로 개념을 잡습니다. 늘 펼쳐져 있습니다.
- 더 깊이 접혀 있습니다. 펼치면 공식, 데이터 형식, 예외 상황까지 다룹니다.
- 실제 패치에서 한글패치를 만들며 실제로 만난 주소와 바이트로 같은 개념을 다시 봅니다.
- 직접 해 보기 페이지 안의 계산기·실행기를 만져 보거나, kr-patch-toolkit의
krpatch명령으로 따라 합니다.
차례
공통 장은 어느 게임기에나 해당하고, 슈퍼 패미컴 장은 그 게임기에 맞춘 내용입니다. 닌텐도 DS 장은 나중에 붙입니다.
롬과 패치
롬은 카트리지 칩을 통째로 옮긴 파일이고, 패치는 바뀐 곳만 적은 파일입니다. IPS 형식을 바이트 단위로 읽어 봅니다.
비트·바이트·16진수
비트 여덟 개가 바이트 하나입니다. 2진수와 16진수, 음수와 체크섬까지 숫자를 읽는 법을 익힙니다.
엔디안
2바이트 숫자를 메모리에 놓을 때 어느 쪽 바이트를 먼저 적을까요? 롬에서 주소가 거꾸로 보이는 이유입니다.
CPU와 65c816
CPU는 명령을 한 줄씩 읽어 실행하는 일꾼입니다. 슈퍼 패미컴의 65c816이 가진 레지스터와 8/16비트 전환을 봅니다.
주소와 뱅크
$80:8000은 "80번 책의 8000쪽"입니다. LoROM·HiROM·SA-1이 롬 파일을 CPU 주소에 어떻게 펼치는지 계산해 봅니다.
어셈블리 기초
LDA·STA·분기·JSR을 하나씩 읽고, 패치 노트에 나온 코드 조각을 직접 해석합니다.
후킹
원래 코드 몇 바이트를 점프 명령으로 바꿔 새 코드로 건너갔다 돌아오게 합니다. 덮어쓴 명령을 다시 실행하는 법과 빈 공간 찾기까지 다룹니다.
그림과 글자
화면은 8×8 타일을 이어 붙인 그림입니다. 타일 바이트를 비트평면으로 읽는 법과 팔레트, 한글 수천 자를 좁은 폰트 칸에 넣는 방법을 봅니다.
대사는 어떻게 저장되나
글자표는 숫자와 글자의 사전, 포인터 표는 목차입니다. 제어 코드와 이어진 대본, 번역이 길어졌을 때 옮길 자리를 봅니다.
압축 ① RLE·LZSS
RLE는 "같은 바이트를 몇 번", LZSS는 "몇 칸 앞에서 몇 바이트"로 자료를 줄입니다. 플래그 바이트와 거리·길이를 실제 롬 바이트로 풀어 봅니다.
압축 ② 허프만
자주 나오는 글자에 짧은 비트를 주는 압축입니다. 트리를 만들어 부호를 얻고, 제절초 일본판 대본의 비트열을 한 비트씩 읽어 봅니다.
롬 확장
롬을 늘리면 헤더의 크기 바이트, 미러, 체크섬이 함께 바뀝니다. 매핑마다 늘릴 수 있는 한계와, 늘리지 않고 자리를 만드는 방법을 봅니다.
에뮬레이터로 확인
디버거로 "어디서 읽나"를 잡고, 여러 에뮬레이터에서 같은 결과가 나오는지 봅니다.
준비물
- 헥스 에디터: 파일을 바이트 단위로 보여 주는 프로그램입니다. 아무것이나 괜찮고, macOS·Linux라면 터미널의
xxd로도 충분합니다. - kr-patch-toolkit: 이 패치들을 만들 때 쓴 명령 모음입니다. Python 3.15 이상에서
pip install git+https://github.com/perfectacle/kr-patch-toolkit@v0.1.0으로 설치합니다. - 에뮬레이터: 디버거가 있는 Mesen 2를 썼습니다. 12장에서 자세히 다룹니다.
- 롬 파일: 이 가이드와 툴킷에는 롬이 들어 있지 않습니다. 직접 가진 카트리지에서 뽑은 롬으로 따라 해 주세요.
댓글