2010-06-14 2 views
2

SNES 에뮬레이터 (또는 다른 게임 시스템 에뮬레이터)와 게임용 ROM에서 소스 코드를 가져올 수 있습니까? 시스템과 어떻게 든 개별 ROM이나 재생할 필요없이 특정 ROM을 재생할 수있는 단일 독립 실행 형 실행 파일을 만듭니다. 당신이 이미 ROM과 에뮬레이터 소스 코드를 가지고 있다고 가정하면 어렵겠습니까?오픈 소스 SNES 에뮬레이터 코드를 사용하여 ROM 파일을 독립적 인 실행 가능 게임으로 변환

답변

3

에뮬레이터 소스 코드가 있으면 너무 어려워서는 안됩니다. c 소스 파일에 이미지를 저장하는 데 자주 사용되는 방법을 사용할 수 있습니다.

기본적으로해야 할 일은 헤더 파일에 char * 변수를 만들고 해당 변수에 rom 파일의 내용을 저장하는 것입니다. 이것을 자동화하기위한 스크립트를 작성하는 것이 좋습니다.

그런 다음 파일에서 rom을 읽는 대신 ROM의 메모리 버전을 사용하고 변수에 저장되고 헤더 파일에 포함되도록 소스 코드를 변경해야합니다.

파일 포인터 등을 에뮬레이트해야하는 경우 약간의 작업이 필요할 수 있습니다. 그렇지 않으면 운이 좋을 수 있으며 rom 로딩 기능이 전체 파일을 한 번에로드합니다. 이 경우 파일로드 함수를 포인터를 반환하는 함수로 바꾸는 것만 큼 간단 할 것입니다.

그러나 라이센스 문제에주의하십시오. 에뮬레이터에 GPL 라이센스가있는 경우 실행 파일에 독점적 인 파일을 저장하는 것이 법적으로 허용되지 않을 수 있으므로 특히 릴리스/배포하기 전에 확인해야합니다.

+1

+1은 우리에게 GPL 인 파시즘에 대해 상기시켜줍니다. :) – cHao

1

예, 가능한 한 여러 번 수행했습니다. Google : 정적 이진 변환. Graham Toal은 주제에 관한 좋은 하우투 문서를 가지고 있으며, 히트 곡에 일찍 나타나야합니다. 거기 밖으로 몇 가지 코드가 남아있을 수 있습니다 거기에 몇 가지 코드가있을 수 있습니다.

ROM을 완전히 제거하는 것은 생각보다 조금 더 많은 작업 일 수 있지만 에뮬레이터를 사용하지 않는 것은 가능합니다. 사실, 두 가지 요구 사항이 모두 가능하며 핸드 헬드 콘솔 게임 또는 셋톱 박스 게임의 얼마나 많은 수가 번역되고 에뮬레이션되지 않는지 놀랄 수 있습니다. Espan 플랫폼은 실시간으로 에뮬레이트 할 수있는 충분한 프로세싱 파워가없는 Nintendo의 플랫폼과 같습니다.

참조로 좋은 에뮬레이터가 필요하거나 자신의 에뮬레이터를 참조로 작성해야합니다. 그런 다음 디스어셈블러를 작성해야합니다. 그런 다음 디스어셈블러가 C 코드를 생성해야합니다. (직접 다른 대상으로 변환하려고하지 마십시오. 한 번 실수로 C를 포팅 할 수 있고 컴파일러가 많은 데드 코드 제거를 처리합니다. 당신).

 
add r0,r0,#2 

그리고로 그 번역 할 수 있습니다 : 그래서 메이크업의 명령은 명령어 세트가있을 수 있습니다 생각 그것은 SNES는 소행성 인 사용 무엇 6502 관련이 보이는

 
//add r0,r0,#2 
r0=r0+2; 
do_zflag(r0); 
do_nflag(r0); 

나는 취미로 잠시 동안 계속해서 일하고있는 번역문입니다. 사용중인 에뮬레이터는 아마도 런타임 성능을 위해 쓰여지고 조정되어 있으므로 참조로 사용하고 번역 된 코드로 잠금 단계를 확인하는 것이 가장 어려울 수 있습니다. 6502는 z80에 비해 실제로 많은 명령어가 없기 때문에 훌륭합니다. 다른 단어 길이 명령 세트와 마찬가지로 디스어셈블러는 첫 번째 커다란 장애물입니다. 선형 적으로 생각하지 말고, 실행 순서를 생각하고, 에뮬레이터처럼 생각하고, 지시를 0에서 N 또는 N까지 선형 적으로 0으로 변환 할 수 없습니다.rom의 바이트를 명령의 첫 번째 바이트로 표시하고 명령의 첫 번째 바이트가 아닌 모든 가능한 실행 경로를 따라야합니다. 데이터로 디코딩 할 수있는 몇 가지 바이트와 마크를 선택하면 다른 모든 바이트는 데이터 또는 채우기라고 가정합니다. ROM을 없애기 위해이 데이터로 무엇을해야하는지 알아 내면 ROM을 없애는 것이 문제입니다. 일부 코드는 데이터를 직접 주소 지정합니다. 다른 사용자는 번역 시간에 레지스터 간접적 인 의미를 사용합니다. 데이터가 어디에 있는지 또는 얼마나 많이 있는지 알지 못합니다. 일단 지시문의 시작 바이트를 모두 표시했다면 ROM을 0에서 N으로 분해하고 번역하는 것은 쉬운 일이 아닙니다.

행운을 빈다, 즐겁게, 그만한 가치가있다.

+0

SNES는 실제로 제가 기억하기에 65816 프로세서를 사용합니다. 대부분 6502와 호환되는 바이너리이지만 플래그는 16 비트 레지스터와 오프셋 등을 제공하도록 설정할 수 있습니다. 그것 이외에, 그래. 아주 간단하고 지루한 경우 분해해야합니다. – cHao