mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-12-30 22:32:48 +00:00
597e5daaa1
also, won second prize
69 lines
2.5 KiB
Plaintext
69 lines
2.5 KiB
Plaintext
KFEST18 SUPER RASTERBAR 2K DEMO
|
|
by deater (Vince Weaver) vince@deater.net
|
|
http://www.deater.net/weave/vmwprod/kfest18/
|
|
|
|
Written for the Kansasfest Hackfest. Won 2nd place.
|
|
|
|
I started work on this on the morning of Wed Jul 18th and finished
|
|
early in the AM on Saturday July 21st.
|
|
|
|
NOTE: If you run the demo and the sound is scratchy and/or the graphics
|
|
corrupted, reboot until it works. Sometimes the vapor-lock doesn't
|
|
happen like it should and I'm not sure why.
|
|
|
|
|
|
How it works:
|
|
The Apple II lo-res mode is usually limited to 40x48 mode.
|
|
|
|
However, there are two graphics pages that can be flipped
|
|
between with a soft-switch.
|
|
|
|
If you switch between page0 and page1 at just the right time
|
|
(every 2 scan lines) you can create a pseudo 40x96 graphics
|
|
mode, using all 15 lo-res colors.
|
|
|
|
This is *not* double lo-res (that requires 128k of RAM + IIe
|
|
and is an 80x48 graphics mode). This mode in theory will
|
|
work on an original II.
|
|
|
|
Of course there's no VBLANK notification or HSCAN interrupts
|
|
on Apple II. So you have to read the "floating bus" to find
|
|
out when a scan line begins, and then count cycles to find
|
|
out where to switch things.
|
|
|
|
All the calculations for the raster bar, mockingboard sound,
|
|
and scrolling text are done during the 4550 cycles of VBLANK.
|
|
|
|
To save space, only two channels of audio are played.
|
|
|
|
More technical info:
|
|
|
|
I made the music from the sheet music using a weird text-editor
|
|
based tracker I've written. There's a one off conversion tool
|
|
in my separate vmw-meter.git repository called "ym5_to_kf"
|
|
that takes the generated ym5 and strips it down for the demo.
|
|
|
|
I did not do any size optimization at all, in fact the opposite
|
|
as I am cycle counting here, so lots of time spent wasting cycles
|
|
so both sides of branches match up. Also on 6502 if a branch
|
|
crosses a page boundary it takes a cycle penalty, so to simplify
|
|
things I have .align codes all over.
|
|
This doesn't matter though because I compress with qkumba's lz4
|
|
and that forgives many sins.
|
|
|
|
For the timing loops, I have a simple nested timing loop with X and Y.
|
|
I have a C program I use that I input how many cycles I want and it
|
|
prints all possible options with 10 cycles or so. If no exact match
|
|
is possible I pad with NOPs or similar to get the right amount.
|
|
|
|
This was all written in 6502 assembly, using ca65 asm on Linux
|
|
and tested in AppleWin running under wine.
|
|
|
|
Greets:
|
|
|
|
Code by: deater (Vince Weaver)
|
|
LZ4 code: qkumba
|
|
Music: Muda Kingdom from Super Mario Land (gameboy) by Hirokazu Tanaka
|
|
transcribed from sheet music by G-Han
|
|
|