2008-09-21 4 views
17

주말이므로 취미 프로젝트를 작성하여 일주일 프로그래밍에 익숙해졌습니다.6502 CPU 에뮬레이션

어제 MOS 6502 CPU 에뮬레이터의 프레임 워크를 작성하여 레지스터, 스택, 메모리 및 모든 opcode가 구현되었습니다. (아래의 소스에 대한 링크)

필자가 작성한 디버거에서 일련의 작업을 수동으로 실행할 수 있지만 NES ROM을로드하고 지침에 프로그램 카운터를 가리키고 싶습니다. 결함있는 opcode를 찾는 가장 빠른 방법.

빠른 NES 롬 로더를 작성하고 ROM 뱅크를 CPU 메모리에로드했습니다.

문제는 opcode가 어떻게 인코딩되는지를 모른다는 것입니다. 나는이 연산 코드 인수를 찾을되어있어 어디 확실하지 않다 그러나 옵 코드 자체가 고유하게 작동 코드를 식별 오피 당 한 바이트의 패턴,

0 - BRK 
1 - ORA (D,X) 
2 - COP b 

을 따르 것을 알고있다. 그것은 바로 뒤에 오는 바이트인가? 절대 메모리에서는 바이트가 아니지만 짧을 수도 있습니다.

이 CPU의 메모리 모델에 익숙한 사람이 있습니까?

편집 : 어둠 속에서 촬영되었을 가능성이 높지만, 여기에 숨어있는 올드 스쿨 애플 및 Commodore 해커가 있었으면합니다.

편집 : 여러분 모두를 도와 주셔서 감사합니다. 각 작업을 정렬하기 위해 적절한 변경을 구현 한 후 CPU는 Mario Brothers를로드하고 실행할 수 있습니다. 그것은 시작을 기다리고 루프하지만 아무것도하지 않는,하지만 좋은 징조 :

나는 소스 업로드 : 사람이 궁금 경우

http://www.codeplex.com/Cpu6502/SourceControl/DirectoryView.aspx?SourcePath=&changeSetId=1810

어떻게 에뮬레이터 작품은 아주 쉽게 따라와. 최소한의 최적화, 그러나 다시, 나는 2.4 기가 헤르츠 고출력 기계 :)에 2MHz의에서 실행되는 CPU를 모방하고있어이

+0

이봐, 난이 (게시시) 당신 같은 상황에서 꽤 많이 해요 내가 좋아하는 것 귀하의 코드를 확인하지만, 링크가 깨진 것 같습니다. 아직도 갖고 있니? – Petruza

답변

12

opcode는 1 바이트를 취하고 피연산자는 다음 바이트에 있습니다. 예를 들어 바이트 크기 열 here을 확인하십시오. 당신이 http://www.atarimax.com/jindroush.atari.org/aopc.html 같은 참조로 보면

+0

그래서 각 인수를 수정해야 각 인수를 얻기 위해 PC에서 얼마나 멀리 떨어져야할지 알 수 있습니까? – FlySwat

+0

테이블을 어딘가에 보관해야합니다. 그것은 3 바이트 이상이 될 수는 없지만. 또는 각 명령의 작업을 수행하는 코드에서 직접 입력하십시오. – moonshadow

+1

나는 실제로 그 책을 가지고있다. –

1

이 책은 도움이 될 수 없음 : http://www.atariarchives.org/mlb/

을 또한 섹터가 시도 다른 6502 aseembler/시뮬레이터/디버거를 사용하여 어셈블리가 기계어로 코딩되는 방법을 확인하십시오.

3

, 각 연산 코드가로 지정된 인코딩을 가지고 볼 수 있습니다 :

HEX LEN TIM 

육각이 1 바이트 연산 코드입니다. 그 직후에 인수의 LEN 바이트가옵니다. 이 인수가 무엇인지 보려면 참조를 참조하십시오. TIM 데이터는 에뮬레이터에서 중요합니다.이 명령은이 명령어가 실행하는 데 필요한 클럭 사이클 수입니다. 당신은 당신의 타이밍을 정확하게하기 위해 이것을 필요로 할 것입니다.

이러한 값 (LEN, TIM)은 opcode 자체에서 인코딩되지 않습니다. 이 데이터를 프로그램 로더/실행 프로그램에 저장해야합니다. 그것은 단지 큰 조회 테이블입니다.또는 미니 언어를 정의하여 데이터와 판독기를 인코딩 할 수 있습니다.

+0

LEN과 TIM이 실제로 인코딩되어 있다고 생각하지 않습니다. 당신이 제공해야한다고 생각합니다. 나는 이미 타이밍에서이를 수행했으며, 각 opcode는 얼마나 많은 사이클을 "예상"했는지 알고 있습니다. – FlySwat

+1

그들은 실제로 많은 경우에 있습니다. opcode의 인수 비트 [4 : 2]를 갖는 모든 opcode들에 대하여, 어드레싱 모드의 3 비트 인코딩을 정의한다. 0 = 간접 X, 1 = 제로 페이지, 2 = 즉시 (누적 기), 3 = 절대, 4 = 간접 Y, 5 = 제로 페이지 X, 6 = 절대 Y, 7 = 절대 X –

1

6502 매뉴얼은 다양한 역사 사이트에서 웹 상에 있습니다. KIM-1은 그들과 함께 선적했다. 당신이 알 필요가있는 것보다 더 많은 것들이있을 것입니다.

0

apple II rom에는 dissassembler가 포함되어 있습니다. 저는 이것이 그것이라고 불리는 것이라고 생각합니다. 16 진수 opcode와 3 문자 opcode 및 피연산자를 좋은 형식으로 보여줄 것입니다.

사용할 수있는 메모리가 얼마나 적은지를 감안할 때, 실제로는 작은 공간으로 설정된 6502 명령어 전체에 대한 3 문자 연산 코드는 피연산자 바이트 수 (항상 0, 1 또는 2)로 이동합니다. 그것의 많은 것.

당신이 애플 II ROM을 발굴 할 수 있다면, 당신은 그냥 잘라 거기에서 붙여 넣을 수 있습니다 ...