diff --git a/src/6502.c b/src/6502.c index 53b9308..4fd3abe 100644 --- a/src/6502.c +++ b/src/6502.c @@ -100,7 +100,6 @@ void execute() case TXA: return txa(); case TXS: return txs(); case TYA: return tya(); - case XXX: return xxx(); } switch (opcode_in_table) @@ -128,7 +127,6 @@ void execute() case STA: return sta(); case STX: return stx(); case STY: return sty(); - case XXX: return xxx(); } } diff --git a/src/inc/opcodes.h b/src/inc/opcodes.h index b260a00..5caac7e 100644 --- a/src/inc/opcodes.h +++ b/src/inc/opcodes.h @@ -53,7 +53,6 @@ typedef enum address_mode am; am address_mode; -void xxx(); // invalid opcode void adc(); // add memory to accumalator with carry void and(); // and memory with accumulator void asl(); // shift left one bit (memory on accumulator) diff --git a/src/opcodes.c b/src/opcodes.c index afd6bbd..c81321b 100644 --- a/src/opcodes.c +++ b/src/opcodes.c @@ -1,43 +1,70 @@ #include "inc/opcodes.h" #include "inc/memory.h" -db fetch_operand() -{ - db operand; +dw address; +db operand; +void fetch_operand() +{ switch (address_mode) { case immediate: - operand = read_byte(pc); + address = pc; + operand = read_byte(address); pc = pc + 1; break; case zero_page: - operand = read_byte(pc); - operand = read_byte(operand); + address = read_byte(pc); + operand = read_byte(address); pc = pc + 1; break; case zero_page_x: - operand = read_byte(pc); - operand = read_byte(operand + x); + address = read_byte(pc); + address = address + x; + operand = read_byte(address); pc = pc + 1; break; case zero_page_y: - operand = read_byte(pc); - operand = read_byte(operand + y); + address = read_byte(pc); + address = address + y; + operand = read_byte(address); pc = pc + 1; break; case accumulator: + address = pc; operand = ac; break; + case absolute: + address = read_word(pc) + operand = read_byte(address); + pc = pc + 2; + case absolute_x: + address = read_word(pc); + address = address + x; + operand = read_byte(address); + pc = pc + 2; + break; + case absolute_y: + address = read_word(pc); + address = address + y; + operand = read_byte(address); + pc = pc + 2; + break; + case indirect_x: + address = read_byte(pc); + address = address + x; + address = read_word(address); + operand = read_byte(address); + pc = pc + 1; + break; + case indirect_y: + address = read_byte(pc); + address = read_word(address); + address = address + y; + operand = read_byte(address); + pc = pc + 1; + break; } - - return operand; -} - -void xxx() -{ - // invalid opcode - return nop(); } void adc()