2017-12-02 19:05:53 +00:00
|
|
|
/*
|
|
|
|
* mos6502.loadstor.c
|
2017-12-09 04:12:31 +00:00
|
|
|
*
|
|
|
|
* These are all the instructions which load and store values into
|
|
|
|
* various registers and places in memory.
|
2017-12-02 19:05:53 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include "mos6502.h"
|
|
|
|
#include "mos6502.enums.h"
|
|
|
|
|
2017-12-07 00:01:13 +00:00
|
|
|
/*
|
|
|
|
* The LDA instruction will assign ("load") an operand into the
|
|
|
|
* accumulator.
|
|
|
|
*/
|
2017-12-02 19:05:53 +00:00
|
|
|
DEFINE_INST(lda)
|
|
|
|
{
|
2018-01-21 03:01:26 +00:00
|
|
|
mos6502_modify_status(cpu, MOS_NZ, cpu->A, oper);
|
2017-12-02 19:05:53 +00:00
|
|
|
cpu->A = oper;
|
|
|
|
}
|
|
|
|
|
2017-12-07 00:01:13 +00:00
|
|
|
/*
|
|
|
|
* Similar to LDA, except targeting X.
|
|
|
|
*/
|
2017-12-02 19:05:53 +00:00
|
|
|
DEFINE_INST(ldx)
|
|
|
|
{
|
2018-01-21 03:01:26 +00:00
|
|
|
mos6502_modify_status(cpu, MOS_NZ, cpu->X, oper);
|
2017-12-02 19:05:53 +00:00
|
|
|
cpu->X = oper;
|
|
|
|
}
|
|
|
|
|
2017-12-07 00:01:13 +00:00
|
|
|
/*
|
|
|
|
* Again similar to LDA, except with Y.
|
|
|
|
*/
|
2017-12-02 19:05:53 +00:00
|
|
|
DEFINE_INST(ldy)
|
|
|
|
{
|
2018-01-21 03:01:26 +00:00
|
|
|
mos6502_modify_status(cpu, MOS_NZ, cpu->Y, oper);
|
2017-12-02 19:05:53 +00:00
|
|
|
cpu->Y = oper;
|
|
|
|
}
|
|
|
|
|
2017-12-07 00:01:13 +00:00
|
|
|
/*
|
|
|
|
* This instruction will "push" the A register onto the stack.
|
|
|
|
*/
|
2017-12-02 19:05:53 +00:00
|
|
|
DEFINE_INST(pha)
|
|
|
|
{
|
|
|
|
mos6502_push_stack(cpu, cpu->A);
|
|
|
|
}
|
|
|
|
|
2017-12-07 00:01:13 +00:00
|
|
|
/*
|
|
|
|
* Similar to above, but will push the P register.
|
|
|
|
*/
|
2017-12-02 19:05:53 +00:00
|
|
|
DEFINE_INST(php)
|
|
|
|
{
|
|
|
|
mos6502_push_stack(cpu, cpu->P);
|
|
|
|
}
|
|
|
|
|
2017-12-07 00:01:13 +00:00
|
|
|
/*
|
|
|
|
* Here we pop the stack (or "pull" it), and assign to the accumulator.
|
|
|
|
*/
|
2017-12-02 19:05:53 +00:00
|
|
|
DEFINE_INST(pla)
|
|
|
|
{
|
2018-01-21 03:01:26 +00:00
|
|
|
SET_RESULT(mos6502_pop_stack(cpu));
|
|
|
|
|
|
|
|
mos6502_modify_status(cpu, MOS_NZ, cpu->A, result);
|
|
|
|
cpu->A = result;
|
2017-12-02 19:05:53 +00:00
|
|
|
}
|
|
|
|
|
2017-12-07 00:01:13 +00:00
|
|
|
/*
|
|
|
|
* Again we pop from the stack, but assign to the P register.
|
|
|
|
*/
|
2017-12-02 19:05:53 +00:00
|
|
|
DEFINE_INST(plp)
|
|
|
|
{
|
|
|
|
cpu->P = mos6502_pop_stack(cpu);
|
|
|
|
}
|
|
|
|
|
2017-12-07 00:01:13 +00:00
|
|
|
/*
|
|
|
|
* The STA instruction assigns the value of the accumulator to a given
|
|
|
|
* address in memory. (That is to say, it "stores" it.)
|
|
|
|
*/
|
2017-12-02 19:05:53 +00:00
|
|
|
DEFINE_INST(sta)
|
|
|
|
{
|
2018-01-12 19:57:48 +00:00
|
|
|
mos6502_set(cpu, cpu->eff_addr, cpu->A);
|
2017-12-02 19:05:53 +00:00
|
|
|
}
|
|
|
|
|
2017-12-07 00:01:13 +00:00
|
|
|
/*
|
|
|
|
* Similar to STA, but drawing from the X register.
|
|
|
|
*/
|
2017-12-02 19:05:53 +00:00
|
|
|
DEFINE_INST(stx)
|
|
|
|
{
|
2018-01-12 19:57:48 +00:00
|
|
|
mos6502_set(cpu, cpu->eff_addr, cpu->X);
|
2017-12-02 19:05:53 +00:00
|
|
|
}
|
|
|
|
|
2017-12-07 00:01:13 +00:00
|
|
|
/*
|
|
|
|
* And, again, similar to STA, but with the Y register.
|
|
|
|
*/
|
2017-12-02 19:05:53 +00:00
|
|
|
DEFINE_INST(sty)
|
|
|
|
{
|
2018-01-12 19:57:48 +00:00
|
|
|
mos6502_set(cpu, cpu->eff_addr, cpu->Y);
|
2017-12-02 19:05:53 +00:00
|
|
|
}
|
|
|
|
|
2017-12-07 00:01:13 +00:00
|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*/
|
2017-12-02 19:05:53 +00:00
|
|
|
DEFINE_INST(tax)
|
|
|
|
{
|
2018-01-21 03:01:26 +00:00
|
|
|
mos6502_modify_status(cpu, MOS_NZ, cpu->X, cpu->A);
|
2017-12-02 19:05:53 +00:00
|
|
|
cpu->X = cpu->A;
|
|
|
|
}
|
|
|
|
|
2017-12-07 00:01:13 +00:00
|
|
|
/*
|
|
|
|
* This transfers from A to Y.
|
|
|
|
*/
|
2017-12-02 19:05:53 +00:00
|
|
|
DEFINE_INST(tay)
|
|
|
|
{
|
2018-01-21 03:01:26 +00:00
|
|
|
mos6502_modify_status(cpu, MOS_NZ, cpu->Y, cpu->A);
|
2017-12-02 19:05:53 +00:00
|
|
|
cpu->Y = cpu->A;
|
|
|
|
}
|
|
|
|
|
2017-12-07 00:01:13 +00:00
|
|
|
/*
|
|
|
|
* Transfer the stack pointer (S register) to X.
|
|
|
|
*/
|
2017-12-02 19:05:53 +00:00
|
|
|
DEFINE_INST(tsx)
|
|
|
|
{
|
2018-01-21 03:01:26 +00:00
|
|
|
mos6502_modify_status(cpu, MOS_NZ, cpu->X, cpu->S);
|
2017-12-02 19:05:53 +00:00
|
|
|
cpu->X = cpu->S;
|
|
|
|
}
|
|
|
|
|
2017-12-07 00:01:13 +00:00
|
|
|
/*
|
|
|
|
* Transfer the X register to A.
|
|
|
|
*/
|
2017-12-02 19:05:53 +00:00
|
|
|
DEFINE_INST(txa)
|
|
|
|
{
|
2018-01-21 03:01:26 +00:00
|
|
|
mos6502_modify_status(cpu, MOS_NZ, cpu->A, cpu->X);
|
2017-12-02 19:05:53 +00:00
|
|
|
cpu->A = cpu->X;
|
|
|
|
}
|
|
|
|
|
2017-12-07 00:01:13 +00:00
|
|
|
/*
|
|
|
|
* Transfer the X register to S.
|
|
|
|
*/
|
2017-12-02 19:05:53 +00:00
|
|
|
DEFINE_INST(txs)
|
|
|
|
{
|
2018-01-21 03:01:26 +00:00
|
|
|
mos6502_modify_status(cpu, MOS_NZ, cpu->S, cpu->X);
|
2017-12-02 19:05:53 +00:00
|
|
|
cpu->S = cpu->X;
|
|
|
|
}
|
|
|
|
|
2017-12-07 00:01:13 +00:00
|
|
|
/*
|
|
|
|
* Transfer the Y register to A.
|
|
|
|
*/
|
2017-12-02 19:05:53 +00:00
|
|
|
DEFINE_INST(tya)
|
|
|
|
{
|
2018-01-21 03:01:26 +00:00
|
|
|
mos6502_modify_status(cpu, MOS_NZ, cpu->A, cpu->Y);
|
2017-12-02 19:05:53 +00:00
|
|
|
cpu->A = cpu->Y;
|
|
|
|
}
|