
전투
상대가 기술을 쓰면 화면 위에 기술 이름이 뜹니다. 그 순간 맞는 버튼을 눌러 받아칩니다. 기술마다 계열이 있어 서로 이기고 지는 관계가 있습니다.
슈퍼 패미컴 · 1995 · 한글패치 v1.2
가지고 있는 일본판 게임 파일을 고르면 바로 한글판으로 바꿔 저장합니다. 따로 프로그램을 설치하지 않아도 됩니다.
메신저 앱 안에서 열린 화면이라 파일을 고르거나 저장하지 못할 수 있습니다. 메뉴에서 "다른 브라우저로 열기"를 눌러 크롬이나 사파리로 열어 주세요.
파일은 이 기기 안에서만 바꾸고 어디에도 보내지 않습니다.
Floating IPS·Lunar IPS·ROM Patcher JS 같은 도구로 손대지 않은 일본판 원본에 적용하세요. 파일 크기에 맞는 IPS를 받으세요.
| 구분 | 크기 | CRC32 | MD5 |
|---|---|---|---|
| 일본판 원본 | 2,097,152바이트 | 3172CD4F | 8502A3E5C0FDC56B6495A644ACA54413 |
| 한글판 v1.2 | 2,097,152바이트 | E46C7A28 | E2457778B2F11063A75DFA69681E6FA3 |
세이브 구조는 바꾸지 않아 v1.1 세이브 파일을 그대로 이어서 쓸 수 있습니다.

2016년에 낸 v1.1 이후 약 10년 만의 업데이트입니다. 일본어 원문과 한 줄씩 대조해 대사 782줄을 고쳤습니다.
같은 장면을 같은 입력으로 찍어 v1.1과 v1.2를 나란히 놓았습니다.
원문과 다르게 옮겼거나 글자 수 제한으로 잘렸던 대사를 원문대로 되살렸습니다.




v1.1에 없던 대사

v1.1에 없던 대사



v1.1에 없던 대사

v1.1에 없던 대사



v1.1에 없던 대사

v1.1에 없던 대사







프리더는 존댓말을 쓰고, 치치는 원문의 悟空さ에 맞춰 "오공 씨"라고 부릅니다. 원작의 말장난도 살렸습니다.










v1.1에 없던 대사











고유명사는 국내 정식 발매판에 맞추고(슈퍼 도돈파, 미스터 포포 등), 원문에 없던 별명(빠박이, SKIN HEAD 등)은 정리했습니다. 맞춤법과 띄어쓰기, 줄바꿈도 바로잡았습니다.


















v1.1에서는 아래 두 장면에서 우주선이 맵 밖을 헤매어 한참 기다려야 했습니다. 한글 대사를 넣다가 우주선 이동 경로 데이터를 덮어쓴 탓이었습니다. 이제 원본처럼 바로 진행됩니다.




















피콜로 대마왕을 쓰러뜨리고 3년, 제23회 천하제일 무술대회에서 오공과 친구들이 다시 모입니다. 그로부터 5년 뒤 오공의 형이라는 사이어인 라데츠가 지구에 나타납니다.
지구로 오는 베지터와 내퍼에 맞서 1년을 수련하고, 드래곤볼을 찾아 나메크성으로 건너가 프리더와 결전을 벌이기까지, 원작 만화 《드래곤볼》의 어른이 된 오공의 이야기를 따라갑니다.
반다이가 1995년에 낸 슈퍼 패미컴 게임으로, 같은 해 나온 초오공전 돌격편의 뒤를 잇습니다.



상대가 기술을 쓰면 화면 위에 기술 이름이 뜹니다. 그 순간 맞는 버튼을 눌러 받아칩니다. 기술마다 계열이 있어 서로 이기고 지는 관계가 있습니다.

이야기 중간중간 DBZ 퀴즈가 나와 세 가지 답 중 하나를 고릅니다. 맞힌 비율은 세이브 화면에 남습니다.

드래곤볼을 모으면 신룡에게 소원을 빕니다. 전투력이나 체력을 올려 다음 싸움에 대비합니다.

나메크성으로 가는 우주선 안에서는 20배 중력 속에서 수련합니다.
v1.2는 2016년에 낸 v1.1 패치를 일본판에 적용한 롬에서 출발했습니다. 그 위에 v1.1이 만든 진행 버그를 고치고, 압축된 타이틀 그림을 풀어 한글로 다시 그리고, 대사 782줄을 고쳐 넣었습니다. 롬 크기는 원본과 같은 2MB입니다. 장면 확인은 일본판 롬 안에 남아 있던 개발자용 디버그 메뉴로 했습니다.

