summaryrefslogtreecommitdiff
path: root/src/cpu/6502.h
diff options
context:
space:
mode:
authoralekseiplusplus <alekseijeaves@protonmail.com>2023-05-01 14:16:00 +1000
committeralekseiplusplus <alekseijeaves@protonmail.com>2023-05-01 14:16:00 +1000
commit65e93275c17c14eea06d495958ed77fe569ce8f1 (patch)
tree4e9ee5a9bbbc6ac1ea5a4b38dd2cace48bbb5c70 /src/cpu/6502.h
parent8f09f4249cec8ccc187b3f9ee5094fb3080900a9 (diff)
changed directory structure, and other minor stuff
Diffstat (limited to 'src/cpu/6502.h')
-rw-r--r--src/cpu/6502.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/cpu/6502.h b/src/cpu/6502.h
new file mode 100644
index 0000000..8ceba29
--- /dev/null
+++ b/src/cpu/6502.h
@@ -0,0 +1,103 @@
+// 6502.h
+// Core elements of the 6502 CPU
+
+typedef unsigned char\
+ byte;
+typedef unsigned short\
+ address;
+
+byte acc, X, Y, P, S = 0x00;
+address PC = 0x0000;
+byte* Memory;
+
+// FLAGS
+#define flag_N 0x80 // Negative
+#define flag_V 0x40 // Overflow
+#define flag_B 0x10 // BRK command
+#define flag_D 0x08 // Decimal mode
+#define flag_I 0x04 // IRQ disable
+#define flag_Z 0x02 // Zero
+#define flag_C 0x01 // Carry
+
+byte getFlag(byte flag) {
+ return ((P & flag) == flag) ? 1 : 0;
+}
+
+void setFlag(byte flag, int x) {
+ if (x == 1){
+ if ((P & flag) == 0x0) P += flag;
+ }else if (x == 0){
+ if ((P & flag) == flag) P -= flag;
+ }
+ else{
+ fprintf(stderr, "setFlag() passed arg neither 0 or 1");
+ }
+}
+
+void flagSet(byte flag){
+ P |= flag;
+}
+
+void flagClear(byte flag){
+ P &= ~flag;
+}
+
+
+// Functions which perform reusable routines for finding if a specific flag should be set.
+
+void setFlagN(byte x){
+ if (x & flag_N == flag_N)
+ setFlag(flag_N, 1);
+ else
+ setFlag(flag_N, 0);
+}
+
+//Perform prior to any changes
+void setFlagV(byte x, byte y){
+ if ((x & flag_N) == (y & flag_N)){
+ if (((x + y) & (flag_N ^ 0xFF)) > 0x7F) setFlag(flag_V, 1);
+ else setFlag(flag_V, 0);
+ }else{
+ if (((x - y) & (flag_N ^ 0xFF)) > 0x7F) setFlag(flag_V, 1);
+ else setFlag(flag_V, 0);
+ }
+}
+
+/*void setFlagB(){ //WORK ON
+ setFlag(flag_B, 1);
+}*/ //Dont really need since its dependent on the BRK insturction
+
+/*void setFlagD(){
+ setFlag(flag_D, 1);
+}*/
+
+/*void setFlagI(){ //WORK ON
+ setFlag(flag_Z, 1);
+}*/
+
+void setFlagZ(int x){
+ if (x == 0)
+ setFlag(flag_Z, 1);
+ else
+ setFlag(flag_Z, 0);
+}
+
+//Only 6 instructions, 2 not including stack instructions, use the carry flag.
+// Need to look further into implementation details for this.
+/*void setFlagC(){
+ setFlag(flag_Z, 1);
+}*/
+
+
+// Memory Manipulation
+
+// Are to be defined by the system to handle special cases.
+
+byte getMemory(address x);
+void setMemory(address x, byte y);
+
+
+
+#include"addressing.h"
+#include"instructions/definitions.h"
+#include"instructions/table.h" \ No newline at end of file