summaryrefslogtreecommitdiff
path: root/src/cpu/instructions.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu/instructions.c')
-rw-r--r--src/cpu/instructions.c86
1 files changed, 15 insertions, 71 deletions
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);