Zero CPU Overhead: Emulating the Atari YM2149 on the Amiga

Zero CPU Overhead: Emulating the Atari YM2149 on the Amiga

Amiga 與 Atari ST 之間的競爭是早期運算史上最具定義性的時代之一,這種競爭經常體現在「demo scene」中,程式設計師們將硬體性能推向極限。在最近的一次技術挑戰中,開發者 Leonard 試圖在 Amiga 500 上打破「sin-dots」渲染紀錄——這項壯舉需要利用每一個可用的 CPU 週期來最大化螢幕上繪製的點數。

為了在挑戰中增添一層諷刺意味,Leonard 決定在嘗試打破紀錄的同時播放 Atari ST 的音樂。然而,模擬 Atari 的 YM2149 音效晶片通常是非常耗費 CPU 的,往往會消耗高達 50% 的影格時間。為了達成新紀錄,他需要一種能夠以零 CPU 開銷(zero CPU overhead)播放這些音樂的方法。解決方案在於對 Amiga 的自定義硬體進行創意性的利用:PAULA 音訊晶片與 COPPER 協處理器。

The Hardware Gap: YM2149 vs. PAULA

要理解這項挑戰,必須首先了解這兩種音效晶片之間的根本差異:

  • The YM2149 (Atari ST): 一款相對簡單的晶片,能夠產生三路聲道(voices)的正弦波(square waves),以及一個偽隨機雜訊產生器和一個基礎的硬體音量包絡線(volume envelope)。
  • PAULA (Amiga): 一款更先進的 PCM 採樣播放晶片。它可以從記憶體中播放四路獨立的 8-bit 有符號採樣,每一路都有自己的播放速率與音量,但它本身並不原生支持正弦波或硬體包絡線。

最初的方案看起來很簡單:將單個正弦波週期作為採樣存儲在記憶體中,並使用 PAULA 進行循環播放。雖然這對簡單的曲調有效,但無法捕捉到進階 Atari 音樂中那種複雜且具侵略性的音色。

Decoding the "MadMax Buzzer"

到了 1980 年代後期,像 Jochen Hippel (MadMax) 這樣的 demoscene 音樂家發現了一種方法,可以透過誤用 YM2149 的音量包絡線來創造豐富且具掃描感的聲音。他們不再使用包絡線來調節正弦波的音量,而是將包絡線「作為」聲源。

透過在可聽頻率下啟用三角形包絡線,並同時播放一個音調略微失諧的正弦波,YM2149 會產生一種複雜且不斷變化的波形。這種「MadMax Buzzer」效果是傳奇 Atari 配樂中的經典元素,但使用標準的 PCM 播放很難複製。

The PAULA "Attached Voice" Hack

Leonard 在 PAULA 硬體手冊中發現了一個冷門功能: 「attached」聲道模式。在此模式下,一個 PAULA 聲道可以用來調節另一個聲道的週期(period)或音量。這在概念上與 YM2149 的包絡線相似,儘管在 Amiga 的遊戲或 demo 中很少使用,因為它會消耗一個珍貴的硬體聲道。

最初的嘗試是使用一個聲道作為三角形波調製器,來調節正弦波聲道的音量。然而,這導致了「顆粒感」很重的音訊。因為 attached 聲道模式每兩個輸出採樣點之間才更新一次音量值,三角形波的解析度太低,導致聲音中出現了可聽見的階梯感。

The "Eureka" Moment: Reversing the Roles

為了解决解析度問題,Leonard 意識到他可以反轉調製器與採樣的角色的。他不再使用低解析度的音量調製器來驅動高解析度的正弦波,而是改用:

  1. The Sample: 一個高解析度的 8-bit PCM 三角形波。
  2. The Modulator: 一個低解析度的正弦波,作為音量調製器。

因為正弦波只在兩個狀態(開啟與關閉)之間切換,所以它不需要高解析度。這種反轉完美地模擬了 MadMax 效果,同時保持了高音質,且完全符合 PAULA 晶片的限制。

Achieving Zero CPU Load with the COPPER

即使使用了 PAULA hack,Motorola 68000 CPU 仍需在每一影格更新暫存器以改變音符與音量。為了達到真正的「零 CPU」,Leonard 轉向了 COPPER——這是一個與 CPU 平行運行的協處理器。

COPPER 可以將立即值(immediate values)寫入任何自定義晶片暫存器,並等待特定的螢幕位置。透過預先生成一系列微小的 COPPER lists(每一影格一組),並將它們串聯起來,音樂播放變得完全自主化。COPPER 處理了所有的 PAULA 暫存器更新,讓 68000 CPU 的負載維持在 0%。

Results and Legacy

透過將音樂完全卸載到 COPPER 與 PAULA,Leonard 可以將每一個 CPU 週期都投入到 sin-dots 效果中。結果創下了新的紀錄,達到 7,210 dots,顯著超越了以往 6,682 的紀錄。

這個專案突顯了復古運算中一個不斷出現的主題:在機器發布數十年後,重新發現「未記錄」或被忽視的硬體功能。正如一位社群成員所言:

"I love it when things of this nature are discovered, decades after the fact... the shoulders of the giants of the Atari/Amiga era are perilously within reach for the climb."

透過硬體考古學與創意的信號處理技術,Amiga 被賦予了歌唱 Atari 歌曲的能力——而 CPU 完全不知道這正在發生。

Sources