From 188b30e4d99b6023d41ff12704ea4f700ce4aa36 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Fri, 19 Oct 2018 11:40:29 -0400 Subject: [PATCH] megademo: add beginning of writeup --- megademo/writeup/writeup.txt | 181 +++++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 megademo/writeup/writeup.txt diff --git a/megademo/writeup/writeup.txt b/megademo/writeup/writeup.txt new file mode 100644 index 00000000..650a3634 --- /dev/null +++ b/megademo/writeup/writeup.txt @@ -0,0 +1,181 @@ +Notes on the MEGADEMO + + +Finding HBLANK/VBLANK on the Apple II: + + To do fancy mode switching, we need to switch graphic modes + (by writing to a soft-switch address) at the exact time we want + to switch modes. + Finding this is difficult on the original Apple II. + Unlike other machines, + there is no register or interrupt that tells where the scan + currently is. (Later IIe, IIc and IIgs models do add such a + register, but each is incompatible with the others) + + The way this is found is to use a weird quirk of the Apple II: + the "floating bus". If you read from a softswitch that doesn't + drive the bus, you get back the last value written due to the + residual capacitance on the bus lines. The Apple II writes the + display each half cycle, so the values on this bus are the last + written video display value. + By drawing a pattern on the screen you can repeatedly read + this floating bus and figure out where on the screen you are, + and then calculate from there. + + This is a well known feature of the bus (it was described + in the early 80s by at various times Bishop, Sather and Lancaster) + but was not widely used, partly because it was a pain to do, + but also because Apple made no guarantees this accidental + behavrior would continue to be available. + +Cycle counting on the 6502: + + Cycle counting on an old 8-bit chip is a lot easier than on + modern hardware, as the cycle counts are mostly deterministic + (unlike a modern system that has out-of-order, caches, etc). + + There are some issues that can get you: + * Conditional branches, taken take 3 cycles, not-taken 2 cycles. + * Some load/store instructions can take an extra cycle if the + indexing crosses a 256-byte boundary. This means your code + might suddenly take longer if it ends up misaligned. + * Branches also take longer if they cross a 256-byte page boundary. + * The 65C02 chip found in newer Apple IIs have some timing + differences from the NMOS 6502. One that is easy to get + caught on is using JMP indirect (used for jump tables). + There is a workaround for jump tables by pushing the value + to be jumped onto the stack and then doing a "rts" return + instruction to jump to it. + + +Notes on each screen: + ++ Opening C64 screen + + HGR/Text split. The curtain opening effect isn't as great as + it could be. The fastest you can switch modes on the II is + 4 cycles, and in 4 cycles 28 pixels are output in hiresmode + (4 text chars wide). + ++ Falling Apple II + This is done in the 40x96 forced lores mode, where it switches + between the two lo-res pages halfway through to double the + vertical resolution. + + This was supposed to scroll into place but that got sidetracked, + especially as it's not possible to copy a full 1k lores screen + in 60Hz. + ++ Incoming Message + This flips between page1/page2 again, but in text mode which allows + faking some lowercase looking characters on the original Apple II + which has no lowercase support. Things like lowercase O can be + made with the bottom half of an 8. Unfortunately the split to + get "o" makes it not possible to get things like umlauts using + ". + + One tricky thing here is between the Apple II and the IIe + they changed how font generation worked and all the characters + were shifted up one vertical line. To fix that the demo + detects the newer hardware and self-modifies the code to work + on both. + + This screen also does a Text/lores split + ++ Starring + The first part is flipping between Lores Page1/Page2 and Hires Page1 + to create a cheap animated effect. + + In theory the hires colors are a subset of lores so you can make + exact matches, but in practice the generation in those modes is + off a bit so the text shifts a bit. + In theory you could add in Hires Page2 as well to get 4 frames, + but that would take another 8k of memory which we can't afford. + + The timing code for this is the only place where I actually do + the trick of jumping into the middle of a BIT instruction + which gets interpreted as a harmless nop for timing reasons. + ++ Cast of characters + This is a Lores/Hires split, with some fancy copying from offscreen + memory to do the name flip. + ++ Leaving + This has a split of text on top, lores on bottom. + + These animated scenes are actually harder than some of the others. + Any time you have if/then/else type setups, you have to make + sure both branches (then vs else) take the *exact* same number + of cycles, and that's difficult to do. + So little scenes with a lot of movement in complex directions + quickly become a pain. + ++ Bird in front of Mountain + + This is a text/hires/lores three-way split with some animation + of sprites going on. + The sprites take different amounts of time to draw depending + on the pattern so the code has to account for this. + + The text scrolling is actually fairly easy to do, no real + tricks with that. + ++ Waterfall + + This effect does some tricky lores 1/2 shifting ot where + the split happens to create an automated water effect, and + there are gaps which give a fake transparency effect when + the sprite walks behind the waterfall. + + This code wasn't too awful to write, but making it small + using self-modifying code. + ++ Rocket Takeoff + + HGR/GR split, though it's subtle, but notice how the top + of the rocket's tail has a smooth diagonal. + + Again scripting these behavios cycle exact is a pain with + state-machines, jump-tables, and self modifying code at times. + ++ Mode7 flying + + This is a SNES-style mode7 pseudo-3d effect. If you're + interested in how this works see my PoC||GTFO 0x18 article. + ++ Saturn flyby + + This is a TEXT/GR/HGR, but the GR/HGR part is mid-screen to + give sort of a tiered look. + It is tricky to do this on the fly. + The original goal was to have the rasterbars coming in + be 40x96 mode giving a much more impressive look, but it turns + out switching HIRES to LORES and also PAGE0 to PAGE1 at the + same time takes too many cycles. + It might still be possible to do this effect if the HGR picture + was mirrored in both PAGE1 and PAGE2, but we are using PAGE2 for + code and don't have the room to do this. + ++ Arrival + Very similar to the leaving. + There are more effects I'd like to do but ran out of time. + ++ Fireworks + This is a HIRES/LORES split, but with the bottom of the screen + doing interlaced every-other line LORES to give the gradient + effect. + The code is based on a BASIC program by Fozztexx which was modified + to have custom random routine, and also a deterministic HPLOT + (hi-res plot) routine. The original code used HPLOT TO (to draw + lines in some cases) but making that deterministic was too much + of a hassle and was left off. + The interleaved text scrolling effect looks nice and came more + or less for free (well, for twice the string data). + + +Other notes: + Hires apple graphics conversion uses the BMP2DHR util by + Bill Buckels which has knowledge of the weird Apple II hires + modes so does a better job than a regular paint program would. + +