1986 · Activision

Alter Ego

This minisite awaits a maintainer’s check. A model this site has not proven yet worked on it (one whose name was not recorded), so its claims have not been tested against the game (how the check works). It is not complete either: 94.1 % of the program is explained. Clone https://github.com/gamesexplained/gamesexplained and follow kit/START.md to continue games/c64/alter-ego to Silver.

A life simulation controlled through menus and choices. This capture begins at the male edition’s name prompt.

01 · Personality

Answers change the distance to 100

The questionnaire starts each trait at 50. A percentage increase takes a share of the distance still remaining to 100; a decrease takes a share of the existing score. Operations happen in question order, with each fraction rounded down before the next operation.

Effects of this answer

The two tables contain 25 score records each. Sixty complete native runs match the calculation used here, including every single-answer flip on both baselines. Statements retain the game’s wording. Scoring routine · TRUE records · FALSE records

These tables leave Intelligence, Physical and Vocational at 50. Question 22 TRUE sets a separate strict-parenting flag. The scoring routine produces the same result for the same answers; later stage-entry changes remain unverified.

02 · Name

Sixteen characters fit exactly

Alter Ego name prompt filled with sixteen characters

Ordinary keyboard input fills the 16-byte field. DEL removes the last character; further letters are ignored when the field is full. A full name has no zero terminator inside the field. Name editor · Stored name

03 · Drawing

Borders share their pixels

The menus use small border and fill patterns. Several directory entries share the same bytes or begin halfway through another pattern. Select one to see its eight rows.

All sixteen native glyph copies match these patterns. The row and column address tables select the destination bitmap cell. Glyph directory · Copy routine

04 · Allocation

An oversized request can wrap

The allocator adds a requested size to a 16-bit address, then checks the result against a stack guard. If the addition wraps, a small result can pass. This controlled example uses the same heap and stack addresses as the native boundary tests.

Heap starts at $C465; the expression-stack pointer is $CDF6 at the comparison, producing guard $CCF6 after subtracting $0100. Eight native tests match this calculation. A route from ordinary play to an overflowing request has not been established. Allocator

05 · Text

Eight codes in each compressed group

Scene text mostly uses ten-bit dictionary codes, eight in each ten-byte group. Only the first two codes use nine bits. Adding the first compound entry starts a fresh ten-byte group and throws away the six unused slots in the initial nine-byte group. Scene 26 contains 4,130 codes: two initial codes followed by 516 groups of eight.

MAP1 scene 26Size
Compressed bytes consumed5,169
Decoded bytes7,872
Descriptor slices39
Dictionary prefix and suffix bytes3,072

Independent decompression reproduces the complete dictionary and boundary table in this image, plus a 394-byte cached narrative descriptor. The name prompt does not display that descriptor. Native checks confirm the bit reader and width transition; the complete live disk/error path remains open. Dictionary · Group reader · Cached descriptor

06 · Scope

The program at the name prompt

The Source tab shows the male edition at its first name prompt: native routines, compiled bytecode and retained initialization data. Later gameplay replaces part of the program; male and female overlays need their own fresh captures. The purpose of several retained allocations and the earlier bootstrap fragment remains open.

RAM beneath the I/O chips contains a 2,048-byte copy of another resident VM region. Hardware accesses at those same addresses use a different occupant. Stored VM mirror