209 lines
6.5 KiB
Plaintext
209 lines
6.5 KiB
Plaintext
General notes
|
|
=============
|
|
|
|
Font palette:
|
|
- Standard text windows: 0x4 = background, 0xF = foreground
|
|
- File select/setup windows: 0x1 = background, 0x9 = foreground
|
|
|
|
Hard-coded characters:
|
|
- 0xFD: bullet (tile 0x1DD)
|
|
- 0xFE: equip (tile 0x1DE)
|
|
- Null (tile 0x1DF)
|
|
- Background (tile 0x1FF)
|
|
- 0xB4 - 0xBC: YOU WON! (tile 0x154)
|
|
|
|
0x2020C70: enemy data slots in-battle? separated by 0x94 bytes
|
|
0x2025038: enemy count (initial, not current)
|
|
0x20251D8: item drop
|
|
0x3000A00: Current PSI list when displaying a PSI window?
|
|
0x3000AA2: number of party members
|
|
0x3001D54: Ness items (16 bits each)
|
|
0x3001D70: Ness EXP
|
|
0x3001D80: Ness level
|
|
0x3001D84: Ness max HP
|
|
0x3001D86: Ness current HP
|
|
0x3001D8C: Ness max PP
|
|
0x3001D8E: Ness current PP
|
|
0x3001D94: Ailment?
|
|
00: conscious
|
|
01: unconscious
|
|
02: diamondized
|
|
03: paralyzed
|
|
04: nauseous
|
|
05: poisoned
|
|
06: sunstroke
|
|
07: sniffling
|
|
08: mashroomized
|
|
09: possessed
|
|
0A: homesick
|
|
0x3001D95: Mashroomized flag?
|
|
0x3001D96: Sleep flag?
|
|
0x3001D97: Strange flag?
|
|
0x3001D98: Can't concentrate flag?
|
|
0x3001D99: Homesick flag?
|
|
0x3001DA3: Ness offense
|
|
0x3001DA4: Ness defense
|
|
0x3001DA5: Ness speed
|
|
0x3001DA6: Ness guts
|
|
0x3001DA7: Ness luck
|
|
0x3001DA8: Ness vitality
|
|
0x3001DA9: Ness IQ
|
|
0x3001F04: Current party
|
|
0x3001F0B: Party character count
|
|
0x3001F0C: Active party member flags
|
|
0x3001F6A: Ness PSI flags?
|
|
0x01: Teleport alpha
|
|
0x08: Teleport beta
|
|
0x3002500: buttons being pressed
|
|
0x30051EC: tile offset (usually 0x100)
|
|
0x3005224: menu depth
|
|
0x3005228: current text palette, << 0xC
|
|
0x3005230: addresses of all 11 windows
|
|
[00]: A menu
|
|
[01]: Money
|
|
[02]: ?
|
|
[03]: Action subject ("Who?", etc.)
|
|
[04]: New equipment selection
|
|
[05]: Offense/Defense
|
|
[06]: Equip
|
|
[07]: PSI list
|
|
[08]: PSI classes
|
|
[09]: PSI target/PP cost
|
|
[0A]: PSI help
|
|
0x3005264: active window party member
|
|
0x3005270: address of tilemap start in WRAM, can use this to figure out X and Y
|
|
|
|
0x872E404: door destinations?
|
|
|
|
LDRB Rx,[Ry,#n]: n has range 0-31 (0x0-0x1F)
|
|
LDRH Rx,[Ry,#n]: n has range 0-62 (0x0-0x3E)
|
|
LDR Rx,[Ry,#n]: n has range 0-124 (0x0-0x7C) (0-1020 for SP- and PC-relative)
|
|
|
|
Custom WRAM: 2027FC0
|
|
|
|
Game code: ~0x0 - ~0x264FB
|
|
Movement-y stuff?: ~0x264FC - ~0x3697E
|
|
Text: 0x3697F - 0x8C4B0
|
|
More code: 0xA1F6C - 0xFCE6B
|
|
|
|
Code sequences
|
|
--------------
|
|
|
|
80BAB64: draw and render PSI party target window
|
|
80C4C24: equip window renders four (None)s in a row
|
|
80C4F80: going left in equip window
|
|
80C4F84: going right in equip window
|
|
|
|
Subroutines
|
|
-----------
|
|
|
|
8001720: play sound effect r0
|
|
8005B9C: malloc? r0 = byte count
|
|
801C104: return random number from 0 to r0 (exclusive)
|
|
80A2E00: door-related? r0 = source, r1 = dest
|
|
80A334C: store r0 to window memory
|
|
80B8AE0: draw PSI target/PP cost window with PSI index r0
|
|
80BD7AC: copy window buffer (primary/secondary)
|
|
r0 = 0: copy from primary (2028A58) to secondary (2030A40)
|
|
r0 = 1: copy from secondary to primary
|
|
80BD7F8: copy window buffer (primary/tertiary)
|
|
r0 = 0: copy from primary (2028A58) to tertiary (2031248)
|
|
r0 = 1: copy from tertiary to primary
|
|
80BE260: compute string pointer
|
|
r0: pointer table
|
|
r1: text base
|
|
r2: index
|
|
80BE458: initialize window. If text pointer == 0, also draw window borders.
|
|
r0: window pointer
|
|
r1: text pointer
|
|
r2: mystery halfword that gets copied to +0x2E
|
|
80BE4C8: initialize window. If text pointer == 0, also draw window borders.
|
|
r0: window pointer
|
|
r1: text pointer
|
|
r2: mystery byte that gets copied to +0x42
|
|
r3: mystery halfword that gets copied to +0x3E
|
|
sp+0: mystery halfword that gets copied to +0x34 and +0x40 if the window enable flag is unset
|
|
80C0A5C: render numbers on status window
|
|
80C1FBC: draw PSI window for character r0
|
|
80C239C: print PSI name with Greek letter
|
|
80C438C: check for cursor movements in PSI window
|
|
80C87D0: draw blank window and border (r0: window pointer)
|
|
80C8BE4: render main menu string to window r0
|
|
80C8FFC: render string to window r0
|
|
80C9634: render string (r1) to window (r0) at (x,y) (r2,r3)
|
|
80C96F0: render string (r1) to window (r0) at (x,2y) (r2,r3) using highlight [sp]
|
|
(does not modify any window values)
|
|
80C980C: print next character (r0: window pointer)
|
|
80CA4BC: scroll text upwards (r0: window pointer)
|
|
80D2E94: print party character name
|
|
80D30C4: related to printing numbers points in battle (r0 = window)
|
|
80D332C: related to printing names in battle (r0 = window)
|
|
80D7154: count party members and store to 3000AA2
|
|
then do some other stuff to the windows -- possibly drawing the HP/PP boxes?
|
|
80EBFD4: copy string from r0, of max length r1, to battle user slot, and terminate with [00 FF]
|
|
80EC004: get user string pointer
|
|
80EC010: copy string from r0, of max length r1, to battle target slot, and terminate with [00 FF]
|
|
80EC046: get target string pointer
|
|
|
|
8B1B8B8 has a jump table with 13 entries for the [1A FF xx 00] code:
|
|
00: ?
|
|
01: PC name
|
|
02: item name
|
|
03: ?
|
|
04: ?
|
|
05: PC name
|
|
06: ?
|
|
07: ?
|
|
08: ?
|
|
09: ?
|
|
0A: ?
|
|
0B: ?
|
|
|
|
|
|
Windows
|
|
-------
|
|
|
|
Window structure:
|
|
0x00 - 0x03: bitfield
|
|
0x00000001: enable
|
|
0x00000020: signals to redraw the window and borders (cleared by C87D0)
|
|
0x0000FFDE: ?
|
|
0xFFFF0000: we're stealing these for our hacks
|
|
0x0007: pixel X value
|
|
0xFFF8: unused
|
|
0x04 - 0x07: start address of text being displayed
|
|
0x08 - 0x0B: same as above?
|
|
0x0C - 0x13: unused?
|
|
0x14 - 0x17: text address offset
|
|
0x18 - 0x1B: ?
|
|
0x1C - 0x1F: ? (some kind of offset; used when printing nameable things?)
|
|
0x20 - 0x21: area (width*height)
|
|
0x22 - 0x23: window X (text area, not including border)
|
|
0x24 - 0x25: window Y
|
|
0x26 - 0x27: window width (tiles, not including border)
|
|
0x28 - 0x29: window height
|
|
0x2A - 0x2B: relative text X
|
|
0x2C - 0x2D: relative text Y
|
|
0x2E - 0x2F: ?
|
|
0x30 - 0x31: frame delay counter (counts down to 0, once per frame, after calling 1B FF xx xx)
|
|
0x32 - 0x33: ?
|
|
0x34 - 0x35: cursor X
|
|
0x36 - 0x37: cursor Y
|
|
0x38 - 0x43: ?
|
|
0x44: ?
|
|
0x45 - 0x4F: ?
|
|
|
|
Custom codes
|
|
------------
|
|
5E FF xx: load value into memory
|
|
01: plurality of enemies:
|
|
01 = one
|
|
02 = two
|
|
03 = three or more
|
|
5F FF xx: set current rendering location to xx
|
|
60 FF xx: add xx to current rendering location
|
|
|
|
Enemy data
|
|
----------
|
|
$8739D1C - $873D6DB
|