| GOSUB Example | Syntax |
' -------------------------------------------------------------------------
' Program Description
' -------------------------------------------------------------------------
'
' Demonstrates GOSUB with parameter passing across page boundaries. Note
' that the GOSUB keyword is no longer required when using version 1.2
' syntax (SUB definition). Note, too, that the INVERT8 function returns
' an 8-bit value even when a 16-bit (word) is passed as a parameter.
' -------------------------------------------------------------------------
' Device Settings
' -------------------------------------------------------------------------
DEVICE SX28, OSC4MHZ, TURBO, STACKX, OPTIONX
FREQ 4_000_000
ID "GOSUB"
' -------------------------------------------------------------------------
' IO Pins
' -------------------------------------------------------------------------
LEDs VAR RB
TRIS_LEDs VAR TRIS_B
' -------------------------------------------------------------------------
' Constants
' -------------------------------------------------------------------------
Speed CON 100 ' loop delay control
' -------------------------------------------------------------------------
' Variables
' -------------------------------------------------------------------------
zigzag VAR Byte ' zigzag controller
tmpW1 VAR Word ' subroutine work var
' =========================================================================
PROGRAM Start
' =========================================================================
' -------------------------------------------------------------------------
' Subroutine Declarations
' -------------------------------------------------------------------------
DELAY SUB 1, 2 ' delay in milliseconds
INVERT8 FUNC 1, 1, 2 ' invert bits in byte
INVERT16 FUNC 2, 1, 2 ' invert bits in word
' -------------------------------------------------------------------------
' Program Code
' -------------------------------------------------------------------------
Start:
TRIS_LEDs = %00000000 ' make LEDs pins outputs
Main:
zigzag = %00000011
DO
LEDs = INVERT8 zigzag ' invert LED pattern
DELAY Speed ' loop delay
zigzag = zigzag << 1 ' shift bit left
LOOP UNTIL zigzag = %10000000
zigzag = %10000000
DO
LEDs = INVERT8 zigzag
DELAY Speed
zigzag = zigzag >> 1 ' shift bit right
LOOP UNTIL zigzag = %00000001
GOTO Main
' -------------------------------------------------------------------------
' Subroutines Code
' -------------------------------------------------------------------------
' Use: DELAY ms
' -- 'ms' is delay in milliseconds, 1 - 65535
DELAY:
IF __PARAMCNT = 1 THEN
tmpW1 = __PARAM1 ' save byte value
ELSE
tmpW1 = __WPARAM12 ' save word value
ENDIF
PAUSE tmpW1
RETURN
' -------------------------------------------------------------------------
' Use: aVar = INVERT theByte
' -- inverts the bits in 'theByte'
' -- returns 8-bit value, even if 'theByte' is a word (returns inverted LSB)
INVERT8:
tmpW1_LSB = __PARAM1 ' get current value
tmpW1_LSB = ~tmpW1_LSB ' invert the bits
RETURN tmpW1_LSB ' return byte to caller
' -------------------------------------------------------------------------
' Use: aVar = INVERT theWord
' -- inverts the bits in 'theWord'
' -- returns 16-bit value, even if 'theWord' is a byte
INVERT16:
IF __PARAMCNT = 1 THEN
tmpW1 = __PARAM1 ' convert byte to word
ELSE
tmpW1 = __WPARAM12 ' save word value
ENDIF
tmpW1 = ~tmpW1 ' invert the bits
RETURN tmpW1 ' return word to caller
The following example demonstrates the ability to return more than two bytes from a function:
' -------------------------------------------------------------------------
' Program Description
' -------------------------------------------------------------------------
'
' Demonstrates the use of a function and a method for collecting all
' returned bytes when simple (non-array) variables are used.
' -------------------------------------------------------------------------
' Device Settings
' -------------------------------------------------------------------------
DEVICE SX28, OSC4MHZ, TURBO, STACKX, OPTIONX
FREQ 4_000_000
ID "FUNC"
' -------------------------------------------------------------------------
' IO Pins
' -------------------------------------------------------------------------
' -------------------------------------------------------------------------
' Constants
' -------------------------------------------------------------------------
' -------------------------------------------------------------------------
' Variables
' -------------------------------------------------------------------------
result VAR Word ' 32-bit result
resultHi VAR Word
bigVal VAR Byte(4)
tmpW1 VAR Word ' subroutine work vars
tmpW2 VAR Word
tmpW3 VAR Word
WATCH result, 32, UHEX ' display 32-bit result
WATCH bigVal, 32, UHEX
' =========================================================================
PROGRAM Start
' =========================================================================
' -------------------------------------------------------------------------
' Subroutine Declarations
' -------------------------------------------------------------------------
MULT32 FUNC 4, 2, 4
BREAK_NOW SUB 0
' -------------------------------------------------------------------------
' Program Code
' -------------------------------------------------------------------------
Start:
result = MULT32 $FFFF, $0100 ' get low word
resultHi = __PARAM3, __PARAM4 ' get high word
BREAK_NOW
bigVal = MULT32 $1234, $10 ' all return bytes assigned
BREAK_NOW
END
' -------------------------------------------------------------------------
' Subroutine Code
' -------------------------------------------------------------------------
' Use: MULT32 value1, value2
' -- multiplies two values
' -- when mixing a word and byte, the word must be declared first
MULT32:
IF __PARAMCNT = 2 THEN ' byte * byte
tmpW1 = __PARAM1
tmpW2 = __PARAM2
ENDIF
IF __PARAMCNT = 3 THEN ' word * byte
tmpW1 = __WPARAM12
tmpW2 = __PARAM3
ENDIF
IF __PARAMCNT = 4 THEN ' word * word
tmpW1 = __WPARAM12
tmpW2 = __WPARAM34
ENDIF
tmpW3 = tmpW1 ** tmpW2 ' calculate high word
tmpW2 = tmpW1 * tmpW2 ' calculate low word
RETURN tmpW2, tmpW3 ' return 32 bits, LSW first
' -------------------------------------------------------------------------
' Allows multiple breakpoints in program.
BREAK_NOW:
BREAK
RETURN