Playing Atari ST Music on the Amiga with Zero CPU
z303
105 points
38 comments
May 17, 2026
Related Discussions
Found 5 related stories in 89.2ms across 8,303 title embeddings via pgvector HNSW
- Soul Player C64 – A real transformer running on a 1 MHz Commodore 64 adunk · 106 pts · April 20, 2026 · 52% similar
- The Atari 800 – By Paul Lefebvre rbanffy · 12 pts · May 09, 2026 · 51% similar
- Martin Galway's music source files from 1980's Commodore 64 games ingve · 170 pts · April 25, 2026 · 49% similar
- A retro terminal music player inspired by Winamp mkagenius · 73 pts · March 23, 2026 · 47% similar
- Browser-based SFX synthesizer using WASM/Zig galsjel · 29 pts · March 27, 2026 · 46% similar
Discussion Highlights (6 comments)
anonzzzies
I was in a Dutch demo group first for msx and then amiga, then dropped out of low level dev; the amiga coprocessors I still miss. I went to PC as everyone did and definitely at the beginning thought: what is this garbage??? We lived in the future and then it was taken from us for a while.
bartread
I never had an Atari ST so wasn't familiar with the details of how its sound chip worked. I did know it was a variant of the AY chip found in the ZX Spectrum +2A, which I did own for a brief period after several years of 48K+ ownership. However, it's only as a result of reading this article that I realised the chip is only capable of generating square waves and noise, whereas I'd been under the impression it had some slightly more advanced FM synthesis capabilities. That impression must have come from, decades later, listening to what people could squeeze out of the chip on various Spectrum demos on YouTube. Well, that and the fact that after the 48K beeper the 128K was never going to sound less than incredible. I might not even have had it for a year before switching to the (much less prone to go wrong) C64[0]. Anyway, all of this to say: very interesting project, and I enjoyed the neat reversal trick with the attached voice to get the higher quality output out of Paula. [0] Actually the Spectrum -> C64 switch was more of a mixed bag than you might think - it wasn't, for example, like games on the C64 were all universally better. On the sound front, the C64's SID chip was a significant upgrade over the AY though, and certainly the most capable sound chip amongst 8-bit computers that I'm aware of. I really wish they'd crammed a SID chip into the Amiga alongside Paula. Or maybe even a dual SID with 6 channels for stereo output + Paula, but, alas... I'm sure it would have been cost prohibitive even if Commodore engineers had the idea at the time.
rigonkulous
This is such a delicious article for those of us who are 'retro-' computing enthusiasts. Made my Sunday cuppa shine! "In a way, this feature is similar to the YM2149 ADSR envelope. Not technically, but because both features are mostly ignored by Atari and Amiga programmers! :)" As an Oric-1/Atmos programmer, this line was especially juicy. Using PAULA's attached mode is so brilliant, btw. I love it when things of this nature are discovered, decades after the fact. We've had a few such revelations in the Oric world too, none as powerful of course at Orics' 1MHZ, but nevertheless, the shoulders of the Atari/Amiga giants are perilously within reach for the climb .. EDIT: Oh, COPPER and PAULA, paired at the bits. Such a great hack, this one ..
christkv
The no CPU Amiga demos was fantastic
indigodaddy
The demo linked at the bottom of the article: https://www.pouet.net/prod.php?which=104190 .. could it be run on something like PiMiga?
amiga386
Awesome! As an aside, the only code I know that uses Paula's attached mode (where one channel can modulate the volume or pitch of another) is the sound effect used in X-Copy. It sounds like this: https://youtu.be/2OG2tPx5gnU?t=22 and the code that generates that sound is this: PLAY_SAMPLE ; a6=_custom, d0=zero for high-pitch sound, nonzero for low-pitch sound move.w #$F00,d1 ; high pitch: period=$d00-$f00 if d0 == 0 tst.b d0 beq.s .high move.w #$7700,d1 ; low pitch: period=$7500-$7700 if d0 != 0 .high lea MODULO,a0 move.w #$200-1,d0 .down move.w d1,(a0)+ subq.w #1,d1 dbra d0,.down move.w #$200-1,d0 .up addq.w #1,d1 move.w d1,(a0)+ dbra d0,.up ; set up channel 2; whatever words this plays will ; be written to the period register of channel 3 move.w adkconr(a6),-(sp) ; save ADKCON state for later move.w #ADKF_SETCLR!ADKF_USE2P3,adkcon(a6) move.l #MODULO,aud2+ac_ptr(a6) move.w #$400,aud2+ac_len(a6) move.w #0,aud2+ac_vol(a6) ; no volume (no actual sound wanted!) move.w #$90,aud2+ac_per(a6) ; change period every $90 ticks lea SAMPLE,a0 ; set up channel 3 to play a simple square wave move.l #$7f7f8080,(a0) ; square wave: 127 127 -128 -128 ... move.l a0,aud3+ac_ptr(a6) move.w #2,aud3+ac_len(a6) move.w #DMAF_SETCLR!DMAF_AUD2|DMAF_AUD3,dmacon(a6) ; turn on sound DMA moveq #$40,d2 ; start with volume = 64 .vol move.w d2,aud3+ac_vol(a6) ; write channel 3 volume move.w #$600-1,d1 ; wait a bit 1$ move.b vhposr(a6),d0 2$ cmp.b vhposr(a6),d0 beq.s 2$ dbra d1,1$ subq #8,d2 ; repeat to fade bpl.s .vol moveq #0,d0 ; stop sound move.w d0,aud2+ac_len(a6) move.w d0,aud3+ac_vol(a6) move.w d0,aud3+ac_len(a6) move.w #DMAF_AUD2!DMAF_AUD3,dmacon(a6) move.w (sp)+,d0 ; restore ADKCON btst #ADKB_USE2P3,d0 bne.s .keepon move.w #ADKF_USE2P3,adkcon(a6) .keepon rts section 2,bss,chip SAMPLE ds.w 2 MODULO ds.w $400