#include <cpu_prog_model.h>
#include <cpu6502_addrm.h>


#define FALSE  0
#define TRUE   1


void BRK( code)
PM *code;
{
   code->Br = TRUE;

   code->Me [stack_address( code)] = (code->PC + 1) >> 8;
   (code->SP)--;
   code->Me [stack_address( code)] = (code->PC + 1) & 0xFF;
   (code->SP)--;
   code->Me [stack_address( code)] = code->Ne << 6 |
                                     code->Ov << 5 |
                                     code->Br << 4 |
                                     code->De << 3 |
                                     code->In << 2 |
                                     code->Ze << 1 |
                                     code->Ca ;
   (code->SP)--;
   code->PC = code->Me [0xFFFE] | code->Me [0xFFFF] << 8;
}

void JSR( code)
PM *code;
{
   unsigned short int  address;
   short               dummy;

   address = abs_address( code);
   (code->PC)--;

   code->Me [stack_address( code)] = code->PC >> 8;
   (code->SP)--;
   code->Me [stack_address( code)] = (code->PC) & 0xFF;
   (code->SP)--;

   code->PC = address;
   mem_check( address, &dummy, code, Func_JSR);
}

void PHA( code)
PM *code;
{
   code->Me [stack_address( code)] = code->Ac;
   (code->SP)--;
}

void PHP( code)
PM *code;
{
   code->Me [stack_address( code)] = code->Ne << 6 |
                                     code->Ov << 5 |
                                     code->Br << 4 |
                                     code->De << 3 |
                                     code->In << 2 |
                                     code->Ze << 1 | code->Ca;
   (code->SP)--;
}

void PLA( code)
PM *code;
{
   (code->SP)++;
   code->Ac = code->Me [stack_address( code)];
   set_neg_zero_stat( code, code->Ac);
}

void PLP( code)
PM *code;
{
   short temp_value;

   (code->SP)++;
   temp_value = code->Me [stack_address( code)];

   code->Ca = temp_value & 0x1;
   code->Ze = (temp_value >> 1) & 0x1;
   code->In = (temp_value >> 2) & 0x1;
   code->De = (temp_value >> 3) & 0x1;
   code->Br = (temp_value >> 4) & 0x1;
   code->Ov = (temp_value >> 5) & 0x1;
   code->Ne = (temp_value >> 6) & 0x1;
}

void RTS( code)
PM *code;
{
   short  dummy;

   (code->SP)++;
   code->PC = code->Me [stack_address( code)]     |
              code->Me [stack_address( code) + 1] << 8;
   (code->SP)++;
   (code->PC)++;

   mem_check( code->PC, &dummy, code, Func_JMP);
}


