;========================================================================
;=                                                                      =
;=         Fast Hartley Transform   demo for KolibriOS                  =
;=                                                                      =
;=       Copyright (C) 2010, Artem Jerdev <kolibri@jerdev.co.uk>        =
;=                                                                      =
;=             refer to wiki.kolibtios.org for all details              =
;=                                                                      =
;========================================================================




use32

	       org    0x0

	       db     'MENUET01'	      ; 8 byte id
	       dd     0x01		      ; header version
	       dd     START		      ; start of code
	       dd     I_END		      ; size of image
	       dd     0x100000		      ; memory for app
	       dd     0xbfffc		      ; esp
	       dd     0x0 , 0x0 	      ; I_Param , I_Icon

include '../../macros.inc'
include '../../debug.inc'
include 'fht4code.asm'


START:				; start of execution

     call main


    mov  eax,-1 		; close this program
    int  0x40


;=============================================================
;Func: calculates a simple function
;      ff = (512*2^(-t) * cos (2.5*t))
;               uses: eax, ebx
;------------
Func:

; 9    : {

; 10   :   double x,t;
; 11   :   int f;
; 12   :
; 13   :   x = (i < N2) ? i : i - NUM_POINTS;
	mov	eax, [ii]
	cmp	eax, 512
	jge	.index_negative
	jmp	.index_correct
.index_negative:
	sub	eax, 1024
.index_correct:
	mov	[temp], eax
;        fild    [temp]

; 14   :   t = x / 16.0;
; f2xm1 argument (abs) must be less than 1, so
	mov	[t_mod], eax
	and	[t_mod], 0x0F	; x % 16
	shr	eax, 4		; x / 16
	mov	[t_div], eax
	fild	[temp]

; 15   :   if (t<0) t = -t;
	fabs
exp_ok:
; 16   :   f = (512*2^(-t) * cos (2.5*t));
	fchs
	f2xm1
	fmul	[f500]
	fstp	[tv93]
	fld	[f2_5]
	fmul	[tt]
	fcos
	fmul	[tv93]
	fstp	[tt]
	mov	bx, word[tt+6]
	shr	bx,4
	and	bx,0x07FF
	add	ax,bx
	shl	ax,4
	and	word[tt+6], 0x800F
	or	word[tt+6], ax
	fld	[tt]
	fstp   [ff]

; 17   :   return  f;
; 18   : }
	ret
;---------------------------------------------------------
;       test data filler
;
;       uses eax, ebx, ecx
FillData:
; 29   :    for (i=0; i<NUM_POINTS; i++)
; here : ecx = i
	xor	ecx, ecx
.funcloop:
; 30   :    {
; 31   :       ia[i] = Func(i);
	mov	[ii], ecx
	call	Func
	fld	[ff]
	fstp	qword [edx+ecx*8]
; 32   :    }
	inc	ecx
	cmp	ecx, [_in]	   ; ecx == N ?
	jne	.funcloop
	ret

;====================================================================
; main
;====================================================================

_ia	dd 0
_ii	dd 0
_ip	dd 0
_in	dd 0
_it	dd 0
;-----------------

main:
	 mov	eax, 68
	 mov	ebx, 11
	 int	0x40
	fninit
	 mov	cl,   2 	; power of 4
	 mov	byte[_ip], cl
	 mov	eax, 1
	 shl	eax, cl
	 shl	eax, cl
	 mov	[_in], eax
	 mov	dl, cl
	 call	CreateSinCosTable
	 mov	[_it], edx
	 mov	ecx, [_in]
	 shl	ecx, 3
	 mov	ebx, 12
	 mov	eax, 68
	 int	0x40
	 mov	[_ia], eax
	 mov	edx, eax

	call FillData

	cpuid
	rdtsc
	mov	[t_0], eax

	push	[_it]
	push	[_ia]
	push	[_ip]
	push	[_in]
	call	FHT_4
	add	esp, 16
	cpuid
	rdtsc
	mov	[t_1], eax

	sub	eax, [t_0]
	debug_print_hex eax
	print	'<- fht time'

	mov	edx, [_it]
	call	DestroySinCosTable
	mov	ecx, [_ia]
	mov	ebx, 13
	mov	eax, 68
	int	0x40
	ret


; ========================================================
; static data
;----------------

align 8

;f18     dq 0x4032000000000000
f256	dq 256.01f
f14_2	dq 14.2f
f500	dq 0x407f400000000000
f2_5	dq 0x4004000000000000
tt	dq ?
tv93	dq ?
t_div	dd ?
t_mod	dd ?
temp	dd ?
ff	dq ?	; return value (int)
ii	dd ?	; argument (int) = array index
t_1	dd ?
t_0	dd ?
fcontrol dw  0x0037f
title	db ' Fast Hartley Transform Test - A.Jerdev 2010'

I_END: