Moving something around the screen needs to be fast, and drawing each line pixel by pixel isn’t going to cut it. This is where bitmap graphics comes in. Basically, drawing out the pictures pixel by picture before hand, keeping it in memory then copying it to the write spot on the screen for each frame of the movement.
We can do this with block moves over data, but can only move blocks of sequential data. Each line (even if they were in sequential order on the screen) is at a different memory location. Pixels byte 2 on line 2 are not sequential with byte 2 on line 3. So, we can only block move in one line of the image at time. To complicate things we need to figure out where in memory each line starts since they are not in order.
We can do a couple of ways. Compute the start address of the line, which will take a lot of instructions include division and multiplication (remember we’re on an 8-bit machine here at 1Mhz) or we can do look up tables. A lookup table is basically a list of 192 addresses (the number of lines in Hi-Res) in line order. that we can index into with our Y coordinate. Takes up 384 bytes of memory, but saves us a bunch of time.
Here is the formula from the book:
Needless to say, I went through and wrote something to dump out all the line addresses and generated the lookup table. You’ll notice “SN” above referring to Hi-Res page 1 or 2. The Apple ][ screen has two pages, only one of which can be visible at a time. To avoid flickering images when moving them, it’s a common (not trivial) to erase/redraw on the page not being displayed, then switch which page is visible, then repeat.
Then I took a bitmap example from the book and wanted to get it moving across the screen. Since I’m learning here and wanted to do it the right way, I decided to also do the page flipping.
You can see my first attempt:
It’s not the cleanest, but not too bad. At least it moves and I can tell the pages are flipping (the garbage at the bottom).
But, notice that it’s moving jerky. That’s because I’m moving it a whole byte (7 pixels) each frame instead of moving individual pixels. That’s going to take some more work, but at least we have movement. Baby steps.