슈퍼 패미컴 구조나 65c816 어셈블리를 몰라도 읽을 수 있게 풀어 썼습니다. 절마다 그 일을 한 도구 파일을 적어 두었고, 도구 묶음은 마지막 분석 도구에서 받을 수 있습니다.
관련 도구: lua/dbgscene.lua 받기
CPU는 화면에 직접 그리지 않습니다. 그림 조각(타일)을 VRAM에 올려 두고 "이 칸에는 몇 번 타일" 이라는 배치표(타일맵)를 적어 화면을 만듭니다. 대사 글자도 타일입니다.
| 이름 | 크기 | 비유 | 하는 일 |
|---|---|---|---|
| 롬 | 2MB | 책 | 카트리지에 든 프로그램·대사·폰트·그림. 읽기만 합니다. |
| WRAM | 128KB | 작업 책상 | CPU가 계산하며 값을 적어 두는 곳. 지금 장면 번호도 여기 있습니다. |
| VRAM | 64KB | 스티커판 | 화면에 붙일 8×8 그림 조각(타일)을 올려 두는 곳. |
| SRAM | 8KB | 수첩 | 전원을 꺼도 남는 세이브 데이터. 에뮬레이터의 .srm 파일입니다. |
0xCA9BE 같은 파일 오프셋은 롬 파일을 처음부터 센 위치이고, $99:A9BE 같은 SNES 주소는 CPU가 보는 뱅크:주소입니다. 이 게임은 LoROM이라 뱅크마다 뒤쪽 32KB($8000–$FFFF)에만 롬이 보입니다. 그래서 다음처럼 바꿉니다.
파일 오프셋 = (뱅크 & 0x7F) × 0x8000 + (주소 & 0x7FFF)
$99:A9BE → 0x19 × 0x8000 + 0x29BE = 0xCA9BE어셈블리는 CPU가 실행하는 명령을 사람이 읽는 이름으로 적은 것이고, 롬 안에서는 그냥 바이트입니다. 전원을 켠 직후 실행되는 코드($80:805C, 파일 0x5C)를 보겠습니다.
| 바이트 | 어셈블리 | 뜻 |
|---|---|---|
80 0C | BRA $806A | 무조건 12바이트 뒤로 건너뜁니다. 제품판은 아래 네 줄을 늘 건너뜁니다. |
AD 33 02 | LDA $0233 | $0233번지 값을 읽습니다. 주소는 거꾸로 적힙니다. |
29 FF 00 | AND #$00FF | 아래 바이트만 남깁니다. |
D0 04 | BNE $806A | 0이 아니면 다음 4바이트를 건너뜁니다. |
22 2B 9F 80 | JSL $809F2B | 디버그 메뉴 루틴을 부릅니다. |
첫 줄 80 0C를 아무 일도 안 하는 명령 두 개 EA EA(NOP NOP)로 바꾸면 건너뛰지 않고 디버그 메뉴로 들어갑니다. 위 화면이 그렇게 연 메뉴입니다. ADVENTURE에서 장면 번호를 넣고 시작하면 맵까지 그 장면에 맞게 불러와서, 처음부터 플레이하지 않고도 원하는 대사를 띄울 수 있습니다. 롬 해킹은 이런 바이트 바꾸기의 연속입니다.
관련 도구: tools/dialogue.py, tools/extract.py, tables/kr-v1.2.txt 받기
대사 글자 하나는 16비트(2바이트) 코드이고, 작은 쪽 바이트를 먼저 적습니다. 0A 00은 줄바꿈,00 00은 대사 끝입니다. 한 페이지는 4줄이고, 한 줄에는 얼굴 그림이 있는 창은 10자, 나레이션 창은 15자까지 들어갑니다. 크리링의 대사 하나를 롬에서 그대로 꺼내면 이렇습니다.
| 바이트 | A2 06 | 45 09 | 52 09 | 0A 00 | 05 06 | B4 05 | 72 02 | 20 01 | 72 02 | 13 06 | 24 01 | 00 00 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 글자 | 크 | 리 | 링 | 줄바꿈 | 좋 | 은 | 빈칸 | 걸 | 빈칸 | 줄 | 게 | 끝 |
대사 ID는 0x000부터 0xF94까지 4천 개 가까이 됩니다. ID 범위마다 뱅크가 정해져 있고, 뱅크 첫머리에 포인터 표가 있습니다.
| 대사 ID | 뱅크 | 포인터 표 |
|---|---|---|
000–3DF | $99 | $99:8000 |
3E0–5B6 | $9A | $9A:8000 |
5B7–7AE | $9B | $9B:8000 |
7AF–97C | $9C | $9C:8000 |
97D–B44 | $9D | $9D:8000 |
B45–D15 | $9E | $9E:8000 |
D16–ED3 | $9F | $9F:8000 |
ED4–F94 | $98 | $98:C1C8 |
관련 도구: tools/font.py, tools/usedsheet.py, tools/dialogue_patch.py 받기
대사 폰트는 16×16 픽셀이고, 8×8 타일 4장으로 나뉘어 들어 있습니다. 롬에 저장된 시트는 한 줄에 타일 16장이라 글자 8개의 위 절반이 한 줄, 아래 절반이 그다음 줄입니다. 그래서 0x108–0x10F처럼 아래 절반 줄에 해당하는 코드는 글자로 쓰지 않습니다.
v1.1 폰트에는 대사를 고치며 필요해진 글자 몇 개가 없었습니다. 그래서 어떤 대사에서도 쓰지 않는 글자 자리를 찾아 Galmuri11 폰트로 깨·꽉·꾼·닿·렁·롭·벅·빡·뻐·셋·씻 11자를 그려 넣었습니다. 아래는 그렇게 넣은 「깨」입니다.
글자 표를 그대로 믿으면 안 된다는 것도 배웠습니다. v1.1 글자 표에는 922번이 「렁」이라고 적혀 있었지만 실제 그림은 「렇」이었습니다. 지금은 표의 글자와 롬의 그림을 대조해서 씁니다.
관련 도구: tools/dialogue_patch.py, tables/dialogue-v1.2.tsv 받기
포인터는 2바이트라 뱅크 번호 없이 같은 뱅크 안의 주소만 가리킵니다. 그래서 고친 대사가 원래보다 길면 다른 뱅크로는 못 보내고, 같은 뱅크의 빈 공간으로 옮긴 뒤 포인터만 고칩니다. 여러 ID가 한 문자열을 같이 가리키는 경우도 있어서, 그런 문자열은 제자리에서 고치지 않고 새 자리에 따로 씁니다.
관련 도구: tools/fix_overwrites.py 받기
v1.1은 늘어난 대사를 0xFF가 이어진 곳에 넣었습니다. 비어 있다고 생각했기 때문입니다. 그런데 0xFF가 시작되는 자리가 사실은 바로 앞 데이터의 끝 표시(FF FF)였습니다. 두 곳이 이렇게 덮였습니다.
$88:FFAE: 맵 이동 경로 레코드의 끝 표시와 그 뒤 레코드 하나. 이동 루틴이 대사 바이트를 경로로 읽어서 우주선이 맵 밖으로 나갔습니다.$83:F3AF: 컷신 캐릭터 X 좌표 표의 끝 표시. 캐릭터가 엉뚱한 좌표 쪽으로 미끄러져 갔습니다.v1.2는 원래 바이트를 되살리고, 그 자리에 있던 대사를 뒤로 민 다음, 그 대사를 가리키는 포인터를 같은 만큼 고쳤습니다. 이제 빈 공간을 쓸 때는 앞뒤에 여유를 두고, 일본판 원본에서도 그 자리가 0xFF였는지 확인합니다.
관련 도구: tools/lz.py, tools/title.py 받기
타이틀 로고는 롬에 LZSS로 압축돼 있습니다. 앞에서 나온 것과 같은 내용이 또 나오면 바이트를 다시 적지 않고 "몇 바이트 앞에서 몇 바이트를 베껴라" 라고만 적는 방식입니다. 플래그 바이트 하나가 뒤따르는 항목 8개의 종류를 아래 비트부터 알려 줍니다. 1이면 바이트 1개를 그대로, 0이면 2바이트짜리 "베껴라" 명령입니다. 일본판 타이틀 그림의 첫머리를 실제로 풀어 보면 이렇습니다.
50 13 풀면 0x1350 = 4,944바이트
DC 플래그 11011100 → 아래 비트부터 0 0 1 1 1 0 1 1
2F 01 베끼기: 길이 0xF+3 = 18, 거리 18 → 시작보다 앞이라 0으로 18바이트
F0 00 베끼기: 길이 3, 거리 15 → 0 세 바이트
01 0F 3F 그대로 세 바이트
89 00 베끼기: 길이 12, 거리 8 → 방금 쓴 8바이트를 겹쳐 가며 반복
1F FF 그대로 두 바이트타이틀 그림을 푸는 루틴($80:9DA7)은 다 푼 뒤에 타일마다 바이트 순서를 한 번 더 바꿉니다. 그래서 압축만 풀어서는 왼쪽처럼 줄무늬가 지고, 순서를 바꿔야 오른쪽처럼 제대로 보입니다.

