CCD48 seems to be the place where the routine starts.
CCDC0’s loop is something to loop through all the player characters until it finds the one you’re promoting. (Possibly to find what their current class is.)
You can see the game check twice for classes to promote to at CCE56. If you pull that out, the second option becomes a glitchy mess.
CCE72 looks at the case of the trainee classes and adds the third promotion to the list of promotions (which is located at 0202547C). It also hardcodes the three extra promotions the trainees get to their class.
The check for whether you’ve completed the game before, and thus whether that third promotion is actually activated, seems to be somewhere else though :\ .
Haven’t figured out enough about the branching to make any significant changes, but loading an old save file, got this:
Related: CD7FC and a few more ensuing blocks of ASM load the text that happens before the trainee promotions.