One might argue that is not a bug but a feature, and one does not do moves too well but in fact not time them properly. Still enough of me being snarky.
That seems like a reasonable thing to at least contemplate. There are some things that could make it complicated (both on the code and on the play itself fronts) but it is still worth checking out. It could serve as a beginner hack but it would be on the harder side of that as you will be getting hands on with a debugger.
If you are measuring in frames and games of that vintage had seldom bothered with decoupled inputs then it is probably frames related. In that case the game most likely grabs whatever controller input says during vblank (might be to another area, see debouncing) and then operates on that.
Do the systems in question have diagonal sensors or are they simple dpads that might check if up is pressed and if say right is pressed and call that a diagonal? Hardware docs will tell you this, as will a shot of the controller PCB itself (or if it a glorious microswitch type device then you will hear it and possibly feel it). Most will not but if it is fancy arcade emulation (or fancy might as well have been an arcade board) for a fighting game then it is not unheard of.
Anyway two approaches
If you know what you are doing then you might follow the controller read on up through the system, or watch what happens during vblank. Can be tedious though, but as you end up running into it as a mater of course then it can be quicker.
If this is all very new then I would probably do graphics (or if there is a mana/stamina bar changed by a special move then that*). The idea being a special move probably has a special sprite. Find what part of graphics memory holds, or actually probably controls as that is different, that in anticipation of the move. When said graphics controller shoves the special move on screen then the debugger you set a nice breakpoint on will say something put this on screen.
Said something might be several steps removed from it (might have an audio cue as well for instance) but will lead back to the thing that decided to do the move. You would then see how it decides to do it (presumably a sequence of inputs it stores, or possible discounts if you press another direction in the meantime) and where you might have it fall in line with a more simple thing that does not have timing issues for your style of play.
*rather than say messing with the graphics controller/OAM/whatever the thing handling sprite locations is called on your chosen system then here you would make a cheat for infinite mana/stamina (if there is not one already) and that will tell you the location of it in memory. Such a thing will also then be edited by the thing doing the special move and you can follow that back up until you get to the part where it is checking inputs to determine what it is doing next.
Fighting games can be programmed in many ways or I might have suggested some other methods. Many will be variations on the theme of once a button is pressed it will start a timer (how long depends upon the game, and might be overall or might be since last button press, some annoying ones even vary if say half a super combo is entered) and maintain a list of button presses (which can include nothing pressed if it say needs right right high punch) that it either gets something out of to act upon, or dismisses when the timer runs out (or maybe is cancelled by an input it can't do anything with). A properly designed control scheme will tend to gate off things quickly so it does not get too silly but the game will then hopefully then do a bunch of IF and ELSE type deals ( https://www.guru99.com/if-loop-python-conditional-structures.html
) on it to locate the move it needs to do or resets if the player is too slow or fumbles the input**.
**this can include the controller fumbling the input because of switch bounce (if you have ever had a mouse double click without you doing it when it got old then that is it in its failure form, it is also a feature of general switches which is why games will often copy the controller state and operate off that). More frames, more certainty of input is not a ghost reading but also more lag before actions taken. Diagonals being more prone to this than some other options means it could be a mitigation for this. Hopefully though it is the devs just taking their time because they did not expect anybody to get that quick.