From 034453c370f766385802b8a7e7b6f93d64988483 Mon Sep 17 00:00:00 2001 From: Martin Haye Date: Sat, 5 Oct 2013 10:41:26 -0700 Subject: [PATCH] Text done for part 4 of Big Blue. --- Docs/Tutorials/BigBlue/TaleOfBigBlue.md | 96 ++++++++++++++++++ Docs/Tutorials/BigBlue/blueOnScreen.png | Bin 0 -> 5554 bytes Docs/Tutorials/BigBlue/mipMap.gif | Bin 0 -> 11330 bytes .../Apple/virtual/src/raycast/genExpand.py | 2 +- 4 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 Docs/Tutorials/BigBlue/blueOnScreen.png create mode 100644 Docs/Tutorials/BigBlue/mipMap.gif diff --git a/Docs/Tutorials/BigBlue/TaleOfBigBlue.md b/Docs/Tutorials/BigBlue/TaleOfBigBlue.md index 6c313522..6ef2b659 100644 --- a/Docs/Tutorials/BigBlue/TaleOfBigBlue.md +++ b/Docs/Tutorials/BigBlue/TaleOfBigBlue.md @@ -330,3 +330,99 @@ B057- AD 11 AD LDA $AD11 ``` See all those 11's, 22's and other numbers at the end of these lines? Believe it or not those are actual pixel values! Originally in the template they were 00. So some code somewhere has filled them in. What code? We'll fill in that last missing piece next time, when we talk about texture scaling in the final chapter of Big Blue's biography. + + +Part 4: Scaling to the Finish +----------------------------- + +*Hey!* Check out the video screencast of part 4: TK + +In this last part of the story of Big Blue, let's fill in the missing piece: scaling from fixed size texture images to variable sized columns on the screen. + +Recall that our favorite pixel lives in an image, and that image is packed into a structure called a "mipmap". + +![Mipmaps](mipMap.gif) +http://en.wikipedia.org/wiki/Mipmap + +Big Blue's image was originally drawn at 64x64 pixels, but we also store half sizes, quarter sizes, so 32x32, 16x16, 8x8, 4x4, etc. This improves the quality of the output because complicated decisions about which pixels to keep and which to toss when going to a smaller size can be made at packing time instead of drawing time. + +So let's say we've figured out, using ray casting, that Big Blue's column should be drawn as the first column on the screen, and it should be 48 pixels high. Those 48 pixels, as discussed last time, need to be written into the bit blitting unrolled code, but how to do so? + +Our rendering engine adopts the strategy of always "scaling up", never down. This prevents annoying flickering as things move side-to-side, but you don't have to really understand why. + +Anyway we take the desired size, 48 pixels high, and pick the mip map level lower than that, 32x32 in this case, and scale it up. That means we'll be taking 32 pixels and scaling them up to make 48. Doing the math, that means each input pixel will produce 1.5 output pixels. Of course we can't really have fractional output pixels, so in practice half the input pixels will produce a single output pixel (resulting 16 pixels), and the other half will produce two output pixels (for 32 pixels), totaling 48 pixels. + +The trouble is that doing that calculation takes time, and we need to slam those pixels as fast as possible. So again we turn to the strategy of unrolling our code, this time taking it a ways further. A dirty little secret of the rendering engine is that it uses about 13 kbytes of code just for scaling! There is a dedicated subroutine for each possible column height. Let's look at the code for the one we're interested in, 48 pixels high. This is from the file ``expand.s``: + +```Assembly +; Produce 48 rows from 32 rows +expand_48: + jsr selectMip1 + jsr e_t40orotoo + jsr e_r45tooroto + jsr e_50rotooro + jsr e_t55orotoo + jsr e_r60tooroto + jsr e_65rotooro + jsr e_t70orotoo + jsr e_r75tooroto + jsr e_80rotooro + lda (pTex),y + iny + sta 85*BLIT_STRIDE + blitRoll,x + sta 86*BLIT_STRIDE + blitRoll,x + lsr + sta 87*BLIT_STRIDE + blitRoll,x + rts +``` + +The first thing it does is select mipmap level 1 (level 0 is 64x64, level 1 is 32x32). Then it calls a bunch of subroutines with funny names to do the work. Here's the first one: + +```Assembly +e_t40orotoo: + lda (pTex),y + iny + sta 40*BLIT_STRIDE + blitRoll,x + sta 41*BLIT_STRIDE + blitRoll,x + lsr + sta 42*BLIT_STRIDE + blitRoll,x + lda (pTex),y + iny + sta 43*BLIT_STRIDE + blitRoll,x + sta 44*BLIT_STRIDE + blitRoll,x + rts +``` + +To explain what this does: first we fetch a byte from the texture, and increment the pointer into the texture to prepare for a future fetch. ``lda (pTex),y``. Then we use ``sta`` to store that byte *twice* into the unrolled blit code, for lines 40 and 41 on the screen. Our input packs two pixels in each byte, and we get to the other one using ``lsr``. Then we fetch the next input pixel, and store it twice. See the pattern? 1 pixel -> 2 pixels, then 1 pixel -> 1 pixel. This will achieve 48 total output pixels from 32 input pixels. + +You'll notice the pixels are found in memory in vertical column order. That's because this is precisely the order we need to find them when we're drawing columns of pixels. + +The unrolled code for all heights is over 6,000 lines! Who wrote all that code? Not me. The scale-up code is produced *by a program* that does a better job than I ever could. Here's an excerpt. [Direct code link](https://github.com/badvision/lawless-legends/search?q=BigBlue4_10) + +```Python +# Now generate the controlling code [ref BigBlue4_10] +for (srcHeight, dstHeight, mipLevel, texOff, segs) in allHeights: + outFile.write("; Produce %d rows from %d rows\n" % (dstHeight, srcHeight)) + outFile.write("expand_%d:\n" % dstHeight) + outFile.write(" jsr selectMip%d\n" % mipLevel) + if (texOff != 0): + outFile.write(" ldy #%d\n" % texOff) + for i in range(len(segs)): + seg = allSegs[segs[i]] + if seg.refs == 1 and not(seg.generated): + seg.genCode(False) +... +``` + +And that's the full story of how Big Blue got from Seth's mind to the screen. In short: +- Seth mouse-clicked to put him into an image +- That image got packed into mipmaps on the Apple II +- We used ray casting to determine where on the screen to put Big Blue's column, and how high to make it. +- Based on the height, a mipmap level was chosen and the pixels replicated to scale up to the proper height, writing the results into the bit blitting code +- And finally, the bit blitter blended Big Blue's column with pixels from other columns and blasted them onto the screen. + +![Blue on screen](blueOnScreen.png) + +I hope you enjoyed this brief history of a little pixel that made it big. There have been an awful lot of concepts and code, so don't stress if it sink in. The goal is to give you an overview, a feeling, for what's involved, to pique your interest in some of the concepts involved, and to give you pointers into the code in case you want to explore further. + +Thanks for reading! \ No newline at end of file diff --git a/Docs/Tutorials/BigBlue/blueOnScreen.png b/Docs/Tutorials/BigBlue/blueOnScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..0310d95e12dd605f7971bb7c2fc41570b461c3fc GIT binary patch literal 5554 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 Jnq%iv{|6arqZa@G literal 0 HcmV?d00001 diff --git a/Docs/Tutorials/BigBlue/mipMap.gif b/Docs/Tutorials/BigBlue/mipMap.gif new file mode 100644 index 0000000000000000000000000000000000000000..ea704217f6a5669805a6aaf1fa9a20279466baea GIT binary patch literal 11330 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 ClpyE; literal 0 HcmV?d00001 diff --git a/Platform/Apple/virtual/src/raycast/genExpand.py b/Platform/Apple/virtual/src/raycast/genExpand.py index 35c42b28..f270726e 100755 --- a/Platform/Apple/virtual/src/raycast/genExpand.py +++ b/Platform/Apple/virtual/src/raycast/genExpand.py @@ -283,7 +283,7 @@ while len(segsToOpt) > 0: for dep in bestDeps: del segsToOpt[dep] -# Now generate the controlling code +# Now generate the controlling code [ref BigBlue4_10] for (srcHeight, dstHeight, mipLevel, texOff, segs) in allHeights: outFile.write("; Produce %d rows from %d rows\n" % (dstHeight, srcHeight)) outFile.write("expand_%d:\n" % dstHeight)