1984 · Mastertronic

About this page

This minisite was curated by unorig, air.

The copy studied

The copy is a single program file of 42,860 bytes (MD5 71f92e5380d4564acb7970f9caee2502). Its loader moves most of the file to where the game runs, so everything on these pages is read from memory as play begins, not from the file. The loader leaves the mark (ANTISOFT) behind it, which is not part of the game itself.

It is the first release, the one with the Thriller tune. Its music player and all 4,238 bytes of its tune data ($61F2-$727F) match the steward's transcription of the first release byte for byte, and about 1,650 of them differ from the re-release.11

Original game credits

The title screen names David and Richard Darling as programmers. The more specific roles below come from the sources named beside them.

Site contributors

Other places to love this game

Sources

  1. The cassette inlay, in two scans on the Internet Archive (one, two), read 28 September 2026: the story, the crosses, and the warning about walking, running, and jumping.
  2. Games That Weren't, "Chiller V1", read 28 September 2026: who wrote the code, the graphics, and the sound, and the withdrawn first release and its music.
  3. Codemasters, admission document, May 2018: the company's founding in 1986.
  4. Bryan Skinner, Personal Computer News, 15 September 1984, as kept by the Mastertronic Collectors Archive.
  5. Fraser Marshall, Personal Computer Games, December 1984, page 72, on the Internet Archive.
  6. The Mastertronic Collectors Archive, "They sold millions": copies sold, by title and format.
  7. The Mastertronic Collectors Archive, "Chiller: legal wranglings", press reports from November 1984: the dispute over the music.
  8. Lemon64's entry for Chiller, read through the Internet Archive's 2022 copy on 28 September 2026: the credits, including David Dunn's music, and a reader's comment about a cross that could not be reached.
  9. Wikipedia, "Chiller (video game)": Exidy's arcade game of the same name.
  10. aNdy, Chiller 2 on itch.io, read 30 September 2026: the sequel, its permission and source code, and the comments about CHILL3R.
  11. Euan (unorig), who stewards this page: his transcriptions of both releases' music in unorig/Chiller, and his confirmation on 29 September 2026 that the first of them is the withdrawn release.

Research record

The write-up, facts and symbol map are available under CC BY-SA 4.0; code is under MIT. The game image itself is not hosted here.

Version, coverage and tools
Tiergold
Coverage100 % of the bytes the game uses have a description
Build analysed
Copyhuman-edited
Toolshost: macOS 27.0 (Darwin 27.0.0), Apple silicon, emulator: release v3.13.1, v3.13.1-macos-arm64-gui.dmg, disassembler: regenerator2000 0.9.20
Modeldeepseek/deepseek-v4.1-flash (10-orient), claude-opus-5-5 (20-features onward)
Kit version0.0.34
What the game does, and how it was checked

Read this before annotating code. What the game is documented to do, with verification status against the binary. Statuses: open (documented, not found yet), traced (in the code, could not be exercised; say what was tried), confirmed (in the code, consistent with the emulator), live (observed directly), differs (the code does something else). "Absent" is not a status.

Sources:

