summaryrefslogtreecommitdiff
path: root/src/cpu
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu')
-rw-r--r--src/cpu/6502.c1
-rw-r--r--src/cpu/6502.h5
-rw-r--r--src/cpu/addressing.c3
-rw-r--r--src/cpu/addressing.h27
-rw-r--r--src/cpu/core.h25
-rw-r--r--src/cpu/instructions.c86
-rw-r--r--src/cpu/instructions.h4
-rw-r--r--src/cpu/table.h7
8 files changed, 52 insertions, 106 deletions
diff --git a/src/cpu/6502.c b/src/cpu/6502.c
index d78cd7e..5aaffef 100644
--- a/src/cpu/6502.c
+++ b/src/cpu/6502.c
@@ -3,7 +3,6 @@
#include"6502.h"
-
byte getFlag(byte flag) {
return ((P & flag) == flag) ? 1 : 0;
}
diff --git a/src/cpu/6502.h b/src/cpu/6502.h
index c455e57..093fc3c 100644
--- a/src/cpu/6502.h
+++ b/src/cpu/6502.h
@@ -1,9 +1,10 @@
// 6502.h
// Main elements of the 6502 CPU
-#ifndef CPU_6502_H
-#define CPU_6502_H
+#ifndef CPU_H
+#define CPU_H
+#include"stdio.h"
#include"core.h"
byte acc, X, Y, P, S = 0x00;
diff --git a/src/cpu/addressing.c b/src/cpu/addressing.c
index 6e7d950..9a1694d 100644
--- a/src/cpu/addressing.c
+++ b/src/cpu/addressing.c
@@ -1,10 +1,9 @@
// addressing.h
// Contains definitions relevant to addressing, as well as fAddress() which returns time, length, value, and address for an instruction function call.
+// Would like to refactor the code into something better, such as switch-case statements for the cycles calculation.
#include"addressing.h"
-#define getInstructionLength(c) fAddressGetLength(*getInstructionTableAddressing(c))
-
int fAddressGetLength(Addressing addr){
switch(addr){
case eAbsolute: case eAbsoluteIndexedX: case eAbsoluteIndexedY:
diff --git a/src/cpu/addressing.h b/src/cpu/addressing.h
index d0320b8..c520535 100644
--- a/src/cpu/addressing.h
+++ b/src/cpu/addressing.h
@@ -5,32 +5,7 @@
#define ADDRESSING_H
#include"core.h"
-
-enum Addressing {
- eImmediate,
- eAccumulator,
- eZeroPage,
- eZeroPageIndexedX,
- eZeroPageIndexedY,
- eAbsolute,
- eAbsoluteIndexedX,
- eAbsoluteIndexedY,
- eIndexedIndirect,
- eIndirectIndexed,
- eImplied,
- eIndirectAbsolute,
- eRelative
-};
-
-typedef int Addressing;
-
-typedef struct AddData{
- int cycles;
- int length;
- address add;
- byte value;
-} AddData;
-
+#include"6502.h"
#include"instructions.h"
//Holds address of current instruction.
diff --git a/src/cpu/core.h b/src/cpu/core.h
index 4c338ab..71a420b 100644
--- a/src/cpu/core.h
+++ b/src/cpu/core.h
@@ -6,4 +6,29 @@ typedef unsigned char
typedef unsigned short
address;
+enum Addressing {
+ eImmediate,
+ eAccumulator,
+ eZeroPage,
+ eZeroPageIndexedX,
+ eZeroPageIndexedY,
+ eAbsolute,
+ eAbsoluteIndexedX,
+ eAbsoluteIndexedY,
+ eIndexedIndirect,
+ eIndirectIndexed,
+ eImplied,
+ eIndirectAbsolute,
+ eRelative
+};
+
+typedef int Addressing;
+
+typedef struct AddData{
+ int cycles;
+ int length;
+ address add;
+ byte value;
+} AddData;
+
#endif \ No newline at end of file
diff --git a/src/cpu/instructions.c b/src/cpu/instructions.c
index e61d082..6e80602 100644
--- a/src/cpu/instructions.c
+++ b/src/cpu/instructions.c
@@ -14,39 +14,32 @@ Fix all functions before performing testing
// Load and Store Instructions
void fLDA(Addressing addr, address val){
- idata = fAddress(addr, val);
acc = idata.value;
}
void fLDX(Addressing addr, address val){
- idata = fAddress(addr, val);
X = idata.value;
}
void fLDY(Addressing addr, address val){
- idata = fAddress(addr, val);
Y = idata.value;
}
void fSTA(Addressing addr, address val){
- idata = fAddress(addr, val);
setMemory(idata.add, acc);
}
void fSTX(Addressing addr, address val){
- idata = fAddress(addr, val);
setMemory(idata.add, X);
}
void fSTY(Addressing addr, address val){
- idata = fAddress(addr, val);
setMemory(idata.add, Y);
}
// Arithmetic Instructions
void fADC(Addressing addr, address val){
- idata = fAddress(addr, val);
int buffer = acc + idata.value;
setFlagV(buffer, acc);
@@ -61,7 +54,6 @@ void fADC(Addressing addr, address val){
}
void fSBC(Addressing addr, address val){
- idata = fAddress(addr, val);
int buffer = acc - idata.value;
setFlagV(buffer, acc);
@@ -78,7 +70,6 @@ void fSBC(Addressing addr, address val){
//Increment and Decrement Instructions
void fINC(Addressing addr, address val){
- idata = fAddress(addr, val);
byte a = getMemory(idata.add);
a++;
setMemory(idata.add, a);
@@ -87,21 +78,18 @@ void fINC(Addressing addr, address val){
}
void fINX(Addressing addr, address val){
- idata = fAddress(addr, val);
X++;
setFlagN(X);
setFlagZ(X);
}
void fINY(Addressing addr, address val){
- idata = fAddress(addr, val);
Y++;
setFlagN(Y);
setFlagZ(Y);
}
void fDEC(Addressing addr, address val){
- idata = fAddress(addr, val);
byte a = getMemory(idata.add);
a--;
setMemory(idata.add, a);
@@ -110,14 +98,12 @@ void fDEC(Addressing addr, address val){
}
void fDEX(Addressing addr, address val){
- idata = fAddress(addr, val);
X--;
setFlagN(X);
setFlagZ(X);
}
void fDEY(Addressing addr, address val){
- idata = fAddress(addr, val);
Y--;
setFlagN(Y);
setFlagZ(Y);
@@ -126,21 +112,18 @@ void fDEY(Addressing addr, address val){
// Logical Instructions
void fAND(Addressing addr, address val){
- idata = fAddress(addr, val);
acc &= idata.value;
setFlagN(acc);
setFlagZ(acc);
}
void fORA(Addressing addr, address val){
- idata = fAddress(addr, val);
acc |= idata.value;
setFlagN(acc);
setFlagZ(acc);
}
void fEOR(Addressing addr, address val){
- idata = fAddress(addr, val);
acc ^= idata.value;
setFlagN(acc);
setFlagZ(acc);
@@ -149,53 +132,43 @@ void fEOR(Addressing addr, address val){
// Jump, Branch, Compare, and Test Bits
void fJMP(Addressing addr, address val){
- idata = fAddress(addr, val);
PC = val;
}
-void fBCC(Addressing addr, address val){
- idata = fAddress(addr, val); //FINISH ALL BRANCH INSTRUCTIONS
+void fBCC(Addressing addr, address val){ //FINISH ALL BRANCH INSTRUCTIONS
//signed char val down to BVC
if (getFlag(flag_C) == 0) PC += val;
}
void fBCS(Addressing addr, address val){
- idata = fAddress(addr, val);
if (getFlag(flag_C) == 1) PC += val;
}
void fBEQ(Addressing addr, address val){
- idata = fAddress(addr, val);
if (getFlag(flag_Z) == 1) PC += val;
}
void fBNE(Addressing addr, address val){
- idata = fAddress(addr, val);
if (getFlag(flag_Z) == 0) PC += val;
}
void fBMI(Addressing addr, address val){
- idata = fAddress(addr, val);
if (getFlag(flag_N) == 1) PC += val;
}
void fBPL(Addressing addr, address val){
- idata = fAddress(addr, val);
if (getFlag(flag_N) == 0) PC += val;
}
void fBVS(Addressing addr, address val){
- idata = fAddress(addr, val);
if (getFlag(flag_V) == 1) PC += val;
}
void fBVC(Addressing addr, address val){
- idata = fAddress(addr, val);
if (getFlag(flag_V) == 0) PC += val;
}
void fCMP(Addressing addr, address val){
- idata = fAddress(addr, val);
if (acc < idata.value){
flagSet(flag_N); flagClear(flag_Z); flagClear(flag_C);
}
@@ -208,7 +181,6 @@ void fCMP(Addressing addr, address val){
}
void fCPX(Addressing addr, address val){
- idata = fAddress(addr, val);
if (X < idata.value){
flagSet(flag_N); flagClear(flag_Z); flagClear(flag_C);
}
@@ -221,7 +193,6 @@ void fCPX(Addressing addr, address val){
}
void fCPY(Addressing addr, address val){
- idata = fAddress(addr, val);
if (Y < idata.value){
flagSet(flag_N); flagClear(flag_Z); flagClear(flag_C);
}
@@ -235,7 +206,6 @@ void fCPY(Addressing addr, address val){
//NEED TO DOUBLE CHECK THIS INSTRUCTION
void fBIT(Addressing addr, address val){
- idata = fAddress(addr, val);
setFlag(flag_N, (idata.value & flag_N));
setFlag(flag_V, (idata.value & flag_V));
@@ -249,7 +219,6 @@ void fBIT(Addressing addr, address val){
// Shift and Rotate Instructions
void fASL(Addressing addr, address val){
- idata = fAddress(addr, val);
setFlag(flag_C, (idata.value & 0x80));
acc = (idata.value << 1);
setFlagN(acc);
@@ -257,7 +226,6 @@ void fASL(Addressing addr, address val){
}
void fLSR(Addressing addr, address val){
- idata = fAddress(addr, val);
setFlag(flag_C, (idata.value & 0x01));
acc = (idata.value >> 1);
setFlagN(acc);
@@ -265,7 +233,6 @@ void fLSR(Addressing addr, address val){
}
void fROL(Addressing addr, address val){
- idata = fAddress(addr, val);
setFlag(flag_C, (val & 0x80));
acc = (val << 1);
acc |= (getFlag(flag_C) * 0x01);
@@ -274,7 +241,6 @@ void fROL(Addressing addr, address val){
}
void fROR(Addressing addr, address val){
- idata = fAddress(addr, val);
setFlag(flag_C, (val & 0x01));
acc = (val >> 1);
acc |= (getFlag(flag_C) * 0x80);
@@ -285,28 +251,24 @@ void fROR(Addressing addr, address val){
// Transfer Instructions
void fTAX(Addressing addr, address val){
- idata = fAddress(addr, val);
X = acc;
//setFlagN(X);
//setFlagZ(X);
}
void fTAY(Addressing addr, address val){
- idata = fAddress(addr, val);
Y = acc;
//setFlagN(Y);
//setFlagZ(Y);
}
void fTXA(Addressing addr, address val){
- idata = fAddress(addr, val);
acc = X;
setFlagN(acc);
setFlagZ(acc);
}
void fTYA(Addressing addr, address val){
- idata = fAddress(addr, val);
acc = Y;
setFlagN(acc);
setFlagZ(acc);
@@ -315,119 +277,101 @@ void fTYA(Addressing addr, address val){
// Stack Instructions
void fTSX(Addressing addr, address val){
- idata = fAddress(addr, val);
X = S;
}
void fTXS(Addressing addr, address val){
- idata = fAddress(addr, val);
S = X;
}
void fPHA(Addressing addr, address val){
- idata = fAddress(addr, val);
- SET_STACK(acc);
+ setStack(acc);
S++;
}
void fPHP(Addressing addr, address val){
- idata = fAddress(addr, val);
- SET_STACK(P);
+ setStack(P);
S++;
}
void fPLA(Addressing addr, address val){
- idata = fAddress(addr, val);
S--;
- acc = GET_STACK;
+ acc = getStack();
}
void fPLP(Addressing addr, address val){
- idata = fAddress(addr, val);
S--;
- P = GET_STACK;
+ P = getStack();
}
// Subroutine Instructions
// NEED TO FINISH THESE
void fJSR(Addressing addr, address val){
- idata = fAddress(addr, val);
- SET_STACK(((PC-1) & 0xFF00) >> 8);
+ setStack(((PC-1) & 0xFF00) >> 8);
S++;
- SET_STACK((PC-1) & 0x00FF);
+ setStack((PC-1) & 0x00FF);
S++;
PC = idata.add;
}
void fRTS(Addressing addr, address val){
- idata = fAddress(addr, val);
S--;
- PC = (address)(GET_STACK + 1);
+ PC = (address)(getStack() + 1);
S--;
- PC += ((address)(GET_STACK)) << 8;
+ PC += ((address)(getStack())) << 8;
}
void fRTI(Addressing addr, address val){
- idata = fAddress(addr, val);
S--;
- P = GET_STACK; //NEED TO FIX
+ P = getStack(); //NEED TO FIX
S--;
- PC = (address)(GET_STACK);
+ PC = (address)(getStack());
S--;
- PC += (address)(GET_STACK << 8);
+ PC += (address)(getStack() << 8);
}
// Set/Reset Insutrctions
void fCLC(Addressing addr, address val){
- idata = fAddress(addr, val);
flagClear(flag_C);
}
void fCLD(Addressing addr, address val){
- idata = fAddress(addr, val);
flagClear(flag_D);
}
void fCLI(Addressing addr, address val){
- idata = fAddress(addr, val);
flagClear(flag_I);
}
void fCLV(Addressing addr, address val){
- idata = fAddress(addr, val);
flagClear(flag_V);
}
void fSEC(Addressing addr, address val){
- idata = fAddress(addr, val);
flagSet(flag_C);
}
void fSED(Addressing addr, address val){
- idata = fAddress(addr, val);
flagSet(flag_D);
}
void fSEI(Addressing addr, address val){
- idata = fAddress(addr, val);
flagSet(flag_I);
}
// NOP/BRK Instructions
void fNOP(Addressing addr, address val){
- idata = fAddress(addr, val);
}
void fBRK(Addressing addr, address val){
- idata = fAddress(addr, val);
- SET_STACK((((PC+2) & 0xFF00) >> 8));
+ setStack((((PC+2) & 0xFF00) >> 8));
S++;
- SET_STACK((PC+2) & 0x00FF);
+ setStack((PC+2) & 0x00FF);
S++;
- SET_STACK(P);
+ setStack(P);
S++;
PC = (address)(getMemory(0xFFFE));
PC += ((address)(getMemory(0xFFFF)) << 8);
diff --git a/src/cpu/instructions.h b/src/cpu/instructions.h
index 082082f..6e8c1bf 100644
--- a/src/cpu/instructions.h
+++ b/src/cpu/instructions.h
@@ -2,6 +2,10 @@
#ifndef INSTRUCTIONS_H
#define INSTRUCTIONS_H
+#include"core.h"
+#include"6502.h"
+//#include"addressing.h"
+
AddData idata;
// Load and Store Instructions
diff --git a/src/cpu/table.h b/src/cpu/table.h
index ded8d63..e54776d 100644
--- a/src/cpu/table.h
+++ b/src/cpu/table.h
@@ -3,8 +3,9 @@
#ifndef TABLE_H
#define TABLE_H
-#include"cstdint"
-#include"string"
+#include"stdint.h"
+#include"stdlib.h"
+#include"string.h"
#include"addressing.h"
void* InstructionTable;
@@ -25,6 +26,4 @@ void setInstructionTable(int i, uintptr_t p, Addressing r);
void initInstructionTable();
// Initializes entirety of the instruction table in memory.
-
-
#endif \ No newline at end of file