Well, if you're interested, here's a commented disassembly of the code used to level-up monsters.
$03/90F5 5C 60 DE 01 JMP $01DE60 ;Jump to custom code
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$01/DE60 9D 24 20 STA $2024,x[$7E:22A4] ;Performs the action that was skipped in original code
$01/DE63 8E 80 22 STX $2280 [$7E:2280] ;Temporarily store Registers X and Y in space that will always be free (monsters don't use 2000-2001,x and 2010-2011,x)
$01/DE66 8C 90 22 STY $2290 [$7E:2290] ; originally, I just wrote PHX and PHY, but oddly, when I pulled them back, the x value got pulled into y and the y into x... weird
$01/DE69 C2 20 REP #$20
$01/DE6B 7B TDC
$01/DE6C AA TAX
$01/DE6D A8 TAY ;Clear A, X and Y (and set A to 16-bit status)
$01/DE6E AD 02 20 LDA $2002 [$7E:2002]
$01/DE71 29 FF 00 AND #$00FF
$01/DE74 F0 02 BEQ $02 [$DE78] ;Check for a character in slot 1, if none, skip to next check
$01/DE76 AA TAX ;If one is there, store its level into X
$01/DE77 C8 INY ;and +1 to Y
$01/DE78 AD 82 20 LDA $2082 [$7E:2082]
$01/DE7B 29 FF 00 AND #$00FF
$01/DE7E F0 09 BEQ $09 [$DE89] ;Check for a character in slot 2, if none, skip to next check
$01/DE80 85 A9 STA $A9 [$00:00A9] ;If one is there, store its level into A9 (A9-AA seems to be used regularly for temporary storage)
$01/DE82 8A TXA ;Move value in X to A
$01/DE83 18 CLC
$01/DE84 6D A9 00 ADC $00A9 [$7E:00A9] ;Add the (recently stored) value in A9 to accumulator
$01/DE87 AA TAX ;Move sum back to register X
$01/DE88 C8 INY ;and +1 to Y
$01/DE89 AD 02 21 LDA $2102 [$7E:2102]
$01/DE8C 29 FF 00 AND #$00FF
$01/DE8F F0 09 BEQ $09 [$DE9A]
$01/DE91 85 A9 STA $A9 [$00:00A9]
$01/DE93 8A TXA
$01/DE94 18 CLC
$01/DE95 6D A9 00 ADC $00A9 [$7E:00A9]
$01/DE98 AA TAX
$01/DE99 C8 INY ;Same exact process for Slot 3
$01/DE9A AD 82 21 LDA $2182 [$7E:2182]
$01/DE9D 29 FF 00 AND #$00FF
$01/DEA0 F0 09 BEQ $09 [$DEAB]
$01/DEA2 85 A9 STA $A9 [$00:00A9]
$01/DEA4 8A TXA
$01/DEA5 18 CLC
$01/DEA6 6D A9 00 ADC $00A9 [$7E:00A9]
$01/DEA9 AA TAX
$01/DEAA C8 INY ;...And slot 4
$01/DEAB AD 02 22 LDA $2202 [$7E:2202]
$01/DEAE 29 FF 00 AND #$00FF
$01/DEB1 F0 09 BEQ $09 [$DEBC]
$01/DEB3 85 A9 STA $A9 [$00:00A9]
$01/DEB5 8A TXA
$01/DEB6 18 CLC
$01/DEB7 6D A9 00 ADC $00A9 [$7E:00A9]
$01/DEBA AA TAX
$01/DEBB C8 INY ;...And slot 5
$01/DEBC 8A TXA ;Move final total into A
$01/DEBD C0 05 00 CPY #$0005
$01/DEC0 D0 06 BNE $06 [$DEC8] ;Check if Y = 5, if not skip to next check
$01/DEC2 38 SEC
$01/DEC3 ED A9 00 SBC $00A9 [$7E:00A9] ;Subtract last character's level
$01/DEC6 4A LSR A ;Divide by 2
$01/DEC7 4A LSR A ;Divide by 2
$01/DEC8 C0 04 00 CPY #$0004
$01/DECB D0 02 BNE $02 [$DECF] ;Check if Y = 4, if not, skip to next check
$01/DECD 4A LSR A ;Divide by 2
$01/DECE 4A LSR A ;Divide by 2
$01/DECF C0 03 00 CPY #$0003
$01/DED2 D0 05 BNE $05 [$DED9] ;Check if Y = 3, if not, skip to next check
$01/DED4 38 SEC
$01/DED5 ED A9 00 SBC $00A9 [$7E:00A9] ;Subtract last character's level
$01/DED8 4A LSR A ;Divide by 2
$01/DED9 C0 02 00 CPY #$0002
$01/DEDC D0 01 BNE $01 [$DEDF] ;Check if Y = 2, if not, skip the next Operation
$01/DEDE 4A LSR A ;Divide by 2... Phew! Now we've got out APL. There are definitely inefficiencies here, but it works.
$01/DEDF AE 80 22 LDX $2280 [$7E:2280]
$01/DEE2 AC 90 22 LDY $2290 [$7E:2290]
$01/DEE5 9C 80 22 STZ $2280 [$7E:2280]
$01/DEE8 9C 90 22 STZ $2290 [$7E:2290] ;Restore X and Y and clear the space in RAM used to store them
$01/DEEB EA NOP
$01/DEEC EA NOP
$01/DEED EA NOP
$01/DEEE EA NOP
$01/DEEF EA NOP
$01/DEF0 85 A9 STA $A9 [$00:00A9] ;Store APL in A9
$01/DEF2 7B TDC
$01/DEF3 E2 20 SEP #$20 ;Clear A and set 8-bit status
$01/DEF5 BD 70 20 LDA $2070,x[$7E:22F0] ;Load Monster's "Level plus boss bit"
$01/DEF8 10 07 BPL $07 [$DF01] ;If not a boss, skip ahead (Probably could have led off with this, but oh well)
$01/DEFA AD A5 28 LDA $28A5 [$7E:28A5] ;Perform action that we wrote over for the purpose of this process
$01/DEFD 5C FB 90 03 JMP $0390FB[$03:90FB] ;Jump back to the regular monster loading routine
$01/DF01 A5 A9 LDA $A9 [$00:00A9]
$01/DF03 DD 02 20 CMP $2002,x[$7E:2282]
$01/DF06 B0 07 BCS $07 [$DF0F] ;Compare APL to Monster's level, if APL is higher, keep going
$01/DF08 AD A5 28 LDA $28A5 [$7E:28A5] ;if APL is lower, preform overwritten operation
$01/DF0B 5C FB 90 03 JMP $0390FB[$03:90FB] ;And return to regular monster loading routine
$01/DF0F BD 02 20 LDA $2002,x[$7E:2282] ;Load Monster's level
$01/DF12 C9 54 CMP #$54
$01/DF14 90 04 BCC $04 [$DF1A] ;Check if it is 84 (dec) or higher
$01/DF16 A9 7F LDA #$7F
$01/DF18 80 05 BRA $05 [$DF1F] ;If so, then load 127 (dec) into A (this is the highest a monster's level can be, beyond this the monster will set the Boss bit) and skip ahead
$01/DF1A 4A LSR A
$01/DF1B 18 CLC
$01/DF1C 7D 02 20 ADC $2002,x[$7E:2282] ;Multiply level by 1.5
$01/DF1F 9D 02 20 STA $2002,x[$7E:2282] ;Store monster's new level
$01/DF22 9D 70 20 STA $2070,x[$7E:22F0] ;Store monster's new "level plus boss bit"
$01/DF25 69 0A ADC #$0A ;add 10 (dec)
$01/DF27 9D 2F 20 STA $202F,x[$7E:22AF] ;Store monster's new "level plus 10"
$01/DF2A BD 1B 20 LDA $201B,x[$7E:229B] ;Load monster's P-Attack multiplier
$01/DF2D C9 AA CMP #$AA
$01/DF2F 90 04 BCC $04 [$DF35] ;Check if it is 170 (dec) or higher (because otherwise multiplying by 1.5 yields a result higher than FF)
$01/DF31 A9 FF LDA #$FF
$01/DF33 80 05 BRA $05 [$DF3A] ;If so, then load 255 (dec) into A and skip ahead
$01/DF35 4A LSR A
$01/DF36 18 CLC
$01/DF37 7D 1B 20 ADC $201B,x[$7E:229B] ;Multiply by 1.5
$01/DF3A 9D 1B 20 STA $201B,x[$7E:229B] ;Store monster's new P-Attack Multiplier
$01/DF3D BD 1D 20 LDA $201D,x[$7E:229D]
$01/DF40 C9 AA CMP #$AA
$01/DF42 90 04 BCC $04 [$DF48]
$01/DF44 A9 FF LDA #$FF
$01/DF46 80 05 BRA $05 [$DF4D]
$01/DF48 4A LSR A
$01/DF49 18 CLC
$01/DF4A 7D 1D 20 ADC $201D,x[$7E:229D]
$01/DF4D 9D 1D 20 STA $201D,x[$7E:229D] ;Same process for P-Attack Base
$01/DF50 BD 28 20 LDA $2028,x[$7E:22A8]
$01/DF53 C9 AA CMP #$AA
$01/DF55 90 04 BCC $04 [$DF5B]
$01/DF57 A9 FF LDA #$FF
$01/DF59 80 05 BRA $05 [$DF60]
$01/DF5B 4A LSR A
$01/DF5C 18 CLC
$01/DF5D 7D 28 20 ADC $2028,x[$7E:22A8]
$01/DF60 9D 28 20 STA $2028,x[$7E:22A8] ;... And P-Defense Multiplier
$01/DF63 BD 2A 20 LDA $202A,x[$7E:22AA]
$01/DF66 C9 AA CMP #$AA
$01/DF68 90 04 BCC $04 [$DF6E]
$01/DF6A A9 FF LDA #$FF
$01/DF6C 80 05 BRA $05 [$DF73]
$01/DF6E 4A LSR A
$01/DF6F 18 CLC
$01/DF70 7D 2A 20 ADC $202A,x[$7E:22AA]
$01/DF73 9D 2A 20 STA $202A,x[$7E:22AA] ;... And P-Defense Base
$01/DF76 BD 22 20 LDA $2022,x[$7E:22A2]
$01/DF79 C9 AA CMP #$AA
$01/DF7B 90 04 BCC $04 [$DF81]
$01/DF7D A9 FF LDA #$FF
$01/DF7F 80 05 BRA $05 [$DF86]
$01/DF81 4A LSR A
$01/DF82 18 CLC
$01/DF83 7D 22 20 ADC $2022,x[$7E:22A2]
$01/DF86 9D 22 20 STA $2022,x[$7E:22A2] ;... And M-Defense Multiplier
$01/DF89 BD 24 20 LDA $2024,x[$7E:22A4]
$01/DF8C C9 AA CMP #$AA
$01/DF8E 90 04 BCC $04 [$DF94]
$01/DF90 A9 FF LDA #$FF
$01/DF92 80 05 BRA $05 [$DF99]
$01/DF94 4A LSR A
$01/DF95 18 CLC
$01/DF96 7D 24 20 ADC $2024,x[$7E:22A4]
$01/DF99 9D 24 20 STA $2024,x[$7E:22A4] ;... And M-Defense Base
$01/DF9C C2 20 REP #$20 ;Set Accumulator 16-bit status
$01/DF9E BD 09 20 LDA $2009,x[$7E:2289] ;Load Monster's Max HP into A
$01/DFA1 C9 AA AA CMP #$AAAA
$01/DFA4 90 05 BCC $05 [$DFAB] ;Check if it is 43690 (dec) or higher (again, to avoid rolling over)
$01/DFA6 A9 FF FF LDA #$FFFF
$01/DFA9 80 05 BRA $05 [$DFB0] ;If so, load 65535 (dec) into A and skip ahead
$01/DFAB 4A LSR A
$01/DFAC 18 CLC
$01/DFAD 7D 09 20 ADC $2009,x[$7E:2289] ;Multiply by 1.5
$01/DFB0 9D 09 20 STA $2009,x[$7E:2289] ;Store new Max HP
$01/DFB3 9D 07 20 STA $2007,x[$7E:2287] ;And store it in Current HP
$01/DFB6 7B TDC
$01/DFB7 E2 20 SEP #$20 ;Clear A and reset 8-bit status
$01/DFB9 A5 A9 LDA $A9 [$00:00A9] ;Load APL
$01/DFBB 4A LSR A ;Divide by 2
$01/DFBC 85 A9 STA $A9 [$00:00A9] ;store new APL
$01/DFBE 4C 03 DF JMP $DF03 [$01:DF03] ;Jump all the way back to DF03 ("compare APL with monster's level")
Turns out I didn't put in code that increases the monsters' base agility. I think this is OK, though. I'm not sure how modified agility is calculated, but it must take the monster's level into account, because leveled-up BlackLiz'es were definitely faster than normal (they kinda kicked my ass).
This is surely not the cleanest code I've written, but once I had it all working, it was so much that I didn't feel like going back to tidy it up. At any rate, the empty space at 01/DE60 is so huge, even this only takes up about a third of it, so it seemed unnecessary anyway.