   $BEGIN   SOLITAIRE FOR THE 7502

      $TEMP R8, R9, R10, R11, R2, R13, R14
      $DEF STP = R5, GBASE = R6
      $DEF NP = R4, SYM = R3, TEMP = R7

      STP = #STACK
      GBASE = #STAT
      JUMP SOLENT

OUT:  STP = W(STP)
      NP = NP-1
      TEMP = NP
      REC TEMP, PC, 1

      $MACRO CALL ROUT
         W(STP+VARP) = STP
         STP = STP+VARP
         DUMP NP, PC, 1
         JUMP ROUT
      $END


      $MACRO ROUTINE NAME
         $REDEF VARP = 1
      NAME:
         $BEGIN
      $END


      $DEF VARP = 1

      $MACRO VAR NAME
         $DEF NAME = W(STP+VARP)
         $REDEF VARP = VARP+1
      $END


      $DEF GVARP = 0

      $MACRO GVAR NAME
         $DEF NAME = W(GBASE+GVARP)
         $REDEF GVARP = GVARP+1
      $END

      $DEF WC = 0, FREF = .ZZZ, BREF = .AAA
      $DEF NESTL = 0

      $MACRO FORALL VAR, LOW, INC, UPPER
         $REDEF WC = WC+1, NESTL = NESTL+1
         $REDEF BREF = BREF-1, FREF = FREF+1
         VAR = LOW-INC
BREF?:   JUMP FREF? IF VAR >= UPPER
         VAR = VAR+INC
      $END


      $MACRO REP
         JUMP BREF?
FREF?:
         $REDEF BREF = BREF+1, FREF = FREF-1
         $IF NESTL = 1
         $REDEF FREF = .ZZZ+WC, BREF = .AAA-WC
         $FINISH
         $REDEF NESTL = NESTL-1
      $END

