Tuesday, February 19, 2008

Chip8 in DAX 4.0 (continued...)

I know I haven't posted in a while... but I'm bored and this seems like a great time to continue my little adventure with emulation in Microsoft's Dynamics AX 4.0. I will probably not go as in-dept as I originally planned since the Chip8 platform is well-documented already. I'll try to focus on the challenges that the DAX platform brings into emulating a system.

Every emulator consists of a main loop that executes instructions, also known as opcodes. A typical loop in pseudocode would look a little something like this:

while emulor is running
        fetch opcode from memory at pointer's location
        execute opcode
        increase pointer
loop

In DAX this can be something as simple as (The boolean in the while statement can be changed to a variable to allow to start/stop the emulator):

while (true)
{
        opcode = this.memory[pointer];
        this.execute(opcode);
        opcode++;
}

Unfortunatly, if you try to run a loop like this, you will notice that the DAX client seems to hang as it's running an infinite loop. This prevents anything to be updated to the screen (like the Chip8 display area) and prevents any keyboard input to be captured (capturing input will be explained in another blog entry.... which I promise will not be in another month this time!). These issues can be bypassed by doing something like this :

The memory[] array, pointer and emuRunning variable would be declared in the classDeclaration in this exemple.

void runEmu()
{
        int opcode;
        ;

        opcode = memory[pointer]
        this.execute(opcode);
        pointer++;

        if (emuRunning)
                this.setTimeOut(identifierStr(runEmu),0,false);
}

Instead of using a loop, I made use of the setTimeOut method to call the same method over and over again as long as the emulator is running. This leaves enough time for the client to update itself and allow the user to move around any window that would be opened in the client.

That's it for tonight. On a last note, using Threads should work also. I haven't had any free time lately to give it a try but it's kind of like the "Find" feature in DAX. When you search for a string through code, the client will update its result window while it is searching more results.

No comments: