dos33fsprogs/demos/kfest2018
..
delay_a.s
kfest18.dsk
Makefile
muda.tfv
raster2.s
raster_decompress.s
raster.s
README
vapor_lock.s

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