--- hatari/src/debug/68kDisass.c 2019/04/09 08:56:48 1.1.1.7 +++ hatari/src/debug/68kDisass.c 2019/04/09 08:59:19 1.1.1.9 @@ -191,9 +191,17 @@ static void Disass68kLoadStructInfo(co if(!lineCount) return; - disStructEntries = realloc(disStructEntries, sizeof(disStructEntry) - * (disStructCounts + lineCount)); - if(!disStructEntries) { free(fbuf); return; } + se = realloc(disStructEntries, sizeof(disStructEntry) * (disStructCounts + lineCount)); + if (!se) + { + perror("Disass68kLoadStructInfo"); + free(disStructEntries); + disStructEntries = NULL; + free(fbuf); + return; + } + disStructEntries = se; + se = NULL; line = fbuf; @@ -265,10 +273,23 @@ static void Disass68kLoadSymbols(const char *nextLine; char *line; char *fbuf = NULL; - int lineCount = Disass68kLoadTextFile(filename, &fbuf); - if(!lineCount) return; - disSymbolEntries = realloc(disSymbolEntries, sizeof(disSymbolEntry) * (disSymbolCounts + lineCount)); - if(!disSymbolEntries) { free(fbuf); return; } + int lineCount = Disass68kLoadTextFile(filename, &fbuf); + disSymbolEntry *nde; + + if (!lineCount) + return; + + nde = realloc(disSymbolEntries, sizeof(disSymbolEntry) * (disSymbolCounts + lineCount)); + if (!nde) + { + perror("Disass68kLoadSymbols"); + free(disSymbolEntries); + disSymbolEntries = NULL; + free(fbuf); + return; + } + disSymbolEntries = nde; + line = fbuf; for(i=0; i= 0x0 && reg <= 0x7) + { + regName[0] = (options & doptRegisterSmall) ? 'd' : 'D'; + } + else if (reg >= 0x8 && reg <= 0xf) + { + regName[0] = (options & doptRegisterSmall) ? 'a' : 'A'; } + else + { + regName[0] = '?'; + } + + regName[1] = '0' + (reg & 7); + regName[2] = 0; + return regName; } @@ -825,6 +852,7 @@ static char *Disass68kEA(char *disassbu case 3: bd = Disass68kGetWord(*addr); *addr += 2; bd <<= 16; + /* fall through */ case 2: bd |= Disass68kGetWord(*addr); *addr += 2; break; @@ -895,6 +923,7 @@ static char *Disass68kEA(char *disassbu case 3: od = Disass68kGetWord(*addr); *addr += 2; od <<= 16; + /* fall through */ case 2: od |= Disass68kGetWord(*addr); *addr += 2; if(prefixComma) @@ -1013,6 +1042,7 @@ static char *Disass68kEA(char *disassbu switch(size) { case 1: eWord1 &= 0xFF; + /* fall through */ case 2: #if USE_SYMBOLS if(disassFlag) @@ -1525,26 +1555,26 @@ static OpcodeTableStruct OpcodeTable[] = { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x0800}, {0}, {ofEa,ofSpecReg}, "PMOVE",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_TT0} }, { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x0900}, {0}, {ofEa,ofSpecReg}, "PMOVEFD",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_TT0} }, - { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x0B00}, {0}, {ofSpecReg,ofEa}, "PMOVEFD",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_TT0} }, + { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x0B00}, {0}, {ofSpecReg,ofEa}, "PMOVEFD",{REG_TT0,EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel} }, { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x0C00}, {0}, {ofEa,ofSpecReg}, "PMOVE",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_TT1} }, - { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x0C00}, {0}, {ofSpecReg,ofEa}, "PMOVE",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_TT0} }, + { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x0C00}, {0}, {ofSpecReg,ofEa}, "PMOVE",{REG_TT0,EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel} }, { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x0D00}, {0}, {ofEa,ofSpecReg}, "PMOVEFD",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_TT1} }, - { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x0E00}, {0}, {ofSpecReg,ofEa}, "PMOVE",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_TT1} }, - { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x0F00}, {0}, {ofSpecReg,ofEa}, "PMOVEFD",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_TT1} }, + { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x0E00}, {0}, {ofSpecReg,ofEa}, "PMOVE",{REG_TT1,EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel} }, + { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x0F00}, {0}, {ofSpecReg,ofEa}, "PMOVEFD",{REG_TT1,EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel} }, { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x4000}, {0}, {ofEa,ofSpecReg}, "PMOVE",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_TC} }, { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x4100}, {0}, {ofEa,ofSpecReg}, "PMOVEFD",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_TC} }, - { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x4200}, {0}, {ofSpecReg,ofEa}, "PMOVE",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_TC} }, - { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x4300}, {0}, {ofSpecReg,ofEa}, "PMOVEFD",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_TC} }, + { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x4200}, {0}, {ofSpecReg,ofEa}, "PMOVE",{REG_TC,EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel} }, + { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x4300}, {0}, {ofSpecReg,ofEa}, "PMOVEFD",{REG_TC,EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel} }, { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x4800}, {0}, {ofEa,ofSpecReg}, "PMOVE",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_SRP} }, { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x4900}, {0}, {ofEa,ofSpecReg}, "PMOVEFD",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_SRP} }, - { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x4A00}, {0}, {ofSpecReg,ofEa}, "PMOVE",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_SRP} }, - { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x4B00}, {0}, {ofSpecReg,ofEa}, "PMOVEFD",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_SRP} }, + { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x4A00}, {0}, {ofSpecReg,ofEa}, "PMOVE",{REG_SRP,EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_SRP} }, + { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x4B00}, {0}, {ofSpecReg,ofEa}, "PMOVEFD",{REG_SRP,EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_SRP} }, { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x4C00}, {0}, {ofEa,ofSpecReg}, "PMOVE",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_CRP} }, { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x4D00}, {0}, {ofEa,ofSpecReg}, "PMOVEFD",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_CRP} }, - { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x4e00}, {0}, {ofSpecReg,ofEa}, "PMOVE",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_CRP} }, - { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x4f00}, {0}, {ofSpecReg,ofEa}, "PMOVEFD",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_CRP} }, + { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x4e00}, {0}, {ofSpecReg,ofEa}, "PMOVE",{REG_CRP,EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel} }, + { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x4f00}, {0}, {ofSpecReg,ofEa}, "PMOVEFD",{REG_CRP,EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel} }, { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x6000}, {0}, {ofEa,ofSpecReg}, "PMOVE",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_MMUSR} }, - { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x6200}, {0}, {ofSpecReg,ofEa}, "PMOVE",{EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel,REG_MMUSR} }, + { MC_PMMU|MC68030, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x6200}, {0}, {ofSpecReg,ofEa}, "PMOVE",{REG_MMUSR,EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel} }, { MC_PMMU, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xffff, 0x2800}, {0}, {ofSpecReg,ofEa}, "PVALID",{REG_VAL,EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel} }, { MC_PMMU, {0xffc0, 0xf000|(PMMU_COPROC_ID<<9), 0xfff8, 0x2C00}, {0}, {ofExtRegA0,ofEa}, "PVALID",{0,EA_Dn|EA_An|EA_Anip|EA_piAn|EA_Immed|EA_PCRel} }, @@ -2458,10 +2488,10 @@ static void Disass68k_loop (FILE *f, uae char addressBuffer[32]; char hexdumpBuffer[256]; - char labelBuffer[256]; + char labelBuffer[258]; char opcodeBuffer[64]; char operandBuffer[256]; - char commentBuffer[256]; + char commentBuffer[258]; int plen, len, j; len = Disass68k(addr, labelBuffer, opcodeBuffer, operandBuffer, commentBuffer); @@ -2507,11 +2537,8 @@ static void Disass68k_loop (FILE *f, uae } if (optionPosComment >= 0) { - float percentage; - Uint32 count, cycles, i_misses, d_hits; - if (Profile_CpuAddressData(addr, &percentage, &count, &cycles, &i_misses, &d_hits)) + if (Profile_CpuAddressDataStr(commentBuffer, sizeof(commentBuffer), addr)) { - sprintf(commentBuffer, "%5.2f%% (%u, %u, %u, %u)", percentage, count, cycles, i_misses, d_hits); Disass68kComposeStr(lineBuffer, commentBuffer, optionPosComment+1, 0); } /* show comments only if profile data is missing */ @@ -2553,7 +2580,7 @@ void Disasm (FILE *f, uaecptr addr, uaec { if (ConfigureParams.Debugger.bDisasmUAE) #ifdef WINUAE_FOR_HATARI - m68k_disasm_file (f, addr, nextpc, cnt); + m68k_disasm_file (f, addr, nextpc, addr, cnt); #else m68k_disasm (f, addr, nextpc, cnt); #endif @@ -2636,22 +2663,23 @@ int Disasm_GetOptions(void) /** * Set CPU and FPU mask used for disassembly (when changed from the UI or the options) */ -void Disasm_SetCPUType ( int CPU , int FPU ) +void Disasm_SetCPUType(int CPU, int FPU, bool bMMU) { - optionCPUTypeMask = 0; + switch (CPU) + { + case 0: optionCPUTypeMask = MC68000; break; + case 1: optionCPUTypeMask = MC68010; break; + case 2: optionCPUTypeMask = MC68020; break; + case 3: optionCPUTypeMask = MC68030; break; + case 4: optionCPUTypeMask = MC68040; break; + default: optionCPUTypeMask = MC68000; break; + } - if ( ( FPU == 68881 ) || ( FPU == 68882 ) ) + if (FPU != 0) optionCPUTypeMask |= MC_FPU; - switch ( CPU ) - { - case 0 : optionCPUTypeMask |= MC68000 ; break; - case 1 : optionCPUTypeMask |= MC68010 ; break; - case 2 : optionCPUTypeMask |= MC68020 ; break; - case 3 : optionCPUTypeMask |= MC68030 ; break; - case 4 : optionCPUTypeMask |= MC68040 ; break; - default : optionCPUTypeMask |= MC68000 ; break; - } + if (bMMU) + optionCPUTypeMask |= MC_PMMU; } /** @@ -2684,7 +2712,7 @@ const char *Disasm_ParseOption(const cha assert(option[i].flag == (1 << i)); fprintf(stderr, "\t%d: %s\n", option[i].flag, option[i].desc); } - fprintf(stderr, "Current settings are:\n\t--disasm %s --disasm %d\n", + fprintf(stderr, "Current settings are:\n\t--disasm %s --disasm 0x%x\n", ConfigureParams.Debugger.bDisasmUAE ? "uae" : "ext", ConfigureParams.Debugger.nDisasmOptions); return ""; @@ -2704,7 +2732,12 @@ const char *Disasm_ParseOption(const cha } if (isdigit((unsigned char)*arg)) { - int newopt = atoi(arg); + char *end; + int newopt = strtol(arg, &end, 0); + if (*end) + { + return "not a number"; + } if ((newopt|optionsMask) != optionsMask) { return "unknown flags in the bitmask";