!*************************** AMUS Program Label ******************************
! Filename: UPC.BAS                                         Date: 06/29/89
! Category: UTIL         Hash Code: 027-670-200-364      Version: 2.0(100)
! Initials: ATH/AM       Name: ALAN J. CAVALLARO
! Company: FINEX MANAGEMENT SERVICES               Telephone #: 2127255666
! Related Files:
! Min. Op. Sys.:                               Expertise Level: INT
! Special:
! Description: Program to illustrate how to print zero-suppressed (6 digit)
! version 'E' UPC barcode labels on an Okidata 182 (possibly 292) printer.
! Output file is UPCLAB.PRT. Enter 'E' to break out of program loop.
!*****************************************************************************
PROGRAM UPC,2.0(100)
!!                      Finex Management Services                       !!                                              !!
!!                         15 West 26th Street                          !!
!!                    New York City, New York 10010                     !!
!!                         [212] - 725 - 5666                           !!

!! This is a sample program to illustrate how to print zero-suppressed
!! version 'E' UPC barcode labels on an OkiDATA 182 printer. Using a
!! hand held CCD type scanner or a counter-top laser scanner provides
!! first time readability 99% of the time.

!! I also have a version for "CODE 39" labels which includes all alphabetic
!! characters, if any one is interested.

MAP1 GR'ON,S,1,CHR(3)                           ! Turn on graphics mode
MAP1 GR'OFF,S,2,CHR(3)+CHR(2)                   ! Turn off graphics mode
MAP1 GR'RET,S,2,CHR(3)+CHR(14)                  ! Do CR with 1/144" line feed
MAP1 CPI'16,S,4,CHR(27)+CHR(66)+CHR(27)+CHR(90) ! Set text to 16 CPI
MAP1 CPI'12,S,4,CHR(27)+CHR(65)+CHR(27)+CHR(90) ! Set text to 12 CPI
MAP1 DENSITY,S,2,CHR(27)+CHR(81)                ! Set double pass graphics

MAP1 START'BARS,S,3,CHR(127)+CHR(128)+CHR(127)
MAP1 END'BARS,S,6,CHR(128)+CHR(127)+CHR(128)+CHR(127)+CHR(128)+CHR(127)

MAP1 O0,S,7,CHR(128)+CHR(128)+CHR(128)+CHR(127)+CHR(127)+CHR(128)+CHR(127)
MAP1 O1,S,7,CHR(128)+CHR(128)+CHR(127)+CHR(127)+CHR(128)+CHR(128)+CHR(127)
MAP1 O2,S,7,CHR(128)+CHR(128)+CHR(127)+CHR(128)+CHR(128)+CHR(127)+CHR(127)
MAP1 O3,S,7,CHR(128)+CHR(127)+CHR(127)+CHR(127)+CHR(127)+CHR(128)+CHR(127)
MAP1 O4,S,7,CHR(128)+CHR(127)+CHR(128)+CHR(128)+CHR(128)+CHR(127)+CHR(127)
MAP1 O5,S,7,CHR(128)+CHR(127)+CHR(127)+CHR(128)+CHR(128)+CHR(128)+CHR(127)
MAP1 O6,S,7,CHR(128)+CHR(127)+CHR(128)+CHR(127)+CHR(127)+CHR(127)+CHR(127)
MAP1 O7,S,7,CHR(128)+CHR(127)+CHR(127)+CHR(127)+CHR(128)+CHR(127)+CHR(127)
MAP1 O8,S,7,CHR(128)+CHR(127)+CHR(127)+CHR(128)+CHR(127)+CHR(127)+CHR(127)
MAP1 O9,S,7,CHR(128)+CHR(128)+CHR(128)+CHR(127)+CHR(128)+CHR(127)+CHR(127)

MAP1 E0,S,7,CHR(128)+CHR(127)+CHR(128)+CHR(128)+CHR(127)+CHR(127)+CHR(127)
MAP1 E1,S,7,CHR(128)+CHR(127)+CHR(127)+CHR(128)+CHR(128)+CHR(127)+CHR(127)
MAP1 E2,S,7,CHR(128)+CHR(128)+CHR(127)+CHR(127)+CHR(128)+CHR(127)+CHR(127)
MAP1 E3,S,7,CHR(128)+CHR(127)+CHR(128)+CHR(128)+CHR(128)+CHR(128)+CHR(127)
MAP1 E4,S,7,CHR(128)+CHR(128)+CHR(127)+CHR(127)+CHR(127)+CHR(128)+CHR(127)
MAP1 E5,S,7,CHR(128)+CHR(127)+CHR(127)+CHR(127)+CHR(128)+CHR(128)+CHR(127)
MAP1 E6,S,7,CHR(128)+CHR(128)+CHR(128)+CHR(128)+CHR(127)+CHR(128)+CHR(127)
MAP1 E7,S,7,CHR(128)+CHR(128)+CHR(127)+CHR(128)+CHR(128)+CHR(128)+CHR(127)
MAP1 E8,S,7,CHR(128)+CHR(128)+CHR(128)+CHR(127)+CHR(128)+CHR(128)+CHR(127)
MAP1 E9,S,7,CHR(128)+CHR(128)+CHR(127)+CHR(128)+CHR(127)+CHR(127)+CHR(127)

       MAP1 QUIET,S,30
       MAP1 PARITY(10),S,6
       MAP1 UPC,S,6
       MAP1 S'CD,S,2
       MAP1 UPC(6),F
       MAP1 SCAN'CODE,S,11
       MAP1 TOT'S,S,3

       PARITY(1)  = "221211"
       PARITY(2)  = "221121"
       PARITY(3)  = "221112"
       PARITY(4)  = "212211"
       PARITY(5)  = "211221"
       PARITY(6)  = "211122"
       PARITY(7)  = "212121"
       PARITY(8)  = "212112"
       PARITY(9)  = "211212"
       PARITY(10) = "222111"

       FOR QZ = 1 TO 30
               QUIET[QZ,QZ]=CHR(128)
       NEXT QZ

       OPEN #1,"UPCLAB.PRT",OUTPUT

