/* REXX EXEC ********************************************** */ /* TRACE ALL */ /************************************************************/ /*REXX EXEC: CHECKSUM */ /*WRITTEN BY: JIM LEONE DATE: 8/22/95 */ /*PURPOSE: TO CALCULATE THE CHECKSUM VALUE FOR ZAPS */ /*USAGE: EDIT MACRO COMMAND IN EDIT MODE, */ /* COMMAND: CHECKSUM BEG END */ /* BEG = FIRST REP/VER STATEMENT */ /* END = LAST REP/VER STATEMENT */ /* FOLLOW THE LAST REP/VER STATEMENT WITH A CHECKSUM STATEMENT AND THE MACRO WILL PUT THE CALCULATION ON THAT STATEMENT */ /* */ /*SPECIAL NOTE: HEX CHARACTERS MUST NOT BE SEPARATED BY COMMAS!! */ /*SPECIAL NOTE: YOU MUST REMOVE THE COMMAS FOR THE MACRO TO WORK! */ /************************************************************/ NUMERIC DIGITS 15 ADDRESS "ISREDIT" "MACRO (BEGL,ENDL)" LOOPCTRL = ENDL - BEGL + 1 ALLVALUES = ‘’ DO LOOPCTRL "ISREDIT (DATAL) = LINE" BEGL PARSE VAR DATAL OPER BASE HEXES . ALLVALUES = ALLVALUES || BASE || HEXES /* SAY "ALLVALUES = "ALLVALUES */ BEGL = BEGL + 1 END DONE =’NO’ HEXTOT = 0 DO UNTIL DONE = ‘YES’ HEXLENGTH = LENGTH(ALLVALUES) IF HEXLENGTH < 16 THEN DO DONE = ‘YES’ CALL LASTONE HEXTOTAL = "‘CHECKSUM " || HEXTOT || "‘ .HERE .HERE" "ISREDIT RESET LABEL" "ISREDIT LABEL "ENDL + 1" = .HERE" ADDRESS "ISREDIT " "CHANGE ‘CHECKSUM’ " HEXTOTAL EXIT END ELSE DO /* DO SUB1 */ FIRST8 = SUBSTR(ALLVALUES,1,8) NEXT8 = SUBSTR(ALLVALUES,9,8) DEC1 = X2D(FIRST8) DEC2 = X2D(NEXT8) DECNUM = DEC1 + DEC2 HEXSUB = D2X(DECNUM) IF LENGTH(HEXSUB) > 8 THEN HEXSUB = SUBSTR(HEXSUB,2,8) DECTOT = X2D(HEXTOT) + X2D(HEXSUB) HEXTOT = D2X(DECTOT) IF LENGTH(HEXTOT) > 8 THEN HEXTOT = SUBSTR(HEXTOT,2,8) ALLVALUES = SUBSTR(ALLVALUES,17) END /* DO SUB1 */ END /* MAIN DO */ HEXTOTAL = "‘CHECKSUM " || HEXTOT || "‘ .HERE .HERE" ADDRESS "ISREDIT " "ISREDIT RESET LABEL" "ISREDIT LABEL "ENDL + 1" = .HERE" "CHANGE ‘CHECKSUM’ " HEXTOTAL EXIT LASTONE: IF HEXLENGTH = 4 THEN CALL LAST4 IF HEXLENGTH = 8 THEN CALL LAST8 IF HEXLENGTH = 12 THEN CALL LAST12 RETURN ‘’ LAST4: DO FIRST8 = ALLVALUES FIRST8 = FIRST8 || ‘0000’ DEC1 = X2D(FIRST8) DECT1 = X2D(HEXTOT) DECNUM = DEC1 + DECT1 HEXTOT = D2X(DECNUM) IF LENGTH(HEXTOT) > 8 THEN HEXTOT = SUBSTR(HEXTOT,2,8) END RETURN ‘’ LAST8: DO FIRST8 = ALLVALUES DEC1 = X2D(FIRST8) DECT1 = X2D(HEXTOT) DECNUM = DEC1 + DECT1 HEXTOT = D2X(DECNUM) IF LENGTH(HEXTOT) > 8 THEN HEXTOT = SUBSTR(HEXTOT,2,8) END RETURN ‘’ LAST12: DO FIRST8 = SUBSTR(ALLVALUES,1,8) NEXT8 = SUBSTR(ALLVALUES,9,4) NEXT8 = NEXT8 || ‘0000’ DEC1 = X2D(FIRST8) DEC2 = X2D(NEXT8) DECNUM = DEC1 + DEC2 HEXSUB = D2X(DECNUM) IF LENGTH(HEXSUB) > 8 THEN HEXSUB = SUBSTR(HEXSUB,2,8) DECT1 = X2D(HEXTOT) DECT2 = X2D(HEXSUB) DECTOT = DECT1 + DECT2 HEXTOT = D2X(DECTOT) IF LENGTH(HEXTOT) > 8 THEN HEXTOT = SUBSTR(HEXTOT,2,8) END RETURN ‘’ EXIT