용어집
가이드에 나오는 용어 154개를 가나다순으로 모았습니다. 영문으로 시작하는 용어는 맨 뒤에 있습니다. 링크를 누르면 그 용어를 설명한 장의 절로 갑니다.
ㄱ
- 가변폭 폰트 variable width font, VWF
글자마다 폭이 다른 폰트. 글자를 비트 단위로 밀어 붙여 그립니다.
- 감시 창 Watch
주소나 식을 적어 두면 멈출 때마다 그 값을 보여 주는 디버거 창
- 거리·길이 distance / length
LZ 복사 지시의 두 값. 몇 칸 앞에서, 몇 바이트를 가져올지
- 고정폭 fixed-width
모든 글자가 같은 폭을 차지하는 폰트
- 글리프 glyph
글자 하나의 그림
- 글자표 table file (.tbl)
바이트 값과 글자의 대응을 적은 표
- 끝 코드 terminator
문자열이나 데이터의 끝을 알리는 값
ㄴ
- 내부 헤더 internal ROM header
롬 안에 게임 이름·매핑·크기·체크섬을 적어 둔 곳. LoROM은 파일 0x7FC0
- 네이티브 모드 native mode
16비트 레지스터를 쓸 수 있는 모드. CLC와 XCE로 바꿉니다.
- 노드 node
트리의 갈림길이나 끝 하나
ㄷ
- 다시 배치 relocation
대사를 처음부터 다시 채우고 포인터를 새로 만드는 일
- 다이렉트 페이지 direct page
짧은 주소(LDA $10)의 기준 위치. D 레지스터에 담습니다.
- 대본 script
번호 없이 한 줄로 이어 둔 대사 전체
- 덤프(대사) dump
글자표로 롬의 대사 바이트를 글자로 바꿔 꺼내는 일
- 덤프(롬) ROM dump
카트리지에서 뽑아낸 롬 파일
- 덤프(메모리) memory dump
실행 중인 메모리의 내용을 파일로 저장한 것
- 덮어쓴 명령
점프 명령을 넣느라 지운 원래 명령. 새 코드 안에서 다시 실행해야 합니다.
- 데이터 뱅크(DB) data bank register
16비트 주소로 읽고 쓸 때 앞에 붙는 뱅크를 담은 레지스터
- 디버거 debugger
실행을 멈추고 명령, 레지스터, 메모리를 들여다보는 도구
ㄹ
- 레지스터(하드웨어) I/O register
화면·소리·입력 칩을 다루는 주소. $2100–, $4200– 등
- 레지스터(CPU) register
CPU 안에서 지금 다루는 값을 잠깐 쥐는 작은 칸. A, X, Y, P 등
- 레코드 record
IPS에서 위치 3바이트, 길이 2바이트, 바꿀 내용으로 된 묶음 하나
- 롬 ROM
카트리지 칩에 들어 있는, 읽기만 하는 메모리. 또는 그 내용을 통째로 옮긴 파일
- 롬 확장 ROM expansion
자리가 모자라 롬 파일 자체를 키우는 일
- 루트 root
트리의 맨 위 노드
- 리셋 벡터 reset vector
전원을 켜면 실행을 시작할 주소를 적어 둔 자리($00:FFFC)
- 리틀 엔디안 little endian
작은 자리 바이트를 앞 칸에 두는 순서. 65c816이 이 순서입니다.
- 리프 leaf
더 갈라지지 않는 끝 노드. 허프만 트리에서는 글자가 리프에 있습니다.
ㅁ
- 마스크 mask
AND로 필요한 비트만 남길 때 쓰는 값
- 매핑 mapping
롬 파일의 어느 부분이 CPU 주소의 어디에 보이는지 정한 규칙
- 맵 모드 바이트 map mode byte
내부 헤더에서 매핑과 FastROM 여부를 적은 바이트($FFD5)
- 명령 instruction
CPU가 한 번에 하는 아주 작은 일 하나. LDA, STA 같은 것
- 미러 mirror
같은 메모리가 두 주소 이상에서 보이는 것
ㅂ
- 바이트 byte
비트 여덟 개를 묶은 단위. 0부터 255까지의 숫자 하나
- 배경 레이어(BG) background layer
화면을 이루는 배경 판. BG1–BG4까지 겹쳐 그립니다.
- 뱅크 bank
24비트 주소의 맨 위 8비트. 주소 공간을 64KB씩 나눈 묶음
- 벡터 vector
인터럽트나 리셋 때 갈 주소를 적어 둔 자리
- 보수(체크섬) checksum complement
체크섬의 비트를 모두 뒤집은 값. 체크섬과 더하면 $FFFF
- 부호 있는 수 signed
같은 바이트를 −128–127로 읽는 방식. 0–255로 읽으면 부호 없는 수
- 분기 branch
플래그를 보고 다음에 실행할 곳을 바꾸는 명령
- 비트 bit
0 또는 1을 담는 한 칸
- 비트열 bitstream
바이트 경계와 상관없이 비트가 이어진 데이터
- 비트평면 bitplane
색 번호의 같은 자리 비트만 모은 판. 타일 바이트는 평면별로 놓입니다.
- 빅 엔디안 big endian
큰 자리 바이트를 앞 칸에 두는 순서. IPS의 위치와 길이가 이 순서입니다.
- 빈 공간 free space
롬에서 아무도 쓰지 않는 자리. 00이나 FF가 이어져도 빈 곳이 아닐 수 있습니다.
ㅅ
- 사이클 cycle
명령이 걸리는 시간의 단위
- 삽입 insertion
번역문을 글자표로 다시 바이트로 바꿔 롬에 넣는 일
- 서브루틴 subroutine
여러 곳에서 불러 쓰는 코드 덩어리. JSR로 부르고 RTS로 돌아옵니다.
- 세이브 RAM save RAM
카트리지에서 세이브 데이터를 담는 메모리
- 세이브스테이트 savestate
에뮬레이터가 그 순간의 기계 상태를 통째로 저장한 것
- 수직 귀선 기간 vertical blank
한 화면을 다 그리고 다음 화면을 그리기 전의 짧은 시간
- 스택 stack
나중에 넣은 것을 먼저 꺼내는 메모리. 돌아갈 주소와 레지스터를 잠깐 맡깁니다.
- 시프트 shift
비트를 한쪽으로 미는 연산. 왼쪽으로 한 칸이면 ×2
- 실기 real hardware
실제 게임기
- 쓰기 감시 write watch
멈추지 않고 그 주소에 값을 쓰는 순간을 기록하는 것. 누가 값을 바꾸는지 찾을 때 씁니다.
ㅇ
- 압축 compression
데이터를 더 적은 바이트로 줄여 담는 것. 되돌리는 것은 압축 해제(풀기)
- 어셈블러 assembler
어셈블리를 바이트로 바꾸는 도구. 네 패치는 asar를 썼습니다.
- 어셈블리 assembly
명령 바이트마다 사람이 읽을 이름을 붙여 적은 것
- 에뮬레이션 모드 emulation mode
전원을 켠 직후 6502처럼 도는 모드
- 에뮬레이터 emulator
게임기를 소프트웨어로 흉내 내는 프로그램
- 엔디안 endianness
여러 바이트로 된 숫자를 메모리에 놓는 순서
- 역어셈블 disassembly
바이트를 어셈블리로 바꿔 읽는 것. 반대로 바꾸는 도구가 어셈블러
- 오픈 버스 open bus
아무것도 연결되지 않은 주소를 읽으면 직전에 버스에 실린 값이 나오는 현상
- 옵코드 opcode
명령의 종류를 나타내는 첫 바이트. 3장에서는 "명령 바이트"라고 불렀습니다.
- 완성형 KS X 1001
자주 쓰는 한글 2,350자를 정해 둔 글자 집합
- 워드 word
2바이트. VRAM 주소는 워드 단위로 셉니다.
- 이벤트 뷰어 event viewer
한 프레임 안에서 레지스터 접근·NMI·DMA가 일어난 위치를 그려 보여 주는 창
- 인자 argument
제어 코드나 명령 뒤에 붙는 값
- 인터럽트 interrupt
CPU가 하던 일을 멈추고 정해진 루틴을 실행하게 하는 신호
- 입력 스크립트 input script
몇 번째 프레임에 무엇을 누르고 찍을지 한 줄씩 적은 파일
ㅈ
- 자동 컨트롤러 읽기 auto joypad read
수직 귀선 기간에 하드웨어가 컨트롤러 값을 읽어 $4218–$421F에 넣는 기능
- 접두 부호 prefix code
어떤 부호도 다른 부호의 앞부분이 아닌 부호. 구분 기호 없이 읽힙니다.
- 정규 허프만 부호 canonical Huffman code
부호 길이만 저장하고 부호는 정한 규칙으로 다시 만드는 방식
- 정확도 accuracy
에뮬레이터가 실제 기계를 얼마나 똑같이 흉내 내는지
- 제어 코드 control code
줄바꿈, 기다리기, 이름 넣기처럼 글자가 아닌 명령을 나타내는 바이트
- 조건식 condition
중단점이 특정 값일 때만 멈추도록 붙이는 식
- 주소 지정 방식 addressing mode
명령이 값을 어디서 가져올지 정하는 방식. 즉시값, 절대 주소, 인덱스 등
- 중계 코드 trampoline
가까운 곳에 몇 바이트만 두고 먼 뱅크의 본체를 부르는 코드
- 중단점 breakpoint
이 주소를 실행·읽기·쓰기하면 멈추라는 표시
- 즉시값 immediate
# 뒤에 적은 값 그 자체. #이 없으면 그 주소에 든 값
ㅊ
- 창(대사) text window
대사가 나오는 화면 속 상자
- 창(LZ) window
복사해 올 수 있는 바로 앞 구간. 출력이 늘면 함께 미끄러집니다.
- 체크섬 checksum
롬의 모든 바이트를 더한 값의 아래 16비트. 내부 헤더에 적혀 있습니다.
- 추적 기록 trace log
실행한 명령을 레지스터와 함께 한 줄씩 남긴 기록
- 치트 코드 cheat code
게임 메모리의 값을 강제로 바꾸는 코드. Pro Action Replay 코드는 RAM에 값을 계속 써 넣고, Game Genie 코드는 롬을 읽을 때 값을 바꿔치기합니다.
ㅋ
- 카피어 헤더 copier header
옛 복사 장치가 롬 앞에 붙인 512바이트. 붙어 있으면 모든 파일 오프셋이 0x200 밀립니다.
- 코어 core
libretro 규격으로 만든 에뮬레이터 파일
- 콜백 callback
어떤 일이 생기면 불러 달라고 등록해 두는 함수
- 크기 바이트 ROM size byte
내부 헤더에 롬 크기를 "1KB × 2의 n제곱"의 n으로 적은 바이트($FFD7)
ㅌ
- 타일 tile
가로세로 8픽셀짜리 작은 그림. 화면은 타일을 이어 붙여 그립니다.
- 타일맵 tilemap
화면의 각 칸에 몇 번 타일을 놓을지 적은 표
- 트리 tree
한 점에서 아래로 갈라져 나가는 자료 구조
ㅍ
- 파일 오프셋 file offset
파일 안에서 몇 번째 바이트인지. 첫 바이트가 0이고, 이 가이드는 0x를 붙여 적습니다.
- 팔레트 palette
타일의 색 번호가 실제로 어떤 색인지 정한 색 묶음
- 패치 patch
원본에서 바뀐 곳만 적어 둔 파일
- 포인터 pointer
다른 데이터의 주소를 담은 값
- 포인터 표 pointer table
대사마다 시작 주소를 적은 표. 대사 번호로 위치를 찾습니다.
- 폰트 font
게임 글자를 그린 타일 모음
- 폰트 칸
폰트에서 글자 하나가 차지하는 자리. 칸 수가 넣을 수 있는 글자 수를 정합니다.
- 프레임 frame
화면 한 장. 슈퍼 패미컴은 1초에 약 60프레임을 그립니다.
- 프로그램 뱅크(PB) program bank register
지금 실행 중인 코드의 뱅크
- 플래그 flag
P 레지스터의 한 비트. 방금 결과가 0인지, 올림이 났는지 등을 표시합니다.
- 플래그 바이트 flag byte
뒤따르는 항목들이 그대로인지 복사인지를 비트 하나씩 적은 바이트
- 플래시 카트리지 flash cartridge
롬 파일을 SD 카드에서 읽어 실기에서 돌리는 카트리지
- 피연산자 operand
옵코드 뒤에 붙는 값이나 주소. 0–3바이트
ㅎ
- 한글패치
롬의 바이트 일부를 바꿔 게임을 한국어로 만드는 패치
- 해제 루틴 decompression routine
롬 안에서 압축을 푸는 코드
- 허프만 부호 Huffman code
자주 나오는 글자에 짧은 비트열을 주는 부호
- 후킹 hooking
원래 코드 몇 바이트를 점프로 바꿔 새 코드에 들렀다 돌아오게 하는 방법
영문·숫자
- $(16진수 표시)
16진수라는 표시. 이 가이드는 CPU가 보는 주소, 레지스터와 메모리의 값, 표의 번호로 쓰는 ID에 $를 붙입니다.
- 0x(16진수 표시)
16진수라는 표시. 이 가이드는 파일 오프셋과 파일 속 길이에 0x를 붙입니다.
- 16진수 hexadecimal
2진수 네 자리를 0–9, A–F 한 글자로 적은 수
- 24비트 포인터 24-bit pointer
뱅크까지 담은 3바이트 포인터. 어느 뱅크든 가리킬 수 있습니다.
- 2의 거듭제곱 power of two
1, 2, 4, 8 …처럼 두 배씩 커지는 수. 롬 크기는 대개 이 크기입니다.
- 2의 보수 two's complement
맨 위 비트가 1이면 256(16비트면 65,536)을 빼서 읽는 음수 표현
- 2진수 binary
자리마다 두 배씩 커지는 자릿값으로 적은 수
- 6502 MOS 6502
65c816의 조상인 8비트 CPU
- 65c816 WDC 65C816
슈퍼 패미컴의 CPU. 6502를 16비트로 넓히고 주소를 24비트로 늘렸습니다.
- A 레지스터 accumulator
계산에 쓰는 레지스터. 읽고 더하고 비교하고 적는 일 대부분이 이곳을 거칩니다.
- asar asar
네 패치가 쓴 65c816 어셈블러
- BCD binary-coded decimal
16진수 한 자리에 10진수 한 자리를 넣는 방식. D 플래그를 켜면 ADC·SBC가 BCD로 계산합니다.
- BG 모드 BG mode
레이어마다 몇 색 타일을 쓸지 정하는 화면 모드 0–7
- bpp bits per pixel
픽셀 하나의 색 번호에 쓰는 비트 수. 2bpp면 4색
- CGRAM color generator RAM
팔레트 색을 담는 512바이트 메모리. 색 하나에 2바이트
- CPU central processing unit
명령을 한 줄씩 읽어 실행하는 장치
- CPU 주소 CPU address
CPU가 보는 24비트 주소. $80:8000처럼 뱅크와 주소로 적습니다.
- CRC32 CRC32
파일 내용으로 계산한 지문 값. 원본 롬이 맞는지 확인할 때 씁니다.
- DMA direct memory access
CPU 대신 하드웨어가 바이트를 한꺼번에 옮기는 기능. 그림을 VRAM에 올릴 때 씁니다.
- ExHiROM ExHiROM
4MB보다 큰 롬을 위한 HiROM의 확장 매핑
- FastROM FastROM
빠르게 읽어도 되는 롬이라는 헤더 표시. 속도는 $420D로 바꿉니다.
- HiROM HiROM
롬을 64KB씩 잘라 뱅크 $C0부터 통째로 놓는 매핑
- IPS
PATCH로 시작해 레코드가 이어지고 EOF로 끝나는 단순한 패치 형식
- JSL·RTL JSL / RTL
다른 뱅크의 서브루틴을 부르고 돌아오는 명령 짝
- KB·MB KiB·MiB
롬 해킹에서는 1KB = 1,024바이트, 1MB = 1,024KB
- libretro libretro
여러 에뮬레이터를 같은 함수 모양으로 감싼 규격
- LoROM LoROM
롬을 32KB씩 잘라 뱅크마다 위쪽 반($8000–$FFFF)에 놓는 매핑
- Lua Lua
Mesen 2가 게임과 함께 돌릴 수 있는 작은 프로그래밍 언어
- LZ77 LZ77
앞에 나온 덩어리를 "몇 칸 앞에서 몇 개"로 바꿔 적는 압축
- LZSS Lempel–Ziv–Storer–Szymanski
짧은 일치는 그대로 두고 긴 일치만 복사 지시로 적는 LZ 변형
- M 플래그·X 플래그 M / X flag
A와 X·Y가 8비트인지 16비트인지 정하는 플래그. 1이면 8비트
- NMI non-maskable interrupt
화면을 다 그린 직후마다 오는 인터럽트($4200 비트 7을 켜 두었을 때). 화면 데이터는 이때 바꿉니다.
- P 레지스터 processor status
플래그 여덟 개를 담은 레지스터
- PC program counter
다음에 실행할 명령의 주소를 가리키는 레지스터
- poke poke
실행 중에 메모리에 값을 직접 써 넣는 것
- PPU picture processing unit
화면을 그리는 칩
- REP·SEP REP / SEP
P의 비트를 끄고 켜는 명령. REP #$20은 A를 16비트로 바꿉니다.
- RLE run-length encoding
같은 값이 이어지면 값과 개수로 적는 압축
- RLE 레코드 RLE record
길이 자리가 00 00이고 같은 바이트를 몇 번 쓸지 적는 IPS 레코드
- S-CPU S-CPU
본체에 있는 CPU. SA-1과 구별할 때 이렇게 부릅니다.
- SA-1 SA-1
카트리지에 든 두 번째 65c816. 슈퍼 마리오 RPG가 씁니다.
- Super MMC Super MMC
SA-1 카트리지가 1MB 롬 블록을 골라 창 네 개에 보여 주는 기능
- VRAM video RAM
화면 칩(PPU)의 메모리 64KB. 타일 그림과 타일맵이 들어 있습니다.
- WRAM work RAM
게임이 쓰는 작업 메모리 128KB. 뱅크 $7E·$7F
- X·Y 레지스터 index registers
X와 Y. 표의 몇 번째 칸인지 세는 데 씁니다.