Исправления набора инструкций, теперь они корректно работают с автоприведением типов от компилятора

This commit is contained in:
2022-12-04 22:13:35 +03:00
parent cea2422977
commit 3d9d4f0592
3 changed files with 156 additions and 113 deletions

View File

@@ -41,12 +41,12 @@ static void emulate_robot(robot_code &code, robot_regs& r, char robot_id) {
barrels[code.barrel_id].flags.robot = robot_id;
}
const short cmd_arg = code.code[code.PC] & (~ROBOT_CMD_MASK);
const auto cmd_arg = (short)(code.code[code.PC] & (~ROBOT_CMD_MASK));
switch (code.code[code.PC] & ROBOT_CMD_MASK) {
case ROBOT_CMD_MOVE_TO_ZONE:
switch ((short)(code.code[code.PC] & (short)ROBOT_CMD_MASK)) {
case ROBOT_CMD_MOVE_TO_ZONE_code:
// двигаемся в сторону цели
if (robot_move(r, cmd_arg & (~ROBOT_WITH_BARREL), robot_id)) {
if (robot_move(r, (short)(cmd_arg & (~ROBOT_WITH_BARREL)), robot_id)) {
code.PC++;
}
if (cmd_arg & ROBOT_WITH_BARREL && code.barrel_id >= 0) {
@@ -54,16 +54,27 @@ static void emulate_robot(robot_code &code, robot_regs& r, char robot_id) {
}
break;
case ROBOT_CMD_MOVE_OFF:
case ROBOT_CMD_MOVE_OFF_code:
if (robot_id == 1) {
robot1_offset_pos = true;
} else {
robot2_offset_pos = true;
}
std::cout << "robot " << robot_id << " move to offset pos" << std::endl;
code.PC++;
break;
case ROBOT_CMD_UP:
case ROBOT_CMD_MOVE_ACCURATE_code:
if (robot_id == 1) {
robot1_offset_pos = false;
} else {
robot2_offset_pos = false;
}
std::cout << "robot " << robot_id << " move to accurate position" << std::endl;
code.PC++;
break;
case ROBOT_CMD_UP_code:
if (code.barrel_id >= 0 && cmd_arg) {
// не давать ехать перед тем как истечет таймер
if (barrels[code.barrel_id].software_timer > 0) {
@@ -76,8 +87,7 @@ static void emulate_robot(robot_code &code, robot_regs& r, char robot_id) {
break;
// в эмуляторе не важно где я, поэтому тут обе команды вниз обрабатываются одинаково
case ROBOT_CMD_DOWN:
case ROBOT_CMD_DOWN_2:
case ROBOT_CMD_DOWN_code:
if (code.barrel_id >= 0 && cmd_arg) {
barrels[code.barrel_id].flags.is_up = false;
r.mz.is_up = 0;
@@ -85,20 +95,20 @@ static void emulate_robot(robot_code &code, robot_regs& r, char robot_id) {
code.PC++;
break;
case ROBOT_CMD_WAIT:
case ROBOT_CMD_WAIT_code:
std::cout << "robot " << robot_id << " wait " << cmd_arg << " secs..." << std::endl;
code.PC++;
break;
case ROBOT_CMD_TMR_SET:
case ROBOT_CMD_TMR_SET_code:
if (code.barrel_id >= 0) {
barrels[code.barrel_id].software_timer = code.code[code.PC + 1];
r.mz.is_up = 0;
}
code.PC += 2;
code.PC++;
break;
case ROBOT_CMD_SET_LOCK_ZONE:
case ROBOT_CMD_SET_LOCK_ZONE_code:
if (robot_id == 1) {
robot1_lock_zone = cmd_arg;
} else {
@@ -107,7 +117,7 @@ static void emulate_robot(robot_code &code, robot_regs& r, char robot_id) {
code.PC += 2;
break;
case ROBOT_CMD_CORRECT_AXIS:
case ROBOT_CMD_CORRECT_AXIS_code:
if (cmd_arg == ROBOT_AXIS_X) {
std::cout << "robot " << robot_id << " correct axis X..." << std::endl;
r.dz.current_zone = 0;
@@ -117,28 +127,36 @@ static void emulate_robot(robot_code &code, robot_regs& r, char robot_id) {
r.mz.is_up = true;
r.mz.correct_status = true;
} else {
std::cout << "ERROR: R" << robot_id << " AXIS CORRECT - INCORRECT ARGUMENT VALUE " << cmd_arg << std::endl;
std::cout << "ERROR: R" << robot_id << " AXIS CORRECT - INVALID ARGUMENT VALUE " << cmd_arg << std::endl;
}
code.PC++;
break;
case ROBOT_CMD_INC_ZONE:
case ROBOT_CMD_INC_ZONE_code:
// TODO сделать так, чтобы зоны переключались с учетом отключенных зон
if (cmd_arg == ROBOT_ZONE_ETCH) {
std::cout << "robot " << robot_id << " increment etching..." << std::endl;
etching_zone = (etching_zone + 1) & 1;
etching_zone = (short)((etching_zone + 1) & 1);
} else if (cmd_arg == ROBOT_ZONE_GAL) {
std::cout << "robot " << robot_id << " increment galvanic..." << std::endl;
galvanizing_zone = (galvanizing_zone + 1) & 0x07;
galvanizing_zone = (short)((galvanizing_zone + 1) & 0x07);
} else {
std::cout << "ERROR: R" << robot_id << " INCREMENT ZONE - INCORRECT ARGUMENT VALUE " << cmd_arg << std::endl;
std::cout << "ERROR: R" << robot_id << " INCREMENT ZONE - INVALID ARGUMENT VALUE " << cmd_arg << std::endl;
}
code.PC++;
break;
case ROBOT_CMD_END:
case ROBOT_CMD_END_code:
code.PC = -1;
// де-приватизируем бочку
if (code.barrel_id >= 0) {
barrels[code.barrel_id].flags.robot = 0;
}
break;
default:
printf("ERROR: R%d INVALID INSTRUCTION: PC=%d CODE=0x%04X\n", robot_id, code.PC, code.code[code.PC] & 0xFFFF);
code.PC = -1;
// де-приватизируем бочку
if (code.barrel_id >= 0) {