BEGIN


BYTEINTEGERARRAY DEAL(1:52)
BYTEINTEGERARRAY HAND(0:3,2:14)
OWNBYTEINTEGERARRAY S(0:3)='S','H','D','C'
INTEGER POINTS,BALANCE,LIMIT,CUT
INTEGERARRAY DIST,PTS(0:3)
OWNINTEGER HANDCOUNT=0

ROUTINE INITIALISE;  ! INITIALISES PACK
   INTEGER I,J,K
   K=-1
   CYCLE I=0,16,48;  ! SUIT
       CYCLE J=2,1,14;  ! VALUE
           DEAL(K+J)=I+J
       REPEAT; K=K+13; REPEAT
   END;  ! OF INITIALISE

ROUTINE SHUFFLE;  ! SHUFFLES AND CUTS PACK
   BYTEINTEGERARRAY A(1:52)
   INTEGER I,J
   CYCLE I=1,1,26
      A(2*I-1)=DEAL(I); A(2*I)=DEAL(53-I)
      REPEAT
   CUT=CUT+11
   IF CUT>=52 THEN CUT=CUT-52
   IF CUT=0 THEN CUT=1
   CYCLE I=1,1,CUT
      DEAL(52-CUT+I)=A(I); REPEAT
   CYCLE I=CUT+1,1,52
      DEAL(I-CUT)=A(I); REPEAT
   END;  ! OF SHUFFLE

ROUTINE DEALPACK
   OWNBYTEINTEGERARRAY T(11:14)='J','Q','K','A'
   INTEGER I,J,K,M
   POINTS=0;BALANCE=0
   IF HANDCOUNT&7=0 THENSTART
      NEWPAGE; print string("BRIDGEHANDS")
      NEWLINES(3); FINISH
   CYCLE I=0,1,3
      CYCLE J=2,1,14
         HAND(I,J)=0; REPEAT; REPEAT
   CYCLE I=1,4,49
      HAND(DEAL(I)>>4,DEAL(I)&15)=1
      REPEAT
   CYCLE I=0,1,3
      K=0; PRINTSYMBOL(S(I)); SPACES(3)
      M=0; ! COUNTS POINTS
      CYCLE J=14,-1,11
         ->L1 IF HAND(I,J)=0
         SPACE;PRINTSYMBOL(T(J));K=K+1;M=M+J-10
  L1:    REPEAT
      IF HAND(I,10)#0 THENSTART
         WRITE(10,2); K=K+1; FINISH
      CYCLE J=9,-1,2
         ->L2 IF HAND(I,J)=0
         K=K+1; WRITE(J,1)
  L2:     REPEAT
      IF K=0 THEN print string(" --")
      IF 1<=M<=3 AND K=1 THEN M=M-1
      PTS(I)=M; POINTS=POINTS+M; DIST(I)=K
      IF K>5 THEN BALANCE=BALANCE+K-5
               IF K<2 THEN BALANCE=BALANCE+2{-???}
            NEWLINE; REPEAT
         HANDCOUNT=HANDCOUNT+1
         END;  ! OF DEAL

      INITIALISE; READ(CUT); READ(LIMIT)
      ->L2 IF 0<=CUT<=52
      print string( "INVALID CUT"); STOP
L2:   SHUFFLE; SHUFFLE; SHUFFLE; SHUFFLE
L1:   SHUFFLE; DEALPACK
      BEGIN;  ! BIDDING BLOCK
         INTEGER LS,NO,SUITPTS
                  SWITCH B(0:20)
         INTEGER I,N
         ROUTINE BIDSUIT(INTEGER I)
            WRITE(I,1); SPACE; PRINTSYMBOL(S(LS))
            END

         ROUTINE NT(INTEGER I)
            WRITE(I,1); print string(" NT")
            END

         NO=3
         CYCLE I=0,1,3
            IF DIST(I)>NO THENSTART
               LS=I; NO=DIST(I)
               FINISH; REPEAT
         IF LS=0 AND DIST(3)=NO THEN LS=3
         SUITPTS=PTS(LS)+5*(NO-4); SPACES(18)
         N=BALANCE; IF N>3 THEN BALANCE=3
         ->B(BALANCE)
   B(0): ->L2 IF POINTS>=12
   NB:            print string(" NO BID"); ->L1
  L2:     IF POINTS<=15 THENSTART
             ->L3 IF SUITPTS>10
             NT(1); ->L1; FINISH
          IF POINTS<20 THENSTART
      L3:    BIDSUIT(1); ->L1; FINISH
          IF POINTS>=23 THEN ->TC
          IF SUITPTS>=15 THEN BIDSUIT(2) ELSE NT(2)
          ->L1
   B(1):  IF POINTS=11 AND SUITPTS>10 THEN ->L3
          ->NB IF POINTS<=11
          ->L3 IF POINTS<=18
          ->L7 IF POINTS<22
   TC:    print string(" 2 C(ACOL)"); ->L1
   B(2):  ->PR IF POINTS<10
          ->L6 IF POINTS>=12
          ->L3 IF SUITPTS>10; ->NB
   B(3):  ->PR IF POINTS<8
  L6:     ->L3 IF POINTS<=18-N
          ->TC IF POINTS>=22-N
  L7:     IF SUITPTS>15 THEN I=2 ELSE I=1
          ->L8
   PR:    SUITPTS=5*(NO-4)+POINTS
          ->NB IF SUITPTS <=20; ->L9 IF LS<2
  L9:     IF SUITPTS<=27 THEN I=3 ELSE I=4
          ->NB IF SUITPTS <=22
          IF SUITPTS >30 THENSTART
             I=5; ->L8; FINISH
  L8:     BIDSUIT(I)
  L1:     END;  ! OF BIDDING BLOCK

                 NEWLINES(3)
       ->L1 IF HANDCOUNT<LIMIT
       ENDOFPROGRAM