Another RSync - another demo.
I made "RUBBUR"
Released at RSYNC 2026
- Source code
- on Demozoo
- on Pouet
- on YouTube
The starting point was this track I made in Ableton Live.
I was playing around with the very nice "The Mouth" VST plugin, not knowing what I was doing, and suddenly out came this funky wobble bassline with this rubbery synth on top.
I couldn't reproduce it if I wanted too, haha.
I made a track around it and was bobbing my head on the beat.
Bam! demo idea!
I had been exploring the Amiga hardware recently, from a software developer point of view, trying out what you can do with BPLCON1 etc (Hey! you can set the horizontal offset for the odd and even planes seperately! cool!) and finally wrapped my head around how to use switching bitplane pointers each scan line to do all these vertical stretching and scrolling things you see so often in amiga demos.
After converting the song to tracker format, it turned out the be HUGE (in terms of diskspace) and I had quite a hard time trimming it down. I allready had build some batch-sample squuzing features in my own BassoonTracker, but OpenMPT - the swiss army knife for tracker files - has a much more finer control - and proved to be the perfect tool to get the size down, obviously in exchange for some audio quality, but hey ... it's Amiga! It can be crunchy!
I landed on 290kb for the tune. Still large, but doable.
Here's the tune in Bassoontracker
Vamos
Another thing I discovered is vamos - it's kind of like Wine (the windows emulator, not the drink) but then for Amiga.
It allows you to run Amiga command line applications directly on Windows or Mac at lightning speeds.
And low and behold! It works perfectly fine with the SAS/C compiler.
Sweet!
Now I can compile for Amiga on all platforms using the exact same compiler and setup, without have to spin up an Amiga Emulator.
Build System.
Having fast iteration times make all the difference.
I ended up using this "autorun" setup.
On the amiga side, I run this script.LAB loop
IF EXISTS run.flag
DELETE run.flag
smake
a
ENDIF
WAIT 1 SEC
SKIP loop BACK
This checks for a file: "run.flag", and if it exists, it compiles and runs the program.
Then, my mac/windows listens for file changes and writes this "run.flag" file.
The Amiga picks it up, compiles and runs the demo.
So, whenever I save a file, a second later, the program runs on Amiga.
cool!
And I was pleased to find I'm getting more fluent at writing C.
I don't mean "better", per se, but at least I wasn't fighting compiler and syntax errors all the time, so I could focus on getting something done, not HOW to get it done.
And - hip hip hooray! - I made the step to actually include some assembler code in my project.
Baby steps, but it's a plasma like effect that ran far too slow in C.
I still can't believe that actually worked. Yay!
So now I have a good example how to move performance critical code to a assembler function and call that function from C.
Nice!
To recap:
Things I learned
- how to flip an image horizontally using code
- how to use functions in assembler to speed up operations and call them from C
- how to scroll a screen horizontally
- how to use vamos to run the SAS/C compiler on osX and windows
- I moved from shrinkler to cranker for compression. Shrinkler compresses better, but cranker is faster to decompress.
- in the end, I avoided compression alltogether. If all assets fit on a single floppy, it's simpeler and visualy nicer to keep them uncompressed.
- another thing I figured out but did't use, was how to use the assembler INCBIN thing to include binary data in the executable. Good to know if I ever want a single file demo. For now, the approach to have a light startup exe to display a loading screen and post-load the data is fine.
Things I want/need to improve in future productions
- get a hold of timing ... Sync is all over the place and behaves differently on different machines. No doubt my code is still too slow, but at the VERY least I should measure how many cycles each part of the code takes. This is the reason why most effects run a bit faster on a 1200. I beat-synced the thing to be in sync on my machine, but the timing will be slighty of on other machines. This sucks ... To be improved in the next production.
