L'Empereur/ROM map

From Data Crystal
Jump to navigation Jump to search

Chip tiny.png The following article is a ROM map for L'Empereur.

Note that most functions in this game are essentially written in a higher-level computer language than 6502. By using a jump table, more complex operations are able to be identified by single hex codes. These functions are prefaced by "20 09 E5 ## ##" (JSR $E509) and terminated by the operation "CF". (## ## indicates how many memory spaces need to be dedicated to the new function, written as an inverse. A function that requires no new memory space will say "00 00", while one that requires 16 spaces will say "F0 FF".

Sometimes one of these functions will jump to a subroutine which is written "normally" (without upper-level operations). These routines are prefaced by "20 E3 E2 ## ## ##" (JSR $E2E3).

A list of these operations is located here. This same system seems to be used by the other MMC5 Koei games.

Page E0 ($A000-$BFFF)

ROM location: 0x00010-0x0200F

E0:A03A

Prints graphic (5) to tile coordinates (1),(3)

E0:A2CC

Checks if City 1 (1/2) can sail to City 2 (3/4). (5) = whether sea control matters

E0:A327

Checks if it's safe to sail from City (1/2). Returns 0 if city is landlocked or sea is controlled by a hostile nation; otherwise, returns 1.

E0:A39C

Checks if officer (1/2) is player-controlled.

E0:A3E0

Checks if commander of city (1/2) is player-controlled.

E0:A425

Checks if city (1/2) is adjacent to city (3/4) [by either land or sea]

E0:A443

Tallies & makes a list at (3/4) of nations meeting criteria (5).

Code Criteria            Child function
 0C  Living              $A805
 0D  Allied with (01/02) $A80F

E0:A805

Check if nation (3/4) exists. (Parameter 1/2 serves no function)

E0:A8A0

Verifies checksum when loading game(?)

E0:A99D

Erase sprites #(1) to #(1)+(3)

E0:B4E6

Tallies nation (1)'s (3):

00 = Number of cities
01 = Avg. food sufficiency?
02 = Avg. material sufficiency?
08 = Number of cities set as supply bases
0B = Number of centers of power

E0:BC7E

Determines which nation has control of sea (1/2).

00 = Baltic, 01 = North, 02 = Atlantic, 03 = Mediterranean

Page E1 ($8000-$9FFF)

ROM location: 0x02010-0x0400F

E1:86B6

Print graphic (1) to coordinate 16,14.

E1:8A1A

Prints the text "More will have no effect" & waits 3 time units for input before advancing.

E1:8A2C

Prints the text "No [x]", where [x] is entry #(1) in Page F8, Table 3

E1:8BA5

Identifies map location of city (01/02) from table $9F9F

E1:8BB8

Center map on city (1/2) and change banner to nation (3/4)

E1:8C4A

Retrieve text string (1) from Page F7.

E1:8C5B

Retrieve text string (1) from Page F8.

E1:8C6C

Retrieve text string (1) from Page F9 (Table $B076).

E1:8C8E

Retrieve text string (1) from Table 2 of Page F7

E1:8CA8

Retrieve text string (1) from Table 3 of Page F7

E1:8D4B

Print text string (1/2) as an officer quote.

E1:8DF1

Returns the difference in French aggression values between nations (1/2) and (3/4).

E1:9D13

Finds the officer in a city with the best given stat.

E1:9D73

Checks if France has won the game (captured all cities).

E1:9F9F

Table of cities by their map locations.

01 = Northwest, 02 = Northeast, 03 = Southwest, 04 = Southeast
01 DUBLIN       01
02 EDINBURGH    01
03 LIVERPOOL    01
04 BRISTOL      01
05 LONDON       01
06 CHRISTIANIA  01
07 STOCKHOLM    02
08 COPENHAGEN   01
09 AMSTERDAM    01
10 LUBECK       01
11 BERLIN       01
12 WARSAW       02
13 KONIGSBERG   02
14 STPETERSBURG 02
15 MINSK        02
16 SMOLENSK     02
17 MOSCOW       02
18 KIEV         02
19 KLAUSENBURG  04
20 BUCHAREST    04
21 BUDAPEST     04
22 VIENNA       04
23 PRAGUE       02
24 MUNICH       03
25 FRANKFURT    01
26 LILLE        01
27 ST.MALO      03
28 PARIS        03
29 BORDEAUX     03
30 LYON         03
31 MARSEILLES   03
32 MILAN        03
33 FLORENCE     04
34 VENICE       04
35 SARAJEVO     04
36 BELGRADE     04
37 ROME         04
38 NAPLES       04
39 ISTANBUL     04
40 ATHENS       04
41 CORUNNA      03
42 LISBON       03
43 GIBRALTAR    03 
44 MADRID       03
45 SARAGOSSA    03
46 BARCELONA    03

Page E2 ($A000-$BFFF)

ROM location: 0x04010-0x0600F

E2:A01F

Checks unit type of officer (1/2)

00 = Men (Infantry), 01 = Horses (Cavalry), 02 = Cannons (Artillery)

E2:A0D9

Finds officer with appropriate stat to be acting officer

E2:A3EB

Check if city has permission to attack. If a CPU officer is requesting an expedition, it prints that screen & awaits player input.

If autoplay is on, current city is not French, or Scenario is 1/2, return 1 (auto success).

Return 0 if player denies expedition. Return 1 if player grants expedition.

Return 2 if player attempted to deny expedition but officer disobeyed (Can randomly happen if officer has Simple trait).

E2:B94C

Tallies number of men assigned to officers in active city. If city has fewer than three officers, returns 0.

Page E3 ($A000-$BFFF)

ROM location: 0x06010-0x0800F

E3:A664

Upgrades active city's sufficiency value based on investment by player.

(1) = Sufficiency type (00 = Food, 01 = Mat, 02 = Med)

E3:B209

Checks if city (1/2)'s harbors are frozen over (Baltic in winter).

E3:B2C5

Calculates damages to fleets (1/2) (French) and (3/4) (enemy) during sea battle.

E3:B316

Determines whether Nelson appears in a sea battle.

E3:B3DC

Sea battle (enemy discovers your ships).

E3:B652

Check if supply shipment is raided by Cossack soldiers or guerrillas.

Page E4 ($A000-$BFFF)

ROM location: 0x08010-0x0A00F

Page E5 ($A000-$BFFF)

ROM location: 0x0A010-0x0C00F

E5:A05C

Recruiting POWs.

E5:A563

Exporting resources.

E5:A8FD

Set relationship between nations (1) and (3) to (5).

E5:AA0B

Trying to make an alliance.

Page E6 ($A000-$BFFF)

ROM location: 0x0C010-0x0E00F

Page E7 ($A000-$BFFF)

ROM location: 0x0E010-0x1000F

E7:A013

Officer (1/2) becomes a POW of nation (3/4)

E7:A354

Determines whether city resists invasion.

E7:A4E6

Play animation of invading officers moving to target city.

E7:B153

Determine losses to army?

E7:B743

Check if officer (1/2) is captured. (00 = Failure, 01 = Success)

E7:BF1A

Data table of the proper settings of the 4 lower bits of Napoleon's status based on the current Scenario

1 = 05
2 = 05
3 = 06
4 = 07
5 = 07 (Scenario 5 is not in the NES version; this is leftover data from being ported)

Page E8 ($A000-$BFFF)

ROM location: 0x10010-0x1200F

Contains functions pertaining to CPU actions during the city phase.

E8:A8DF

Main function for all CPU city actions.

A8E4 AA D1 7C    / Push $7CD1/$7CD2 to stack / (+2) Active city
A8E7 E9 DB BA 02 / Run function $BADB        / (-2)
...

E8:B08D

Toggles supply status flags for the active city based on command (1).

  00: Turn on flag #$40: Food supply low
  01: Turn off flag #$40: Food supply high 
  02: Turn on flag #$80: Material supply low
Else: Turn off flag #$80: Material supply high

E8:B0CD

Improves sufficiency value (1) of active city. (00 = Food, 01 = Material)

E8:B16D

Spends the amount of gold specified in $78BC/$78BD to recruit soldiers.

[X] gold = Soldier reserves increased and population decreased by [X/3]
           Food decreased by [X/5]

E8:B1AB

Active city spends gold to purchase horses (up to 9999).

E8:BADB

Page E9 ($A000-$BFFF)

ROM location: 0x12010-0x1400F

E9:A013

Checks if nations (1/2) and (3/4) are in good standing.

Returns 00 if hostile or neutral w/ difference in aggression 5 or more
Returns 01 if friendly/allied or neutral w/ difference in aggression 4 or less

E9:A068

Checks if nations (1/2) and (3/4) are in bad standing.

Returns 00 if friendly or difference in aggression 75 or less
Returns 01 if not friendly & difference in aggression 76 or more

E9:A09F

Checks if nations (1/2) and (3/4) are friendly.

E9:A0F6

Checks if nations (1/2) and (3/4) are hostile.

Returns #$00 if no. Returns #$20 if yes.

E9:A119

Checks if nations (1/2) and (3/4) are on good terms and if so, attempts friendship?

E9:AC4A

Prints text "Press any button".

E9:AC57

Display acting officer as active nation's envoy.

E9:AC9A

Prints text "[Active nation] .. [text string (01)] .. [Target nation]"

E9:ADD5

Set diplomatic status of Active and Target nations to (01).

Page EA ($8000-$9FFF)

ROM location: 0x14010-0x1600F

Page EB

ROM location: 0x16010-0x1800F

Page EC

ROM location: 0x18010-0x1A00F

Page ED ($8000-$9FFF)

ROM location: 0x1A010-0x1C00F

Page EE

ROM location: 0x1C010-0x1E00F

Page EF ($8000-$9FFF)

ROM location: 0x1E010-0x2000F

Page F0

ROM location: 0x20010-0x2200F

Page F1

ROM location: 0x22010-0x2400F

F1:80A9

Start-of-Month Phase main loop

F1:81D7

Month advance + Start-of-Month prep

F1:8370

Load event icon (1)

F1:94DA

Nation (1/2) becomes a satellite of nation (3/4)

F1:9918

Print death text of officer (1/2)

F1:9952

Officer (1/2) dies of old age.

F1:9A37

Officer age-up & random deaths

F1:9E3E

Check if two nations are adjacent by land.

F1:9ED4

Nation (1/2) requests protection from France

Page F2

ROM location: 0x24010-0x2600F

F2:A07E

Check for protection requests

F2:B463

Tick down alliance timers

Page F3

ROM location: 0x26010-0x2800F

Page F4

ROM location: 0x28010-0x2A00F

Page F5

ROM location: 0x2A010-0x2C00F

Page F6

ROM location: 0x2C010-0x2E00F

Page F7

ROM location: 0x2E010-0x3000F

Page F8

ROM location: 0x30010-0x3200F

Page F9

ROM location: 0x32010-0x3400F

Page FA ($A000-$BFFF)

ROM location: 0x34010-0x3600F

FA:A004

Table of Nations

$A004 + #$0A x (Nation code) = Beginning of nation data starting with name and ending with hidden stat.

FA:A09A

Table of Cities

$A09A + #$20 x (City code) = Beginning of city data starting with name and ending with hidden stat.

FA:A650

Table of Officers

$A650 + #$11 x (Officer code) = Beginning of officer data starting with name and ending with hidden stat.

See Notes for more detail on hidden stats.

Page FB

ROM location: 0x36010-0x3800F

Page FC

ROM location: 0x38010-0x3A00F

Page FD

ROM location: 0x3A010-0x3C00F

Page FE ($C000-$DFFF)

ROM location: 0x3C010-0x3E00F

FE:C003

Main game loop. Executes all game functions then waits until interrupt

C008 61          / Push #$01 to stack           / (+2)
C009 E9 6F CF 02 / Run function $CF6F           / (-2)
C00D 8D 1F       / Push #$1F to stack           / (+2)
C00F 60          / Push #$00 to stack           / (+2)
C010 E9 C9 CF 04 / Run function $CFC9           / (-4)
C014 8D 14       / Push #$14 to stack           / (+2)
C016 67          / Push #$07 to stack           / (+2)
C017 E9 BC C3 04 / Run function $C3BC           / (-4)
C01B AA 00 60    / Push $6000/$6001 to stack    / (+2)
C01E 8E 16 DF    / Push #$DF16 to stack         / (+2)
C021 E9 27 C6 04 / Run function $C627           / (-4)
C025 61          / Push #$01 to stack           / (+2)
C026 64          / Push #$04 to stack           / (+2)
C027 E9 1E EF 04 / Run function $EF1E           / (-4)
C02B B3          / Push M8 to stack             / (+2)
C02C 8E 22 DF    / Push #$DF22 to stack         / (+2)
C02F E9 27 C6 04 / Run function $C627           / (-4)
C033 62          / Push #$02 to stack           / (+2)
C034 64          / Push #$04 to stack           / (+2)
C035 E9 1E EF 04 / Run function $EF1E           / (-4)
C039 B3          / Push M8 to stack             / (+2)
C03A 8E 2A DF    / Push #$DF2A to stack         / (+2)
C03D E9 27 C6 04 / Run function $C627           / (-4)
C041 D6 41 C0    / Jump to $C041                / Stall until interrupt
C044 CF          / Exit

FE:C045

Wait for (1) frames

FE:C052

Wait for 6*(1) frames

FE:C062

Wait (1) time units for input before advancing message automatically

Time unit = 5*(message speed) frames

FE:C232

Officer gains 1 EXP.

Parameter 1/2 = Officer address

C237 0C          / Store parameter 1/2 to M8    / Officer address
C238 76          / Add #$06 to M8               / Officer exp address
C239 2B          / Store M8 to storage 1/2      
C23A 0B          / Store storage 1/2 to M8      
C23B B3          / Push M8 to stack             / (+2)
C23C D3          / Replace M8 with 1-byte value / Officer exp (old)
C23D D0          / Increment M8                 / +1 exp
C23E D4          / Pull 2 meta, store $0008     / (-2) Update exp
C23F 0B          / Store meta 01/02 to M8 
C240 D3          / Replace M8 with 1-byte val   / Officer exp (new)
C241 8B 64       / Store #$64 to MC             
C243 C9          / Check if M8 >= MC            / Check if 100+
C244 D8 4F C2    / Jump to $C24F if not         / Exit
C247 3B          / Push storage 1/2 to stack    / (+2)
C248 40          / Store #$00 to M8
C249 D4          / Pull 2 meta, store $0008     / (-2) Roll EXP over to 00
C24A 3C          / Push params 1/2 to stack     / (+2)
C24B E9 D6 C1 02 / Run function $C1D6           / (-2) Officer Levels Up
C24F CF          / Exit

FE:C26E

Retrieve city of officer (1/2)

FE:C2D2

Retrieve nation of city (1/2)

FE:C3E9

Print text string (1/2)

FE:C627

Print text string (1/2), replacing %s with (3/4) [and %d with (5/6)]

FE:C65F

Advances random number generator then checks for controller input (1)

0 = both controllers (1 then 2), 1 = controller 1, 2 = controller 2

FE:CD85

Reduce value at address (1/2) by (3/4)%. Returns difference

FE:CD9F

Checks if BGM is on, and plays audio (1) if so?

FE:D019

Retrieve name of nation (1/2).

FE:D085

Retrieve name of officer (1/2).

FE:D0E6

Retrieve list of cities adjacent by land to (1/2).

FE:D10B

Retrieve hidden stat (3) for city (1/2).

FE:D17A

Retrieve hidden stat (1) for officer (1/2).

00 = Personality traits

FE:D27F

Change to screen template (1)

FE:D3B6

Reduce value at address (1/2) by (3/4)%

FE:D402

Tally # of men assigned to officers in city (1/2).

FE:D43B

Tally # of officers in city (1/2).

FE:D460

Isolate flags (3) in (1). (bitwise AND)

FE:D69D

Generate random number from #$0000-#$7FFF

FE:D7B0

Update RNG seed (done after $D69D)

FE:D7D1

Generate random number between #$00 and #$(1/2)

FE:DCD6

Find smaller of values (1/2) and (3/4)

FE:DCF6

Find larger of values (1/2) and (3/4)

FE:DDCA

Take ratio (3)/(5) of value (1)

FE:DE0F

Find (3)% of (1)

FE:DE2C

Add (3/4) to 2-byte value (1/2) up to a max of (5/6)

FE:DE2B

Add (3/4) to 1-byte value (1/2) up to a max of (5/6)

FE:DE6E

Reduce 2-byte value at (1/2) by (3) to a minimum of zero

FE:DE77

Reduce 1-byte value at (1/2) by (3) to a minimum of zero

Page FF ($E000-$FFFF)

ROM location: 0x3E010-0x4000F

FF:E2E3

Prep for assembly functions.

FF:E509

Prep for higher-level functions.