ORGANIZATION_BLOCK OB 100
BEGIN
	// Check DB/DI register assignments
	__ASSERT==	__DBR 1,	0
	__ASSERT==	__DBR 2,	0
	AUF		DB 1
	__ASSERT==	__DBR 1,	1
	__ASSERT==	__DBR 2,	0
	AUF		DB 2
	__ASSERT==	__DBR 1,	2
	__ASSERT==	__DBR 2,	0
	AUF		DI 1
	__ASSERT==	__DBR 1,	2
	__ASSERT==	__DBR 2,	1
	AUF		DI 2
	__ASSERT==	__DBR 1,	2
	__ASSERT==	__DBR 2,	2


	// Check initial DB 1 values
	AUF		DB 1
	L		DBW 0
	__ASSERT==	__ACCU 1,	1337
	L		DBD 2
	__ASSERT==	__ACCU 1,	DW#16#DEADBEEF
	L		DBW 6
	__ASSERT==	__ACCU 1,	W#16#0102
	L		DBB 8
	__ASSERT==	__ACCU 1,	3
	L		DBB 9
	__ASSERT==	__ACCU 1,	0
	L		DBW 10
	__ASSERT==	__ACCU 1,	42

	// Check initial DB 2 values
	AUF		DB 2
	L		DBW 0
	__ASSERT==	__ACCU 1,	123
	L		DBW 2
	__ASSERT==	__ACCU 1,	456
	L		DBB 4
	__ASSERT==	__ACCU 1,	1
	L		DBB 5
	__ASSERT==	__ACCU 1,	0
	L		DBD 6
	__ASSERT==	__ACCU 1,	DW#16#77777777


	// Check direct DB fetch
	AUF		DB 2
	__ASSERT==	__DBR 1,	2
	L		DB1.DBW 0
	__ASSERT==	__DBR 1,	1
	__ASSERT==	__ACCU 1,	1337
	L		DB1.DBD 2
	__ASSERT==	__DBR 1,	1
	__ASSERT==	__ACCU 1,	DW#16#DEADBEEF
	L		DB1.DBW 6
	__ASSERT==	__DBR 1,	1
	__ASSERT==	__ACCU 1,	W#16#0102
	L		DB1.DBB 8
	__ASSERT==	__DBR 1,	1
	__ASSERT==	__ACCU 1,	3
	L		DB1.DBB 9
	__ASSERT==	__DBR 1,	1
	__ASSERT==	__ACCU 1,	0
	L		DB1.DBW 10
	__ASSERT==	__DBR 1,	1
	__ASSERT==	__ACCU 1,	42
	AUF		DB 1
	__ASSERT==	__DBR 1,	1
	L		DB2.DBW 0
	__ASSERT==	__DBR 1,	2
	__ASSERT==	__ACCU 1,	123


	SET
	=		M 0.0
END_ORGANIZATION_BLOCK



ORGANIZATION_BLOCK OB 1
BEGIN
	// OB 100 execution sanity check
	__ASSERT==	M 0.0,		1

	// Modify the DB 1
	AUF		DB 1
	L		9876
	T		DBW 6
	L		5432
	T		DBW 10
	CLR
	=		DBX 8.0
	SET
	=		DBX 8.2

	// Check the DB 1 values
	L		DBW 0
	__ASSERT==	__ACCU 1,	1337
	L		DBD 2
	__ASSERT==	__ACCU 1,	DW#16#DEADBEEF
	L		DBW 6
	__ASSERT==	__ACCU 1,	9876
	L		DBB 8
	__ASSERT==	__ACCU 1,	6
	L		DBB 9
	__ASSERT==	__ACCU 1,	0
	L		DBW 10
	__ASSERT==	__ACCU 1,	5432


	// Check direct DB store
	AUF		DB 2	// DB 2 on purpose
	L		2244
	T		DB1.DBW 6
	L		L#1008901
	T		DB1.DBD 2
	SET
	=		DB1.DBX 8.0
	L		42
	T		DB1.DBB 9

	L		DB1.DBW 6
	__ASSERT==	__ACCU 1,	2244
	L		DB1.DBD 2
	__ASSERT==	__ACCU 1,	L#1008901
	U		DB1.DBX 8.0
	__ASSERT==	__STW VKE,	1
	L		DB1.DBB 9
	__ASSERT==	__ACCU 1,	42


	// FB 1 call test
	CLR
	=		M 18.0
	CALL		FB 1, DB 2 (
		INPUT_VAR	:= 8877,
		OUTPUT_VAR	:= LW 16,
		INOUT_VAR	:= M 18.0
	)
	__ASSERT==	LW 16,		4433
	__ASSERT==	M 18.0,		1


	// FC 1 call test
	L		1616
	T		LW 16
	L		2020
	T		MW 20
	CALL		FC 1 (
		INPUT_WORD	:= LW 16,
		INPUT_FC	:= FC 2,
		INPUT_FB	:= FB 1,
		INPUT_DB	:= DB 1,
		OUTPUT_BOOL0	:= M 18.0,
		OUTPUT_BOOL1	:= M 18.1,
		INOUT_INT	:= MW 20
	)
	__ASSERT==	M 18.0,		1
	__ASSERT==	M 18.1,		0


	// Check DB/DI register assignments around FC/FB calls
	AUF		DB 12
	AUF		DI 13
	__ASSERT==	__DBR 1,	12
	__ASSERT==	__DBR 2,	13
	CALL		FC 10
	__ASSERT==	__DBR 1,	12
	__ASSERT==	__DBR 2,	13
	CALL		FB 11, DB 11
	__ASSERT==	__DBR 1,	11
	__ASSERT==	__DBR 2,	13


	// Check DBNO, DINO, DBLG and DILG operators
	AUF		DB 1
	AUF		DI 2
	L		DBNO
	__ASSERT==	__ACCU 1,	1
	L		DINO
	__ASSERT==	__ACCU 1,	2
	L		DBLG
	__ASSERT==	__ACCU 1,	12
	L		DILG
	__ASSERT==	__ACCU 1,	10


	CALL SFC 46 // STOP CPU
