;compiler:          FASM 1.50 by Tomasz Grysztar
;project name:      Conditional macros
;version:           1.01 alpha
;last update:       2003-12-24
;programmed by:     V. Grigoruck (Vadana) ;-)
;e-mail:            vadana@yandex.ru

EQUAL	fix	,e,
NE	fix	,ne,

LT	fix	,a,
GT	fix	,b,
LE 	fix	,ae,
GE	fix	,be,

SLT	fix	,l,
SGT	fix	,g,
SLE 	fix	,le,
SGE	fix	,ge,

to	fix	,add,
downto	fix	,sub,
step	fix	,,

jnne	equ	je
jnna	equ 	ja
jnnb	equ 	jb
jnng	equ 	jg
jnnl	equ 	jl
jnnae 	equ 	jae
jnnbe 	equ 	jbe
jnnge 	equ 	jge
jnnle 	equ 	jle

macro	.if var1,cond,var2
{
local	..endif,..else
	__ENDIF equ ..endif
	__ELSE equ ..else
	if cond eq & var2 eq
		cmp	var1,0
		je __ELSE
	else
		cmp	var1,var2
		jn#cond __ELSE
	end if
}
macro	.and.if var1,cond,var2
{
	if cond eq & var2 eq
		cmp	var1,0
		je __ELSE
	else
		cmp	var1,var2
		jn#cond __ELSE
	end if
}
macro .break.if var1,cond,var2
{
	if cond eq & var2 eq
		cmp	var1,0
		jne __BREAK
	else
		cmp	var1,var2
		j#cond	__BREAK
	end if
}
macro	.else
{
local	..else
	jmp	__ENDIF
	__ELSE:
	restore __ELSE
	__ELSE equ ..else
}
macro	.else.if var1,cond,var2
{
local	..else
	jmp	__ENDIF
	__ELSE:
	restore __ELSE
	__ELSE equ ..else
	if cond eq & var2 eq
		cmp	var1,0
		je __ELSE
	else
		cmp	var1,var2
		jn#cond __ELSE
	end if
}
macro	.endif
{
	__ELSE:
	__ENDIF:
	restore __ELSE
	restore __ENDIF
}
macro	.while	var1,cond,var2
{
local	..endwhile,..beginwhile,..break,..continue
	__CONTINUE	equ	..continue
	__BREAK		equ	..break
	__ENDWHILE	equ	..endwhile
	__BEGINWHILE	equ	..beginwhile
	__BEGINWHILE:
	__CONTINUE:
	if var1 eq & cond eq & var2 eq
	else if cond eq & var2 eq
		cmp	var1,0
		je __ENDWHILE
	else
		cmp	var1,var2
		jn#cond __ENDWHILE
	end if
}
macro	.endwhile
{
	jmp	__BEGINWHILE
	__ENDWHILE:
	__BREAK:
	restore __CONTINUE
	restore __BREAK
	restore __BEGINWHILE
	restore __ENDWHILE
}
macro	.repeat
{
local	..beginrepeat,..break,..continue
	__CONTINUE	equ	..continue
	__BREAK		equ	..break
	__BEGINREPEAT	equ	..beginrepeat
	__BEGINREPEAT:
	__CONTINUE:
}
macro	.until	var1,cond,var2
{
	if var1 eq & cond eq & var2 eq
		jmp	__BEGINREPEAT
	else if cond eq & var2 eq
		cmp	var1,0
		je __BEGINREPEAT
	else
		cmp	var1,var2
		jn#cond __BEGINREPEAT
	end if
	__BREAK:
	restore __CONTINUE
	restore __BREAK
	restore __BEGINREPEAT
}
macro	.switch	var
{
local	..break,..continue,..endcase
	__BREAK		equ	..break
	__CONTINUE	equ 	..continue
	__ENDCASE	equ	..endcase
	__VARIABLE	equ	var
	__CONTINUE:
}
macro	.case	val
{
local	..endcase
	__ENDCASE:
	restore		__ENDCASE
	__ENDCASE	equ	..endcase
	cmp	__VARIABLE,val
	jne	__ENDCASE
}
macro	.default
{
local	..endcase
	__ENDCASE:
	restore __ENDCASE
	__ENDCASE	equ	..endcase
}
macro	.endswitch
{
	__BREAK:
	__ENDCASE:
	restore	__VARIABLE
	restore __BREAK
	restore __CONTINUE
	restore __ENDCASE
}
macro	.for	var,val1,oper,val2,_step,stepval
{
local	..continue,..break,..endfor,..beginfor
	__BEGINFOR	equ	..beginfor
	__CONTINUE	equ	..continue
	__BREAK		equ	..break
	__ENDFOR	equ 	..endfor
	__VARIABLE	equ 	var
	__OPERATOR	equ 	oper
	__STEPVAL	equ 	stepval
	mov	var,val1
	__CONTINUE:
	__BEGINFOR:
	cmp	var,val2
	if oper eq add
		jge	__ENDFOR
	else
		jle	__ENDFOR
	end if
}
macro	.endfor
{
	if __STEPVAL eq | __STEPVAL eq 1
		if __OPERATOR eq sub
		dec __VARIABLE
		else
		inc __VARIABLE
		end if
	else
		__OPERATOR __VARIABLE,__STEPVAL
	end if
	jmp	__BEGINFOR
	__BREAK:
	__ENDFOR:
	restore	__OPERATOR
	restore	__STEPVAL
	restore	__VARIABLE
	restore	__BREAK
	restore	__ENDFOR
	restore	__CONTINUE
	restore __BEGINFOR
}

macro .break
{
	jmp	__BREAK
}
macro .continue
{
	jmp	__CONTINUE
}
macro	.goto	lbl
{
	jmp	lbl
}

macro	.assume	ptr,reg,str
{
	virtual	at reg
	ptr	str
	end	virtual
}

macro	pushcall	proc,[arg]
{
  reverse
  IF 	arg eq
  ELSE IF arg eqtype ""
  	call	@f
  	DB	arg,0
  	@@:
  ELSE		
  	push	arg
  END IF	
  common
  	call	[proc]	
}