2011-03-25 3 views
2

나는 C에서 게임 보이 컬러 에뮬레이터을 writting있어 그냥이 세계로 자신을 소개, 동적 또는 정적 재 컴파일의 아무것도 해석됩니다 C 코드에서 모든 CPU 연산 코드를 구현하는 지루한 작업인데,이 모든 것을 작성해야합니다 : http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html과 다른 에뮬레이터에서 가져오고 싶지 않습니다.게임 보이 컬러 에뮬레이터 옵 코드 자동화

질문은, 어떤 방법으로 opcode를 writting 자동화합니까? 어리석은 질문 일 수도 있고 어리석은 대답 일 수도 있지만 가능한 한 적게 일하고 싶습니다. :)

+1

+1 내가 정말 사람이되기를 바랍니다 추가 명령의 모든 변화를 구현하는 시간을 소비 한 후 "왜 이것이 자동화 될 수 있는지!"라고 말할 수 있습니다. 여기에 희망이 있습니다 ... – templatetypedef

+0

[나는 당신의 고통을 안다] (https://github.com/CRogers/GbcEmulator/blob/master/GbcEmulator/Cpu/Z80.Opcodes.cs) –

+0

동의 함, 나는 이것을 찾은 후에 발견했다. .. –

답변

6

나는 전에 이런 종류의 작업을 수행했는데 매크로로 작업 한 방식대로하면 CPU 캐시가 오버플로되어 작업 속도가 느려지는 많은 코드 중복이 생깁니다. 만약 내가 오늘해야한다면, 나는 "opcode switch/jumptable"관용구를 제거 할 것입니다. 보통의 산술/논리 연산을위한 공통적 인 분기없는 코드를 작성합니다. 연산 코드 번호. 같은 생각 :

operand1 = regs[operand1_table[opcode]]; 
operand2 = regs[operand2_table[opcode]]; 
res[ADD] = operand1+operand2; 
res[SUB] = operand1-operand2; 
res[OR] = operand1|operand2; 
/* ... */ 
regs[dest_table[opcode]] = res[optype_table[opcode]]; 

이 코드는 지나치게 단순화 물론이지만, 메모리 피연산자를 처리하기 위해 확장 할 수 있습니다, 등 또한 점프 명령의 하나로서 프로그램 카운터에 바로 추가 명령이므로주의 그것의 피연산자.

Z80 (또는 그 GB 변형) 또는 x86과 같은 CISC 아치의 경우 조건 코드 플래그도 처리해야합니다. 그러나 위의 res[...] = ...;과 같은 두 번째 계산 집합으로 수행 할 수 있습니다.

+1

이것은 (좋은 의미에서) 절대적으로 악의적이지만 목표 명령어 세트가 나눗셈을 포함하는 경우 결과가 사용되지 않는 일련의 명령어에서 장애가 발생하지 않도록 호스트의 순서가 잘못된 프로세서가 똑똑 할 것인가 . 또는 분단이 희미하거나 드문 op 코드 중 하나 여야합니까? –

+0

비 기본 산술 명령 중 하나를 나누는 것을 고려할 것입니다. 사실 Z80과 같은 고대의 CPU에서, 심지어 곱셈이 있다면 희소성도 고려할 것입니다. –

2

그래서 지금까지 msp430, 6502 및 thumb에 대한 에뮬레이터 또는 정적 재 컴파일러 만 수행했습니다. 적은 타이핑입니다. 단조 로움을 없애기 위해 내가 자주 할 작업은 내가보기 싫어하는 opcode를 때릴 때까지 실행하고 실행하려는 프로그램/게임을 취하는 것입니다. 그런 다음 opcode를 구현하고 다시 시도하십시오.

더 나쁜 것은, 입력을 많이하거나 어떻게 할 수 있었는지에 대한 느낌을 얻기 전에이 에뮬레이터를 두세 명의 에뮬레이터 또는 두세 번 다시 쓰는 것입니다 더 잘 설계된 재사용/논리. 좋아하는 롬을 실행하려고하면, opcode 테이블의 여러 부분에 당신을 넣는 무작위적인 명령어 믹스가 생기고, 그 opcode를위한 코드를 재사용 할 때 더 적은 비용으로 디자인을 향상시킬 수 있습니다. 다시 쓴다.

R.가 아마도 스프레드 시트 또는 다른 소프트웨어 구문 분석 가능 테이블을 작성하는 경우 해당 테이블에서 시뮬레이터 코드 생성기를 작성하고 다시 작성할 수 있습니다. 여기서도 다시 완전한 테이블을 만들 필요가없는 작은 것으로 시작할 수 있으며, opcode의 여러 가지 맛을 시험해보고 파서가 시뮬레이터 용 코드를 생성 할 수있는 테이블 형식을 알아낼 수 없는지 확인하십시오. 나중에 플래그 및 기타 사항을 추가하고 전체 프로세스가 향상됨에 따라 커질 수 있습니다. 하루가 끝날 무렵에는 테이블이나 실제 코드가 될 것입니다. 결국 모든 opcode를 입력해야합니다.

4

나는 이것이 오래 알고 질문에 대답하지만, 누군가가 같은 문제를 가진 끝나는 경우 기록을 위해 :

을 나는이 문서 페이지를 구문 분석하고있는 JSON을 생성하는 빠른 스크립트를 만들어 opcodes 설명.

이 JSON을로드하고 GB [dis] 어셈블러 코드의 상용구를 생성하면 JSON이 대부분의 스크립팅 언어에서 조작하기 쉽기 때문에 시간을 절약 할 수 있습니다.

코드 및 결과 JSON :

+0

저는 GB 에뮬레이터를 직접 작성 중이며 방금 게시물을 보았습니다. 고마워, 고마워. 내가보기 전에 며칠 만 게시 한 것을 보니 재밌 네요! –

+1

Aurélien Vallée의 GB opcode 용 JSON 파일에는 몇 가지 문제가 있으며, 이러한 문제를 스스로 발견하는 것은 시간 소모적입니다. 다음은 수정 된 JSON 파일을 사용한 Repo입니다. https://github.com/Prehistoricman/GBEmulatorStuff ([Prehistoricman] (http://stackoverflow.com/users/4632769/prehistoricman)의 의견) – nhahtdh