1
0
mirror of https://github.com/pevans/erc-c.git synced 2024-11-24 14:32:08 +00:00
erc-c/src/mos6502.loadstor.c
Peter Evans 2f777ce881 Several core changes to status, soft switches
Regarding soft switches, we had several we should have been listening
for on both reads and writes, but were only doing so on writes; this is
now fixed.

Regarding statuses, we were incorrectly calculating both carry and
overflow. This should now be fixed, although some quick examinations of
disassembly output suggest there is something else amiss. Debugging will
continue shortly.
2018-01-20 21:01:26 -06:00

153 lines
2.6 KiB
C

/*
* mos6502.loadstor.c
*
* These are all the instructions which load and store values into
* various registers and places in memory.
*/
#include "mos6502.h"
#include "mos6502.enums.h"
/*
* The LDA instruction will assign ("load") an operand into the
* accumulator.
*/
DEFINE_INST(lda)
{
mos6502_modify_status(cpu, MOS_NZ, cpu->A, oper);
cpu->A = oper;
}
/*
* Similar to LDA, except targeting X.
*/
DEFINE_INST(ldx)
{
mos6502_modify_status(cpu, MOS_NZ, cpu->X, oper);
cpu->X = oper;
}
/*
* Again similar to LDA, except with Y.
*/
DEFINE_INST(ldy)
{
mos6502_modify_status(cpu, MOS_NZ, cpu->Y, oper);
cpu->Y = oper;
}
/*
* This instruction will "push" the A register onto the stack.
*/
DEFINE_INST(pha)
{
mos6502_push_stack(cpu, cpu->A);
}
/*
* Similar to above, but will push the P register.
*/
DEFINE_INST(php)
{
mos6502_push_stack(cpu, cpu->P);
}
/*
* Here we pop the stack (or "pull" it), and assign to the accumulator.
*/
DEFINE_INST(pla)
{
SET_RESULT(mos6502_pop_stack(cpu));
mos6502_modify_status(cpu, MOS_NZ, cpu->A, result);
cpu->A = result;
}
/*
* Again we pop from the stack, but assign to the P register.
*/
DEFINE_INST(plp)
{
cpu->P = mos6502_pop_stack(cpu);
}
/*
* The STA instruction assigns the value of the accumulator to a given
* address in memory. (That is to say, it "stores" it.)
*/
DEFINE_INST(sta)
{
mos6502_set(cpu, cpu->eff_addr, cpu->A);
}
/*
* Similar to STA, but drawing from the X register.
*/
DEFINE_INST(stx)
{
mos6502_set(cpu, cpu->eff_addr, cpu->X);
}
/*
* And, again, similar to STA, but with the Y register.
*/
DEFINE_INST(sty)
{
mos6502_set(cpu, cpu->eff_addr, cpu->Y);
}
/*
* The TAX instruction taxes no one but your patience for my puns. What
* it does do is transfer the contents of the A register to X.
*/
DEFINE_INST(tax)
{
mos6502_modify_status(cpu, MOS_NZ, cpu->X, cpu->A);
cpu->X = cpu->A;
}
/*
* This transfers from A to Y.
*/
DEFINE_INST(tay)
{
mos6502_modify_status(cpu, MOS_NZ, cpu->Y, cpu->A);
cpu->Y = cpu->A;
}
/*
* Transfer the stack pointer (S register) to X.
*/
DEFINE_INST(tsx)
{
mos6502_modify_status(cpu, MOS_NZ, cpu->X, cpu->S);
cpu->X = cpu->S;
}
/*
* Transfer the X register to A.
*/
DEFINE_INST(txa)
{
mos6502_modify_status(cpu, MOS_NZ, cpu->A, cpu->X);
cpu->A = cpu->X;
}
/*
* Transfer the X register to S.
*/
DEFINE_INST(txs)
{
mos6502_modify_status(cpu, MOS_NZ, cpu->S, cpu->X);
cpu->S = cpu->X;
}
/*
* Transfer the Y register to A.
*/
DEFINE_INST(tya)
{
mos6502_modify_status(cpu, MOS_NZ, cpu->A, cpu->Y);
cpu->A = cpu->Y;
}