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 #$2000
과AND $2000
구분은 코드 오류 유발 요인으로, IDE에서#
강조 기능 활용 권장- 레거시 하드웨어 특성(
open bus
)은 에뮬레이션 정확성과 구형 소프트웨어 재현에 핵심적인 영향