summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--applesystem.h11
-rw-r--r--instruction.h58
2 files changed, 44 insertions, 25 deletions
diff --git a/applesystem.h b/applesystem.h
index bf94a72..a26aff7 100644
--- a/applesystem.h
+++ b/applesystem.h
@@ -35,6 +35,15 @@ void setFlag(byte flag, int x) { //OVERLOAD TO ACCEPT INT AS WELL
}
}
+void flagSet(byte flag){
+ P |= flag;
+}
+
+void flagClear(byte flag){
+ P &= ~flag
+}
+
+
// BCD
byte toBCD(byte x){
@@ -54,7 +63,7 @@ byte fromBCD(byte x){
return (a + b);
}
-
+// addBCD()
diff --git a/instruction.h b/instruction.h
index f9ecd0b..bdb337c 100644
--- a/instruction.h
+++ b/instruction.h
@@ -53,9 +53,9 @@ instruction_data fADC(Addressing addr, address val){
setFlagV(buffer, acc);
if (buffer > 255){
- setFlag(flag_C, 1);
+ flagSet(flag_C);
}else{
- setFlag(flag_C, 0);
+ flagClear(flag_C);
}
acc += fAddressing(addr, val);
@@ -68,9 +68,9 @@ instruction_data fSBC(Addressing addr, address val){
setFlagV(buffer, acc);
if (buffer < 0){
- setFlag(flag_C, 1);
+ flagSet(flag_C);
}else{
- setFlag(flag_C, 0);
+ flagClear(flag_C);
}
acc -= fAddressing(addr, val);
setFlagN(acc);
@@ -175,31 +175,31 @@ instruction_data fBVC(signed char val){
instruction_data fCMP(address val){
if (acc < Memory[val]){
- setFlag(flag_N, 1); setFlag(flag_Z, 0); setFlag(flag_C, 0);
+ flagSet(flag_N); flagClear(flag_Z); flagClear(flag_C);
}if (acc == Memory[val]){
- setFlag(flag_N, 0); setFlag(flag_Z, 1); setFlag(flag_C, 0);
+ flagClear(flag_N); flagSet(flag_Z); flagClear(flag_C);
}if (acc > Memory[val]){
- setFlag(flag_N, 0); setFlag(flag_Z, 0); setFlag(flag_C, 1);
+ flagClear(flag_N); flagClear(flag_Z); flagSet(flag_C);
}
}
instruction_data fCPX(address val){
if (X < Memory[val]){
- setFlag(flag_N, 1); setFlag(flag_Z, 0); setFlag(flag_C, 0);
+ flagSet(flag_N); flagClear(flag_Z); flagClear(flag_C);
}if (X == Memory[val]){
- setFlag(flag_N, 0); setFlag(flag_Z, 1); setFlag(flag_C, 0);
+ flagClear(flag_N); flagSet(flag_Z); flagClear(flag_C);
}if (X > Memory[val]){
- setFlag(flag_N, 0); setFlag(flag_Z, 0); setFlag(flag_C, 1);
+ flagClear(flag_N); flagClear(flag_Z); flagSet(flag_C);
}
}
instruction_data fCPY(address val){
if (Y < Memory[val]){
- setFlag(flag_N, 1); setFlag(flag_Z, 0); setFlag(flag_C, 0);
+ flagSet(flag_N); flagClear(flag_Z); flagClear(flag_C);
}if (Y == Memory[val]){
- setFlag(flag_N, 0); setFlag(flag_Z, 1); setFlag(flag_C, 0);
+ flagClear(flag_N); flagSet(flag_Z); flagClear(flag_C);
}if (Y > Memory[val]){
- setFlag(flag_N, 0); setFlag(flag_Z, 0); setFlag(flag_C, 1);
+ flagClear(flag_N); flagClear(flag_Z); flagSet(flag_C);
}
}
@@ -207,9 +207,9 @@ instruction_data fBIT(address val){
setFlag(flag_N, (Memory[val] & flag_N));
setFlag(flag_V, (Memory[val] & flag_V));
if (((Memory[val] & flag_N) & (Memory[val] & flag_V)) == 0) {
- setFlag(flag_Z, 1);
+ flagSet(flag_Z);
} else {
- setFlag(flag_Z, 0);
+ flagSet(flag_Z);
}
}
@@ -304,40 +304,50 @@ instruction_data fPLP(){
// Set/Reset Insutrctions
instruction_data fCLC(){
- setFlag(flag_C, 0);
+ flagClear(flag_C);
+ return {1, 2};
}
instruction_data fCLD(){
- setFlag(flag_D, 0);
+ flagClear(flag_D);
+ return {1, 2};
}
instruction_data fCLI(){
- setFlag(flag_I, 0);
+ flagClear(flag_I);
+ return {1, 2};
}
instruction_data fCLV(){
- setFlag(flag_V, 0);
+ flagClear(flag_V);
+ return {1, 2};
}
instruction_data fSEC(){
- setFlag(flag_C, 1);
+ flagSet(flag_C);
+ return {1, 2};
}
instruction_data fSED(){
- setFlag(flag_D, 1);
+ flagSet(flag_D);
+ return {1, 2};
}
instruction_data fSEI(){
- setFlag(flag_I, 1);
+ flagSet(flag_I);
+ return {1, 2};
}
// NOP/BRK Instructions
instruction_data fNOP(){
- return {2, 1};
+ return {1, 2};
}
-
+instruction_data fBRK(){
+ flagSet(flag_B);
+ return {1, 7};
+}