CYBORG HELLGATE - THE VERSIONS, TECHNICALLY
Cyborg Hellgate is a Defender-style bullet hell shooter: a scrolling planet, a scanner, humanoids
to save, and a big cast - landers, mutants, baiters, bombers, pods, swarmers, fireflingers,
dunderheads, Yellowbelly goldfish, Fudd and Big Dud - plus MECHRA’s power-ups, the HELLGATE warp,
Ghosto, guard, HIT chains and giant mechs.
Every version is written in NTC BASIC, compiled to native threaded code, with the speed-critical
parts in Z80 or 68000. The game logic is the same BASIC across them all; what changes is how each
machine draws it.
ON SCREEN AT ONCE (THE GAME’S LIMITS, THE SAME IN EVERY VERSION)
- Enemies: up to 16 at a time (4 alongside the mechs on a boss level).
- Humanoids: 8.
- Giant mechs: up to 5, each 64 x 48 (12 sprites on the Next).
- Explosions: 6. Pickups (P, big P, gems): 6.
- The ship.
- Enemy bullets: up to 52.
- Laser shots: up to 22 (16 laser volleys on the Mega Drive, each volley one to three beams).
- That’s up to about 110 moving things at once, before the stars.
ZX SPECTRUM NEXT (THE ORIGINAL)
- 28 MHz Z80N, 50 frames a second.
- Layer 2 for the ground, the copper for the scrolling, the tilemap for the panel and the words.
- Hardware sprites for everything that moves. The giant mechs are 64 x 48, built from 12 sprites:
only the left half is stored, the right half is the same sprites mirrored.
- Bullets and lasers moved, checked and drawn in Z80: 52 enemy bullets and 22 laser shots as
hardware sprites.
- The sprite and font data sit in NEX banks 45-47, outside the program’s memory.
- On screen: 128 hardware sprites - slots 0-53 for the ship, enemies, humanoids, explosions,
pickups and mechs, 54-127 for the 52 bullets and 22 shots - and 60 stars on Layer 2.
- Voice build (CYBHELLV): 25 vocoded lines at 13.6 kHz, fed by the Next’s DMA straight into the
DAC, so the Z80 hardly does anything for it. Needs a 1MB Next.
SEGA MEGA DRIVE / GENESIS
- 68000 at 7.6 MHz, H40 (320 x 224), NTSC 60 Hz or PAL 50 Hz.
- Everything done for every object every frame is in 68000: the tick for all 14 enemy kinds and
the humanoids, the pickups, the pad, the ship and view, the 52 enemy shots and 16 laser
volleys, the sprite table, the scanner, the landscape columns. The BASIC decides what comes on,
what a kill is worth, and the words.
- Plane B: the stars, scrolled at a quarter of the ground’s speed (the Next’s parallax), and the
scanner. Plane A: the words, the panel and the ground. Everything that moves is a hardware
sprite. The sprite table, the scanner and new landscape columns go to the VDP by DMA in the
vertical blank.
- The game ticks at the Next’s 50 a second on both NTSC and PAL (1,500 ticks in 1,800 NTSC
frames, 1,500 in 1,500 PAL); the scrolling is smooth at 60 Hz too.
- On screen: the Mega Drive shows 80 hardware sprites, 20 on a line (the Next 128), shared by the
ship, the 16 enemies, 8 humanoids, mechs, explosions, pickups, 52 enemy shots and 16 laser
volleys; lines over the limit came up in under 1% of frames tested. The stars are tiles on
plane B, so they cost no sprites.
- Sound effects on the PSG, each AY period converted. Voice build (CYBHELLV): the Next’s vocoded
lines through the YM2612’s DAC from a Z80 player, which keeps off the 68000’s bus during DMA.
- 74K ROM, 612K with the voice.
- 3 and 6 button pads.
- Five difficulty levels (Left / Right on the title): EASY a bonus every 10,000 points, MEDIUM
every 50,000, HARD every 100,000, VERY HARD every 100,000 with no extra ship, INSANE the same
starting with one ship.
- Bot-played to wave 25 and beyond on Genesis Plus GX.
AMSTRAD CPC (FULL VERSION)
- 4 MHz Z80, mode 0, double-buffered screens at #C000 and #0000. No sprite hardware: everything
is software.
- Compiled sprites: each sprite is a Z80 routine that writes its bytes straight to the screen,
plain and mirrored copies. 118 patterns, about 49K of code, in the 6128’s extra RAM; the rest of
the program in bank 7.
- Erase lists: only the bytes actually drawn get blacked out. The ground and the stars keep their
own lists.
- Frame clock from an IM 2 interrupt off the gate array’s 300 Hz, with a 257 byte vector table so
it works on expanded machines where the bus doesn’t read #FF.
- On screen: 57 software sprite slots (the ship, enemies, humanoids, explosions, pickups, and a
mech’s 12 cells), up to 52 enemy bullets and 22 laser shots as small blobs with their own erase
lists, and 24 stars.
- Locked to every second frame: 25 fps at the Next’s real-time pace, moves doubled. Busy waves
run 16-19 fps.
- Needs 128K (a 6128, or a 464 / 664 with 64K added).
AMSTRAD CPC LITE
Same engine, trimmed to play smoothly:
- Dotted ground: every 8th world column, pinned to the world as it scrolls.
- No stars and no scanner.
- The panel only shows while TAB is held. The purple line stays, so you can see how high the
landers go.
- Unmasked compiled sprites (edge bytes written straight): the sprite code drops to 27.6K in two
banks.
- Sprite rows step with pop bc / add hl, bc from per-line tables instead of an add-and-check on
every row.
- Dormant aliens: anything more than 240 world pixels from the view stops completely, timers and
all, until you fly near it. With no scanner you never know. Carrying landers, falling
humanoids, the chasers and the mechs always stay awake.
- No dunderheads: they move too fast for the CPC to show smoothly.
- On screen: the same 57 sprite slots, 52 bullets and 22 laser shots as the full version, no
stars - and with dormancy only the aliens near the view are moving.
- Mostly 25 fps, the odd dip in the busiest waves. 128K.
AMSTRAD CPC + V9990 (AMSDAP WITH AN MSX GFX9000 OR VIDEO9000, OR A POWERGRAPH)
- The CPC runs the game logic; the V9990 does the drawing in P1 mode: two hardware-scrolled tile
layers and 125 hardware sprites (16 x 16, 16 colours).
- Ground and stars on one layer, the panel and the scanner on the other. All sprites are
hardware; the mechs use stored mirrored copies, since P1 can’t flip.
- On screen: the V9990’s 125 hardware sprites (16 on a line) carry the game’s 57 object slots
plus the bullets and laser shots (up to 52 and 22), and 60 stars on the background layer.
- Over 16 sprites on a line: the bullets’ order flips every frame, so they flicker instead of
vanishing.
- One frame in hand: a finished frame is queued and shown at the V9990’s next frame, so a quick
frame can lend time to a slow one. The cost is one frame (40 ms) of lag.
- The busiest BASIC moved into Z80: the controls, the clocks, the score, the mech guns.
- 25 fps in waves 1-2 and the boss levels; wave 7’s bullet hell on time 93% of frames.
- Smaller than the plain CPC version (66K against 87K): sprites are 4-bit data in the card’s
memory, not compiled code. Needs 128K and the card at &FF60.
MSX2 + V9990 (GFX9000, VIDEO9000, POWERGRAPH)
- Almost the same code as the CPC + V9990 version: the V9990 driver is unchanged; only the
keyboard, joystick, sound and memory code differ.
- Two builds from one source: an MSX-DOS 2 / Nextor .COM with two data files (loaded into memory
mapper pages, the way the CPC fills its banks), and a 128K ASCII16 MegaROM that runs on the free
C-BIOS.
- Sound on the PSG (the same AY chip as the CPC), pitches rescaled for the MSX’s 1.79 MHz clock.
- On screen: the same as the CPC + V9990 version - 57 object slots, 52 bullets, 22 laser shots,
60 stars.
- The V9990 always runs at 50 Hz, so the game plays at the same pace on 50 and 60 Hz MSXs.
- Close to the CPC + V9990 speed: wave 1 on time 99% of frames, wave 7 83%.
TESTING
- CPC versions in Caprice32; CPC + V9990 in 1984 (the CPC emulator with PowerGraph V9990
support); the MSX ROM in openMSX with the GFX9000 extension; the Mega Drive in Genesis Plus GX.
- Everything also bot-played through waves, giant mech levels and game over in NTC’s own timing
harnesses.
- Figures are from emulators and harnesses, not real hardware.
- blueMSX has no V9990: use openMSX or WebMSX for the MSX version.
(c) 2026 Cyborg Unicorn Pty Ltd