The thing is, all of these ROMs have hardcoded offsets in the binary. You can change some things around in the assembly, but adding instructions without removing already existing instructions is next to impossible because it would require you to move offsets around. For example, let's look at this psuedocode with instructions at addresses A B C and D.
A: subroutine start label: draw everything
A: jump to subroutine: draw world
B: jump to subroutine: draw player
C: jump to subroutine: draw HUD
D: subroutine end
E: subroutine start label: move player
...
K: subroutine end
So let's say you want to add a subroutine to draw a cursor over the player or something, and you want to do it between drawing the HUD and drawing the player. You can't simply add an instruction there, because then everything that occurs after it will move down one address and all the offsets for subroutine starts will be wrong, and the game will no longer function.
There are ways around this, but they can get complicated fast and sometimes, it's impossible to achieve what you want without removing already existing code. Sometimes recalculating offsets is possible, but difficult unless a tool was created for it.