Subversion Repositories Kolibri OS

Rev

Rev 4480 | Rev 4673 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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