문제

나는 내 자신의 간단한 에뮬레이터를 작성하는 데 관심을 갖고 싶습니다. Z80 프로세서. 이 유형의 프로그래밍에 대한 경험이 없습니다. 나는 C 기반 언어를 사용하는 것이 가장 좋습니다.

이것을 달성하려면 무엇을해야합니까?이 프로젝트에서 저를 도울 수있는 좋은 튜토리얼/참조는 무엇입니까?

또한 내 TI-84 플러스 계산기 로이 에뮬레이터와 함께 ROM을 사용할 수 있습니다.

도움이 되었습니까?

해결책

아마도 이것들을 보면서 시작할 것입니다 :

좋은 튜토리얼은 여기에서 찾을 수 있습니다. 독립 Z80 어셈블리 가이드

Z80 문서

문서화되지 않은 Z80은 v0.91을 문서화했습니다 (PDF)

완전한 Z80 명령 참조

Z80 마이크로 프로세서 명령어 세트 요약

다른 팁

그것은 약간의 사이드 트립이지만,이 유형의 프로그래밍에 대한 경험이 없다고 말하면 범용 가상 머신 ~로부터 2006 ICFP 프로그래밍 콘테스트. 이것은 숙련 된 프로그래머가 90 분이 걸리는 작업이지만 경험이없는 많은 팀이 며칠 안에이를 완료 할 수있었습니다. 에뮬레이터를 완성하면 재미있는 것들이 잠금 해제되며 Z80을 다루기 전에는 좋은 워밍업 일 수 있습니다.

추가해야 할 사항 (특히 Z80의 경우) :

  1. 문서가 100% 버그가 없다고 믿지 마십시오.

    여기에 언급 된 버그를 포함한 버그가없는 것은 보이지 않습니다.

  2. CPU 코어에서 버그를 올바르게 테스트하십시오

    그것은 나중에 많은 두통과 혼란에서 당신을 구할 것입니다.

테스트를 위해 세 가지 접근 방식을 사용하고 있습니다.

  1. 알려진 코드에 대한 스테핑/추적 (보통 댓글을 찍은 ROM 분해)

    아직 아무것도 작동하지 않는 첫 번째 단계입니다. 코딩 된 지침이 나쁘게 표시됩니다.

  2. 에뮬레이터에 다른 Z80 코어를 포함시키고 모든 것을 이중 에뮬레이션으로 처리하십시오.

    동일한 스텝핑, 추적 및 실행 시스템으로 두 개의 '분리 된'에뮬레이터를 만듭니다. 두 CPU는 자체 메모리 하드웨어 등이 있어야합니다.

    My dual emulator example

    • 에뮬레이터를 실행하고 각 명령어가 등록 및 즉각적인 메모리 위치를 비교 한 후 [hl],[sp],[sp-1]...
    • 첫 번째 차이점에서 중지하고 어떤 지시가 발생했는지 확인하십시오.
      디버그하고 '버그가 없을 때까지 계속하십시오. 두 번째 코어는 버그가 될 수 있으므로주의해서 디버그 할 수 있습니다.
  3. 더 많이 사용 가능할 때 핵심 테스터가 사용됩니다

    사용 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/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top