DATA_BLOCK DB 100
STRUCT
	VAR0		: STRING [254] := '';
	VAR1		: STRING [10] := 'test2';
	VAR2		: STRING [1] := 'i';
	FULLSTR0	: STRING;		// Awlsim extension: No dimension = 254
	FULLSTR1	: STRING := 'abc';	// Awlsim extension: No dimension = 254
	ARRSTR0		: ARRAY [1 .. 2] OF STRING[3] := '01', '02';
	ARRSTR1		: ARRAY [1 .. 2] OF STRING [3];
	VAR3		: STRING [10];
END_STRUCT;
BEGIN
	VAR0		:= 'test1';
	VAR1		:= 'tt';
	ARRSTR1[1]	:= '11';
	ARRSTR1[2]	:= '12';
END_DATA_BLOCK


FUNCTION FC 1 : VOID
VAR_INPUT
	FCS0	: STRING [254];
	FCS1	: STRING [1];	// Awlsim extension: size != 254
	FCS2	: STRING [10];	// Awlsim extension: size != 254
	FCSTR0	: STRING;	// Awlsim extension: No dimension = 254
	FCSTR1	: STRING;	// Awlsim extension: No dimension = 254
END_VAR
VAR_TEMP
	DBNR	: INT;
END_VAR
BEGIN
	// Check access via DB-pointer.
	// Check #FCS0
	L		P##FCS0
	LAR1
	UD		DW#16#FF000000
	__ASSERT==	__ACCU 1,	DW#16#87000000
	L		W [AR1, P#0.0]
	T		#DBNR
	__ASSERT==	__ACCU 1,	100
	AUF		DB [#DBNR]
	L		D [AR1, P#2.0]
	LAR1
	__ASSERT==	__ACCU 1,	P#DBX 0.0
	L		W [AR1, P#0.0]
	__ASSERT==	__ACCU 1,	W#16#FE05
	L		D [AR1, P#2.0]
	__ASSERT==	__ACCU 1,	'test'
	L		B [AR1, P#6.0]
	__ASSERT==	__ACCU 1,	'1'
	L		B [AR1, P#7.0]
	__ASSERT==	__ACCU 1,	0

	// Check #FCS1
	L		P##FCS1
	LAR1
	UD		DW#16#FF000000
	__ASSERT==	__ACCU 1,	DW#16#87000000
	L		W [AR1, P#0.0]
	T		#DBNR
	__ASSERT==	__ACCU 1,	100
	AUF		DB [#DBNR]
	L		D [AR1, P#2.0]
	LAR1
	__ASSERT==	__ACCU 1,	P#DBX 268.0
	L		W [AR1, P#0.0]
	__ASSERT==	__ACCU 1,	W#16#0101
	L		B [AR1, P#2.0]
	__ASSERT==	__ACCU 1,	'i'
	L		B [AR1, P#3.0]
	__ASSERT==	__ACCU 1,	0

	// Check #FCS2
	L		P##FCS2
	LAR1
	UD		DW#16#FF000000
	__ASSERT==	__ACCU 1,	DW#16#87000000
	L		W [AR1, P#0.0]
	__ASSERT==	__ACCU 1,	0
	L		D [AR1, P#2.0]
	LAR1
	UD		DW#16#FF000000
	__ASSERT==	__ACCU 1,	DW#16#87000000
	L		W [AR1, P#0.0]
	__ASSERT==	__ACCU 1,	W#16#0A06
	L		D [AR1, P#2.0]
	__ASSERT==	__ACCU 1,	'aabb'
	L		W [AR1, P#6.0]
	__ASSERT==	__ACCU 1,	'cc'

	// Check #FCSTR0
	L		P##FCSTR0
	LAR1
	UD		DW#16#FF000000
	__ASSERT==	__ACCU 1,	DW#16#87000000
	L		W [AR1, P#0.0]
	T		#DBNR
	__ASSERT==	__ACCU 1,	100
	AUF		DB [#DBNR]
	L		D [AR1, P#2.0]
	LAR1
	__ASSERT==	__ACCU 1,	P#DBX 272.0
	L		W [AR1, P#0.0]
	__ASSERT==	__ACCU 1,	W#16#FE00
	L		B [AR1, P#2.0]
	__ASSERT==	__ACCU 1,	0

	// Check #FCSTR1
	L		P##FCSTR1
	LAR1
	UD		DW#16#FF000000
	__ASSERT==	__ACCU 1,	DW#16#87000000
	L		W [AR1, P#0.0]
	T		#DBNR
	__ASSERT==	__ACCU 1,	100
	AUF		DB [#DBNR]
	L		D [AR1, P#2.0]
	LAR1
	__ASSERT==	__ACCU 1,	P#DBX 528.0
	L		W [AR1, P#0.0]
	__ASSERT==	__ACCU 1,	W#16#FE03
	L		B [AR1, P#2.0]
	__ASSERT==	__ACCU 1,	'a'
	L		B [AR1, P#3.0]
	__ASSERT==	__ACCU 1,	'b'
	L		B [AR1, P#4.0]
	__ASSERT==	__ACCU 1,	'c'
	L		B [AR1, P#5.0]
	__ASSERT==	__ACCU 1,	0


	// Check direct access.
	// Check #FCS0
	L		#FCS0[1]
	__ASSERT==	__ACCU 1,	't'
	L		#FCS0[2]
	__ASSERT==	__ACCU 1,	'e'
	L		#FCS0[3]
	__ASSERT==	__ACCU 1,	's'
	L		#FCS0[4]
	__ASSERT==	__ACCU 1,	't'
	L		#FCS0[5]
	__ASSERT==	__ACCU 1,	'1'
	L		#FCS0[6]
	__ASSERT==	__ACCU 1,	0

	// Check #FCS1
	L		#FCS1[1]
	__ASSERT==	__ACCU 1,	'i'

	// Check #FCS2
	L		#FCS2[1]
	__ASSERT==	__ACCU 1,	'a'
	L		#FCS2[2]
	__ASSERT==	__ACCU 1,	'a'
	L		#FCS2[3]
	__ASSERT==	__ACCU 1,	'b'
	L		#FCS2[4]
	__ASSERT==	__ACCU 1,	'b'
	L		#FCS2[5]
	__ASSERT==	__ACCU 1,	'c'
	L		#FCS2[6]
	__ASSERT==	__ACCU 1,	'c'
	L		#FCS2[7]
	__ASSERT==	__ACCU 1,	0

	// Check #FCSTR0
	L		#FCSTR0[1]
	__ASSERT==	__ACCU 1,	0

	// Check #FCSTR1
	L		#FCSTR1[1]
	__ASSERT==	__ACCU 1,	'a'
	L		#FCSTR1[2]
	__ASSERT==	__ACCU 1,	'b'
	L		#FCSTR1[3]
	__ASSERT==	__ACCU 1,	'c'
	L		#FCSTR1[4]
	__ASSERT==	__ACCU 1,	0
END_FUNCTION


FUNCTION_BLOCK FB 1
VAR_INPUT
	FBS0	: STRING [254] := 'xy';
	FBS1	: STRING [1] := 'z';
	FBS2	: STRING [10];
	FBSTR0	: STRING;	// Awlsim extension: No dimension = 254
	FBSTR1	: STRING;	// Awlsim extension: No dimension = 254
END_VAR
VAR_TEMP
	DBNR	: INT;
END_VAR
BEGIN
	// Check access via pointer.
	// Check #FBS0
	L		P##FBS0
	LAR1
	__ASSERT==	__ACCU 1,	P#DIX 0.0
	L		W [AR1, P#0.0]
	__ASSERT==	__ACCU 1,	W#16#FE05
	L		D [AR1, P#2.0]
	__ASSERT==	__ACCU 1,	'test'
	L		B [AR1, P#6.0]
	__ASSERT==	__ACCU 1,	'1'
	L		B [AR1, P#7.0]
	__ASSERT==	__ACCU 1,	0

	// Check #FBS1
	L		P##FBS1
	LAR1
	__ASSERT==	__ACCU 1,	P#DIX 256.0
	L		W [AR1, P#0.0]
	__ASSERT==	__ACCU 1,	W#16#0101
	L		B [AR1, P#2.0]
	__ASSERT==	__ACCU 1,	'i'
	L		B [AR1, P#3.0]
	__ASSERT==	__ACCU 1,	0

	// Check #FBS2
	L		P##FBS2
	LAR1
	__ASSERT==	__ACCU 1,	P#DIX 260.0
	L		W [AR1, P#0.0]
	__ASSERT==	__ACCU 1,	W#16#0A06
	L		D [AR1, P#2.0]
	__ASSERT==	__ACCU 1,	'aabb'
	L		W [AR1, P#6.0]
	__ASSERT==	__ACCU 1,	'cc'

	// Check #FBSTR0
	L		P##FBSTR0
	LAR1
	__ASSERT==	__ACCU 1,	P#DIX 272.0
	L		W [AR1, P#0.0]
	__ASSERT==	__ACCU 1,	W#16#FE00
	L		B [AR1, P#2.0]
	__ASSERT==	__ACCU 1,	0

	// Check #FBSTR1
	L		P##FBSTR1
	LAR1
	__ASSERT==	__ACCU 1,	P#DIX 528.0
	L		W [AR1, P#0.0]
	__ASSERT==	__ACCU 1,	W#16#FE03
	L		B [AR1, P#2.0]
	__ASSERT==	__ACCU 1,	'a'
	L		B [AR1, P#3.0]
	__ASSERT==	__ACCU 1,	'b'
	L		B [AR1, P#4.0]
	__ASSERT==	__ACCU 1,	'c'
	L		B [AR1, P#5.0]
	__ASSERT==	__ACCU 1,	0


	// Check direct access.
	// Check #FBS0
	L		#FBS0[1]
	__ASSERT==	__ACCU 1,	't'
	L		#FBS0[2]
	__ASSERT==	__ACCU 1,	'e'
	L		#FBS0[3]
	__ASSERT==	__ACCU 1,	's'
	L		#FBS0[4]
	__ASSERT==	__ACCU 1,	't'
	L		#FBS0[5]
	__ASSERT==	__ACCU 1,	'1'
	L		#FBS0[6]
	__ASSERT==	__ACCU 1,	0

	// Check #FBS1
	L		#FBS1[1]
	__ASSERT==	__ACCU 1,	'i'

	// Check #FBS2
	L		#FBS2[1]
	__ASSERT==	__ACCU 1,	'a'
	L		#FBS2[2]
	__ASSERT==	__ACCU 1,	'a'
	L		#FBS2[3]
	__ASSERT==	__ACCU 1,	'b'
	L		#FBS2[4]
	__ASSERT==	__ACCU 1,	'b'
	L		#FBS2[5]
	__ASSERT==	__ACCU 1,	'c'
	L		#FBS2[6]
	__ASSERT==	__ACCU 1,	'c'
	L		#FBS2[7]
	__ASSERT==	__ACCU 1,	0

	// Check #FBSTR0
	L		#FBSTR0[1]
	__ASSERT==	__ACCU 1,	0

	// Check #FBSTR1
	L		#FBSTR1[1]
	__ASSERT==	__ACCU 1,	'a'
	L		#FBSTR1[2]
	__ASSERT==	__ACCU 1,	'b'
	L		#FBSTR1[3]
	__ASSERT==	__ACCU 1,	'c'
	L		#FBSTR1[4]
	__ASSERT==	__ACCU 1,	0
END_FUNCTION_BLOCK


DATA_BLOCK DB 1
	FB 1
BEGIN
END_DATA_BLOCK


FUNCTION FC 2 : STRING
VAR_INPUT
	FCINSTR	: STRING;
END_VAR
BEGIN
	// Copy #FCINSTR to #RET_VAL
	L		#FCINSTR[1]
	T		#RET_VAL[1]
	L		#FCINSTR[2]
	T		#RET_VAL[2]
	L		#FCINSTR[3]
	T		#RET_VAL[3]
	L		#FCINSTR[4]
	T		#RET_VAL[4]
	L		#FCINSTR[5]
	T		#RET_VAL[5]
	L		#FCINSTR[6]
	T		#RET_VAL[6]
	L		#FCINSTR[7]
	T		#RET_VAL[7]
	L		#FCINSTR[8]
	T		#RET_VAL[8]
	L		#FCINSTR[9]
	T		#RET_VAL[9]
	L		#FCINSTR[10]
	T		#RET_VAL[10]
END_FUNCTION


ORGANIZATION_BLOCK OB 1
BEGIN
	// Check short string immediates in L-instruction.
	L	'abcd'
	__ASSERT==	__ACCU 1,	DW#16#61626364
	L	'abc'
	__ASSERT==	__ACCU 1,	DW#16#00616263
	L	'ab'
	__ASSERT==	__ACCU 1,	DW#16#00006162
	L	'a'
	__ASSERT==	__ACCU 1,	DW#16#00000061
	L	''
	__ASSERT==	__ACCU 1,	DW#16#00000000


	// Check DB 100 initial values
	AUF		DB 100
	// Check DB100.VAR0
	L		DBW 0
	__ASSERT==	__ACCU 1,	W#16#FE05
	L		DBD 2
	__ASSERT==	__ACCU 1,	'test'
	L		DBD 6
	__ASSERT==	__ACCU 1,	DW#16#31000000
	L		DBW 10
	__ASSERT==	__ACCU 1,	0
	LAR1		P#DBX 12.0
VAR0:	L		D [AR1, P#0.0]
	__ASSERT==	__ACCU 1,	0
	+AR1		P#4.0
	TAR1
	L		P#DBX 256.0
	<>D
	SPB		VAR0
	// Check DB100.VAR1
	L		DBW 256
	__ASSERT==	__ACCU 1,	W#16#0A02
	L		DBD 258
	__ASSERT==	__ACCU 1,	DW#16#74740000
	L		DBD 262
	__ASSERT==	__ACCU 1,	0
	L		DBW 266
	__ASSERT==	__ACCU 1,	0
	// Check DB100.VAR2
	L		DBW 268
	__ASSERT==	__ACCU 1,	W#16#0101
	L		DBB 270
	__ASSERT==	__ACCU 1,	'i'
	L		DBB 271
	__ASSERT==	__ACCU 1,	0
	// Check DB100.FULLSTR0
	L		DBW 272
	__ASSERT==	__ACCU 1,	W#16#FE00
	L		DBW 274
	__ASSERT==	__ACCU 1,	0
	LAR1		P#DBX 276.0
STR0:	L		D [AR1, P#0.0]
	__ASSERT==	__ACCU 1,	0
	+AR1		P#4.0
	TAR1
	L		P#DBX 528.0
	<>D
	SPB		STR0
	// Check DB100.FULLSTR1
	L		DBW 528
	__ASSERT==	__ACCU 1,	W#16#FE03
	L		DBD 530
	__ASSERT==	__ACCU 1,	DW#16#61626300
	L		DBW 534
	__ASSERT==	__ACCU 1,	0
	LAR1		P#DBX 536.0
STR1:	L		D [AR1, P#0.0]
	__ASSERT==	__ACCU 1,	0
	+AR1		P#4.0
	TAR1
	L		P#DBX 784.0
	<>D
	SPB		STR1
	// Check DB100.ARRSTR0[1]
	L		DBW 784
	__ASSERT==	__ACCU 1,	W#16#0302
	L		DBD 786
	__ASSERT==	__ACCU 1,	DW#16#30310000
	// Check DB100.ARRSTR0[2]
	L		DBW 790
	__ASSERT==	__ACCU 1,	W#16#0302
	L		DBD 792
	__ASSERT==	__ACCU 1,	DW#16#30320000
	// Check DB100.ARRSTR1[1]
	L		DBW 796
	__ASSERT==	__ACCU 1,	W#16#0302
	L		DBD 798
	__ASSERT==	__ACCU 1,	DW#16#31310000
	// Check DB100.ARRSTR1[2]
	L		DBW 802
	__ASSERT==	__ACCU 1,	W#16#0302
	L		DBD 804
	__ASSERT==	__ACCU 1,	DW#16#31320000
	// Check DB100.VAR3
	L		DBW 808
	__ASSERT==	__ACCU 1,	W#16#0A00
	L		DBD 810
	__ASSERT==	__ACCU 1,	0
	L		DBD 814
	__ASSERT==	__ACCU 1,	0
	L		DBW 818
	__ASSERT==	__ACCU 1,	0


	// Check fully qualified symbolic access to DB 100
	// Check DB100.VAR0
	L		DB100.VAR0[1]
	__ASSERT==	__ACCU 1,	't'
	L		DB100.VAR0[2]
	__ASSERT==	__ACCU 1,	'e'
	L		DB100.VAR0[3]
	__ASSERT==	__ACCU 1,	's'
	L		DB100.VAR0[4]
	__ASSERT==	__ACCU 1,	't'
	L		DB100.VAR0[5]
	__ASSERT==	__ACCU 1,	'1'
	L		DB100.VAR0[6]
	__ASSERT==	__ACCU 1,	0
	// Check DB100.VAR1
	L		DB100.VAR1[1]
	__ASSERT==	__ACCU 1,	't'
	L		DB100.VAR1[2]
	__ASSERT==	__ACCU 1,	't'
	L		DB100.VAR1[3]
	__ASSERT==	__ACCU 1,	0
	// Check DB100.VAR2
	L		DB100.VAR2[1]
	__ASSERT==	__ACCU 1,	'i'
	// Check DB100.FULLSTR0
	L		DB100.FULLSTR0[1]
	__ASSERT==	__ACCU 1,	0
	// Check DB100.FULLSTR1
	L		DB100.FULLSTR1[1]
	__ASSERT==	__ACCU 1,	'a'
	L		DB100.FULLSTR1[2]
	__ASSERT==	__ACCU 1,	'b'
	L		DB100.FULLSTR1[3]
	__ASSERT==	__ACCU 1,	'c'
	L		DB100.FULLSTR1[4]
	__ASSERT==	__ACCU 1,	0
	// Check DB100.VAR3
	L		DB100.VAR3[1]
	__ASSERT==	__ACCU 1,	0


	// Check string parameter passing
	CALL	FC 1 (
		FCS0	:= DB100.VAR0,
		FCS1	:= DB100.VAR2,
		FCS2	:= 'aabbcc',	// Extension: param string immediate
		FCSTR0	:= DB100.FULLSTR0,
		FCSTR1	:= DB100.FULLSTR1,
	)
	CALL	FB 1, DB 1 (
		FBS0	:= DB100.VAR0,
		FBS1	:= DB100.VAR2,
		FBS2	:= 'aabbcc',	// Extension: param string immediate
		FBSTR0	:= DB100.FULLSTR0,
		FBSTR1	:= DB100.FULLSTR1,
	)


	// Check STRING as RET_VAL
	L		DB100.VAR3[1]
	__ASSERT==	__ACCU 1,	0
	L		DB100.VAR3[2]
	__ASSERT==	__ACCU 1,	0
	L		DB100.VAR3[3]
	__ASSERT==	__ACCU 1,	0
	CALL	FC 2 (
		FCINSTR	:= DB100.VAR1,
		RET_VAL	:= DB100.VAR3,
	)
	L		DB100.VAR3[1]
	__ASSERT==	__ACCU 1,	't'
	L		DB100.VAR3[2]
	__ASSERT==	__ACCU 1,	't'
	L		DB100.VAR3[3]
	__ASSERT==	__ACCU 1,	0


	CALL SFC 46 // STOP CPU
END_ORGANIZATION_BLOCK
