CPU 부하 0% 달성: Amiga에서 Atari ST 음악 에뮬레이션

Amiga와 Atari ST 사이의 경쟁은 1980년대 컴퓨팅 시대의 핵심이었지만, 두 시스템의 오디오 기능 간 기술 격차는 뚜렷했습니다. Amiga의 PAULA 칩은 고급 PCM 샘플 재생을 제공한 반면, Atari ST는 주로 사각파와 노이즈를 생성할 수 있는 YM2149에 의존했습니다.

대부분의 개발자에게 한 시스템을 다른 시스템에 에뮬레이션하는 것은 상당한 CPU 오버헤드를 요구했습니다. 그러나 개발자 Leonard (z303)의 최근 프로젝트는 하드웨어 활용의 모범 사례를 보여주며, Motorola 68000에서 정확히 0% CPU 부하로 Amiga에서 Atari ST 음악을 완전 에뮬레이션했습니다. 이는 무리한 소프트웨어 에뮬레이션이 아니라, 원래 설계자가 의도하지 않았을 가능성이 높은 Amiga 자체 커스텀 하드웨어를 재활용함으로써 달성되었습니다.

도전 과제: CPU 사이클 vs. 오디오 충실도

데모 씬에서는 모든 CPU 사이클이 귀중한 자원입니다. 50 FPS로 화면에 수천 개의 점을 그리는 “sin-dots” 렌더링 기록을 깨려 할 때, Motorola 68000은 그래픽 파이프라인에 전적으로 할당되어야 합니다.

이전의 Atari 음악을 Amiga에서 재생하려는 시도는 프레임 시간의 약 50%를 소모했습니다. 이는 SID 보이스, Sync Buzzer, Digidrum과 같은 현대 Atari 효과를 정확히 재현하려면 사운드 칩뿐 아니라 Atari의 하드웨어 타이머까지 에뮬레이션해야 하기 때문입니다. 이 오버헤드를 없애기 위해 Leonard는 전체 오디오 처리를 Amiga의 커스텀 칩에 오프로드하는 방법을 모색했습니다.

하드웨어 격차 이해하기

이를 해결하려면 먼저 두 칩 사이의 근본적인 차이를 이해해야 합니다:

  • YM2149 (Atari): 사각파를 생성하는 세 개의 음성, 의사 난수 노이즈 생성기, 그리고 기본 하드웨어 볼륨 엔벨로프를 갖춘 단순한 칩.
  • PAULA (Amiga): PCM 샘플 재생 칩. 사각파나 엔벨로프를 직접 지원하지 않으며, 메모리에서 8비트 부호형 샘플을 재생합니다.

초기에 해결책은 간단해 보였습니다: 사각파 한 주기를 메모리에 저장하고 PAULA로 루프 재생하는 것이었습니다. 이는 초기의 단순한 Atari 게임에서는 작동했지만, 이후 Atari 사운드트랙의 풍부하고 공격적인 음색을 포착하는 데는 실패했습니다.

“MadMax Buzzer”와 YM 엔벨로프 트릭

1980년대 후반, Jochen Hippel (MadMax)과 같은 뮤지션들은 YM2149의 허점을 발견했습니다. 이 칩은 모든 음성에 공유되는 단일 볼륨 엔벨로프 생성기를 가지고 있었습니다. 볼륨을 변조하는 대신, 그들은 엔벨로프를 그 자체가 사운드 소스로 사용했습니다.

엔벨로프 주파수를 가청 범위로 설정하고 약간 튜닝이 맞지 않은 사각파와 결합함으로써, 그들은 비공식적으로 “MadMax Buzzer”라 불리는 복잡하고 스윕하는 파형을 만들었습니다.

PAULA의 “Attached Voice” 모드 활용

이를 Amiga에서 재현하기 위해 Leonard는 PAULA 칩의 잘 알려지지 않은 기능인 Attached Voice mode를 활용했습니다. 이 모드에서는 하나의 PAULA 음성을 다른 음성의 주기나 볼륨을 변조하는 데 사용할 수 있습니다. 이 기능은 상업 게임 산업과 대부분의 데모 씬에서 거의 무시되었습니다.

첫 번째 시도: 거친 파형

초기 계획은 세 개의 PAULA 음성을 사각파에 사용하고 네 번째 음성을 볼륨 변조기로 사용해 YM 엔벨로프를 시뮬레이션하는 것이었습니다. 그러나 중요한 하드웨어 제한이 나타났습니다: 첨부 모드에서는 볼륨 변조 데이터가 오디오 샘플 재생 속도의 절반으로 동작합니다.

Audacity에서 출력을 분석했을 때 결과는 “거친” 것이었습니다. 엔벨로프의 부드러운 삼각형 형태가 많은 중간 볼륨 값이 건너뛰어져 사라졌고, 그 결과 거칠고 저해상도 사운드가 되었습니다.

“유레카” 순간: 역할 전환

돌파구는 직관에 반하는 전환에서 나왔습니다. 저해상도 변조기를 사용해 엔벨로프 형태를 정의하는 대신, Leonard는 역할을 바꾸었습니다:

  1. The Sample: 삼각형 엔벨로프 형태를 고해상도 8비트 PCM 샘플로 저장했습니다.
  2. The Modulator: 사각파를 16비트 변조기 형식으로 저장했습니다.

사각파는 두 상태(높음과 낮음)만 전환하므로 고해상도가 필요하지 않습니다. 사각파를 변조기로, 삼각형을 샘플로 사용함으로써, MadMax Buzzer의 고충실도 스윕 사운드가 완벽히 보존되었습니다.

진정한 0% CPU 부하 달성

오디오 로직을 해결했음에도 매 프레임마다 PAULA 레지스터를 업데이트하려면 여전히 약간의 CPU 개입이 필요합니다. 절대적인 0% CPU 사용량에 도달하기 위해 Leonard는 Amiga의 전용 코프로세서인 COPPER를 활용했습니다.

COPPER68000과 병렬로 동작하며 화면 위치에 따라 임의 값을 모든 커스텀 칩 레지스터에 기록할 수 있습니다. 각 음악 프레임마다 작은 COPPER 리스트를 미리 생성하고 이를 체인으로 연결함으로써, 음악 재생은 완전 자동 하드웨어 프로세스가 됩니다.

그 결과 Motorola 68000은 전혀 사용되지 않았습니다. 이는 개발자가 sin-dots 기록을 6,682점에서 7,210점으로 늘릴 수 있게 했으며, CPU는 이제 100% 그래픽에 전념했습니다.

유산과 통찰

이 프로젝트는 레트로 컴퓨팅에서 반복되는 주제, 즉 원래 기계가 퇴역한 수십 년 후에 “숨겨진” 하드웨어 기능을 발견하는 사례를 강조합니다. 커뮤니티가 언급했듯이, Amiga의 커스텀 칩은 현대 PC 아키텍처에서 종종 놓치는 수준의 병렬 처리를 제공했습니다.

초기 소프트웨어인 X-Copy에서 특정 사운드 효과를 위한 첨부 보이스 사용이든, Atari ST에서 엔벨로프를 창의적으로 남용했든, 이러한 해킹은 가장 우아한 해결책이 종종 하드웨어를 원래 의도와 다르게 활용함으로써 나온다는 것을 보여줍니다.

Sources