summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--ToDo15
-rw-r--r--makefile31
-rw-r--r--src/apple.c23
-rw-r--r--src/apple.h33
-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
-rw-r--r--src/debug.h7
-rw-r--r--src/include.h11
-rw-r--r--src/interpreter.c2
-rw-r--r--src/main.c3
17 files changed, 138 insertions, 147 deletions
diff --git a/.gitignore b/.gitignore
index cd49ac2..dfdcf93 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,5 @@ instruction-dump
.vscode/settings.json
a
interpreter
+build/*
+.gitignore
diff --git a/ToDo b/ToDo
index f9c8377..890359f 100644
--- a/ToDo
+++ b/ToDo
@@ -1,6 +1,17 @@
+Immediate To Do List
+Now that I have decided to pick this back up to finish it off, I have some things which I need to do.
+ [X] Rewrite the makefile to compile all the files together using the standard make procedure.
+ -> [ ] Need to figure out what is up with the multiple definitions
+ [ ] Write out interface.h functions
+ [X] table.h refuses to play ball with uintptr_t types.
+
+
+
+
+
TESING PHASE
- Test how stack works. Create a stack position macro.
- Once all stack commands are certain, push processor status to stack to be able to debug flags.
+[ ] Test how stack works. Create a stack position macro.
+[ ] Once all stack commands are certain, push processor status to stack to be able to debug flags.
Make all 6502 related parts even more modular, so as to make it possible to use in other projects if the want arises.
diff --git a/makefile b/makefile
index 84c901e..6b45ce4 100644
--- a/makefile
+++ b/makefile
@@ -1,11 +1,28 @@
SDL = -L/usr/lib -lSDL2
-default:
- gcc src/main.c $(SDL) -DGRAPHICAL -o main
+OBJS = build/6502.o build/addressing.o build/instructions.o build/table.o build/apple.o
-interpreter:
- rm interpreter
- gcc src/interpreter.c -o interpreter
+build/6502.o:
+ gcc -c src/cpu/6502.c -o build/6502.o
+build/addressing.o:
+ gcc -c src/cpu/addressing.c -o build/addressing.o
+build/instructions.o:
+ gcc -c src/cpu/instructions.c -o build/instructions.o
+build/table.o:
+ gcc -c src/cpu/table.c -o build/table.o
+build/apple.o:
+ gcc -c src/apple.c -o build/apple.o
-interpreter-illegal:
- gcc src/interpreter.c -o interpreter -D ILLEGAL \ No newline at end of file
+
+
+
+
+
+default: $(OBJS)
+ gcc src/main.c -o build/main
+
+interpreter: $(OBJS)
+ gcc src/interpreter.c -o interpreter $(OBJS)
+
+clean:
+ rm build/* \ No newline at end of file
diff --git a/src/apple.c b/src/apple.c
new file mode 100644
index 0000000..9886d2c
--- /dev/null
+++ b/src/apple.c
@@ -0,0 +1,23 @@
+#include"apple.h"
+
+
+void AppleOn(){
+ Memory = calloc(MEMORY_SIZE, sizeof(byte));
+ initInstructionTable();
+}
+
+void AppleReset(){
+ acc = 0; X = 0; Y = 0; P = 0; S = 0;
+ idata.cycles = 0; idata.length = 0; idata.add = 0; idata.value = 0;
+ free(Memory);
+ Memory = calloc(MEMORY_SIZE, sizeof(byte));
+}
+
+
+byte getMemory(address x){
+ return Memory[x];
+}
+
+void setMemory(address x, byte y){
+ Memory[x] = y;
+} \ No newline at end of file
diff --git a/src/apple.h b/src/apple.h
index 036f48c..01452cf 100644
--- a/src/apple.h
+++ b/src/apple.h
@@ -1,3 +1,13 @@
+#ifndef APPLE
+#define APPLE
+
+
+#include"cpu/6502.h"
+#include"cpu/addressing.h"
+#include"cpu/core.h"
+#include"cpu/instructions.h"
+#include"cpu/table.h"
+
#define MEMORY_SIZE 4096
#define XAML 0x24
@@ -14,25 +24,12 @@
#define DSP 0xD012
#define DSP_CR 0xD013
+void AppleOn();
-void AppleOn(){
- Memory = calloc(MEMORY_SIZE, sizeof(byte));
- initInstructionTable();
-}
-
-void AppleReset(){
- acc = 0; X = 0; Y = 0; P = 0; S = 0;
- idata.cycles = 0; idata.length = 0; idata.add = 0; idata.value = 0;
- free(Memory);
- Memory = calloc(MEMORY_SIZE, sizeof(byte));
-}
-
+void AppleReset();
-byte getMemory(address x){
- return Memory[x];
-}
+byte getMemory(address x);
-void setMemory(address x, byte y){
- Memory[x] = y;
-}
+void setMemory(address x, byte y);
+#endif \ No newline at end of file
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
diff --git a/src/debug.h b/src/debug.h
index 850b2d0..b36d187 100644
--- a/src/debug.h
+++ b/src/debug.h
@@ -1,6 +1,13 @@
// debug.h
// Various functions useful for use during development.
+#include"stdio.h"
+#include"cpu/6502.h"
+#include"cpu/addressing.h"
+#include"cpu/core.h"
+#include"cpu/instructions.h"
+#include"cpu/table.h"
+
// Converts a single character to hexadecimal
int dCharToNum(char c){
// 0x0 - 0x9
diff --git a/src/include.h b/src/include.h
deleted file mode 100644
index 3cd1502..0000000
--- a/src/include.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#include"stdio.h"
-#include"stdint.h"
-#include"stdlib.h"
-#include"string.h"
-#include"cpu/6502.h"
-#include"apple.h"
-
-#ifdef GRAPHICAL
-#include<SDL2/SDL.h>
-#include"signetics.h"
-#endif \ No newline at end of file
diff --git a/src/interpreter.c b/src/interpreter.c
index a51ade1..5d41522 100644
--- a/src/interpreter.c
+++ b/src/interpreter.c
@@ -2,8 +2,6 @@
// Useful for carrying out tests of the CPU instructions.
// Refer to interpreter.md for the manual
-
-#include"include.h"
#include"debug.h"
//Write a custom getc function here which ignores spaces
diff --git a/src/main.c b/src/main.c
index d5d5ded..fe81be5 100644
--- a/src/main.c
+++ b/src/main.c
@@ -6,7 +6,8 @@ int main() {
-
+ // This line retrieves data about instruction used
+ idata = fAddress(addr, val);
return 0;