Loading listing…
1988 · Electronic Arts
Every routine, table and variable the game uses, with the names and descriptions given to them. Click an operand to follow it; the counter beside a label lists what refers to it. The reference below the fold is rendered from the game's facts file.
This game is in 64 parts, and the same addresses hold something else in each. Each part has a listing of its own, chosen from the list beside it.
Base Cochise, the reactor is loaded over Resident engine and loader and The game and Tile set 8. The listing shows them together, as the machine holds them; the rows of this part are marked.
The level of Base Cochise that holds "the main power panel of the reactor core" (message 19), signed "An arrow shaped plaque on the wall points to the right. The message on it reads -REACTOR CORE ROOM-." (message 28). It also holds a conveyor belt of repair machines (messages 44-52), a room of robots that wrestle (message 1), four stations that take four keys and arm the self-destruct (messages 4-11) and an escape pod (message 8). Map 18's exit 9 leads in at (16,16). Map 17's exit 12 (map-17 $3C7E) leads to (16,10), but no square, change or code of map 17 names it. It is 32 x 32 squares, stored on side 4 of the disks as 35 pages from T15/L19 (track 15, logical sector 19), entry 20 of the map directory at T35/L14 (engine point_at_maps, $28CE). Engine enter_map ($25BD) loads it to $3400-$56FF and unpacks its tile layer to $DE00-$E1FF. It is drawn with tile set 8 (tiles-8). Squares are given as (column, row). Every address here is this map's unless a part is named beside it.
$3400-$35FF and the number layer $3600-$39FF. The map record is at $3A00, since the map's byte in T35/L8 is not $40 (engine load_map_pages, $2606-$2616).$3A2C, the size: 32 (engine enter_map, $25D3).$3A30, the tile set: 8 (engine $25EE).$3A33, the tile drawn off the map: 0 (engine draw_square, $0B5E).$3A2F, random encounters: 1 chance in 70 after each step as stored (game random_encounter, $B017). $3A31: monster types 1 to 6 (game $B047). $3A32: the groups take the first 6 class-15 records, all there are (game $B040). The map's own code moves $3A2F and $3A31 (below).$3A34/$3A35, the time a step takes: a quarter of a minute (fraction 64, minutes 0; game advance_clock $AF32).$3A36, ticks: 1 a step, added to $D2 and to the elapsed count $04-$06 (game $AF58-$AF72), so game health_tick ($B795) runs every 16th step (game $AF75-$AF7B).$3A06-$3A25, engine action_record $09B8): 47 check squares, 27 exits, 27 message squares, 20 encounters, 16 remote changes, 9 action squares, 7 tile squares, 7 blocking squares, 6 question squares, 6 random-encounter slots (class 15) and 3 radiation squares. The lists' other words are $0000: 19 of the check list's 66, 9 of the exit list's 36, 4 of the tile list's 11, 3 of the message list's 30 and 1 of the remote-change list's 17.$4708 (header word 0, engine select_map_text $1E4F); 97-129 are the combat phrases the header's bytes +$37-+$5B name. No record, header byte or code of the map names message 52, "As you tried to jam the belt you got caught by the machine and pulled on to the belt."; check square 58's failure message (+3, $3E35) is 0.$45B1 (header word 1, game print_monster_name $9E5D) are 1 Laser Pod Blaster, 2 Titanium Clawer, 3 Silver Strangler, 4 Silicon Sniper, 5 Hunter, 6 Killer, 7 VTOL Auto-fire Robot, 8 Threshing Crawler, 9 Steel Reaver, 10 Xenon Laser Cannon, 11 Fusion Octotron and 12 Particle Beam Gattlin; name 0 is empty. The 13 monster records start at $46A0 (game monster_record $9EA4). The random-encounter slots ($4569-$45B0) show "A security robot attacks you from a hidden door.", "This security robot doesn't like your snooping." or "Security robots are climbing out of the walls." (messages 40-42).$3A28), the NPC list, holds $45B1, the monster names' address, and every encounter record's NPC nibble (+9, high) is 0, so it is not read (game order_hire $A424). The class-5 list word ($3A10) holds the action list's address, $3FEB, and no square or change is of class 5.$4267, message 22, 345 squares). Blocking square 1 ($4269), "A force-field blocks you." (message 25), stands on three of the four stations as stored, (30,1), (30,30) and (1,30). By the belt, blocking square 2 ($426B, 11 squares) says "No one but a SUPER genius would be able to understand the workings of this machine." (message 76); in the south-east room, blocking squares 3 and 4 ($426D, $426F, 22 squares) say "This is a tall rectangle of metal and light fixtures." and "Many lights and wires make up this electronic system." (messages 77 and 78); and at (23,29) blocking square 6 ($4273) says "This section is not working." (message 38).$3A9D-$3AB8): the arrows to the "-REACTOR CORE ROOM-", the "OSHA room", the "Robot Maintenence Room" and "Security Electronics" at (5,15), (5,16), (26,15) and (26,16) (messages 28-31), "THIS WAY", "THAT WAY", "THIS WAY OUT" and "OTHER WAY OUT" at (12,15), (12,16), (19,15) and (19,16) (messages 32-35), and "Read paragraph 47.", "79.", "130." and "118." at (5,11), (26,11), (26,20) and (5,20) (messages 72-75).Record byte 3 is the map an exit leads to (game square_exit, $89A3).
$41C1) on (16,15), to (2,30), asking first, with no message before the question.$4220), the escape pod, "ESCAPE POD ACTIVATED. NEXT POD BEING PREPARED." (message 8), to (16,8), asking first. Remote change 3 puts it on (16,9) when the self-destruct is armed (below), and its change writes nothing, so it stays for the next party.$41C6-$421F) push the party back from a wrestling robot, and exits 17, 18, 19, 22, 26, 27, 29, 30, 34 and 35 ($4225-$4258) move it along the conveyor belt (below).$3CD2), "The way is blocked by a heavy titanium-steel door. There is a card slot in the center." (message 15): the first pair passed decides the change (flag bit 3, game $8F4C-$8F56). Secpass B makes it tile square 4 ($3FDF, tile 0); ST 30 tile square 1 ($3FD9, tile 66), "This door has been knocked over against the wall." (message 67); Plastic explosive, a LAW rocket, a Sabot rocket or an RPG-7 tile square 0 ($3FD6, tile 72), "Little pieces of door are all over the place." (message 66). A failed Use shows "This door is harder to open than it appears." (message 26, flag bit 1). The same door without the card slot, check square 0 ($3B73), stands at (5,14), (5,17), (26,14) and (26,17) and opens to the same pairs but Secpass B.The code list, header word 19 ($3A26), is at $4013 and has eight entries, $402B, $403C, $404D, $405C, $406B, $4088, $408B and $4023. Action squares 0-8 ($3FFD-$4012) run entries 0-5, 5 again, 6 and 7. An action square whose record byte 0 is below $80 runs entry n (game run_action $8845: engine api_map_class_entry $0428 with Y = $10 at game $885E, then game jump_work_ptr $AC69), entered with the carry clear (the ASL at engine $09D5). When the routine returns, a set carry has the view redrawn (game $8872); then the record's change at +1/+2 is applied to the party's square (game $8840, alter_party_square $B105), and a written change runs the new square at once (game run_square_action, $ACC1).
$402B encounters_more_often, action square 0: $3A2F − 2, unless $3A2F is 0 ($402F) or the result is 0 or has bit 7 set ($4034, $4036).$403C encounters_less_often, action square 1: $3A2F + 2, unless $3A2F is 0 ($4040) or the sum is 100 or more ($4045).$404D more_monster_types, action square 2: $3A31 + 1, unless that is 12 or more ($4054).$405C fewer_monster_types, action square 3: $3A31 − 1, unless the result is 0 or has bit 7 set ($4063, $4065).$406B arm_self_destruct, action square 4: copies the elapsed count $04-$06 into engine countdown_start ($F4FA-$F4FC), sets engine countdown_armed ($F4F9) to 1 and $3A2F to 0 ($406B-$4083), calls engine api_screen_shake ($044C) at $4085 and runs on into explosion, which jumps there again.$4088 explosion, action squares 5 and 6: a jump to engine api_screen_shake ($044C): engine screen_shake ($0746) plays sound 0 and jolts the screen twelve times. It returns the carry that random_byte's last ADC left (engine $24EC; nothing after the last jolt at engine $0764 changes it), so whether the view is redrawn after it and after arm_self_destruct (game $8872) is chance.$408B show_countdown, action square 7: takes the low two bytes of the elapsed count less those of engine countdown_start from 240 ($408B-$40AA), keeping the result in the operands countdown_low_op ($40AE) and countdown_high_op ($40FC). The low two bits pick the seconds, 0, 15, 30 or 45, from quarter_seconds ($4102) into countdown_seconds_op ($40ED) ($40AD-$40B5), and two shifts leave the minutes ($40B8-$40C1). It prints message 17, "The screen shows a clock counting down. It shows ", the hours, ":", the minutes past the hour in two digits padded with 0, ".", the seconds and message 18, "." ($40C4-$40F3); minutes_to_hours ($40F8) divides the minutes by 60 through engine api_divide ($0410), which leaves the quotient in A and the remainder in $D3. So the clock reads 1:00.0 when armed and 0:59.45 a tick later. It returns the carry set, so the view is redrawn.$4023 stop_random_encounters, action square 8: sets $3A2F to 0.The header bytes lie in the map record. Engine enter_map writes the map back to the disk before it loads another (engine $25C3, save_map $2856-$288F, all 35 pages from $3400), so what the code writes stays with the map on later visits.
$3CC5, flags $80), "Before you is the main power panel of the reactor core. It appears to have a missing part and is not functional." (message 19), takes a Use of a Plasma coupler (item 76; map 15's loot bag 1 and map 16's loot bag 7 hold one, map-15 $3C20, map-16 $3CB6). It gives "Nothing seems to happen on the panel but in the distance you hear a low rumbling." (message 20) and makes the square remote change 4 ($430C): ""All stations powered," announces a loud computer voice." (message 23). (2,3) and (3,29) become tile square 4 ($3FDF, tile 0) and (28,2) and (29,28) tile square 10 ($3FE8, tile 51), which open the rooms; (23,29) becomes check square 65 (below); and the party's square becomes plain.$3C91), "This is a black three foot high cylinder. There is a small slot in the side." (message 4). A Use of the Blackstar key (item 61) gives remote change 0 ($4297): (30,1) becomes check square 17 ($3C9E), "This is a yellow cylinder with a slot in the top." (message 7), without a redraw, and (1,1) message square 21 ($3ABF), "Station 1 activated. Waiting for final station lock." (messages 82, 84, 83 and 88).$429F): (30,30) becomes check square 18 ($3CAB), "This is a purple white cylinder glowing faintly. There is a black slot on the side facing you." (message 9), and (30,1) message square 22, station 2. The Pulsar key (item 78) gives remote change 2 ($42A7): (1,30) becomes check square 19 ($3CB8), "This cylinder glows with a blue white light. In that glow you can see a small slot on the wall." (message 10), and (30,30) message square 23, station 3.$3ACE), "Station 4 activated." (messages 82, 87 and 83), whose change is remote change 6 ($4352): the four ways in are opened as remote change 4 opens them, and the four stations become question square 0 ($4112), "Press button to activate safety procedure #1342-666." (message 90).$4328): ""Safety procedure #1342-666 activated." You hear a hissing sound followed by a loud slam. You turn around and notice that the panel behind you has been sealed shut." (message 91). The four ways in become blocking square 0 again; (1,1) becomes question square 2 and the three other stations question square 1.$411A-$4169) ask "A small control panel with four lights blinking out of sequence is before you. R)ed. Y)ellow. G)reen. B)lue." (message 12), answered with one key. On question square 1 all four keys abort, and each of question squares 2-5 takes one key and aborts on the other three. Aborting is message square 25 ($3AD4), ""Incorrect activation sequence. Procedure aborted." You hear a hissing sound as the panel behind you opens." (message 94), whose change, remote change 6, opens the ways in and puts question square 0 back on all four stations.$437D), which makes (30,30) question square 3 and the party's square question square 1. Y there gives phase 2 (message square 27) and remote change 15 ($4545), which makes (1,30) question square 4; G there gives phase 3 (message square 28) and remote change 16 ($4551), which makes (30,1) question square 5. B there gives message square 29 ($3AE9), "Phase 4 activated." and "ALERT! Self destruction sequence activated. All personnel evacuate the base. This is not a test." (messages 95, 87, 83 and 11), and remote change 3.$42AF) opens the four ways in; makes (1,1), (30,1), (30,30) and (1,30) action square 7; (10,12), (20,12), (7,15) and (24,16) action square 5; (16,10), (15,20), (6,25) and (25,23) action square 6; (16,9), tile square 6 as stored ($3FE2, tile 22, a tile square that blocks), exit 16, the escape pod; and (16,16), where map 18's exit 9 lands, message square 4 ($42C4), the arrows' text (message 27). The party's square becomes action square 4, which runs at once: arm_self_destruct, then message square 3 ($3A9A), "SELF DESTRUCT IRREVERSIBLE! STATION NOW DETONATING! You hear several explosions in the background." (message 24), whose change is action square 7.$82B5-$82DF; module-4's facts). On this map a step is a tick and a quarter of a minute, so that is 240 steps, battle rounds or V)iews that come round to their first party on this map (advance_clock's callers, game $AE0A, $B393, $9BAE), and one hour of game time.$3E51, flags $80): "A message on a screen reads Security Check Interval." (message 56). A Use of Alarm disarm 3, Electronics 5, LK 7 or IQ 8 that passes gives "The screen reads Interval Reduced." (message 57) and action square 1, encounters_less_often; one that fails gives "The screen reads Interval Increased." (message 58) and action square 0, encounters_more_often.$3E64, flags $80): "There are eleven light plates on the panel and several are lit." (message 53). The same pairs: a pass gives "One of the light panels turned off." (message 54) and action square 3, fewer_monster_types; a failure "Another light panel has turned on." (message 55) and action square 2, more_monster_types.$FD, which trades the screen back with the carry clear (engine alter_square, $0A38), so each screen can be used again and again. From the stored 70 and 6, $3A2F can go from 2 to 98 and $3A31 from 1 to 11. Type 12, the Particle Beam Gattlin, is never drawn. Once arm_self_destruct or stop_random_encounters has set $3A2F to 0, neither screen changes it.$4230, $423F, $4244, $424A, $4254), each a step south, east, north, north or west. The other 22 are check squares that run on arrival, and their failure change is one of exits 18, 22, 26 and 34 ($422B, $4235, $423A, $424F), a step west, south, east or north, whose change, $FD, trades the check square back.$3D16-$3D2F, $3D43-$3D5C, $3D83, $3DB6, $3DD6, flags $50), test the first conscious member on skill 37 at difficulty 0, and a failure costs everybody CON, less each member's armour roll (flag bit 4; flag bit 0 clear, game $90AF-$90B4): 12d6 for "You are surrounded by the heat and flames of the welding machines." (checks 41 and 45, at (20,4)-(20,6) and (22,7)-(24,7), message 47), 8d6 for "The bolt tightening equipment has grabbed you." (checks 31 and 33, at (30,6), (30,7) and (29,5), message 44) and 4d6 for "All your dents are being pounded out of you." (checks 27, 29 and 36, at (27,7), (27,8), (27,9), (22,1), (24,1) and (25,1), message 16). Skill 37 is the marker only Dan Citrine's record holds (map-06 $44A0 + $BA/$BB), and at difficulty 0 having it is a pass, with no roll (game $8EA9-$8EAE): with him first, nobody is hurt and the square becomes plain.$64), at (29,9), (26,5), (26,2), (20,1), (20,2), (21,7) and (25,7), test every conscious member on Acrobat 4, DEX 7, AGL 7 or LK 11, and one pass is enough: "You grabbed an overhead bar and swung off the belt." or "You got lucky and were able to slip off." (messages 46 and 21), and an exit puts the party one square off the loop.$4225) as it moves the party, and exit 17 makes it exit 29 again: on every second round the square says "You are not a repairable robot. GET OFF." (message 5) and puts the party on (30,10), off the belt.$3DF6-$3E31, flags $64) on 8 squares, (25,6), (27,2), (21,3), (25,2), (19,3), (25,8), (26,8) and (29,10), test every conscious member on DEX 3 or AGL 3. If nobody passes, "Oh No! you've been caught by the machine and pulled on to the belt." or "Oops! The repair machines thought you were a robot and have put you on the belt." (messages 48 and 49), and an exit puts the party on it.$3E77, flags $82): "You see a gray oval with five light panels on it." (message 59). A Use of Electronics 5, LK 7 or IQ 9 that passes gives "The lights are now off." (message 60) and remote change 9 ($43A0), which makes the 15 trap squares exits that move the party on without harm; one that fails gives "The lights are on." (message 61) and remote change 10 ($43ED), which makes them traps again. Each, without a redraw, ends with $FD, which trades the switch back.$43F8), where the map as stored has check square 29. Check square 27's failure moves the party south, to (27,10), off the belt; check square 29's moves it east, along it.$3E32, flags $00): "The belt machinery is very delicate here." (message 50). A Use of a Crowbar, a Pick ax, a Sledge hammer, Plastic explosive, a Grenade, TNT, a LAW rocket, a Mangler, a Sabot rocket or an RPG-7 gives "The conveyor belt sounds like it is destroying itself as it grinds to a halt." (message 51) and makes the square action square 8: stop_random_encounters, then remote change 11 ($443A). That makes the 36 belt squares message square 13 ($3AAF), "The conveyor belt is not working." (message 6), the eight squares beside the belt and (19,1) plain, the switch at (20,27) blocking square 5 ($4271), "This control panel is shorted out and smoking." (message 81), and the party's square plain.$4170), "On the floor is an open container of U235." (message 69), 2d6 CON; 16 of radiation square 1 ($4173), "The floor is covered with Plutonium dust." (message 70), 3d6; and 6 of radiation square 2 ($4176), "A pile of Wastelandium glows brightly here." (message 71), 4d6. Each member not wearing a Rad suit (item 41) takes it and gets radiation poisoning, bit 0 of +$28 (game $82E0-$8332). Message 70 is even, so on radiation square 1 the member's AC, rolled in d6, comes off the 3d6; squares 0 and 2, messages 69 and 71, ignore armour (game $90AF-$90B4).$3CF6, flags $02): "In front of you is a floor to ceiling glass-steel wall. Beyond are the reactor controls." (message 36). A Use of ST 30, Plastic explosive, a LAW rocket, a Sabot rocket or an RPG-7 gives "The wall has shattered into a thousand pieces! You were lucky and didn't get cut." (message 37) and remote change 12 ($4523), which makes both squares tile square 9 ($3FE5, tile 72), "Pieces of glass crunch underfoot." (message 68). A failed Use shows message 26. The five changes after its pairs ($3D0B-$3D15) are not read, its flag bit 3 being clear (game $8C83, $8F4C).$3E97, flags $80), says "You see a square with all four corners lit up." (message 63). A Use of Electronics 4, LK 7 or IQ 8 that passes gives "All four corners are lit up." (message 64) and remote change 14 ($452F), which opens the four ways into the station rooms, without a redraw, and trades the square back ($FD). One that fails gives "All four corners are now dark." (message 65) and makes the square check square 64 ($3E88, flags $E4). Check square 64, which also stands at (23,30), tests every conscious member on arrival on Cryptology 4 or Perception 8, and a pass gives "The fine print reads Cylinder Closing System." (message 62) and makes the square plain.$3B92-$3C90, flags $64) stand on one square each: (2,19), (2,21), (5,22), (3,23), (7,23), (4,25), (7,25), (10,25), (2,26), (5,27), (8,27), (11,27), (6,28), (10,29) and (8,30). On arrival, "A robot rises from the floor in front of you. It starts to wrestle with you." (message 1), and every conscious member is tested on ST, Brawling or Pugilism, at difficulty 6 for checks 1-9, 7 for 10-12 and 8 for 13-15; one pass is enough. A pass gives "Your superior brawling skills defeated the robot." (message 2) and the square becomes plain.$3ED0-$3F83), one Silver Strangler, "The robot pushes you back and attacks." (message 3), and it moves the party one square north (exits 1-10), north-east (11-14) or west (15).$3FDC, tile 1), is the square before the way into the south-west station room at (3,29). The three squares beside it, (4,28), (5,29) and (4,30), are remote change 8 ($4389): "The floor in front of you slowly opens and a Giant Robot rises up to block your path." (message 45). It puts encounter 19 ($3FB4) on (4,29), one Fusion Octotron, "The Giant Robot is so tall it touches the ceiling. You'll have to get rid of it if you want to get past." (message 43), and makes the three squares plain. Wiped out, it leaves tile square 10 ($3FE8, tile 51).$3F84-$3FB3) stand at its corners, (10,10), (10,21), (21,10) and (21,21): one Particle Beam Gattlin each, "Intruder alert! Intruder alert!" (message 39).Current truth for this game. The workflow lives in kit/skills/; how this understanding developed lives in agent-history.md. Every fact names the routine or table it comes from. Unless marked live, a fact comes from reading the code in the snapshot named in orientation.md.
The game is in 64 parts (orientation.md, "The parts"): a resident engine, the programs loaded over it, nine tile sets and 42 maps. What is true of one part is in that part's own parts/<id>/facts.md, with that part's addresses. This file holds what spans the parts, and names the part beside every address it gives: "engine $25BD" is the engine's routine at $25BD.
PRODOS and 2.0 on sides 1 and 3 and the game's data in raw sectors on all four (orientation.md, "The image").$81AD), and its packed text "Electronic Arts and Interplay Productions proudly present" and "Copyright 1986-88 Interplay Productions." (startup $84BE, $8505).$514F) reads "A computer software poster reads, "WASTELAND!"" and lists programming, design, maps, graphics, general help and playtest, 26 credits to 20 people, ending "Rated PG-13. Coming soon to a theatre near you." It is one of four messages on one wall square (column 20, row 25, class 11), each bump showing the next: 91 "Coming soon, "The Radheads!"", 92 the credits, 93 and 94 two more films, then 91 again (live). Map 1's message 26 is a gravestone: "Ken St. Andre, 4/28/47--4/28/87." (map-01 $4300), shown on the graveyard's square at column 27, row 24 (live). The string sweep of every program part and the decoded text of every text block (the 52 blocks' 4,920 messages, 478 the programs' and 4,442 the maps') find no other credit: the start-up's lines above are the only others that name a maker.$7E06, against side 1's $7F2A; 2,766 of its 4,096 bytes differ), and its own boot sector, named "A JERKVISION PRODUCTION". Its credits read "Copyright 1986,87 Interplay Productions." where side 1's read "1986-88", and where side 1's start-up calls its title sounds, side 3's calls three RTS stubs ($7E03-$7E05) and writes no SID register. Booted, side 3 cannot run: its 2.0 loads side 3's track 34, logical sector 10 to $0200-$30FF, where side 1 has the engine and side 3 has other bytes, and the first raster interrupt after the hand-over goes through engine $04F9 into them and halts the processor on a JAM at $2931 (live). Run over side 1's engine instead, with side 3 in the drive, it shows a title picture it unpacks from side 3's track 3 and stops at "Computer defense initiative activated." (live, reference/side-3-start-up.png).$8600-$8FFF is the radio program's $7E00-$87FF, all 2,560 bytes.$874B-$87FF, and so also the Ranger Center's $8F4B-$8FFF, is the game's $874B-$87FF except two operand bytes ($87B4, $87B9), each 4 lower than the game's: a copy from a slightly different build of the game.$860B-$86FF is the engine's $0A0B-$0AFF.In play (parts/game/work/play-map.vsf), with $01 = $35: all RAM but the I/O area, both ROMs out.
| Range | What | Part |
|---|---|---|
$0000-$00FF | the engine's zero page; $02-$0F are saved with the game | engine |
$0200-$30FF | the engine: two jump tables ($0204-$044E, $04CF-$0504), its code and its text block ($29E4-$30FE) | engine |
$3100-$33FF | the item table: eight bytes an item | game |
$3400-$59FF | the map the party is in: class layer, number layer, record, lists, text and code | map-nn |
$5A00-$5AFF | the sector buffer | engine |
$5B00-$5BFF | tables and work space the boot file copies from its $C17B, among them the menu bar's text at $5BAB | engine |
$5C00-$5FFF | the screen matrix: the bitmap's colours | engine (output) |
$6000-$7DFF | the bitmap, 24 character rows | engine (output) |
$7E00-$C5FF | the program in play: the game, or the start-up, the utilities, the Ranger Center, the radio or the death screen | each its own part |
$C600-$C9FF | the font, the track table $C930, the key table $C953, the sound player $C993 and its three sounds | engine |
$CA00-$CFFF | a module, the party-order program, or a picture unpacked for the picture window | module-n, order |
$D000-$DD7F | the tile set, in RAM under the I/O area | tiles-n |
$DD80-$DDFF | the map window's scroll copy, in RAM under the I/O area | engine |
$DE00-$EDFF | the tile layer of the map, one byte a square, under the I/O area and above it | map-nn |
$EE00-$F3FF | cleared by the start-up (startup $7F3D-$7F55); the game keeps four 376-byte records from $EE00 (game $BBC7) | engine |
$F400-$FBFF | the game state: party tables, saved zero page, line buffer, character records from $F500, written to the disk as the save | engine |
$FC00-$FFFF | the fast loader's computer side, and the hardware vectors in RAM | engine |
The bitmap's 25th character row would be $7E00-$7F3F; with $D011 set to $37 (24 rows, startup $7F55-$7F57) it is hidden, except that screen_shake's random vertical scroll (engine $077A) brings its top lines into view for a moment, and the programs load from $7E00.
$FF00), installed by the boot file. It moves whole 256-byte sectors with no link bytes: a file is a track, a logical sector and a page count, and logical sectors run down from there.$FFD3, $FDEA, $FDD8, $FFE8).$C930 gives for that track (engine $FD0B). The table is laid out as if indexed by the track number less one, and is indexed by the track number: track 17 is entered at logical sector 0, track 24 at 17 and track 30 at 16, below their top sectors of 20, 18 and 17. Files are laid out on the disks by the same rule: maps 0, 2, 5, 11 and 19 cross one of those tracks, and each loads the sectors the rule names, not the ones a full track would give (the 42 maps loaded by the game's own enter_map compared with the image read both ways). The game writes through the same routine.$2790).$2759).$27C3).$C800 (glyphs $60-$7F, the lower case), from T35/L16 for each unpack and replaces from T35/L11 afterwards (engine $0524). T35/L11 holds the same 256 bytes as the third page of the font's own file, four pages from T34/L14 (engine $C800).$280C-$283E).$D7 $CC side on the masters, $00 $CC side on copies (orientation.md, "The play disks").$1897) reads T35/L8 and wants its byte $FD to equal $ED, its byte $FE to be $CC and byte $FF the side asked for; until they are, it prints "INSERT SIDE n. (RETURN)". $ED is 0 in play, so the masters are refused (live). The start-up sets $ED to $D7 only around the check of side 1 before it loads the utilities (startup $81E4-$81ED), which is how Copy reads the masters.$2856, from $25BD); a map entered by a number from $80 up (the generic maps 5 and 11) never is (engine $2858).save_game (engine $18EA) copies zero page $02-$0F to $F478-$F485, sums $F400-$FBFF into one byte (engine $1918: for each page and Y = 0-254, the sum plus the byte, then plus Y and the carry out of that first addition; the carry out of the second is dropped, and byte 255 of each page is left out), keeps the sum at $F4FF, scrambles bytes 0-254 of every page by EOR with (2*Y* mod 256) EOR the sum (engine $1944), writes page n to T35, logical sector 7-n, and unscrambles. The key is the byte at $F4FF, saved in clear. The start-up reads the eight sectors back, unscrambles them and compares the sum (startup $830E-$832D), but a sum that does not match is accepted: every byte is EORed with twice its offset again, which leaves it as stored EORed with the key alone, and the start-up goes on with no message (startup $832F-$834C). So a save written in clear with a key of 0 loads as written, unless the sum the start-up forms from it comes out 0. Live: member 1's cash set to 12,345 in play and saved with S and Y; the eight sectors read off the disk image afterwards are this rule applied to memory as the save began, all 2,048 bytes, with the key $6B the sum as the code forms it.save_game has no side check, so a save lands on the side in the drive. It is called by Save (game $8820, after asking for side 1), by Radio (game $8802, before asking for side 1), at the end of every map change (engine $2600), by modules 1 and 3, by the Ranger Center's Start and by the utilities.$3400: the class layer, a nibble a square, the high nibble for an even column (engine $0953); the number layer, a byte a square (engine $098E); then the map record, at $3A00 on a 32 x 32 map and at $4C00 on the four 64 x 64 maps, 0, 12, 22 and 26. From $DE00: the tile layer, a byte a square (engine $0B06), unpacked from the map's stream.$5C-byte header: address words for the packed text (engine $1E4F), the monster names and records (game $9E76, $9EA4), a list of records for each square class 0-15 (engine $09B8), the map's own routines (game $885C) and its non-player characters (game $A424); then the size (+$2C, engine $25D3), the chance of a random encounter after a step (+$2F, game $B017), the tile set (+$30, engine $25EE), the tile drawn off the map (+$33, engine $0B5E), what a step costs (+$34 and +$35, a fraction of a minute and minutes, and +$36, ticks of the elapsed count, game $AF32-$AF72), and 37 message numbers for the phrases of combat (+$37-$5B, game $BCE1, $BCE5).$ACF3, a table of 16 words) runs on the record that word number of the class's list names (engine $09B8): class 1 shows a message, 2 tests the party (skills, attributes, items, cash, party size), 3 and 15 are encounters, 4 shows another tile and a message, 5 is loot, 6 an action, 8 a question, 9 radiation, 10 an exit, 11 a wall that shows its message when walked into (game $915E), and 12 changes other squares. Classes 0, 7, 13 and 14 do nothing, and no map uses 7, 13 or 14.$0B80-$0B8A; live). Tiles 0-8, the party, the creatures, the loot bag and the sign, are the same bytes in all nine tile sets as they load (the nine sets compared byte for byte); maps 0 and 26 exchange tile 7's bytes with the jeep's or the train's for their rides (map-00 $4FCD, map-26 $4EF9).$A0, "ignore armour", to 1 (game $82E7), but the routine that applies the damage replaces it, for each member, with bit 0 of the square record's byte 0 (game $90AF-$90B4), which is the flag byte of the check squares it was written for and the message number of a radiation square. So armour counts on radiation squares whose message is even and not on those whose message is odd. The radiation records name messages 23 on map 0, 28, 29 and 30 on map 19, 69, 70 and 71 on map 20, 0 on map 26, 12 on map 31, and 43 and 0 on map 38 (live).$0A00). An action square's byte $80 + n loads module n to $CA00 and runs it; a smaller n calls the map's own routine n (game $8845).$09B8). On map 11 the square at column 24, row 13, a wall on the screen, is class 2 number 2, and word 2 of class 2's list is $0000, so its record is read from address 0 on: the processor's port registers, then zero page. Its flags are the port's direction register, $2F, which has no checks tested and the move refused; the message it shows is the byte at $0001, the port, $35. So walking into that wall prints map 11's message 53, "Ah! Fresh air and open spaces once again.", every time (live). The wall is next to squares the party can walk to from the map's exit at column 28, row 0 (a search of the map's classes).$43/$44 points at (engine $1DFB). The engine's is $29E4-$30FE, messages 0-169, and $30FF is a spare byte.$291D): code $1E capitalises the next letter, $1F adds $1E to the next code, and the code whose alphabet byte is 0 ends the message (engine $28F4).$1F42, $1F64): $0A singular or plural on the count $38, $0B the current character's name, $0C his or her, $0E him, her or it, $0F the count, $0D a new line, $05 and $06 wait for RETURN, space or back-arrow (wait_return, engine $2501).$6000 with its colours at $5C00, in VIC bank $4000 (live: $DD00 = $86, $D018 = $79, $D011 = $B7, $D016 = $D8). The start-up writes $D011 as $37 (startup $7F55-$7F57, $7F91-$7F93); bit 7 reads back as the high bit of the raster line, which was past 255 when it was read. Text is drawn into the bitmap from the 6-pixel font at $C600 (engine $1F03).$2947), which scans the keyboard; the NMI vector ends in an RTI, so RESTORE does nothing (engine $2966).$C953: Apple II-style codes with bit 7 set, no shifted keys, no repeat, one new key per interrupt (engine $29BD-$29D4).$1B36, $1BBF): the game's bar is "Use Enc Order Disband View Save Radio", and its hidden keys I, J, K and L move the party, back-arrow and space (game $7F18).$7E00-$8DFF replaced at the hand-over, side 3 attached): above.orientation.md, "The play disks").$6A from 0 to 1 and the roster drawn over the bottom of the map window.$57/$58 before and after each key).$DC00) and port B ($DC01) and, as the control, on the interrupt handler (engine $2947). The party stayed at column 55, row 62 ($57/$58), and in each hold port A was read 0 times against 203 or 204 reads of port B and as many interrupts; I then moved the party north, to row$AE26), play_sound_16 (engine $0741) and play_sound (engine $C993). The three steps the party took called each once; K, which the map refused, called none.kit/c64/frame.py and drawn by site/lib/c64.js: 0 of 104,448 pixels differ from the emulator's picture, with the roster hidden and shown.enter_map, its pages, stream and tile set measured with two fills (orientation.md, "The maps").$6B.enter_map and K (south, into the wall) pressed five times, with RETURN through the credits' six screens; the messages came 91, 92, 93, 94, 91, and the clock did not move.enter_map and L (east) pressed three times; each press printed message 53 and left the party, the square (class 2, number 2) and the clock as they were. The processor read $2F $35 at $0000-$0001 throughout.redraw_view (game $AC8C) at 5:00, 6:00, 12:00, 17:00 and 18:00. The 36 radiation squares around the building at columns 57-58, rows 36-37 showed the sign at 5:00 and 18:00 and plain ground at the other three.$7E63), its idle turn (game $7E93) and, as the control, the interrupt handler (engine $2947): 2,999 interrupts, 58,486 passes of the loop (19.5 a frame), three idle turns, and the clock from 1:24 to 1:36, four minutes a turn on the world map. So with no key pressed a turn passes about every 840 frames, 17 seconds on a PAL machine.$9F = $FF (no radiation in view), and 471 in the one chunk that held an idle turn. The port of the loop on the page makes 21.19 passes a frame on a processor that has every cycle; giving the video chip 1,075 cycles a frame brings it to 20.02, and the Geiger counter's player on the How it works page runs it so.$8382-$83C0; parts/ranger/facts.md).$A8C5) was skipped for all four members and they lost 22, 23, 16 and 14 CON; with it poked to 22 the roll was taken four times and nobody lost any.$8390 read the five dice of each of 1,000 attribute rolls: 1,043 ones, 869 twos, 786 threes, 727 fours, 749 fives and 826 sixes (even dice: 833 each), and two neighbours equal 699 times in 4,000. From play-map.vsf, a stub threw 4,096 pairs of dice with roll_2d6_open's instructions between them (engine $084A-$0850), each after the seed was moved 1 to 256 times as read_key moves it: 869 doubles, 21.2% (fair dice: 16.7%).enter_map, every member's weapon cleared so that all four fought with fists, and K (south) pressed: "3 Shambler Ghouls appear at 14 feet." With every member ordered to attack each round, ten melee rounds (game $7F64) brought three kills. Each kill was worth 40 experience (engine $1C-$1E at game $8163), and each killer's experience went from 0 to 80 across the two adds at game $8163 and $8166. The screen named the kill ("KIT hammers the Shambler Ghoul for 6 points of damage killing it.") and printed no experience.enter_map), every weapon cleared, then Hell Razor (record $F500) given LK 3 (+$10) and a Throwing knife (item 15) in slot 1, equipped (+$BD, +$1F = 1); K brought "2 Shambler Ghouls appear at 14 feet." With every member ordered to attack, the first throw stopped at game $A7E7, where weapon_damage has written the roll into its two ADC operands ($A7EC, $A7F0): the roll was 10, and 2 and 0 were written there, the roll of a 1 and a 1. weapon_damage returned 65,535 ($A7F3: X:A = $FFFF), the kill path at game $A6E5 ran, and the screen read "Hell Razor attacks and hits 1 Shambler Ghoul for 65532 points of damage spinning it into a dance of death." (reference/unlucky-throw.png).$A7C3); weapon_damage adds it to the roll with plain ADCs ($A7EA-$A7F0), while the melee path adds it through num2_add_clamped (engine $07C6), which stops at 0. Of the item table's thrown and fired weapons the Throwing knife has the fewest dice, 2 (item 15, byte 6); every other gun and rocket has 3 or more (the Mangler's and Sabot rocket's 2 × dice − armour is never fewer than their dice), and explosives take no luck ($A054). So only a 1 and a 1 on the knife with an LK of 3 or 4 goes below 0. No loot record of the 42 maps names item 15 or a random class-2 item (43 records, scanned with the levels page's port); Christina, NPC 1 of map 32 ($40AE), carries one in her slot 3. The ranger roll gives an LK of 3 or 4 for 261 of the 7,776 ways five dice fall (3.4%), the best three of five for 6. The highest hit-point seed of any named monster in the 42 maps is the Night Terror's, 32,000 (map 23, monster 1), which gives at most about 40,000 hit points (game $9483-$94B9).$05C5), the calls that pass its flags (engine $05DA) and the channels' step (engine $05E6), read every 50 frames. While the title's picture moved, the engine called the tick 3,508 to 3,553 times in 50 frames, every call passing the flags, and the channels stepped 7 times, about 7 steps a second; in a later stretch of the same sequence 2,624 to 3,176 calls and 5 or 6 steps. Between the two the flag at engine $AC was 0 and nothing moved.work/lead/sample.py): one stratum for each annotator's range, and one for the maps' descriptions that a decoder wrote, 7,973 comments (69%). Three agents that wrote none of the 63 checked them against the bytes: 48 were right, 14 had a wrong detail and 1 had the code wrong, so 15 of 63, 23.8% (Wilson 95% interval 15.0-35.6%). Weighted by the strata's sizes the rate was about 52%, because two of the three generated descriptions drawn carried an error of their template. The details were callers and paths left out, counts, the keys a prompt takes, and a field read alike for every value of a flag; the one wrong comment had taken an operand's value in the snapshot for a constant (map 49's poisoned needle, said to miss its target: the member comes from an operand the game writes when a Use begins). All 15 were rewritten to agree with the code.$7E0C); the skill list's header said to print on row 2, where the new line it opens with puts it on row 3 (module 2 $CC63); and play_sound's last write said to start the note, which sound 11's does not, its control byte $A4 having the gate bit clear (engine $C993). All three were rewritten, and so were five neighbouring comments of the death screen that left out the game's instructions in the same way.Pokes that change the game within its own parameters. Each one names the variable it changes and whether it has been tested live. Untested pokes are labelled as candidates.
| Effect | Poke | Status |
|---|