(defmac delay (set-counter delay-time 0
               while not(counter-0 delay-time) (add-counter delay-time -1)
              )
)

(defmac move-towers (
  if not(counter-0 tower-height) (
    add-counter tower-height -1
    {{{  handle cases
    if counter-0 tower-move
      {{{  0=1->2
      (
      set-counter tower-move 1
      move-towers
      O_END_OF_LINE
      O_DELETE
      O_DOWN
      O_END_OF_LINE
      O_UNDEL_CHAR
      O_UP
      delay
      set-counter tower-move 5
      move-towers
      )
      }}}
    else (
      add-counter tower-move -1
      if counter-0 tower-move
        {{{  1=1->3
        (
        set-counter tower-move 0
        move-towers
        O_END_OF_LINE
        O_DELETE
        O_DOWN
        O_DOWN
        O_END_OF_LINE
        O_UNDEL_CHAR
        O_UP
        O_UP
        delay
        set-counter tower-move 3
        move-towers
        )
        }}}
      else (
        add-counter tower-move -1
        if counter-0 tower-move
          {{{  2=2->1
          (
          set-counter tower-move 3
          move-towers
          O_DOWN
          O_END_OF_LINE
          O_DELETE
          O_UP
          O_END_OF_LINE
          O_UNDEL_CHAR
          delay
          set-counter tower-move 4
          move-towers
          )
          }}}
        else (
          add-counter tower-move -1
          if counter-0 tower-move
            {{{  3=2->3
            (
            set-counter tower-move 2
            move-towers
            O_DOWN
            O_END_OF_LINE
            O_DELETE
            O_DOWN
            O_END_OF_LINE
            O_UNDEL_CHAR
            O_UP
            O_UP
            delay
            set-counter tower-move 1
            move-towers
            )
            }}}
          else (
            add-counter tower-move -1
            if counter-0 tower-move
              {{{  4=3->1
              (
              set-counter tower-move 5
              move-towers
              O_DOWN
              O_DOWN
              O_END_OF_LINE
              O_DELETE
              O_UP
              O_UP
              O_END_OF_LINE
              O_UNDEL_CHAR
              delay
              set-counter tower-move 2
              move-towers
              )
              }}}
            else
              {{{  5=3->2
              (
              set-counter tower-move 4
              move-towers
              O_DOWN
              O_DOWN
              O_END_OF_LINE
              O_DELETE
              O_UP
              O_END_OF_LINE
              O_UNDEL_CHAR
              O_UP
              delay
              set-counter tower-move 0
              move-towers
              )
              }}}
            fi
          )
          fi
        )
        fi
      )
      fi
    ) fi
    }}}
    add-counter tower-height 1
  ) fi
))

(deffun towers-of-hanoi (
  O_START_OF_LINE
  O_RETURN
  O_UP
  "I "  "play "  "the "  "towers "  "of  "  "hanoi
  O_RETURN
  "==========================
  O_DOWN
  O_START_OF_LINE
  set-counter tower-height 0
  set-counter tower-move   0
  while not(test-end-line) (O_RIGHT add-counter tower-height 1)
  O_START_OF_LINE
  "tower "  "1|
  O_END_OF_LINE
  O_RETURN
  "tower "  "2|
  O_RETURN
  "tower "  "3|
  O_UP
  O_UP
  move-towers
))
