Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1641 art_zh 1
;========================================================================
2
;=                                                                      =
3
;=         Fast Hartley Transform  routine demo for KolibriOS           =
4
;=                                                                      =
5
;=       Copyright (C) 2010, Artem Jerdev         =
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
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: