DATA_BLOCK DB 1 STRUCT Value : INT END_STRUCT BEGIN Value := 8290 END_DATA_BLOCK FUNCTION_BLOCK FB 1 BEGIN L W#16#4321 T MW 0 END_FUNCTION_BLOCK FUNCTION FC 1 : VOID BEGIN L W#16#1234 T MW 0 CALL FC 2 END_FUNCTION FUNCTION FC 2 : VOID BEGIN L W#16#6789 T MW 0 L 10 T LB 0 END_FUNCTION FUNCTION FC 3 : VOID BEGIN L 1 T LB 0 CALL FC 2 __ASSERT== LB 0, 1 END_FUNCTION FUNCTION FC 4 : VOID VAR_INPUT INPVAR : INT END_VAR BEGIN L #INPVAR __ASSERT== __ACCU 1, 9976 END_FUNCTION FUNCTION FC 5 : VOID VAR_INPUT INPVAR2 : INT END_VAR BEGIN CALL FC 4 ( INPVAR := #INPVAR2, // This is a parameter ) END_FUNCTION FUNCTION FC 6 : VOID BEGIN // Only check OV and OS bits __ASSERT== __STW OV, 1 __ASSERT== __STW OS, 0 L 1 L 1 +I __ASSERT== __STW OV, 0 __ASSERT== __STW OS, 0 END_FUNCTION FUNCTION FC 7 : VOID BEGIN // Trigger an overflow __ASSERT== __STW OV, 0 __ASSERT== __STW OS, 0 L 30000 L 30000 +I __ASSERT== __STW OV, 1 __ASSERT== __STW OS, 1 END_FUNCTION FUNCTION_BLOCK FB 10 VAR_INPUT INVAR1 : DWORD INVAR2 : INT //TODO more END_VAR VAR_OUTPUT RETURNVALUE : INT END_VAR BEGIN L #INVAR1 __ASSERT== __ACCU 1, DW#16#88776655 CALL FC 10 ( INPUTVAR1 := #INVAR1, INPUTVAR2 := #INVAR2, INVAR_DB := DB1.DBW 0, RET_VAL := #RETURNVALUE, ) END_FUNCTION_BLOCK DATA_BLOCK DB 10 FB 10 BEGIN END_DATA_BLOCK FUNCTION FC 10 : INT VAR_INPUT INPUTVAR1 : DWORD INPUTVAR2 : INT INVAR_DB : INT //TODO more END_VAR BEGIN L #INPUTVAR1 __ASSERT== __ACCU 1, DW#16#88776655 L P##INPUTVAR1 UD DW#16#FFF80000 __ASSERT== __ACCU 1, DW#16#84000000 L #INPUTVAR2 __ASSERT== __ACCU 1, 8290 L #INVAR_DB __ASSERT== __ACCU 1, 8290 L 99 T #RET_VAL L #RET_VAL __ASSERT== __ACCU 1, 99 L P##RET_VAL UD DW#16#FFF80000 __ASSERT== __ACCU 1, DW#16#84000000 CALL FC 11 ( IN1 := #INVAR_DB, ) END_FUNCTION FUNCTION FC 11 : VOID VAR_INPUT IN1 : INT END_VAR BEGIN L #IN1 __ASSERT== __ACCU 1, 8290 END_FUNCTION ORGANIZATION_BLOCK OB 1 BEGIN CALL FC 1 __ASSERT== MW 0, W#16#6789 L 0 T MW 0 __ASSERT== MW 0, 0 UC FC 1 __ASSERT== MW 0, W#16#6789 L 0 T MW 0 __ASSERT== MW 0, 0 SET CC FC 1 __ASSERT== MW 0, W#16#6789 L 0 T MW 0 __ASSERT== MW 0, 0 CLR CC FC 1 __ASSERT== MW 0, 0 // Test localdata stack L 255 T LB 0 __ASSERT== LB 0, 255 CALL FC 3 __ASSERT== LB 0, 255 CALL FC 5 ( INPVAR2 := 9976, ) // Test OV/OS bits over call boundaries __STWRST L 30000 L 30000 +I __ASSERT== __STW OV, 1 __ASSERT== __STW OS, 1 CALL FC 6 __ASSERT== __STW OV, 0 __ASSERT== __STW OS, 0 __STWRST CALL FC 7 __ASSERT== __STW OV, 1 __ASSERT== __STW OS, 0 // Test raw FB call L 0 T MW 0 CLR UC FB 1 L MW 0 __ASSERT== __ACCU 1, W#16#4321 L 0 T MW 0 SET CC FB 1 L MW 0 __ASSERT== __ACCU 1, W#16#4321 // Test indirect calls L 0 T MW 0 L 1 T MW 50 CLR UC FC [MW 50] L MW 0 __ASSERT== __ACCU 1, W#16#6789 L 0 T MW 0 SET CC FC [MW 50] L MW 0 __ASSERT== __ACCU 1, W#16#6789 L 0 T MW 0 CLR UC FB [MW 50] L MW 0 __ASSERT== __ACCU 1, W#16#4321 L 0 T MW 0 SET CC FB [MW 50] L MW 0 __ASSERT== __ACCU 1, W#16#4321 // Test parameter forwarding (FB->FC) CALL FB 10, DB 10 ( INVAR1 := DW#16#88776655, INVAR2 := DB1.DBW 0, RETURNVALUE := MW 0, ) L MW 0 __ASSERT== __ACCU 1, 99 END_ORGANIZATION_BLOCK