GN⁺: 잘못된 68030 명령어로 인해 Mac Classic II 부팅 허용 사고
(downtowndougbrown.com)68030의 잘못된 명령어가 Mac Classic II의 부팅을 가능하게 한 이야기
- Apple은 Macintosh Classic II의 ROM에서 실수를 저질렀고, 이는 부팅을 방해할 수 있었음. 그러나 Motorola MC68030 CPU가 정의되지 않은 명령어를 실행하여 충돌을 방지하고 부팅을 성공시킴.
MAME와 Mac 에뮬레이션
- MAME는 다양한 아케이드 게임을 지원하는 에뮬레이터로, 68000 기반 Mac 모델의 가장 완전한 에뮬레이터 중 하나로 평가받음.
- 필자는 MAME를 사용하여 Mac Classic II의 문제를 해결하고자 했으며, 24비트 주소 모드에서는 정상적으로 부팅되지만 32비트 주소 모드에서는 부팅이 실패함.
24비트 vs 32비트 주소 모드
- Motorola 68000 프로세서는 24개의 주소 라인을 가지고 있었고, Apple은 여분의 8비트를 플래그 저장에 사용함.
- 새로운 기계와 프로세서는 32비트 주소 공간을 지원했으며, 이로 인해 호환성 문제를 해결하기 위해 두 가지 모드를 제공함.
문제의 원인 분석
- MAME에서 Classic II가 32비트 모드에서 부팅 실패하는 이유를 찾기 위해 디버거를 사용하여 코드를 추적함.
- Apple의 기술 문서에 따르면, 0000000F은 예외가 발생했음을 의미하고, 00000001은 버스 오류를 나타냄.
ROM 코드 분석
- ROM의 코드에서 잘못된 주소에 접근하는 명령어를 발견함.
- 이 명령어는 A1 레지스터에 잘못된 주소를 저장하고, 이로 인해 Sad Mac 오류가 발생함.
하드웨어와의 차이점
- 실제 하드웨어에서는 잘못된 명령어가 A1의 값을 변경하여 유효한 주소로 만듦.
- MAME의 에뮬레이터는 이 명령어를 제대로 처리하지 못해 A1이 잘못된 주소를 유지함.
결론
- Apple은 Classic II의 ROM에서 발생할 수 있는 버그를 인지하지 못했으며, 68030의 잘못된 명령어가 이를 숨기고 있었음.
- MAME는 이 문제를 해결하기 위해 ROM의 버그를 패치하여 Classic II가 부팅되도록 함.
- 이 사례는 에뮬레이터가 하드웨어에 대해 새로운 사실을 발견할 수 있음을 보여줌.
Hacker News 의견
-
MC68030의 문서화되지 않은 명령어를 발견한 경험을 공유함. 이 명령어는 A1 레지스터의 값을 변경하고 읽기-수정-쓰기 버스 사이클을 수행함
- 이 명령어는 CPU 설계자가 의도적으로 만든 것이 아니라 불법 명령어일 가능성이 있음
- CPU는 일반적으로 불법 명령어를 감지하고 예외를 발생시킴. 그러나 특정 상황에서는 예외가 발생하지 않을 수 있음
- MC68030 설명서에 따르면 불법 명령어는 유효한 명령어의 비트 패턴과 일치하지 않는 비트 패턴을 포함함
- 설명서에 따르면 명령어는 3단어로 구성되며, 첫 번째 단어는 정상적이고 두 번째 단어에서 이상한 비트가 발생함
-
CAS 명령어의 에뮬레이션에 대한 버그 보고가 많았음을 언급함
- King of Fighters에서 SBCD 명령어의 캐리 플래그를 잘못 체크한 버그를 기억함
- SNK는 68000 칩의 신과 같았음
-
과거 Amiga 2000과 68000 프로세서에 대한 추억을 공유함
- 68020, 68030, RISC 아키텍처에 대한 흥분을 언급함
- 현재는 자연어로 컴퓨터와 대화할 수 있는 시대가 되었음을 강조함
-
대부분의 CPU에는 문서화되지 않은 명령어가 있으며, 68k도 예외가 아님
- 당시 많은 사람들이 x86/PC에 집중했으며, 이는 더 개방적이고 안정적인 아키텍처였음
- 8088과 8086의 마이크로코드가 해체되고 연구되었음
-
MC68030의 문서화되지 않은 명령어의 정확한 동작을 이해하기 위한 시도가 필요함
- A1의 결과 값이 원래 A1 값, A7 값, 프로그램 카운터에 따라 달라질 수 있음
- MAME는 이 버그를 ROM에서 패치하여 Classic II가 부팅되도록 함
-
Mac 디버거 UI의 효율성에 감탄함
- Amiga의 변환 속도를 높이지는 못할 것임
-
이 명령어가 복사 방지 목적으로 사용되었는지, 모든 68030에서 발생하는지 궁금해함
- 현대 Mac에서는 불가능할 것 같음. Apple의 기술 문서가 요즘은 좋지 않음
-
'040/060도 이 "문서화되지 않은 명령어"를 지원하는지 궁금해함