UINT32 debug_comment_get_opcode_crc32(offs_t address) { int i; UINT32 crc; UINT8 opbuf[64], argbuf[64]; char buff[256]; offs_t numbytes; int maxbytes = activecpu_max_instruction_bytes(); UINT32 addrmask = (debug_get_cpu_info(cpu_getactivecpu()))->space[ADDRESS_SPACE_PROGRAM].logaddrmask; int use_new_dasm = (activecpu_get_info_fct(CPUINFO_PTR_DISASSEMBLE_NEW) != NULL); memset(opbuf, 0x00, sizeof(opbuf)); memset(argbuf, 0x00, sizeof(argbuf)); // fetch the bytes up to the maximum for (i = 0; i < maxbytes; i++) { opbuf[i] = debug_read_opcode(address + i, 1, FALSE); argbuf[i] = debug_read_opcode(address + i, 1, TRUE); } if (use_new_dasm) { numbytes = cpunum_dasm_new(cpu_getactivecpu(), buff, address & addrmask, opbuf, argbuf, maxbytes) & DASMFLAG_LENGTHMASK; } else { numbytes = cpunum_dasm(cpu_getactivecpu(), buff, address & addrmask) & DASMFLAG_LENGTHMASK; } crc = crc32(0, argbuf, numbytes); return crc; }
static CMDERR internal_parse_command(const char *original_command, int execute) { char command[MAX_COMMAND_LENGTH], parens[MAX_COMMAND_LENGTH]; char *params[MAX_COMMAND_PARAMS]; CMDERR result = CMDERR_NONE; char *command_start; char *p, c = 0; /* make a copy of the command */ strcpy(command, original_command); /* loop over all semicolon-separated stuff */ for (p = command; *p != 0; ) { int paramcount = 0, foundend = FALSE, instring = FALSE, isexpr = FALSE, parendex = 0; /* find a semicolon or the end */ for (params[paramcount++] = p; !foundend; p++) { c = *p; if (instring) { if (c == '"' && p[-1] != '\\') instring = FALSE; } else { switch (c) { case '"': instring = TRUE; break; case '(': case '[': case '{': parens[parendex++] = c; break; case ')': if (parendex == 0 || parens[--parendex] != '(') return MAKE_CMDERR_UNBALANCED_PARENS(p - command); break; case ']': if (parendex == 0 || parens[--parendex] != '[') return MAKE_CMDERR_UNBALANCED_PARENS(p - command); break; case '}': if (parendex == 0 || parens[--parendex] != '{') return MAKE_CMDERR_UNBALANCED_PARENS(p - command); break; case ',': if (parendex == 0) params[paramcount++] = p; break; case ';': if (parendex == 0) foundend = TRUE; break; case '-': if (parendex == 0 && paramcount == 1 && p[1] == '-') isexpr = TRUE; *p = c; break; case '+': if (parendex == 0 && paramcount == 1 && p[1] == '+') isexpr = TRUE; *p = c; break; case '=': if (parendex == 0 && paramcount == 1) isexpr = TRUE; *p = c; break; case 0: foundend = TRUE; break; default: *p = tolower(c); break; } } } /* check for unbalanced parentheses or quotes */ if (instring) return MAKE_CMDERR_UNBALANCED_QUOTES(p - command); if (parendex != 0) return MAKE_CMDERR_UNBALANCED_PARENS(p - command); /* NULL-terminate if we ended in a semicolon */ p--; if (c == ';') *p++ = 0; /* process the command */ command_start = params[0]; /* allow for "do" commands */ if (tolower(command_start[0] == 'd') && tolower(command_start[1] == 'o') && isspace(command_start[2])) { isexpr = TRUE; command_start += 3; } /* if it smells like an assignment expression, treat it as such */ if (isexpr && paramcount == 1) { UINT64 expresult; EXPRERR exprerr = expression_evaluate(command_start, debug_get_cpu_info(cpu_getactivecpu())->symtable, &expresult); if (exprerr != EXPRERR_NONE) return MAKE_CMDERR_EXPRESSION_ERROR(EXPRERR_ERROR_OFFSET(exprerr)); } else { result = internal_execute_command(execute, paramcount, ¶ms[0]); if (result != CMDERR_NONE) return MAKE_CMDERR(CMDERR_ERROR_CLASS(result), command_start - command); } } return CMDERR_NONE; }