START:

       INPUT "ENTER ZERO SUPPRESSED CODE ";CODE$

               IF UCS(CODE$) = "E" GOTO SPOOL

       UPC = CODE$ USING "#ZZZZZ"

       SCAN'CODE=""
       SCAN'CODE[1,1]="0"
       SCAN'CODE[2,7]=UPC

       CALL FIX'CODE

       PRINT #1,CPI'12;
       PRINT #1,DENSITY;
       PRINT #1,GR'ON;


               UPC(1) = VAL(UPC[1,1])
               UPC(2) = VAL(UPC[2,2])
               UPC(3) = VAL(UPC[3,3])
               UPC(4) = VAL(UPC[4,4])
               UPC(5) = VAL(UPC[5,5])
               UPC(6) = VAL(UPC[6,6])

               IF CD = 0 CD = 10

FOR REPETITIONS = 1 TO 6

       PRINT #1,QUIET;
       PRINT #1,START'BARS;

FOR POSITION = 1 TO 6

       IF UPC(POSITION) = 0 UPC(POSITION) = 10

       VALUE = VAL(PARITY(CD)[POSITION,POSITION])*10 + UPC(POSITION)

       ON VALUE-10 CALL ODD'1,ODD'2,ODD'3,ODD'4,ODD'5,ODD'6,ODD'7,ODD'8,ODD'9,ODD'0

       ON VALUE-20 CALL EVEN'1,EVEN'2,EVEN'3,EVEN'4,EVEN'5,EVEN'6,EVEN'7,EVEN'8,EVEN'9,EVEN'0

NEXT POSITION

       PRINT #1,END'BARS;
       PRINT #1,GR'RET;

NEXT REPETITIONS

       PRINT #1,GR'OFF;
       PRINT #1,CPI'16;
       PRINT #1,UPC USING "#ZZZZZ";CD
       PRINT #1
       GOTO START
SPOOL:
       CLOSE #1
!       XCALL SPOOL,"UPCLAB.PRT","A",128
       END

ODD'0:   PRINT #1,O0; : RETURN
ODD'1:   PRINT #1,O1; : RETURN
ODD'2:   PRINT #1,O2; : RETURN
ODD'3:   PRINT #1,O3; : RETURN
ODD'4:   PRINT #1,O4; : RETURN
ODD'5:   PRINT #1,O5; : RETURN
ODD'6:   PRINT #1,O6; : RETURN
ODD'7:   PRINT #1,O7; : RETURN
ODD'8:   PRINT #1,O8; : RETURN
ODD'9:   PRINT #1,O9; : RETURN

EVEN'0:  PRINT #1,E0; : RETURN
EVEN'1:  PRINT #1,E1; : RETURN
EVEN'2:  PRINT #1,E2; : RETURN
EVEN'3:  PRINT #1,E3; : RETURN
EVEN'4:  PRINT #1,E4; : RETURN
EVEN'5:  PRINT #1,E5; : RETURN
EVEN'6:  PRINT #1,E6; : RETURN
EVEN'7:  PRINT #1,E7; : RETURN
EVEN'8:  PRINT #1,E8; : RETURN
EVEN'9:  PRINT #1,E9; : RETURN

FIX'CODE:


                       A = SCAN'CODE[2,2]
                       B = SCAN'CODE[3,3]
                       C = SCAN'CODE[4,4]
                       D = SCAN'CODE[5,5]
                       E = SCAN'CODE[6,6]
                       F = SCAN'CODE[7,7]

               IF F = 0 OR F = 1 OR F = 2 SCAN'CODE = A+B+F+"0000"+C+D+E

               IF F = 3                   SCAN'CODE = A+B+C+"00000"+D+E

               IF F = 4                   SCAN'CODE = A+B+C+D+"00000"+E

               IF F >=5                   SCAN'CODE = A+B+C+D+E+"0000"+F

               SCAN'CODE = "0"+SCAN'CODE




       X = 0 : Y = 0 : Z = 0 : ZZ =0 : XX = 0 : YY = 0 : TOT = 0 : CD = 0
       TOT'S = SPACE(3) : LOOP = 0


FOR LOOP = 1 TO 11 STEP 2

       X = SCAN'CODE[LOOP,LOOP] : XX = XX + X

NEXT LOOP
       Y = XX * 3
FOR LOOP = 2 TO 10 STEP 2

       Z = SCAN'CODE[LOOP,LOOP] : ZZ = ZZ + Z

NEXT LOOP

       TOT = Y + ZZ
       TOT'S = TOT USING "###"
       CD = 10 - VAL(TOT'S[3,3])

RETURN