END_ORGANIZATION_BLOCK



FUNCTION FC 1: VOID
	VAR_INPUT
		INPUT_WORD	: WORD;
		INPUT_FC	: BLOCK_FC;
		INPUT_FB	: BLOCK_FB;
		INPUT_DB	: BLOCK_DB;
	END_VAR
	VAR_OUTPUT
		OUTPUT_BOOL0	: BOOL;
		OUTPUT_BOOL1	: BOOL;
	END_VAR
	VAR_IN_OUT
		INOUT_INT	: INT;
	END_VAR
	VAR_TEMP
		TEMP0		: INT;
		TEMP1		: BOOL;
		TEMP2		: INT;
	END_VAR
BEGIN
	L		#INPUT_WORD
	__ASSERT==	__ACCU 1,	1616

	L		#INOUT_INT
	__ASSERT==	__ACCU 1,	2020

	SET
	=		#OUTPUT_BOOL0
	CLR
	=		#OUTPUT_BOOL1

	L		4343
	T		#TEMP0
	SET
	=		#TEMP1
	L		6565
	T		#TEMP2
	__ASSERT==	LW 0,	4343
	__ASSERT==	L 2.0,	1
	__ASSERT==	LW 4,	6565


	// Check the passed-in DB
	AUF		#INPUT_DB
	L		DBW 0
	__ASSERT==	__ACCU 1,	1337
END_FUNCTION



FUNCTION_BLOCK FB 1
	VAR_INPUT
		INPUT_VAR	: INT;
	END_VAR
	VAR_OUTPUT
		OUTPUT_VAR	: INT;
	END_VAR
	VAR_IN_OUT
		INOUT_VAR	: BOOL;
	END_VAR
	VAR
		STAT_VAR	: DWORD;
	END_VAR
BEGIN
	L		#INPUT_VAR
	__ASSERT==	__ACCU 1,	8877

	L		4433
	T		#OUTPUT_VAR

	U		#INOUT_VAR
	__ASSERT==	__STW VKE,	0
	SET
	=		#INOUT_VAR

	L		#STAT_VAR
	__ASSERT==	__ACCU 1,	DW#16#77777777
END_FUNCTION_BLOCK



FUNCTION FC 10 : VOID
BEGIN
	__ASSERT==	__DBR 1,	12
	__ASSERT==	__DBR 2,	13
	AUF		DB 1
	AUF		DI 2
	__ASSERT==	__DBR 1,	1
	__ASSERT==	__DBR 2,	2
END_FUNCTION



FUNCTION_BLOCK FB 11
BEGIN
	__ASSERT==	__DBR 1,	13
	__ASSERT==	__DBR 2,	11
	AUF		DB 1
	AUF		DI 2
	__ASSERT==	__DBR 1,	1
	__ASSERT==	__DBR 2,	2
END_FUNCTION_BLOCK



DATA_BLOCK DB 1
TITLE = global DB
STRUCT
	VARIABLE0	: INT;
	VARIABLE1	: DWORD;
	VARIABLE2	: WORD;
	VARIABLE3	: BOOL;
	VARIABLE4	: BOOL;
	VARIABLE5	: BOOL;
	VARIABLE6	: INT;
END_STRUCT;
BEGIN
	VARIABLE0	:= 1337;
	VARIABLE1	:= DW#16#DEADBEEF;
	VARIABLE2	:= B#(1, 2);
	VARIABLE3	:= True;
	VARIABLE4	:= True;
	VARIABLE5	:= False;
	VARIABLE6	:= 42;
END_DATA_BLOCK



DATA_BLOCK DB 2
TITLE = instance DB for FB 1
FB 1
BEGIN
	INPUT_VAR	:= 123;
	OUTPUT_VAR	:= 456;
	INOUT_VAR	:= True;
	STAT_VAR	:= DW#16#77777777;
END_DATA_BLOCK



DATA_BLOCK DB 11
TITLE = instance DB for FB 11
FB 11
BEGIN
END_DATA_BLOCK



DATA_BLOCK DB 12
TITLE = global data block 12
STRUCT
	foo		: INT;
END_STRUCT;
BEGIN
	foo		:= 12;
END_DATA_BLOCK



DATA_BLOCK DB 13
TITLE = global data block 13
STRUCT
	bar		: INT;
END_STRUCT;
BEGIN
	bar		:= 13;
END_DATA_BLOCK
