DCL SPCPTR .CONTROL INIT(CONTROL); DCL DD CONTROL CHAR(5); DCL DD CTRL-NBR-ELEMENTS PKD(7,0) DEF(CONTROL) POS(1); DCL DD CTRL-DIRECTION CHAR(1) DEF(CONTROL) POS(5); DCL SPCPTR .TABLE INIT(TABLE); DCL DD TABLE(1000000) ZND(10,0); /* MAX 16MB */ DCL SYSPTR .COMBSORT INIT("MICMBSRT", TYPE(PGM)); DCL OL COMBSORT(.CONTROL, .TABLE) ARG; DCL DD PREV BIN(4); DCL DD NBR BIN(4); DCL DD N BIN(4); DCL DD WHERE BIN(4); DCL DD START BIN(4); DCL DD LN-N FLT(8); DCL DD LOG2-N FLT(8); DCL DD LN-2 FLT(8); DCL DD FLT-N FLT(8); DCL DD N*LOG2-N FLT(8); DCL DD RESULT ZND(10,0); DCL DD SLOPE ZND(10,4); DCL DD RND-RESULT PKD( 7,0); /* ALSO SEED VALUE */ DCL DD RND-PRODUCT PKD(15,0); DCL DD RND-MODULUS PKD( 7,0) INIT(P'+2099863'); DCL DD RND-MULTIPLIER PKD( 7,0) INIT(P'+1005973'); DCL DD RND-INCREMENT PKD( 7,0) INIT(P'+443771'); DCL DD CPU-TIMES CHAR(24) BDRY(8); DCL DD CPU-BEFORE CHAR(8) DEF(CPU-TIMES) POS( 1); DCL DD CPU-AFTER CHAR(8) DEF(CPU-TIMES) POS( 9); DCL DD CPU-DIFFERENCE CHAR(8) DEF(CPU-TIMES) POS(17); DCL DD CPU-DIFF-HI BIN(4) UNSGND DEF(CPU-DIFFERENCE) POS(1); DCL DD CPU-DIFF-LO BIN(4) UNSGND DEF(CPU-DIFFERENCE) POS(5); DCL DD TIMESTAMP PKD(21,0); DCL DD TIMESTAMP-HI PKD(11,0); DCL DD TIMESTAMP-LO PKD(11,0); DCL DD TWO**32 PKD(11,0) INIT(P'4294967296'); DCL SPCPTR .MAT-PROC-ATTRS INIT(MAT-PROC-ATTRS); DCL DD MAT-PROC-ATTRS CHAR(22); DCL DD MAT-BYTES-PROVIDED BIN(4) DEF(MAT-PROC-ATTRS) POS( 1); DCL DD MAT-BYTES-AVAILABLE BIN(4) DEF(MAT-PROC-ATTRS) POS( 5); DCL DD MAT-TOTAL-BYTES-USED BIN(4) DEF(MAT-PROC-ATTRS) POS( 9); DCL DD MAT-CPU-TIME-USED CHAR(8) DEF(MAT-PROC-ATTRS) POS(13); DCL DD MAT-NBR-OF-LOCKS BIN(2) DEF(MAT-PROC-ATTRS) POS(21); ENTRY * EXT; CPYNV N, 0; NEXT-SIZE: ADDN(S) N, 50000; CPYNV RND-RESULT, 314159; CPYNV NBR, 0; NEXT-ELEMENT: MULT RND-PRODUCT, RND-MULTIPLIER, RND-RESULT; ADDN(S) RND-PRODUCT, RND-INCREMENT; REM RND-RESULT , RND-PRODUCT, RND-MODULUS; ADDN(S) NBR, 1; CPYNV TABLE(NBR), RND-RESULT; CMPNV(B) NBR, N/LO(NEXT-ELEMENT); SORT: CPYNV CTRL-NBR-ELEMENTS, N; CPYBLA CTRL-DIRECTION, "ASCENDING"; BRK "1"; CPYNV MAT-BYTES-PROVIDED, 20; MATPRATR .MAT-PROC-ATTRS, *, X'21'; CPYBLA CPU-BEFORE, MAT-CPU-TIME-USED; CALLX .COMBSORT, COMBSORT, *; MATPRATR .MAT-PROC-ATTRS, *, X'21'; CPYBLA CPU-AFTER , MAT-CPU-TIME-USED; BRK "2"; TEST-IF-SORTED: CPYNV NBR, N; COMPARE-WITH-PREVIOUS: SUBN(B) PREV, NBR, 1/NPOS(=+3); CMPBLA(B) TABLE(NBR), TABLE(PREV)/LO(NOT-SORTED); SUBN(SB) NBR, 1/POS(COMPARE-WITH-PREVIOUS);: COMPUTE-N*LOG2-N: CPYNV RESULT, N; CPYBLAP MSG-TEXT, RESULT, " "; CPYNV FLT-N, N; CMF1 LN-N, X'0011', FLT-N; CMF1 LN-2, X'0011', E'2'; DIV LOG2-N, LN-N, LN-2; MULT N*LOG2-N, N, LOG2-N; CPYNV(R) RESULT, N*LOG2-N; CPYBLA MSG-TEXT(13:10), RESULT; COMPUTE-TIME-USED: SUBLC CPU-DIFFERENCE, CPU-AFTER, CPU-BEFORE; CPYNV TIMESTAMP-HI, CPU-DIFF-HI; CPYNV TIMESTAMP-LO, CPU-DIFF-LO; MULT TIMESTAMP, TIMESTAMP-HI, TWO**32; ADDN(S) TIMESTAMP, TIMESTAMP-LO; DIV RESULT, TIMESTAMP, 4096; /* MICROSECONDS */ CPYBLA MSG-TEXT(25:10), RESULT; COMPUTE-SLOPE: DIV SLOPE, RESULT, N*LOG2-N; CPYBLA MSG-TEXT(37:10), SLOPE; CPYNV START, 37; EDIT-RESULT: VERIFY WHERE, MSG-TEXT(START:11), "0"; SUBN(SB) WHERE, 1/NPOS(=+2); CPYBLAP MSG-TEXT(START:WHERE), " ", " ";: SUBN(SB) START, 12/POS(EDIT-RESULT); SHOW-RESULT: CALLI SHOW-MESSAGE, *, .SHOW-MESSAGE; CMPNV(B) N, 1000000/LO(NEXT-SIZE); RTX *; NOT-SORTED: CPYBLAP MSG-TEXT, "Not Sorted!", " "; CALLI SHOW-MESSAGE, *, .SHOW-MESSAGE; RTX *; %INCLUDE SHOWMSG