Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ;========================================================================
  2. ;=                                                                      =
  3. ;=         Fast Hartley Transform  routine demo for KolibriOS           =
  4. ;=                                                                      =
  5. ;=       Copyright (C) 2010, Artem Jerdev <kolibri@jerdev.co.uk>        =
  6. ;=                                                                      =
  7. ;=             refer to wiki.kolibtios.org for all details              =
  8. ;=                                                                      =
  9. ;========================================================================
  10.  
  11.  
  12.  
  13.  
  14. use32
  15.  
  16.                org    0x0
  17.  
  18.                db     'MENUET01'              ; 8 byte id
  19.                dd     0x01                    ; header version
  20.                dd     START                   ; start of code
  21.                dd     I_END                   ; size of image
  22.                dd     0x100000                ; memory for app
  23.                dd     0xbfffc                 ; esp
  24.                dd     0x0 , 0x0               ; I_Param , I_Icon
  25.  
  26.  
  27. include 'macros.inc'
  28. include 'debug.inc'
  29. include 'FHT4i.inc'
  30.  
  31.  
  32. START:                          ; start of execution
  33.  
  34.      call main
  35.  
  36.  
  37.     mov  eax,-1                 ; close this program
  38.     int  0x40
  39.  
  40.  
  41. ;=============================================================
  42. ;Func: calculates a simple function
  43. ;      ff = (int)(500*exp(-t) * cos (2.5*t))
  44. ;               uses: eax, ebx
  45. ;------------
  46. Func:
  47.  
  48. ; 9    : {
  49.  
  50. ; 10   :   double x,t;
  51. ; 11   :   int f;
  52. ; 12   :
  53. ; 13   :   x = (i < N2) ? i : i - NUM_POINTS;
  54.         mov     eax, [ii]
  55.         cmp     eax, 512
  56.         jge     .index_negative
  57.         jmp     .index_correct
  58. .index_negative:
  59.         sub     eax, 1024
  60. .index_correct:
  61.         mov     [temp], eax
  62. ;        fild    [temp]
  63.  
  64. ; 14   :   t = x / 16.0;
  65. ; f2xm1 argument (abs) must be less than 1, so
  66.         mov     [t_mod], eax
  67.         and     [t_mod], 0x0F   ; x % 16
  68.         shr     eax, 4          ; x / 16
  69.         mov     [t_div], eax
  70.         fild    [temp]
  71.  
  72. ; 15   :   if (t<0) t = -t;
  73.         fabs
  74. exp_ok:
  75. ; 16   :   f = (int)(512*2^(-t) * cos (2.5*t));
  76.         fchs
  77.         f2xm1
  78.         fmul    [f500]
  79.         fstp    [tv93]
  80.         fld     [f2_5]
  81.         fmul    [tt]
  82.         fcos
  83.         fmul    [tv93]
  84.         fstp    [tt]
  85.         mov     bx, word[tt+6]
  86.         shr     bx,4
  87.         and     bx,0x07FF
  88.         add     ax,bx
  89.         shl     ax,4
  90.         and     word[tt+6], 0x800F
  91.         or      word[tt+6], ax
  92.         fld     [tt]
  93.         fstp   [ff]
  94.  
  95. ; 17   :   return  f;
  96. ; 18   : }
  97.         ret
  98. ;---------------------------------------------------------
  99. ;       test data filler
  100. ;
  101. ;       uses eax, ebx, ecx
  102. FillData:
  103. ; 29   :    for (i=0; i<NUM_POINTS; i++)
  104. ; here : ecx = i
  105.         xor     ecx, ecx
  106. .funcloop:
  107. ; 30   :    {
  108. ; 31   :       ia[i] = Func(i);
  109.         mov     [ii], ecx
  110.         call    Func
  111.         fld     [ff]
  112.         fstp    qword [edx+ecx*8]
  113. ; 32   :    }
  114.         inc     ecx
  115.         cmp     ecx, [_in]         ; ecx == N ?
  116.         jne     .funcloop
  117.         ret
  118.  
  119. ;====================================================================
  120. ; main
  121. ;====================================================================
  122. align 4
  123.  
  124. _ia     dd 0
  125. _ii     dd 0
  126. _ip     dd 0
  127. _in     dd 0
  128. _it     dd 0
  129. ;-----------------
  130. main:
  131.          mov    eax, 68
  132.          mov    ebx, 11
  133.          int    0x40
  134.         fninit
  135.          mov    cl,   2         ; power of 4
  136.          mov    byte[_ip], cl
  137.          mov    eax, 1
  138.          shl    eax, cl
  139.          shl    eax, cl
  140.          mov    [_in], eax
  141.          mov    dl, cl
  142.          call   CreateSinCosTable
  143.          mov    [_it], edx
  144.          mov    ecx, [_in]
  145.          shl    ecx, 3
  146.          mov    ebx, 12
  147.          mov    eax, 68
  148.          int    0x40
  149.          mov    [_ia], eax
  150.          mov    edx, eax
  151.  
  152.         call FillData
  153.  
  154.         cpuid
  155.         rdtsc
  156.         mov     [t_0], eax
  157.  
  158.         push    [_it]
  159.         push    [_ia]
  160.         push    [_ip]
  161.         push    [_in]
  162. ;        call    FHT_4
  163.         xor     eax, eax
  164.         syscall
  165.  
  166.         add     esp, 16
  167.         cpuid
  168.         rdtsc
  169.         mov     [t_1], eax
  170.  
  171.         sub     eax, [t_0]
  172.         debug_print_hex eax
  173.         print   '<- fht time'
  174.  
  175.         mov     edx, [_it]
  176.         call    DestroySinCosTable
  177.         mov     ecx, [_ia]
  178.         mov     ebx, 13
  179.         mov     eax, 68
  180.         int     0x40
  181.         ret
  182.  
  183.  
  184. ; ========================================================
  185. ; static data
  186. ;----------------
  187.  
  188. align 8
  189.  
  190. ;f18     dq 0x4032000000000000
  191. f256    dq 256.01f
  192. f14_2   dq 14.2f
  193. f500    dq 0x407f400000000000
  194. f2_5    dq 0x4004000000000000
  195. tt      dq ?
  196. tv93    dq ?
  197. t_div   dd ?
  198. t_mod   dd ?
  199. temp    dd ?
  200. ff      dq ?    ; return value (int)
  201. ii      dd ?    ; argument (int) = array index
  202. t_1     dd ?
  203. t_0     dd ?
  204. fcontrol dw  0x0037f
  205. title   db ' Fast Hartley Transform Test - A.Jerdev 2010'
  206.  
  207. I_END:
  208.