What the sources say about who made it: code by Richard Darling and graphics by David Darling (Games That Weren't); "Creator: David Darling, Richard Darling", title screen attributed to James Wilson and music by David Dunn (Lemon64). Ready64 names Jim Wilson for the title screen; CSDb records Jim and James as names for the same artist. The game's own title screen says "PROGRAMMED BY DAVID AND RICHARD DARLING" and does not credit Wilson.

Features

Where names the routine or table and, for live rows, the test (facts.md, Live tests; scripts in work/).

FeatureStatusWhere
The boy walks left and rightliveplayer_input $C71B, try_move $2A04; stick right X 128 → 151
The boy jumps (stick up, or SHIFT)livefire_pressed $C19D, start_jump $5418, jump_speeds $544A; stick up Y 224 → 205 → 220. SHIFT: the emulator's key-injection tools have no name for it, so work/verify_shift.py held the KERNAL's own shift flag $028D at 1 directly, re-poking it every frame since SCNKEY overwrites it 60 times a second; Y 224 → 205, in-air flag 1 within 30 frames
The boy can also run; walking, running and jumping each cost more energy than the lastdiffersThere is one walking speed and no run. Walking costs a step per about 765 passes (walk_drain $5A20), jumping a step each time $5A09 runs out (drain_step $59E6); standing costs nothing
An energy bar drains, and enemies touching the boy drain itlivesprite_touch $CE87 → poison_add $5B44; standing still, 69 hits on each when an enemy reached him (verify7.py)
No energy means the game is overliveout_of_energy $5A70, screen_done $5D98; GAME OVER (reference/game-over.png)
Eating mushrooms restores energylivetile $54, tile_touch_b $5AC7, energy_add_slow $5B18: 23 steps; bar 119 → 142 against a control of 119 → 119
Some mushrooms are poisonous toadstoolslivetile $55: 24 steps of poison, each with a border flash (poison_tick $5B2C, flash_border $72BA)
All the magic crosses must be collected to leave a screenlivecrosses_left $7F00 from the record's +$72: five going out, ten coming back; five poked crosses ended the forest
HUD: score, magic crosses collected, high score, energy barlivehud_template $8400, copied by start_game; score $0406, crosses $041C, bar $042E
Enemies: ghouls, zombies, ghosts and batstracedFive slots on sprites 2-6, moved by path_step $CC12 along a per-slot path script decoded from path_scripts $4A00-$4A8F (direction bytes 0-3 ended by $FF), and a thrown sixth on sprite 7 (extra_enemy $CCF5); which shape is which of the manual's names is not in the code
Five screens: forest, cinema, ghetto, graveyard, haunted houselivelevel_records $7290; all reached by play (reference/screen-00-forest.png to screen-04-house.png)
A card names each screen and says what to doliveshow_level_card $5BC7, cards $4100-$44E8
After the haunted house, the same five screens in reverse, with the girlliverecords $7300-$7500; reference/screen-05-house-back.png to screen-09-forest-back.png
On the return journey only, fire (or ?) switches control between the boy and the girlliveswitch_request $58B3, switch_allowed $7280 (level byte 10 on); / in the forest did nothing, fire and / on the way back gave the girl
On the return journey, the border colour shows who is being controlledlivetick_border $75B0: 6 the boy, 10 the girl; border 6 → 10 on the switch. It also shows on the way out, where it is always the boy's
On the return journey, the boy collects the blue crosses and the girl the red oneslivecross_touch $7F50 reads colour bit 2; red crosses beside the boy were left
The goal is to get back to the cardiffersThe last screen is the forest; after its final cross, crosses_left passes $FE and next_screen starts the forest again with the score kept. There is no win screen. No car is drawn or named in the code
Joystick in control port 2live$DC00 only (read_stick $C9C4)
Keyboard: Z left, C right, SHIFT jump, ? switch playersliveread_controls $C84D against $4512-$4515: Z and C walk, / ($C5 = $37) switches; tested through vice_keyboard_key_press
A title screen with the credits and the controls, shown after a game endslivegame_over_wait $7720, title card $7C00
Musictracedmusic_irq $60F5, the play tune $61F8, the card tune and jingle $6A18-$6BCC. Pitches computed for NTSC. Not heard: the tools give no audio
The first release played a version of Thriller, withdrawn and replaced with new musictracedThis copy is the first release: its tune data matches the steward's V1 transcription byte for byte (facts.md, top)

Beyond the documentation

Found in the code, not in the manual (facts.md, Mechanics, Unused code and data, Bugs):

Open questions

How the analysed state was reached

How to get from the contributor's own copy to the analysed state. Someone else must be able to follow this exactly.

Tools used

The image

Chiller (1985)(Mastertronic).prg, supplied by the contributor and copied to work/chiller-1985-mastertronic.prg unchanged: 42,860 bytes, being a two-byte load address of $0801 and 42,858 bytes of program, covering $0801-$AF6A. MD5 71f92e5380d4564acb7970f9caee2502. It is a single program file, so there is no directory listing.

What the file is: the title screen credits "MASTERtronic'S" and the game names itself CHILLER — THE FOREST. No trainer menu, cracktro or protection screen appeared on load. The initial BASIC stub is line 2061, SYS 2061. The stub the loader leaves behind at $0801 is SYS 2072 followed by the text (ANTISOFT), which is a watermark that appeared only after the first stage ran. What ANTISOFT denotes was not established in this step.

From power-on to play

  1. vice_autostart the file; no attach is needed first. VICE wraps a bare PRG into a disk image of its own (tools/vice-home/cache/vice/autostart-C64SC.d64), attaches it as unit 8, and runs LOAD"",8,1 and RUN: the name is because the file's is longer than 16 characters. This is VICE's default for any PRG, and the same call as dropping the file on its window.
  2. Autostart turns warp mode on. Turn it off before timing anything: tools_call → vice_machine_config_set {"resources": {"WarpMode": 0}} (the typed wrapper rejects the argument).
  3. Loader: the BASIC stub runs SYS 2061. The code there rewrites the stub at $0801 to SYS 2072 (ANTISOFT) and hands over at $0818. That address is not the game: it is another copier, which moves $0900-$09FF to $CE00, $0A00-$0AFF to $CF00 and writes $08D0-$08FF into $D000 (VIC setup). The last hand-over, where the game's own code first runs, was not isolated in this step. By policy the loader is not annotated further.
  4. No input is needed to start: about 15-18 s after autostart the title screen appears and the play screen follows on its own. No key press, fire button or joystick movement was sent at any point.
  5. Snapshots taken:
  6. work/play-idle.vsf — the play screen, untouched by input. This is the analysis image.
  7. work/entry.vsf — stopped at $0818, the second stub's target, with a stopping checkpoint, before that copier ran.

A hard reset (vice_machine_reset, mode: hard) precedes any boot whose memory is read: an autostart resets the CPU but keeps RAM, and this loader writes over most of its own load area.

Steady state

The loader, in a paragraph

The file is a single PRG with a BASIC stub. SYS 2061 runs machine code that rewrites the stub in place to SYS 2072 (ANTISOFT) and passes control to $0818, which is a copier: it installs blocks at $CE00, $CF00 and the VIC registers at $D000 before the game proper starts. The result is a game that runs from $0800-$2FFF, $5000-$7FFF and $C000-$CFFF with the music player on the IRQ at $60F5. The loader's stages before the last hand-over are not annotated, by policy.

Memory footprint

Every byte of the C64's 64 KB, one pixel each, 512 to a row. Lit pixels are code, graphics, level data, sound, text, tables and variables; dim areas are screen and working memory.

WhatBytesOf 64 KB
Program48,03473.3 %
Code10,40615.9 %
Graphics8,95813.7 %
Level data14,14921.6 %
Sound2,8554.4 %
Text1,1931.8 %
Tables5,3668.2 %
Variables5,1077.8 %
Screen, bitmap, colour, stack, I/O5,3768.2 %
ROM the game runs under4,0966.2 %
Unused8,03012.3 %

The symbol map is symbols.json; the listing behind the Source tab is listing.json.