summaryrefslogtreecommitdiff
path: root/src/vcpu.c
diff options
context:
space:
mode:
authorLoic Guegan <loic.guegan@mailbox.org>2023-12-26 13:17:52 +0100
committerLoic Guegan <loic.guegan@mailbox.org>2023-12-26 13:17:52 +0100
commite9ec67945034935931c975ddb9522a5dbb69e6a9 (patch)
treee15f223eb984b71eda672978de0643d6e4475d2a /src/vcpu.c
parent3738e41d2db8c058c684ab602309c98464d8e6f6 (diff)
Minor changes
Diffstat (limited to 'src/vcpu.c')
-rw-r--r--src/vcpu.c65
1 files changed, 39 insertions, 26 deletions
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 <stdio.h>
#include <stdlib.h>
@@ -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(){