Common Source Code Project for Qt (a.k.a for FM-7).
リビジョン | 532dc43b7d7b8e3a9c81dad9dff9f315abe16491 (tree) |
---|---|
日時 | 2020-03-26 01:07:47 |
作者 | K.Ohta <whatisthis.sowhat@gmai...> |
コミッター | K.Ohta |
[VM][DEBUGGER][I386_NP21][MC6809] Add "RH" command to debugger and bool get_debug_regs_description(_TCHAR *, size_t) to API.
@@ -285,6 +285,7 @@ void* debugger_thread(void *lpx) | ||
285 | 285 | helplist.push_back("O[{B,W,D}] <port> <value> - output port (byte,word,dword)"); |
286 | 286 | helplist.push_back("R - show register(s)"); |
287 | 287 | helplist.push_back("R <reg> <value> - edit register"); |
288 | + helplist.push_back("RH - show registers description"); | |
288 | 289 | helplist.push_back("S <range> <list> - search"); |
289 | 290 | helplist.push_back("U [<range>] - unassemble"); |
290 | 291 | helplist.push_back("UT [<steps> | <steps> <logging_file>] - unassemble back trace"); |
@@ -1588,7 +1589,11 @@ RESTART_GO: | ||
1588 | 1589 | } |
1589 | 1590 | } else if(_tcsicmp(params[0], _T("!!")) == 0) { |
1590 | 1591 | // do nothing |
1591 | - } else if(_tcsicmp(params[0], _T("?")) == 0) { | |
1592 | + } else if(_tcsicmp(params[0], _T("RH")) == 0) { | |
1593 | + if(target->get_debug_regs_description(buffer, array_length(buffer))) { | |
1594 | + my_printf(p->osd, _T("REGISTER DESCRIPTION:\n%s\n"), buffer); | |
1595 | + } | |
1596 | + } else if(_tcsicmp(params[0], _T("?")) == 0) { | |
1592 | 1597 | for(auto n = helplist.begin(); n != helplist.end(); ++n) { |
1593 | 1598 | std::string tmps = *n; |
1594 | 1599 | my_printf(p->osd, (const _TCHAR *)(tmps.c_str())); |
@@ -1,6 +1,6 @@ | ||
1 | 1 | message("* vm/common_vm") |
2 | 2 | |
3 | -SET(THIS_LIB_VERSION 2.24.1) | |
3 | +SET(THIS_LIB_VERSION 2.25.0) | |
4 | 4 | |
5 | 5 | #include(cotire) |
6 | 6 | set(s_vm_common_vm_srcs |
@@ -1222,6 +1222,10 @@ public: | ||
1222 | 1222 | { |
1223 | 1223 | return false; |
1224 | 1224 | } |
1225 | + virtual bool get_debug_regs_description(_TCHAR *buffer, size_t buffer_len) | |
1226 | + { | |
1227 | + return false; | |
1228 | + } | |
1225 | 1229 | virtual int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len) |
1226 | 1230 | { |
1227 | 1231 | return debug_dasm_with_userdata(pc, buffer, buffer_len, 0); |
@@ -654,16 +654,45 @@ uint32_t I386::read_debug_reg(const _TCHAR *reg) | ||
654 | 654 | return 0; |
655 | 655 | } |
656 | 656 | |
657 | +bool I386::get_debug_regs_description(_TCHAR *buffer, size_t buffer_len) | |
658 | +{ | |
659 | + my_stprintf_s(buffer, buffer_len, | |
660 | + _T("(E)IP : Instruction pointer\n") | |
661 | + _T("(E)FLAGS : FLAGs\n") | |
662 | + _T("CS : Code SEGMENT\n") | |
663 | + _T("SS : Stack SEGMENT\n") | |
664 | + _T("DS ES FS GS : Data SEGMENT\n") | |
665 | + _T("(E)SP : Stack pointer\n") | |
666 | + _T("(E)BP : Base pointer (sometimes using local stack pointer)\n") | |
667 | + _T("(E)SI : SOURCE INDEX\n") | |
668 | + _T("(E)DI : DESTINATION INDEX\n") | |
669 | + _T("EAX EBX ECX EDX : 32bit ACCUMERATORS\n") | |
670 | + _T("AX BX CX DX : 16bit ACCUMERATORS\n") | |
671 | + _T("AH AL BH BL CH CL DH DL : 8bit ACCUMERATORS\n") | |
672 | + _T("*** ExX is same as xX, split into xH and xL\n") | |
673 | + _T("LDTR : LOCAL SEGMENT ADDRESS TABLE\n") | |
674 | + _T("GDTR : GLOBAL SEGMENT ADDRESS TABLE\n") | |
675 | + _T("IDTR : INTERRUPT SEGMENT ADDRESS TABLE\n") | |
676 | + _T("TRx : TEST REGISTERs\n") | |
677 | + _T("DRx : DEBUG REGISTERs\n") | |
678 | + _T("CR0-CR4 : SYSTEM REGISTERs\n") | |
679 | + _T("MXCSR : \n") | |
680 | + _T("\n") | |
681 | + ); | |
682 | + return true; | |
683 | +} | |
657 | 684 | bool I386::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len) |
658 | 685 | { |
659 | 686 | if(CPU_STAT_PM) { |
660 | 687 | my_stprintf_s(buffer, buffer_len, |
661 | 688 | _T("EAX=%08X EBX=%08X ECX=%08X EDX=%08X\n") |
662 | 689 | _T("ESP=%08X EBP=%08X ESI=%08X EDI=%08X\n") |
663 | - _T("DS=%04X ES=%04X SS=%04X CS=%04X EIP=%08X FLAG=[%c%c%c%c%c%c%c%c%c%s]\n") | |
690 | + _T("SS=%04X CS=%04X DS=%04X ES=%04X FS=%04X GS=%04X\n") | |
691 | + _T("EIP=%08X PREV_EIP=%08X PREV_ESP=%08X EFLAGS=%08X FLAG=[%c%c%c%c%c%c%c%c%c%s]\n") | |
664 | 692 | _T("Clocks = %llu (%llu) Since Scanline = %d/%d (%d/%d)"), |
665 | 693 | CPU_EAX, CPU_EBX, CPU_ECX, CPU_EDX, CPU_ESP, CPU_EBP, CPU_ESI, CPU_EDI, |
666 | - CPU_DS, CPU_ES, CPU_SS, CPU_CS, CPU_EIP, | |
694 | + CPU_SS, CPU_CS, CPU_DS, CPU_ES, CPU_FS, CPU_GS, | |
695 | + CPU_EIP, CPU_PREV_EIP, CPU_PREV_ESP, CPU_FLAG, | |
667 | 696 | (CPU_FLAG & O_FLAG) ? _T('O') : _T('-'), (CPU_FLAG & D_FLAG) ? _T('D') : _T('-'), (CPU_FLAG & I_FLAG) ? _T('I') : _T('-'), (CPU_FLAG & T_FLAG) ? _T('T') : _T('-'), (CPU_FLAG & S_FLAG) ? _T('S') : _T('-'), |
668 | 697 | (CPU_FLAG & Z_FLAG) ? _T('Z') : _T('-'), (CPU_FLAG & A_FLAG) ? _T('A') : _T('-'), (CPU_FLAG & P_FLAG) ? _T('P') : _T('-'), (CPU_FLAG & C_FLAG) ? _T('C') : _T('-'), (CPU_STAT_VM86) ? _T(":VM86") : _T(""), |
669 | 698 | total_cycles, total_cycles - prev_total_cycles, |
@@ -671,10 +700,12 @@ bool I386::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len) | ||
671 | 700 | } else { |
672 | 701 | my_stprintf_s(buffer, buffer_len, |
673 | 702 | _T("AX=%04X BX=%04X CX=%04X DX=%04X SP=%04X BP=%04X SI=%04X DI=%04X\n") |
674 | - _T("DS=%04X ES=%04X SS=%04X CS=%04X IP=%04X FLAG=[%c%c%c%c%c%c%c%c%c]\n") | |
703 | + _T("SS=%04X CS=%04X DS=%04X ES=%04X FS=%04X GS=%04X\n") | |
704 | + _T("IP=%04X PREV_IP=%04X PREV_SP=%04X EFLAGS=%08X FLAG=[%c%c%c%c%c%c%c%c%c]\n") | |
675 | 705 | _T("Clocks = %llu (%llu) Since Scanline = %d/%d (%d/%d)"), |
676 | 706 | CPU_AX, CPU_BX, CPU_CX, CPU_DX, CPU_SP, CPU_BP, CPU_SI, CPU_DI, |
677 | - CPU_DS, CPU_ES, CPU_SS, CPU_CS, CPU_IP, | |
707 | + CPU_SS, CPU_CS, CPU_DS, CPU_ES, CPU_FS, CPU_GS, | |
708 | + CPU_IP, CPU_STATSAVE.cpu_regs.prev_eip.w.w, CPU_STATSAVE.cpu_regs.prev_esp.w.w, CPU_FLAG, | |
678 | 709 | (CPU_FLAG & O_FLAG) ? _T('O') : _T('-'), (CPU_FLAG & D_FLAG) ? _T('D') : _T('-'), (CPU_FLAG & I_FLAG) ? _T('I') : _T('-'), (CPU_FLAG & T_FLAG) ? _T('T') : _T('-'), (CPU_FLAG & S_FLAG) ? _T('S') : _T('-'), |
679 | 710 | (CPU_FLAG & Z_FLAG) ? _T('Z') : _T('-'), (CPU_FLAG & A_FLAG) ? _T('A') : _T('-'), (CPU_FLAG & P_FLAG) ? _T('P') : _T('-'), (CPU_FLAG & C_FLAG) ? _T('C') : _T('-'), |
680 | 711 | total_cycles, total_cycles - prev_total_cycles, |
@@ -128,9 +128,10 @@ public: | ||
128 | 128 | uint32_t __FASTCALL read_debug_io32(uint32_t addr); |
129 | 129 | void __FASTCALL write_debug_io32(uint32_t addr, uint32_t data); |
130 | 130 | uint32_t __FASTCALL read_debug_io16(uint32_t addr); |
131 | - bool write_debug_reg(const _TCHAR *reg, uint32_t data); | |
131 | + virtual bool write_debug_reg(const _TCHAR *reg, uint32_t data); | |
132 | 132 | uint32_t __FASTCALL read_debug_reg(const _TCHAR *reg); |
133 | - bool get_debug_regs_info(_TCHAR *buffer, size_t buffer_len); | |
133 | + virtual bool get_debug_regs_info(_TCHAR *buffer, size_t buffer_len); | |
134 | + virtual bool get_debug_regs_description(_TCHAR *buffer, size_t buffer_len); | |
134 | 135 | int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len); |
135 | 136 | //#endif |
136 | 137 | bool process_state(FILEIO* state_fio, bool loading); |
@@ -546,6 +546,10 @@ bool DEVICE::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len) | ||
546 | 546 | { |
547 | 547 | return false; |
548 | 548 | } |
549 | +bool DEVICE::get_debug_regs_description(_TCHAR *buffer, size_t buffer_len) | |
550 | +{ | |
551 | + return false; | |
552 | +} | |
549 | 553 | int DEVICE::debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len) |
550 | 554 | { |
551 | 555 | return debug_dasm_with_userdata(pc, buffer, buffer_len, 0); |
@@ -758,6 +758,7 @@ public: | ||
758 | 758 | virtual bool write_debug_reg(const _TCHAR *reg, uint32_t data); |
759 | 759 | virtual uint32_t __FASTCALL read_debug_reg(const _TCHAR *reg); |
760 | 760 | virtual bool get_debug_regs_info(_TCHAR *buffer, size_t buffer_len); |
761 | + virtual bool get_debug_regs_description(_TCHAR *buffer, size_t buffer_len); | |
761 | 762 | virtual int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len); |
762 | 763 | virtual int debug_dasm_with_userdata(uint32_t pc, _TCHAR *buffer, size_t buffer_len, uint32_t userdata = 0); |
763 | 764 | /* |
@@ -609,8 +609,9 @@ public: | ||
609 | 609 | val |= read_debug_io16(addr + 2); |
610 | 610 | return val; |
611 | 611 | } |
612 | - bool write_debug_reg(const _TCHAR *reg, uint32_t data); | |
613 | - bool get_debug_regs_info(_TCHAR *buffer, size_t buffer_len); | |
612 | + virtual bool write_debug_reg(const _TCHAR *reg, uint32_t data); | |
613 | + virtual bool get_debug_regs_info(_TCHAR *buffer, size_t buffer_len); | |
614 | + virtual bool get_debug_regs_description(_TCHAR *buffer, size_t buffer_len); | |
614 | 615 | virtual int debug_dasm_with_userdata(uint32_t pc, _TCHAR *buffer, size_t buffer_len, uint32_t userdata = 0); |
615 | 616 | virtual uint32_t cpu_disassemble_m6809(_TCHAR *buffer, uint32_t pc, const uint8_t *oprom, const uint8_t *opram); |
616 | 617 | virtual void __FASTCALL debugger_hook(void); |
@@ -677,6 +677,32 @@ bool MC6809_BASE::write_debug_reg(const _TCHAR *reg, uint32_t data) | ||
677 | 677 | return true; |
678 | 678 | } |
679 | 679 | |
680 | +bool MC6809_BASE::get_debug_regs_description(_TCHAR *buffer, size_t buffer_len) | |
681 | +{ | |
682 | + my_stprintf_s(buffer, buffer_len, | |
683 | + _T("PC : PROGRAM COUNTER (16bit)\n") | |
684 | + _T("CC : CONDITION FLAGS (16bit)\n") | |
685 | + _T("DP : DIRECT POINTER (8bit)\n") | |
686 | + _T("S : SYSTEM STACK POINTER (16bit)\n") | |
687 | + _T("U : USER STACK POINTER (16bit)\n") | |
688 | + _T("X : INDEX REGISTER (16bit)\n") | |
689 | + _T("Y : INDEX REGISTER (16bit)\n") | |
690 | + _T("A : ACCUMLATOR (8bit)\n") | |
691 | + _T("B : ACCUMLATOR (8bit)\n") | |
692 | + _T("D : ACCUMLATOR (16bit)\n") | |
693 | + _T("NOTE: D is chain of A and B.D = (A << 8) | B.\n") | |
694 | + _T("NOTE: ENDIANNESS is BIG.\n") | |
695 | + _T("ADDRESSING:\n") | |
696 | + _T("foo #bar (16/8bit) : immediate value of bar\n") | |
697 | + _T("foo <bar (8bit) : direct addressing of bar; address = (DP << 8) | bar.\n") | |
698 | + _T("foo bar (16bit or index) : extended address.address = bar\n") | |
699 | + _T("foo [bar] (16bit or index) : indirect addressing.address = VALUE16(bar)\n") | |
700 | + _T("FLAGS:\n") | |
701 | + _T("E: ENTIRE / F: FAST INTERRUPT(FIRQ) / H: HALF CARRY / I: (STANDARD) INTERRUPT(IRQ/SWI)\n") | |
702 | + _T("N: NEGATIVE / Z: ZERO / V: OVERFLOW / C: CARRY") | |
703 | + ); | |
704 | + return true; | |
705 | +} | |
680 | 706 | /* |
681 | 707 | PC = 0000 PPC = 0000 |
682 | 708 | INTR=[ IRQ FIRQ NMI HALT][CI CO SI SO TRAP] CC =[EFHINZVC] |
@@ -1435,8 +1461,8 @@ OP_HANDLER(sync_09) // Rename 20101110 | ||
1435 | 1461 | |
1436 | 1462 | /* $14 trap(HALT) */ |
1437 | 1463 | OP_HANDLER(trap) { |
1438 | - int_state |= MC6809_INSN_HALT; // HALT繝輔Λ繧ー | |
1439 | - // Debug: 繝医Λ繝・・隕∝屏 | |
1464 | + int_state |= MC6809_INSN_HALT; // HALT郢晁シ釆帷ケァ?ー | |
1465 | + // Debug: 郢晏現ホ帷ケ昴?繝サ髫補?螻 | |
1440 | 1466 | this->out_debug_log(_T("TRAP(HALT) @%04x %02x %02x\n"), PC - 1, RM((PC - 1)), RM(PC)); |
1441 | 1467 | } |
1442 | 1468 |
@@ -1522,7 +1548,7 @@ OP_HANDLER(exg) { | ||
1522 | 1548 | t1.d = 0; |
1523 | 1549 | t2.d = 0; |
1524 | 1550 | /* |
1525 | - * 20111011: 16bit vs 16Bit縺ョ貍皮ョ励↓縺吶k(XM7/ cpu_x86.asm繧医j | |
1551 | + * 20111011: 16bit vs 16Bit邵コ?ョ雋咲坩?ョ蜉ア竊鍋クコ蜷カ??XM7/ cpu_x86.asm郢ァ蛹サ? | |
1526 | 1552 | */ |
1527 | 1553 | { |
1528 | 1554 | switch ((tb >> 4) & 15) { |
@@ -1679,7 +1705,7 @@ OP_HANDLER(tfr) { | ||
1679 | 1705 | IMMBYTE(tb); |
1680 | 1706 | t.d = 0; |
1681 | 1707 | /* |
1682 | - * 20111011: 16bit vs 16Bit縺ョ貍皮ョ励↓縺吶k(XM7/ cpu_x86.asm繧医j) | |
1708 | + * 20111011: 16bit vs 16Bit邵コ?ョ雋咲坩?ョ蜉ア竊鍋クコ蜷カ??XM7/ cpu_x86.asm郢ァ蛹サ?? | |
1683 | 1709 | */ |
1684 | 1710 | { |
1685 | 1711 | switch ((tb >> 4) & 15) { |