![]() |
Sprites |
Every sprite record, 78 of them end to end from SPRITE0 to the first instruction of the game at START. Each is drawn from its own bytes the way the drawing code (CALC_PIXEL_XY_AND_RENDER) reads them: a width byte (bits 0-3 the width in bytes), a height byte, then a mask byte and an image byte for each byte of each row, the bottom row first. Where the mask is set the background is cleared, and the image is laid in wherever it is set -- so an image bit shows whether or not the mask is set, a mask bit with no image is black, and where both are clear the background shows through (here, the blue-grey). This is Knight Lore's format (see Knight Lore's sprites).
Bits 6 and 7 of the width byte say whether the bytes are stored mirrored or upside down at the moment: VFLIP_SPRITE_DATA turns a sprite round in place, rewriting its bytes and toggling the bits, whenever it is drawn for an object facing the other way. On the tape every sprite is stored the right way round, with both bits clear, which is how they are drawn here.
Beside each are the graphic numbers that name it (a graphic is an object's first byte, looked up in GRAPHICS); see every graphic for what each is. One record no graphic number reaches: $88B3, which the game never draws. The first record, width and height both zero, is the empty sprite graphics 0 and 1 name; the drawing code sees the zero and draws nothing (FLIP_SPRITE).
| Sprite | Entry | What it shows | Size | Width byte | Graphics |
|---|---|---|---|---|---|
| SPRITE0 $792F | nothing | 0 by 0: nothing is drawn | $00 | 0-1 | |
| SPRITE131 $7931 | a small domed pod on a round base | 24 by 20 pixels; 122 bytes | $03 | 131 | |
| SPRITE85 $79AB | a tub of oil, on feet | 40 by 35 pixels; 352 bytes | $05 | 85 | |
| SPRITE130 $7B0B | a spiky ball | 32 by 23 pixels; 186 bytes | $04 | 130 | |
| SPRITE129 $7BC5 | a round thing with prongs | 24 by 25 pixels; 152 bytes | $03 | 129 | |
| SPRITE124 $7C5D | a little domed robot with feelers | 24 by 24 pixels; 146 bytes | $03 | 124 | |
| SPRITE125 $7CEF | a little domed robot with feelers | 24 by 24 pixels; 146 bytes | $03 | 125 | |
| SPRITE126 $7D81 | a little domed robot with feelers | 24 by 24 pixels; 146 bytes | $03 | 126 | |
| SPRITE127 $7E13 | a little domed robot with feelers | 24 by 24 pixels; 146 bytes | $03 | 127 | |
| SPRITE122 $7EA5 | a box with an arrow on its lid | 32 by 29 pixels; 234 bytes | $04 | 122 | |
| SPRITE123 $7F8F | a box with an arrow on its lid, the other way | 32 by 29 pixels; 234 bytes | $04 | 123 | |
| SPRITE118 $8079 | a clockwork mouse | 24 by 26 pixels; 158 bytes | $03 | 118 | |
| SPRITE116 $8117 | a clockwork mouse | 24 by 26 pixels; 158 bytes | $03 | 116 | |
| SPRITE117 $81B5 | a clockwork mouse | 24 by 26 pixels; 158 bytes | $03 | 117 | |
| SPRITE119 $8253 | a clockwork mouse | 24 by 26 pixels; 158 bytes | $03 | 119 | |
| SPRITE120 $82F1 | a domed column of rings | 24 by 30 pixels; 182 bytes | $03 | 120 | |
| SPRITE121 $83A7 | a domed column of rings | 24 by 30 pixels; 182 bytes | $03 | 121 | |
| SPRITE82 $845D | a hammer | 32 by 16 pixels; 130 bytes | $04 | 82 | |
| SPRITE81 $84DF | a glove | 32 by 18 pixels; 146 bytes | $04 | 81 | |
| SPRITE80 $8571 | sparks | 24 by 11 pixels; 68 bytes | $03 | 80 | |
| SPRITE83 $85B5 | a hook | 40 by 17 pixels; 172 bytes | $05 | 83 | |
| SPRITE88 $8661 | a piece of the robot's stand | 24 by 8 pixels; 50 bytes | $03 | 88 | |
| SPRITE89 $8693 | a piece of the robot's stand | 24 by 8 pixels; 50 bytes | $03 | 89 | |
| SPRITE84 $86C5 | half of the frame round the light years | 24 by 22 pixels; 134 bytes | $03 | 84 | |
| SPRITE11 $874B | a creature's lower half | 24 by 16 pixels; 98 bytes | $03 | 11 | |
| SPRITE73 $87AD | a spiked dome | 24 by 19 pixels; 116 bytes | $03 | 73 | |
| SPRITE46 $8821 | a crown of spikes on a base | 24 by 24 pixels; 146 bytes | $03 | 46 | |
| SPARE_SPRITEA $88B3 | a sloping slab | 32 by 25 pixels; 202 bytes | $04 | No graphic number reaches it: never drawn | |
| SPRITE74 $897D | a frozen spaceman | 24 by 32 pixels; 194 bytes | $03 | 74 | |
| SPRITE86 $8A3F | a bug-eyed creature | 24 by 25 pixels; 152 bytes | $03 | 86, 94 | |
| SPRITE28 $8AD7 | a block with a raised round top | 32 by 29 pixels; 234 bytes | $04 | 28 | |
| SPRITE29 $8BC1 | a block tapering to the bottom | 32 by 27 pixels; 218 bytes | $04 | 29 | |
| SPRITE30 $8C9B | a plain block | 32 by 29 pixels; 234 bytes | $04 | 30-31, 44-45, 47, 66-71, 128 | |
| SPRITE87 $8D85 | a bug-eyed creature, the other view | 24 by 25 pixels; 152 bytes | $03 | 87, 95 | |
| SPRITE75 $8E1D | three cylinders on a plate | 32 by 25 pixels; 202 bytes | $04 | 75 | |
| SPRITE2 $8EE7 | a doorway's pillar | 16 by 62 pixels; 250 bytes | $02 | 2 | |
| SPRITE3 $8FE1 | a doorway's other pillar, with the top of the frame | 24 by 48 pixels; 290 bytes | $03 | 3 | |
| SPRITE13 $9103 | a long panel of a hexagon-tiled wall | 24 by 56 pixels; 338 bytes | $03 | 13 | |
| SPRITE15 $9255 | a short panel of the wall | 16 by 52 pixels; 210 bytes | $02 | 15 | |
| SPRITE4 $9327 | a corner of the border | 32 by 32 pixels; 258 bytes | $04 | 4 | |
| SPRITE6 $9429 | a length of the border's top and bottom | 8 by 24 pixels; 50 bytes | $01 | 6 | |
| SPRITE5 $945B | a length of the border's sides, one pixel high | 24 by 1 pixels; 8 bytes | $03 | 5 | |
| SPRITE10 $9463 | a small square: the panel's edge | 8 by 8 pixels; 18 bytes | $01 | 10 | |
| SPRITE7 $9475 | a piece of the panel's scroll-work | 16 by 12 pixels; 50 bytes | $02 | 7 | |
| SPRITE8 $94A7 | a piece of the panel's scroll-work | 16 by 16 pixels; 66 bytes | $02 | 8 | |
| SPRITE9 $94E9 | a slanting line: the panel's slope | 16 by 8 pixels; 34 bytes | $02 | 9 | |
| SPRITE72 $950B | a pyramid | 32 by 24 pixels; 194 bytes | $04 | 72 | |
| SPRITE12 $95CD | a little robot | 16 by 17 pixels; 70 bytes | $02 | 12 | |
| SPRITE25 $9613 | the robot's legs, from the front | 32 by 17 pixels; 138 bytes | $04 | 25, 90, 92 | |
| SPRITE41 $969D | the robot's top, from the front | 32 by 16 pixels; 130 bytes | $04 | 41, 91, 93 | |
| SPRITE24 $971F | the robot's legs, from behind | 32 by 17 pixels; 138 bytes | $04 | 24 | |
| SPRITE40 $97A9 | the robot's top, from behind | 32 by 16 pixels; 130 bytes | $04 | 40 | |
| SPRITE26 $982B | the robot's legs, side-on | 32 by 17 pixels; 138 bytes | $04 | 26-27 | |
| SPRITE42 $98B5 | the robot's top, side-on | 32 by 17 pixels; 138 bytes | $04 | 42-43 | |
| SPRITE20 $993F | the robot's legs | 32 by 17 pixels; 138 bytes | $04 | 20 | |
| SPRITE36 $99C9 | the robot's top | 32 by 17 pixels; 138 bytes | $04 | 36 | |
| SPRITE21 $9A53 | the robot's legs | 32 by 17 pixels; 138 bytes | $04 | 21, 23 | |
| SPRITE37 $9ADD | the robot's top | 32 by 17 pixels; 138 bytes | $04 | 37, 39 | |
| SPRITE22 $9B67 | the robot's legs | 32 by 17 pixels; 138 bytes | $04 | 22 | |
| SPRITE38 $9BF1 | the robot's top | 32 by 17 pixels; 138 bytes | $04 | 38 | |
| SPRITE16 $9C7B | the robot's legs | 32 by 17 pixels; 138 bytes | $04 | 16 | |
| SPRITE32 $9D05 | the robot's top | 32 by 17 pixels; 138 bytes | $04 | 32 | |
| SPRITE17 $9D8F | the robot's legs | 32 by 17 pixels; 138 bytes | $04 | 17, 19 | |
| SPRITE33 $9E19 | the robot's top | 32 by 17 pixels; 138 bytes | $04 | 33, 35 | |
| SPRITE18 $9EA3 | the robot's legs | 32 by 17 pixels; 138 bytes | $04 | 18 | |
| SPRITE34 $9F2D | the robot's top | 32 by 17 pixels; 138 bytes | $04 | 34 | |
| SPRITE14 $9FB7 | the narrow end of the wall | 8 by 48 pixels; 98 bytes | $01 | 14 | |
| SPRITE55 $A019 | a sparkle, smallest | 24 by 20 pixels; 122 bytes | $03 | 55-56 | |
| SPRITE54 $A093 | a sparkle | 24 by 21 pixels; 128 bytes | $03 | 54, 57 | |
| SPRITE53 $A113 | a sparkle | 24 by 23 pixels; 140 bytes | $03 | 53, 58 | |
| SPRITE52 $A19F | a sparkle | 24 by 24 pixels; 146 bytes | $03 | 52, 59, 78, 108 | |
| SPRITE49 $A231 | a sparkle | 24 by 24 pixels; 146 bytes | $03 | 49, 51, 60, 62, 65, 77, 79, 109, 111 | |
| SPRITE48 $A2C3 | a sparkle, largest | 24 by 24 pixels; 146 bytes | $03 | 48, 50, 61, 63-64, 76, 110 | |
| SPRITE112 $A355 | a domed socket on a plinth | 32 by 25 pixels; 202 bytes | $04 | 112-115 | |
| SPRITE96 $A41F | a valve: a drum on feet | 24 by 24 pixels; 146 bytes | $03 | 96, 100, 104 | |
| SPRITE97 $A4B1 | a valve: a cube on feet | 24 by 23 pixels; 140 bytes | $03 | 97, 101, 105 | |
| SPRITE98 $A53D | a valve: a point on feet | 24 by 19 pixels; 116 bytes | $03 | 98, 102, 106 | |
| SPRITE99 $A5B1 | a valve: a ball on feet | 24 by 21 pixels; 128 bytes | $03 | 99, 103, 107 |
43 characters of 8 by 8 pixels at FONT, for the codes $30 to $5A: the digits, a second nought, a few signs and 3 blank characters ($3D, $3F, $40), and the capital letters. Each is eight bytes, the top row first, as the printer (PRINT_CHAR) copies them into the screen buffer. There is no lower case, and a space is printed as code $3D, the first of the blanks. For text the printer's base is 384 bytes below the font, so that the codes land on these characters; for numbers it is the font itself, so that the digits are codes 0 to 9. Drawn here in white; the game colours text by the attributes it prints with.
![]() 0 | ![]() 1 | ![]() 2 | ![]() 3 | ![]() 4 | ![]() 5 | ![]() 6 | ![]() 7 | ![]() 8 | ![]() 9 | ![]() $3A |
![]() $3B | ![]() $3C | ![]() $3D | ![]() $3E | ![]() $3F | ![]() $40 | ![]() A | ![]() B | ![]() C | ![]() D | ![]() E |
![]() F | ![]() G | ![]() H | ![]() I | ![]() J | ![]() K | ![]() L | ![]() M | ![]() N | ![]() O | ![]() P |
![]() Q | ![]() R | ![]() S | ![]() T | ![]() U | ![]() V | ![]() W | ![]() X | ![]() Y | ![]() Z |
The character after the 9, code $3A -- a colon where the codes are ASCII -- is the same eight bytes as the 0 (compared at build time). It is there for the light-years clock (RUN_CLOCK): a digit that changes is printed rows out of line, the eight bytes from its character plus a count that runs down from 7 to 0 over seven turns (PRINT_ROLLING_DIGIT), so it rolls down into place from the digit above it like a counter's wheel. A 9 comes after a 0 -- a borrow -- and the character above the 9 is this second nought, so the 9 rolls in from a 0. Here is that roll, read from the font the way the clock reads it, count 7 first:
![]() 7 | ![]() 6 | ![]() 5 | ![]() 4 | ![]() 3 | ![]() 2 | ![]() 1 | ![]() 0 |