100 REM CUSIP 110 DECLARE EXTERNAL SUB PrintVerdict 120 DECLARE EXTERNAL FUNCTION CusipCheckDigit 130 DECLARE EXTERNAL FUNCTION IsValidCusip 140 PRINT "CUSIP Verdict" 150 CALL PrintVerdict("037833100") 160 CALL PrintVerdict("17275R102") 170 CALL PrintVerdict("38259P508") 180 CALL PrintVerdict("594918104") 190 CALL PrintVerdict("68389X106") 200 CALL PrintVerdict("68389X105") 210 END 220 REM ** 230 EXTERNAL FUNCTION CusipCheckDigit(Cusip$) 240 LET I = 1 250 LET Sum = 0 260 LET L = LEN(Cusip$) 270 DO WHILE I < L 280 LET C$ = Cusip$(I:I) 290 IF ("0" <= C$) AND (C$ <= "9") THEN 300 LET V = VAL(C$) 310 ELSEIF ("A" <= C$) AND (C$ <= "Z") THEN 320 LET V = ORD(C$) - 65 + 10 330 ELSEIF C$ = "*" THEN 340 LET V = 36 350 ELSEIF C$ = "@" THEN 360 LET V = 37 370 ELSEIF C$ = "#" THEN 380 LET V = 38 390 ELSE 400 LET CusipCheckDigit = -1 410 EXIT FUNCTION 420 END IF 430 IF MOD(I - 1, 2) = 1 THEN LET V = 2 * V 440 IF I <= 8 THEN LET Sum = Sum + INT(V / 10) + MOD(V, 10) 450 LET I = I + 1 460 LOOP 470 IF I <> 9 THEN 480 LET CusipCheckDigit = -1 490 ELSE 500 LET CusipCheckDigit = MOD(10 - MOD(Sum, 10), 10) 510 END IF 520 END FUNCTION 530 REM ** 540 EXTERNAL FUNCTION IsValidCusip (Cusip$) 550 LET Check = CusipCheckDigit(Cusip$) 560 IF Check < 0 THEN 570 LET IsValidCusip = 0 580 ELSEIF Cusip$(9:9) = CHR$(48 + Check) THEN 590 LET IsValidCusip = -1 600 ELSE 610 LET IsValidCusip = 0 620 END IF 630 END FUNCTION 640 REM ** 650 EXTERNAL SUB PrintVerdict (Cusip$) 660 PRINT Cusip$; 670 IF IsValidCusip(Cusip$) <>0 THEN 680 PRINT " : Valid" 690 ELSE 700 PRINT " : Invalid" 710 END IF 720 END SUB