Subversion Repositories Kolibri OS

Rev

Rev 8560 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;------------------------------------------------------------------------------
  2. ; DEBUG BOARD for APPLICATIONS and KERNEL DEVELOPMENT
  3. ; See f63
  4. ; Compile with FASM for KolibriOS
  5. ;------------------------------------------------------------------------------
  6. use32
  7. org 0
  8.         db      'MENUET01'
  9.         dd      1
  10.         dd      START
  11.         dd      I_END
  12.         dd      mem
  13.         dd      mem
  14.         dd      filename
  15.         dd      0
  16. ;------------------------------------------------------------------------------
  17. include 'lang.inc'
  18. include '../../../macros.inc'
  19. include '../../../debug.inc'
  20. purge   newline
  21. ;SMALL FONT
  22. MAXSTRINGS = 45
  23. LINE_H = 10
  24. WINDOW_W = 399
  25. WINDOW_H = MAXSTRINGS*LINE_H+45
  26. FONT_TYPE = 0x40000000
  27. ;BIG FONT
  28. ; MAXSTRINGS = 30
  29. ; LINE_H = 15
  30. ; WINDOW_W = 630
  31. ; WINDOW_H = MAXSTRINGS*LINE_H+50
  32. ; FONT_TYPE = 0x50000000
  33.  
  34. ;------------------------------------------------------------------------------
  35. START:
  36.         call    CheckUnique
  37.         mov     edi, filename
  38.         cmp     [edi], byte 0
  39.         jnz     param
  40.         mov     esi, default_filename
  41. @@:
  42.         lodsb
  43.         stosb
  44.         test    al,al
  45.         jnz     @b
  46. param:
  47.         mov     ecx, (MAXSTRINGS+1)*20
  48.         mov     edi, text1
  49.         mov     eax, '    '
  50.         rep     stosd
  51.  
  52.         mov     ecx, (MAXSTRINGS+1)*20
  53.         mov     edi, text2
  54.         rep     stosd
  55.  
  56.         mov     byte [tmp1], 'x'
  57.         mov     byte [tmp2], 'x'
  58.  
  59.         mcall   14
  60.         and     eax, 0xffff0000
  61.         sub     eax, WINDOW_W shl 16
  62.         add     eax, WINDOW_W
  63.         mov     [xstart], eax
  64.         mcall   48, 3, sc, sizeof.system_colors
  65.  
  66.         mov     esi, filename
  67.         call    CreateFile
  68. ;------------------------------------------------------------------------------
  69. red:
  70.         call    draw_window
  71. ;------------------------------------------------------------------------------
  72. still:
  73.         cmp     [buffer_length], 0
  74.         je      @f
  75.         call    write_buffer
  76. @@:
  77.         mcall   23, 50                    ; wait here for event
  78.         cmp     eax, 1                    ; redraw request ?
  79.         je      red
  80.  
  81.         cmp     eax, 2                    ; key in buffer ?
  82.         je      key
  83.  
  84.         cmp     eax, 3                    ; button in buffer ?
  85.         je      button
  86.  
  87.         mcall   63, 2
  88.         cmp     ebx, 1
  89.         jne     still
  90.  
  91. new_data:
  92.         cmp     [buffer_length], 255
  93.         jne     @f
  94.         call    write_buffer
  95. @@:
  96.         movzx   ebx, byte[buffer_length]
  97.         mov     [ebx+tmp], al
  98.         inc     [buffer_length]
  99.         mov     ebp, [targ]
  100.         cmp     al, 10
  101.         jz      new_line
  102.         cmp     al, 13
  103.         jz      new_check
  104.         jmp     char
  105. ;------------------------------------------
  106. write_buffer:
  107.         pusha
  108.         mov     edx, tmp
  109.         movzx   ecx, byte[buffer_length]
  110.         mov     esi, filename
  111. .write_to_logfile:
  112.         call    WriteToFile
  113.         cmp     eax, 5
  114.         jne     @f
  115.         mov     esi, filename
  116.         mov     [filepos], 0
  117.         call    CreateFile
  118.         jnc     .write_to_logfile
  119. @@:
  120.         movzx   eax,byte[buffer_length]
  121.         add     [filepos],eax
  122.         xor     eax,eax
  123.         mov     [buffer_length],al
  124.         popa
  125.         ret
  126. ;------------------------------------------
  127. new_line:
  128.         and     [ebp-8], dword 0
  129.         inc     dword [ebp-4]
  130.         cmp     [ebp-4], dword MAXSTRINGS
  131.         jbe     .noypos
  132.         mov     [ebp-4], dword MAXSTRINGS
  133.         lea     esi, [ebp+80]
  134.         mov     edi, ebp
  135.         mov     ecx, 20*(MAXSTRINGS)
  136.         cld
  137.         rep     movsd
  138.  
  139.         mov     esi, [ebp-4]
  140.         imul    esi, 80
  141.         add     esi, [ebp-8]
  142.         add     esi, ebp
  143.         mov     ecx, 20
  144.         mov     eax, '    '
  145.         rep     stosd
  146. .noypos:
  147.         mov     [targ],text2
  148.         and     [krnl_cnt],0
  149.         jmp     new_check
  150. ;------------------------------------------
  151. char:
  152.         cmp     ebp, text1
  153.         je      add2
  154.         mov     ecx, [krnl_cnt]
  155.         cmp     al, [krnl_msg+ecx]
  156.         jne     .noknl
  157.         inc     [krnl_cnt]
  158.         cmp     [krnl_cnt], 4
  159.         jne     new_check
  160.         mov     [targ], text1
  161. .noknl:
  162.         mov     ebp, [targ]
  163.         jecxz   .add
  164.         push    eax
  165.         mov     esi, krnl_msg
  166. .l1:
  167.         lodsb
  168.         call    add_char
  169.         loop    .l1
  170.         pop     eax
  171. .add:
  172.         and     [krnl_cnt], 0
  173. add2:
  174.         call    add_char
  175.  
  176. new_check:
  177.         mcall   63, 2
  178.         cmp     ebx, 1
  179.         je      new_data
  180.         call    draw_text
  181.         jmp     still
  182. ;------------------------------------------------------------------------------
  183. key:
  184.         mcall   2
  185.         cmp     ah, ' '
  186.         je      button.noclose
  187.         cmp     ah, 51 ; F2
  188.         je      open_boardlog
  189.         jmp     still
  190. open_boardlog:
  191.                 mcall 70, open_log_in_tinypad
  192.         jmp     red
  193.                
  194. ;------------------------------------------------------------------------------
  195. button:
  196.         mcall   17                        ; get id
  197.         cmp     ah, 1                     ; button id=1 ?
  198.         jne     .noclose
  199.         or      eax, -1                   ; close this program
  200.         mcall
  201. .noclose:
  202.         xor     [vmode], 1
  203.         jmp     red
  204. ;------------------------------------------------------------------------------
  205. add_char:
  206.         push    esi
  207.         mov     esi, [ebp-4]
  208.         imul    esi, 80
  209.         add     esi, [ebp-8]
  210.         mov     [ebp+esi], al
  211.         inc     dword[ebp-8]
  212.         cmp     dword[ebp-8], 80
  213.         jb      .ok
  214.         mov     dword[ebp-8], 79
  215. .ok:
  216.         pop     esi
  217.         ret
  218.  
  219. ;------------------------------------------------------------------------------
  220. ;************************  WINDOW DEFINITIONS AND DRAW ************************
  221. ;------------------------------------------------------------------------------
  222. draw_window:
  223.         mcall   12, 1                     ; 1, start of draw
  224.         mcall   48, 5                     ; GetClientTop
  225.         shr     ebx, 16
  226.         mov     ecx, ebx
  227.         shl     ecx, 16
  228.         add     ecx, WINDOW_H     ; [y start] *65536 + [y size]
  229.         mov     edx, 0xffffff
  230.         or      edx, 0x14000000
  231.         xor     esi, esi
  232.         mcall   0,[xstart],,,,title
  233.         mov     ebx, 296 shl 16+31
  234.         mcall   8,,<4,13>,3,[sc.work_button]
  235.         mov     edx, [vmode]
  236.         lea     edx, [edx*4+duk]
  237.         mov     ecx, 0x80
  238.         shr     ecx, 24
  239.         add     ecx, [sc.work_button_text]
  240.         mcall   4,<300,7>,,,4
  241.         call    draw_text
  242.         mcall   12, 2                     ; 2, end of draw
  243.         ret
  244. ;------------------------------------------------------------------------------
  245. draw_text:
  246.         mov     ebx, 15*65536+30          ; draw info text with function 4
  247.         xor     ecx, ecx
  248.         or      ecx, FONT_TYPE
  249.         mov     edi, 0xffffff
  250.         mov     edx, text1
  251.         cmp     [vmode], 0
  252.         je      .kern
  253.         mov     edx, text2
  254. .kern:
  255.         push    ebx ecx edx
  256.         mcall   9, procinfo,-1
  257.         mov     eax, [ebx+42]
  258.         xor     edx, edx
  259.         mov     ebx, 6
  260.         div     ebx
  261.         pop     edx ecx ebx
  262.         mov     esi, 80
  263.         cmp     eax, esi
  264.         ja      @f
  265.         mov     esi, eax
  266. @@:
  267.         cmp     esi, 5
  268.         ja      @f
  269.         mov     esi, 5
  270. @@:
  271.         sub     esi, 4
  272.         mov     eax, 4
  273. newline:
  274.         mcall
  275.         add     ebx, LINE_H
  276.         add     edx, 80
  277.         cmp     [edx], byte 'x'
  278.         jne     newline
  279.         ret
  280.  
  281. ;------------------------------------------------------------------------------
  282. ;*  input:  esi = pointer to the file name  *
  283. ;------------------------------------------------------------------------------
  284. CreateFile:
  285.         pusha
  286.         mov     dword [InfoStructure+00], 2   ; create file
  287.         mov     dword [InfoStructure+04], 0   ; reserved
  288.         mov     dword [InfoStructure+08], 0   ; reserved
  289.         mov     dword [InfoStructure+12], 0   ; 0 bytes to write (just create)
  290.         mov     dword [InfoStructure+16], 0   ; NULL data pointer (no data)
  291.         mov     dword [InfoStructure+20], 0   ; reserved
  292.         mov     dword [InfoStructure+21], esi ; pointer to the file name
  293.         mcall   70, InfoStructure
  294.         test    eax, eax
  295.         jz      .out
  296.         stc
  297. .out:
  298.         popa
  299.         ret
  300. ;------------------------------------------------------------------------------
  301. ;*  input:  esi = pointer to the file name  *
  302. ;*          edx = pointer to data buffer    *
  303. ;*          ecx = data length               *
  304. ;------------------------------------------------------------------------------
  305. WriteToFile:
  306.         push    ebx
  307.         mov     dword [InfoStructure+00], 3   ; write to file
  308.         mov     eax,  [filepos]
  309.         mov     dword [InfoStructure+04], eax ; lower position addr
  310.         mov     dword [InfoStructure+08], 0   ; upper position addr (0 for FAT)
  311.         mov     dword [InfoStructure+12], ecx ; number of bytes to write
  312.         mov     dword [InfoStructure+16], edx ; pointer to data buffer
  313.         mov     dword [InfoStructure+20], 0   ; reserved
  314.         mov     dword [InfoStructure+21], esi ; pointer to the file name
  315.         mcall   70, InfoStructure
  316.         clc
  317.         test    eax, eax
  318.         jz      .out
  319.         stc
  320. .out:
  321.         pop     ebx
  322.         ret
  323.  
  324. ;------------------------------------------------------------------------------
  325. ;*  input:  esi = pointer to string         *
  326. ;*          edi = pointer to string         *
  327. ;*          ecx = data length               *
  328. ;------------------------------------------------------------------------------
  329. StrCmp:
  330.         repe    cmpsb
  331.         ja      .a_greater_b
  332.         jb      .a_less_b
  333. .equal:
  334.         mov     eax, 0
  335.         jmp     .end
  336. .a_less_b:
  337.         mov     eax, 1
  338.         jmp     .end
  339. .a_greater_b:
  340.         mov     eax, -1
  341. .end:
  342.         ret
  343.  
  344. ;------------------------------------------------------------------------------
  345. ;*  input:  edi = pointer to string          *
  346. ;*          ecx = data length                *
  347. ;------------------------------------------------------------------------------
  348. ; 'a' - 'A' = 32 -> 'A'|32 = 'a'
  349. ToLower:
  350.         xor     eax, eax
  351. .cycle:
  352.         or      byte[edi+eax], 32
  353.         inc     eax
  354.         loop    .cycle
  355. .end:
  356.         ret
  357.  
  358. ;------------------------------------------------------------------------------
  359. ;* get info on current thread, save pid/tid
  360. ;* look for another process with same name and different pid/tid
  361. ;* if found, close self
  362. ;* else continue normally
  363. ;------------------------------------------------------------------------------
  364. CheckUnique:
  365. .get_thread_info:
  366.         mov     ebx, procinfo
  367.         mov     ecx, -1
  368.         mcall   9
  369.  
  370. .get_pid:                             ; check_buffer
  371.         mov     [process_count], eax
  372.         mov     eax, [ebx+process_information.PID]
  373.         mov     [pid_tid], eax
  374.         mov     ecx, 2
  375.  
  376. .check_threads:
  377.         cmp     ecx, [process_count]
  378.         ja      .leave_check
  379.         mov     eax, 9
  380.         mcall
  381.  
  382. .check_slot_free:
  383.         cmp     dword [ebx+process_information.slot_state], 9
  384.         je      .next_thread
  385.  
  386. .check_pid:
  387.         mov     eax, [pid_tid]
  388.         cmp     [ebx+process_information.PID], eax
  389.         je      .next_thread
  390.  
  391. .get_proc_name:
  392.         lea     edi, [ebx+process_information.process_name]
  393.         push    ecx
  394.         mov     ecx, my_name_size-1
  395.  
  396. .lower_case:
  397.         call    ToLower
  398.         lea     esi, [my_name]
  399.         mov     ecx, my_name_size
  400.         call    StrCmp
  401.         pop     ecx
  402.         cmp     eax, 0
  403.         je      .close_program
  404.  
  405. .next_thread:
  406.         inc     ecx
  407.         jmp     .check_threads
  408.  
  409. .close_program:
  410.         ; restore and active window of previous thread
  411.         mcall   18, 3
  412.         mov     eax, -1
  413.         mcall
  414.  
  415. .leave_check:
  416.         ret
  417.  
  418. ;------------------------------------------------------------------------------
  419. ; DATA
  420.  
  421. if lang eq ru
  422.  title  db 'Доска отладки и сообщений',0
  423. else if lang eq it
  424.  title  db 'Notifiche e informazioni generiche per il debug',0
  425. else if lang eq ge
  426.  title  db 'Allgemeines debug- & nachrichtenboard',0
  427. else
  428.  title  db 'General debug & message board',0
  429. end if
  430.  
  431. default_filename db '/tmp0/1/boardlog.txt',0
  432. krnl_msg        db  'K : '
  433. duk             db  'KernUser'
  434. my_name         db  'board',0
  435. my_name_size = $-my_name
  436.  
  437. align 4
  438. vmode   dd  1
  439. targ    dd  text2
  440.  
  441. I_END:
  442.  
  443. InfoStructure:
  444.         dd      ?       ; subfunction number
  445.         dd      ?       ; position in the file in bytes
  446.         dd      ?       ; upper part of the position address
  447.         dd      ?       ; number of bytes to read
  448.         dd      ?       ; pointer to the buffer to write data
  449.         db      ?
  450.         dd      ?       ; pointer to the filename
  451.  
  452. open_log_in_tinypad:
  453.         dd      7
  454.         dd      0
  455.         dd      filename
  456.         dd      0
  457.         dd      0
  458.         db      '/sys/tinypad',0
  459.  
  460. buffer_length   rb  3
  461. process_count   dd  ?
  462. krnl_cnt        dd  ?
  463. pid_tid         dd  ?
  464. filepos         dd  ?
  465. xstart          dd  ?
  466. sc      system_colors
  467.  
  468.         rd  2
  469. text1   rb  80*(MAXSTRINGS+1)
  470. tmp1    dd  ?
  471.  
  472.         rd  2
  473. text2   rb  80*(MAXSTRINGS+1)
  474. tmp2    dd  ?
  475.  
  476. tmp             rb  256
  477. filename        rb  256
  478. procinfo        rb  1024
  479. stackbuf        rb  2000h
  480. mem:
  481.