Click or drag to resize

CommandListAppendBranchAbs(Int32, UInt32, IOPort, Boolean, Boolean, UInt32) Method

Conditionally branches to an absolute target command position within the current list.


Namespace: RAYLASE.SPICE3.ClientLib
Assembly: RAYLASE.SPICE3.ClientLib (in RAYLASE.SPICE3.ClientLib.dll) Version: 3.5.2
Syntax
C#
public void AppendBranchAbs(
	int pos,
	uint cond,
	IOPort port,
	bool compareCondAsMask,
	bool ifNotTrue = false,
	uint mask = 4294967295
)

Parameters

pos  Int32
The absolute position of the branch target command within the current list.
cond  UInt32
The condition mask. Note that how this value is matched against the I/O port value depends on the compareCondAsMask flag and on mask.
port  IOPort
The port which is queried to test the condition against.
compareCondAsMask  Boolean
false
cond value (cv) must exactly match the I/O port value (pv) read back from port at the time of execution.
Only the bits set in mask are compared.
The condition evaluates to true if (cv & mask) == (pv & mask).
true
cond value (cv) itself is applied as a bit mask to the I/O port value (pv) read back from port at the time of execution.

The condition evaluates to true if (cv & pv) != 0.

ifNotTrue  Boolean  (Optional)
false (default)
The branch is taken if the condition is true.
true
The branch is taken if the condition is false.
mask  UInt32  (Optional)
This is only used when compareCondAsMask is set to false. Only the bits set to 1 in mask are compared. All bits set to 0 are ignored.
Remarks

Appends a BRANCH_ABS_COND command to the list.

Caution note  Caution

Conditional BRANCH commands do NOT automatically de-activate the laser.

Please refer to 12.9 Notes on Flow-Control Commands.


See also: 12.5.3.1 Flow-Control within the current Command List

Example
Common Branch Command Examples
uint bitmask = 0x5AA5;

string labelname = "label";
string varname = "var";

CommandList list = new CommandList();
list.AppendJumpAbs( 0, 0 );         // at list offset 0.
list.AppendMarkAbs( 500, 500 );     // at list offset 1.
list.AppendJumpAbs( 100, 200 );     // at list offset 2.
list.AppendLabel( labelname );      // label placed before the command it designates
list.AppendMarkAbs( 500, 500 );     // <--- this is the branch target, at list offset 3.
list.AppendJumpAbs( 200, 300 );     // at list offset 4.

// Append various branch commands to the list:
for ( int i = 0; i < 9; i++ )
{
    switch ( i )
    {
        case 0:
            list.AppendBranchAbs( 3 ); // Unconditional
            break;

        case 1:
            list.AppendBranchRel( -2 ); // Unconditional
            break;

        case 2:
            list.AppendBranchToLabel( labelname ); // Unconditional
            break;

        case 3:
            list.AppendBranchAbs( 3, bitmask, IOPort.PortB, true ); // Conditional on value read from port.
            break;

        case 4:
            list.AppendBranchRel( -2, bitmask, IOPort.PortB, true ); // Conditional on value read from port.
            break;

        case 5:
            list.AppendBranchToLabel( labelname, bitmask, IOPort.PortB, true ); // Conditional on value read from port.
            break;

        case 6:
            list.AppendBranchAbs( 3, varname ); // Conditional on value of the boolean variable on the card.
            break;

        case 7:
            list.AppendBranchRel( -2, varname ); // Conditional on value of the boolean variable on the card.
            break;

        case 8:
            list.AppendBranchToLabel( labelname, varname ); // Conditional on value of the boolean variable on the card.
            break;

        default:
            break;
    };

    Console.WriteLine( $"{i + 1}: list commands:" );
    int count = 0;
    foreach ( var cmd in list )
        if ( count < ( list.Count - 2 ) )
            Console.Write( $" {count++}: {cmd.ToString()} " );
        else
            Console.WriteLine( $" {count++}: {cmd.ToString()}" );

    list.RemoveAt( list.Count - 1 ); // we're going to replace the branch command, but re-use the rest of the list
};

