uint32_t part_register_get (urj_chain_t *chain, int n, enum core_regnum reg) { urj_part_t *part; urj_tap_register_t *r; uint32_t r0 = 0; if (DREG_P (reg) || PREG_P (reg)) part_emuir_set (chain, n, gen_move (REG_EMUDAT, reg), URJ_CHAIN_EXITMODE_IDLE); else { r0 = part_register_get (chain, n, REG_R0); part_scan_select (chain, n, DBGCTL_SCAN); part_dbgctl_bit_set_emuirlpsz_2 (chain, n); urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE); part_emuir_set_2 (chain, n, gen_move (REG_R0, reg), gen_move (REG_EMUDAT, REG_R0), URJ_CHAIN_EXITMODE_IDLE); part_scan_select (chain, n, DBGCTL_SCAN); part_dbgctl_bit_clear_emuirlpsz_2 (chain, n); urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE); } part_scan_select (chain, n, EMUDAT_SCAN); urj_tap_chain_shift_data_registers_mode (chain, 1, 1, URJ_CHAIN_EXITMODE_UPDATE); part = chain->parts->parts[n]; r = part->active_instruction->data_register->out; if (!DREG_P (reg) && !PREG_P (reg)) part_register_set (chain, n, REG_R0, r0); return emudat_value (r); }
uint32_t part_mmr_read_clobber_r0 (urj_chain_t *chain, int n, int32_t offset, int size) { uint32_t value; assert (size == 2 || size == 4); if (offset == 0) { part_scan_select (chain, n, DBGCTL_SCAN); part_dbgctl_bit_set_emuirlpsz_2 (chain, n); urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE); if (size == 2) part_emuir_set_2 (chain, n, gen_load16z (REG_R0, REG_P0), gen_move (REG_EMUDAT, REG_R0), URJ_CHAIN_EXITMODE_UPDATE); else part_emuir_set_2 (chain, n, gen_load32 (REG_R0, REG_P0), gen_move (REG_EMUDAT, REG_R0), URJ_CHAIN_EXITMODE_UPDATE); } else { if (size == 2) part_emuir_set (chain, n, gen_load16z_offset (REG_R0, REG_P0, offset), URJ_CHAIN_EXITMODE_IDLE); else part_emuir_set (chain, n, gen_load32_offset (REG_R0, REG_P0, offset), URJ_CHAIN_EXITMODE_IDLE); part_emuir_set (chain, n, gen_move (REG_EMUDAT, REG_R0), URJ_CHAIN_EXITMODE_UPDATE); } value = part_emudat_get (chain, n, URJ_CHAIN_EXITMODE_IDLE); if (offset == 0) { part_scan_select (chain, n, DBGCTL_SCAN); part_dbgctl_bit_clear_emuirlpsz_2 (chain, n); urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE); } return value; }
void part_mmr_write_clobber_r0 (urj_chain_t *chain, int n, int32_t offset, uint32_t data, int size) { assert (size == 2 || size == 4); part_emudat_set (chain, n, data, URJ_CHAIN_EXITMODE_UPDATE); if (offset == 0) { part_scan_select (chain, n, DBGCTL_SCAN); part_dbgctl_bit_set_emuirlpsz_2 (chain, n); urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE); if (size == 2) part_emuir_set_2 (chain, n, gen_move (REG_R0, REG_EMUDAT), gen_store16 (REG_P0, REG_R0), URJ_CHAIN_EXITMODE_IDLE); else part_emuir_set_2 (chain, n, gen_move (REG_R0, REG_EMUDAT), gen_store32 (REG_P0, REG_R0), URJ_CHAIN_EXITMODE_IDLE); } else { part_emuir_set (chain, n, gen_move (REG_R0, REG_EMUDAT), URJ_CHAIN_EXITMODE_IDLE); if (size == 2) part_emuir_set (chain, n, gen_store16_offset (REG_P0, offset, REG_R0), URJ_CHAIN_EXITMODE_IDLE); else part_emuir_set (chain, n, gen_store32_offset (REG_P0, offset, REG_R0), URJ_CHAIN_EXITMODE_IDLE); } if (offset == 0) { part_scan_select (chain, n, DBGCTL_SCAN); part_dbgctl_bit_clear_emuirlpsz_2 (chain, n); urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE); } }
void part_register_set (urj_chain_t *chain, int n, enum core_regnum reg, uint32_t value) { urj_part_t *part; urj_tap_register_t *r; uint32_t r0 = 0; if (!DREG_P (reg) && !PREG_P (reg)) r0 = part_register_get (chain, n, REG_R0); part_scan_select (chain, n, EMUDAT_SCAN); part = chain->parts->parts[n]; r = part->active_instruction->data_register->in; BFIN_PART_EMUDAT_IN (part) = value; emudat_init_value (r, value); urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE); if (DREG_P (reg) || PREG_P (reg)) part_emuir_set (chain, n, gen_move (reg, REG_EMUDAT), URJ_CHAIN_EXITMODE_IDLE); else { part_scan_select (chain, n, DBGCTL_SCAN); part_dbgctl_bit_set_emuirlpsz_2 (chain, n); urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE); part_emuir_set_2 (chain, n, gen_move (REG_R0, REG_EMUDAT), gen_move (reg, REG_R0), URJ_CHAIN_EXITMODE_IDLE); part_scan_select (chain, n, DBGCTL_SCAN); part_dbgctl_bit_clear_emuirlpsz_2 (chain, n); urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE); part_register_set (chain, n, REG_R0, r0); } }
int main() { initialize(); int tests = 1000; int passed = 0; fast_srandom(time(0)); for (int i = 0; i < tests; i++) { board_t *b = new board_t; int size = fast_random(max_size - 4) + 5; empty_board(b, size); int steps = 0; bool failed = false; while (true) { stone_t color = steps % 2 == 0 ? STONE_BLACK : STONE_WHITE; index_t pos = gen_move(b, color); if (pos < 0) break; if (!is_legal_move(b, pos, color)) { failed = true; break; } if (pos >= 0) { put_stone(b, pos, color); if (!check_board(b)) { failed = true; break; } } steps++; } delete b; if (failed) { printf("[F]"); } else { printf("[%d]", steps); passed++; } } printf("\n"); printf("Passed %d out of %d random tests\n", passed, tests); return passed == tests ? 0 : 1; }