게임 소년 ROM 분리기.
파이썬 v3.6 이상이 필요합니다.
MGBDIS에 의해 생성 된 어셈블리 파일은 RGBDS v0.6.0 이상으로 조립되도록 설계되었습니다.
ROM을 분해하십시오.
./mgbdis.py some-game.gb
기본 출력은 disassembly 디렉토리입니다. make 실행 한 다음 game.gb (또는 game.gbc ) 파일을 확인하여 분해 결과를 확인할 수 있습니다.
cd disassembly && make
생성 된 어셈블리 코드의 서식 및 명령 스타일을 제어하는 데 사용할 수있는 여러 옵션도 있습니다. 실행하여 볼 수 있습니다.
./mgbdis.py -h
기호 파일을 사용하면 코드, 데이터, 테스트 및 이미지 데이터 블록이 ROM의 위치를 표시 할 수 있습니다.
Game Boy CPU (SM83)의 지침은 길이가 다르며 ROM의 코드와 데이터를 인터리브 할 수 있으므로 명령이 시작되고 중지되는 위치를 항상 정확하게 식별 할 수는 없습니다. 심볼 파일에서 코드 블록을 정의하면 명령어 중간에 MGBDIS의 문제를 피하는 데 도움이 될 수 있습니다.
심볼 파일이 없다면 내 게임 보이 에뮬레이터 - 죽어가는 달을 구타하는 파일을 생성 할 수 있습니다. 웹 데모를 사용하거나 Windows 및 MacOS에 사용할 수있는 빌드가 있습니다. 게임을하는 동안 실제로 실행 된 지침의 주소를 기반으로 코드 블록 정의가 포함 된 심볼 파일을 생성 할 수 있으며 명령 정렬 문제를 피하십시오.
MGBDIS가있는 심볼 파일을 사용하려면 ROM과 동일한 디렉토리에 존재하며 확장자를 .sym 으로 변경하는 것을 제외하고는 동일한 이름을 가져야합니다.
모든 값 (이미지 너비 제외)은 16 진이 있어야합니다. 출품작은 은행 번호와 메모리 주소로 시작합니다.
블록 유형은 .code , .data , .text 및 .image magic labels를 사용하고 바이트의 블록 길이를 사용하여 정의 할 수 있습니다.
일부 코드에 대한 레이블 추가 :
03:47f2 Read_Joypad_State
512 바이트의 데이터에 대한 레이블 추가 :
0d:4800 Level_Data
0d:4800 .data:200
16 바이트의 텍스트에 대한 레이블 추가 :
00:3d00 Character_Name
00:3d00 .text:10
.image Magic 레이블을 사용하면 ROM에서 픽셀 타일 데이터 당 1 또는 2 비트의 블록을 정의 할 수 있습니다. 이미지는 분해의 /gfx 디렉토리에서 PNG 파일로 출력되며 RGBGFX를 사용하여 MakeFile에 의해 1BPP 또는 2BPP 타일 데이터로 다시 변환됩니다. 이미지 블록의 주소에 레이블이 지정되면 PNG 파일의 이름에 사용됩니다.
각 타일은 16 바이트의 이미지 데이터가 필요하므로 바이트의 블록 길이는 16의 배수 여야합니다.
픽셀의 이미지 너비는 w 로 접두사로 된 소수점 번호로 지정할 수 있습니다. 너비 값은 8의 배수 여야하며 블록 길이와 이미지 너비의 조합은 빈 타일없이 직사각형 이미지를 초래해야합니다. 기본 이미지 너비는 128 픽셀이거나 블록 길이가 홀수 타일을 나타내는 경우 단일 행의 타일이있는 이미지가 생성됩니다.
팔레트는 이미지를 생성 할 때 사용할 회색 음영을 선택하는 바이트 크기의 값입니다. 0xFF47 에서 BGP 레지스터와 동일한 형식을 사용합니다. 값은 p로 p . 기본 팔레트는 E4 입니다.
기본값은 픽셀 타일 데이터 당 2 비트로 처리하는 것입니다. 데이터를 픽셀 타일 데이터 당 1 비트로 처리하기 위해 1bpp 옵션을 제공 할 수 있습니다.
폭이 128 픽셀과 팔레트 0xe4 인 1280 바이트의 타일 데이터에 라벨을 추가합니다.
02:791a Title_Screen_Tile_Data
02:791a .image:500:w128,pe4
결과 이미지 :
1BPP 타일 데이터의 예 :
05:4000 Font
05:4000 .image:200:w128,1bpp
결과 이미지 :
STOP 및 HALT 후 NOP 명령을 자동으로 추가하므로 명령어가 원래 ROM의 NOP 뒤 따르지 않으면 Disassembler가 데이터 바이트로 출력합니다. MGBDIS와 함께 --disable-halt-nops 사용하여 RGBD에 HALT 지침 후 자동 NOP 지침 삽입을 비활성화하도록 지시하십시오.