FUNCTION FC 1 : VOID BEGIN // Check negative #L. CALL "_STR_PRESET" ( STARTVAL := 0, COUNT := 10, STR := DB1.STR0, ) CALL "_STR_PRESET" ( STARTVAL := 1, COUNT := 10, STR := DB1.STR1, ) CALL "DELETE" ( IN := DB1.STR0, L := -1, P := 1, RET_VAL := DB1.STR1, ) __ASSERT== __STW BIE, 0 LAR1 P#DB1.STR1 AUF DB 1 L B [AR1, P#0.0] __ASSERT== __ACCU 1, 10 // max-len L B [AR1, P#1.0] __ASSERT== __ACCU 1, 0 // act-len CALL "_CHK_MAGIC" ( RET_VAL := M 0.0 ) __ASSERT== M 0.0, 1 // Check negative #P. CALL "_STR_PRESET" ( STARTVAL := 2, COUNT := 10, STR := DB1.STR0, ) CALL "_STR_PRESET" ( STARTVAL := 3, COUNT := 10, STR := DB1.STR1, ) CALL "DELETE" ( IN := DB1.STR0, L := 1, P := -1, RET_VAL := DB1.STR1, ) __ASSERT== __STW BIE, 0 LAR1 P#DB1.STR1 AUF DB 1 L B [AR1, P#0.0] __ASSERT== __ACCU 1, 10 // max-len L B [AR1, P#1.0] __ASSERT== __ACCU 1, 0 // act-len CALL "_CHK_MAGIC" ( RET_VAL := M 0.0 ) __ASSERT== M 0.0, 1 // Check zero #L. // (This copies the whole string) CALL "_STR_PRESET" ( STARTVAL := 42, COUNT := 10, STR := DB1.STR0, ) CALL "_STR_PRESET" ( STARTVAL := 142, COUNT := 10, STR := DB1.STR1, ) CALL "DELETE" ( IN := DB1.STR0, L := 0, P := 1, RET_VAL := DB1.STR1, ) __ASSERT== __STW BIE, 1 LAR1 P#DB1.STR1 AUF DB 1 L B [AR1, P#0.0] __ASSERT== __ACCU 1, 10 // max-len L B [AR1, P#1.0] __ASSERT== __ACCU 1, 10 // act-len CALL "_STR_CHECK" ( STR := DB1.STR1, STARTVAL := 42, OFFSET := 0, COUNT := 10, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_CHK_MAGIC" ( RET_VAL := M 0.0 ) __ASSERT== M 0.0, 1 // Check zero #P. // (This copies the whole string) CALL "_STR_PRESET" ( STARTVAL := 42, COUNT := 10, STR := DB1.STR0, ) CALL "_STR_PRESET" ( STARTVAL := 142, COUNT := 10, STR := DB1.STR1, ) CALL "DELETE" ( IN := DB1.STR0, L := 1, P := 0, RET_VAL := DB1.STR1, ) __ASSERT== __STW BIE, 1 LAR1 P#DB1.STR1 AUF DB 1 L B [AR1, P#0.0] __ASSERT== __ACCU 1, 10 // max-len L B [AR1, P#1.0] __ASSERT== __ACCU 1, 10 // act-len CALL "_STR_CHECK" ( STR := DB1.STR1, STARTVAL := 42, OFFSET := 0, COUNT := 10, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_CHK_MAGIC" ( RET_VAL := M 0.0 ) __ASSERT== M 0.0, 1 // Check #P bigger than act-len of #IN. // (This copies the whole string) CALL "_STR_PRESET" ( STARTVAL := 42, COUNT := 10, STR := DB1.STR0, ) CALL "_STR_PRESET" ( STARTVAL := 142, COUNT := 10, STR := DB1.STR1, ) CALL "DELETE" ( IN := DB1.STR0, L := 1, P := 11, RET_VAL := DB1.STR1, ) __ASSERT== __STW BIE, 1 LAR1 P#DB1.STR1 AUF DB 1 L B [AR1, P#0.0] __ASSERT== __ACCU 1, 10 // max-len L B [AR1, P#1.0] __ASSERT== __ACCU 1, 10 // act-len CALL "_STR_CHECK" ( STR := DB1.STR1, STARTVAL := 42, OFFSET := 0, COUNT := 10, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_CHK_MAGIC" ( RET_VAL := M 0.0 ) __ASSERT== M 0.0, 1 // Delete characters from the start of #IN. CALL "_STR_PRESET" ( STARTVAL := 42, COUNT := 10, STR := DB1.STR0, ) CALL "_STR_PRESET" ( STARTVAL := 142, COUNT := 10, STR := DB1.STR1, ) CALL "DELETE" ( IN := DB1.STR0, L := 5, P := 1, RET_VAL := DB1.STR1, ) __ASSERT== __STW BIE, 1 LAR1 P#DB1.STR1 AUF DB 1 L B [AR1, P#0.0] __ASSERT== __ACCU 1, 10 // max-len L B [AR1, P#1.0] __ASSERT== __ACCU 1, 5 // act-len CALL "_STR_CHECK" ( STR := DB1.STR1, STARTVAL := 47, OFFSET := 0, COUNT := 5, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_STR_CHECK" ( STR := DB1.STR1, STARTVAL := 147, OFFSET := 5, COUNT := 5, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_CHK_MAGIC" ( RET_VAL := M 0.0 ) __ASSERT== M 0.0, 1 // Delete characters in the middle of #IN. CALL "_STR_PRESET" ( STARTVAL := 42, COUNT := 10, STR := DB1.STR0, ) CALL "_STR_PRESET" ( STARTVAL := 142, COUNT := 10, STR := DB1.STR1, ) CALL "DELETE" ( IN := DB1.STR0, L := 5, P := 3, RET_VAL := DB1.STR1, ) __ASSERT== __STW BIE, 1 LAR1 P#DB1.STR1 AUF DB 1 L B [AR1, P#0.0] __ASSERT== __ACCU 1, 10 // max-len L B [AR1, P#1.0] __ASSERT== __ACCU 1, 5 // act-len CALL "_STR_CHECK" ( STR := DB1.STR1, STARTVAL := 42, OFFSET := 0, COUNT := 2, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_STR_CHECK" ( STR := DB1.STR1, STARTVAL := 49, OFFSET := 2, COUNT := 3, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_STR_CHECK" ( STR := DB1.STR1, STARTVAL := 147, OFFSET := 5, COUNT := 5, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_CHK_MAGIC" ( RET_VAL := M 0.0 ) __ASSERT== M 0.0, 1 // Check #L bigger than actual length of #IN. // (This deletes up to the end of the string) CALL "_STR_PRESET" ( STARTVAL := 42, COUNT := 10, STR := DB1.STR0, ) CALL "_STR_PRESET" ( STARTVAL := 142, COUNT := 10, STR := DB1.STR1, ) CALL "DELETE" ( IN := DB1.STR0, L := 11, P := 1, RET_VAL := DB1.STR1, ) __ASSERT== __STW BIE, 1 LAR1 P#DB1.STR1 AUF DB 1 L B [AR1, P#0.0] __ASSERT== __ACCU 1, 10 // max-len L B [AR1, P#1.0] __ASSERT== __ACCU 1, 0 // act-len CALL "_STR_CHECK" ( STR := DB1.STR1, STARTVAL := 142, OFFSET := 0, COUNT := 10, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_CHK_MAGIC" ( RET_VAL := M 0.0 ) __ASSERT== M 0.0, 1 // Check a too big act-len #IN (bigger than #RET_VAL max-len). // Delete at start of string. // (Output get truncated to #RET_VAL max-len) CALL "_STR_PRESET" ( STARTVAL := 42, COUNT := 254, STR := DB1.STR2, ) CALL "_STR_PRESET" ( STARTVAL := 142, COUNT := 10, STR := DB1.STR1, ) CALL "DELETE" ( IN := DB1.STR2, L := 3, P := 1, RET_VAL := DB1.STR1, ) __ASSERT== __STW BIE, 1 LAR1 P#DB1.STR1 AUF DB 1 L B [AR1, P#0.0] __ASSERT== __ACCU 1, 10 // max-len L B [AR1, P#1.0] __ASSERT== __ACCU 1, 10 // act-len CALL "_STR_CHECK" ( STR := DB1.STR1, STARTVAL := 45, OFFSET := 0, COUNT := 10, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_CHK_MAGIC" ( RET_VAL := M 0.0 ) __ASSERT== M 0.0, 1 // Check a too big act-len #IN (bigger than #RET_VAL max-len). // Delete in center of string. // (Output get truncated to #RET_VAL max-len) CALL "_STR_PRESET" ( STARTVAL := 42, COUNT := 254, STR := DB1.STR2, ) CALL "_STR_PRESET" ( STARTVAL := 142, COUNT := 10, STR := DB1.STR1, ) CALL "DELETE" ( IN := DB1.STR2, L := 3, P := 3, RET_VAL := DB1.STR1, ) __ASSERT== __STW BIE, 1 LAR1 P#DB1.STR1 AUF DB 1 L B [AR1, P#0.0] __ASSERT== __ACCU 1, 10 // max-len L B [AR1, P#1.0] __ASSERT== __ACCU 1, 10 // act-len CALL "_STR_CHECK" ( STR := DB1.STR1, STARTVAL := 42, OFFSET := 0, COUNT := 2, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_STR_CHECK" ( STR := DB1.STR1, STARTVAL := 47, OFFSET := 2, COUNT := 8, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_CHK_MAGIC" ( RET_VAL := M 0.0 ) __ASSERT== M 0.0, 1 // Check a too big act-len #IN (bigger than #RET_VAL max-len). // Delete up to the end of the copy range. // (Output get truncated to #RET_VAL max-len) CALL "_STR_PRESET" ( STARTVAL := 42, COUNT := 254, STR := DB1.STR2, ) CALL "_STR_PRESET" ( STARTVAL := 142, COUNT := 10, STR := DB1.STR1, ) CALL "DELETE" ( IN := DB1.STR2, L := 3, P := 8, RET_VAL := DB1.STR1, ) __ASSERT== __STW BIE, 1 LAR1 P#DB1.STR1 AUF DB 1 L B [AR1, P#0.0] __ASSERT== __ACCU 1, 10 // max-len L B [AR1, P#1.0] __ASSERT== __ACCU 1, 10 // act-len CALL "_STR_CHECK" ( STR := DB1.STR1, STARTVAL := 42, OFFSET := 0, COUNT := 7, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_STR_CHECK" ( STR := DB1.STR1, STARTVAL := 52, OFFSET := 7, COUNT := 3, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_CHK_MAGIC" ( RET_VAL := M 0.0 ) __ASSERT== M 0.0, 1 // Check a too big act-len #IN (bigger than #RET_VAL max-len). // With bigger del range (beyond #RET_VAL size). // (Output get truncated to #RET_VAL max-len) CALL "_STR_PRESET" ( STARTVAL := 42, COUNT := 254, STR := DB1.STR2, ) CALL "_STR_PRESET" ( STARTVAL := 142, COUNT := 10, STR := DB1.STR1, ) CALL "DELETE" ( IN := DB1.STR2, L := 6, P := 8, RET_VAL := DB1.STR1, ) __ASSERT== __STW BIE, 1 LAR1 P#DB1.STR1 AUF DB 1 L B [AR1, P#0.0] __ASSERT== __ACCU 1, 10 // max-len L B [AR1, P#1.0] __ASSERT== __ACCU 1, 10 // act-len CALL "_STR_CHECK" ( STR := DB1.STR1, STARTVAL := 42, OFFSET := 0, COUNT := 7, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_STR_CHECK" ( STR := DB1.STR1, STARTVAL := 55, OFFSET := 7, COUNT := 3, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_CHK_MAGIC" ( RET_VAL := M 0.0 ) __ASSERT== M 0.0, 1 // Check a too big act-len #IN (bigger than #RET_VAL max-len). // L/P=0 -> copy full string. // (Output get truncated to #RET_VAL max-len) CALL "_STR_PRESET" ( STARTVAL := 42, COUNT := 11, STR := DB1.STR4, ) CALL "_STR_PRESET" ( STARTVAL := 142, COUNT := 10, STR := DB1.STR1, ) CALL "DELETE" ( IN := DB1.STR4, L := 0, P := 0, RET_VAL := DB1.STR1, ) __ASSERT== __STW BIE, 1 LAR1 P#DB1.STR1 AUF DB 1 L B [AR1, P#0.0] __ASSERT== __ACCU 1, 10 // max-len L B [AR1, P#1.0] __ASSERT== __ACCU 1, 10 // act-len CALL "_STR_CHECK" ( STR := DB1.STR1, STARTVAL := 42, OFFSET := 0, COUNT := 10, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_CHK_MAGIC" ( RET_VAL := M 0.0 ) __ASSERT== M 0.0, 1 // Check: #IN and #RET_VAL are the same string. CALL "_STR_PRESET" ( STARTVAL := 42, COUNT := 10, STR := DB1.STR0, ) CALL "DELETE" ( IN := DB1.STR0, L := 5, P := 3, RET_VAL := DB1.STR0, ) __ASSERT== __STW BIE, 1 LAR1 P#DB1.STR0 AUF DB 1 L B [AR1, P#0.0] __ASSERT== __ACCU 1, 10 // max-len L B [AR1, P#1.0] __ASSERT== __ACCU 1, 5 // act-len CALL "_STR_CHECK" ( STR := DB1.STR0, STARTVAL := 42, OFFSET := 0, COUNT := 2, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_STR_CHECK" ( STR := DB1.STR0, STARTVAL := 49, OFFSET := 2, COUNT := 3, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_STR_CHECK" ( STR := DB1.STR0, STARTVAL := 47, OFFSET := 5, COUNT := 5, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_CHK_MAGIC" ( RET_VAL := M 0.0 ) __ASSERT== M 0.0, 1 END_FUNCTION FUNCTION "_STR_PRESET" : VOID VAR_INPUT STARTVAL : INT; // The start character value (0-255) COUNT : INT; // The number of characters to write END_VAR VAR_OUTPUT STR : STRING; // The string to write to END_VAR VAR_TEMP DBNR : INT; I : INT; VAL : CHAR; END_VAR BEGIN L P##STR LAR1 L W [AR1, P#0.0] T #DBNR AUF DB [#DBNR] L D [AR1, P#2.0] LAR1 L #COUNT T B [AR1, P#1.0] // Write #STR act-len +AR1 P#2.0 // Skip max-len/act-len bytes L #STARTVAL T #VAL // Init the sequence number // Generate the sequence and put it into #STR L 0 T #I LOP: L #I L #COUNT >=I SPB END L #VAL T B [AR1, P#0.0] + 1 T #VAL +AR1 P#1.0 L #I + 1 T #I SPA LOP END: NOP 0 END_FUNCTION FUNCTION "_STR_CHECK" : BOOL VAR_INPUT STR : STRING; // The string to check STARTVAL : INT; // The start character value (0-255) OFFSET : INT; // The character offset COUNT : INT; // The number of characters to check. END_VAR VAR_TEMP DBNR : INT; I : INT; VAL : CHAR; END_VAR BEGIN L P##STR LAR1 L W [AR1, P#0.0] T #DBNR AUF DB [#DBNR] L D [AR1, P#2.0] LAR1 +AR1 P#2.0 // Skip max-len/act-len bytes L #OFFSET // Skip offset SLD 3 +AR1 L #STARTVAL T #VAL // Init the sequence number // Generate the sequence and check it against #STR L 0 T #I LOP: L #I L #COUNT >=I SPB END L B [AR1, P#0.0] L #VAL <>I SPB ERR + 1 T #VAL +AR1 P#1.0 L #I + 1 T #I SPA LOP // Everything is OK END: SET = #RET_VAL BEA // Sequence mismatch ERR: CLR = #RET_VAL END_FUNCTION FUNCTION "_CHK_MAGIC" : BOOL BEGIN U( L W#16#1111 L DB1.MAGIC0 ==I ) U( L W#16#2222 L DB1.MAGIC1 ==I ) U( L W#16#3333 L DB1.MAGIC2 ==I ) U( L W#16#4444 L DB1.MAGIC3 ==I ) U( L W#16#5555 L DB1.MAGIC4 ==I ) U( L W#16#6666 L DB1.MAGIC5 ==I ) = #RET_VAL END_FUNCTION ORGANIZATION_BLOCK OB 1 BEGIN // Set DB magic values CALL "_CHK_MAGIC" ( RET_VAL := M 0.0 ) __ASSERT== M 0.0, 0 L W#16#1111 T DB1.MAGIC0 L W#16#2222 T DB1.MAGIC1 L W#16#3333 T DB1.MAGIC2 L W#16#4444 T DB1.MAGIC3 L W#16#5555 T DB1.MAGIC4 L W#16#6666 T DB1.MAGIC5 CALL "_CHK_MAGIC" ( RET_VAL := M 0.0 ) __ASSERT== M 0.0, 1 // Check whether the helpers work correctly. CALL "_STR_PRESET" ( STARTVAL := 0, COUNT := 250, STR := DB1.STR2, ) CALL "_STR_CHECK" ( STR := DB1.STR2, STARTVAL := 0, OFFSET := 0, COUNT := 254, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 0 CALL "_STR_PRESET" ( STARTVAL := 1, COUNT := 254, STR := DB1.STR2, ) CALL "_STR_CHECK" ( STR := DB1.STR2, STARTVAL := 0, OFFSET := 0, COUNT := 254, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 0 CALL "_STR_PRESET" ( STARTVAL := 0, COUNT := 254, STR := DB1.STR2, ) CALL "_STR_CHECK" ( STR := DB1.STR2, STARTVAL := 0, OFFSET := 0, COUNT := 254, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_STR_CHECK" ( STR := DB1.STR2, STARTVAL := 11, OFFSET := 11, COUNT := 243, RET_VAL := M 0.0, ) __ASSERT== M 0.0, 1 CALL "_CHK_MAGIC" ( RET_VAL := M 0.0 ) __ASSERT== M 0.0, 1 // Run the actual tests CALL FC 1 CALL SFC 46 // Stop CPU END_ORGANIZATION_BLOCK DATA_BLOCK DB 1 STRUCT MAGIC0 : WORD; STR0 : STRING[10]; MAGIC1 : WORD; STR1 : STRING[10]; MAGIC2 : WORD; STR2 : STRING[254]; MAGIC3 : WORD; STR3 : STRING[254]; MAGIC4 : WORD; STR4 : STRING[11]; MAGIC5 : WORD; END_STRUCT; BEGIN END_DATA_BLOCK