Well, another year has gone by, and I finally had some time to sit down and plug away on this problem again. Not solved yet, but I'm much closer now.
There's a bunch of weird MIPS stuff in the post battle routine that took a while to sort through, but I was able to unpack the element growth tables and verify that you can alter this table and unlock a slot anywhere in the element grid at any level, provided the character's stat block has the right mask to allow it.
The growth tables are explicitly defined as 100 consecutive 8 byte strides. Each 8 bytes represents one star level, with the character's growth stat at 0x03 determining which of the 8 bytes is used for their grid. I've compiled the standard 8x8 element grid with the table values that correspond to unlocking that slot as a reference, which I'll list below.
Element Grid
1 2 3 4 5 6 7 8
-----------------------
02 0C 16 20 2A 34 3E 48
03 0D 17 21 2B 35 3F 49
04 0E 18 22 2C 36 40 4A
05 0F 19 23 2D 37 41 4B
06 10 1A 24 2E 38 42 4C
07 11 1B 25 2F 39 43 4D
08 12 1C 26 30 3A 44 4E
09 13 1D 27 31 3B 45 4F
These values are actually pretty easily derived, despite the game's obtuseness in how it generates them. Given a row and column, the slot values is:
column * 10 + row + 2 //Decimal values, indexes start at 0
The table that the game generates ends up at 0x80101448 through some sort of DMA transfer, but I'm unfamiliar with doing traces of DMA requests through emulation. There's probably some way to find where it's coming from. That'll be my next test. In the meantime, here's the full, 100 star level entry, that represents the element growth for all characters:
☆LV Growth Pattern Index
----------------------------------
0 FF FF FF FF FF FF FF FF <--- 8 FF's mean the level up routine skips entirely
1 07 07 07 FF 08 08 08 07 <--- a single FF means that one growth index skips
2 11 11 11 FF 12 12 12 11
3 1B 1B 1B FF 1C FF 1C 1B
4 08 05 FF FF FF FF 26 05
5 24 0F 24 FF 09 FF 30 0F
6 12 19 FF 07 07 07 07 19
7 05 24 FF 11 11 11 11 24
8 0F FF 25 1B 1B 1B 1B FF
9 19 08 FF 25 25 25 25 08
10 25 25 FF 24 24 24 24 25
11 2E 2E 2E 05 05 05 05 2E
12 04 FF FF 2E 2E 2E 2E FF
13 23 23 FF 0F 0F 0F 0F 23
14 0E 04 FF 19 19 19 19 04
15 2F 2D 2F 2F 2F 2F 2F 2D
16 18 38 FF 04 04 04 04 38
17 09 FF FF 23 23 23 23 FF
18 38 0E 38 0E 0E 0E 0E 0E
19 03 2F FF 2D 2D 2D 2D 2F
20 0D 12 FF 18 18 18 18 12
21 2D 18 39 38 38 38 38 18
22 02 39 FF FF FF FF FF 39
23 22 FF FF 03 03 03 03 FF
24 17 1C 43 0D 0D 0D 0D 1C
25 1C 42 FF 39 39 39 39 43
26 42 03 42 22 22 22 22 03
27 13 37 05 17 17 17 17 37
28 26 22 08 FF 13 1C 42 22
29 39 26 0F FF 37 26 37 26
30 21 FF 19 FF 02 FF FF FF
31 0C 0D 12 FF 42 30 2C 0D
32 1D 41 23 FF FF 37 21 42
33 30 30 2D FF 0C 3A 41 30
34 37 17 37 FF 26 43 FF 17
35 43 02 41 FF 2C FF 36 02
36 2C FF 04 FF FF 02 2B FF
37 4C 4C 4C FF 43 42 43 4C
38 FF 3A 0E FF 30 2C 4C 3A
39 16 2C 1C FF 4C FF 3A 2C
40 3A 43 26 FF FF 4C FF 41
41 4D 21 18 FF 21 17 4B 21
42 FF 44 30 FF FF FF FF 44
43 44 0C 3A FF 4D 41 4D 0C
44 4E 36 4D FF FF FF 40 36
45 FF 4D 22 FF FF 36 35 4D
46 41 2B 2C FF FF 4D 4A 2B
47 27 4E 44 FF FF FF FF 4E
48 4B 40 FF FF FF FF FF 40
49 FF 4B FF FF FF FF FF 4B
50 FF 35 FF FF FF FF FF 35
51 FF 4A FF FF FF FF FF 4A
52 FF FF FF FF FF FF FF FF
53 FF FF FF FF FF FF FF FF
54 FF FF FF FF FF FF FF FF
55 FF FF FF FF FF FF FF FF
56 FF FF FF FF FF FF FF FF
57 FF FF FF FF FF FF FF FF
58 FF FF FF FF FF FF FF FF
59 FF FF FF FF FF FF FF FF
60 36 FF FF FF FF FF FF FF
61 FF FF FF FF FF FF FF FF
62 FF FF FF FF FF FF FF FF
63 40 FF FF FF FF FF FF FF
64 FF FF FF FF FF FF FF FF
65 FF FF FF FF FF FF FF FF
66 4A FF FF FF FF FF FF FF
67 FF FF FF FF FF FF FF FF
68 FF FF FF FF FF FF FF FF
69 3F FF FF FF FF FF FF FF
70 FF FF FF FF FF FF FF FF
71 FF FF FF FF FF FF FF FF
72 49 FF FF FF FF FF FF FF
73 FF FF FF FF FF FF FF FF
74 FF FF FF FF FF FF FF FF
75 4F FF FF FF FF FF FF FF
76 FF FF FF FF FF FF FF FF
77 FF FF FF FF FF FF FF FF
78 48 FF FF FF FF FF FF FF
79 FF FF FF FF FF FF FF FF
80 FF FF FF FF FF FF FF FF
81 FF FF FF FF FF FF FF FF
82 FF FF FF FF FF FF FF FF
83 FF FF FF FF FF FF FF FF
84 FF FF FF FF FF FF FF FF
85 FF FF FF FF FF FF FF FF
86 FF FF FF FF FF FF FF FF
87 FF FF FF FF FF FF FF FF
88 FF FF FF FF FF FF FF FF
89 FF FF FF FF FF FF FF FF
90 FF FF FF FF FF FF FF FF
91 FF FF FF FF FF FF FF FF
92 FF FF FF FF FF FF FF FF
93 FF FF FF FF FF FF FF FF
94 FF FF FF FF FF FF FF FF
95 FF FF FF FF FF FF FF FF
96 FF FF FF FF FF FF FF FF
97 FF FF FF FF FF FF FF FF
98 FF FF FF FF FF FF FF FF
99 FF FF FF FF FF FF FF FF
So for example, if you wanted Serge to unlock the most upper right slot in his grid at star level 1, after defeating the Komodo dragon boss, you'd change the first byte on line 2 from 0x07 to 0x48. Like this:
1 48 07 07 FF 08 08 08 07
That's the short of it, but if anyone knows how the DMA stuff works, I'd love a pointer. no$psx does spit out some debug TTY messages for when the DMA transfers happen and which interrupts get set, I just don't know how to interpret it yet. Getting a little further here will help me figure out where the table comes from, and hopefully mean we can more easily modify it.
Edit: Oh and I've compiled this info in a google doc that has a little better formatting. It can be found here->
Growth Table