diff options
Diffstat (limited to 'src/cpu')
-rw-r--r-- | src/cpu/6502.c | 1 | ||||
-rw-r--r-- | src/cpu/6502.h | 5 | ||||
-rw-r--r-- | src/cpu/addressing.c | 3 | ||||
-rw-r--r-- | src/cpu/addressing.h | 27 | ||||
-rw-r--r-- | src/cpu/core.h | 25 | ||||
-rw-r--r-- | src/cpu/instructions.c | 86 | ||||
-rw-r--r-- | src/cpu/instructions.h | 4 | ||||
-rw-r--r-- | src/cpu/table.h | 7 |
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 |