IndCall

Syntax:

    IndCall Address

Command Availability:

Available on all microcontrollers.

Explanation:

IndCall provides a basic implementation of function pointers. Address is the program-memory location of the subroutine to be called. There are two ways to specify this: either by providing a direct reference to the subroutine using the @ operator, or by specifying a word variable that contains the address.

This command is useful for callbacks. For example, a particular subroutine might read bytes from a serial connection, but different actions may need to be taken at different times. A different subroutine could be created for each action, and the subroutine for the appropriate action could then be passed to the serial-connection-reading routine each time it is called.

Note: Calling subroutines that have parameters using IndCall is not supported. Errors may occur. If data needs to be passed, use a variable instead.

Example:

    'Flash an LED using an indirect call
    #chip 12F683

    'Create a word variable, and set it to the memory location of the
    'Blink subroutine.
    Dim FlashingSub As Word
    FlashingSub = @Blink

    'Main loop
    Do
    'Indirect call to subroutine at location FlashingSub
    	IndCall FlashingSub          ' <<< the IndCall instruction
    Loop

    'LED flashing subroutine
    Sub Blink
    	PulseOut GPIO.0, 500 ms
    	Wait 500 ms
    End Sub

Key line: IndCall FlashingSub — calls whichever subroutine’s address is currently stored in FlashingSub (here, Blink, set via @Blink above), rather than naming the subroutine directly.

See Also:

  • Do — the loop repeatedly issuing the indirect call above
  • Sub — defining the subroutines that IndCall can target
  • End — related command in the same category