Donkey Kong Country 2 Bug & Open Bus Emulation Issue Explain
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

Donkey Kong Country 2와 Open Bus

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

개발 툴

대상자

  • *소프트웨어 개발자, 에뮬레이터 개발자, 게임 개발자**
  • 난이도: 중간 (하드웨어 동작 원리와 어셈블리 코드 이해 필요)*

핵심 요약

  • ZSNES 에뮬레이터는 open bus 동작을 제대로 에뮬레이션하지 않아, Donkey Kong Country 2의 회전 배럴 버그 발생
  • 65C816 CPU의 메모리 뱅킹과 즉시 주소 지정(#) 대신 절대 주소 지정 사용한 코딩 실수로 인한 버그
  • AND #$2000 명령어를 AND $2000로 잘못 사용하여 AND 연산 결과가 0이 되어 회전이 영원히 지속됨

섹션별 세부 요약

1. 버그 현상 및 원인

  • ZSNES 에뮬레이터에서 회전 배럴이 방향키 짧은 입력으로도 무한 회전
  • 실제 하드웨어에서 open bus 동작 시 마지막 메모리 값이 반환되지만, ZSNES는 항상 0 반환
  • 게임 코드에서 AND $2000 대신 AND #$2000 사용한 실수로 AND 결과가 0으로 인해 회전 중단 로직 비활성화

2. 65C816 CPU 및 메모리 구조

  • 65C816 CPU는 24비트 주소 버스 사용, 8비트 뱅크 + 16비트 오프셋으로 주소 구성
  • 메모리 뱅킹(PBR, DBR)과 하드웨어 스택, direct page는 항상 $00 뱅크에 존재
  • open bus는 유효하지 않은 주소 접근 시 마지막 값이 반환되는 하드웨어 특성

3. 게임 루틴의 로직 분석

  • 회전 배럴 로직: 방향 + 회전량 합산 → XOR 연산 → open bus 값과 AND 연산 수행
  • AND 결과가 0이면 회전 계속, 0이 아니면 8방향으로 정렬
  • ZSNES에서 open bus 미지원으로 AND 결과가 항상 0 → 회전 중단 로직 비활성화

4. 에뮬레이터 및 해결 방안

  • Snes9x는 하드코딩으로 버그 수정, ZSNES는 개발 중단으로 패치 불가
  • AND 명령어 오퍼코드(0x2D)를 0x29로 변경하면 open bus 없이도 정상 작동
  • 현대 에뮬레이터는 open bus 동작 정확히 에뮬레이션해야 구형 소프트웨어 재현 가능

결론

  • 에뮬레이터 개발 시 open bus 동작 정확히 구현하고, 어셈블리 코드에서 즉시 주소(#) 지정을 반드시 사용해야 함
  • AND #$2000AND $2000 구분은 코드 오류 유발 요인으로, IDE에서 # 강조 기능 활용 권장
  • 레거시 하드웨어 특성(open bus)은 에뮬레이션 정확성과 구형 소프트웨어 재현에 핵심적인 영향