implement untested most of stack-related opcodes
This commit is contained in:
parent
dbb952a52b
commit
3412a03a5e
127
cpu.c
127
cpu.c
@ -10,6 +10,11 @@
|
|||||||
#define STATUS_UPDATE_NEGATIVE(r) \
|
#define STATUS_UPDATE_NEGATIVE(r) \
|
||||||
(regs.status.negative = ((r & (1 << 7)) > 0))
|
(regs.status.negative = ((r & (1 << 7)) > 0))
|
||||||
|
|
||||||
|
#define PUSH(b) \
|
||||||
|
(memwrite(0x0100 + regs.sp--, b))
|
||||||
|
#define PULL() \
|
||||||
|
(peek(0x0100 + regs.sp++))
|
||||||
|
|
||||||
struct cpu_flags {
|
struct cpu_flags {
|
||||||
uint8_t carry : 1;
|
uint8_t carry : 1;
|
||||||
uint8_t zero : 1;
|
uint8_t zero : 1;
|
||||||
@ -467,51 +472,48 @@ ora(uint8_t arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
pha(uint8_t arg)
|
pha(void)
|
||||||
{
|
{
|
||||||
/* TODO: complete this */
|
PUSH(regs.a);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
php(uint8_t arg)
|
php(void)
|
||||||
{
|
{
|
||||||
/* TODO: complete this */
|
uint8_t status;
|
||||||
|
|
||||||
|
status = (regs.status.carry << 7) | (regs.status.zero << 6)
|
||||||
|
| (regs.status.interrupt_disable << 5) | (regs.status.decimal_mode << 4)
|
||||||
|
| (regs.status.brk << 3) | (regs.status.unused << 2)
|
||||||
|
| (regs.status.overflow << 1) | regs.status.negative;
|
||||||
|
|
||||||
|
PUSH(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
phx(uint8_t arg)
|
pla(void)
|
||||||
{
|
{
|
||||||
/* TODO: complete this */
|
regs.a = PULL();
|
||||||
|
|
||||||
|
STATUS_UPDATE_ZERO(regs.a);
|
||||||
|
STATUS_UPDATE_NEGATIVE(regs.a);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
phy(uint8_t arg)
|
plp(void)
|
||||||
{
|
{
|
||||||
/* TODO: complete this */
|
uint8_t status;
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
status = PULL();
|
||||||
pla(uint8_t arg)
|
|
||||||
{
|
|
||||||
/* TODO: complete this */
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
regs.status.carry = (status & (1 << 7)) > 0;
|
||||||
plp(uint8_t arg)
|
regs.status.zero = (status & (1 << 6)) > 0;
|
||||||
{
|
regs.status.interrupt_disable = (status & (1 << 5)) > 0;
|
||||||
/* TODO: complete this */
|
regs.status.decimal_mode = (status & (1 << 4)) > 0;
|
||||||
}
|
regs.status.brk = (status & (1 << 3)) > 0;
|
||||||
|
regs.status.unused = (status & (1 << 2)) > 0;
|
||||||
static void
|
regs.status.overflow = (status & (1 << 1)) > 0;
|
||||||
plx(uint8_t arg)
|
regs.status.negative = (status & 1) > 0;
|
||||||
{
|
|
||||||
/* TODO: complete this */
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
ply(uint8_t arg)
|
|
||||||
{
|
|
||||||
/* TODO: complete this */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -562,19 +564,19 @@ sbc(uint8_t arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sec(uint8_t arg)
|
sec(void)
|
||||||
{
|
{
|
||||||
regs.status.carry = 1;
|
regs.status.carry = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sed(uint8_t arg)
|
sed(void)
|
||||||
{
|
{
|
||||||
regs.status.decimal_mode = 1;
|
regs.status.decimal_mode = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sei(uint8_t arg)
|
sei(void)
|
||||||
{
|
{
|
||||||
regs.status.interrupt_disable = 1;
|
regs.status.interrupt_disable = 1;
|
||||||
}
|
}
|
||||||
@ -607,7 +609,7 @@ tax(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
tay(uint8_t arg)
|
tay(void)
|
||||||
{
|
{
|
||||||
regs.y = regs.a;
|
regs.y = regs.a;
|
||||||
|
|
||||||
@ -616,13 +618,16 @@ tay(uint8_t arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
tsx(uint8_t arg)
|
tsx(void)
|
||||||
{
|
{
|
||||||
/* TODO: complete this */
|
regs.x = PULL();
|
||||||
|
|
||||||
|
STATUS_UPDATE_ZERO(regs.x);
|
||||||
|
STATUS_UPDATE_NEGATIVE(regs.x);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
txa(uint8_t arg)
|
txa(void)
|
||||||
{
|
{
|
||||||
regs.a = regs.x;
|
regs.a = regs.x;
|
||||||
|
|
||||||
@ -631,13 +636,13 @@ txa(uint8_t arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
txs(uint8_t arg)
|
txs(void)
|
||||||
{
|
{
|
||||||
/* TODO: complete this */
|
PUSH(regs.x);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
tya(uint8_t arg)
|
tya(void)
|
||||||
{
|
{
|
||||||
regs.a = regs.y;
|
regs.a = regs.y;
|
||||||
|
|
||||||
@ -1121,35 +1126,19 @@ interpret(void)
|
|||||||
cycles += 5;
|
cycles += 5;
|
||||||
break;
|
break;
|
||||||
case 0x48:
|
case 0x48:
|
||||||
pha(opcode_arg(AM_ACC));
|
pha();
|
||||||
cycles += 3;
|
cycles += 3;
|
||||||
break;
|
break;
|
||||||
case 0x08:
|
case 0x08:
|
||||||
php(opcode_arg(AM_ACC));
|
php();
|
||||||
cycles += 3;
|
|
||||||
break;
|
|
||||||
case 0xda:
|
|
||||||
phx(opcode_arg(AM_ACC));
|
|
||||||
cycles += 3;
|
|
||||||
break;
|
|
||||||
case 0x5a:
|
|
||||||
phy(opcode_arg(AM_ACC));
|
|
||||||
cycles += 3;
|
cycles += 3;
|
||||||
break;
|
break;
|
||||||
case 0x68:
|
case 0x68:
|
||||||
pla(opcode_arg(AM_ACC));
|
pla();
|
||||||
cycles += 4;
|
cycles += 4;
|
||||||
break;
|
break;
|
||||||
case 0x28:
|
case 0x28:
|
||||||
plp(opcode_arg(AM_ACC));
|
plp();
|
||||||
cycles += 4;
|
|
||||||
break;
|
|
||||||
case 0xfa:
|
|
||||||
plx(opcode_arg(AM_ACC));
|
|
||||||
cycles += 4;
|
|
||||||
break;
|
|
||||||
case 0x7a:
|
|
||||||
ply(opcode_arg(AM_ACC));
|
|
||||||
cycles += 4;
|
cycles += 4;
|
||||||
break;
|
break;
|
||||||
case 0x2a:
|
case 0x2a:
|
||||||
@ -1237,15 +1226,15 @@ interpret(void)
|
|||||||
cycles += 5;
|
cycles += 5;
|
||||||
break;
|
break;
|
||||||
case 0x38:
|
case 0x38:
|
||||||
sec(opcode_arg(AM_ACC));
|
sec();
|
||||||
cycles += 2;
|
cycles += 2;
|
||||||
break;
|
break;
|
||||||
case 0xf8:
|
case 0xf8:
|
||||||
sed(opcode_arg(AM_ACC));
|
sed();
|
||||||
cycles += 2;
|
cycles += 2;
|
||||||
break;
|
break;
|
||||||
case 0x78:
|
case 0x78:
|
||||||
sei(opcode_arg(AM_ACC));
|
sei();
|
||||||
cycles += 2;
|
cycles += 2;
|
||||||
break;
|
break;
|
||||||
case 0x85:
|
case 0x85:
|
||||||
@ -1309,23 +1298,23 @@ interpret(void)
|
|||||||
cycles += 2;
|
cycles += 2;
|
||||||
break;
|
break;
|
||||||
case 0xa8:
|
case 0xa8:
|
||||||
tay(opcode_arg(AM_ACC));
|
tay();
|
||||||
cycles += 2;
|
cycles += 2;
|
||||||
break;
|
break;
|
||||||
case 0xba:
|
case 0xba:
|
||||||
tsx(opcode_arg(AM_ACC));
|
tsx();
|
||||||
cycles += 2;
|
cycles += 2;
|
||||||
break;
|
break;
|
||||||
case 0x8a:
|
case 0x8a:
|
||||||
txa(opcode_arg(AM_ACC));
|
txa();
|
||||||
cycles += 2;
|
cycles += 2;
|
||||||
break;
|
break;
|
||||||
case 0x9a:
|
case 0x9a:
|
||||||
txs(opcode_arg(AM_ACC));
|
txs();
|
||||||
cycles += 2;
|
cycles += 2;
|
||||||
break;
|
break;
|
||||||
case 0x98:
|
case 0x98:
|
||||||
tya(opcode_arg(AM_ACC));
|
tya();
|
||||||
cycles += 2;
|
cycles += 2;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -1353,6 +1342,8 @@ cpu_init(void)
|
|||||||
|
|
||||||
memset(®s.status, 0, sizeof(regs.status));
|
memset(®s.status, 0, sizeof(regs.status));
|
||||||
regs.status.unused = 1;
|
regs.status.unused = 1;
|
||||||
|
|
||||||
|
cycles += 7;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
Loading…
Reference in New Issue
Block a user