The current URL is datacrystal.tcrf.net.
L'Empereur/ROM map: Difference between revisions
Line 455: | Line 455: | ||
C03D E9 27 C6 04 / Run function $[[L%27Empereur:ROM_map#FE:C627|C627]] / (-4) | C03D E9 27 C6 04 / Run function $[[L%27Empereur:ROM_map#FE:C627|C627]] / (-4) | ||
C041 D6 41 C0 / Jump to $C041 / Stall until interrupt | 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=== | ===FE:C232=== | ||
Line 481: | Line 492: | ||
C24B E9 D6 C1 02 / Run function $[[L%27Empereur:ROM_map#FE:C1D6|C1D6]] / (-2) Officer Levels Up | C24B E9 D6 C1 02 / Run function $[[L%27Empereur:ROM_map#FE:C1D6|C1D6]] / (-2) Officer Levels Up | ||
C24F CF / Exit | 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)== | ==Page FF ($E000-$FFFF)== |
Revision as of 06:13, 4 January 2019
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.