add cpu flags

This commit is contained in:
raxracks 2024-01-28 10:04:41 +13:00
parent 86384b76a3
commit e3bf688026
6 changed files with 155 additions and 59 deletions

BIN
emulator

Binary file not shown.

View file

@ -3,13 +3,13 @@
#include <stdint.h> #include <stdint.h>
#include <assert.h> #include <assert.h>
#define NEGATIVE 1 << 7 uint8_t N = 1 << 7;
#define OVERFLOW 1 << 6 uint8_t V = 1 << 6;
#define BREAK 1 << 4 uint8_t B = 1 << 4;
#define DECIMAL 1 << 3 uint8_t D = 1 << 3;
#define INTERRUPT 1 << 2 uint8_t I = 1 << 2;
#define ZERO 1 << 1 uint8_t Z = 1 << 1;
#define CARRY 1 << 0 uint8_t C = 1 << 0;
typedef struct { typedef struct {
uint8_t A; uint8_t A;
@ -21,7 +21,23 @@ typedef struct {
} CPU; } CPU;
CPU cpu = { 0 }; CPU cpu = { 0 };
uint8_t* memory; uint8_t* memory;
void add_flag(uint8_t flag) {
cpu.P |= flag;
}
void clear_flag(uint8_t flag) {
cpu.P &= ~flag;
}
void set_flag(uint8_t flag, int condition) {
if(condition == 1) {
add_flag(flag);
} else if(condition == 0) {
clear_flag(flag);
}
}
int main(int argc, char** argv) { int main(int argc, char** argv) {
assert(argc > 1); assert(argc > 1);
@ -44,13 +60,6 @@ int main(int argc, char** argv) {
printf("%d: 0x%02X (h_nib: 0x%X, l_nib: 0x%X)\n", cpu.PC, opcode, h_nib, l_nib); printf("%d: 0x%02X (h_nib: 0x%X, l_nib: 0x%X)\n", cpu.PC, opcode, h_nib, l_nib);
switch(h_nib) { switch(h_nib) {
case 0x0:
switch(l_nib) {
case 0x0:
printf("%c", cpu.A);
break;
}
break;
case 0x8: case 0x8:
switch(l_nib) { switch(l_nib) {
case 0x1: case 0x1:
@ -76,6 +85,10 @@ int main(int argc, char** argv) {
case 0xA: case 0xA:
printf(" ∟ TXA\n"); printf(" ∟ TXA\n");
cpu.A = cpu.X; cpu.A = cpu.X;
set_flag(N, cpu.A & 0x80 != 0);
set_flag(Z, cpu.A == 0);
break; break;
case 0xC: case 0xC:
printf(" ∟ STY $%04X\n", word); printf(" ∟ STY $%04X\n", word);
@ -120,6 +133,10 @@ int main(int argc, char** argv) {
case 0x8: case 0x8:
printf(" ∟ TYA\n"); printf(" ∟ TYA\n");
cpu.A = cpu.Y; cpu.A = cpu.Y;
set_flag(N, cpu.A & 0x80 != 0);
set_flag(Z, cpu.A == 0);
break; break;
case 0x9: case 0x9:
printf(" ∟ STA $%04X, Y\n", word); printf(" ∟ STA $%04X, Y\n", word);
@ -142,61 +159,108 @@ int main(int argc, char** argv) {
case 0x0: case 0x0:
printf(" ∟ LDY #$%02X\n", one); printf(" ∟ LDY #$%02X\n", one);
cpu.Y = one; cpu.Y = one;
set_flag(N, cpu.Y & 0x80 != 0);
set_flag(Z, cpu.Y == 0);
cpu.PC++; cpu.PC++;
break; break;
case 0x1: case 0x1:
printf(" ∟ LDA ($%02X, X)\n", one); printf(" ∟ LDA ($%02X, X)\n", one);
cpu.A = memory[memory[one + cpu.X]]; cpu.A = memory[memory[one + cpu.X]];
printf("addr: %x val: %x\n", memory[one + cpu.X], cpu.A);
set_flag(N, cpu.A & 0x80 != 0);
set_flag(Z, cpu.A == 0);
cpu.PC++; cpu.PC++;
break; break;
case 0x2: case 0x2:
printf(" ∟ LDX #$%02X\n", one); printf(" ∟ LDX #$%02X\n", one);
cpu.X = one; cpu.X = one;
set_flag(N, cpu.X & 0x80 != 0);
set_flag(Z, cpu.X == 0);
cpu.PC++; cpu.PC++;
break; break;
case 0x4: case 0x4:
printf(" ∟ LDY $%02X\n", one); printf(" ∟ LDY $%02X\n", one);
cpu.Y = memory[one]; cpu.Y = memory[one];
set_flag(N, cpu.Y & 0x80 != 0);
set_flag(Z, cpu.Y == 0);
cpu.PC++; cpu.PC++;
break; break;
case 0x5: case 0x5:
printf(" ∟ LDA $%02X\n", one); printf(" ∟ LDA $%02X\n", one);
cpu.A = memory[one]; cpu.A = memory[one];
set_flag(N, cpu.A & 0x80 != 0);
set_flag(Z, cpu.A == 0);
cpu.PC++; cpu.PC++;
break; break;
case 0x6: case 0x6:
printf(" ∟ LDX $%02X\n", one); printf(" ∟ LDX $%02X\n", one);
cpu.X = memory[one]; cpu.X = memory[one];
set_flag(N, cpu.X & 0x80 != 0);
set_flag(Z, cpu.X == 0);
cpu.PC++; cpu.PC++;
break; break;
case 0x8: case 0x8:
printf(" ∟ TAY\n"); printf(" ∟ TAY\n");
cpu.Y = cpu.A; cpu.Y = cpu.A;
set_flag(N, cpu.Y & 0x80 != 0);
set_flag(Z, cpu.Y == 0);
break; break;
case 0x9: case 0x9:
printf(" ∟ LDA #$%02X\n", one); printf(" ∟ LDA #$%02X\n", one);
cpu.A = one; cpu.A = one;
set_flag(N, cpu.A & 0x80 != 0);
set_flag(Z, cpu.A == 0);
cpu.PC++; cpu.PC++;
break; break;
case 0xA: case 0xA:
printf(" ∟ TAX\n"); printf(" ∟ TAX\n");
cpu.X = cpu.A; cpu.X = cpu.A;
set_flag(N, cpu.X & 0x80 != 0);
set_flag(Z, cpu.X == 0);
break; break;
case 0xC: case 0xC:
printf(" ∟ LDY $%04X\n", word); printf(" ∟ LDY $%04X\n", word);
cpu.Y = memory[word]; cpu.Y = memory[word];
set_flag(N, cpu.Y & 0x80 != 0);
set_flag(Z, cpu.Y == 0);
cpu.PC += 2; cpu.PC += 2;
break; break;
case 0xD: case 0xD:
printf(" ∟ LDA $%04X\n", word); printf(" ∟ LDA $%04X\n", word);
cpu.A = memory[word]; cpu.A = memory[word];
set_flag(N, cpu.A & 0x80 != 0);
set_flag(Z, cpu.A == 0);
cpu.PC += 2; cpu.PC += 2;
break; break;
case 0xE: case 0xE:
printf(" ∟ LDX $%04X\n", word); printf(" ∟ LDX $%04X\n", word);
cpu.X = memory[word]; cpu.X = memory[word];
set_flag(N, cpu.X & 0x80 != 0);
set_flag(Z, cpu.X == 0);
cpu.PC += 2; cpu.PC += 2;
break; break;
} }
@ -206,53 +270,81 @@ int main(int argc, char** argv) {
case 0x1: case 0x1:
printf(" ∟ LDA ($%02X), Y\n", one); printf(" ∟ LDA ($%02X), Y\n", one);
cpu.A = memory[memory[one] + cpu.Y]; cpu.A = memory[memory[one] + cpu.Y];
printf("addr: %x val: %x\n", memory[one] + cpu.Y, cpu.A);
set_flag(N, cpu.A & 0x80 != 0);
set_flag(Z, cpu.A == 0);
cpu.PC++; cpu.PC++;
break; break;
case 0x4: case 0x4:
printf(" ∟ LDY $%02X, X\n", one); printf(" ∟ LDY $%02X, X\n", one);
cpu.Y = memory[one + cpu.X]; cpu.Y = memory[one + cpu.X];
printf("addr: %x val: %x\n", one + cpu.X, cpu.Y);
set_flag(N, cpu.Y & 0x80 != 0);
set_flag(Z, cpu.Y == 0);
cpu.PC++; cpu.PC++;
break; break;
case 0x5: case 0x5:
printf(" ∟ LDA $%02X, X\n", one); printf(" ∟ LDA $%02X, X\n", one);
cpu.A = memory[one + cpu.X]; cpu.A = memory[one + cpu.X];
printf("addr: %x val: %x\n", one + cpu.X, cpu.A);
set_flag(N, cpu.A & 0x80 != 0);
set_flag(Z, cpu.A == 0);
cpu.PC++; cpu.PC++;
break; break;
case 0x6: case 0x6:
printf(" ∟ LDX $%02X, Y\n", one); printf(" ∟ LDX $%02X, Y\n", one);
cpu.X = memory[one + cpu.Y]; cpu.X = memory[one + cpu.Y];
printf("addr: %x val: %x\n", one + cpu.Y, cpu.X);
set_flag(N, cpu.X & 0x80 != 0);
set_flag(Z, cpu.X == 0);
cpu.PC++; cpu.PC++;
break; break;
case 0x9: case 0x9:
printf(" ∟ LDA $%04X, Y\n", word); printf(" ∟ LDA $%04X, Y\n", word);
cpu.A = memory[word + cpu.Y]; cpu.A = memory[word + cpu.Y];
printf("addr: %x val: %x\n", word + cpu.Y, cpu.A);
set_flag(N, cpu.A & 0x80 != 0);
set_flag(Z, cpu.A == 0);
cpu.PC++; cpu.PC++;
break; break;
case 0xA: case 0xA:
printf("TSX\n"); printf("TSX\n");
cpu.X = cpu.SP; cpu.X = cpu.SP;
set_flag(N, cpu.X & 0x80 != 0);
set_flag(Z, cpu.X == 0);
break; break;
case 0xC: case 0xC:
printf(" ∟ LDY $%04X, X\n", word); printf(" ∟ LDY $%04X, X\n", word);
cpu.Y = memory[word + cpu.X]; cpu.Y = memory[word + cpu.X];
printf("addr: %x val: %x\n", word + cpu.X, cpu.Y);
set_flag(N, cpu.Y & 0x80 != 0);
set_flag(Z, cpu.Y == 0);
cpu.PC += 2; cpu.PC += 2;
break; break;
case 0xD: case 0xD:
printf(" ∟ LDA $%04X, X\n", word); printf(" ∟ LDA $%04X, X\n", word);
cpu.A = memory[word + cpu.X]; cpu.A = memory[word + cpu.X];
printf("addr: %x val: %x\n", word + cpu.X, cpu.A);
set_flag(N, cpu.A & 0x80 != 0);
set_flag(Z, cpu.A == 0);
cpu.PC += 2; cpu.PC += 2;
break; break;
case 0xE: case 0xE:
printf(" ∟ LDX $%04X, Y\n", word); printf(" ∟ LDX $%04X, Y\n", word);
cpu.X = memory[word + cpu.Y]; cpu.X = memory[word + cpu.Y];
printf("addr: %x val: %x\n", word + cpu.Y, cpu.X);
set_flag(N, cpu.X & 0x80 != 0);
set_flag(Z, cpu.X == 0);
cpu.PC += 2; cpu.PC += 2;
break; break;
} }
@ -262,6 +354,10 @@ int main(int argc, char** argv) {
case 0x8: case 0x8:
printf(" ∟ INY\n"); printf(" ∟ INY\n");
cpu.Y++; cpu.Y++;
set_flag(N, cpu.Y & 0x80 != 0);
set_flag(Z, cpu.Y == 0);
break; break;
} }
break; break;
@ -270,11 +366,19 @@ int main(int argc, char** argv) {
case 0x6: case 0x6:
printf(" ∟ INC $%02X\n", one); printf(" ∟ INC $%02X\n", one);
memory[one]++; memory[one]++;
set_flag(N, memory[one] & 0x80 != 0);
set_flag(Z, memory[one] == 0);
cpu.PC++; cpu.PC++;
break; break;
case 0x8: case 0x8:
printf(" ∟ INX\n"); printf(" ∟ INX\n");
cpu.X++; cpu.X++;
set_flag(N, cpu.X & 0x80 != 0);
set_flag(Z, cpu.X == 0);
break; break;
case 0xA: case 0xA:
printf(" ∟ NOP\n"); printf(" ∟ NOP\n");
@ -282,6 +386,10 @@ int main(int argc, char** argv) {
case 0xE: case 0xE:
printf(" ∟ INC $%04X\n", word); printf(" ∟ INC $%04X\n", word);
memory[word]++; memory[word]++;
set_flag(N, memory[word] & 0x80 != 0);
set_flag(Z, memory[word] == 0);
cpu.PC += 2; cpu.PC += 2;
break; break;
} }
@ -290,12 +398,22 @@ int main(int argc, char** argv) {
switch(l_nib) { switch(l_nib) {
case 0x6: case 0x6:
printf(" ∟ INC $%02X, X\n", one); printf(" ∟ INC $%02X, X\n", one);
memory[one + cpu.X]++; uint8_t addr = one + cpu.X;
memory[addr]++;
set_flag(N, memory[addr] & 0x80 != 0);
set_flag(Z, memory[addr] == 0);
cpu.PC++; cpu.PC++;
break; break;
case 0xE: case 0xE:
printf(" ∟ INC $%04X, X\n", word); printf(" ∟ INC $%04X, X\n", word);
memory[word + cpu.X]++; uint16_t addr = word + cpu.X;
memory[addr]++;
set_flag(N, memory[addr] & 0x80 != 0);
set_flag(Z, cpu.Y == 0);
cpu.PC += 2; cpu.PC += 2;
break; break;
} }

BIN
hello

Binary file not shown.

View file

@ -1,27 +1,5 @@
LDX #0 LDY #$10
LDA hello, X LDY #$f9
BRK LDY #$10
INX LDY #$0
LDA hello, X LDY #$ff
BRK
INX
LDA hello, X
BRK
INX
LDA hello, X
BRK
INX
LDA hello, X
BRK
INX
LDA hello, X
BRK
INX
LDA hello, X
BRK
INX
LDA hello, X
BRK
.DATA
hello: .byte "hello\n", 0

BIN
hello.o

Binary file not shown.

View file

@ -1,23 +1,23 @@
==== LDA (completed) ==== ==== LDA (completed) ====
LDA # LDA #
LDA $ (Z) - LDA $ (Z)
LDA $ (A) LDA $ (A)
LDA $, X (Z) LDA $, X (Z)
LDA $, X (A) LDA $, X (A)
LDA $, Y (A) LDA $, Y (A)
LDA ($, X) - LDA ($, X)
LDA ($), Y LDA ($), Y
==== LDX (completed) ==== ==== LDX (completed) ====
LDX # - LDX #
LDX $ (Z) - LDX $ (Z)
LDX $ (A) LDX $ (A)
LDX $, Y (Z) LDX $, Y (Z)
LDX $, Y (A) LDX $, Y (A)
==== LDY (completed) ==== ==== LDY (completed) ====
LDY # - LDY #
LDY $ (Z) - LDY $ (Z)
LDY $ (A) LDY $ (A)
LDY $, X (Z) LDY $, X (Z)
LDY $, X (A) LDY $, X (A)