C 또는 C ++에서 그래픽 Z80 에뮬레이터 작성 [폐쇄
해결책
다른 팁
그것은 약간의 사이드 트립이지만,이 유형의 프로그래밍에 대한 경험이 없다고 말하면 범용 가상 머신 ~로부터 2006 ICFP 프로그래밍 콘테스트. 이것은 숙련 된 프로그래머가 90 분이 걸리는 작업이지만 경험이없는 많은 팀이 며칠 안에이를 완료 할 수있었습니다. 에뮬레이터를 완성하면 재미있는 것들이 잠금 해제되며 Z80을 다루기 전에는 좋은 워밍업 일 수 있습니다.
추가해야 할 사항 (특히 Z80의 경우) :
문서가 100% 버그가 없다고 믿지 마십시오.
여기에 언급 된 버그를 포함한 버그가없는 것은 보이지 않습니다.
CPU 코어에서 버그를 올바르게 테스트하십시오
그것은 나중에 많은 두통과 혼란에서 당신을 구할 것입니다.
테스트를 위해 세 가지 접근 방식을 사용하고 있습니다.
알려진 코드에 대한 스테핑/추적 (보통 댓글을 찍은 ROM 분해)
아직 아무것도 작동하지 않는 첫 번째 단계입니다. 코딩 된 지침이 나쁘게 표시됩니다.
에뮬레이터에 다른 Z80 코어를 포함시키고 모든 것을 이중 에뮬레이션으로 처리하십시오.
동일한 스텝핑, 추적 및 실행 시스템으로 두 개의 '분리 된'에뮬레이터를 만듭니다. 두 CPU는 자체 메모리 하드웨어 등이 있어야합니다.
- 에뮬레이터를 실행하고 각 명령어가 등록 및 즉각적인 메모리 위치를 비교 한 후
[hl],[sp],[sp-1]
... - 첫 번째 차이점에서 중지하고 어떤 지시가 발생했는지 확인하십시오.
디버그하고 '버그가 없을 때까지 계속하십시오. 두 번째 코어는 버그가 될 수 있으므로주의해서 디버그 할 수 있습니다.
- 에뮬레이터를 실행하고 각 명령어가 등록 및 즉각적인 메모리 위치를 비교 한 후
더 많이 사용 가능할 때 핵심 테스터가 사용됩니다
사용 Zexall 운동제. 최고입니다 Z80 (적어도 내 경험에서). 그것은 매우 많은 것들을 도왔습니다 (내 핵심은 이제 100% Zexall 호환 가능). 실제 하드웨어에 대해 완료되므로 버그가 없습니다. 그것은 ~로부터 CP/M 따라서 일부 버전에는 필요합니다 64K RAM 모드 실행하려면. 다른 OS/ROM 또는 메모리 액세스가 실패 할 수있는 지침을 일으킬 수 있으므로 수정 된 CRC를 찾거나 실제 하드웨어와 비교해야합니다.
예를 들어, RAW Zexall 많은 것들이 실패합니다 ZX 스펙트럼 (완료된대로 MSX 그리고 64K 램 없이 ROM), 그러나 실제에 대한 버전이 있습니다 ZX 스펙트럼 그리고 그들은 100%입니다 확인 ~에 ZX 스펙트럼 (그리고 내 에뮬레이터에도 :))
Z80all instruction exerciser <adc,sbc> hl,<bc,de,hl,sp>...OK add hl,<bc,de,hl,sp>.........OK add ix,<bc,de,ix,sp>.........OK add iy,<bc,de,iy,sp>.........OK aluop a,nn...................OK aluop a,<b,c,d,e,h,l,(hl),a>.OK aluop a,<ixh,ixl,iyh,iyl>....OK aluop a,(<ix,iy>+1)..........OK bit n,(<ix,iy>+1)............OK bit n,<b,c,d,e,h,l,(hl),a>...OK cpd<r>.......................OK cpi<r>.......................OK <daa,cpl,scf,ccf>............OK <inc,dec> a..................OK <inc,dec> b..................OK <inc,dec> bc.................OK <inc,dec> c..................OK <inc,dec> d..................OK <inc,dec> de.................OK <inc,dec> e..................OK <inc,dec> h..................OK <inc,dec> hl.................OK <inc,dec> ix.................OK <inc,dec> iy.................OK <inc,dec> l..................OK <inc,dec> (hl)...............OK <inc,dec> sp.................OK <inc,dec> (<ix,iy>+1)........OK <inc,dec> ixh................OK <inc,dec> ixl................OK <inc,dec> iyh...............OK <inc,dec> iyl................OK ld <bc,de>,(nnnn)............OK ld hl,(nnnn).................OK ld sp,(nnnn).................OK ld <ix,iy>,(nnnn)............OK ld (nnnn),<bc,de>............OK ld (nnnn),hl.................OK ld (nnnn),sp.................OK ld (nnnn),<ix,iy>............OK ld <bc,de,hl,sp>,nnnn........OK ld <ix,iy>,nnnn..............OK ld a,<(bc),(de)>.............OK ld <b,c,d,e,h,l,(hl),a>,nn...OK ld (<ix,iy>+1),nn............OK ld <b,c,d,e>,(<ix,iy>+1).....OK ld <h,l>,(<ix,iy>+1).........OK ld a,(<ix,iy>+1).............OK ld <ixh,ixl,iyh,iyl>,nn......OK ld <bcdehla>,<bcdehla>.......OK ld <bcdexya>,<bcdexya>.......OK ld a,(nnnn) / ld (nnnn),a....OK ldd<r> (1)...................OK ldd<r> (2)...................OK ldi<r> (1)...................OK ldi<r> (2)...................OK neg..........................OK <rrd,rld>....................OK <rlca,rrca,rla,rra>..........OK shf/rot (<ix,iy>+1)..........OK shf/rot <b,c,d,e,h,l,(hl),a>.OK <set,res> n,<bcdehl(hl)a>....OK <set,res> n,(<ix,iy>+1)......OK ld (<ix,iy>+1),<b,c,d,e>.....OK ld (<ix,iy>+1),<h,l>.........OK ld (<ix,iy>+1),a.............OK ld (<bc,de>),a...............OK Tests complete
사용하려는 경우 Zexall 정말 철저한 테스트이며 IIRC ~에 ~ 50MHz 에뮬레이션이 필요했습니다
30-60
최소 완료. 그리고 몇 번 스크롤하기 위해 키를 눌러야합니다 ...경합 모델이 필요한 경우 적절한 테스트를 추가하십시오. 그런 다음 하나를 찾으십시오. 을 위한 ZX 스펙트럼 많은 부유 식 버스, 인터럽트 및 스크린 테스터가 있습니다. 을 위한 티 나는 전혀 모른다 ... (나는 티 계산기 사용자)
BTW : 에뮬레이터는 어떻게 되었습니까? (너는 그것을 다 했니?)
명령어 세트
여기에 지침을 복사하지만 1792 줄과 121kb가 있으므로 30kb 한도에 맞지 않습니다. 대신이 답변에서 다운로드 링크에서 찾을 수 있습니다.
그것은 '모두'를 포함합니다 ZX 정확한 지침 OP 코드, 코딩 타이밍 및 기계주기. 모든 문서를 구성하는 데 몇 년이 걸렸으므로 지나고 있습니다. Zexall 100% 바르게. 내 에뮬레이터 가이 (1792 명령) 텍스트 파일을 핵심에로드합니다. init
런타임에 명령 디코더 및 프로세서를 구성하므로 버그가 감지 된 경우 사물을 충분히 빠르고 간단하게 변경할 수있었습니다. 많은 시간의.
미치는 완전히 정확합니다. 프로세서를 이해하여 시작하십시오. 그런 다음 특정 지침을 구현하기 위해 코드를 작성하여 약간의 재생. C ++를 사용하여 C가 아닌 BTW, 또는 프로세서의 개념은 코드의 클래스에 매핑되지 않습니다.
지침을 구현하는 과정에서 플래그 및 명령 포인터와 같은 것을 정의해야합니다. 결국 메모리 모델과 I/O 모델을 구현 해야하는 곳으로 이동해야합니다.
결국 코드와 데이터를 메모리에로드하는 방법과 디스크에 다시 버리는 방법을 알아 내야합니다.
그래야만 주어진 명령어 포인터에서 코드 실행, 메모리에로드 된 코드 실행을 에뮬레이션하는 지점에 도달해야합니까?
Sega Master System 및 Game Gear Emulators를 살펴보십시오 (일부는 오픈 소스라고 확신합니다). 그 콘솔은 Z80을 CPU로, 그리고ZX 스펙트럼 그것을 사용했습니다. http://www.worldofspectrum.org/emulators.html.
프로세서 이상의 에뮬레이터를 원하지만 완전한 기계를 위해 에뮬레이터를 원한 것 같습니다. 또한 나머지 하드웨어를 모방하고 문서를 찾는 것이 더 어려운 작업이 될 수 있습니다.
목표에 따라 Z80 용 이미 기존 에뮬레이터로 시작할 수 있습니다. 빠른 검색은 그 중 몇 가지를 제공하지만 TI-84에는 에뮬레이터가 없습니다. 심, 오래된 컴퓨터 에뮬레이션을위한 프레임 워크에는 이미 Z80 프로세서의 에뮬레이션이있어 나머지 하드웨어의 에뮬레이션을 추가하는 것이 처음부터 시작하는 것보다 쉬워야합니다. 당신이 그 길을 가지 않더라도, 당신을 도울 수있는 몇 가지 디자인 문서가 있습니다.
약간 단순하지만 관련 CPU를 위해 에뮬레이터를 작성하여 시작하는 것이 좋습니다. 8080. Z80은 실제로 다소 복잡합니다 (다중 바이트 지침, 더 많은 주소 지정 모드, 인덱스 레지스터 등)은 8080 명령어는 디코딩하기가 매우 쉽습니다 (256 개회 조회 테이블을 1 차 솔루션으로 사용할 수 있음). .
프로그램을 제어하기 위해 작성한 모든 코드 (디스플레이, 데이터 입력, 메모리 덤프 등)는 Z80을 시도하기로 결정한 경우 재사용 할 수 있어야하며 실제로 사용자 인터페이스를 설계하여 시뮬레이션 프로세서로 설계해야합니다. -독립적인.
Z80과 계산기 어셈블리에 대해 알고있는 모든 것을 여기에서 배웠습니다. http://www.ticalc.org/programming/