DCL SPCPTR .PARM1 PARM; DCL DD PARM-YIELDS PKD(15,5) BAS(.PARM1); DCL DD ORIG-YIELDS PKD(15,0); DCL OL PARMS(.PARM1) PARM EXT MIN(0); DCL DD NBR-OF-PARMS BIN(2); DCL SPCPTR .ARG1 INIT(THE-ENTROPY); DCL DD THE-ENTROPY CHAR(20); DCL SPCPTR .ARG2 INIT(CONTROL); DCL DD CONTROL CHAR(90); DCL DD MAX-YIELDS BIN(4) DEF(CONTROL) POS( 1); /* DFLT = 1000 */ DCL DD CONFIDENCE BIN(4) DEF(CONTROL) POS( 5); /* > 80%: GOOD */ DCL DD RESTART CHAR(1) DEF(CONTROL) POS( 9); /* Y OR N */ DCL DD PHRASE CHAR(64) DEF(CONTROL) POS(10); /* USER SUPPL. */ DCL DD CALLS PKD(21,0) DEF(CONTROL) POS(74); /* NBR OF CALLS*/ DCL DD * CHAR(5) DEF(CONTROL) POS(85); /* UNUSED */ DCL SPCPTR .ARG3 INIT(STATE); DCL DD STATE CHAR(640) BDRY(16); DCL DD CURRENT CHAR(90) DEF(STATE) POS( 1); DCL DD CUR-MAX-YIELDS BIN(4) DEF(CURRENT) POS( 1); DCL DD CUR-CONFIDENCE BIN(4) DEF(CURRENT) POS( 5); DCL DD CUR-RESTART CHAR(1) DEF(CURRENT) POS( 9); DCL DD CUR-PHRASE CHAR(64) DEF(CURRENT) POS(10); DCL DD CUR-CALLS PKD(21,0) DEF(CURRENT) POS(74); DCL DD * CHAR(6) DEF(CURRENT) POS(85); DCL DD NBR-OF-CALLS PKD(21,0) DEF(STATE) POS( 91); DCL DD * BIN(2) DEF(STATE) POS(103); DCL DD CUR-POSITION BIN(4) DEF(STATE) POS(105); DCL DD LAST-YIELDS BIN(4) DEF(STATE) POS(109); DCL DD ENTROPY-POOL-SIZE BIN(4) DEF(STATE) POS(113); DCL DD ENTROPY-POOL CHAR(500) DEF(STATE) POS(115); DCL DD POOL-STEP BIN(2) DEF(STATE) POS(615); DCL DD PREVIOUS-HASH CHAR(20) DEF(STATE) POS(621); DCL OL MIGETETP(.ARG1, .ARG2, .ARG3) ARG; DCL SYSPTR .MIGETETP; DCL DD RESOLVE CHAR(34); DCL DD RESOLVE-TYPE CHAR( 2) DEF(RESOLVE) POS( 1) INIT(X'0201'); DCL DD RESOLVE-NAME CHAR(30) DEF(RESOLVE) POS( 3); DCL DD RESOLVE-AUTH CHAR( 2) DEF(RESOLVE) POS(33) INIT(X'0000'); /*******************************************************************/ ENTRY * (PARMS) EXT; STPLLEN NBR-OF-PARMS; CPYBLAP RESOLVE-NAME, "MISCRNIO", " "; RSLVSP .MISCRNIO, RESOLVE, *, *; CPYBLAP RESOLVE-NAME, "MIINVDSP", " "; RSLVSP .MIINVDSP, RESOLVE, *, *; CPYBLAP RESOLVE-NAME, "MIGETETP", " "; RSLVSP .MIGETETP, RESOLVE, *, *; CPYBLA CTRL-OPCODE, "O"; CALLX .MISCRNIO, MISCRNIO, *; SUBSPPFO SCREEN-SIZE, .TOP-OF-SCREEN, .SCREEN; CPYBLA AUTO-REFRESH, "N"; CPYBLA KEEPING-GOOD, "N"; CPYBLAP CUR-PHRASE, "Now is the Time for KGS!@#$%", X'B9'; CMPNV(B) NBR-OF-PARMS, 1/NEQ(=+2); CPYNV(B) ORIG-YIELDS, PARM-YIELDS/POS(=+2);: CPYNV ORIG-YIELDS, 1000;: START-OVER: CPYNV MAX-YIELDS, ORIG-YIELDS; CPYNV MEASURING-INTERVAL, 0; DISCARD-OLD-ENTROPY: CPYNV NEW-COUNT, 0; CPYBREP AVG-CHANGES, X'00'; CPYBREP OLD-VALUES , X'00'; CPYBLA RESTART, "Y"; /* AUTO RESET TO 'N' */ CPYNV CUR-POSITION, 1; GENERATE-SCREEN: CPYNV START-POS, CUR-POSITION; CALLX .MIGETETP, MIGETETP, *; CMPBLA(B) KEEPING-GOOD, "N"/EQ(SAVE-NEW-VALUES); TEST-FOR-LOW: CMPNV(B) CONFIDENCE, 80/HI(TEST-FOR-HIGH); SUBN(SB) MEASURING-INTERVAL, 1/POS(TEST-FOR-HIGH); MULT(SB) MAX-YIELDS, 2/NNAN(SET-MEASURING-INTERVAL); TEST-FOR-HIGH: CMPNV(B) CONFIDENCE, 82/LO(SAVE-NEW-VALUES); SUBN(SB) MEASURING-INTERVAL, 1/POS(SAVE-NEW-VALUES); DIV(S) MAX-YIELDS, 2; CMPNV(B) MAX-YIELDS, ORIG-YIELDS/HI(=+2); CPYNV MAX-YIELDS, ORIG-YIELDS;: SET-MEASURING-INTERVAL: CPYNV MEASURING-INTERVAL, 5; SAVE-NEW-VALUES: CPYBLA NEW-VALUES, ENTROPY-POOL(START-POS:56); CALLI FORMAT-FOR-SCREEN, *, .FORMAT-FOR-SCREEN; CPYBLA NEW-SCREEN, SCREEN-IMAGE(1:SCREEN-SIZE); SHOW-THE-SCREEN: CALLI PREPARE-SCREEN, *, .PREPARE-SCREEN; CPYBREP CTRL-CURSOR-POSITION, "0"; CPYBLA CTRL-OPCODE, "W"; CALLX .MISCRNIO, MISCRNIO, *; CPYBREP S-MESSAGE, " "; CPYBLA A-MESSAGE, "B"; CMPBLA(B) AUTO-REFRESH, "Y"/NEQ(GET-THE-SCREEN); WAIT-FOR-TIMEOUT-OR-KEY: CALLX .MIINVDSP, MIINVDSP, *; CMPBLA(B) INVITED-PFKEY, X'00'/EQ(GENERATE-SCREEN); /*TIME OUT*/ CMPBLA(B) INVITED-PFKEY, X'3A'/EQ(START-OVER); /*PFKEY 10*/ CMPBLA(B) INVITED-PFKEY, X'3B'/EQ(KEEP-GOOD); /*PFKEY 11*/ CPYBLA AUTO-REFRESH, "N"; B SHOW-THE-SCREEN; GET-THE-SCREEN: CPYBLA CTRL-OPCODE, "R"; CALLX .MISCRNIO, MISCRNIO, *; CMPNV(B) CTRL-CMD-KEY, 3/EQ(DONE); CMPNV(B) CTRL-CMD-KEY,10/EQ(START-OVER); CMPNV(B) CTRL-CMD-KEY,11/EQ(KEEP-GOOD); CMPNV(B) CTRL-CMD-KEY,12/EQ(DONE); CMPNV(B) CTRL-CMD-KEY,19/EQ(AUTOMATIC); CMPNV(B) CTRL-CMD-KEY,27/EQ(PAGE-UP); CMPNV(B) CTRL-CMD-KEY,28/EQ(PAGE-DOWN); CPYBLA OLD-SCREEN, SCREEN-IMAGE(1:SCREEN-SIZE); B GENERATE-SCREEN; PAGE-UP: CMPNV(B) NEW-COUNT, 2/NHI(=+2); CPYBLA SCREEN-IMAGE(1:SCREEN-SIZE), OLD-SCREEN;: B SHOW-THE-SCREEN; PAGE-DOWN: CMPNV(B) NEW-COUNT, 2/NHI(=+2); CPYBLA SCREEN-IMAGE(1:SCREEN-SIZE), NEW-SCREEN;: B SHOW-THE-SCREEN; AUTOMATIC: CPYBLA AUTO-REFRESH, "Y"; B GENERATE-SCREEN; KEEP-GOOD: XOR(S) KEEPING-GOOD, X'3D'; /* Y -> N, OR N -> Y */ CMPBLA(B) KEEPING-GOOD, "Y"/NEQ(=+3); CPYBLAP S-MESSAGE, "Will try to up the confidence level", " "; CPYBLA A-MESSAGE, "T";: CPYNV(B) MAX-YIELDS, ORIG-YIELDS/POS(GENERATE-SCREEN); DONE: CPYBLA CTRL-OPCODE, "C"; CALLX .MISCRNIO, MISCRNIO, *; RTX *; DCL INSPTR .PREPARE-SCREEN; ENTRY PREPARE-SCREEN INT; CALLI GET-DATE-TIME, *, .GET-DATE-TIME; CPYBRAP S-DATE-TIME, YMDHMS, " "; SCAN CHAR-NBR, S-PFKEYS, "F11="; ADDN(S) CHAR-NBR, 4; CMPBLA(B) KEEPING-GOOD, "Y"/NEQ(=+2); CPYBLA S-PFKEYS (CHAR-NBR:10), "End Keep ";: CMPBLA(B) KEEPING-GOOD, "N"/NEQ(=+2); CPYBLA S-PFKEYS (CHAR-NBR:10), "Keep good ";: SCAN CHAR-NBR, S-PFKEYS, "F19="; ADDN(S) CHAR-NBR, 4; CMPBLA(B) AUTO-REFRESH, "Y"/NEQ(=+2); CPYBLA S-PFKEYS (CHAR-NBR:10), "End Auto ";: CMPBLA(B) AUTO-REFRESH, "N"/NEQ(=+2); CPYBLA S-PFKEYS (CHAR-NBR:10), "Start Auto";: B .PREPARE-SCREEN; /************************ SCREEN HANDLING **************************/ DCL SYSPTR .MISCRNIO; DCL SPCPTR .SCRN-CTRL INIT(SCRN-CTRL); DCL DD SCRN-CTRL CHAR(8); DCL DD CTRL-OPCODE CHAR(1) DEF(SCRN-CTRL) POS(1); DCL DD CTRL-CMD-KEY ZND(2,0) DEF(SCRN-CTRL) POS(2); DCL DD CTRL-CURSOR-POSITION CHAR(5) DEF(SCRN-CTRL) POS(4); DCL DD CTRL-CURSOR-ROW ZND(2,0) DEF(CTRL-CURSOR-POSITION) POS(1); DCL DD CTRL-CURSOR-COL ZND(3,0) DEF(CTRL-CURSOR-POSITION) POS(3); %INCLUDE MIETPSCR DCL OL MISCRNIO(.SCRN-CTRL, .SCREEN); DCL DD OLD-SCREEN CHAR(4000); DCL DD NEW-SCREEN CHAR(4000); DCL DD S-VALUE(14) CHAR(10) DEF(S-VALUE-1ST) POS(1) AEO(120); DCL DD S-CURCHG(14) CHAR(10) DEF(S-CURCHG-1ST) POS(1) AEO(120); DCL DD S-AVGCHG(14) CHAR(10) DEF(S-AVGCHG-1ST) POS(1) AEO(120); DCL DD S-MAXCHG(14) CHAR(10) DEF(S-MAXCHG-1ST) POS(1) AEO(120); DCL SPCPTR .INVPARM INIT(INVPARM); DCL DD INVPARM CHAR(3); DCL DD INVITED-DELAY BIN(2) DEF(INVPARM) POS(1) INIT(3); DCL DD INVITED-PFKEY CHAR(1) DEF(INVPARM) POS(3); DCL OL MIINVDSP(.INVPARM) ARG; DCL SYSPTR .MIINVDSP; DCL DD START-POS BIN(2); DCL DD CHAR-NBR BIN(2); DCL DD AUTO-REFRESH CHAR(1); DCL DD KEEPING-GOOD CHAR(1); DCL DD MEASURING-INTERVAL BIN(4); DCL DD VALUE-NBR BIN(2); DCL DD NEW-VALUES CHAR(56); DCL DD NEW-VALUE(14) BIN(4) UNSGND DEF(NEW-VALUES) POS(1); DCL DD OLD-VALUES CHAR(56); DCL DD OLD-VALUE(14) BIN(4) UNSGND DEF(OLD-VALUES) POS(1); DCL DD CUR-CHANGES CHAR(56); DCL DD CUR-CHANGE(14) BIN(4) UNSGND DEF(CUR-CHANGES) POS(1); DCL DD AVG-CHANGES CHAR(56); DCL DD AVG-CHANGE(14) BIN(4) UNSGND DEF(AVG-CHANGES) POS(1); DCL DD MAX-CHANGES CHAR(56); DCL DD MAX-CHANGE(14) BIN(4) UNSGND DEF(MAX-CHANGES) POS(1); DCL DD OLD-COUNT BIN(4) UNSGND; DCL DD NEW-COUNT BIN(4) UNSGND; DCL DD TOTAL-CHANGE PKD(21,0); DCL DD CHANGE BIN(4); DCL DD Z.9 CHAR(15) INIT(X'17B1401717B2B2B2B2B2B2B2B2B2AB'); DCL INSPTR .FORMAT-FOR-SCREEN; ENTRY FORMAT-FOR-SCREEN INT; CPYNV OLD-COUNT, NEW-COUNT; ADDN(S) NEW-COUNT, 1; CPYNV VALUE-NBR, 0; NEXT-VALUE-ON-SCREEN: ADDN(S) VALUE-NBR, 1; EDIT S-VALUE (VALUE-NBR), NEW-VALUE (VALUE-NBR), Z.9; CMPNV(B) NEW-COUNT, 2/HI(THEREAFTER),EQ(SECOND-TIME-THROUGH); FIRST-TIME-THROUGH: CPYBLAP S-CURCHG (VALUE-NBR), " ", " "; CPYBLAP S-AVGCHG (VALUE-NBR), " ", " "; CPYBLAP S-MAXCHG (VALUE-NBR), " ", " "; B PREPARE-FOR-NEXT-TIME; SECOND-TIME-THROUGH: SUBN CHANGE, NEW-VALUE (VALUE-NBR), OLD-VALUE(VALUE-NBR); EXTRMAG(S) CHANGE; CPYNV CUR-CHANGE (VALUE-NBR), CHANGE; CPYNV AVG-CHANGE (VALUE-NBR), CHANGE; CPYNV MAX-CHANGE (VALUE-NBR), CHANGE; THEREAFTER: MULT TOTAL-CHANGE, AVG-CHANGE (VALUE-NBR), OLD-COUNT; SUBN CHANGE, NEW-VALUE (VALUE-NBR), OLD-VALUE(VALUE-NBR); EXTRMAG(S) CHANGE; CPYNV CUR-CHANGE (VALUE-NBR), CHANGE; ADDN(S) TOTAL-CHANGE, CHANGE; DIV(R) AVG-CHANGE (VALUE-NBR), TOTAL-CHANGE, NEW-COUNT; CMPNV(B) MAX-CHANGE (VALUE-NBR), CHANGE/HI(=+2); CPYNV MAX-CHANGE (VALUE-NBR), CHANGE;: EDIT S-CURCHG (VALUE-NBR), CUR-CHANGE (VALUE-NBR), Z.9; EDIT S-AVGCHG (VALUE-NBR), AVG-CHANGE (VALUE-NBR), Z.9; EDIT S-MAXCHG (VALUE-NBR), MAX-CHANGE (VALUE-NBR), Z.9; PREPARE-FOR-NEXT-TIME: CMPNV(B) VALUE-NBR, 14/NEQ(NEXT-VALUE-ON-SCREEN); CPYBLA OLD-VALUES, NEW-VALUES; EDIT S-CONFIDENCE, CONFIDENCE, Z.9; CPYBLA A-CONFIDENCE, "L"; /* LABEL */ CMPNV(B) CONFIDENCE, 80/HI(=+2); CPYBLA A-CONFIDENCE, "N";: /* NOTIFY */ EDIT S-MAX-YIELDS, MAX-YIELDS, Z.9; CVTHC S-HEX-ENTROPY, THE-ENTROPY; B .FORMAT-FOR-SCREEN; /**************************** DATE/TIME ****************************/ DCL DD TIME-VALUE CHAR(8); DCL DD TIME-VALUE-HI BIN(4) UNSGND DEF(TIME-VALUE) POS(1); DCL DD TIME-VALUE-LO BIN(4) UNSGND DEF(TIME-VALUE) POS(5); DCL DD TIMESTAMP PKD(21,0); /* CAN HOLD UNSIGNED 64-BIT INTEGER */ DCL DD TWO**32 PKD(11,0) INIT(P'4294967296'); DCL DD TWO**31 PKD(11,0) INIT(P'2147483648'); DCL DD TWO**15 PKD(11,0) INIT(P'32768'); DCL DD MACHINE-CLOCK CHAR(2) INIT(X'0100'); DCL SPCPTR .MACHINE-ATTR INIT(MACHINE-ATTR); DCL DD MACHINE-ATTR CHAR(16) BDRY(16); DCL DD MAT-MAX-SIZE BIN(4) DEF(MACHINE-ATTR) POS( 1) INIT(16); DCL DD MAT-ACT-SIZE BIN(4) DEF(MACHINE-ATTR) POS( 5); DCL DD MAT-TIMESTAMP CHAR(8) DEF(MACHINE-ATTR) POS( 9); DCL DD TIMESTAMP-HI PKD(11,0); DCL DD TIMESTAMP-LO PKD(11,0); DCL DD NBR-SECONDS PKD(15,0); DCL DD NBR-DAYS BIN(4); DCL DD NBR-YEARS BIN(4); DCL DD ADD-YEARS BIN(4); DCL DD NBR-PERIODS BIN(4); DCL DD DAY-MONTH BIN(4); DCL DD D BIN(4); DCL DD S BIN(4); DCL DD M BIN(4); /* DAY BASE FOR: JanFebMarAprMayJunJulAugSepOctNovDec*/ DCL DD DAYS CHAR(36) INIT("000031059090120151181212243273304334"); DCL DD DAYS-ACCUM (12)ZND(3,0) DEF(DAYS) POS(1); DCL DD YMDHMS CHAR(21); DCL DD YEAR ZND(4,0) DEF(YMDHMS) POS( 1); DCL DD DSEP1 CHAR( 1) DEF(YMDHMS) POS( 5) INIT("/"); DCL DD MONTH ZND(2,0) DEF(YMDHMS) POS( 6); DCL DD DSEP2 CHAR( 1) DEF(YMDHMS) POS( 8) INIT("/"); DCL DD DAY ZND(2,0) DEF(YMDHMS) POS( 9); DCL DD * CHAR( 2) DEF(YMDHMS) POS(11) INIT(" "); DCL DD HOUR ZND(2,0) DEF(YMDHMS) POS(13); DCL DD TSEP1 CHAR( 1) DEF(YMDHMS) POS(15) INIT(":"); DCL DD MIN ZND(2,0) DEF(YMDHMS) POS(16); DCL DD TSEP2 CHAR( 1) DEF(YMDHMS) POS(18) INIT(":"); DCL DD SEC ZND(2,0) DEF(YMDHMS) POS(19); DCL DD * CHAR( 1) DEF(YMDHMS) POS(21) INIT(" "); DCL INSPTR .GET-DATE-TIME; ENTRY GET-DATE-TIME INT; MATMATR .MACHINE-ATTR, X'0100'; /* GET MACHINE CLOCK */ CPYBLA TIME-VALUE, MAT-TIMESTAMP; CPYNV TIMESTAMP-LO, TIME-VALUE-LO; CPYNV TIMESTAMP-HI, TIME-VALUE-HI; MULT TIMESTAMP, TIMESTAMP-HI, TWO**32; ADDN(S) TIMESTAMP, TIMESTAMP-LO; DIV(SR) TIMESTAMP, 4096000000; /* NOW SECONDS */ ADDN(S) TIMESTAMP, 43386; /* 12:03:06 PM */ DIVREM NBR-DAYS, TIMESTAMP, 86400, NBR-SECONDS; SUBN(S) NBR-DAYS, 131;/* WAS: AUG 23,1928, NOW: JAN 01,1929 */ DIVREM NBR-PERIODS, NBR-DAYS, 1461, NBR-DAYS; /* 4 YEARS */ MULT NBR-YEARS, NBR-PERIODS, 4; ADDN(S) NBR-YEARS, 1929; DIVREM ADD-YEARS, NBR-DAYS, 365, NBR-DAYS; ADDN YEAR, NBR-YEARS, ADD-YEARS; CPYNV M, 13; CMPNV(B) ADD-YEARS, 3/LO(FIND-MONTH); LEAP-YEAR: CMPNV(B) NBR-DAYS, 59/LO(FIND-MONTH),EQ(FEB-29TH); SUBN(S) NBR-DAYS, 1; FIND-MONTH: SUBN(S) M, 1; SUBN(B) DAY-MONTH, NBR-DAYS, DAYS-ACCUM(M)/NEG(FIND-MONTH); ADDN DAY, DAY-MONTH, 1; CPYNV(B) MONTH, M/NNAN(COMPUTE-TIME); FEB-29TH: CPYNV MONTH, 2; CPYNV DAY, 29; COMPUTE-TIME: DIVREM HOUR, NBR-SECONDS, 3600, NBR-SECONDS; DIVREM MIN, NBR-SECONDS, 60, SEC; B .GET-DATE-TIME;