it could also be another opcode is messing it up, like with Dragon1 i found it was making loads of illegal jumps for some reason which i dont know, but it was nothign to do with the subroutine code, i suggest you check your other opcodes as well, ill have a look through n see if i can see anything that would cause the illegal jumps.
Edit: right i just had a look through and theres just a couple of problems with opcodes i can see, altho i dont know how it affects your jumps.
void RegRandom()
{
vRegister[(OpCode&0x0F00) >> 8] = ((rand() % 16) & (OpCode&0x00FF));
MemoryIndex += 2;
}
that i think should be more like this
void RegRandom()
{
vRegister[(OpCode&0x0F00) >> 8] = (rand() & (OpCode&0x00FF));
MemoryIndex += 2;
}
as i think its a number lower or equal to 0x00FF, dont quote me on it tho

if not try
void RegRandom()
{
vRegister[(OpCode&0x0F00) >> 8] = ((rand()%0xFF) & (OpCode&0x00FF));
MemoryIndex += 2;
}
The 0x8000 opcodes with carry, you should set the carry to the value in VX like you did with RegAssign_I(), but so it does
vRegister[0xF] = vRegisterX&0x1;
oh and your font code, you have to times the number in VX by 5 to get the correct point in the memory (which may be one of your problems)
apart from that something is seriously wrong with your l33t programming skillz cos it crashes after about 1 second of running
