1984 · Mastertronic
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
The title screen names David and Richard Darling as programmers. The more specific roles below come from the sources named beside them.
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.
| Tier | gold |
|---|---|
| Coverage | 100 % of the bytes the game uses have a description |
| Build analysed | |
| Copy | human-edited |
| Tools | host: 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 |
| Model | deepseek/deepseek-v4.1-flash (10-orient), claude-opus-5-5 (20-features onward) |
| Kit version | 0.0.34 |
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:
work/play-idle.vsf and from a boot of the contributor's PRG on 28 September 2026 (reference/).reference/wiki-it-forest.png.https://www.c64-wiki.com/wiki/Chiller answered 404 on 28 September 2026, and so did Chiller_(Mastertronic), Chiller_(1985) and Chiller_(game). The wiki's search was not reachable. English Wikipedia's "Chiller (video game)" is Exidy's 1986 arcade game, a different game.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.
Where names the routine or table and, for live rows, the test (facts.md, Live tests; scripts in work/).
| Feature | Status | Where |
|---|---|---|
| The boy walks left and right | live | player_input $C71B, try_move $2A04; stick right X 128 → 151 |
| The boy jumps (stick up, or SHIFT) | live | fire_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 last | differs | There 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 it | live | sprite_touch $CE87 → poison_add $5B44; standing still, 69 hits on each when an enemy reached him (verify7.py) |
| No energy means the game is over | live | out_of_energy $5A70, screen_done $5D98; GAME OVER (reference/game-over.png) |
| Eating mushrooms restores energy | live | tile $54, tile_touch_b $5AC7, energy_add_slow $5B18: 23 steps; bar 119 → 142 against a control of 119 → 119 |
| Some mushrooms are poisonous toadstools | live | tile $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 screen | live | crosses_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 bar | live | hud_template $8400, copied by start_game; score $0406, crosses $041C, bar $042E |
| Enemies: ghouls, zombies, ghosts and bats | traced | Five 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 house | live | level_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 do | live | show_level_card $5BC7, cards $4100-$44E8 |
| After the haunted house, the same five screens in reverse, with the girl | live | records $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 girl | live | switch_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 controlled | live | tick_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 ones | live | cross_touch $7F50 reads colour bit 2; red crosses beside the boy were left |
| The goal is to get back to the car | differs | The 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 2 | live | $DC00 only (read_stick $C9C4) |
Keyboard: Z left, C right, SHIFT jump, ? switch players | live | read_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 ends | live | game_over_wait $7720, title card $7C00 |
| Music | traced | music_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 music | traced | This copy is the first release: its tune data matches the steward's V1 transcription byte for byte (facts.md, top) |
Found in the code, not in the manual (facts.md, Mechanics, Unused code and data, Bugs):
screen_store $7FE8), four of them into the RAM under the KERNAL, and the way back reads them from there. A mushroom eaten going out is gone coming back.land $53EF compares the fall with a limit and then does nothing: NOPs.$4D-$53 step to the next stage every 8th step on them and the last becomes a space.move_sprite's own Y clamp holds him there even in free fall over open space. The game still reads rows 23 and 24 for crosses, through the cell below or beside him, so every cross can be taken; see "Can every cross be reached?", below.speed_up $5681 halves their delays.$FFFF.$D023.$61F2-$727F match Music/v1music.asm in the steward's https://github.com/unorig/Chiller (branch Latest) byte for byte, and about 1,650 differ from v2music.asm; the steward confirmed on 29 September 2026 that V1 is the withdrawn release. The re-release changes the in-play tune and the gate-off compare at $60B6 (3 to 1); its data is in reference/music-v2.json for the page's player.$079A, ghetto-back $07C5, cinema-back $07CC) were each taken on the game's own code on 29 September 2026 by walking left along the ground, and the steward played this release through all ten levels the same day, taking every cross (facts.md, "Every cross can be taken"). Whether the crack the comment mentions changed anything is not known.facts.md); the manual's ghouls, zombies, ghosts and bats are not named in the code, so matching them to shapes is by eye only.How to get from the contributor's own copy to the analysed state. Someone else must be able to follow this exactly.
release v3.13.1, v3.13.1-macos-arm64-gui.dmg (tools/vice-mcp), PAL C64 (VIC-II 6569, SID 6581). check-emulator: 56 of 57, failing pause-at-instruction; stop with pause() in kit/c64/vice.py, never a bare vice_execution_pause (kit/skills/c64/tool-vice-mcp/workarounds.md).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.
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.tools_call → vice_machine_config_set {"resources": {"WarpMode": 0}} (the typed wrapper rejects the argument).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.work/play-idle.vsf — the play screen, untouched by input. This is the analysis image.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.
$0314/5 = $60F5, a RAM address: the music player (music_irq, facts.md), which ends through the KERNAL's $EA31. The hardware IRQ vector $FFFE is still the KERNAL's $FF48, which dispatches through $0314. The game left NMI alone: $FFFA = $FE43, $0318/9 = $FE47, $0316/7 = $FE66, $FFFC = $FCE2, all KERNAL defaults.$01 reads $36 across eight live samples during play, and the snapshot's processor-port byte (file offset 205) is $36 too: BASIC ROM banked out, KERNAL and I/O in. ($0001 in the RAM image reads $00, but that byte is not the port; c64-reference.)facts.md, Memory layout) put it in $0800-$2FFF, $5000-$7FFF and $C000-$CFFF, with the KERNAL's IRQ path above $E000. Nothing executed in $8000-$BFFF. At play time the load area $0801-$AF6A differs from the file in 40,882 of its 42,858 bytes.work/play-idle.vsf, not the .prg: the loader moves and overwrites most of what the file holds. The disassembler must hold the snapshot.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.
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.
| What | Bytes | Of 64 KB |
|---|---|---|
| Program | 48,034 | 73.3 % |
| Code | 10,406 | 15.9 % |
| Graphics | 8,958 | 13.7 % |
| Level data | 14,149 | 21.6 % |
| Sound | 2,855 | 4.4 % |
| Text | 1,193 | 1.8 % |
| Tables | 5,366 | 8.2 % |
| Variables | 5,107 | 7.8 % |
| Screen, bitmap, colour, stack, I/O | 5,376 | 8.2 % |
| ROM the game runs under | 4,096 | 6.2 % |
| Unused | 8,030 | 12.3 % |
The symbol map is symbols.json; the listing behind the Source tab is listing.json.