+#
+# For debugging define -DSDCC.DEBUG command line option
+
+;--------------------------------
+; Debugging Macros
+
+!ifdef SDCC.DEBUG
+ Var SDCC.FunctionName
+ Var SDCC.StrStack0
+ Var SDCC.StrStack1
+ Var SDCC.StrStack2
+ Var SDCC.StrStack3
+ Var SDCC.StrStack4
+
+!define SDCC.PushStr "!insertmacro MACRO_SDCC_PushStr"
+!macro MACRO_SDCC_PushStr NAME
+ StrCpy $SDCC.StrStack4 $SDCC.StrStack3
+ StrCpy $SDCC.StrStack3 $SDCC.StrStack2
+ StrCpy $SDCC.StrStack2 $SDCC.StrStack1
+ StrCpy $SDCC.StrStack1 $SDCC.StrStack0
+ StrCpy $SDCC.StrStack0 $SDCC.FunctionName
+ StrCpy $SDCC.FunctionName "${NAME}"
+!macroend
+
+!define SDCC.PopStr "!insertmacro MACRO_SDCC_PopStr"
+!macro MACRO_SDCC_PopStr
+ StrCpy $SDCC.FunctionName $SDCC.StrStack0
+ StrCpy $SDCC.StrStack0 $SDCC.StrStack1
+ StrCpy $SDCC.StrStack1 $SDCC.StrStack2
+ StrCpy $SDCC.StrStack2 $SDCC.StrStack3
+ StrCpy $SDCC.StrStack3 $SDCC.StrStack4
+!macroend
+!endif
+
+!define DebugMsg "!insertmacro MACRO_SDCC_DebugMsg"
+!macro MACRO_SDCC_DebugMsg MSG
+ !ifdef SDCC.DEBUG
+ MessageBox MB_OK "*** $SDCC.FunctionName: ${MSG} ***"
+ !endif
+!macroend
+
+!define Function "!insertmacro MACRO_SDCC_Function"
+!macro MACRO_SDCC_Function NAME
+ Function "${NAME}"
+ !ifdef SDCC.DEBUG
+ ${SDCC.PushStr} ${NAME}
+ !endif
+!macroend
+
+!define FunctionEnd "!insertmacro MACRO_SDCC_FunctionEnd"
+!macro MACRO_SDCC_FunctionEnd
+ !ifdef SDCC.DEBUG
+ ${SDCC.PopStr}
+ !endif
+ FunctionEnd
+!macroend
+
+!define Section "!insertmacro MACRO_SDCC_Section"
+!macro MACRO_SDCC_Section NAME ID
+ Section "${NAME}" "${ID}"
+ !ifdef SDCC.DEBUG
+ ${SDCC.PushStr} "${NAME}"
+ !endif
+!macroend
+
+!define UnselectedSection "!insertmacro MACRO_SDCC_UnselectedSection"
+!macro MACRO_SDCC_UnselectedSection NAME ID
+ Section /o ${NAME} ${ID}
+ !ifdef SDCC.DEBUG
+ ${SDCC.PushStr} "${NAME}"
+ !endif
+!macroend
+
+!define SectionEnd "!insertmacro MACRO_SDCC_SectionEnd"
+!macro MACRO_SDCC_SectionEnd
+ !ifdef SDCC.DEBUG
+ ${SDCC.PopStr}
+ !endif
+ SectionEnd
+!macroend