Files

148 lines
6.5 KiB
C
Raw Permalink Normal View History

#ifndef TEST_HELPERS_H
#define TEST_HELPERS_H
#include "chip8.h"
static inline void write_opcode_to_memory(chip_eight_t *chip, uint16_t opcode) {
chip->memory[chip->pc] = (opcode >> 8) & 0xFF;
chip->memory[chip->pc + 1] = opcode & 0xFF;
}
static inline void write_clear_screen_instruction(chip_eight_t *chip) {
write_opcode_to_memory(chip, OPCODE_GROUP_SYS_OR_RET | OPCODE_CLS);
}
static inline void write_return_instruction(chip_eight_t *chip) {
write_opcode_to_memory(chip, OPCODE_GROUP_SYS_OR_RET | OPCODE_RET);
}
static inline void write_jump_instruction(chip_eight_t *chip, uint16_t addr) {
write_opcode_to_memory(chip, OPCODE_GROUP_JUMP | (addr & 0x0FFF));
}
static inline void write_call_instruction(chip_eight_t *chip, uint16_t addr) {
write_opcode_to_memory(chip, OPCODE_GROUP_CALL | (addr & 0x0FFF));
}
static inline void write_skip_if_register_equal_value_instruction(chip_eight_t *chip, uint8_t x, uint8_t val) {
write_opcode_to_memory(chip, OPCODE_GROUP_SE_VX_BYTE | ((x & 0x0F) << 8) | val);
}
static inline void write_skip_if_register_not_equal_value_instruction(chip_eight_t *chip, uint8_t x, uint8_t val) {
write_opcode_to_memory(chip, OPCODE_GROUP_SNE_VX_BYTE | ((x & 0x0F) << 8) | val);
}
static inline void write_skip_if_registers_equal_instruction(chip_eight_t *chip, uint8_t x, uint8_t y) {
write_opcode_to_memory(chip, OPCODE_GROUP_SE_VX_VY | ((x & 0x0F) << 8) | ((y & 0x0F) << 4));
}
static inline void write_skip_if_registers_not_equal_instruction(chip_eight_t *chip, uint8_t x, uint8_t y) {
write_opcode_to_memory(chip, OPCODE_GROUP_SNE_VX_VY | ((x & 0x0F) << 8) | ((y & 0x0F) << 4));
}
static inline void write_set_register_value_instruction(chip_eight_t *chip, uint8_t x, uint8_t val) {
write_opcode_to_memory(chip, OPCODE_GROUP_LD_VX_BYTE | ((x & 0x0F) << 8) | val);
}
static inline void write_add_value_to_register_instruction(chip_eight_t *chip, uint8_t x, uint8_t val) {
write_opcode_to_memory(chip, OPCODE_GROUP_ADD_VX_BYTE | ((x & 0x0F) << 8) | val);
}
static inline void write_copy_register_instruction(chip_eight_t *chip, uint8_t x, uint8_t y) {
write_opcode_to_memory(chip, OPCODE_GROUP_ARITHMETIC | ((x & 0x0F) << 8) | ((y & 0x0F) << 4) | SUB_OP_LD);
}
static inline void write_or_registers_instruction(chip_eight_t *chip, uint8_t x, uint8_t y) {
write_opcode_to_memory(chip, OPCODE_GROUP_ARITHMETIC | ((x & 0x0F) << 8) | ((y & 0x0F) << 4) | SUB_OP_OR);
}
static inline void write_and_registers_instruction(chip_eight_t *chip, uint8_t x, uint8_t y) {
write_opcode_to_memory(chip, OPCODE_GROUP_ARITHMETIC | ((x & 0x0F) << 8) | ((y & 0x0F) << 4) | SUB_OP_AND);
}
static inline void write_xor_registers_instruction(chip_eight_t *chip, uint8_t x, uint8_t y) {
write_opcode_to_memory(chip, OPCODE_GROUP_ARITHMETIC | ((x & 0x0F) << 8) | ((y & 0x0F) << 4) | SUB_OP_XOR);
}
static inline void write_add_registers_instruction(chip_eight_t *chip, uint8_t x, uint8_t y) {
write_opcode_to_memory(chip, OPCODE_GROUP_ARITHMETIC | ((x & 0x0F) << 8) | ((y & 0x0F) << 4) | SUB_OP_ADD);
}
static inline void write_subtract_registers_instruction(chip_eight_t *chip, uint8_t x, uint8_t y) {
write_opcode_to_memory(chip, OPCODE_GROUP_ARITHMETIC | ((x & 0x0F) << 8) | ((y & 0x0F) << 4) | SUB_OP_SUB);
}
static inline void write_shift_right_register_instruction(chip_eight_t *chip, uint8_t x, uint8_t y) {
write_opcode_to_memory(chip, OPCODE_GROUP_ARITHMETIC | ((x & 0x0F) << 8) | ((y & 0x0F) << 4) | SUB_OP_SHR);
}
static inline void write_subtract_registers_reverse_instruction(chip_eight_t *chip, uint8_t x, uint8_t y) {
write_opcode_to_memory(chip, OPCODE_GROUP_ARITHMETIC | ((x & 0x0F) << 8) | ((y & 0x0F) << 4) | SUB_OP_SUBN);
}
static inline void write_shift_left_register_instruction(chip_eight_t *chip, uint8_t x, uint8_t y) {
write_opcode_to_memory(chip, OPCODE_GROUP_ARITHMETIC | ((x & 0x0F) << 8) | ((y & 0x0F) << 4) | SUB_OP_SHL);
}
static inline void write_set_index_register_instruction(chip_eight_t *chip, uint16_t addr) {
write_opcode_to_memory(chip, OPCODE_GROUP_LD_I_ADDR | (addr & 0x0FFF));
}
static inline void write_jump_with_offset_instruction(chip_eight_t *chip, uint16_t addr) {
write_opcode_to_memory(chip, OPCODE_GROUP_JP_V0_ADDR | (addr & 0x0FFF));
}
static inline void write_random_byte_instruction(chip_eight_t *chip, uint8_t x, uint8_t mask) {
write_opcode_to_memory(chip, OPCODE_GROUP_RND_VX_BYTE | ((x & 0x0F) << 8) | mask);
}
static inline void write_draw_sprite_instruction(chip_eight_t *chip, uint8_t x, uint8_t y, uint8_t height) {
write_opcode_to_memory(chip, OPCODE_GROUP_DRW_VX_VY_N | ((x & 0x0F) << 8) | ((y & 0x0F) << 4) | (height & 0x0F));
}
static inline void write_skip_if_key_pressed_instruction(chip_eight_t *chip, uint8_t x) {
write_opcode_to_memory(chip, OPCODE_GROUP_KEY_SKIP | ((x & 0x0F) << 8) | OPCODE_SKP);
}
static inline void write_skip_if_key_not_pressed_instruction(chip_eight_t *chip, uint8_t x) {
write_opcode_to_memory(chip, OPCODE_GROUP_KEY_SKIP | ((x & 0x0F) << 8) | OPCODE_SKNP);
}
static inline void write_get_delay_timer_instruction(chip_eight_t *chip, uint8_t x) {
write_opcode_to_memory(chip, OPCODE_GROUP_MISC | ((x & 0x0F) << 8) | SUB_OP_LD_VX_DT);
}
static inline void write_wait_for_key_instruction(chip_eight_t *chip, uint8_t x) {
write_opcode_to_memory(chip, OPCODE_GROUP_MISC | ((x & 0x0F) << 8) | SUB_OP_LD_VX_K);
}
static inline void write_set_delay_timer_instruction(chip_eight_t *chip, uint8_t x) {
write_opcode_to_memory(chip, OPCODE_GROUP_MISC | ((x & 0x0F) << 8) | SUB_OP_LD_DT_VX);
}
static inline void write_set_sound_timer_instruction(chip_eight_t *chip, uint8_t x) {
write_opcode_to_memory(chip, OPCODE_GROUP_MISC | ((x & 0x0F) << 8) | SUB_OP_LD_ST_VX);
}
static inline void write_add_register_to_index_instruction(chip_eight_t *chip, uint8_t x) {
write_opcode_to_memory(chip, OPCODE_GROUP_MISC | ((x & 0x0F) << 8) | SUB_OP_ADD_I_VX);
}
static inline void write_set_index_to_font_character_instruction(chip_eight_t *chip, uint8_t x) {
write_opcode_to_memory(chip, OPCODE_GROUP_MISC | ((x & 0x0F) << 8) | SUB_OP_LD_F_VX);
}
static inline void write_store_bcd_representation_instruction(chip_eight_t *chip, uint8_t x) {
write_opcode_to_memory(chip, OPCODE_GROUP_MISC | ((x & 0x0F) << 8) | SUB_OP_LD_B_VX);
}
static inline void write_dump_registers_to_memory_instruction(chip_eight_t *chip, uint8_t x) {
write_opcode_to_memory(chip, OPCODE_GROUP_MISC | ((x & 0x0F) << 8) | SUB_OP_LD_I_REG);
}
static inline void write_load_registers_from_memory_instruction(chip_eight_t *chip, uint8_t x) {
write_opcode_to_memory(chip, OPCODE_GROUP_MISC | ((x & 0x0F) << 8) | SUB_OP_LD_REG_I);
}
#endif