' CUSIP DECLARE SUB PrintVerdict (Cusip$) DECLARE FUNCTION CusipCheckDigit% (Cusip$) DECLARE FUNCTION IsValidCusip% (Cusip$) CONST TRUE% = -1, FALSE% = 0 PRINT "CUSIP Verdict" PrintVerdict "037833100" PrintVerdict "17275R102" PrintVerdict "38259P508" PrintVerdict "594918104" PrintVerdict "68389X106" PrintVerdict "68389X105" END FUNCTION CusipCheckDigit% (Cusip$) I% = 1 Sum% = 0 L% = LEN(Cusip$) DO WHILE I% < L% IF ("0" <= MID$(Cusip$, I%, 1)) AND (MID$(Cusip$, I%, 1) <= "9") THEN V% = ASC(MID$(Cusip$, I%, 1)) - 48 ' 0 ELSEIF ("A" <= MID$(Cusip$, I%, 1)) AND (MID$(Cusip$, I%, 1) <= "Z") THEN V% = ASC(MID$(Cusip$, I%, 1)) - 65 + 10 ELSEIF MID$(Cusip$, I%, 1) = "*" THEN V% = 36 ELSEIF MID$(Cusip$, I%, 1) = "@" THEN V% = 37 ELSEIF MID$(Cusip$, I%, 1) = "#" THEN V% = 38 ELSE CusipCheckDigit% = -1 EXIT FUNCTION END IF IF (I% - 1) MOD 2 = 1 THEN V% = 2 * V% IF I% <= 8 THEN Sum% = Sum% + (V% \ 10) + (V% MOD 10) I% = I% + 1 LOOP IF I% <> 9 THEN CusipCheckDigit% = -1 ELSE CusipCheckDigit% = (10 - (Sum% MOD 10)) MOD 10 END IF END FUNCTION FUNCTION IsValidCusip% (Cusip$) Check% = CusipCheckDigit%(Cusip$) IF Check% < 0 THEN IsValidCusip% = FALSE ELSE IsValidCusip% = (MID$(Cusip$, 9, 1) = CHR$(48 + Check%)) END IF END FUNCTION SUB PrintVerdict (Cusip$) PRINT Cusip$; IF IsValidCusip%(Cusip$) THEN PRINT " : Valid" ELSE PRINT " : Invalid" END IF END SUB