본문으로 건너뛰기

롬 해킹 기초

이 블로그의 한글패치(슈퍼 마리오 RPG, 드래곤볼 Z 초오공전 돌격편, 드래곤볼 Z 초오공전 각성편, 제절초)를 만들면서 쓴 지식을 처음부터 풀어 쓴 가이드입니다. 16진수를 몰라도 그림으로 시작할 수 있고, 접어 둔 「더 깊이」를 펼치면 실제로 롬을 고칠 수 있는 데까지 들어갑니다.

이런 분께 맞습니다

  • 롬 해킹이 궁금하지만 "16진수", "뱅크", "어셈블리" 같은 말에서 막힌 사람
  • 한글패치 페이지의 「롬 분석 노트」를 읽다가 개념을 처음부터 알고 싶어진 사람
  • 직접 번역 패치를 만들어 보고 싶은 사람

컴퓨터 구조를 미리 알 필요는 없습니다. 장마다 앞 장에서 배운 것만 씁니다. 처음이라면 0장부터 차례로 읽어 주세요.

한 장은 네 부분으로 되어 있습니다

같은 장 안에서 읽는 깊이를 고를 수 있습니다. 처음에는 「쉽게」만 읽고 넘어가도 다음 장을 따라오는 데 문제가 없습니다.

한 장의 네 부분쉽게, 더 깊이, 실제 패치에서, 직접 해 보기 네 칸이 위에서 아래로 쌓여 있다. 쉽게는 늘 펼쳐져 있고 더 깊이는 접혀 있다.1 쉽게그림과 비유. 늘 펼쳐져 있습니다2 더 깊이접혀 있습니다. 공식·형식·예외까지3 실제 패치에서한글패치 롬 분석 노트의 실제 주소·바이트4 직접 해 보기krpatch 명령과 페이지 안 도구로 직접 해 봅니다
한 장을 이루는 네 부분. 위에서 아래로 갈수록 깊어집니다.
  • 쉽게 그림과 비유로 개념을 잡습니다. 늘 펼쳐져 있습니다.
  • 더 깊이 접혀 있습니다. 펼치면 공식, 데이터 형식, 예외 상황까지 다룹니다.
  • 실제 패치에서 한글패치를 만들며 실제로 만난 주소와 바이트로 같은 개념을 다시 봅니다.
  • 직접 해 보기 페이지 안의 계산기·실행기를 만져 보거나, kr-patch-toolkit의 krpatch 명령으로 따라 합니다.

차례

공통 장은 어느 게임기에나 해당하고, 슈퍼 패미컴 장은 그 게임기에 맞춘 내용입니다. 닌텐도 DS 장은 나중에 붙입니다.

  1. 0장공통

    롬과 패치

    롬은 카트리지 칩을 통째로 옮긴 파일이고, 패치는 바뀐 곳만 적은 파일입니다. IPS 형식을 바이트 단위로 읽어 봅니다.

  2. 1장공통

    비트·바이트·16진수

    비트 여덟 개가 바이트 하나입니다. 2진수와 16진수, 음수와 체크섬까지 숫자를 읽는 법을 익힙니다.

  3. 2장공통

    엔디안

    2바이트 숫자를 메모리에 놓을 때 어느 쪽 바이트를 먼저 적을까요? 롬에서 주소가 거꾸로 보이는 이유입니다.

  4. 3장슈퍼 패미컴

    CPU와 65c816

    CPU는 명령을 한 줄씩 읽어 실행하는 일꾼입니다. 슈퍼 패미컴의 65c816이 가진 레지스터와 8/16비트 전환을 봅니다.

  5. 4장슈퍼 패미컴

    주소와 뱅크

    $80:8000은 "80번 책의 8000쪽"입니다. LoROM·HiROM·SA-1이 롬 파일을 CPU 주소에 어떻게 펼치는지 계산해 봅니다.

  6. 5장슈퍼 패미컴

    어셈블리 기초

    LDA·STA·분기·JSR을 하나씩 읽고, 패치 노트에 나온 코드 조각을 직접 해석합니다.

  7. 6장슈퍼 패미컴

    후킹

    원래 코드 몇 바이트를 점프 명령으로 바꿔 새 코드로 건너갔다 돌아오게 합니다. 덮어쓴 명령을 다시 실행하는 법과 빈 공간 찾기까지 다룹니다.

  8. 7장슈퍼 패미컴

    그림과 글자

    화면은 8×8 타일을 이어 붙인 그림입니다. 타일 바이트를 비트평면으로 읽는 법과 팔레트, 한글 수천 자를 좁은 폰트 칸에 넣는 방법을 봅니다.

  9. 8장슈퍼 패미컴

    대사는 어떻게 저장되나

    글자표는 숫자와 글자의 사전, 포인터 표는 목차입니다. 제어 코드와 이어진 대본, 번역이 길어졌을 때 옮길 자리를 봅니다.

  10. 9장공통

    압축 ① RLE·LZSS

    RLE는 "같은 바이트를 몇 번", LZSS는 "몇 칸 앞에서 몇 바이트"로 자료를 줄입니다. 플래그 바이트와 거리·길이를 실제 롬 바이트로 풀어 봅니다.

  11. 10장공통

    압축 ② 허프만

    자주 나오는 글자에 짧은 비트를 주는 압축입니다. 트리를 만들어 부호를 얻고, 제절초 일본판 대본의 비트열을 한 비트씩 읽어 봅니다.

  12. 11장슈퍼 패미컴

    롬 확장

    롬을 늘리면 헤더의 크기 바이트, 미러, 체크섬이 함께 바뀝니다. 매핑마다 늘릴 수 있는 한계와, 늘리지 않고 자리를 만드는 방법을 봅니다.

  13. 12장슈퍼 패미컴준비 중

    에뮬레이터로 확인

    디버거로 "어디서 읽나"를 잡고, 여러 에뮬레이터에서 같은 결과가 나오는지 봅니다.

준비물

  • 헥스 에디터: 파일을 바이트 단위로 보여 주는 프로그램입니다. 아무것이나 괜찮고, 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장에서 자세히 다룹니다.
  • 롬 파일: 이 가이드와 툴킷에는 롬이 들어 있지 않습니다. 직접 가진 카트리지에서 뽑은 롬으로 따라 해 주세요.