Each star is protected by one of seven guardians, and learning how to defend yourself from these is the key to survival. Each guardian has ‘servants’ and the patterns and habits of these must also be learned.
Guardians can only be “sent to Pandaemonium” (killed) during the day cycle – shooting them has no effect during the night cycle.
The guardian type for the level is stored in $4B2, and is read in from the level data from offset +0x0
0000 – The Devil
The Devil’s servants are the hardest to deal with. You can avoid them by running away, but this is time (and energy) consuming. To shoot them, retreat to a safe distance, wait for them to come into your line of fire and shoot them.
The colour palette is modified for this guardian.
The guardian function at 2A858 references a memory table at 36514-365AB (length 0x98 or 152 bytes) for this guardian.
0001 – Rotating blades
Only appears within the Sagittarius constellation, and presumably was meant to be a secret, but since it’s value is 0x1, it appears in the second viewing of the demo, if you just leave the title screen running!
It’s pattern is predictable, but it is so fast, it is almost impossible to avoid. The eight mini-blades it constantly fires add to the difficulty.
The guardian function at 2A858 references a memory table at 365AC-36643 (length 0x98 or 152 bytes) for this guardian.
0002 – The Hand
The Hand produces spinning silver stars which require swift action to avoid. If you leave them alone, they split into two – and they can do this twice. During the game, the hand is just shown as the sprite with the outstretched fingers, with the eye sprite overlayed on top of it. During the game over screen, all five frames of the hand sprite are used as it rises from the grave to wave you goodbye.
The guardian function at 2A858 references a memory table at 36644-366DB (length 0x98 or 152 bytes) for this guardian.
0003 – The Hydra
The Hydra moves in a simple circular pattern, firing six servants at a time – two from each of its heads. The servants need to be shot twice to be destroyed. If they are not too close, it’s best to leave them alone, as they soon disappear.
The guardian function at 2A858 references a memory table at 366DE-36773 (length 0x98 or 152 bytes) for this guardian.
0004 – The Spider
The Spider’s servants move in a circular motion towards you and also have to be hit twice to be killed. They don’t pose too much of a problem, so it’s often best to leave them alone, but on later levels they start to home in on you.
The guardian function at 2A858 references a memory table at 36774-3680B (length 0x98 or 152 bytes) for this guardian.
0005 – The Firefly
This guardian flies in a predictable spiral pattern, but it’s servants aren’t quite as simple. They fly out three times in diagonals, but horizontally and vertically on the fourth. Once you master that pattern, it’s easy to work out where the next wave of servants will be going and be ready to avoid them.
The guardian function at 2A858 references a memory table at 3680C-368A3 (length 0x98 or 152 bytes) for this guardian.
0006 – The Maggot
May seem to be the hardest guardian to deal with, as it always appears on the left hand side of the screen in line with you. During the day cycle, move into the centre of the screen and shoot as it will be directly in the line of fire.
The guardian function at 2A858 references a memory table at 368A4-3693B (length 0x98 or 152 bytes) for this guardian.
Guardian Memory Address Tables
| Guardian | Start Addr | End Addr | Length |
| 0000 Devil | 0x36514 | 0x365AB | 0x98 (152) |
| 0001 Blades | 0x365AC | 0x36643 | 0x98 (152) |
| 0002 Hand | 0x36644 | 0x366DB | 0x98 (152) |
| 0003 Hydra | 0x366DC | 0x36773 | 0x98 (152) |
| 0004 Spider | 0x36774 | 0x3680B | 0x98 (152) |
| 0005 Firefly | 0x3680C | 0x368A3 | 0x98 (152) |
| 0006 Maggot | 0x368A4 | 0x3693B | 0x98 (152) |
Whether the game is reading from the ServantSpawnerData (152-byte arrays) or the ServantProjectileData (304-byte arrays), the 4 x 38-byte footprint works identically.
The 38-Byte Entity Object Structure
| Hex Offset | Length | Description / Purpose |
|---|---|---|
+0x00 | 2 bytes (Word) | Active Status Flag. <00 01> means the entity is active and processing. <00 00> means the slot is inactive/empty. The game checks TST.W (A0) constantly. |
+0x02 | 2 bytes (Word) | Entity Type / Sprite ID. This dictates the visual lookup. For example, 2D is the Devil, 2E is Blades, 30 is the Hand. If destroyed, the game forces this to $000C (which flags the generic explosion animation). |
+0x04 | 2 bytes (Word) | Raw X-Coordinate. The absolute baseline X-position of the object on screen. |
+0x06 | 2 bytes (Word) | Raw Y-Coordinate. The absolute baseline Y-position of the object on screen. |
+0x08 | 4 bytes (Long) | Command / State Vector. Often stores a longword pointer or command tag like FFFF xxxx. When an entity is shot and killed by the player, SUB_Guardian_FlagDestroyed_2A7FE injects $FFFF1B00 directly into this offset to trigger the death routine! |
... | … | (Intermediate Animation states and coordinate offsets) |
+0x12 | 2 bytes (Word) | Timer / Phase Counter A. Used to track servant lifespans or sub-phases. Wiped (CLR.W $12(A0)) whenever the entity assumes the destroyed flag. |
+0x14 | 1 byte (Byte) | Timer / Phase Counter B. Another precise counter or state byte wiped cleanly (CLR.B $14(A0)) when the entity is destroyed. |
+0x2A | 2 bytes (Word) | Hardware Sprite X-Offset. (Offset + 42 0x2A) Spliced specifically for feeding the actual active hardware sprite engine. |
+0x2C | 2 bytes (Word) | Hardware Sprite Y-Offset. (Offset + 44 0x2C) |
The game engine runs entirely on top of these 38-byte chunks, using them as generic GameObject structs.
Devil_ServantSpawner (TBL_Devil_ServantTable_36514)
| Slot | Active (+0) | ID (+2) | X (+4) | Y (+6) | Cmd (+8) | P1 (+C) | P2 (+E) | TimerA (+12) | TimerB (+14) | Remaining |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0001 | 002D | 00F0 | 0050 | FFFF1818 | 0002 | 0100 | 0000 | 00 | 0108000000000020000000200001010000 |
| 1 | 0001 | 002D | 0000 | 0000 | FFFF1904 | 00FF | 0100 | 0000 | 00 | 0000000000000010100000200000000000 |
| 2 | 0001 | 002D | 0000 | 0000 | FFFF19F0 | 00FF | 0100 | 0000 | 00 | 0000000000000000200000200000000000 |
| 3 | 0000 | 0000 | 0000 | 0000 | 00000000 | 0000 | 0000 | 0000 | 00 | 0000000000000000000000000000000000 |
Blades_ServantSpawner (TBL_Blades_ServantTable_365AC)
| Slot | Active (+0) | ID (+2) | X (+4) | Y (+6) | Cmd (+8) | P1 (+C) | P2 (+E) | TimerA (+12) | TimerB (+14) | Remaining |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0001 | 002E | 00F0 | 0050 | FFFF0A24 | 0002 | 0100 | 0000 | 00 | 0100020002000020000000100000000100 |
| 1 | 0001 | 002E | 00C0 | 0065 | FFFF0A34 | 00FF | 0100 | 0000 | 00 | 0100000000000010100000100000000000 |
| 2 | 0001 | 002E | 00D0 | 0065 | FFFF0A44 | 00FF | 0100 | 0000 | 00 | 0100000000000000200000100000000000 |
| 3 | 0000 | 0000 | 0000 | 0000 | 00000000 | 0000 | 0000 | 0000 | 00 | 0000000000000000000000000000000000 |
Hand_ServantSpawner (TBL_Hand_ServantTable_36644)
| Slot | Active (+0) | ID (+2) | X (+4) | Y (+6) | Cmd (+8) | P1 (+C) | P2 (+E) | TimerA (+12) | TimerB (+14) | Remaining |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0001 | 0030 | 0100 | 0050 | FFFF0E8C | 0001 | 0100 | 0000 | 00 | 0106BE0000000010000000100001010000 |
| 1 | 0001 | 0030 | 00C0 | 0065 | FFFF0EDC | 00FF | 0100 | 0000 | 00 | 0000000000000000000000100000000000 |
| 2 | 0001 | 0008 | 00B6 | 0082 | FFFF137C | 00FF | 0000 | 0000 | 00 | 0000000000000000000000100000000000 |
| 3 | 0000 | 0000 | 0000 | 0000 | 00000000 | 0000 | 0000 | 0000 | 00 | 0000000000000000000000000000000000 |
Hydra_ServantSpawner (TBL_Hydra_ServantTable_366DC)
| Slot | Active (+0) | ID (+2) | X (+4) | Y (+6) | Cmd (+8) | P1 (+C) | P2 (+E) | TimerA (+12) | TimerB (+14) | Remaining |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0001 | 0039 | 00F0 | 0050 | FFFF0D34 | 0002 | 0100 | 0000 | 00 | 0103D80000000025000000100001010000 |
| 1 | 0001 | 0039 | 00C0 | 0065 | FFFF0D88 | 00FF | 0100 | 0000 | 00 | 0100000000000015100000100000000000 |
| 2 | 0001 | 0039 | 00D0 | 0065 | FFFF0E10 | 00FF | 0100 | 0000 | 00 | 0100000000000005200000100000000000 |
| 3 | 0000 | 0000 | 0000 | 0000 | 00000000 | 0000 | 0000 | 0000 | 00 | 0000000000000000000000000000000000 |
Spider_ServantSpawner (TBL_Spider_ServantTable_36774)
| Slot | Active (+0) | ID (+2) | X (+4) | Y (+6) | Cmd (+8) | P1 (+C) | P2 (+E) | TimerA (+12) | TimerB (+14) | Remaining |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0001 | 001C | 00E0 | 0050 | FFFF0A54 | 0003 | 0100 | 0000 | 00 | 0104880000000030000000100001010000 |
| 1 | 0001 | 001C | 00C0 | 0065 | FFFF0A88 | 00FF | 0100 | 0000 | 00 | 0100000000000020100000100000000000 |
| 2 | 0001 | 001C | 00D0 | 0065 | FFFF0ABC | 00FF | 0100 | 0000 | 00 | 0100000000000010200000100000000000 |
| 3 | 0001 | 001C | 00E0 | 0065 | FFFF0AF0 | 00FF | 0100 | 0000 | 00 | 0100000000000000300000100000000000 |
Firefly_ServantSpawner (TBL_Firefly_ServantTable_3680C)
| Slot | Active (+0) | ID (+2) | X (+4) | Y (+6) | Cmd (+8) | P1 (+C) | P2 (+E) | TimerA (+12) | TimerB (+14) | Remaining |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0001 | 001E | 00E0 | 0050 | FFFF0C24 | 0003 | 0100 | 0000 | 00 | 01053C0000000030000000100001010000 |
| 1 | 0001 | 001E | 00C0 | 0065 | FFFF0C68 | 00FF | 0100 | 0000 | 00 | 0100000000000020100000100000000000 |
| 2 | 0001 | 001E | 00D0 | 0065 | FFFF0CAC | 00FF | 0100 | 0000 | 00 | 0100000000000010200000100000000000 |
| 3 | 0001 | 001E | 00E0 | 0065 | FFFF0CF0 | 00FF | 0100 | 0000 | 00 | 0100000000000000300000100000000000 |
Maggot_ServantSpawner (TBL_GiantMaggot_ServantTable_368A4)
| Slot | Active (+0) | ID (+2) | X (+4) | Y (+6) | Cmd (+8) | P1 (+C) | P2 (+E) | TimerA (+12) | TimerB (+14) | Remaining |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0001 | 001E | 0050 | FFFF | 0B240003 | 0100 | 0000 | 0001 | 06 | 6C00000000300000001000010100000001 |
| 1 | 001E | 0000 | 0000 | FFFF | 0B6400FF | 0100 | 0000 | 0001 | 00 | 0000000000201000001000000000000001 |
| 2 | 001E | 0000 | 0000 | FFFF | 0BA400FF | 0100 | 0000 | 0001 | 00 | 0000000000102000001000000000000001 |
| 3 | 001E | 0000 | 0000 | FFFF | 0BE400FF | 0100 | 0000 | 0001 | 00 | 000000000000300000100000000000000E |
Devil_ServantProjectile (TBL_GuardianDevilMovementTable_36A6C)
| Slot | Active (+0) | ID (+2) | X (+4) | Y (+6) | Cmd (+8) | P1 (+C) | P2 (+E) | TimerA (+12) | TimerB (+14) | Remaining |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0001 | 000F | 0010 | 0004 | FFFF1B2C | 0000 | 0000 | 0000 | FF | 01032A0000000000000001000001010000 |
| 1 | 0001 | 000F | 0010 | 0004 | FFFF1B2C | 0000 | 0000 | 0000 | FF | 0103320000000000000001000001010000 |
| 2 | 0001 | 000F | 0010 | 0004 | FFFF1B2C | 0000 | 0000 | 0000 | FF | 01033A0000000000000001000001010000 |
| 3 | 0001 | 000F | 0010 | 0004 | FFFF1B2C | 0000 | 0000 | 0000 | FF | 0103420000000000000001000001010000 |
| 4 | 0001 | 000F | 0010 | 0004 | FFFF1B2C | 0000 | 0000 | 0000 | FF | 01034A0000000000000001000001010000 |
| 5 | 0001 | 000F | 0010 | 0004 | FFFF1B2C | 0000 | 0000 | 0000 | FF | 0103520000000000000001000001010000 |
| 6 | 0001 | 000F | 0010 | 0004 | FFFF1B2C | 0000 | 0000 | 0000 | FF | 01035A0000000000000001000001010000 |
| 7 | 0001 | 000F | 0010 | 0004 | FFFF1B2C | 0000 | 0000 | 0000 | FF | 0103620000000000000001000001010000 |
Spider_ServantProjectile (TBL_GuardianSpiderMovementTable_36BE8)
| Slot | Active (+0) | ID (+2) | X (+4) | Y (+6) | Cmd (+8) | P1 (+C) | P2 (+E) | TimerA (+12) | TimerB (+14) | Remaining |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0001 | 000E | 0010 | 0004 | FFFF1D80 | 0000 | 0000 | 0000 | FF | 01005A0000000000000002000001010000 |
| 1 | 0001 | 000E | 0010 | 0004 | FFFF1D80 | 0000 | 0000 | 0000 | FF | 0100620000000000000002000001010000 |
| 2 | 0001 | 000E | 0010 | 0004 | FFFF1D80 | 0000 | 0000 | 0000 | FF | 01006A0000000000000002000001010000 |
| 3 | 0001 | 000E | 0010 | 0004 | FFFF1D80 | 0000 | 0000 | 0000 | FF | 0100720000000000000002000001010000 |
| 4 | 0001 | 000E | 0010 | 0004 | FFFF1D80 | 0000 | 0000 | 0000 | FF | 01007A0000000000000002000001010000 |
| 5 | 0001 | 000E | 0010 | 0004 | FFFF1D80 | 0000 | 0000 | 0000 | FF | 0100820000000000000002000001010000 |
| 6 | 0001 | 000E | 0010 | 0004 | FFFF1D80 | 0000 | 0000 | 0000 | FF | 01008A0000000000000002000001010000 |
| 7 | 0001 | 000E | 0010 | 0004 | FFFF1D80 | 0000 | 0000 | 0000 | FF | 0100920000000000000002000001010000 |
Firefly_ServantProjectile (TBL_GuardianFireflyMovementTable_36DB0)
| Slot | Active (+0) | ID (+2) | X (+4) | Y (+6) | Cmd (+8) | P1 (+C) | P2 (+E) | TimerA (+12) | TimerB (+14) | Remaining |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0001 | 000F | 001C | 0006 | FFFF1D34 | 0000 | 0000 | 0000 | FF | 00014A0000000000000000000001010000 |
| 1 | 0001 | 000F | 0024 | 0006 | FFFF1D34 | 0000 | 0000 | 0000 | FF | 00015E0000000000000000000001010000 |
| 2 | 0001 | 000F | 001C | 000E | FFFF1D34 | 0000 | 0000 | 0000 | FF | 0001720000000000000000000001010000 |
| 3 | 0001 | 000F | 0024 | 000E | FFFF1D34 | 0000 | 0000 | 0000 | FF | 0001860000000000000000000001010000 |
| 4 | 0001 | 000F | 001C | 0006 | FFFF1D34 | 0000 | 0000 | 0000 | FF | 00019A0000000000000000000001010000 |
| 5 | 0001 | 000F | 0024 | 0006 | FFFF1D34 | 0000 | 0000 | 0000 | FF | 0001AE0000000000000000000001010000 |
| 6 | 0001 | 000F | 001C | 000E | FFFF1D34 | 0000 | 0000 | 0000 | FF | 0001C20000000000000000000001010000 |
| 7 | 0001 | 000F | 0024 | 000E | FFFF1D34 | 0000 | 0000 | 0000 | FF | 0001D60000000000000000000001010000 |
Hand_ServantProjectile (TBL_GuardianHandMovementTable_36F78)
| Slot | Active (+0) | ID (+2) | X (+4) | Y (+6) | Cmd (+8) | P1 (+C) | P2 (+E) | TimerA (+12) | TimerB (+14) | Remaining |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0001 | 000F | 0008 | 0008 | FFFF1BEC | 0000 | 0000 | 0000 | FF | 0103950000000000000000000001010000 |
| 1 | 0001 | 000F | 0008 | 0008 | FFFF1BEC | 0000 | 0000 | 0000 | FF | 0103950000000000000000000001010000 |
| 2 | 0001 | 000F | 0008 | 0008 | FFFF1BEC | 0000 | 0000 | 0000 | FF | 0103950000000000000000000001010000 |
| 3 | 0001 | 000F | 0008 | 0008 | FFFF1BEC | 0000 | 0000 | 0000 | FF | 0103950000000000000000000001010000 |
| 4 | 0001 | 000F | 0008 | 0008 | FFFF1BEC | 0000 | 0000 | 0000 | FF | 0103950000000000000000000001010000 |
| 5 | 0001 | 000F | 0008 | 0008 | FFFF1BEC | 0000 | 0000 | 0000 | FF | 0103950000000000000000000001010000 |
| 6 | 0001 | 000F | 0008 | 0008 | FFFF1BEC | 0000 | 0000 | 0000 | FF | 0103950000000000000000000001010000 |
| 7 | 0001 | 000F | 0008 | 0008 | FFFF1BEC | 0000 | 0000 | 0000 | FF | 0103950000000000000000000001010000 |
Blades_ServantProjectile (TBL_GuardianBladesMovementTable_37140)
| Slot | Active (+0) | ID (+2) | X (+4) | Y (+6) | Cmd (+8) | P1 (+C) | P2 (+E) | TimerA (+12) | TimerB (+14) | Remaining |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0001 | 000F | 0004 | 0004 | FFFF1C1C | 0000 | 0000 | 0000 | 01 | 00FFFDFFFD000000000000000000000000 |
| 1 | 0001 | 000F | 0011 | 0000 | FFFF1C1C | 0000 | 0000 | 0000 | 01 | 000000FFFC000000000000000000000000 |
| 2 | 0001 | 000F | 001C | 0004 | FFFF1C1C | 0000 | 0000 | 0000 | 01 | 000003FFFD000000000000000000000000 |
| 3 | 0001 | 000F | 0000 | 0011 | FFFF1C1C | 0000 | 0000 | 0000 | 01 | 00FFFC0000000000000000000000000000 |
| 4 | 0001 | 000F | 0022 | 0011 | FFFF1C1C | 0000 | 0000 | 0000 | 01 | 0000040000000000000000000000000000 |
| 5 | 0001 | 000F | 0004 | 001C | FFFF1C1C | 0000 | 0000 | 0000 | 01 | 00FFFD0003000000000000000000000000 |
| 6 | 0001 | 000F | 001C | 001C | FFFF1C1C | 0000 | 0000 | 0000 | 01 | 0000030003000000000000000000000000 |
| 7 | 0001 | 000F | 0011 | 0020 | FFFF1C1C | 0000 | 0000 | 0000 | 01 | 0000000004000000000000000000000000 |
Maggot_ServantProjectile (TBL_GuardianMaggotMovementTable_37270)
| Slot | Active (+0) | ID (+2) | X (+4) | Y (+6) | Cmd (+8) | P1 (+C) | P2 (+E) | TimerA (+12) | TimerB (+14) | Remaining |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0001 | 000D | 0018 | 0008 | FFFF1CEC | 0000 | 0000 | 0000 | 01 | 00FFF8FFF8000000000000000000000000 |
| 1 | 0001 | 000D | 0018 | 0008 | FFFF1CEC | 0000 | 0000 | 0000 | 01 | 000000FFF6000000000000000000000000 |
| 2 | 0001 | 000D | 0018 | 0008 | FFFF1CEC | 0000 | 0000 | 0000 | 01 | 000008FFF8000000000000000000000000 |
| 3 | 0001 | 000D | 0018 | 0008 | FFFF1CEC | 0000 | 0000 | 0000 | 01 | 00FFF60000000000000000000000000000 |
| 4 | 0001 | 000D | 0018 | 0008 | FFFF1CEC | 0000 | 0000 | 0000 | 01 | 00000A0000000000000000000000000000 |
| 5 | 0001 | 000D | 0018 | 0008 | FFFF1CEC | 0000 | 0000 | 0000 | 01 | 00FFF80008000000000000000000000000 |
| 6 | 0001 | 000D | 0018 | 0008 | FFFF1CEC | 0000 | 0000 | 0000 | 01 | 0000080008000000000000000000000000 |
| 7 | 0001 | 000D | 0018 | 0008 | FFFF1CEC | 0000 | 0000 | 0000 | 01 | 000000000A000000000000000000000000 |
Hydra_ServantProjectile (TBL_GuardianHydraMovementTable_373A0)
| Slot | Active (+0) | ID (+2) | X (+4) | Y (+6) | Cmd (+8) | P1 (+C) | P2 (+E) | TimerA (+12) | TimerB (+14) | Remaining |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0001 | 000F | 0000 | 0005 | FFFF1C7C | 0000 | 0000 | 0000 | 01 | 01FFFEFFFE000000000000000000000000 |
| 1 | 0000 | 000F | 0000 | 0005 | FFFF1C7C | 0000 | 0000 | 0000 | 01 | 01FFFD0000000000000000000000000000 |
| 2 | 0001 | 000F | 0000 | 0005 | FFFF1C7C | 0000 | 0000 | 0000 | 01 | 01FFFE0002000000000000000000000000 |
| 3 | 0001 | 000F | 0011 | 0007 | FFFF1C7C | 0000 | 0000 | 0000 | 01 | 010000FFFD000000000000000000000000 |
| 4 | 0001 | 000F | 0011 | 0007 | FFFF1C7C | 0000 | 0000 | 0000 | 01 | 0100000003000000000000000000000000 |
| 5 | 0001 | 000F | 0024 | 0005 | FFFF1C7C | 0000 | 0000 | 0000 | 01 | 010002FFFE000000000000000000000000 |
| 6 | 0000 | 000F | 0024 | 0005 | FFFF1C7C | 0000 | 0000 | 0000 | 01 | 0100030000000000000000000000000000 |
| 7 | 0001 | 000F | 0024 | 0005 | FFFF1C7C | 0000 | 0000 | 0000 | 01 | 0100020002000000000000000000000000 |

Leave a comment