From e9ec67945034935931c975ddb9522a5dbb69e6a9 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Tue, 26 Dec 2023 13:17:52 +0100 Subject: Minor changes --- src/vcpu.c | 65 +++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 26 deletions(-) (limited to 'src/vcpu.c') diff --git a/src/vcpu.c b/src/vcpu.c index 11181f0..4682f0b 100644 --- a/src/vcpu.c +++ b/src/vcpu.c @@ -2,6 +2,7 @@ #include "mem.h" #include "screen.h" #include "keypad.h" +#include "speaker.h" #include #include @@ -14,9 +15,10 @@ VCPU_State State; void VCPUInit(){ State.PC=ADDR_ROM; State.S=0; - State.dtst_ticks=0; + State.dt_ticks=0; + State.st_ticks=0; State.screen_ticks=0; - State.keypress=-1; + State.keypressed=0; srand(time(NULL)); } @@ -208,19 +210,16 @@ void VCPUExecute(){ case 0xE: if(State.NN==0x9E){ // Skip if keypress in VX - if(State.keypress >= 0){ - if(State.V[State.X]&0x0F == State.keypress&0xF){ + if(State.keypressed){ + if(State.V[State.X] == State.key) State.PC+=2; - } } - State.keypress=-1; }else if(State.NN==0xA1){ // Skip if not keypress in VX - State.PC+=2; // First skip - if(State.keypress >=0){ - if(State.V[State.X]&0x0F == State.keypress&0x0F) - State.PC+=2; // Ignore skip if pressed + State.PC+=2; + if(State.keypressed){ + if(State.V[State.X] == State.key) + State.PC+=4; } - State.keypress=-1; } break; @@ -231,12 +230,8 @@ void VCPUExecute(){ break; case 0x0A: - if(State.keypress >=0){ - State.V[State.X]=State.keypress&0xF; - if(State.V[State.X]&0x0F != State.keypress&0xF){ - State.PC+=2; - } - State.keypress=-1; + if(State.keypressed){ + State.V[State.X]=State.key; } else State.PC-=2; // Go back to last instruction (loop until key is pressed) @@ -284,12 +279,23 @@ void VCPUTick(){ struct timespec start, stop; double duration, delay; + // Update keypressed + int key=KeypadGetPressed(); + if(key>=0){ + State.keypressed=1; + State.key=key&0xF; + //printf("Keypressed: %x\n",State.key); + } + else + State.keypressed=0; + // Run and benchmark CPU pipeline - clock_gettime(CLOCK_REALTIME, &start); + clock_gettime(CLOCK_REALTIME, &start); VCPUFetch(); VCPUDecode(); VCPUExecute(); - State.dtst_ticks++; + State.dt_ticks++; + State.st_ticks++; State.screen_ticks++; clock_gettime(CLOCK_REALTIME, &stop); @@ -300,23 +306,30 @@ void VCPUTick(){ usleep(delay*1e6); } - // Update Delay Timer and Sound Timer - if(State.dtst_ticks>=(1.0*VCPU_FREQ/DTST_FREQ)){ - State.dtst_ticks=0; + // Update Delay Timer + if(State.dt_ticks>=(1.0*VCPU_FREQ/DTST_FREQ)){ + State.dt_ticks=0; if(State.DT>0) State.DT--; } + // Update Sound Timer + if(State.st_ticks>=(1.0*VCPU_FREQ/DTST_FREQ)){ + State.st_ticks=0; + if(State.ST>0) + State.ST--; + } + + // Play sound + if(State.ST>0) + SpeakerOn(); + // Refresh screen if(State.screen_ticks>=(1.0*VCPU_FREQ/SCREEN_FREQ)){ State.screen_ticks=0; ScreenUpdate(); } - // Update keypressed - int keypress=KeypadGetPressed(); - if(keypress>=0) - State.keypress=keypress; } void VCPUDump(){ -- cgit v1.2.3