mirror of
https://github.com/jborza/emu6502.git
synced 2024-11-25 18:31:23 +00:00
LDA_INDX and LDA_INDY implementation + test
This commit is contained in:
parent
9dff007767
commit
d4bbfaba95
17
cpu.c
17
cpu.c
@ -75,7 +75,7 @@ word pop_word(State6502 * state) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
word get_word(State6502 * state, word address) {
|
word get_word(State6502 * state, word address) {
|
||||||
return state->memory[address] << 8 | state->memory[address + 1];
|
return state->memory[address] | state->memory[address + 1] << 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
int emulate_6502_op(State6502 * state) {
|
int emulate_6502_op(State6502 * state) {
|
||||||
@ -173,9 +173,22 @@ int emulate_6502_op(State6502 * state) {
|
|||||||
}
|
}
|
||||||
case LDA_INDX:
|
case LDA_INDX:
|
||||||
{
|
{
|
||||||
|
//pre-indexed indirect
|
||||||
|
//zero-page address is added to x register
|
||||||
|
byte indirect_address = pop_byte(state) + state->x;
|
||||||
|
//pointing to address of a word holding the address of the operand
|
||||||
|
word address = get_word(state, indirect_address);
|
||||||
|
LDA(state, state->memory[address]);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
case LDA_INDY:
|
case LDA_INDY:
|
||||||
|
{
|
||||||
|
//post-indexed indirect
|
||||||
|
byte indirect_address = pop_byte(state);
|
||||||
|
word address = get_word(state, indirect_address) + state->y;
|
||||||
|
LDA(state, state->memory[address]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
unimplemented_instruction(state); break;
|
unimplemented_instruction(state); break;
|
||||||
}
|
}
|
||||||
|
96
emu6502.c
96
emu6502.c
@ -125,12 +125,100 @@ void test_LDA_ABS() {
|
|||||||
test_cleanup(&state);
|
test_cleanup(&state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_LDA_ABSX() {
|
||||||
|
//initialize
|
||||||
|
State6502 state = create_blank_state();
|
||||||
|
state.x = 0x02;
|
||||||
|
|
||||||
|
//arrange
|
||||||
|
char program[] = { LDA_ABSX, 0x01, 0x04, 0xAA }; //LDA $0401,x
|
||||||
|
memcpy(state.memory, program, sizeof(program));
|
||||||
|
state.memory[0x403] = 0xAA;
|
||||||
|
|
||||||
|
//act
|
||||||
|
test_step(&state);
|
||||||
|
|
||||||
|
//assert
|
||||||
|
assertA(&state, 0xAA);
|
||||||
|
|
||||||
|
//cleanup
|
||||||
|
test_cleanup(&state);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_LDA_ABSY() {
|
||||||
|
//initialize
|
||||||
|
State6502 state = create_blank_state();
|
||||||
|
state.y = 0x02;
|
||||||
|
|
||||||
|
//arrange
|
||||||
|
char program[] = { LDA_ABSY, 0x01, 0x04, 0xAA }; //LDA $0401,y
|
||||||
|
memcpy(state.memory, program, sizeof(program));
|
||||||
|
state.memory[0x403] = 0xAA;
|
||||||
|
|
||||||
|
//act
|
||||||
|
test_step(&state);
|
||||||
|
|
||||||
|
//assert
|
||||||
|
assertA(&state, 0xAA);
|
||||||
|
|
||||||
|
//cleanup
|
||||||
|
test_cleanup(&state);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_LDA_INDX() {
|
||||||
|
//initialize
|
||||||
|
State6502 state = create_blank_state();
|
||||||
|
state.x = 0x05;
|
||||||
|
|
||||||
|
//arrange
|
||||||
|
char program[] = { LDA_INDX, 0x3E }; //LDA ($3E, x)
|
||||||
|
memcpy(state.memory, program, sizeof(program));
|
||||||
|
state.memory[0x0043] = 0xA9;
|
||||||
|
state.memory[0x0044] = 0x04;
|
||||||
|
state.memory[0x04A9] = 0xAA;
|
||||||
|
|
||||||
|
//act
|
||||||
|
test_step(&state);
|
||||||
|
|
||||||
|
//assert
|
||||||
|
assertA(&state, 0xAA);
|
||||||
|
|
||||||
|
//cleanup
|
||||||
|
test_cleanup(&state);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_LDA_INDY() {
|
||||||
|
//initialize
|
||||||
|
State6502 state = create_blank_state();
|
||||||
|
state.y = 0x05;
|
||||||
|
|
||||||
|
//arrange
|
||||||
|
char program[] = { LDA_INDY, 0x3E, 0x04, 0xAA }; //LDA ($3E),y
|
||||||
|
memcpy(state.memory, program, sizeof(program));
|
||||||
|
state.memory[0x3E] = 0xA0; //0x04A0
|
||||||
|
state.memory[0x3F] = 0x04;
|
||||||
|
state.memory[0x04A5] = 0xAA; //address 0x04A0 + 0x05 = 0x04A5
|
||||||
|
|
||||||
|
//act
|
||||||
|
test_step(&state);
|
||||||
|
|
||||||
|
//assert
|
||||||
|
assertA(&state, 0xAA);
|
||||||
|
|
||||||
|
//cleanup
|
||||||
|
test_cleanup(&state);
|
||||||
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test_LDA_IMM();
|
//test_LDA_IMM();
|
||||||
test_LDA_ZP();
|
//test_LDA_ZP();
|
||||||
test_LDA_ZPX();
|
//test_LDA_ZPX();
|
||||||
test_LDA_ABS();
|
//test_LDA_ABS();
|
||||||
|
//test_LDA_ABSX();
|
||||||
|
//test_LDA_ABSY();
|
||||||
|
test_LDA_INDX();
|
||||||
|
test_LDA_INDY();
|
||||||
}
|
}
|
||||||
|
|
||||||
int emulate() {
|
int emulate() {
|
||||||
|
Loading…
Reference in New Issue
Block a user