summaryrefslogtreecommitdiff
path: root/src/vcpu.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vcpu.c')
-rw-r--r--src/vcpu.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/src/vcpu.c b/src/vcpu.c
index f660dc3..ab7177c 100644
--- a/src/vcpu.c
+++ b/src/vcpu.c
@@ -35,14 +35,41 @@ void VCPUDecode(){
void VCPUExecute(){
// VCPUDump();
switch(State.opcode >> 12){
- case 0x0: // Clear screen
- ScreenClear();
+ case 0x0: // Clear screen or return from subroutine
+ if(State.N == 0){ // Clear screen
+ ScreenClear();
+ }
+ else { // Return from subroutine
+ State.PC=State.stack[State.S];
+ State.S--;
+ }
break
;;
case 0x1: // Jump
State.PC=State.NNN;
break
;;
+ case 0x2: // Call
+ State.S++;
+ State.stack[State.S]=State.PC;
+ State.PC=State.NNN;
+ break
+ ;;
+ case 0x3: // SE: VX, byte
+ if(State.V[State.X]==State.NN)
+ State.PC+=2;
+ break;
+ ;;
+ case 0x4: // SNE: VX, byte
+ if(State.V[State.X]!=State.NN)
+ State.PC+=2;
+ break;
+ ;;
+ case 0x5: // SNE: VX, VY
+ if(State.V[State.X]==State.V[State.Y])
+ State.PC+=2;
+ break;
+ ;;
case 0x6:
State.V[State.X]=State.NN;
break