Main feature
Awwww… too bad that Deoxys' stats are not recalculated after each fight like in Gen III, otherwise I would have used that.
First and foremost, you have to know that the game double-checks for the 100 EV limit:
the first check is triggered by the corresponding vitamin,
the second check is run no matter the used vitamin.
Now we choose a value to replace 64 (100) with, might as well use FC (252) for convenience's sake.
Here's how you proceed to lift the limit:
Decompress arm9.bin
Case-by-case checks
Go to offset 0×90034* and change the value 64 into FC, this is the check for the HP Up
Go to offset 0×900A0* and change the value 64 into FC, this is the check for the Protein
Go to offset 0×9010C* and change the value 64 into FC, this is the check for the Iron
Go to offset 0×9017A* and change the value 64 into FC, this is the check for the Carbos
Go to offset 0×901E8* and change the value 64 into FC, this is the check for the Calcium
Go to offset 0×90254* and change the value 64 into FC, this is the check for the Zinc
* Regions' differences
Language Offset 1 Offset 2 Offset 3 Offset 4 Offset 5 Offset 6
Japanese 0×8F910 0×8F97C 0×8F9E8 0×8FA56 0×8FAC4 0×8FB30
Spanish HG 0×9002C 0×90098 0×90104 0×90172 0×901E0 0×9024C
Korean HG 0×90728 0×90794 0×90800 0×9086E 0×908DC 0×90948
Korean SS 0×90720 0×9078C 0×907F8 0×90866 0×908D4 0×90940
Others 0×90034 0×900A0 0×9010C 0×9017A 0×901E8 0×90254
[*]Global check
Go to offset 0×90A96* and change the value 64 into FC
Do the same at offset 0×90ABC* and offset 0×90AC0*
* Regions' differences
Language Offset 1 Offset 2 Offset 3
Japanese 0×90372 0×90398 0×9039C
Spanish HG 0×90A8E 0×90AB4 0×90AB8
Korean HG 0×9118A 0×911B0 0×911B4
Korean SS 0×91182 0×911A8 0×911AC
Others 0×90A96 0×90ABC 0×90AC0
Bonus feature 1: Change how many EV are given by each vitamin
Open the folder a/0/1/7.
The amount of EV added for one given stat W by its respective vitamin X is located at byte Y on file Z.
Stat Vitamin Byte File
(W) (X) (Y) (Z)
HP HP Up 21 45
Attack Protein 22 46
Defense Iron 23 47
Speed Carbos 24 48
Sp.Atk. Calcium 25 49
Sp.Def. Zinc 26 52
Note: First byte is assumed to be byte 0, not byte 1.
That byte always has a value of 10 (0A), it's a signed value who can subtract as much as 128 EV (80) or add as much as 127 EV (7F).
We're going to change that value to one who can divide 252 (FC) while staying very close to 10 (0A).
Why not 12 (0C)?
But what if you want to put EV not divisible by 12 in one particular stat?
Well, that's what EV-reducing Berries are for
Since the Vitamins are set up to give 12 EV now, it means the modulo applied here is a modulo 12.
But at Lv.100 1 point in a stat equals 4 EV, thus we have to apply a modulo 3 instead (12/4).
Modulo 3 is 0 => remainder of Wanted_EV/12 is 0 => no correction needed.
Modulo 3 is 1 => remainder of Wanted_EV/12 is 4 => give 2 Vitamins (+24) and then 2 EV-reducing Berries (-20).
Modulo 3 is 2 => remainder of Wanted_EV/12 is 8 => give 4 Vitamins (+48) and then 4 EV-reducing Berries (-40).
Don't forget this is meant as an emergency feature to give the player a mean to EV-train a Lv.100 Pokémon, hence why you are allowed to complicate the feature.
Bonus feature 2: Lower the EV limit from 255 to 252
Yep, we're borrowing that feature from Gen VI.
Decompress overlay9_0012.bin.
Go to offset 0×EC9C* and change the value FF into FC.
Do the same at offset 0×ECA0*.
* Regions' differences
Language Offset 1 Offset 2
Japanese 0×ECA4 0×ECA8
Korean 0×ECA0 0×ECA4
Others 0×EC9C 0×ECA0
Decompress arm9.bin.
Go to offset 0×4B948* and change the value FF into FC.
Do the same at offset 0×4B94C*.
* Regions' differences
Language Offset 1 Offset 2
Japanese 0×4B3DC 0×4B3E0
Spanish HG 0×4B940 0×4B944
Korean HG 0×4BA44 0×4BA48
Korean SS 0×4BA3C 0×4BA40
Others 0×4B948 0×4B94C