;
; Tools
; by Dimiter Simeonov
;
;


;legend
; IF_EQU - if equal
; RV     - register and value
; RR     - register and register
; WR     - W register and f-register
; LW     - Literal and W register
; 'action' must be valid operator as 'goto label', 'call label','return','incf xxxxx(without destination (,f by default))' etc.
 
;IF_EQU_LW		MACRO	   literal,action
;IF_EQU_WR		MACRO      register,action
;IF_EQU_RV		MACRO      register,value,action
;IF_EQU_RR		MACRO      register,register,action

;IF_NOT_EQU_LW  MACRO  literal,action
;IF_NOT_EQU_WR	MACRO  register,action
;IF_NOT_EQU_RV	MACRO  register,value,action
;IF_NOT_EQU_RR	MACRO  register,register,action

;IF_LESS_RV register,value,action  if(R<V) then action
;IF_MORE_RV register,value,action  if(R>V) then action
;IF_LESS_RR register1,register2    if(register1<register2)then action
;IF_MORE_RR register1,register2    if(register1>register2)then action
;IF_LESS_WL literal,action		   if(W<L) then action
;IF_MORE_WL literal,action		   if(W>L) then action

;IF_CARRY action
;IF_NOT_CARRY action
;IF_ZERO  action
;IF_NOT_ZERO action
;(Value in W-reg allways will be lost!)
;IF_BIT_SET port,bit,action
;IF_BIT_NOT_SET port,bit,action


 ifndef MAIN_INC
 ERROR "Include 'Main.inc' header first!"
 endif

 ifndef TOOLS_INC

CALL_FAR MACRO Label           ;Позволява да не се съобразяваш с това в коя страница ти се намира процедурата
 PAGESEL Label
 call Label
 PAGESEL $
 ENDM


IF_EQU_LW		MACRO	   literal,action   ; например  IF_EQU_LW 0x28,goto MyFunc  ако W е равно на 0x28 отиди на етикет MyFunc
 xorlw literal                              ; логиката надоло е същата
 btfsc STATUS,Z
 action
 ENDM
IF_NOT_EQU_LW	MACRO	   literal,action
 xorlw literal
 btfss STATUS,Z
 action
 ENDM

IF_EQU_WR		MACRO register,action
 xorwf register,w
 btfsc STATUS,Z
 action
 ENDM
IF_NOT_EQU_WR	MACRO register,action
 xorwf register,w
 btfss STATUS,Z
 action
 ENDM

IF_EQU_RV		MACRO register,value,action 
 movlw value
 xorwf register,w
 btfsc STATUS,Z
 action
 ENDM
IF_NOT_EQU_RV	MACRO register,value,action
 movlw value
 xorwf register,w
 btfss STATUS,Z
 action
 ENDM

IF_EQU_RR		MACRO register1,register2,action
 movfw register1
 xorwf register2,w
 btfsc STATUS,Z
 action
 ENDM
IF_NOT_EQU_RR		MACRO register1,register2,action
 movfw register1
 xorwf register2,w
 btfss STATUS,Z
 action
 ENDM




SWAP_RR MACRO register1,register2 ;reg1 <--> reg2
 movfw register2
 subwf register1,w
 subwf register1,f
 addwf register2,f 
 ENDM


IF_LESS_RV MACRO register,value,action  ;if(R<V) then action
 movlw value
 subwf register,w
 btfss STATUS,C
 action
 ENDM
IF_MORE_RV MACRO register,value,action  ;if(R>V) then action
 movlw value
 subwf register,w
 btfsc STATUS,C
 action
 ENDM
IF_LESS_RR MACRO register1,register2,action    ;if(register1<register2)then action
 movfw register2
 subwf register1,w
 btfss STATUS,C
 action
 ENDM
IF_MORE_RR MACRO register1,register2,action    ;if(register1>register2)then action
 movfw register2
 subwf register1,w
 btfsc STATUS,C
 action
 ENDM

IF_LESS_WL MACRO literal,action		   ;if(W<L) then action
 sublw literal
 btfsc STATUS,C
 action
 ENDM
IF_MORE_WL MACRO literal,action		   ;if(W>L) then action
 sublw literal
 btfss STATUS,C
 action
 ENDM

IF_LESS_WF MACRO register,action
 subwf register,w
 btfss STATUS,C
 action
 ENDM
IF_MORE_WF MACRO register,action
 subwf register,w
 btfsc STATUS,C
 action
 ENDM


IF_ZERO	 MACRO action
 btfsc STATUS,Z
 action
 ENDM
IF_NOT_ZERO MACRO action
 btfss STATUS,Z
 action
 ENDM
IF_CARRY MACRO action
 btfsc STATUS,C
 action
 ENDM
IF_NOT_CARRY MACRO action
 btfss STATUS,C
 action
 ENDM

IF_BIT_SET     MACRO port,bit,action
 btfsc port,bit
 action
 ENDM

IF_BIT_NOT_SET MACRO port,bit,action
 btfss port,bit
 action
 ENDM





 #define TOOLS_INC

 endif


