From 580a7040ba53367c15ca682d4ea90c31fdcca45f Mon Sep 17 00:00:00 2001 From: alekseiplusplus Date: Fri, 1 Dec 2023 00:47:05 +1100 Subject: large progress approaching functionality --- src/apple.c | 14 +++++- src/cpu/6502.c | 11 +++-- src/cpu/instructions.c | 115 +++++++------------------------------------------ src/cpu/table.c | 1 + src/main.c | 2 +- src/video/ncurses.c | 26 +++++++---- 6 files changed, 54 insertions(+), 115 deletions(-) (limited to 'src') diff --git a/src/apple.c b/src/apple.c index 8a5e73b..6f48c10 100644 --- a/src/apple.c +++ b/src/apple.c @@ -84,9 +84,14 @@ byte GetMemory(address x){ // The keyboard does not act precisely as the real hardware, because there is no need to wait for the keyboard. // So KBD_CR and DSP always return a high high-order bit, and when the keyboard data is requested it will wait for UserInput() to finish. case KBD: - return 0b10000000 | UserInput(); - case KBD_CR: case DSP: + char c = -1; + while(c == -1) + c = UserInput(); + return 0b10000000 | c; + case KBD_CR: return 0b10000000; + case DSP: + return 0b00000000; } if (x >= 0xFF00 && x <= 0xFFFF) { @@ -100,6 +105,11 @@ byte GetMemory(address x){ } void SetMemory(address x, byte y){ + switch(x) + { + case DSP: + + } if (x < MEMORY_SIZE) { Memory[x] = y; } diff --git a/src/cpu/6502.c b/src/cpu/6502.c index 17796cf..ab8248e 100644 --- a/src/cpu/6502.c +++ b/src/cpu/6502.c @@ -33,10 +33,11 @@ void flagClear(byte 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) + /*if ((x & flag_N) == flag_N) SetFlag(flag_N, 1); else - SetFlag(flag_N, 0); + SetFlag(flag_N, 0);*/ + P = (x & flag_N) | (P & ~flag_N); } //Perform prior to any changes @@ -84,9 +85,11 @@ void SetMemory(address x, byte y){ byte GetStack() { + S--; return GetMemory(0x01FF - S); } -void SetStack(byte z) { - SetMemory(0x01FF - S, z); +void SetStack(byte x) { + SetMemory(0x01FF - S, x); + S++; } diff --git a/src/cpu/instructions.c b/src/cpu/instructions.c index 36e2a41..c043ac4 100644 --- a/src/cpu/instructions.c +++ b/src/cpu/instructions.c @@ -18,32 +18,27 @@ AddData idata; void fLDA(Addressing addr, address val){ acc = idata.value; - PC += idata.length; + SetFlagN(acc); } void fLDX(Addressing addr, address val){ X = idata.value; - PC += idata.length; } void fLDY(Addressing addr, address val){ Y = idata.value; - PC += idata.length; } void fSTA(Addressing addr, address val){ SetMemory(idata.add, acc); - PC += idata.length; } void fSTX(Addressing addr, address val){ SetMemory(idata.add, X); - PC += idata.length; } void fSTY(Addressing addr, address val){ SetMemory(idata.add, Y); - PC += idata.length; } // Arithmetic Instructions @@ -60,7 +55,6 @@ void fADC(Addressing addr, address val){ acc += idata.value; SetFlagN(acc); SetFlagZ(acc); - PC += idata.length; } void fSBC(Addressing addr, address val){ @@ -75,7 +69,6 @@ void fSBC(Addressing addr, address val){ acc -= idata.value; SetFlagN(acc); SetFlagZ(acc); - PC += idata.length; } //Increment and Decrement Instructions @@ -86,21 +79,18 @@ void fINC(Addressing addr, address val){ SetMemory(idata.add, a); SetFlagN(Memory[idata.add]); SetFlagZ(Memory[idata.add]); - PC += idata.length; } void fINX(Addressing addr, address val){ X++; SetFlagN(X); SetFlagZ(X); - PC += idata.length; } void fINY(Addressing addr, address val){ Y++; SetFlagN(Y); SetFlagZ(Y); - PC += idata.length; } void fDEC(Addressing addr, address val){ @@ -109,21 +99,18 @@ void fDEC(Addressing addr, address val){ SetMemory(idata.add, a); SetFlagN(Memory[idata.add]); SetFlagZ(Memory[idata.add]); - PC += idata.length; } void fDEX(Addressing addr, address val){ X--; SetFlagN(X); SetFlagZ(X); - PC += idata.length; } void fDEY(Addressing addr, address val){ Y--; SetFlagN(Y); SetFlagZ(Y); - PC += idata.length; } // Logical Instructions @@ -132,21 +119,18 @@ void fAND(Addressing addr, address val){ acc &= idata.value; SetFlagN(acc); SetFlagZ(acc); - PC += idata.length; } void fORA(Addressing addr, address val){ acc |= idata.value; SetFlagN(acc); SetFlagZ(acc); - PC += idata.length; } void fEOR(Addressing addr, address val){ acc ^= idata.value; SetFlagN(acc); SetFlagZ(acc); - PC += idata.length; } // Jump, Branch, Compare, and Test Bits @@ -157,59 +141,35 @@ void fJMP(Addressing addr, address val){ void fBCC(Addressing addr, address val){ //FINISH ALL BRANCH INSTRUCTIONS //signed char val down to BVC - if (getFlag(flag_C) == 0) - PC += (char)val; - else - PC += idata.length; + if (getFlag(flag_C) == 0) PC += (char)val; } void fBCS(Addressing addr, address val){ - if (getFlag(flag_C) == 1) - PC += (char)val; - else - PC += idata.length; + if (getFlag(flag_C) == 1) PC += (char)val; } void fBEQ(Addressing addr, address val){ - if (getFlag(flag_Z) == 1) - PC += (char)val; - else - PC += idata.length; + if (getFlag(flag_Z) == 1) PC += (char)val; } void fBNE(Addressing addr, address val){ - if (getFlag(flag_Z) == 0) - PC += (char)val; - else - PC += idata.length; + if (getFlag(flag_Z) == 0) PC += (char)val; } void fBMI(Addressing addr, address val){ - if (getFlag(flag_N) == 1) - PC += (char)val; - else - PC += idata.length; + if (getFlag(flag_N) == 1) PC += (char)val; } void fBPL(Addressing addr, address val){ - if (getFlag(flag_N) == 0) - PC += (char)val; - else - PC += idata.length; + if (getFlag(flag_N) == 0) PC += (char)val; } void fBVS(Addressing addr, address val){ - if (getFlag(flag_V) == 1) - PC += (char)val; - else - PC += idata.length; + if (getFlag(flag_V) == 1) PC += (char)val; } void fBVC(Addressing addr, address val){ - if (getFlag(flag_V) == 0) - PC += (char)val; - else - PC += idata.length; + if (getFlag(flag_V) == 0) PC += (char)val; } void fCMP(Addressing addr, address val){ @@ -222,7 +182,6 @@ void fCMP(Addressing addr, address val){ else if (acc > idata.value){ flagClear(flag_N); flagClear(flag_Z); flagSet(flag_C); } - PC += idata.length; } void fCPX(Addressing addr, address val){ @@ -235,7 +194,6 @@ void fCPX(Addressing addr, address val){ else if (X > idata.value){ flagClear(flag_N); flagClear(flag_Z); flagSet(flag_C); } - PC += idata.length; } void fCPY(Addressing addr, address val){ @@ -248,20 +206,18 @@ void fCPY(Addressing addr, address val){ else if (Y > idata.value){ flagClear(flag_N); flagClear(flag_Z); flagSet(flag_C); } - PC += idata.length; } //NEED TO DOUBLE CHECK THIS INSTRUCTION void fBIT(Addressing addr, address val){ - SetFlag(flag_N, (idata.value & flag_N)); - SetFlag(flag_V, (idata.value & flag_V)); + SetFlag(flag_N, (idata.value & flag_N)?1:0); + SetFlag(flag_V, (idata.value & flag_V)?1:0); if (((idata.value & flag_N) & (idata.value & flag_V)) == 0) { flagSet(flag_Z); } else { flagSet(flag_Z); } - PC += idata.length; } // Shift and Rotate Instructions @@ -271,7 +227,6 @@ void fASL(Addressing addr, address val){ acc = (idata.value << 1); SetFlagN(acc); SetFlagZ(acc); - PC += idata.length; } void fLSR(Addressing addr, address val){ @@ -279,7 +234,6 @@ void fLSR(Addressing addr, address val){ acc = (idata.value >> 1); SetFlagN(acc); SetFlagZ(acc); - PC += idata.length; } void fROL(Addressing addr, address val){ @@ -288,7 +242,6 @@ void fROL(Addressing addr, address val){ acc |= (getFlag(flag_C) * 0x01); SetFlagN(acc); SetFlagZ(acc); - PC += idata.length; } void fROR(Addressing addr, address val){ @@ -297,7 +250,6 @@ void fROR(Addressing addr, address val){ acc |= (getFlag(flag_C) * 0x80); SetFlagN(acc); SetFlagZ(acc); - PC += idata.length; } // Transfer Instructions @@ -306,90 +258,69 @@ void fTAX(Addressing addr, address val){ X = acc; //SetFlagN(X); //SetFlagZ(X); - PC += idata.length; } void fTAY(Addressing addr, address val){ Y = acc; //SetFlagN(Y); //SetFlagZ(Y); - PC += idata.length; } void fTXA(Addressing addr, address val){ acc = X; SetFlagN(acc); SetFlagZ(acc); - PC += idata.length; } void fTYA(Addressing addr, address val){ acc = Y; SetFlagN(acc); SetFlagZ(acc); - PC += idata.length; } // Stack Instructions void fTSX(Addressing addr, address val){ X = S; - PC += idata.length; } void fTXS(Addressing addr, address val){ S = X; - PC += idata.length; } void fPHA(Addressing addr, address val){ SetStack(acc); - S++; - PC += idata.length; } void fPHP(Addressing addr, address val){ SetStack(P); - S++; - PC += idata.length; } void fPLA(Addressing addr, address val){ - S--; acc = GetStack(); - PC += idata.length; } void fPLP(Addressing addr, address val){ - S--; P = GetStack(); - PC += idata.length; } // Subroutine Instructions // NEED TO FINISH THESE void fJSR(Addressing addr, address val){ - SetStack(((PC-1) & 0xFF00) >> 8); - S++; - SetStack((PC-1) & 0x00FF); - S++; + SetStack((PC+3) >> 8); + SetStack((PC+3) & 0x00FF); PC = idata.add; } void fRTS(Addressing addr, address val){ - S--; - PC = (address)(GetStack() + 1); - S--; + PC = (address)(GetStack()) - 1; PC += ((address)(GetStack())) << 8; } void fRTI(Addressing addr, address val){ - S--; P = GetStack(); //NEED TO FIX - S--; - PC = (address)(GetStack()); - S--; + PC = (address)(GetStack()); PC += (address)(GetStack() << 8); } @@ -397,57 +328,41 @@ void fRTI(Addressing addr, address val){ void fCLC(Addressing addr, address val){ flagClear(flag_C); - PC += idata.length; } void fCLD(Addressing addr, address val){ flagClear(flag_D); - PC += idata.length; } void fCLI(Addressing addr, address val){ flagClear(flag_I); - PC += idata.length; } void fCLV(Addressing addr, address val){ flagClear(flag_V); - PC += idata.length; } void fSEC(Addressing addr, address val){ flagSet(flag_C); - PC += idata.length; } void fSED(Addressing addr, address val){ flagSet(flag_D); - PC += idata.length; } void fSEI(Addressing addr, address val){ flagSet(flag_I); - PC += idata.length; } // NOP/BRK Instructions void fNOP(Addressing addr, address val){ - PC += idata.length; } void fBRK(Addressing addr, address val){ SetStack((((PC+2) & 0xFF00) >> 8)); - S++; SetStack((PC+2) & 0x00FF); - S++; SetStack(P); - S++; PC = (address)(GetMemory(0xFFFE)); PC += ((address)(GetMemory(0xFFFF)) << 8); } - -#ifdef ILLEGAL_INSTRUCTIONS - - -#endif diff --git a/src/cpu/table.c b/src/cpu/table.c index 27ec8f2..ca14c1c 100644 --- a/src/cpu/table.c +++ b/src/cpu/table.c @@ -35,6 +35,7 @@ void CallInstructionTable(int i, address val){ // Perform function func(*r, val); + PC += idata.length; } void SetInstructionTable(int i, uintptr_t p, Addressing r){ diff --git a/src/main.c b/src/main.c index f7a6a00..036d06d 100644 --- a/src/main.c +++ b/src/main.c @@ -13,7 +13,7 @@ int main() { CallInstructionTable(GetMemory(PC), 0); PrintInfo(); //sleep(3); - getch(); + //getch(); } TerminalClose(); diff --git a/src/video/ncurses.c b/src/video/ncurses.c index c3357c2..e4a7613 100644 --- a/src/video/ncurses.c +++ b/src/video/ncurses.c @@ -18,33 +18,34 @@ WINDOW *AppleWindow; byte UserInput() { int c = getch(); - byte C; + byte r; switch(c) { // Convert special characters case KEY_BACKSPACE: - C = 0xDF; + r = 0xDF; case KEY_ENTER: - C = 0x8D; + r = 0x8D; case KEY_EXIT: //TODO: Figure out if this is Esc or not. - C = 0x9B; + r = 0x9B; // Convert regular characters default: if (c < 0x20 || c >= 0x60) return -1; if (c >= 0x40) - C = c - 0x40; + r = c - 0x40; else - C = c; + r = c; break; } - SetMemory(KBD, C); + SetMemory(KBD, r); + - TerminalInput(c); + TerminalInput(r); return c; @@ -68,6 +69,15 @@ void PrintInfo() getFlag(flag_Z) ? 'Z':'.' , getFlag(flag_C) ? 'C':'.' ); + mvprintw(2, 65, "Stack"); + int count = 3; + for (int i = 0x1ff; i > 0x1cf; i--) { + if (i == (0x1ff-S)) // Indicate the stack pointer! + attron(A_REVERSE); + mvprintw(count, 65, "%x : %x", i, GetMemory(i)); + attroff(A_REVERSE); + count++; + } refresh(); } -- cgit v1.2.3