Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1.                         ;;      CPU latency test -- Art J    ;;
  2.  
  3.  
  4.   use32              ;
  5.   org    0x0         ;
  6.  
  7.   db     'MENUET01'  ;
  8.   dd     0x01        ;
  9.   dd     START       ;
  10.   dd     I_END       ;
  11.   dd     0x4000      ;
  12.   dd     0x4000      ;
  13.   dd     0x0         ;
  14.   dd     0x0         ;
  15.  
  16. include '..\..\..\macros.inc' ;
  17.  
  18.  
  19. START:
  20.  
  21.  
  22.     call draw_win
  23.  
  24.  
  25.         rdtsc
  26.  
  27. main_loop:
  28.         mov   ecx, eax          ; ecx = previous timestamp
  29.         rdtsc                   ; new timestamp
  30.         cmp   eax, ecx
  31.         jb    main_loop         ; tsc overflow?
  32.  
  33.         mov   ebx, eax          ;
  34.         sub   ebx, ecx          ; net clocks
  35.  
  36.         cmp   ebx, [max]
  37.         jb    @f
  38.         mov   [max], ebx
  39. ;       mcall 13, 200*65536+60, 500*65536+20, 0x00EEEEEEEE
  40. ;       mcall 47, 0x800A0001, max, 200*65536+501
  41. @@:
  42.         push  ebx
  43.         fldlg2                  ; lg(2)
  44.         fild  dword[esp]
  45.         fyl2x
  46.         fimul [yscale]
  47.         fistp dword[esp]
  48.         pop   ebx               ; ebx = lg(time/100) * yscale
  49.         sub   ebx, [yscale]
  50.         sub   ebx, [yscale]
  51.         jb    main_loop
  52.  
  53.         cmp   ebx, 512
  54.         ja    main_loop
  55.  
  56.         mov   edx, [ebx*4+data_]
  57.  
  58.         inc   edx
  59.         mov   [ebx*4+data_], edx
  60.         push  edx
  61.         fld   qword[xscale]
  62.         fild  dword[esp]
  63.         fyl2x
  64.         fistp dword[esp]
  65.         pop   edx             ; edx = log2(counts) * xscale
  66.         cmp   edx, 300
  67.         jge   main_loop
  68.  
  69.         shl   ebx, 12            ; 1 line = 1024 pixels
  70.         add   ebx, 1024*4*30 + 17*4
  71.         mov   dword[ebx + edx*4 + 0xFE000000], 0x00703030
  72.         jmp   main_loop
  73.  
  74.  
  75.  
  76.  
  77. ;------------------------------------------------
  78. draw_win:
  79. ;------------------------------------------------
  80.  
  81.  
  82.     mcall 12, 1
  83.     mcall 0, 300, 590, 0x14BAA6A0,,title
  84. ; -----------------------------------------------------------------
  85.     mov   ecx, [yscale]
  86.     shl   ecx, 16
  87.     mov   cx,  word[yscale]
  88.     mov   [ytick], ecx
  89.     mcall 38, 16*65536+16, 30*65536+530, 0
  90.     mov   cx, 30
  91. @@:
  92.     mcall , 14*65536+16
  93.     add   ecx, [ytick]
  94.     cmp   cx, 512
  95.     jb    @b
  96.  
  97.     mcall 4, 0x00100230, 0x80000000, advise
  98.     mov   eax, 47
  99.     mov   ebx, 0x00010000
  100.     mov   ecx, 2
  101.     mov   edx, 7*65536+30
  102.     mov   esi, 0
  103. @@:
  104.     mcall
  105.     add   dx, word[yscale]
  106.     inc   ecx
  107.     cmp   dx, 512
  108.     jb    @b
  109.  
  110.     mcall 40, 0xC0000000        ; ignore sys messages
  111.  
  112.     mcall 12, 2
  113.  
  114.  
  115. ret
  116.  
  117.  
  118. align 4
  119. ;-------------------------------------------------
  120. data_  dd 512 dup 1      ; hysto
  121. max    dd  0
  122. xscale dq  7.2
  123. yscale dd  80
  124. ytick  dd  0
  125.  
  126.  
  127.     title db '   Latency test ',0
  128.     advise db 'Use CPU process manager to close this window)',0
  129.  
  130. I_END:          ; end of program
  131.  
  132.         rd 256
  133.  
  134. align 256
  135. st_0:
  136.