git.haldean.org x6502 / master opcode_handlers / shift.h
master

Tree @master (Download .tar.gz)

shift.h @masterraw · history · blame

case ASL_AB:
    arg1 = NEXT_BYTE(m);
    r1 = mem_abs(arg1, NEXT_BYTE(m), 0);
    set_flag(m, FLAG_CARRY, m->mem[r1] & 0x80);
    m->mem[r1] = (m->mem[r1] << 1) & 0xFE;
    set_flags(m, m->mem[r1]);
    mark_dirty(m, r1);
    break;

case ASL_ABX:
    arg1 = NEXT_BYTE(m);
    r1 = mem_abs(arg1, NEXT_BYTE(m), m->x);
    set_flag(m, FLAG_CARRY, m->mem[r1] & 0x80);
    m->mem[r1] = (m->mem[r1] << 1) & 0xFE;
    set_flags(m, m->mem[r1]);
    mark_dirty(m, r1);
    break;

case ASL_ACC:
    set_flag(m, FLAG_CARRY, m->ac & 0x80);
    m->ac = (m->ac << 1) & 0xFE;
    set_flags(m, m->ac);
    break;

case ASL_ZP:
    arg1 = NEXT_BYTE(m);
    set_flag(m, FLAG_CARRY, m->mem[arg1] & 0x80);
    m->mem[arg1] = (m->mem[arg1] << 1) & 0xFE;
    set_flags(m, m->mem[arg1]);
    mark_dirty(m, arg1);
    break;

case ASL_ZPX:
    arg1 = ZP(NEXT_BYTE(m) + m->x);
    set_flag(m, FLAG_CARRY, m->mem[arg1] & 0x80);
    m->mem[arg1] = (m->mem[arg1] << 1) & 0xFE;
    set_flags(m, m->mem[arg1]);
    mark_dirty(m, arg1);
    break;

case LSR_AB:
    arg1 = NEXT_BYTE(m);
    r1 = mem_abs(arg1, NEXT_BYTE(m), 0);
    set_flag(m, FLAG_CARRY, m->mem[r1] & 0x01);
    m->mem[r1] = (m->mem[r1] >> 1) & 0x7F;
    set_flags(m, m->mem[r1]);
    mark_dirty(m, r1);
    break;

case LSR_ABX:
    arg1 = NEXT_BYTE(m);
    r1 = mem_abs(arg1, NEXT_BYTE(m), m->x);
    set_flag(m, FLAG_CARRY, m->mem[r1] & 0x01);
    m->mem[r1] = (m->mem[r1] >> 1) & 0x7F;
    set_flags(m, m->mem[r1]);
    mark_dirty(m, r1);
    break;

case LSR_ACC:
    set_flag(m, FLAG_CARRY, m->ac & 0x01);
    m->ac = (m->ac >> 1) & 0x7F;
    set_flags(m, m->ac);
    break;

case LSR_ZP:
    arg1 = NEXT_BYTE(m);
    set_flag(m, FLAG_CARRY, m->mem[arg1] & 0x01);
    m->mem[arg1] = (m->mem[arg1] >> 1) & 0x7F;
    set_flags(m, m->mem[arg1]);
    mark_dirty(m, arg1);
    break;

case LSR_ZPX:
    arg1 = ZP(NEXT_BYTE(m) + m->x);
    set_flag(m, FLAG_CARRY, m->mem[arg1] & 0x01);
    m->mem[arg1] = (m->mem[arg1] >> 1) & 0x7F;
    set_flags(m, m->mem[arg1]);
    mark_dirty(m, arg1);
    break;

case ROL_AB:
    arg1 = NEXT_BYTE(m);
    r1 = mem_abs(arg1, NEXT_BYTE(m), 0);
    t1 = m->mem[r1] & 0x80;
    m->mem[r1] = ((m->mem[r1] << 1) & 0xFE) | get_flag(m, FLAG_CARRY);
    set_flag(m, FLAG_CARRY, t1);
    set_flags(m, m->mem[r1]);
    mark_dirty(m, r1);
    break;