// output should be:
// 1: list commands:
//  0: { JA, P2D[ X=0 Y=0 ] }  1: { MA, P2D[ X=500 Y=500 ] }  2: { JA, P2D[ X=100 Y=200 ] }  3: { MA, P2D[ X=500 Y=500 ] }  4: { JA, P2D[ X=200 Y=300 ] }
//  5: { BA, I32[ 3 ] }
// 2: list commands:
//  0: { JA, P2D[ X=0 Y=0 ] }  1: { MA, P2D[ X=500 Y=500 ] }  2: { JA, P2D[ X=100 Y=200 ] }  3: { MA, P2D[ X=500 Y=500 ] }  4: { JA, P2D[ X=200 Y=300 ] }
//  5: { BR, I32[ -2 ] }
// 3: list commands:
//  0: { JA, P2D[ X=0 Y=0 ] }  1: { MA, P2D[ X=500 Y=500 ] }  2: { JA, P2D[ X=100 Y=200 ] }  3: { MA, P2D[ X=500 Y=500 ] }  4: { JA, P2D[ X=200 Y=300 ] }
//  5: { BA, I32[ 0 ] }
// 4: list commands:
//  0: { JA, P2D[ X=0 Y=0 ] }  1: { MA, P2D[ X=500 Y=500 ] }  2: { JA, P2D[ X=100 Y=200 ] }  3: { MA, P2D[ X=500 Y=500 ] }  4: { JA, P2D[ X=200 Y=300 ] }
//  5: { BAC, I32[ 3 ], U32[ 23205 ], I32[ 1 ], Bool[ False ], Bool[ True ], U32[ 4294967295 ] }
// 5: list commands:
//  0: { JA, P2D[ X=0 Y=0 ] }  1: { MA, P2D[ X=500 Y=500 ] }  2: { JA, P2D[ X=100 Y=200 ] }  3: { MA, P2D[ X=500 Y=500 ] }  4: { JA, P2D[ X=200 Y=300 ] }
//  5: { BRC, I32[ -2 ], U32[ 23205 ], I32[ 1 ], Bool[ False ], Bool[ True ], U32[ 4294967295 ] }
// 6: list commands:
//  0: { JA, P2D[ X=0 Y=0 ] }  1: { MA, P2D[ X=500 Y=500 ] }  2: { JA, P2D[ X=100 Y=200 ] }  3: { MA, P2D[ X=500 Y=500 ] }  4: { JA, P2D[ X=200 Y=300 ] }
//  5: { BAC, I32[ 0 ], U32[ 23205 ], I32[ 1 ], Bool[ False ], Bool[ True ], U32[ 4294967295 ] }
// 7: list commands:
//  0: { JA, P2D[ X=0 Y=0 ] }  1: { MA, P2D[ X=500 Y=500 ] }  2: { JA, P2D[ X=100 Y=200 ] }  3: { MA, P2D[ X=500 Y=500 ] }  4: { JA, P2D[ X=200 Y=300 ] }
//  5: { BACF, I32[ 3 ], U32[ 2317739966 ], Bool[ False ] }
// 8: list commands:
//  0: { JA, P2D[ X=0 Y=0 ] }  1: { MA, P2D[ X=500 Y=500 ] }  2: { JA, P2D[ X=100 Y=200 ] }  3: { MA, P2D[ X=500 Y=500 ] }  4: { JA, P2D[ X=200 Y=300 ] }
//  5: { BRCF, I32[ -2 ], U32[ 2317739966 ], Bool[ False ] }
// 9: list commands:
//  0: { JA, P2D[ X=0 Y=0 ] }  1: { MA, P2D[ X=500 Y=500 ] }  2: { JA, P2D[ X=100 Y=200 ] }  3: { MA, P2D[ X=500 Y=500 ] }  4: { JA, P2D[ X=200 Y=300 ] }
//  5: { BACF, I32[ 0 ], U32[ 2317739966 ], Bool[ False ] }
See Also