Skip to content

Commit

Permalink
ROR opcode
Browse files Browse the repository at this point in the history
  • Loading branch information
Shachar committed Sep 12, 2023
1 parent 65c3853 commit a42171b
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 1 deletion.
31 changes: 30 additions & 1 deletion c6502.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ void c6502::handleInstruction() {
case 0x3a: op_decA( addrmode_implicit() ); break;
case 0x3c: op_bit( addrmode_abs_x() ); break;
case 0x3d: op_and( addrmode_abs_x() ); break;
case 0x3e: op_rol( addrmode_abs_x() ); break;
case 0x3e: op_rol( addrmode_abs_x(true) ); break;
case 0x40: op_rti( addrmode_stack() ); break;
case 0x41: op_eor( addrmode_zp_x_ind() ); break;
case 0x45: op_eor( addrmode_zp() ); break;
Expand All @@ -107,16 +107,21 @@ void c6502::handleInstruction() {
case 0x60: op_rts( addrmode_stack() ); break;
case 0x61: op_adc( addrmode_zp_x_ind() ); break;
case 0x65: op_adc( addrmode_zp() ); break;
case 0x66: op_ror( addrmode_zp() ); break;
case 0x68: op_pla( addrmode_stack() ); break;
case 0x69: op_adc( addrmode_immediate() ); break;
case 0x6a: op_rorA(); break;
case 0x6c: op_jmp( addrmode_abs_ind() ); break;
case 0x6d: op_adc( addrmode_abs() ); break;
case 0x6e: op_ror( addrmode_abs() ); break;
case 0x70: op_bvs( addrmode_immediate() ); break;
case 0x71: op_adc( addrmode_zp_ind_y() ); break;
case 0x75: op_adc( addrmode_zp_x() ); break;
case 0x76: op_ror( addrmode_zp_x() ); break;
case 0x78: op_sei( addrmode_implicit() ); break;
case 0x79: op_adc( addrmode_abs_y() ); break;
case 0x7d: op_adc( addrmode_abs_x() ); break;
case 0x7e: op_ror( addrmode_abs_x(true) ); break;
case 0x85: op_sta( addrmode_zp() ); break;
case 0x88: op_dey( addrmode_implicit() ); break;
case 0x89: op_bit( addrmode_immediate() ); break;
Expand Down Expand Up @@ -725,6 +730,30 @@ void c6502::op_rolA() {
updateNZ( regA );
}

void c6502::op_ror(Addr addr) {
uint8_t value = read( addr );
write( addr, value );

bool newC = value & 0x01;
value >>= 1;
value |= ccGet( CC::Carry ) ? 0x80 : 0x00;
ccSet( CC::Carry, newC );
updateNZ( value );

write( addr, value );
}

void c6502::op_rorA() {
read( pc() );

bool newC = regA & 0x01;
regA >>= 1;
regA |= ccGet( CC::Carry ) ? 0x80 : 0x00;
ccSet( CC::Carry, newC );
updateNZ( regA );

}

void c6502::op_rti(Addr addr) {
read( addr );
regSp++;
Expand Down
2 changes: 2 additions & 0 deletions c6502.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,8 @@ class c6502 {
void op_plp(Addr addr);
void op_rol(Addr addr);
void op_rolA();
void op_ror(Addr addr);
void op_rorA();
void op_rti(Addr addr);
void op_rts(Addr addr);
void op_sbc(Addr addr);
Expand Down

0 comments on commit a42171b

Please sign in to comment.