한글 로고를 그린 뒤 다시 압축했더니 원래 3,608바이트가 3,232바이트로 줄어 제자리에 들어갔습니다. 더 길어지면 같은 영역의 빈 공간(파일 0x4C801–0x4FFFF)으로 옮기고 위치 정보를 고치도록 해 두었습니다. 「DRAGON BALL Z」 로고와 저작권 줄은 원본 그대로입니다. 저작권 줄의 © 타일은 두 줄이 같이 쓰기 때문입니다.
관련 도구: tools/credits.py, lua/crjump.lua 받기
엔딩 크레딧도 대사와 같은 16비트 문자열이고, 이름 줄마다 포인터가 있습니다($83:949D). 「MR. 포포」를 「미스터 포포」로 늘리면서 원래 자리에 줄여 넣지 않고 빈 공간으로 옮겨 포인터를 고쳤습니다. 제자리에서 글자 수를 바꾸면 가운데 정렬이 틀어집니다.
세이브 구조는 건드리지 않아 v1.1 세이브를 그대로 쓸 수 있습니다. 함께 배포한 100% 세이브 파일에서 깨진 슬롯을 지울 때는 슬롯 본체만이 아니라 요약 정보 두 곳(0x800대, 0x860대)도 같이 지워야 했습니다.
관련 도구: lua/dbgscene.lua, lua/lib.lua 받기
빌드 스크립트, 대사·폰트·LZSS 도구, 글자 표, 고친 대사 782줄, Mesen 2용 Lua 스크립트와 롬 분석 문서를 묶었습니다. 같은 엔진을 쓰는 초오공전 돌격편을 분석할 때도 주소만 바꾸면 대부분 쓸 수 있습니다.
분석 도구 받기(zip, 2.4MB, 롬 파일은 들어 있지 않음)
| 파일 | 하는 일 | 설명 |
|---|---|---|
tools/build.sh | 아래 순서대로 전체 빌드 | 9. 분석 도구 |
tools/dialogue.py | 대사 ID로 대사 위치 찾기 | 2. 대사 |
tools/extract.py | 일본어·한국어 대사 덤프(TSV) | 2. 대사 |
tools/font.py | 대사 폰트 글자 읽기 | 3. 폰트 |
tools/usedsheet.py | 대사에 쓰인 글자 목록 | 3. 폰트 |
tools/dialogue_patch.py | 대사 넣기, 옮기기, 새 글자 그리기 | 4. 대사 옮기기 |
tools/fix_overwrites.py | v1.1이 덮어쓴 데이터 되살리기 | 5. 진행 버그 |
tools/lz.py | LZSS 압축·해제 | 6. 타이틀 |
tools/title.py | 타이틀 그림 그리기·넣기 | 6. 타이틀 |
tools/credits.py | 엔딩 크레딧 고치기 | 7. 크레딧 |
tools/fixsum.py | 롬 헤더 체크섬 다시 계산 | 9. 분석 도구 |
tools/ips.py | IPS 적용·생성 | 9. 분석 도구 |
tables/ | 일본판·v1.1·v1.2 글자 표, 고친 대사 782줄 | 2. 대사 |
lua/ | Mesen 2 스크립트: 디버그 메뉴 장면 시작, 크레딧 바로 보기 | 8. 확인 |
README.txt | 롬 분석 문서(주소·형식 전체) | 1. 배경지식 |
압축을 푼 폴더에 일본판 원본을 넣고 빌드 스크립트를 돌리면 아래 순서로 v1.2와 같은 롬이 나옵니다.