      PROGRAM TWIM12
C        a trivial Fortran wimp program which 
C        calculates a Mandelbrot and displays it in a window
C        while multitasking
C        needs the Wimp and SpriteOps libraries
C
      COMMON /RUNNUL/ MASK
C        initialise the wimp
      CALL WPINIT('TWIMP12')
C        set up the desk-top
      CALL SETUP(IERR)
      IF(IERR.NE.0) THEN
        CALL WPQUIT
        STOP 'Error in WPQUIT'
      ELSE
C        go into the wimp loop with null calls
        MASK = 0
        CALL WPLOOP(MASK)
C        that's all we can do here
      ENDIF
      END
C
      SUBROUTINE SETUP(IERR)
C             common for window handle
      COMMON /HANDLE/ IWH
C             comon for window and sprite names
      COMMON /NAMES/WINDOW,SPRITE
      CHARACTER WINDOW*20,SPRITE*12
C             common for sprite area 
      PARAMETER (NWAREA=8400)
      COMMON /SPAREA/ISAREA(NWAREA)
C             size of sprite / Mandelbrot plot
      PARAMETER (NX=256,NY=256)
C             parameters of plot
      COMMON /PARAMS/IX,IY,XMIN,YMIN,DX,DY,X,Y
      LOGICAL SPRESV
C            initialise sprite area
      CALL SPINIT(NWAREA,ISAREA)
      IERR = 1
C            define sprite
      IF(SPRESV(ISAREA,SPRITE,0,NX,NY,27)) IERR = 0
C            check that it fits
      IF(IERR.NE.0) RETURN
C            make window
C            sprite area
      CALL WPCHSA(ISAREA)
C            no redrawing
      CALL WPCHWF(4,.TRUE.)
      WINDOW = 'TWimp12 Mandelbrot'//CHAR(0)
      CALL WPMKNW(512,512,0,200,512,512,0,0,WINDOW,IWH)
C            set sprite to null button type
      CALL WPCHSF(100)
C            no border
      CALL WPCHSF(2,.FALSE.)
C            add the sprite icon to the window
      CALL WPADSI(IWH,0,-512,SPRITE,ICONH)
C            open the window
      CALL WPOPNW(IWH)
C            initialise the plotting
      IX = 0
      IY = 0
      XMIN = -2.0
      YMIN = -1.25
      DX = (0.5  - XMIN)/NX
      DY = (1.25 - YMIN)/NY
      X = XMIN
      Y = YMIN
      RETURN
      END
C
      SUBROUTINE WQNULL
C           calculate a new point
      COMMON /HANDLE/ IWH
      COMMON /RUNNUL/ MASK
      COMMON /NAMES/WINDOW,SPRITE
      CHARACTER WINDOW*20,SPRITE*12
      PARAMETER (NWAREA=8400)
      COMMON /SPAREA/ISAREA(NWAREA)
      PARAMETER (NX=256,NY=256)
      COMMON /PARAMS/IX,IY,XMIN,YMIN,DX,DY,X,Y
C            maximum iterations and iterations/colour
      PARAMETER (MAXC=31,MSC=2)
      MM = 0
   10 M = 0
      U = X
      V = Y
   20 A = U**2
      B = V**2
      IF(A+B.LT.4.) THEN
        V = 2.*U*V + Y
        U = A - B  + X
        M = M + 1
        IF(M.LT.MAXC) GO TO 20
      ENDIF
      IC = M/MSC
      CALL SPWPIX(ISAREA,SPRITE,IX,IY,15-IC,0)
      CALL SPWPIX(ISAREA,SPRITE,IX,255-IY,15-IC,0)
      IX = IX + 1
      IF(IX.LT.NX) THEN
        X = X + DX
      ELSE
        IX = 0
        X = XMIN
        CALL WPPLOT(IWH,0,-2-2*IY,512,-2*IY)
        CALL WPPLOT(IWH,0,2*IY-512,512,2*IY-510)
        IY = IY + 1
        IF(IY.LT.NY/2) THEN
          Y = Y + DY
        ELSE
          MASK = 1
          RETURN
        ENDIF
      ENDIF
      MM = MM + M + 1
      IF(MM.LT.200) GO TO 10
      RETURN
      END
C
C
      SUBROUTINE WQCLSW(DUM)
C           user has asked to close a window so kill task
      CALL WPQUIT
      RETURN
      END
