diff --git a/programs/system/board/trunk/board.asm b/programs/system/board/trunk/board.asm index 7cae5fdbd5..06e6297901 100644 --- a/programs/system/board/trunk/board.asm +++ b/programs/system/board/trunk/board.asm @@ -1,1281 +1,480 @@ -;------------------------------------------------------------------------------- -; DEBUG BOARD v1.0.1 for APPLICATIONS and KERNEL DEVELOPMENT +;------------------------------------------------------------------------------ +; DEBUG BOARD for APPLICATIONS and KERNEL DEVELOPMENT ; See f63 ; Compile with FASM for KolibriOS -;------------------------------------------------------------------------------- - use32 - org 0 - db "MENUET01" - dd 1 - dd START - dd I_END - dd MEM_END - dd STACK_TOP - dd PARAMS_STRING - dd 0 -;------------------------------------------------------------------------------- - include "lang.inc" - include "../../../macros.inc" - - purge newline -MAX_STRINGS = 45 -STRING_LENGTH = 80 ;must be a multiple of 4 -LINE_HEIGHT = 16 -WINDOW_W = 60*8+5*2 -WINDOW_W_MIN = 330 -WORK_AREA_H_MIN = 60 -WINDOW_W_PRCNT = 40 -WINDOW_H_PRCNT = 75 -TEXTFIELD_H = MAX_STRINGS*LINE_HEIGHT -FONT_TYPE = 0x50000000 -;------------------------------------------------------------------------------- -START: - mcall 68, 11 ;init heap - - call parse_params_string - test eax, eax - jnz .no_params - call check_and_fix_params - -.no_params: - call STATE_handler - - mov ecx, MAX_STRINGS*(STRING_LENGTH/4) - mov edi, text1 - mov eax, " " - push ecx - rep stosd - - pop ecx - mov edi, text2 - rep stosd - - cmp [params.daemon_mode], 1 - je .create_log_file - - call calc_window_size - mov ax, word [xstart+2] - mov [prev_win_x], ax - mov ax, word [ystart+2] - mov [prev_win_y], ax - mov ax, word [xstart] - mov [prev_win_w], ax - mov ax, word [ystart] - mov [prev_win_h], ax - - cmp [fullscreen_mode], 0 - je @f - call calc_fullscreen_window_size - -@@: - mcall 48, 3, sc, sizeof.system_colors - - xor eax, eax - mov [vmode], eax - mov dword [text1-4], eax - mov dword [text1-8], eax - mov dword [text2-4], eax - mov dword [text2-8], eax - mov [krnl_cnt], eax - mov [hl_line_count], eax - -.create_log_file: - xor eax, eax - mov byte [buffer_length], al - mov [filepos], eax - - cmp [params.logging_mode], 0 - je @f - - mov esi, [log_filename] - call create_file - jnc @f - mov esi, default_log_filename - mov [log_filename], default_log_filename - call create_file - -@@: - cmp [params.daemon_mode], 0 - je .red - mcall 40, 0 ;set event mask (do not receive any event codes) - -.red: - cmp [params.daemon_mode], 1 - je .still - mcall 9, procinfo, -1 ;get info about board process - mov eax, dword [procinfo+42] ;width of board window - mov edx, WINDOW_W_MIN - cmp eax, edx - jae @f - mcall 67, -1, -1, WINDOW_W_MIN, -1 ;resize window - mov dword [procinfo+42], edx - -@@: - mcall 48, 4 ; get window header height - mov [window_header_height], eax - mov esi, WORK_AREA_H_MIN - add esi, eax - mov eax, dword [procinfo+46] ;height of board window - cmp eax, esi - jae @f - mcall 67, -1, -1, -1 ;resize window - mov dword [procinfo+46], esi - -@@: - call draw_window - -.still: - cmp byte [buffer_length], 0 - je @f - cmp [params.logging_mode], 0 - je @f - call write_buffer - -@@: - cmp [params.daemon_mode], 0 - je @f - mcall 5, 50 ;pause for 0.5 sec - jmp .read_byte -@@: - mcall 23, 50 ; wait here for event - dec eax ; redraw request ? - jz .red - - dec eax ; key in buffer ? - jz .key - - dec eax ; button in buffer ? - jz .button - -.read_byte: - mcall 63, 2 ;read a byte from the debug buffer - cmp ebx, 1 - je .new_data - jne .still - -.key: - mcall 2 - cmp ah, " " - jne @f - not [vmode] - and [vmode], 1 - jmp .red -@@: - cmp ah, 51 ; F2 - je .open_boardlog - cmp ah, 0x1B ;[Esc]? - je terminate_board - cmp ah, 0x44 ;[F11]? - jne .still - cmp [fullscreen_mode], 0 - jne @f - mov [fullscreen_mode], 1 - mcall 9, procinfo, -1 ;get info about process - mov ax, word [ebx+34] - mov [prev_win_x], ax - mov ax, word [ebx+38] - mov [prev_win_y], ax - mov ax, word [ebx+42] - mov [prev_win_w], ax - mov ax, word [ebx+46] - mov [prev_win_h], ax - call calc_fullscreen_window_size - movzx ebx, word [xstart+2] - movzx ecx, word [ystart+2] - movzx edx, word [xstart] - movzx esi, word [ystart] - mcall 67 ;change window size & position - jmp .still - -@@: - mov [fullscreen_mode], 0 - mcall 71, 2, title, 1 ;set window caption - mcall 18, 25, 2, -1, 0 ;set window position (usual) - mov [already_on_top], 0 - movzx ebx, word [prev_win_x] - movzx ecx, word [prev_win_y] - movzx edx, word [prev_win_w] - movzx esi, word [prev_win_h] - mcall 67 ;change window size & position - -@@: - jmp .still - -.open_boardlog: - mov eax, [log_filename] - mov [open_log_in_tinypad+8], eax - mcall 70, open_log_in_tinypad - jmp .red - -.button: - mcall 17 ; get id - cmp ah, 1 ; button id=1 ? - jne .button.noclose - -.exit: - jmp terminate_board -.button.noclose: - cmp ah, 3 - jne @f - mov [vmode], 0 - jmp .red -@@: - cmp ah, 4 - jne @f - mov [vmode], 1 -@@: - jmp .red - -.new_data: - cmp byte [buffer_length], 255 - jne @f - cmp [params.logging_mode], 0 - je @f - call write_buffer - -@@: - movzx ebx, byte [buffer_length] - mov [ebx+tmp], al - inc byte [buffer_length] - cmp [params.daemon_mode], 1 - je .read_byte - mov ebp, [targ] - cmp al, 10 - jz .new_line - cmp al, 13 - jz .new_check - jmp .char - -.new_line: - and [ebp-8], dword 0 - inc dword [ebp-4] - cmp [ebp-4], dword MAX_STRINGS - jb .noypos - mov [ebp-4], dword MAX_STRINGS-1 - lea esi, [ebp+STRING_LENGTH] - mov edi, ebp - mov ecx, (MAX_STRINGS-1)*(STRING_LENGTH/4) - cld - rep movsd - - mov esi, [ebp-4] - imul esi, STRING_LENGTH - add esi, [ebp-8] - add esi, ebp - mov ecx, STRING_LENGTH/4 - mov eax, " " - rep stosd - -.noypos: - mov [targ], text1 - and [krnl_cnt], 0 - jmp .new_check - -.char: - cmp ebp, text2 - je .add2 - mov ecx, [krnl_cnt] - cmp al, [krnl_msg+ecx] - jne .nokrnl - inc [krnl_cnt] - cmp [krnl_cnt], 4 - jne .new_check - mov [targ], text2 -.nokrnl: - mov ebp, [targ] - jecxz .add - push eax - mov esi, krnl_msg -.l1: - lodsb - call add_char - loop .l1 - pop eax -.add: - and [krnl_cnt], 0 -.add2: - call add_char - -.new_check: - mcall 63, 2 ;read a byte from the debug buffer - cmp ebx, 1 - je .new_data - - cmp [params.daemon_mode], 1 - je .still - call draw_text - - jmp .still -;------------------------------------------------------------------------------- +;------------------------------------------------------------------------------ +use32 +org 0 + db 'MENUET01' + dd 1 + dd START + dd I_END + dd mem + dd mem + dd filename + dd 0 +;------------------------------------------------------------------------------ +include 'lang.inc' +include '../../../macros.inc' +include '../../../debug.inc' +purge newline +;SMALL FONT +MAXSTRINGS = 45 +LINE_H = 10 +WINDOW_W = 399 +WINDOW_H = MAXSTRINGS*LINE_H+45 +FONT_TYPE = 0x40000000 +;BIG FONT +; MAXSTRINGS = 30 +; LINE_H = 15 +; WINDOW_W = 630 +; WINDOW_H = MAXSTRINGS*LINE_H+50 +; FONT_TYPE = 0x50000000 ;------------------------------------------------------------------------------ -add_char: - push esi - mov esi, [ebp-4] - imul esi, STRING_LENGTH - add esi, [ebp-8] - mov [ebp+esi], al - cmp dword [ebp-8], STRING_LENGTH-1 - je .ok - inc dword [ebp-8] -.ok: - pop esi - ret -;------------------------------------------------------------------------------- - -calc_fullscreen_window_size: -;------------------------------------------------------------------------------- - push eax - - mcall 14 ;get screen size -; inc ax - mov word [ystart], ax - shr eax, 16 -; inc ax - mov word [xstart], ax - xor eax, eax - mov word [xstart+2], ax - mov word [ystart+2], ax - - pop eax - ret -;------------------------------------------------------------------------------- - -calc_window_size: -;------------------------------------------------------------------------------- - pusha - - mcall 48, 5 ;get screen working area size - mov [ystart], ebx - ror eax, 16 - ror ebx, 16 - mov [xstart], eax - movzx ecx, ax - movzx edx, bx - shr eax, 16 - shr ebx, 16 - sub eax, ecx - sub ebx, edx - inc eax - inc ebx - - mov ecx, 100 - mov edx, WINDOW_W_PRCNT - mul edx - xor edx, edx - div ecx - cmp ax, WINDOW_W_MIN - jae @f - mov ax, WINDOW_W_MIN +START: + call CheckUnique + mov edi, filename + cmp [edi], byte 0 + jnz param + mov esi, default_filename @@: - mov word [xstart], ax - sub word [xstart+2], ax - mov eax, ebx - mov edx, WINDOW_H_PRCNT - mul edx - xor edx, edx - div ecx - mov dx, ax - mov cx, WORK_AREA_H_MIN - mcall 48, 4 ; get window header height - add ax, cx - cmp dx, ax - jae @f - mov dx, ax -@@: - mov word [ystart], dx - - popa - ret -;------------------------------------------------------------------------------- + lodsb + stosb + test al,al + jnz @b +param: + mov ecx, (MAXSTRINGS+1)*20 + mov edi, text1 + mov eax, ' ' + rep stosd -;------------------------------------------------------------------------------- + mov ecx, (MAXSTRINGS+1)*20 + mov edi, text2 + rep stosd + + mov byte [tmp1], 'x' + mov byte [tmp2], 'x' + + mcall 14 + and eax, 0xffff0000 + sub eax, WINDOW_W shl 16 + add eax, WINDOW_W + mov [xstart], eax + mcall 48, 3, sc, sizeof.system_colors + + mov esi, filename + call CreateFile +;------------------------------------------------------------------------------ +red: + call draw_window +;------------------------------------------------------------------------------ +still: + cmp [buffer_length], 0 + je @f + call write_buffer +@@: + mcall 23, 50 ; wait here for event + cmp eax, 1 ; redraw request ? + je red + + cmp eax, 2 ; key in buffer ? + je key + + cmp eax, 3 ; button in buffer ? + je button + + mcall 63, 2 + cmp ebx, 1 + jne still + +new_data: + cmp [buffer_length], 255 + jne @f + call write_buffer +@@: + movzx ebx, byte[buffer_length] + mov [ebx+tmp], al + inc [buffer_length] + mov ebp, [targ] + cmp al, 10 + jz new_line + cmp al, 13 + jz new_check + jmp char +;------------------------------------------ write_buffer: - pusha - - mov edx, tmp - movzx ecx, byte [buffer_length] - mov esi, [log_filename] - mov ebx, ecx - + pusha + mov edx, tmp + movzx ecx, byte[buffer_length] + mov esi, filename .write_to_logfile: - call write_to_file - cmp eax, 5 - jne @f - mov esi, [log_filename] - mov [filepos], 0 - call create_file - jnc .write_to_logfile -; mov [params.logging_mode], 0 - jmp .ret + call WriteToFile + cmp eax, 5 + jne @f + mov esi, filename + mov [filepos], 0 + call CreateFile + jnc .write_to_logfile @@: - add [filepos], ebx - xor eax, eax - mov byte [buffer_length], al - -.ret: - popa - ret -;------------------------------------------------------------------------------- + movzx eax,byte[buffer_length] + add [filepos],eax + xor eax,eax + mov [buffer_length],al + popa + ret +;------------------------------------------ +new_line: + and [ebp-8], dword 0 + inc dword [ebp-4] + cmp [ebp-4], dword MAXSTRINGS + jbe .noypos + mov [ebp-4], dword MAXSTRINGS + lea esi, [ebp+80] + mov edi, ebp + mov ecx, 20*(MAXSTRINGS) + cld + rep movsd -;------------------------------------------------------------------------------- -parse_params_string: -;result: eax = 0 (OK), eax = -1 (no params string), -2 (wrong params string) - xor eax, eax - pusha - - mov esi, PARAMS_STRING - mov ecx, 256 - - cmp byte [esi], 0 - je .no_params_string - -@@: - call skip_spaces - call check_param - inc eax - jz .no_params_string - inc eax - jz .wrong_params_string - cmp byte [esi], 0 - je .ok - loop @b + mov esi, [ebp-4] + imul esi, 80 + add esi, [ebp-8] + add esi, ebp + mov ecx, 20 + mov eax, ' ' + rep stosd +.noypos: + mov [targ],text2 + and [krnl_cnt],0 + jmp new_check +;------------------------------------------ +char: + cmp ebp, text1 + je add2 + mov ecx, [krnl_cnt] + cmp al, [krnl_msg+ecx] + jne .noknl + inc [krnl_cnt] + cmp [krnl_cnt], 4 + jne new_check + mov [targ], text1 +.noknl: + mov ebp, [targ] + jecxz .add + push eax + mov esi, krnl_msg +.l1: + lodsb + call add_char + loop .l1 + pop eax +.add: + and [krnl_cnt], 0 +add2: + call add_char -.ok: - popa - - ret - -.no_params_string: - popa - - dec eax - - ret - -.wrong_params_string: - popa - - dec eax - dec eax - - ret - -;------------------------------------------------------------------------------- - -;------------------------------------------------------------------------------- -skip_spaces: - push eax - cld -.0: - lodsb - cmp al, " " - je @f - cmp al, 9 ;skip tabs too - jne .ret -@@: - loop .0 - -.ret: - dec esi - - pop eax - ret -;------------------------------------------------------------------------------- - -;------------------------------------------------------------------------------- -check_param: - push ebx - - test ecx, ecx - jz .empty - - cld - lodsb - test al, al - jnz @f - dec esi - jmp .empty - -@@: - cmp al, "-" - jne .not_option - dec ecx - lodsb - test al, al - jz .wrong_option - cmp al, " " - je .wrong_option - cmp al, 9 - je .wrong_option - - dec esi - call check_option - inc eax - jnz .ok - -.wrong_option: - lea esi, [esi-2] - jmp .wrong - -.not_option: - cmp [params.log_filename_found], 1 - je .wrong - mov [params.log_filename], esi - cmp al, '"' - je .quoted - dec [params.log_filename] - xor ebx, ebx - inc ebx - dec ecx - -@@: - lodsb - test al, al - jz @f - cmp al, " " - je @f - cmp al, 9 - je @f - inc ebx - loop @b - dec ebx - -@@: - dec esi - mov [params.log_filename_found], 1 - mov [params.log_filename.size], ebx - jmp .ok - -.quoted: - xor ebx, ebx - dec ecx -.quoted.0: - lodsb - test al, al - jnz @f - lea ecx, [ecx+ebx+1] - lea esi, [esi-2] - sub esi, ebx - jmp .wrong -@@: - cmp al, '"' - je @f - inc ebx - loop .quoted.0 - lea ecx, [ecx+ebx+1] - lea esi, [esi-2] - sub esi, ebx - jmp .wrong - -@@: - mov al, byte [esi] - test al, al - jz @f - cmp al, " " - je @f - cmp al, 9 - jne .wrong ;there must be spaces or null after closing (final) quote mark -@@: - mov [params.log_filename_found], 1 - mov [params.log_filename.size], ebx - - -.ok: - xor eax, eax - - pop ebx - ret - -.empty: - xor eax, eax - dec eax - - pop ebx - ret - -.wrong: - xor eax, eax - dec eax - dec eax - - pop ebx - ret -;------------------------------------------------------------------------------- - -;------------------------------------------------------------------------------- -check_option: - push ebx edi - lea ebx, [esi-1] - cmp byte [esi], "-" - je .long_option - - cld -@@: - lodsb - test al, al - jz .ok - cmp al, " " - je .ok - cmp al, 9 - je .ok - call .subcheck - test eax, eax - jz .wrong - loop @b - -.subcheck: - cmp al, "d" - jne @f - mov [params.daemon_mode], 1 - ret - -@@: - cmp al, "s" - jne @f - mov [params.stop_daemon_flag], 1 - ret - -@@: - cmp al, "n" - jne @f - mov [params.logging_mode], 0 - ret - -@@: - cmp al, "r" - jne @f - mov [params.rewrite_log_flag], 1 - ret - -@@: - cmp al, "f" - jne @f - mov [fullscreen_mode], 1 - ret - +new_check: + mcall 63, 2 + cmp ebx, 1 + je new_data + call draw_text + jmp still +;------------------------------------------------------------------------------ +key: + mcall 2 + cmp ah, ' ' + je button.noclose + cmp ah, 51 ; F2 + je open_boardlog + jmp still +open_boardlog: + mcall 70, open_log_in_tinypad + jmp red - - -@@: - xor eax, eax - ret - - -.long_option: - lodsb - dec ecx - jz .wrong - mov edi, esi - push esi - cmp ecx, params.options.d.size-1 - jl @f - mov esi, params.options.d - call cmp_str - jnz @f - pop esi - lea ecx, [ecx-params.options.d.size-1] - lea esi, [esi+params.options.d.size-1] - mov [params.daemon_mode], 1 - jmp .long_option.0 - -@@: - cmp ecx, params.options.s.size-1 - jl @f - mov esi, params.options.s - call cmp_str - jnz @f - pop esi - lea ecx, [ecx-params.options.s.size-1] - lea esi, [esi+params.options.s.size-1] - mov [params.stop_daemon_flag], 1 - jmp .long_option.0 - -@@: - cmp ecx, params.options.n.size-1 - jl @f - mov esi, params.options.n - call cmp_str - jnz @f - pop esi - lea ecx, [ecx-params.options.n.size-1] - lea esi, [esi+params.options.n.size-1] - mov [params.logging_mode], 0 - jmp .long_option.0 - -@@: - cmp ecx, params.options.r.size-1 - jl @f - mov esi, params.options.r - call cmp_str - jnz @f - pop esi - lea ecx, [ecx-params.options.r.size-1] - lea esi, [esi+params.options.r.size-1] - mov [params.rewrite_log_flag], 1 - jmp .long_option.0 - -@@: - cmp ecx, params.options.f.size-1 - jl @f - mov esi, params.options.f - call cmp_str - jnz @f - pop esi - lea ecx, [ecx-params.options.f.size-1] - lea esi, [esi+params.options.f.size-1] - mov [fullscreen_mode], 1 - jmp .long_option.0 - -@@: - pop esi - jmp .wrong - -.long_option.0: - mov al, byte [esi] - test al, al - jz @f - cmp al, " " - je @f - cmp al, 9 - jne .wrong ;there must be spaces or null after long option -@@: - inc esi - +;------------------------------------------------------------------------------ +button: + mcall 17 ; get id + cmp ah, 1 ; button id=1 ? + jne .noclose + or eax, -1 ; close this program + mcall +.noclose: + xor [vmode], 1 + jmp red +;------------------------------------------------------------------------------ +add_char: + push esi + mov esi, [ebp-4] + imul esi, 80 + add esi, [ebp-8] + mov [ebp+esi], al + inc dword[ebp-8] + cmp dword[ebp-8], 80 + jb .ok + mov dword[ebp-8], 79 .ok: - dec esi - xor eax, eax - - pop edi ebx - ret - -.wrong: - xor eax, eax - dec eax - pop edi esi - ret -;------------------------------------------------------------------------------- + pop esi + ret -check_and_fix_params: -;------------------------------------------------------------------------------- - push eax - - cmp [params.daemon_mode], 1 - jne @f - mov [params.stop_daemon_flag], 0 - mov [params.logging_mode], 1 - -@@: - mov eax, [params.log_filename] - test eax, eax - jz @f - mov [log_filename], eax - add ebx, [params.log_filename.size] - mov byte [eax+ebx], 0 - -@@: - pop eax - ret -;------------------------------------------------------------------------------- - -;------------------------------------------------------------------------------- -;************************ WINDOW DEFINITIONS AND DRAW ************************ -;------------------------------------------------------------------------------- +;------------------------------------------------------------------------------ +;************************ WINDOW DEFINITIONS AND DRAW ************************ +;------------------------------------------------------------------------------ draw_window: - mcall 12, 1 ; start of draw - xor edx, edx - mov dl, 0x13 - cmp [fullscreen_mode], 0 - je @f - mov dl, 1 ;set fullscreen mode window - -@@: - shl edx, 24 - or edx, 0xFFFFFF - xor esi, esi - mcall 0,[xstart],[ystart],,,title - - cmp [fullscreen_mode], 0 - je .l0 - - cmp [already_on_top], 1 - je @f - mcall 18, 25, 2, -1, 1 ;set window position (always on top) - mov [already_on_top], 1 - -@@: - mcall 13, [xstart], [ystart], 0xFFFFFF ;draw a rectangle (fill the window) - -.l0: - mov ebx, 15 shl 16+(8*4+5) - xor ecx, ecx - cmp [fullscreen_mode], 1 - je @f - mov ecx, [window_header_height] - -@@: - add ecx, 5 - shl ecx, 16 - mov cx, LINE_HEIGHT+5 - mov eax, [sc.work_button] - cmp [vmode], 0 - jne @f - call lighten_color ;make button lighter if it's active -@@: - mov esi, eax - mcall 8,,,3 ;'User' button - - push ebx ecx - - shr ecx, 16 - mov bx, cx - rol ebx, 16 - add bx, 3 - ror ebx, 16 - add bx, 4 - mov ecx, 0x90 - shl ecx, 24 - add ecx, [sc.work_button_text] - mcall 4,,, u_button_text - cmp [vmode], 0 - jne @f - add ebx, 1 shl 16 - mcall ;make text bolder if the button is active - -@@: - pop ecx ebx - - add ebx, (8*4+10) shl 16 - mov bx, (8*6+5+5) - mov eax, [sc.work_button] - cmp [vmode], 1 - jne @f - call lighten_color ;make button lighter if it's active -@@: - mov esi, eax - mcall 8,,,4 ;'Kernel' button - - shr ecx, 16 - mov bx, cx - rol ebx, 16 - add bx, 3 - ror ebx, 16 - add bx, 4 - mov ecx, 0x90 - shl ecx, 24 - add ecx, [sc.work_button_text] - mcall 4,,, k_button_text - cmp [vmode], 1 - jne @f - add ebx, 1 shl 16 - mcall ;make text bolder if the button is active - -@@: - call draw_text - mcall 12, 2 ; 2, end of draw - ret -;------------------------------------------------------------------------------- - -;------------------------------------------------------------------------------- + mcall 12, 1 ; 1, start of draw + mcall 48, 5 ; GetClientTop + shr ebx, 16 + mov ecx, ebx + shl ecx, 16 + add ecx, WINDOW_H ; [y start] *65536 + [y size] + mov edx, 0xffffff + or edx, 0x14000000 + xor esi, esi + mcall 0,[xstart],,,,title + mov ebx, 296 shl 16+31 + mcall 8,,<4,13>,3,[sc.work_button] + mov edx, [vmode] + lea edx, [edx*4+duk] + mov ecx, 0x80 + shr ecx, 24 + add ecx, [sc.work_button_text] + mcall 4,<300,7>,,,4 + call draw_text + mcall 12, 2 ; 2, end of draw + ret +;------------------------------------------------------------------------------ draw_text: - mov ebx, 15 shl 16 + 0 - xor bx, bx - cmp [fullscreen_mode], 1 - je @f - mov bx, word [window_header_height] - -@@: - add bx, 5+(LINE_HEIGHT+5)+5 ;space between window header and textfield - mov ecx, FONT_TYPE - mov edi, 0xFFFFFF - mov edx, text2 - cmp [vmode], 1 - je .kern - mov edx, text1 + mov ebx, 15*65536+30 ; draw info text with function 4 + xor ecx, ecx + or ecx, FONT_TYPE + mov edi, 0xffffff + mov edx, text1 + cmp [vmode], 0 + je .kern + mov edx, text2 .kern: - push ebx edx - - - - mov eax, dword [procinfo+42] ;x-size of board window - sub eax, 15*2 - xor edx, edx - mov ebx, 8 - div ebx - + push ebx ecx edx + mcall 9, procinfo,-1 + mov eax, [ebx+42] + xor edx, edx + mov ebx, 6 + div ebx + pop edx ecx ebx + mov esi, 80 + cmp eax, esi + ja @f + mov esi, eax @@: - cmp [vmode], 1 - jne @f - add eax, 4 - + cmp esi, 5 + ja @f + mov esi, 5 @@: - mov esi, STRING_LENGTH - cmp eax, esi - ja @f - mov esi, eax + sub esi, 4 + mov eax, 4 +newline: + mcall + add ebx, LINE_H + add edx, 80 + cmp [edx], byte 'x' + jne newline + ret -@@: - mov eax, dword [procinfo+46] ;y-size of board window - cmp [fullscreen_mode], 1 - je @f - sub eax, [window_header_height] - -@@: - sub eax, 5+(LINE_HEIGHT+5)+5+5 - xor edx, edx - mov ebx, 16 - div ebx - - pop edx ebx - - mov ebp, [edx-4] ;[edx-4] = count of strings - cmp eax, ebp - ja @f - mov ebp, eax - -@@: - test ebp, ebp - jz .ret - mov eax, 4 -.newline: - cmp [edx], dword "K : " - jne .no_k_prefix - - push edx esi - add edx, 4 - sub esi, 4 - - push ecx esi edi - mov ecx, STRING_LENGTH-4 - mov edi, edx - - mov esi, proc_fors_term - call cmp_str - jz .highlight - - mov esi, proc_fors_term_sp - call cmp_str - jnz .no_fors_term - -.highlight: - lea edi, [edx+STRING_LENGTH*7] - mov esi, unexp_end_of_stack - call cmp_str - jnz @f - mov [hl_line_count], 8 - jmp .no_fors_term -@@: - mov [hl_line_count], 10 - -.no_fors_term: - pop edi esi ecx - push ecx - cmp [hl_line_count], 0 - je @f - and ecx, 0xFF000000 - or ecx, 0xCC0000 ;red - dec [hl_line_count] -@@: - mcall ; draw info text with function 4 - pop ecx - pop esi edx - jmp @f -.no_k_prefix: - mcall -@@: - add ebx, LINE_HEIGHT - add edx, STRING_LENGTH - dec ebp - jnz .newline -.ret: - ret -;------------------------------------------------------------------------------- - -cmp_str: -;------------------------------------------------------------------------------- - pusha - -@@: - lodsb - test al, al - jz .ret - scasb - loope @b - xor eax, eax - inc eax - -.ret: - popa - ret -;------------------------------------------------------------------------------- - -;------------------------------------------------------------------------------- -lighten_color: - ror eax, 16 - add al, 20 - rol eax, 8 - add al, 20 - rol eax, 8 - add al, 20 - ret -;------------------------------------------------------------------------------- - -;------------------------------------------------------------------------------- -;* input: esi = pointer to the file name * -;------------------------------------------------------------------------------- -create_file: - pusha - - cmp [params.rewrite_log_flag], 1 - je .create - xor eax, eax - mov dword [f70_structure+0], 5 ; get file info - mov dword [f70_structure+4], eax ; reserved - mov dword [f70_structure+8], eax ; reserved - mov dword [f70_structure+12], eax ; reserved - mov dword [f70_structure+16], file_info ; file info buf pointer - mov dword [f70_structure+20], eax ; reserved - mov dword [f70_structure+21], esi ; pointer to the file name - mcall 70, f70_structure - cmp eax, 5 - je .create ;create file if it doesn't exist - test eax, eax - jnz .create - - cmp dword [file_info+36], 0 - jne .create - mov eax, dword [file_info+32] - mov [filepos], eax - - jmp .ret - -.create: - xor eax, eax - mov dword [f70_structure+0], 2 ; create file - mov dword [f70_structure+4], eax ; reserved - mov dword [f70_structure+8], eax ; reserved - mov dword [f70_structure+12], eax ; 0 bytes to write (just create) - mov dword [f70_structure+16], eax ; NULL data pointer (no data) - mov dword [f70_structure+20], eax ; reserved - mov dword [f70_structure+21], esi ; pointer to the file name - mcall 70, f70_structure - test eax, eax - jz .ret - stc -.ret: - popa - ret -;------------------------------------------------------------------------------- - - - - - - -;------------------------------------------------------------------------------- -;* input: esi = pointer to the file name * -;* edx = pointer to data buffer * -;* ecx = data length * -;------------------------------------------------------------------------------- -write_to_file: - push ebx - mov dword [f70_structure+0], 3 ; write to file - mov eax, [filepos] - mov dword [f70_structure+4], eax ; lower position addr - mov dword [f70_structure+8], 0 ; upper position addr (0 for FAT) - mov dword [f70_structure+12], ecx ; number of bytes to write - mov dword [f70_structure+16], edx ; pointer to data buffer - mov dword [f70_structure+20], 0 ; reserved - mov dword [f70_structure+21], esi ; pointer to the file name - mcall 70, f70_structure - clc - test eax, eax - jz .out - stc +;------------------------------------------------------------------------------ +;* input: esi = pointer to the file name * +;------------------------------------------------------------------------------ +CreateFile: + pusha + mov dword [InfoStructure+00], 2 ; create file + mov dword [InfoStructure+04], 0 ; reserved + mov dword [InfoStructure+08], 0 ; reserved + mov dword [InfoStructure+12], 0 ; 0 bytes to write (just create) + mov dword [InfoStructure+16], 0 ; NULL data pointer (no data) + mov dword [InfoStructure+20], 0 ; reserved + mov dword [InfoStructure+21], esi ; pointer to the file name + mcall 70, InfoStructure + test eax, eax + jz .out + stc .out: - pop ebx - ret -;------------------------------------------------------------------------------- + popa + ret +;------------------------------------------------------------------------------ +;* input: esi = pointer to the file name * +;* edx = pointer to data buffer * +;* ecx = data length * +;------------------------------------------------------------------------------ +WriteToFile: + push ebx + mov dword [InfoStructure+00], 3 ; write to file + mov eax, [filepos] + mov dword [InfoStructure+04], eax ; lower position addr + mov dword [InfoStructure+08], 0 ; upper position addr (0 for FAT) + mov dword [InfoStructure+12], ecx ; number of bytes to write + mov dword [InfoStructure+16], edx ; pointer to data buffer + mov dword [InfoStructure+20], 0 ; reserved + mov dword [InfoStructure+21], esi ; pointer to the file name + mcall 70, InfoStructure + clc + test eax, eax + jz .out + stc +.out: + pop ebx + ret -;------------------------------------------------------------------------------- -STATE_handler: - mcall 68, 22, STATE_shm_block.name,, 0x00 ;open "BOARDAPP:STATE" shared memory block (ro access) - test eax, eax - jz .create_STATE_shm_block - - mov ecx, 20*10 ;timeout = 20 sec -.0: - mov ebx, [eax] - test ebx, ebx - jz @f - mcall 5, 10 ;wait for 0.1 sec - loop .0 - jmp terminate_board - -@@: - mov ebx, [eax+4] - test ebx, ebx - jnz terminate_board - cmp dword [eax+12], 0 - jne @f - mov ecx, [eax+16] - mcall 18, 21 ;get slot number by PID - test eax, eax - jz terminate_board - mov ecx, eax - mcall 18, 3 ;activate board window - jmp terminate_board - -@@: - cmp [params.stop_daemon_flag], 1 - jne terminate_board - cmp dword [eax+12], 1 - jne terminate_board - mov ecx, [eax+16] - mcall 18, 18 ;terminate daemonized board - jmp terminate_board - -.create_STATE_shm_block: - cmp [params.stop_daemon_flag], 1 - je terminate_board +;------------------------------------------------------------------------------ +;* input: esi = pointer to string * +;* edi = pointer to string * +;* ecx = data length * +;------------------------------------------------------------------------------ +StrCmp: + repe cmpsb + ja .a_greater_b + jb .a_less_b +.equal: + mov eax, 0 + jmp .end +.a_less_b: + mov eax, 1 + jmp .end +.a_greater_b: + mov eax, -1 +.end: + ret - mcall 68,,,STATE_shm_block.size, 0x08 ;create "BOARDAPP:STATE" shared memory block (ro access for other processes) - test eax, eax - jz terminate_board - - mov edi, eax - mov dword [edi], 1 - mov dword [edi+4], STATE_shm_block.version - mov dword [edi+8], STATE_shm_block.size - movzx eax, byte [params.daemon_mode] - mov dword [edi+12], eax - mcall 9, procinfo, -1 - mov eax, [ebx+30] ;PID of board - mov dword [edi+16], eax - mov dword [edi], 0 - -.ret: - ret -;------------------------------------------------------------------------------- +;------------------------------------------------------------------------------ +;* input: edi = pointer to string * +;* ecx = data length * +;------------------------------------------------------------------------------ +; 'a' - 'A' = 32 -> 'A'|32 = 'a' +ToLower: + xor eax, eax +.cycle: + or byte[edi+eax], 32 + inc eax + loop .cycle +.end: + ret -terminate_board: - mcall -1 -;------------------------------------------------------------------------------- +;------------------------------------------------------------------------------ +;* get info on current thread, save pid/tid +;* look for another process with same name and different pid/tid +;* if found, close self +;* else continue normally +;------------------------------------------------------------------------------ +CheckUnique: +.get_thread_info: + mov ebx, procinfo + mov ecx, -1 + mcall 9 + +.get_pid: ; check_buffer + mov [process_count], eax + mov eax, [ebx+process_information.PID] + mov [pid_tid], eax + mov ecx, 2 + +.check_threads: + cmp ecx, [process_count] + ja .leave_check + mov eax, 9 + mcall + +.check_slot_free: + cmp dword [ebx+process_information.slot_state], 9 + je .next_thread + +.check_pid: + mov eax, [pid_tid] + cmp [ebx+process_information.PID], eax + je .next_thread + +.get_proc_name: + lea edi, [ebx+process_information.process_name] + push ecx + mov ecx, my_name_size-1 + +.lower_case: + call ToLower + lea esi, [my_name] + mov ecx, my_name_size + call StrCmp + pop ecx + cmp eax, 0 + je .close_program + +.next_thread: + inc ecx + jmp .check_threads + +.close_program: + ; restore and active window of previous thread + mcall 18, 3 + mov eax, -1 + mcall + +.leave_check: + ret + +;------------------------------------------------------------------------------ ; DATA - if lang eq ru - title db "Доска отладки и сообщений v1.0.1", 0 - else if lang eq it - title db "Notifiche e informazioni generiche per il debug v1.0.1", 0 - else if lang eq ge - title db "Allgemeines debug- & nachrichtenboard v1.0.1", 0 - else - title db "General debug & message board v1.0.1", 0 - end if - -STATE_shm_block: -;structure of BOARDAPP:STATE shared memory block: -;+0 dd mutex (0 - unlocked, block was already written by board, 1 - locked, board is writing into block) -;+4 dd version of block structure (current is 0) -;+8 dd size of block (min. 4096 byte for version 0) -;+12 dd board's state (0 - usual windowed app, 1 - daemonized) -;+16 dd board's PID -;next bytes are reserved - - .name db "BOARDAPP:STATE", 0 - .size = 4*1024 - .version = 0 - -default_log_filename db "/tmp0/1/boardlog.txt", 0 -krnl_msg db "K : " -k_button_text db "Kernel", 0 -u_button_text db "User", 0 - -proc_fors_term db "Process - forced terminate PID: ", 0 -proc_fors_term_sp db "Proceso - terminado forzado PID: ", 0 -unexp_end_of_stack db "Unexpected end of the stack", 0 - -log_filename dd default_log_filename - -filepos dd 0 - -already_on_top db 0 - - -params: - .log_filename dd 0 - .log_filename.size dd 0 - .log_filename_found db 0 - .daemon_mode db 0 ;0 - normal mode, 1 - daemon mode - .stop_daemon_flag db 0 - .logging_mode db 1 ;0 - don't log, 1 - log - .rewrite_log_flag db 0 - .options.d db "daemonize", 0 - .options.d.size = $-.options.d - .options.s db "stop-daemon", 0 - .options.s.size = $-.options.s - .options.n db "no-log", 0 - .options.n.size = $-.options.n - .options.r db "rewrite-log", 0 - .options.r.size = $-.options.r - .options.f db "fullscreen", 0 - .options.f.size = $-.options.f - -vmode dd 1 -fullscreen_mode db 0 +if lang eq ru + title db 'Доска отладки и сообщений',0 +else if lang eq it + title db 'Notifiche e informazioni generiche per il debug',0 +else if lang eq ge + title db 'Allgemeines debug- & nachrichtenboard',0 +else + title db 'General debug & message board',0 +end if +default_filename db '/tmp0/1/boardlog.txt',0 +krnl_msg db 'K : ' +duk db 'KernUser' +my_name db 'board',0 +my_name_size = $-my_name align 4 - -targ dd text1 - -open_log_in_tinypad: - dd 7 - dd 0 - dd 0 - dd 0 - dd 0 - db "/sys/tinypad", 0 +vmode dd 1 +targ dd text2 I_END: - prev_win_x dw ? -prev_win_y dw ? -prev_win_w dw ? -prev_win_h dw ? +InfoStructure: + dd ? ; subfunction number + dd ? ; position in the file in bytes + dd ? ; upper part of the position address + dd ? ; number of bytes to read + dd ? ; pointer to the buffer to write data + db ? + dd ? ; pointer to the filename -f70_structure: - dd ? ; subfunction number - dd ? ; - dd ? ; - dd ? ; - dd ? ; - db ? - dd ? ; pointer to the filename +open_log_in_tinypad: + dd 7 + dd 0 + dd filename + dd 0 + dd 0 + db '/sys/tinypad',0 -window_header_height dd ? -buffer_length dd ? -krnl_cnt dd ? -xstart dd ? -ystart dd ? +buffer_length rb 3 +process_count dd ? +krnl_cnt dd ? +pid_tid dd ? +filepos dd ? +xstart dd ? +sc system_colors -hl_line_count rd 1 + rd 2 +text1 rb 80*(MAXSTRINGS+1) +tmp1 dd ? -sc system_colors + rd 2 +text2 rb 80*(MAXSTRINGS+1) +tmp2 dd ? - rd 2 -text1 rb STRING_LENGTH*MAX_STRINGS ;'User' messages - - rd 2 -text2 rb STRING_LENGTH*MAX_STRINGS ;'Kernel' messages - -tmp rb 256 -PARAMS_STRING rb 256 -procinfo rb 1024 -file_info rb 40 - - align 4 - rb 512 -STACK_TOP: - -MEM_END: +tmp rb 256 +filename rb 256 +procinfo rb 1024 +stackbuf rb 2000h +mem: