FUNCTION FC 100 : VOID
TITLE =Bubblesort
//14
AUTHOR : KAI
FAMILY : SPSFORUM
NAME : BUBBLE
VERSION : 1.0
VAR_INPUT
DB_NUMMER : INT ;
STARTADRESSE : INT ;
BLOCKGROESSE : INT ;
BLOCKANZAHL : INT ;
END_VAR
VAR_TEMP
DB_REGISTER : WORD ;
AR1_REGISTER : DWORD ;
DATENBLOCK_1 : ANY ;
DATENBLOCK_2 : ANY ;
SPEICHERBLOCK : ANY ;
BEREICHSZEIGER_1 : DWORD ;
BEREICHSZEIGER_2 : DWORD ;
OFFSET : DWORD ;
DB_NUMMER_TEMP : WORD ;
SCHLEIFE_1 : INT ;
SCHLEIFE_2 : INT ;
WERT_1 : INT ;
WERT_2 : INT ;
RETVAL : INT ;
END_VAR
BEGIN
NETWORK
TITLE =Register sichern
L DBNO; // DB-Register
T #DB_REGISTER;
TAR1 #AR1_REGISTER; // AR1-Register
NETWORK
TITLE =Datenblock 1 (ANY)
L P##DATENBLOCK_1; // Datenblock 1 (ANY)
LAR1 ;
L B#16#10; // Syntax-ID
T B [AR1,P#0.0];
L 2; // Datentyp
T B [AR1,P#1.0];
L #BLOCKGROESSE; // Anzahl
T W [AR1,P#2.0];
L #DB_NUMMER; // DB-Nummer
T W [AR1,P#4.0];
L #STARTADRESSE; // Bereichszeiger 1
ITD ;
SLD 3;
T D [AR1,P#6.0];
L B#16#84; // Operandenbereich
T B [AR1,P#6.0];
L D [AR1,P#6.0]; // Bereichszeiger 1
T #BEREICHSZEIGER_1;
NETWORK
TITLE =Datenblock 2 (ANY)
L P##DATENBLOCK_2; // Datenblock 2 (ANY)
LAR1 ;
L B#16#10; // Syntax-ID
T B [AR1,P#0.0];
L 2; // Datentyp
T B [AR1,P#1.0];
L #BLOCKGROESSE; // Anzahl
T W [AR1,P#2.0];
L #DB_NUMMER; // DB-Nummer
T W [AR1,P#4.0];
L #STARTADRESSE; // Bereichszeiger 2
L #BLOCKGROESSE;
+I ;
ITD ;
SLD 3;
T D [AR1,P#6.0];
L B#16#84; // Operandenbereich
T B [AR1,P#6.0];
L D [AR1,P#6.0]; // Bereichszeiger 2
T #BEREICHSZEIGER_2;
NETWORK
TITLE =Speicherblock (ANY)
L P##SPEICHERBLOCK; // Speicherblock (ANY)
LAR1 ;
L B#16#10; // Syntax-ID
T B [AR1,P#0.0];
L 2; // Datentyp
T B [AR1,P#1.0];
L #BLOCKGROESSE; // Anzahl
T W [AR1,P#2.0];
L #DB_NUMMER; // DB-Nummer
T W [AR1,P#4.0];
L #BLOCKGROESSE; // Bereichszeiger
L #BLOCKANZAHL;
*I ;
L #STARTADRESSE;
+I ;
ITD ;
SLD 3;
T D [AR1,P#6.0];
L B#16#84; // Operandenbereich
T B [AR1,P#6.0];
NETWORK
TITLE =Offset (Bereichszeiger)
L #BLOCKGROESSE;
ITD ;
SLD 3;
T #OFFSET;
NETWORK
TITLE =Bubblesort
L #DB_NUMMER; // DB-Nummer
T #DB_NUMMER_TEMP;
AUF DB [#DB_NUMMER_TEMP];
L #BLOCKANZAHL;
L 1;
-I ;
M01: T #SCHLEIFE_1;
L P##DATENBLOCK_1; // Datenblock 1 (ANY)
LAR1 ;
L #BEREICHSZEIGER_1; // Bereichszeiger 1
T D [AR1,P#6.0];
L P##DATENBLOCK_2; // Datenblock 2 (ANY)
LAR1 ;
L #BEREICHSZEIGER_2; // Bereichszeiger 2
T D [AR1,P#6.0];
L #SCHLEIFE_1;
M02: T #SCHLEIFE_2;
L P##DATENBLOCK_1; // Datenblock 1 (ANY)
LAR1 ;
L D [AR1,P#6.0]; // Bereichszeiger
LAR1 ;
L B [AR1,P#0.0]; // Wert 1
T #WERT_1;
L P##DATENBLOCK_2; // Datenblock 2 (ANY)
LAR1 ;
L D [AR1,P#6.0]; // Bereichszeiger
LAR1 ;
L B [AR1,P#0.0]; // Wert 2
T #WERT_2;
L #WERT_2; // Wert 2
L #WERT_1; // Wert 1
>I ;
SPBN M03;
NETWORK
TITLE =Bubblesort
CALL SFC 20 (
SRCBLK := #DATENBLOCK_1,
RET_VAL := #RETVAL,
DSTBLK := #SPEICHERBLOCK);
NOP 0;
NETWORK
TITLE =Bubblesort
CALL SFC 20 (
SRCBLK := #DATENBLOCK_2,
RET_VAL := #RETVAL,
DSTBLK := #DATENBLOCK_1);
NOP 0;
NETWORK
TITLE =Bubblesort
CALL SFC 20 (
SRCBLK := #SPEICHERBLOCK,
RET_VAL := #RETVAL,
DSTBLK := #DATENBLOCK_2);
NOP 0;
NETWORK
TITLE =Bubblesort
M03: L P##DATENBLOCK_1; // Datenblock 1 (ANY)
LAR1 ;
L D [AR1,P#6.0]; // Bereichszeiger
L #OFFSET; // Offset
+D ;
T D [AR1,P#6.0];
L P##DATENBLOCK_2; // Datenblock 2 (ANY)
LAR1 ;
L D [AR1,P#6.0]; // Bereichszeiger
L #OFFSET; // Offset
+D ;
T D [AR1,P#6.0];
L #SCHLEIFE_2;
LOOP M02;
L #SCHLEIFE_1;
LOOP M01;
NETWORK
TITLE =Register wiederherstellen
AUF DB [#DB_REGISTER]; // DB-Register
LAR1 #AR1_REGISTER; // AR1-Register
END_FUNCTION