case ROL_ABX:
    arg1 = NEXT_BYTE(m);
    r1 = mem_abs(arg1, NEXT_BYTE(m), m->x);
    t1 = m->mem[r1] & 0x80;
    m->mem[r1] = ((m->mem[r1] << 1) & 0xFE) | get_flag(m, FLAG_CARRY);
    set_flag(m, FLAG_CARRY, t1);
    set_flags(m, m->mem[r1]);
    mark_dirty(m, r1);
    break;

case ROL_ACC:
    t1 = m->ac & 0x80;
    m->ac = ((m->ac << 1) & 0xFE) | get_flag(m, FLAG_CARRY);
    set_flag(m, FLAG_CARRY, t1);
    set_flags(m, m->ac);
    break;

case ROL_ZP:
    arg1 = NEXT_BYTE(m);
    t1 = m->mem[arg1] & 0x80;
    m->mem[arg1] = ((m->mem[arg1] << 1) & 0xFE) | get_flag(m, FLAG_CARRY);
    set_flag(m, FLAG_CARRY, t1);
    set_flags(m, m->mem[arg1]);
    mark_dirty(m, arg1);
    break;

case ROL_ZPX:
    arg1 = ZP(NEXT_BYTE(m) + m->x);
    t1 = m->mem[arg1] & 0x80;
    m->mem[arg1] = ((m->mem[arg1] << 1) & 0xFE) | get_flag(m, FLAG_CARRY);
    set_flag(m, FLAG_CARRY, t1);
    set_flags(m, m->mem[arg1]);
    mark_dirty(m, arg1);
    break;

case ROR_AB:
    arg1 = NEXT_BYTE(m);
    r1 = mem_abs(arg1, NEXT_BYTE(m), 0);
    t1 = m->mem[r1] & 0x01;
    m->mem[r1] = ((m->mem[r1] >> 1) & 0x7F) | (get_flag(m, FLAG_CARRY) << 7);
    set_flag(m, FLAG_CARRY, t1);
    set_flags(m, m->mem[r1]);
    mark_dirty(m, r1);
    break;

case ROR_ABX:
    arg1 = NEXT_BYTE(m);
    r1 = mem_abs(arg1, NEXT_BYTE(m), m->x);
    t1 = m->mem[r1] & 0x01;
    m->mem[r1] = ((m->mem[r1] >> 1) & 0x7F) | (get_flag(m, FLAG_CARRY) << 7);
    set_flag(m, FLAG_CARRY, t1);
    set_flags(m, m->mem[r1]);
    mark_dirty(m, r1);
    break;

case ROR_ACC:
    t1 = m->ac & 0x01;
    m->ac = ((m->ac >> 1) & 0x7F) | (get_flag(m, FLAG_CARRY) << 7);
    set_flag(m, FLAG_CARRY, t1);
    set_flags(m, m->ac);
    break;

case ROR_ZP:
    arg1 = NEXT_BYTE(m);
    t1 = m->mem[arg1] & 0x01;
    m->mem[arg1] = ((m->mem[arg1] >> 1) & 0x7F) | (get_flag(m, FLAG_CARRY) << 7);
    set_flag(m, FLAG_CARRY, t1);
    set_flags(m, m->mem[arg1]);
    mark_dirty(m, arg1);
    break;

case ROR_ZPX:
    arg1 = ZP(NEXT_BYTE(m) + m->x);
    t1 = m->mem[arg1] & 0x01;
    m->mem[arg1] = ((m->mem[arg1] >> 1) & 0x7F) | (get_flag(m, FLAG_CARRY) << 7);
    set_flag(m, FLAG_CARRY, t1);
    set_flags(m, m->mem[arg1]);
    mark_dirty(m, arg1);
    break;