So here is what I found out:

The password consists of 8 decimal digits:

Code: Select all

```
Digit #1: (minutes div 10 + digit #3) mod 10
Digit #2: ((level - 1) mod 4 + digit #3) mod 10
Digit #3: anything
Digit #4: (minutes mod 10 + digit #6) mod 10
Digit #5: checksum mod 10
Digit #6: anything
Digit #7: checksum div 10
Digit #8: ((level - 1) div 4 + digit #6) mod 10
```

Start with 0, and then add the digits together from #1 to #8.

When you reach the checksum digits (#5 and #7), you need to use the *current* value of the checksum, mod or div 10!

Other points of interest:

* The hit points are not stored in the password. Instead they depend on the current level:

Code: Select all

```
Level 1 2 3 4 5 6 7 8 9 10 11 12 13 14
Hit points 3 3 3 3 3 4 4 4 4 5 5 5 4 5
```

* The game accepts passwords for level 15 and 16.

These will load some garbage levels. Screenshots here: http://popuw.com/nes.html

On these levels, the D-pad doesn't work, but the A and B buttons do work.

* The level number is masked to four bits, so level 17 is level 1, level 18 is level 2, and so on.

* Minutes can be anything from 00 to 99, even though the game starts with 60 minutes left.

* The remaining seconds or ticks are not stored in the password.

Passwords with 0 minutes left sometimes immediately show the bad ending, sometimes the *same* password gives about half minutes of time.

Sometimes the bad ending appears while the prince is running towards the exit in the password room!

* The purpose of the "anything" digits is probably to make the structure of the password less apparent.

* There are at least five versions of the game: Europe (E), France (F), Germany (G), Spain (S), USA (U).

This information applies to all of them.

* The game considers the password 00000000 to be invalid, even though it would be a valid password for level 1 with 0 minutes left.

* The game decodes the level number in the following way:

Code: Select all

```
level_high := (digit #8 - digit #6 + 10) mod 10;
level_low := (digit #2 - digit #6 + 10) mod 10;
level := ((level_high * 4) or level_low) mod 16;
level := level + 1;
```

This is important only for custom-made passwords, because the game always makes passwords that result in level_high and level_low both to be within 0..3, and in that case, the two operations are equivalent.