diff --git a/programs/develop/mtdbg/gui.inc b/programs/develop/mtdbg/gui.inc index de021e7d4a..d5aaedf79a 100644 --- a/programs/develop/mtdbg/gui.inc +++ b/programs/develop/mtdbg/gui.inc @@ -4,10 +4,10 @@ macro DrawRectangle x, y, w, h, color { - mcall 13, x shl 16 + w, y shl 16 + 1, color ; top - mcall , x shl 16 + 1, y shl 16 + h, color ; left - mcall , (x+w) shl 16 +1, y shl 16 + (h+1), color ; right - mcall , x shl 16 + w, (y+h) shl 16 + 1, color ; bottom + mcall 13, x shl 16 + w, y shl 16 + 1, color ; top + mcall , x shl 16 + 1, y shl 16 + h, color ; left + mcall , (x+w) shl 16 +1, y shl 16 + (h+1), color ; right + mcall , x shl 16 + w, (y+h) shl 16 + 1, color ; bottom } ;----------------------------------------------------------------------------- @@ -27,7 +27,10 @@ if COLOR_THEME eq MOVIEOS COLOR_TXT_NORMAL = 0xffffff COLOR_TXT_INACTIVE = 0x8f7948 COLOR_TXT_CHANGED = 0xec9300 + COLOR_TXT_LABEL = 0x22b14c COLOR_TXT_SELECTED = 0x1d272f + COLOR_TXT_ADDR = 0xec9300 + COLOR_TXT_BREAKPOINT = 0xec9300 else if COLOR_THEME eq WHITE_ON_BLACK @@ -38,7 +41,10 @@ else if COLOR_THEME eq WHITE_ON_BLACK COLOR_TXT_NORMAL = 0xFFFFFF ; white COLOR_TXT_INACTIVE = 0x808080 ; grey COLOR_TXT_CHANGED = 0x00AA00 ; green + COLOR_TXT_LABEL = COLOR_TXT_NORMAL COLOR_TXT_SELECTED = 0xFFFFFF ; white + COLOR_TXT_ADDR = COLOR_TXT_NORMAL + COLOR_TXT_BREAKPOINT = COLOR_TXT_NORMAL else ; BLACK ON WHITE @@ -49,7 +55,10 @@ else ; BLACK ON WHITE COLOR_TXT_NORMAL = 0x000000 ; black COLOR_TXT_INACTIVE = 0x808080 ; grey COLOR_TXT_CHANGED = 0x00AA00 ; green + COLOR_TXT_LABEL = COLOR_TXT_NORMAL COLOR_TXT_SELECTED = 0xFFFFFF ; white + COLOR_TXT_ADDR = COLOR_TXT_NORMAL + COLOR_TXT_BREAKPOINT = COLOR_TXT_NORMAL end if @@ -1309,7 +1318,7 @@ draw_disasm: sub esi, edx ; normal color ; was 0x40000000 - mov ecx, (COLOR_TXT_NORMAL or 0x40000000) + mov ecx, (COLOR_TXT_LABEL or 0x40000000) mov al, 4 ; draw a text string in the window with color COLOR_TXT_NORMAL in ecx mcall @@ -1337,11 +1346,8 @@ draw_disasm: call disasm_instr pop ebp jc .loopend - ; setting up colors - ; was 'xor esi, esi' - default color: black - mov esi, COLOR_TXT_NORMAL - ; was 0xFFFFFF - default background: white mov edx, COLOR_BG_NORMAL + mov esi, COLOR_TXT_NORMAL mov ebx, data_x_pos*10000h + data_x_size mov ecx, [disasm_cur_str] imul ecx, 10*10000h @@ -1350,27 +1356,19 @@ draw_disasm: pushad call find_enabled_breakpoint popad - jnz .nored - ; setting up background color for breakpoint - ; was 0xFF0000 - red + jnz .nobp mov edx, COLOR_BG_BREAKPOINT + mov esi, COLOR_TXT_BREAKPOINT + .nobp: - .nored: mov eax, [_eip] cmp eax, ebp - jnz .noblue - ; setting up background color for selected text - ; (current running instruction) - ; was 0x0000FF - blue + jnz .notcurrent mov edx, COLOR_BG_SELECTED - ; setting up selected text color - ; (current running instruction) - ; was 0xFFFFFF - white mov esi, COLOR_TXT_SELECTED + .notcurrent: + push esi ; Save color value for disassembled text - .noblue: - ;push 13 - ;pop eax ; draw container rectangle/box for disassembled text ; color in edx mcall 13 @@ -1384,24 +1382,26 @@ draw_disasm: mcall 47, 80100h, ebp ;mov al, 4 lea ebx, [edx+8*6*10000h] - ; copy color value from esi - mov ecx, esi + mov ecx, esi ; text color push 2 pop esi mov edx, aColon - ; draw a text string in the window, color in ecx + ; draw the colon mcall 4 push 9 pop edi lea edx, [ebx+2*6*10000h] - mov esi, ecx mov ecx, ebp sub ecx, [disasm_start_pos] add ecx, disasm_buffer + mov esi, COLOR_TXT_ADDR + mov eax, [_eip] + cmp eax, ebp + jnz @f + mov esi, COLOR_TXT_SELECTED + @@: .drawhex: - ;mov al, 47 - ;mov ebx, 20101h ; draw a number in the window, color in esi mcall 47, 20101h add edx, 6*3*10000h @@ -1426,10 +1426,9 @@ draw_disasm: mov edx, aDots ; draw a text string in the window, color in ecx mcall 4 - ; copy color value from ecx - mov esi, ecx .hexdone: + pop esi xor eax, eax mov edi, disasm_string mov edx, edi @@ -1609,7 +1608,7 @@ draw_window: mcall ; registers frame - DrawRectangle (registers_x_pos-2), (registers_y_pos-2), (registers_x_size+3), (registers_y_size+3), COLOR_LINE + DrawRectangle (registers_x_pos-2), (registers_y_pos-2), (registers_x_size+3), (registers_y_size+3), COLOR_LINE ; draw container rectangle/box for registers information window region ; messages diff --git a/programs/develop/mtdbg/mtdbg.asm b/programs/develop/mtdbg/mtdbg.asm index 9c58683de1..4d23a3026b 100644 --- a/programs/develop/mtdbg/mtdbg.asm +++ b/programs/develop/mtdbg/mtdbg.asm @@ -1,4 +1,4 @@ -COLOR_THEME equ BLACK_ON_WHITE +COLOR_THEME fix BLACK_ON_WHITE format binary as "" @@ -301,12 +301,20 @@ do_reload: mov ecx, edi @@: - mov dword [ecx], '.dbg' - mov byte [ecx+4], 0 + mov dword[ecx], '.dbg' + mov byte[ecx+4], 0 pop esi mov ebp, esi + push ecx esi + call OnLoadSymbols.silent ; Try to load .dbg file + pop esi ecx + xor eax, eax + cmp [num_symbols], eax + jne @f + mov dword[ecx], '.map' ; If failed, try .map file too call OnLoadSymbols.silent - + @@: + ; now test for packed progs cmp [disasm_buf_size], 100h jz @f @@ -1941,411 +1949,9 @@ OnUnpack: jmp .x1 ;----------------------------------------------------------------------------- -; Working with program symbols -; -; TODO: split to symbols.inc +; Include Symbol parser -include 'sort.inc' - -; compare what? Add context-relative comment and name -compare: - cmpsd - jnz @f - cmp esi, edi - - @@: - ret - -; purpose of this function? -compare2: - cmpsd - - @@: - cmpsb - jnz @f - cmp byte [esi-1], 0 - jnz @b - cmp esi, edi - - @@: - ret - -free_symbols: - mov ecx, [symbols] - jecxz @f - mcall 68, 13 - and [symbols], 0 - and [num_symbols], 0 - - @@: - ret -;----------------------------------------------------------------------------- -; Load symbols event - -OnLoadSymbols.fileerr: - test ebp, ebp - jz @f - mcall 68, 13, edi - ret - - @@: - push eax - mcall 68, 13, edi - mov esi, aCannotLoadFile - call put_message_nodraw - pop eax - cmp eax, 0x20 - jae .unk - mov esi, [load_err_msgs + eax*4] - test esi, esi - jnz put_message - - .unk: - mov esi, unk_err_msg2 - jmp put_message - -OnLoadSymbols: - xor ebp, ebp - ; load input file - mov esi, [curarg] - call free_symbols - - .silent: - xor edi, edi - cmp [num_symbols], edi - jz @f - - call free_symbols - ;ret - - @@: - mov ebx, fn70_attr_block - mov [ebx+21], esi - mcall 70 - test eax, eax - jnz .fileerr - cmp dword [fileattr+36], edi - jnz .memerr - mov ecx, dword [fileattr+32] - mcall 68, 12 - test eax, eax - jz .memerr - mov edi, eax - mov ebx, fn70_read_block - mov [ebx+12], ecx - mov [ebx+16], edi - mov [ebx+21], esi - mcall 70 - test eax, eax - jnz .fileerr - ; calculate memory requirements - lea edx, [ecx+edi-1] ; edx = EOF-1 - mov esi, edi - xor ecx, ecx - - .calcloop: - cmp esi, edx - jae .calcdone - cmp word [esi], '0x' - jnz .skipline - inc esi - inc esi - - @@: - cmp esi, edx - jae .calcdone - lodsb - or al, 20h - sub al, '0' - cmp al, 9 - jbe @b - sub al, 'a'-'0'-10 - cmp al, 15 - jbe @b - dec esi - - @@: - cmp esi, edx - ja .calcdone - lodsb - cmp al, 20h - jz @b - jb .calcloop - cmp al, 9 - jz @b - add ecx, 12+1 - inc [num_symbols] - - @@: - inc ecx - cmp esi, edx - ja .calcdone - lodsb - cmp al, 0xD - jz .calcloop - cmp al, 0xA - jz .calcloop - jmp @b - - .skipline: - cmp esi, edx - jae .calcdone - lodsb - cmp al, 0xD - jz .calcloop - cmp al, 0xA - jz .calcloop - jmp .skipline - - .calcdone: - mcall 68, 12 - test eax, eax - jnz .memok - inc ebx - mov ecx, edi - mov al, 68 - mcall - - .memerr: - mov esi, aNoMemory - jmp put_message - - .memok: - mov [symbols], eax - mov ebx, eax - push edi - mov esi, edi - mov edi, [num_symbols] - lea ebp, [eax+edi*4] - lea edi, [eax+edi*8] - - ; parse input data, - ; esi->input, edx->EOF, ebx->ptrs, edi->names - .readloop: - cmp esi, edx - jae .readdone - cmp word [esi], '0x' - jnz .readline - inc esi - inc esi - xor eax, eax - xor ecx, ecx - - @@: - shl ecx, 4 - add ecx, eax - cmp esi, edx - jae .readdone - lodsb - or al, 20h - sub al, '0' - cmp al, 9 - jbe @b - sub al, 'a'-'0'-10 - cmp al, 15 - jbe @b - dec esi - - @@: - cmp esi, edx - ja .readdone - lodsb - cmp al, 20h - jz @b - jb .readloop - cmp al, 9 - jz @b - mov dword [ebx], edi - add ebx, 4 - mov dword [ebp], edi - add ebp, 4 - mov dword [edi], ecx - add edi, 4 - stosb - - @@: - xor eax, eax - stosb - cmp esi, edx - ja .readdone - lodsb - cmp al, 0xD - jz .readloop - cmp al, 0xA - jz .readloop - mov byte [edi-1], al - jmp @b - - .readline: - cmp esi, edx - jae .readdone - lodsb - cmp al, 0xD - jz .readloop - cmp al, 0xA - jz .readloop - jmp .readline - - .readdone: - pop ecx - mcall 68, 13 - mov ecx, [num_symbols] - mov edx, [symbols] - mov ebx, compare - call sort - mov ecx, [num_symbols] - lea edx, [edx+ecx*4] - mov ebx, compare2 - call sort - mov esi, aSymbolsLoaded - call put_message - jmp draw_disasm.redraw - -;----------------------------------------------------------------------------- -; -; in: EAX = address -; out: ESI, CF - -find_symbol: - cmp [num_symbols], 0 - jnz @f - - .ret0: - xor esi, esi - stc - ret - - @@: - push ebx ecx edx - xor edx, edx - mov esi, [symbols] - mov ecx, [num_symbols] - mov ebx, [esi] - cmp [ebx], eax - jz .donez - jb @f - pop edx ecx ebx - jmp .ret0 - - @@: - ; invariant: symbols_addr[edx] < eax < symbols_addr[ecx] - ; TODO: add meaningful label names - .0: - push edx - - .1: - add edx, ecx - sar edx, 1 - cmp edx, [esp] - jz .done2 - mov ebx, [esi+edx*4] - cmp [ebx], eax - jz .done - ja .2 - mov [esp], edx - jmp .1 - - .2: - mov ecx, edx - pop edx - jmp .0 - - .donecont: - dec edx - - .done: - test edx, edx - jz @f - mov ebx, [esi+edx*4-4] - cmp [ebx], eax - jz .donecont - - @@: - pop ecx - - .donez: - mov esi, [esi+edx*4] - add esi, 4 - pop edx ecx ebx - clc - ret - - .done2: - lea esi, [esi+edx*4] - pop ecx edx ecx ebx - stc - ret - -;----------------------------------------------------------------------------- -; -; in: esi->name -; out: if found: CF = 0, EAX = value -; otherwise CF = 1 -find_symbol_name: - cmp [num_symbols], 0 - jnz @f - - .stc_ret: - stc - ret - - @@: - push ebx ecx edx edi - push -1 - pop edx - mov ebx, [symbols] - mov ecx, [num_symbols] - lea ebx, [ebx+ecx*4] - - ; invariant: symbols_name[edx] < name < symbols_name[ecx] - .0: - push edx - - .1: - add edx, ecx - sar edx, 1 - cmp edx, [esp] - jz .done2 - call .cmp - jz .done - jb .2 - mov [esp], edx - jmp .1 - - .2: - mov ecx, edx - pop edx - jmp .0 - - .done: - pop ecx - - .donez: - mov eax, [ebx+edx*4] - mov eax, [eax] - pop edi edx ecx ebx - clc - ret - - .done2: - pop edx edi edx ecx ebx - stc - ret - - .cmp: - mov edi, [ebx+edx*4] - push esi - add edi, 4 - - @@: - cmpsb - jnz @f - cmp byte [esi-1], 0 - jnz @b - - @@: - pop esi - ret +include 'symbols.inc' ;----------------------------------------------------------------------------- ; Include disassembler engine @@ -2356,10 +1962,9 @@ include 'disasm.inc' ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DATA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -caption_str db 'Kolibri Debugger',0 -caption_len = $ - caption_str +caption_str db 'Kolibri Debugger',0 -begin_str db 'Kolibri Debugger, version 0.33',10 +begin_str db 'Kolibri Debugger, version 0.34',10 db 'Hint: type "help" for help, "quit" to quit' newline db 10,0 prompt db '> ',0 @@ -2682,209 +2287,212 @@ flags_bits db 0,2,4,6,7,10,11 ; Registers strings regs_strs: - db 'EAX=' - db 'EBX=' - db 'ECX=' - db 'EDX=' - db 'ESI=' - db 'EDI=' - db 'EBP=' - db 'ESP=' - db 'EIP=' - db 'EFLAGS=' -fpu_strs: - db 'ST0=' - db 'ST1=' - db 'ST2=' - db 'ST3=' - db 'ST4=' - db 'ST5=' - db 'ST6=' - db 'ST7=' -mmx_strs: - db 'MM0=' - db 'MM1=' - db 'MM2=' - db 'MM3=' - db 'MM4=' - db 'MM5=' - db 'MM6=' - db 'MM7=' -sse_strs: - db '-XMM0-' - db '-XMM1-' - db '-XMM2-' - db '-XMM3-' - db '-XMM4-' - db '-XMM5-' - db '-XMM6-' - db '-XMM7-' -avx_strs: - db '-YMM0-' - db '-YMM1-' - db '-YMM2-' - db '-YMM3-' - db '-YMM4-' - db '-YMM5-' - db '-YMM6-' - db '-YMM7-' + db 'EAX=' + db 'EBX=' + db 'ECX=' + db 'EDX=' + db 'ESI=' + db 'EDI=' + db 'EBP=' + db 'ESP=' + db 'EIP=' + db 'EFLAGS=' -debuggee_pid dd 0 -bSuspended db 0 -bAfterGo db 0 -temp_break dd 0 -reg_mode db 1 +fpu_strs: + db 'ST0=' + db 'ST1=' + db 'ST2=' + db 'ST3=' + db 'ST4=' + db 'ST5=' + db 'ST6=' + db 'ST7=' + +mmx_strs: + db 'MM0=' + db 'MM1=' + db 'MM2=' + db 'MM3=' + db 'MM4=' + db 'MM5=' + db 'MM6=' + db 'MM7=' +sse_strs: + db '-XMM0-' + db '-XMM1-' + db '-XMM2-' + db '-XMM3-' + db '-XMM4-' + db '-XMM5-' + db '-XMM6-' + db '-XMM7-' +avx_strs: + db '-YMM0-' + db '-YMM1-' + db '-YMM2-' + db '-YMM3-' + db '-YMM4-' + db '-YMM5-' + db '-YMM6-' + db '-YMM7-' + +debuggee_pid dd 0 +bSuspended db 0 +bAfterGo db 0 +temp_break dd 0 +reg_mode db 1 include 'disasm_tbl.inc' reg_table: - db 2,'al',0 - db 2,'cl',1 - db 2,'dl',2 - db 2,'bl',3 - db 2,'ah',4 - db 2,'ch',5 - db 2,'dh',6 - db 2,'bh',7 - db 2,'ax',8 - db 2,'cx',9 - db 2,'dx',10 - db 2,'bx',11 - db 2,'sp',12 - db 2,'bp',13 - db 2,'si',14 - db 2,'di',15 - db 3,'eax',16 - db 3,'ecx',17 - db 3,'edx',18 - db 3,'ebx',19 - db 3,'esp',20 - db 3,'ebp',21 - db 3,'esi',22 - db 3,'edi',23 - db 3,'eip',24 - db 0 + db 2,'al',0 + db 2,'cl',1 + db 2,'dl',2 + db 2,'bl',3 + db 2,'ah',4 + db 2,'ch',5 + db 2,'dh',6 + db 2,'bh',7 + db 2,'ax',8 + db 2,'cx',9 + db 2,'dx',10 + db 2,'bx',11 + db 2,'sp',12 + db 2,'bp',13 + db 2,'si',14 + db 2,'di',15 + db 3,'eax',16 + db 3,'ecx',17 + db 3,'edx',18 + db 3,'ebx',19 + db 3,'esp',20 + db 3,'ebp',21 + db 3,'esi',22 + db 3,'edi',23 + db 3,'eip',24 + db 0 IncludeIGlobals fn70_read_block: - dd 0 - dq 0 - dd ? - dd ? - db 0 - dd ? + dd 0 + dq 0 + dd ? + dd ? + db 0 + dd ? fn70_attr_block: - dd 5 - dd 0,0,0 - dd fileattr - db 0 - dd ? + dd 5 + dd 0,0,0 + dd fileattr + db 0 + dd ? fn70_load_block: - dd 7 - dd 1 -load_params dd 0 - dd 0 - dd 0 + dd 7 + dd 1 +load_params dd 0 + dd 0 + dd 0 i_end: loadname: - db 0 - rb 255 + db 0 + rb 255 -symbolsfile rb 260 +symbolsfile rb 260 prgname_ptr dd ? prgname_len dd ? IncludeUGlobals -dbgwnd dd ? +dbgwnd dd ? -messages rb messages_height*messages_width -messages_pos dd ? +messages rb messages_height*messages_width +messages_pos dd ? -cmdline rb cmdline_width+1 -cmdline_len dd ? -cmdline_pos dd ? -curarg dd ? +cmdline rb cmdline_width+1 +cmdline_len dd ? +cmdline_pos dd ? +curarg dd ? -cmdline_prev rb cmdline_width+1 +cmdline_prev rb cmdline_width+1 -was_temp_break db ? +was_temp_break db ? +symbol_section db ? -dbgbufsize dd ? -dbgbuflen dd ? -dbgbuf rb 256 +dbgbufsize dd ? +dbgbuflen dd ? +dbgbuf rb 256 -fileattr rb 40 +fileattr rb 40 needzerostart: context: -_eip dd ? -_eflags dd ? -_eax dd ? -_ecx dd ? -_edx dd ? -_ebx dd ? -_esp dd ? -_ebp dd ? -_esi dd ? -_edi dd ? +_eip dd ? +_eflags dd ? +_eax dd ? +_ecx dd ? +_edx dd ? +_ebx dd ? +_esp dd ? +_ebp dd ? +_esi dd ? +_edi dd ? oldcontext rb $-context mmx_context: -_mm0 dq ? -_mm1 dq ? -_mm2 dq ? -_mm3 dq ? -_mm4 dq ? -_mm5 dq ? -_mm6 dq ? -_mm7 dq ? +_mm0 dq ? +_mm1 dq ? +_mm2 dq ? +_mm3 dq ? +_mm4 dq ? +_mm5 dq ? +_mm6 dq ? +_mm7 dq ? oldmmxcontext rb $-mmx_context fpu_context: -_st0 dq ? -_st1 dq ? -_st2 dq ? -_st3 dq ? -_st4 dq ? -_st5 dq ? -_st6 dq ? -_st7 dq ? +_st0 dq ? +_st1 dq ? +_st2 dq ? +_st3 dq ? +_st4 dq ? +_st5 dq ? +_st6 dq ? +_st7 dq ? oldfpucontext rb $-fpu_context sse_context: -_xmm0 dq 2 dup ? -_xmm1 dq 2 dup ? -_xmm2 dq 2 dup ? -_xmm3 dq 2 dup ? -_xmm4 dq 2 dup ? -_xmm5 dq 2 dup ? -_xmm6 dq 2 dup ? -_xmm7 dq 2 dup ? +_xmm0 dq 2 dup ? +_xmm1 dq 2 dup ? +_xmm2 dq 2 dup ? +_xmm3 dq 2 dup ? +_xmm4 dq 2 dup ? +_xmm5 dq 2 dup ? +_xmm6 dq 2 dup ? +_xmm7 dq 2 dup ? oldssecontext rb $-sse_context avx_context: -_ymm0 dq 4 dup ? -_ymm1 dq 4 dup ? -_ymm2 dq 4 dup ? -_ymm3 dq 4 dup ? -_ymm4 dq 4 dup ? -_ymm5 dq 4 dup ? -_ymm6 dq 4 dup ? -_ymm7 dq 4 dup ? +_ymm0 dq 4 dup ? +_ymm1 dq 4 dup ? +_ymm2 dq 4 dup ? +_ymm3 dq 4 dup ? +_ymm4 dq 4 dup ? +_ymm5 dq 4 dup ? +_ymm6 dq 4 dup ? +_ymm7 dq 4 dup ? oldavxcontext rb $-avx_context step_num dd 0 proc_num dd 0 -dumpread dd ? -dumppos dd ? -dumpdata rb dump_height*10h +dumpread dd ? +dumppos dd ? +dumpdata rb dump_height*10h ; breakpoint structure: ; dword +0: address @@ -2896,25 +2504,25 @@ dumpdata rb dump_height*10h ; byte +5: overwritten byte ; for DRx breaks: flags + (index shl 6) breakpoints_n = 256 -breakpoints rb breakpoints_n*6 -drx_break rd 4 +breakpoints rb breakpoints_n*6 +drx_break rd 4 -disasm_buf_size dd ? +disasm_buf_size dd ? -symbols dd ? -num_symbols dd ? +symbols dd ? +num_symbols dd ? -bReload db ? +bReload db ? needzeroend: -disasm_buffer rb 256 -disasm_start_pos dd ? -disasm_cur_pos dd ? -disasm_cur_str dd ? -disasm_string rb 256 +disasm_buffer rb 256 +disasm_start_pos dd ? +disasm_cur_pos dd ? +disasm_cur_str dd ? +disasm_string rb 256 -i_param rb 256 +i_param rb 256 ; stack align 400h diff --git a/programs/develop/mtdbg/symbols.inc b/programs/develop/mtdbg/symbols.inc new file mode 100644 index 0000000000..86271820f7 --- /dev/null +++ b/programs/develop/mtdbg/symbols.inc @@ -0,0 +1,452 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; Working with program symbols ;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +include 'sort.inc' + +; compare proc for sorter +compare: + cmpsd + jnz @f + cmp esi, edi + + @@: + ret + +; compare proc for sorter 2 +compare2: + cmpsd + + @@: + cmpsb + jnz @f + cmp byte [esi-1], 0 + jnz @b + cmp esi, edi + + @@: + ret + +free_symbols: + mov ecx, [symbols] + jecxz @f + mcall 68, 13 + and [symbols], 0 + and [num_symbols], 0 + + @@: + ret + + +;----------------------------------------------------------------------------- +; Load symbols event + +OnLoadSymbols.fileerr: + test ebp, ebp + jz @f + mcall 68, 13, edi + ret + + @@: + push eax + mcall 68, 13, edi + mov esi, aCannotLoadFile + call put_message_nodraw + pop eax + cmp eax, 0x20 + jae .unk + mov esi, [load_err_msgs + eax*4] + test esi, esi + jnz put_message + + .unk: + mov esi, unk_err_msg2 + jmp put_message + + +OnLoadSymbols: + xor ebp, ebp +; load input file + mov esi, [curarg] + call free_symbols + + .silent: +; esi = ptr to symbols filename + xor edi, edi + cmp [num_symbols], edi ; Any previously loaded symbols? + je .loadfile + call free_symbols ; Yep, free them + + .loadfile: + mov ebx, fn70_attr_block ; Get file attributes + mov [ebx+21], esi + mcall 70 + test eax, eax + jnz .fileerr + cmp dword [fileattr+36], edi ; Is upper dword of filesize larger then 0? + jnz .memerr + mov ecx, dword [fileattr+32] ; Lower dword of filesize + mcall 68, 12 ; allocate the memory + test eax, eax + jz .memerr + mov edi, eax + mov ebx, fn70_read_block + mov [ebx+12], ecx + mov [ebx+16], edi + mov [ebx+21], esi + mcall 70 ; Read the file into the allocated buffer + test eax, eax + jnz .fileerr + + +; calculate memory requirements to load debug symbols + + lea edx, [ecx+edi-1] ; edx = EOF-1 + mov esi, edi + xor ecx, ecx + + mov [symbol_section], 1 ;;;;; + + .calcloop: + cmp esi, edx + jae .calcdone + cmp byte[esi], ' ' ; skip spaces at the beginning of a line + jne .not_space + inc esi + jmp .calcloop + .not_space: + cmp byte[esi], '.' + jne .not_section + inc esi + mov [symbol_section], 0 + cmp dword[esi], 'text' + jne .skipline + inc [symbol_section] + jmp .skipline + .not_section: + cmp [symbol_section], 0 + je .skipline + + cmp word[esi], '0x' + jne .skipline + inc esi + inc esi + + @@: + cmp esi, edx + jae .calcdone + lodsb + or al, 20h + sub al, '0' + cmp al, 9 + jbe @b + sub al, 'a'-'0'-10 + cmp al, 15 + jbe @b + dec esi + + @@: + cmp esi, edx + ja .calcdone + lodsb + cmp al, 20h + je @b + jb .calcloop + cmp al, 9 + jz @b + add ecx, 12+1 + inc [num_symbols] + + @@: + inc ecx + cmp esi, edx + ja .calcdone + lodsb + cmp al, 0xD + jz .calcloop + cmp al, 0xA + jz .calcloop + jmp @b + + .skipline: + cmp esi, edx + jae .calcdone + lodsb + cmp al, 0xD + jz .calcloop + cmp al, 0xA + jz .calcloop + jmp .skipline + + .calcdone: + +; Allocate memory to place the debug symbols in + + mcall 68, 12 + test eax, eax + jnz .memok + inc ebx + mov ecx, edi + mov al, 68 + mcall + + .memerr: + mov esi, aNoMemory + jmp put_message + + .memok: + mov [symbols], eax + mov ebx, eax + push edi + mov esi, edi + mov edi, [num_symbols] + lea ebp, [eax+edi*4] + lea edi, [eax+edi*8] + +; Actual loading of the debug symbols +; esi->input, edx->EOF, ebx->ptrs, edi->names + + mov [symbol_section], 1 ;;;;; + + .readloop: + cmp esi, edx + jae .readdone + cmp byte[esi], ' ' + jne .not_space2 + inc esi + jmp .readloop + .not_space2: + cmp byte[esi], '.' + jne .not_section2 + inc esi + mov [symbol_section], 0 + cmp dword[esi], 'text' + jne .readline + inc [symbol_section] + jmp .readline + .not_section2: + cmp [symbol_section], 0 + je .readline + + cmp word[esi], '0x' + jnz .readline + inc esi + inc esi + xor eax, eax + xor ecx, ecx + + @@: + shl ecx, 4 + add ecx, eax + cmp esi, edx + jae .readdone + lodsb + or al, 20h + sub al, '0' + cmp al, 9 + jbe @b + sub al, 'a'-'0'-10 + cmp al, 15 + jbe @b + dec esi + + @@: + cmp esi, edx + ja .readdone + lodsb + cmp al, 20h + jz @b + jb .readloop + cmp al, 9 + jz @b + mov dword [ebx], edi + add ebx, 4 + mov dword [ebp], edi + add ebp, 4 + mov dword [edi], ecx + add edi, 4 + stosb + + @@: + xor eax, eax + stosb + cmp esi, edx + ja .readdone + lodsb + cmp al, 0xD + jz .readloop + cmp al, 0xA + jz .readloop + mov byte [edi-1], al + jmp @b + + .readline: + cmp esi, edx + jae .readdone + lodsb + cmp al, 0xD + jz .readloop + cmp al, 0xA + jz .readloop + jmp .readline + + .readdone: + pop ecx + mcall 68, 13 + mov ecx, [num_symbols] + mov edx, [symbols] + mov ebx, compare + call sort + mov ecx, [num_symbols] + lea edx, [edx+ecx*4] + mov ebx, compare2 + call sort + mov esi, aSymbolsLoaded + call put_message + jmp draw_disasm.redraw + +;----------------------------------------------------------------------------- +; +; in: EAX = address +; out: ESI, CF + +find_symbol: + cmp [num_symbols], 0 + jnz @f + + .ret0: + xor esi, esi + stc + ret + + @@: + push ebx ecx edx + xor edx, edx + mov esi, [symbols] + mov ecx, [num_symbols] + mov ebx, [esi] + cmp [ebx], eax + jz .donez + jb @f + pop edx ecx ebx + jmp .ret0 + + @@: + ; invariant: symbols_addr[edx] < eax < symbols_addr[ecx] + ; TODO: add meaningful label names + .0: + push edx + + .1: + add edx, ecx + sar edx, 1 + cmp edx, [esp] + jz .done2 + mov ebx, [esi+edx*4] + cmp [ebx], eax + jz .done + ja .2 + mov [esp], edx + jmp .1 + + .2: + mov ecx, edx + pop edx + jmp .0 + + .donecont: + dec edx + + .done: + test edx, edx + jz @f + mov ebx, [esi+edx*4-4] + cmp [ebx], eax + jz .donecont + + @@: + pop ecx + + .donez: + mov esi, [esi+edx*4] + add esi, 4 + pop edx ecx ebx + clc + ret + + .done2: + lea esi, [esi+edx*4] + pop ecx edx ecx ebx + stc + ret + +;----------------------------------------------------------------------------- +; +; in: esi->name +; out: if found: CF = 0, EAX = value +; otherwise CF = 1 +find_symbol_name: + cmp [num_symbols], 0 + jnz @f + + .stc_ret: + stc + ret + + @@: + push ebx ecx edx edi + push -1 + pop edx + mov ebx, [symbols] + mov ecx, [num_symbols] + lea ebx, [ebx+ecx*4] + + ; invariant: symbols_name[edx] < name < symbols_name[ecx] + .0: + push edx + + .1: + add edx, ecx + sar edx, 1 + cmp edx, [esp] + jz .done2 + call .cmp + jz .done + jb .2 + mov [esp], edx + jmp .1 + + .2: + mov ecx, edx + pop edx + jmp .0 + + .done: + pop ecx + + .donez: + mov eax, [ebx+edx*4] + mov eax, [eax] + pop edi edx ecx ebx + clc + ret + + .done2: + pop edx edi edx ecx ebx + stc + ret + + .cmp: + mov edi, [ebx+edx*4] + push esi + add edi, 4 + + @@: + cmpsb + jnz @f + cmp byte [esi-1], 0 + jnz @b + + @@: + pop esi + ret \ No newline at end of file