summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoic Guegan <loic.guegan@mailbox.org>2023-12-25 07:24:17 +0100
committerLoic Guegan <loic.guegan@mailbox.org>2023-12-25 07:24:17 +0100
commit475996af26408156486faa43682f7effdabfa156 (patch)
tree571bd3934c7a312ab032e20e7111bf81d93f4ff7
parent3924115080f5332d8e452494af21be7b47b6bac6 (diff)
Minor changes
-rw-r--r--roms/2-ibm-logo.ch8bin0 -> 132 bytes
-rw-r--r--src/Makefile2
-rw-r--r--src/main.c8
-rw-r--r--src/mem.c57
-rw-r--r--src/mem.h10
-rw-r--r--src/screen.c2
-rw-r--r--src/screen.h4
-rw-r--r--src/vcpu.c52
-rw-r--r--src/vcpu.h15
9 files changed, 146 insertions, 4 deletions
diff --git a/roms/2-ibm-logo.ch8 b/roms/2-ibm-logo.ch8
new file mode 100644
index 0000000..d60dac8
--- /dev/null
+++ b/roms/2-ibm-logo.ch8
Binary files differ
diff --git a/src/Makefile b/src/Makefile
index 3263c46..a55169e 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,7 +1,7 @@
EXEC=chip-8
-$(EXEC): main.c screen.c
+$(EXEC): main.c screen.c mem.c vcpu.c
gcc -lraylib $^ -o $@
clean:
diff --git a/src/main.c b/src/main.c
index 66b76c8..995f4ed 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,11 +1,17 @@
#include "screen.h"
-
+#include "mem.h"
+#include "vcpu.h"
int main(int argc, char *argv[])
{
+ // Initialize
+ MemInit();
+ MemLoadROM("../roms/2-ibm-logo.ch8");
ScreenInit(800,400);
+ VCPUInit();
+
ScreenSetPixel(0,1,1);
while (!WindowShouldClose()){
diff --git a/src/mem.c b/src/mem.c
new file mode 100644
index 0000000..c537120
--- /dev/null
+++ b/src/mem.c
@@ -0,0 +1,57 @@
+#include "mem.h"
+#include <stdio.h>
+
+unsigned char memory[4096];
+
+extern unsigned char DEFAULT_FONT[];
+
+void MemInit(){
+ MemSet(0,0,4096);
+ MemCopy(DEFAULT_FONT,16*5,ADDR_FONT);
+}
+
+void MemSet(int addr, unsigned char value, int size){
+ for(int i=0;i<size;i++)
+ memory[addr+i]=value;
+}
+
+void MemCopy(unsigned char *data, int size, int addr){
+ for(int i=0;i<size;i++)
+ memory[addr+i]=data[i];
+}
+
+void MemRead(unsigned char *data, int size, int addr){
+ int location=addr;
+ for(int i=0;i<size;i++)
+ data[i]=memory[addr+i];
+}
+
+void MemLoadROM(char *path){
+ char byte;
+ FILE *ptr;
+ ptr=fopen(path,"rb");
+ int location=ADDR_ROM;
+ while(fread(&byte,1,1,ptr)==1){
+ MemSet(location,byte,1);
+ location++;
+ }
+ fclose(ptr);
+}
+
+unsigned char DEFAULT_FONT[]={
+0xF0, 0x90, 0x90, 0x90, 0xF0, // 0
+0x20, 0x60, 0x20, 0x20, 0x70, // 1
+0xF0, 0x10, 0xF0, 0x80, 0xF0, // 2
+0xF0, 0x10, 0xF0, 0x10, 0xF0, // 3
+0x90, 0x90, 0xF0, 0x10, 0x10, // 4
+0xF0, 0x80, 0xF0, 0x10, 0xF0, // 5
+0xF0, 0x80, 0xF0, 0x90, 0xF0, // 6
+0xF0, 0x10, 0x20, 0x40, 0x40, // 7
+0xF0, 0x90, 0xF0, 0x90, 0xF0, // 8
+0xF0, 0x90, 0xF0, 0x10, 0xF0, // 9
+0xF0, 0x90, 0xF0, 0x90, 0x90, // A
+0xE0, 0x90, 0xE0, 0x90, 0xE0, // B
+0xF0, 0x80, 0x80, 0x80, 0xF0, // C
+0xE0, 0x90, 0x90, 0x90, 0xE0, // D
+0xF0, 0x80, 0xF0, 0x80, 0xF0, // E
+0xF0, 0x80, 0xF0, 0x80, 0x80}; // F
diff --git a/src/mem.h b/src/mem.h
new file mode 100644
index 0000000..eaebc17
--- /dev/null
+++ b/src/mem.h
@@ -0,0 +1,10 @@
+#pragma once
+
+#define ADDR_ROM 0x200
+#define ADDR_FONT 0x50
+
+void MemInit();
+void MemSet(int addr, unsigned char value, int size);
+void MemCopy(unsigned char *data, int size, int addr);
+void MemRead(unsigned char *data, int size, int addr);
+void MemLoadROM(char *path);
diff --git a/src/screen.c b/src/screen.c
index cd8d3f4..24a1eb8 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -39,7 +39,7 @@ void ScreenUpdate(){
EndDrawing();
}
-void ScreenSetPixel(int x, int y, char state){
+void ScreenSetPixel(int x, int y, unsigned char state){
Screen.pixels[x+y*64]=(state==0) ? 0: 1;
}
diff --git a/src/screen.h b/src/screen.h
index 67d6184..d239c0d 100644
--- a/src/screen.h
+++ b/src/screen.h
@@ -1,3 +1,5 @@
+#pragma once
+
#include "raylib.h"
#define MODE_CHIP8 0 // Chip-8 64x32
@@ -13,6 +15,6 @@ typedef struct SCREEN_DATA {
void ScreenInit(int width, int height);
void ScreenClear();
-void ScreenSetPixel(int x, int y, char state);
+void ScreenSetPixel(int x, int y, unsigned char state);
void ScreenUpdate();
void ScreenClose();
diff --git a/src/vcpu.c b/src/vcpu.c
new file mode 100644
index 0000000..e35d07e
--- /dev/null
+++ b/src/vcpu.c
@@ -0,0 +1,52 @@
+#include "vcpu.h"
+#include "mem.h"
+#include "screen.h"
+
+// Program Counter (16 bits but only 12 bits used (4096 memory addresses))
+unsigned short PC;
+
+// Index register (16 bits but only 12 bits used (4096 memory addresses))
+unsigned short I;
+
+// Stack register (16 bits)
+unsigned short S;
+
+// General purpose registers (8 bits each)
+// Note last one often used as a flag register
+unsigned char R[16];
+
+// Delay timer (8 bits)
+unsigned char DT;
+
+// Sound timer (8 bits)
+unsigned char ST;
+
+// Current VCPU state
+VCPU_State State;
+
+void VCPUInit(){
+ PC=ADDR_ROM;
+}
+
+void VCPUFetch(){
+ MemRead((char *)&(State.opcode),2,PC);
+ PC+=2;
+}
+
+void VCPUDecode(){
+ char X=(State.opcode<<4) & 0xF0;
+ char Y=(State.opcode<<8) & 0xF0;
+ char N=(State.opcode<<12) & 0xF0;
+ char NN=(State.opcode<<8) & 0xFF;
+ short NNN=(State.opcode<<4) & 0xFFF0;
+}
+
+void VCPUExecute(){
+ switch(State.opcode){
+ case 0x00E0:
+ ScreenClear();
+ break
+ ;;
+
+ }
+}
diff --git a/src/vcpu.h b/src/vcpu.h
new file mode 100644
index 0000000..7eed76f
--- /dev/null
+++ b/src/vcpu.h
@@ -0,0 +1,15 @@
+#pragma once
+
+typedef struct VCPU_State {
+ short opcode;
+ char X;
+ char Y;
+ char N;
+ char NN;
+ short NNN;
+} VCPU_State;
+
+void VCPUInit();
+void VCPUFetch();
+void VCPUDecode();
+void VCPUExecute();