diff options
author | alekseiplusplus <alekseijeaves@protonmail.com> | 2023-08-05 05:32:54 +1000 |
---|---|---|
committer | alekseiplusplus <alekseijeaves@protonmail.com> | 2023-08-05 05:32:54 +1000 |
commit | a11980fe90fe62588fdf8103d9ef418283b3fd27 (patch) | |
tree | 954d2e327ff5190c8cdcdd977d9a73438ed62ca3 /src/cpu/instructions.c | |
parent | b8599585fad704b2ec3bdde69dca4dd9c2a6f8fd (diff) |
major refactor; doesn't compile (see ToDo)
Diffstat (limited to 'src/cpu/instructions.c')
-rw-r--r-- | src/cpu/instructions.c | 86 |
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); |