MISSILE COMMAND
The default high score table is the result of an informal two day high score contest with everyone who contributed to the game. The contest happened near the end of the games development, the result of which became the default table (see picture):
DFT - Dave Theurer (designer
and lead programmer)
DLS - Dave Sherman (hardware lead)
SRC - Steve Calfee (Chief Engineer of Software Engineering
RDA - Rich Adam (junior programmer. Contributed many sound routines and
contributed idea for bombers and satellites)
MJP - Mary Pepper (electrical engineer)
JED - Jed Margolin (Head of Special Projects in Engineering. Designed power
supply and other components)
DEW - Dave Wiebenson
GJL - Gerry Lichac (Trak-Ball designer)
There's an unpopulated portion of the board that is there to drive lights on the prototype's marquee that responded to events in the game. Someone has reverse-engineered and gotten it to work though the code to drive it hasn't been found (LINK).
There are 6 different score multipliers and 10 different screen color
combinations:
1x - black with yellow ground. Waves 1 and 2
2x - black with blue ground. Waves 3 and 4
3x - black with red ground. Waves 5 and 6
4x - black with red ground. Waves 7 and 8
5x - dark blue with yellow ground. Waves 9 and 10
6x - light blue with yellow ground. Waves 11 and 12
6x - purple with green ground. Waves 13 and 14
6x - yellow with green ground. Waves 15 and 16
6x - white with red ground. Waves 17 and 18
6x - red with yellow ground. Waves 19 and 20
Starting with wave 21, the color combinations start to repeat.
BUG: The 2nd manual revision has the trak-ball dip switch settings reversed.
BUG: Hard waves Starting at wave 101, an extra missile or two are launched out at the same time as the others (so, 4 instead of 3 for example). This continues for a good 50 screens or so. {Tony Temple}
BUG: Free cities At about 810,000 points youre awarded exactly 176 bonus cities. At that point, you cant earn any more until you roll the score.
BUG: 0x waves Wave 255 is a 0x score multiplier wave. This score multiplier is really 256 times the missiles and cities you have left. When you clear this wave and the next 0x wave (256) starts, it's not playable and it immediately tallies your missiles and cities. Wave 257 actually takes the player back to wave 1 (black with yellow ground), skipping the white/red and red/yellow combinations. The difficulty also resets back to wave 1.
BUG: Reset
If you have too many extra cities
(255 or within a few of it) on a 0x wave, the game will reset. The 810K 176
extra city bug awards all the extras instantaneously, so the city count can roll
over 256 at that point, and this is key in managing city count throughout a
marathon. The 0x scoring bonanza does not award all the cities instantaneously,
the game just dishes out loads of points then tallies up the earned cities at
board's end as usual.
Once a player reaches wave 255, the following code is executed to calculate the
point values* bonus multiplier. When the screen number ($A7) is 255, the
addition of 1 gives a value of 0 in Reg A. When this is compared to 6, it is
less, so 0 will be used as the multiplier. In the code after label LBL295, 0 is
used as a counter to sum up the bonus, but when the counter is decremented the
first time, 0 goes to 255, causing the code to do (25*256) instead of the wanted
(25*6). On wave 256, this same problem will occur. The wave number will be 0;
adding 1 to this and then doing a LSR will give a value of 0 in Reg A.
As for why there is no attack on wave 256, the following code explains it. On
wave 256, the screen number value is 0, which is used as an index in a lookup
table to get the number of missiles and smart bombs for that wave. However, the
programmer never expected a player to get to screen 256, so the lookup in the
table is not valid. Luckily, the values read are both 0. This tells the game
that there are no missiles or smart bombs to launch, so the wave is over and the
game just adds up the 30 missiles and the remaining cities. After this, the wave
number increments to 1, which is the value at the start of the game, so that's
why it looks like the game starts over.
In the code below, entering subroutine 170, the dip switches are read and used
to get the number of points for a bonus city. If the game is set to no bonus
cities then the code is not run, which is why the bug is not seen when the game
is set for no bonus cities awarded. The upper 4 digits of the player score are
read and stored in $98 and $99. The 6502 is put in Binary Coded Decimal mode to
do the actual calculation. The bonus city value is then subtracted from the
users score, and if the result is not negative then the temp bonus city counter
is incremented. If the players score is still positive after the subtraction
then it is done again. The bug occurs when the upper 2 digits are 81. When the
bonus city value of 1 is subtracted, the result is 80, letting the N flag be set
causing the BMI branch to be taken in error. When the bonus city calculation is
done after LBL357, the temp city count is 0 because of the error. The previous
bonus city value is 0x50 because of the city awarded at 800K. When we do 0 -
0x50 we get 0xb0, which is 176 added to the bonus city count. The previous city
count is then updated to 0. As long as the score stays over 810K, the BMI branch
will be taken in error and no more bonus cities will be given until the score
roles over.
SUB145:
LDA #$00 ;Load A with 0x00
STA $BA ;Clear out $BA
STA $BB ;Clear out $BB
LDA $A7 ;Load screen number
CLC ;Get ready for add
ADC #$01 ;INC screen number
LSR ;Do div 2 so bonus increases 2 screens
CMP #$06 ;See if we are at 6X
BCC LBL295 ;If it's less than 6
LDA #$06 ;Else set to 6
LBL295:
STA $DD ;Save to bonus multiplier
TAX ;Move multiplier to X to be used as a counter
LBL296: ;Calc 25*bonus and save in $BB,$BA in BCD
SED ;Set BCD mode
LDA $BA ;Get lower byte
CLC ;Get ready for add
ADC #$25 ;Add 25 to it
STA $BA ;Save
LDA $BB ;Get upper byte
ADC #$00 ;Add carry if any
STA $BB ;Save upper byte
CLD ;Clear BCD mode
DEX ;Dec bonus count
BNE LBL296 ;If we are not at 0