[comp.sources.amiga] v90i225: BlitterSand - cellular automaton model of self organized criticality, Part01/01

amiga-request@abcfd20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (08/15/90)

Submitted-by: michael creutz <creutz@max.bnl.gov>
Posting-number: Volume 90, Issue 225
Archive-name: examples/blittersand/part01

[ uuencoded executable and icons enclosed  ...tad ]

This program simulates the cellular automaton model presented
by P. Bak, C. Tang, and K. Wiesenfeld (Phys. Rev. Lett. 59, 381 (1987);
Phys. Rev. A38, 364 (1988)) to illustrate self organized criticality.
Each site carries a positive integer representing the local slope of 
a sandpile.  If the slope exceeds 3, the site is unstable and on
updating it drops by 4, adding one to each of his neighbors.
Sand is lost only at the edges.  Any state will relax to stability
through such sand loss.

#!/bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 1 (of 1)."
# Contents:  BlitterSan0.uu BlitterSan1.uu BlitterSand.asm
#   BlitterSand.uu
# Wrapped by tadguy@abcfd20 on Tue Aug 14 21:04:35 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'BlitterSan0.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'BlitterSan0.uu'\"
else
echo shar: Extracting \"'BlitterSan0.uu'\" \(3658 characters\)
sed "s/^X//" >'BlitterSan0.uu' <<'END_OF_FILE'
Xbegin 700 BlitterSand.asm.info
XMXQ```0``````8P`+`&(`'0`&``,``0`C,C``(SB0````````````````````;
XM````!"(`(SKX`````````%\```````````````````````````!B`!T``P`!=
XM.*C_`````````````````````````````````$5555550```````````15_5Q
XM555```````````!%5M55544``````````$569]?51P``````````159G9V5'3
XM``````````!%5F9F14<``````````$56QF9U1P``````````15_'Q\5'````T
XM``````!%5!4%!4<``````````$5555551P``````````1?UU=55'````````G
XM``!%S%%Q54<``````````$7$=7%]1P``````````1?5Q<<U'``````````!%7
XMP7%Q_$<``````````$7%<7'`1P``````````1>5Y>7U'``````````!%!4%!%
XM04<``````````$5555551P``````````1555555'``````````!%555554<`H
XM`````````$5555551P``````````15550`%'``````````!%555554<`````W
XM````````````!P``````````+_______```````````55555554`````````O
XM```````````````````!_______X``````````'_______@``````````?_P8
XM?____\`````````!__D_____P`````````'_^9P\/_O``````````?_YF9F?&
XM^\`````````!__F9F?_[P`````````'_^3F9G_O``````````?_P?#P_^\``G
XM```````!_______[P`````````'_______O``````````?X#SX__^\``````(
XM```!_S/_S__[P`````````'_/X_/A_O``````````?\/S\\S^\`````````!V
XM_S_/SP/[P`````````'_/\_//_O``````````?X?AX>'^\`````````!____=
XM___[P`````````'_______O``````````?______^\`````````!_______[>
XMP`````````'_______O``````````?______^\`````````!_______[P```E
XM``````'_______O``````````?@``````\``````````________P```````M
XM``!________`````````````````````````````````````````````````Z
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````&(`'0`#``(2</\`````````````````````````%
XM*JJJJJJH!5555555```W______Z_______L``#?______K______^P``-___K
XM___^O______[```WZJJJJN`#ZJJJJKL``#?______K______^P``-______^O
XMOZJJJJJ[```W______Z_______L``#?55555?K^JJJJJNP``-______^O___B
XM___[```W555557Z_JJJJJKL``#?______K______^P``-U55555^OZJJJJJ[V
XM```W_____^`#______L``#=55555?K^JJJJJNP``-______^O______[```W6
XMU55557Z_JJJJJKL``#?______K______^P``-U55555^OZJJJJJ[```W____Z
XM__Z_______L``#=55555?K^JJJJJNP``-______^O______[```W_____^`#;
XM______L``#?__U___K___K__^P``-______^O______[```P``````"`````4
XM``,``"JJJJJJJ`55555550````````````````````#_______X?_______`^
XM`/_______________\``^``````!P``````'P`#X``````'```````?``/@`L
XM`````<``````!\``^``````?_!55555'P`#X``````'```````?``/@`````N
XM`<!555551\``^``````!P``````'P`#X*JJJJH'`555554?``/@``````<``1
XM````!\``^*JJJJJ!P%55555'P`#X``````'```````?``/BJJJJJ@<!55555X
XM1\``^``````?_``````'P`#XJJJJJH'`555554?``/@``````<``````!\``=
XM^"JJJJJ!P%55555'P`#X``````'```````?``/BJJJJJ@<!555551\``^```P
XM```!P``````'P`#XJJJJJH'`555554?``/@``````<``````!\``^``````?;
XM_``````'P`#X``"@``'```%```?``/@``````<``````!\``____________;
XM____P`#________________``/_______A_______\``````````````````$
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````!-S>7,Z=71I^
X,;&ET:65S+VUO<F4`L
X``
Xend
Xsize 2577
END_OF_FILE
if test 3658 -ne `wc -c <'BlitterSan0.uu'`; then
    echo shar: \"'BlitterSan0.uu'\" unpacked with wrong size!
fi
# end of 'BlitterSan0.uu'
fi
if test -f 'BlitterSan1.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'BlitterSan1.uu'\"
else
echo shar: Extracting \"'BlitterSan1.uu'\" \(1204 characters\)
sed "s/^X//" >'BlitterSan1.uu' <<'END_OF_FILE'
Xbegin 700 BlitterSand.info
XMXQ```0``````%``+`#\`%@`&``$``0`C(\@`(R<P``'SG@```````````&0`N
XM`````R(``````"`'F````!```````````````````!`````````_`!8``@``;
XM_K@#````````````````````````````````````(`````````!_````````8
XM``'X```````````````````````J@````````$!`````````@"````,```$`'
XM```*!````````!4(`````%`HJI````"JH%%58````%5:HJJJ@```*K5%554`@
XM```52@JJJJ@```J4555550`"JJB*JJBJH!5544555%50*JJJHJJJ*JA55555Y
XM55555`````````````````````````````'@`````````_\````````'`?@`V
XM``````8`.```````!P!P`!4````#`<``H(````'_``$`0````P`````@``H$@
XM```!`?``%0@```'_H"BND````%505=_@````*JJJO_^```!5555__P```"JJ;
XMJO_^J```%555?_U5``*JJJK_^JJ@%55555_555`JJJJJJJJJJ%5555555554$
XM```````_`!8``@`!`!@#``````````````````````````````JJH```````'
XM555`````<`"JJH````!P`5557__\`'`"JJJ@````<`%554````!P`*JJH```(
XM````U55```````&`0``*`````!```!4``````%`HJH````"JH%%50````E5:=
XMHJJB@``$*K5%55$```(5:@JJJJ@``$J4555150`"JJB*JJBJH!5544555%50Y
XM*JJJHJJJ*JA5555555555```````````````````````'__@``'_\`#__^``Y
XM`X!P`?O_P``'`'`#U_____X`<`.J_^``!X!P`]7_X``'P'``JO_@``'_\`!5I
XM_^```````(````H````!$_``%0````'_H"BJ@````550555````"JJJJJJJ`8
XM``15555570```BJJJJJNJ```55555555``*JJJJJKJJ@%555555555`JJJJJ@
X0JJJJJ%5555555554````!```1
X``
Xend
Xsize 826
END_OF_FILE
if test 1204 -ne `wc -c <'BlitterSan1.uu'`; then
    echo shar: \"'BlitterSan1.uu'\" unpacked with wrong size!
fi
# end of 'BlitterSan1.uu'
fi
if test -f 'BlitterSand.asm' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'BlitterSand.asm'\"
else
echo shar: Extracting \"'BlitterSand.asm'\" \(29043 characters\)
sed "s/^X//" >'BlitterSand.asm' <<'END_OF_FILE'
X;BlitterSand 
X;by Mike Creutz
X;   P.O. Box 204
X;   E. Moriches, NY 11940
X;   USA
X;creutz@bnlux0.bnl.gov
X;23 June 1990 
X
X;This program simulates the cellular automaton model presented
X;by P. Bak, C. Tang, and K. Wiesenfeld (Phys. Rev. Lett. 59, 381 (1987);
X;Phys. Rev. A38, 364 (1988)) to illustrate self organized criticality.
X;Each site carries a positive integer representing the local slope of 
X;a sandpile.  If the slope exceeds 3, the site is unstable and on
X;updating it drops by 4, adding one to each of his neighbors.
X;Sand is lost only at the edges.  Any state will relax to stability
X;through such sand loss.
X
X;The colors representing slopes of 0 through 7 are white, black,
X;red, green, yellow, blue, magenta, and cyan, respectively.
X
X;Various keypresses do as follows:
X;     <esc>, q, or any control character exits
X;     p     pauses; repeated presses single step; any other key restarts
X;     d     doubles the lattice modulo 8
X;     a     sets a flag to pause after each relaxation
X
X;The program can be run from either CLI or Workbench.  This code
X;is completely self contained and will run directly through A68K 
X;followed by BLink without need for any include files. 
X
X;The program directly accesses the blitter for speed, but does
X;so in a mode friendly to multitasking.  To understand the program 
X;details you should have the Amiga Hardware Reference Manual.  
X
X;Technically, the show proceeds as follows:
X 
X;We start with ones on the borders and twos on the corners
X;of a 288 by 188 lattice.  For the first loop, whenever a stable state 
X;occurs, the heights are all doubled, and the system is allowed to 
X;relax back to stability.  This eventually leads to a unique state 
X;that when doubled relaxes to itself.  The system can be described 
X;as a large Abelian group and this state represents the identity.
X
X;After the identity is found, the program proceeds to construct
X;the inverse of the state with all cells unity.  After this is found it
X;is tripled to give the inverse of the minimally stable state with all 
X;cells being 3.
X
X;After all this, to keep the show going, the identity is 
X;added to the system which then relaxes back to itself.  This loops
X;until intervention.
X
X;If you hit 'd' on an active state early in the program, the search for
X;the identity will be derailed and the program will go into a mode where
X;the pattern is unlikely to repeat for the lifetime of the universe. 
X;After a few hours, however, it will probably look uninterestingly random.
X; ******************************************************
X
X; library offsets:
X_LVOOpenLibrary EQU -552
X_LVOCloseLibrary EQU -414 
X_LVOSetAPen EQU -342 
X_LVOSetBPen EQU -348 
X_LVOSetDrMd EQU -354 
X_LVOWritePixel EQU -324 
X_LVOMove EQU -240
X_LVODraw EQU -246
X_LVOText EQU -60
X_LVOClipBlit EQU -552 
X_LVOOpenScreen EQU -198 
X_LVOOpenWindow EQU -204 
X_LVOCloseScreen EQU -66 
X_LVOCloseWindow EQU -72
X_LVOGetMsg EQU -372 
X_LVOReplyMsg EQU -378 
X_LVOWaitPort EQU -384 
X_LVOLoadRGB4 EQU -192 
X_LVOOwnBlitter EQU -456 
X_LVODisownBlitter EQU -462 
X_LVOWaitBlit EQU -228 
X_LVOAllocMem EQU -198 
X_LVOFreeMem EQU -210 
X_LVOSetRast EQU -234
X_LVOFindTask EQU -294 
X_LVOForbid EQU -132 
X
X;IDCMP Flags 
XCLOSEWINDOW EQU $200
XVANILLAKEY  EQU $200000
X; window flags
XWINDOWDRAG  EQU $2
XWINDOWDEPTH EQU $4      
XWINDOWCLOSE EQU $8
XBACKDROP    EQU $100 
XBORDERLESS  EQU $800
XACTIVATE    EQU $1000
X; various useful numbers
XMEMF_PUBLIC EQU 1
XMEMF_CHIP   EQU 2
XMEMF_FAST   EQU 4
XMEMB_CLEAR  EQU $10000
Xpr_CLI      EQU 172
Xpr_MsgPort  EQU 92
XAbsExecBase EQU $4
XJAM1        EQU 0
XJAM2        EQU 1
XCOMPLEMENT  EQU 2
XINVERSID    EQU 3
X
X; custom chip register offsets
X_custom EQU $DFF000
XDMACONR EQU $002
XBLTCON0 EQU $040
XBLTCON1 EQU $042
XBLTAFWM EQU $044
XBLTALWM EQU $046
XBLTCPT  EQU $048
XBLTBPT  EQU $04C
XBLTAPT  EQU $050
XBLTDPT  EQU $054
XBLTSIZE EQU $058
XBLTCMOD EQU $060
XBLTBMOD EQU $062
XBLTAMOD EQU $064
XBLTDMOD EQU $066
XBLTCDAT EQU $070
XBLTBDAT EQU $072
XBLTADAT EQU $074
X
X; various size parameters
Xxmin EQU 16  ; should be a multiple of 16
Xymin EQU 11  ; 11 or more to avoid border effects
Xxmax EQU 303 ; -1+multiple of 16
Xymax EQU 198  
X
X; a small system for testing:
X;xmin equ 48
X;xmax equ 127
X;ymin equ 50
X;ymax equ 150  
X
Xstartdisp EQU 2*(xmin/16)+ymin*40 ; shift from start of bitplane to lattice
Xmodulo    EQU 40-2*((xmax-xmin+1)/16) ; blitter modulo
Xenddisp   EQU -modulo-2+((ymax-ymin+1)*40)      ; shift to end of lattice
Xbsize     EQU 20-(modulo/2)+$40*(ymax-ymin+1)   ; for BLTSIZE
Xworkspacesize EQU 40*(ymax-ymin+1)
X
X ; startup code for CLI or Workbench
X ; opens graphics and intuition libraries, calls 'Main' and exits
Xstartup:
X  movem.l d2-d7/a2-a6,-(a7) ; save registers
X  move.l AbsExecBase,a6     ; exec base pointer
X  clr.l workbenchmessage
X  suba.l a1,a1              ; clear a1
X  jsr _LVOFindTask(a6)      ; where is our task
X  move.l d0,a4
X  tst.l pr_CLI(a4)          ; are we running from CLI?
X  bne fromcli               ; if not then get workbench message
X  lea pr_MsgPort(a4),a0
X  jsr _LVOWaitPort(a6)
X  Jsr _LVOGetMsg(a6)
X  move.l d0,workbenchmessage ; save for exit
X;open graphics and intuition libraries
Xfromcli  lea GraphicsName(pc),a1  ; pointer to name of library
X    moveq #0,d0         ; accept any version
X    jsr _LVOOpenLibrary(a6)
X    move.l d0,GraphicsBase    ; save graphics base
X    tst.l d0
X    beq.s Exit1          ; quit if trouble opening library
X  lea IntuitionName(pc),a1  ; pointer to name of library
X    moveq #0,d0         ; accept any version
X    jsr _LVOOpenLibrary(a6)
X    move.l d0,IntuitionBase ; save intuition base
X    tst.l d0
X    beq.s Exit2          ; quit if trouble opening library
X
X; execute main program
X    bsr Main          
X
X;final cleanup
XExit3: movea.l IntuitionBase,a1    ; intuition base
X       movea.l AbsExecBase,a6      ; exec base pointer
X       jsr _LVOCloseLibrary(a6)
XExit2: movea.l GraphicsBase,a1     ; graphics base
X       jsr _LVOCloseLibrary(a6)
X       moveq.l #0,d0               ; return zero
XExit1: tst.l workbenchmessage ; are we a workbench program?
X       beq.s Exit0            ; if not goto exit0
X         jsr _LVOForbid(a6)     ; because the RKM tells me so
X         movea.l workbenchmessage(pc),a1
X         jsr _LVOReplyMsg(a6)   ; reply to workbench message
XExit0: movem.l (a7)+,d2-d7/a2-a6   ; restore registers
X       rts ; end of startup code
X
XMain: move.l a7,oldstack ; save stack for exit
X; allocate various working areas
X   moveq.l #7,d2 ; memory allocation loop counter
X   lea.l workingplane1(pc),a2
X   bra.s startalloc
Xallocloop move.l #workspacesize,d0 ; size for working area
X          move.l #MEMF_CHIP+MEMB_CLEAR,d1  ;get chip memory 
X          jsr _LVOAllocMem(a6)
X          tst.l d0
X          beq quit1
X           move.l d0,(a2)+        
Xstartalloc dbf.s d2,allocloop
X
X; open screen and window
X     move.l IntuitionBase(pc),a6
X     lea myscreen(pc),a0
X     jsr _LVOOpenScreen(a6) ; open custom screen
X       move.l d0,screen     ; save screen structure pointer
X       beq quit1            ; quit if trouble
X     lea mywindow(pc),a0    ; open display window
X     jsr  _LVOOpenWindow(a6) 
X       move.l d0,window     ; save address of window structure
X       beq quit2            ;quit if trouble
X       movea.l d0,a0
X       move.l 86(a0),userport
X       movea.l 50(a0),a0 ; rastport
X       move.l a0,rastport
X       move.l 4(a0),a0 ; bitmap structure
X       move.l 8(a0),bitplane1
X       move.l 12(a0),bitplane2
X       move.l 16(a0),bitplane3
X       addi.l #startdisp,bitplane1
X       addi.l #startdisp,bitplane2
X       addi.l #startdisp,bitplane3
X;set colors
X     movea.l GraphicsBase(pc),a6          ; graphics library address in a6
X     movea.l screen(pc),a0
X     adda.l #44,a0      ; viewport
X     lea.l colors(pc),a1
X     moveq.l #8,d0
X     jsr _LVOLoadRGB4(a6)   
X; show credits
X     bsr credits      
X;draw initial box of ones
X     movea.l rastport(pc),a1    
X     moveq.w #1,d0
X     jsr _LVOSetAPen(a6) ; set pen color
X       movea.l rastport(pc),a1    
X       moveq.w #JAM1,d0
X     jsr _LVOSetDrMd(a6) ; set drawing mode      
X       movea.l rastport(pc),a1    
X       move.w #xmin,d0
X       move.w #ymin,d1
X     jsr _LVOMove(a6) ; go to top left corner
X       movea.l rastport(pc),a0    
X       move.w #xmax,d0
X       move.w #ymin,d1
X     jsr _LVODraw(a6) ; draw top line
X       movea.l rastport(pc),a0    
X       move.w #xmax,d0
X       move.w #ymax,d1
X     jsr _LVODraw(a6) ; right side
X       movea.l rastport(pc),a0    
X       move.w #xmin,d0
X       move.w #ymax,d1
X     jsr _LVODraw(a6) ; bottom
X       movea.l rastport(pc),a0    
X       move.w #xmin,d0
X       move.w #ymin,d1
X     jsr _LVODraw(a6) ; left
X;set corners to two
X       movea.l rastport(pc),a1    
X       moveq.w #2,d0
X     jsr _LVOSetAPen(a6) ; new color for corners
X       movea.l rastport(pc),a1    
X       move.w #xmin,d0
X       move.w #ymin,d1
X     jsr _LVOWritePixel(a6) ; nw corner
X       movea.l rastport(pc),a1    
X       move.w #xmax,d0
X       move.w #ymin,d1
X     jsr _LVOWritePixel(a6) ; ne corner
X       movea.l rastport(pc),a1    
X       move.w #xmax,d0
X       move.w #ymax,d1
X     jsr _LVOWritePixel(a6) ; se corner
X       movea.l rastport(pc),a1    
X       move.w #xmin,d0
X       move.w #ymax,d1
X     jsr _LVOWritePixel(a6) ; sw corner
X
X; showtime -- first double until identity found
Xfirstloop: bsr relax
X        lea.l storage1(pc),a0 ; prepare to compare with storage
X        lea.l bitplane1(pc),a1
X        bsr compare2  ; see if lattices equal
X        btst.b #5,control(pc)    
X        bne.s foundidentity
X         lea.l bitplane1(pc),a0
X         lea.l storage1(pc),a1
X         bsr copy2              ; copy bitplanes to storage
X         bsr double             ; double things 
X         bra.s firstloop
X; save identity and set first storage plane to unity
Xfoundidentity:
X         lea.l bitplane1(pc),a0
X         lea.l identity1(pc),a1
X         bsr copy2
X         lea.l storage1(pc),a0
X         bsr set1 
X; subtract first storage plane while adding identity 
X            bra.s stillactive
Xsecondloop: bsr sand
X            btst.b #5,control(pc) ; check if still active   
X            beq.s stillactive
X             lea.l identity1(pc),a0
X             lea.l bitplane1(pc),a1    
X             bsr addit 
Xstillactive: bsr subtract1
X             btst.b #5,control(pc) ; check if more to subtract   
X             bne.s tripleit
X              bsr checkmessage 
X              bra.s secondloop
X; triple to find inverse of minimally stable state
Xtripleit bsr relax 
X         lea.l bitplane1(pc),a0
X         lea.l storage1(pc),a1
X         bsr copy2
X         bsr double 
X         bsr relax
X         lea.l storage1(pc),a0
X         lea.l bitplane1(pc),a1    
X         bsr addit
X         bsr relax
X; to keep display moving, repeatedly add identity and relax
Xfinalloop lea.l identity1(pc),a0
X          lea.l bitplane1(pc),a1    
X          bsr addit
X          bsr relax
X          bra.s finalloop
X
X; time to quit
Xgetout:
X ; close windows and screen 
X      movea.l window(pc),a0
X      move.l IntuitionBase(pc),a6
X      jsr _LVOCloseWindow(a6)
Xquit2 movea.l screen(pc),a0
X      jsr _LVOCloseScreen(a6)
X; deallocate memory
Xquit1: movea.l AbsExecBase,a6
X       moveq.l #7,d2 ; memory deallocation loop counter
X       lea.l workingplane1(pc),a2
X       bra.s startdealloc
Xdeallocloop  move.l #workspacesize,d0 ; size for working area
X             movea.l (a2)+,a1
X             move.l a1,d1        ; to test if not zero
X             beq.s done 
X             jsr _LVOFreeMem(a6) ; return memory
Xstartdealloc dbf.s d2,deallocloop
Xdone movea.l oldstack(pc),a7   ; reset stack pointer
X     rts ; all done
X
X; subroutine to update lattice until relaxed
Xrelax: bsr sand
X       btst.b #5,control(pc) ; check if still active   
X       bne.s relaxed
X        bsr checkmessage 
X        bra.s relax
Xrelaxed: tst.w autopause   ; should we pause
X         beq.s autooff    
X          bsr waitformessage
Xautooff  rts      
X
X; message handling subroutine
X; message location returned in d0, class in d2, code in d3 
X; with VANILLAKEY code is ascii of pressed key 
Xwaitformessage:  ; pause for a signal
X      movea.l AbsExecBase,a6  
X      movea.l userport(pc),a0
X      jsr _LVOWaitPort(a6)   ; wait for a message
Xcheckmessage:   ; enter here to not wait if no message        
X      movea.l AbsExecBase,a6
X      movea.l userport(pc),a0
X      jsr _LVOGetMsg(a6)
X       tst.l d0
X       bne.s messagefound
X        rts
Xmessagefound:
X       movea.l d0,a1       
X       move.l 20(a1),d2    ; save class in d2
X       move.w 24(a1),d3    ; and code in d3
X      jsr _LVOReplyMsg(a6) ; reply to message
X; check for various keypresses
X      cmpi.w #27,d3 ; esc
X       ble getout ; leave for escape or control characters
X      cmpi.w #'q',d3
X       beq getout ; quit for q
X      cmpi.w #'p',d3 ; p ; pause for p
X       bne.s not_p        
X        movea.l userport(pc),a0
X        jsr _LVOWaitPort(a6)   ; wait for a message
Xnot_p cmpi.w #'d',d3 ; d
X       bne.s not_d ; double for d
X        bsr double
Xnot_d cmpi.w #'a',d3 ; a
X       bne.s not_a
X        not.w autopause ; flip autopausing flag
Xnot_a rts  ; continue
X
X; storage area         
X; window and screen parameters
Xmywindow dc.w 0,0,320,200     ; xmin,ymin,xsize,ysize
X         dc.b 0,0             ; detail pen, block pen
X           ; (Intuition Direct Communication Message Port)
X         dc.l VANILLAKEY      ; IDCMP Flags, ask for keypresses 
X         dc.l ACTIVATE+BORDERLESS ;+BACKDROP ; flags (type in amigabasic)
X         dc.l 0               ; gadgets  
X         dc.l 0               ; checkmark
X         dc.l title           ; my title
Xscreen   dc.l 0               ;location of screen, fill later
X         dc.l 0               ;bitmap
X         dc.w 0,0,320,200     ;min-max window size
X         dc.w $f              ; type: 1=wbenchscreen $F=customscreen
Xmyscreen dc.w 0,0,320,200 ;size
X         dc.w 3           ;depth
X         dc.b 5,6         ;pens
X         dc.w $0          ;viewmodes- interlace=4, hires=$8000 
X                          ; sprites=$4000, ham=$800, extra_halfbrite=$80
X         dc.w $f          ;type: customscreen
X         dc.l textattr    ;font
X         dc.l title       ;title
X         dc.l 0           ;gadgets    
X         dc.l 0           ;custombitmap
Xtextattr dc.l fontname
X         dc.w 8   ;fontsize
X         dc.b 0,0    ;style and flags
Xcolors dc.w $fff ; color table
X       dc.w $000 
X       dc.w $f00
X       dc.w $0f0
X       dc.w $ff0
X       dc.w $00f
X       dc.w $f0f
X       dc.w $0ff
X
Xworkbenchmessage dc.l 0
XGraphicsBase     dc.l 0
XIntuitionBase    dc.l 0
XGraphicsName     dc.b 'graphics.library',0
XIntuitionName    dc.b 'intuition.library',0 
Xtitle            dc.b 'BlitterSand -- <esc> to exit',0
Xfontname         dc.b 'topaz.font',0
Xwindow           dc.l 0
Xrastport         dc.l 0
Xuserport         dc.l 0
Xbitplane1        dc.l 0
Xbitplane2        dc.l 0
Xbitplane3        dc.l 0
Xworkingplane1    dc.l 0
Xworkingplane2    dc.l 0
Xworkingplane3    dc.l 0
Xstorage1         dc.l 0
Xstorage2         dc.l 0
Xidentity1        dc.l 0
Xidentity2        dc.l 0
Xcontrol          dc.w 0
Xautopause        dc.w 0
Xoldstack         dc.l 0
X
X; primary updating routine
Xsand: movea.l GraphicsBase(pc),a6 ; graphics library address in a6
X     jsr _LVOOwnBlitter(a6)      ; grab blitter for my use  
X     lea _custom,a5
X     move.l bitplane1(pc),d2     ;start of bitplane1
X     move.l bitplane2(pc),d3     ;start of bitplane2
X     move.l bitplane3(pc),d4     ;start of bitplane3
X     move.l workingplane1(pc),d5 ; start of working plane 1
X     move.l workingplane2(pc),d6 ; start of working plane 2
X     move.l workingplane3(pc),d7 ; start of working plane 3
X ; add left, top, and bottom neighbors to workspace
X ; work on first bit: 
X     jsr _LVOWaitBlit(a6)
X      move.l d5,BLTDPT(a5) ; first workspace plane
X      move.l d4,d0 
X      move.l d0,BLTAPT(a5) ; for left neighbor
X      addi.l #40,d0
X      move.l d0,BLTBPT(a5) ; for bottom neighbor
X      subi.l #80,d0
X      move.l d0,BLTCPT(a5) ; for top
X      move.w #0,BLTCON1(a5)
X      move.w #$1f96,BLTCON0(a5) ; odd number of source bits set
X      move.w #modulo,BLTAMOD(a5)     ; set up modulos
X      move.w #modulo,BLTBMOD(a5)
X      move.w #modulo,BLTCMOD(a5)
X      move.w #modulo,BLTDMOD(a5)
X      move.w #$ffff,BLTAFWM(a5)
X      move.w #$fffe,BLTALWM(a5) ; mask out last bit of row
X      move.w #bsize,BLTSIZE(a5) ; do it
X ; second bit
X     jsr _LVOWaitBlit(a6)
X      move.l d6,BLTDPT(a5) ; second plane of workspace 
X      move.l d4,d0
X      move.l d0,BLTAPT(a5) ; reset bitplane pointers
X      addi.l #40,d0
X      move.l d0,BLTBPT(a5)
X      subi.l #80,d0
X      move.l d0,BLTCPT(a5)
X      move.w #$1fe8,BLTCON0(a5) ; 2 or more source bits set
X      move.w #bsize,BLTSIZE(a5) ; go to it
X; add in fourth neighbor, third bit of result
X     jsr _LVOWaitBlit(a6)
X      move.l d4,d0
X      addi.l #enddisp,d0 
X      move.l d0,BLTAPT(a5) ; end of lattice
X      move.l d7,d0
X      addi.l #enddisp,d0
X      move.l d0,BLTDPT(a5) ; end of third plane of workspace
X      move.l d5,d0
X      addi.l #enddisp,d0
X      move.l d0,BLTBPT(a5) ; first workspace plane
X      move.l d6,d0
X      addi.l #enddisp,d0   ; second workspace plane
X      move.l d0,BLTCPT(a5)
X      move.w #2,BLTCON1(a5) ; descending mode
X      move.w #$1f80,BLTCON0(a5) ; third bit only if all already set
X      move.w #$7fff,BLTALWM(a5)
X      move.w #bsize,BLTSIZE(a5) ; OK
X; add in fourth neighbor, second bit of result
X     jsr _LVOWaitBlit(a6)
X      move.l d4,d0
X      addi.l #enddisp,d0
X      move.l d0,BLTAPT(a5)
X      move.l d6,d0
X      addi.l #enddisp,d0
X      move.l d0,BLTDPT(a5)
X      move.l d0,BLTCPT(a5)
X      move.l d5,d0
X      addi.l #enddisp,d0
X      move.l d0,BLTBPT(a5)
X      move.w #$1f6a,BLTCON0(a5) ; second bit only if appropriate
X      move.w #bsize,BLTSIZE(a5) ; here we go again
X; add in fourth neighbor, first bit of result
X     jsr _LVOWaitBlit(a6)
X      move.l d4,d0
X      addi.l #enddisp,d0
X      move.l d0,BLTAPT(a5)
X      move.l d5,d0
X      addi.l #enddisp,d0
X      move.l d0,BLTDPT(a5)
X      move.l d0,BLTBPT(a5)
X      move.w #$1d3c,BLTCON0(a5) ; second bit from a xor b
X      move.w #bsize,BLTSIZE(a5) ; finish setting up workspace
X; add it all up
X     jsr _LVOWaitBlit(a6) ; 2w,3w,2b to 3b
X      move.l d4,BLTDPT(a5)
X      move.l d3,BLTAPT(a5)
X      move.l d6,BLTBPT(a5)
X      move.l d7,BLTCPT(a5)  
X      move.w #0,BLTCON1(a5) ; reset for ascending mode
X      move.w #$0fea,BLTCON0(a5) 
X      move.w #$ffff,BLTALWM(a5) ; fix last word mask
X      move.w #bsize,BLTSIZE(a5)
X     jsr _LVOWaitBlit(a6) ; 2w,2b to 2b
X      move.l d3,BLTDPT(a5)
X      move.l d3,BLTAPT(a5)
X      move.l d6,BLTBPT(a5)
X      move.w #$0d3c,BLTCON0(a5) 
X      move.w #bsize,BLTSIZE(a5)
X     jsr _LVOWaitBlit(a6) ; 1w,1b,2b to 3w for carry
X      move.l d7,BLTDPT(a5)
X      move.l d2,BLTAPT(a5)
X      move.l d3,BLTBPT(a5)
X      move.l d5,BLTCPT(a5) 
X      move.w #$0f80,BLTCON0(a5) 
X      move.w #bsize,BLTSIZE(a5)
X     jsr _LVOWaitBlit(a6) ; 1w, 1b to 2b
X      move.l d3,BLTDPT(a5)
X      move.l d2,BLTAPT(a5)
X      move.l d5,BLTBPT(a5)
X      move.l d3,BLTCPT(a5) 
X      move.w #$0f6a,BLTCON0(a5) 
X      move.w #bsize,BLTSIZE(a5)
X     jsr _LVOWaitBlit(a6) ; final carry
X      move.l d4,BLTDPT(a5)
X      move.l d4,BLTAPT(a5)
X      move.l d7,BLTBPT(a5)
X      move.w #$0dfc,BLTCON0(a5) 
X      move.w #bsize,BLTSIZE(a5)
X     jsr _LVOWaitBlit(a6) ; 1w, 1b to 1b
X      move.w DMACONR(a5),control ; save control register for later
X      move.l d2,BLTDPT(a5)
X      move.l d2,BLTAPT(a5)
X      move.l d5,BLTBPT(a5)
X      move.w #$0d3c,BLTCON0(a5) 
X      move.w #bsize,BLTSIZE(a5)
X   jsr _LVODisownBlitter(a6) ; I'm done for now
X     rts
X
X; double main lattice
Xdouble: movea.l GraphicsBase(pc),a6 ; graphics library address in a6
X    jsr _LVOOwnBlitter(a6)  
X     lea _custom,a5
X     move.l bitplane1(pc),d2 ;start of bitplane1
X     move.l bitplane2(pc),d3 ;start of bitplane2
X     move.l bitplane3(pc),d4 ;start of bitplane3
X; shift up all bitplanes
X     jsr _LVOWaitBlit(a6)
X      move.l d4,BLTDPT(a5) ; copy to plane 3
X      move.l d3,BLTAPT(a5) ; from plane 2
X      move.w #0,BLTCON1(a5)
X      move.w #$09f0,BLTCON0(a5)
X      move.w #modulo,BLTAMOD(a5)
X      move.w #modulo,BLTBMOD(a5)
X      move.w #modulo,BLTCMOD(a5)
X      move.w #modulo,BLTDMOD(a5)
X      move.w #$ffff,BLTAFWM(a5)
X      move.w #$ffff,BLTALWM(a5)
X      move.w #bsize,BLTSIZE(a5)
X     jsr _LVOWaitBlit(a6)
X      move.l d3,BLTDPT(a5) ; copy to plane 2
X      move.l d2,BLTAPT(a5) ; from plane 1
X      move.w #$09f0,BLTCON0(a5) 
X      move.w #bsize,BLTSIZE(a5)
X     jsr _LVOWaitBlit(a6)
X      move.l d2,BLTDPT(a5) ; clear plane 1
X      move.w #$0100,BLTCON0(a5)
X      move.w #bsize,BLTSIZE(a5)
X     jsr _LVODisownBlitter(a6) ; give it back
X     rts
X
Xcompare2 ; compare two planes, pointed to by (a0) and (a1)
X    movea.l GraphicsBase(pc),a6 ; graphics library address in a6
X     lea _custom,a5
X     move.l (a0)+,d2 ;start of bitplane1
X     move.l (a0),d3 ;start of bitplane2
X     move.l (a1)+,d4 ;start of comparison bitplane1
X     move.l (a1),d5 ;start of comparison bitplane2
X    jsr _LVOOwnBlitter(a6)  ; get blitter
X     jsr _LVOWaitBlit(a6)
X      move.l d2,BLTAPT(a5) ; plane 1
X      move.l d4,BLTBPT(a5) ; compare 1
X      move.w #0,BLTCON1(a5)
X      move.w #$0c3c,BLTCON0(a5)
X      move.w #modulo,BLTAMOD(a5)
X      move.w #modulo,BLTBMOD(a5)
X      move.w #$ffff,BLTAFWM(a5)
X      move.w #$ffff,BLTALWM(a5)
X      move.w #bsize,BLTSIZE(a5)
X     jsr _LVOWaitBlit(a6)
X      move.w DMACONR(a5),control ; save control register for later
X      move.l d3,BLTAPT(a5) ; plane 2
X      move.l d5,BLTBPT(a5) ; compare 2
X      move.w #0,BLTCON1(a5)
X      move.w #$0c3c,BLTCON0(a5)
X      move.w #bsize,BLTSIZE(a5)
X     jsr _LVOWaitBlit(a6)
X      move.w DMACONR(a5),d0
X      and.w d0,control ; save control register for later
X     jsr _LVODisownBlitter(a6) ; give it back
X     rts
X
Xcopy2 ; copy two planes, pointed to by (a0) and (a1)
X    movea.l GraphicsBase(pc),a6 ; graphics library address in a6
X     lea _custom,a5
X     move.l (a0)+,d2 ;start of bitplane1
X     move.l (a0),d3 ;start of bitplane2
X     move.l (a1)+,d4 ;start of copy bitplane1
X     move.l (a1),d5 ;start of copy bitplane2
X    jsr _LVOOwnBlitter(a6)  ; prepare blitter
X     jsr _LVOWaitBlit(a6)
X      move.l d2,BLTAPT(a5) ; plane 1
X      move.l d4,BLTDPT(a5) ; copy 1
X      move.w #0,BLTCON1(a5)
X      move.w #$09f0,BLTCON0(a5) ; straight copy
X      move.w #modulo,BLTAMOD(a5)
X      move.w #modulo,BLTDMOD(a5)
X      move.w #$ffff,BLTAFWM(a5)
X      move.w #$ffff,BLTALWM(a5)
X      move.w #bsize,BLTSIZE(a5)
X     jsr _LVOWaitBlit(a6)
X      move.l d3,BLTAPT(a5) ; plane 2
X      move.l d5,BLTDPT(a5) ; copy 2
X      move.w #0,BLTCON1(a5)
X      move.w #$09f0,BLTCON0(a5)
X      move.w #bsize,BLTSIZE(a5)
X     jsr _LVODisownBlitter(a6) ; give it back
X     rts
X
Xset1: ; set one plane to unity, pointed to by (a0)
X    movea.l GraphicsBase(pc),a6 ; graphics library address in a6
X     lea _custom,a5
X     move.l (a0),d2 ;start of plane
X    jsr _LVOOwnBlitter(a6)  ; get blitter
X     jsr _LVOWaitBlit(a6)
X      move.l d2,BLTDPT(a5) ; plane 1
X      move.w #0,BLTCON1(a5)
X      move.w #$01ff,BLTCON0(a5) ; straight set
X      move.w #modulo,BLTDMOD(a5)
X      move.w #bsize,BLTSIZE(a5)
X     jsr _LVODisownBlitter(a6) ; give it back
X     rts
X
X; subtract storage1 from nonzero lattice sites
Xsubtract1: movea.l GraphicsBase(pc),a6 ; graphics library address in a6
X    jsr _LVOOwnBlitter(a6)
X     lea _custom,a5
X     move.l bitplane1(pc),d2 ;start of bitplane1
X     move.l bitplane2(pc),d3 ;start of bitplane2
X     move.l workingplane1(pc),d5 ; start of working plane 1
X     move.l workingplane2(pc),d6 ; start of working plane 2
X     move.l storage1(pc),d7
X     jsr _LVOWaitBlit(a6)
X      move.l d5,BLTDPT(a5) ; new first plane to working plane
X      move.l d2,BLTAPT(a5) ; old first plane
X      move.l d3,BLTBPT(a5) ; old second plane
X      move.l d7,BLTCPT(a5) ; subtracting plane
X      move.w #0,BLTCON1(a5)
X      move.w #$0f58,BLTCON0(a5)
X      move.w #modulo,BLTAMOD(a5)
X      move.w #modulo,BLTBMOD(a5)
X      move.w #modulo,BLTCMOD(a5)
X      move.w #modulo,BLTDMOD(a5)
X      move.w #$ffff,BLTAFWM(a5)
X      move.w #$ffff,BLTALWM(a5)
X      move.w #bsize,BLTSIZE(a5)
X     jsr _LVOWaitBlit(a6)
X      move.l d6,BLTDPT(a5) ; new second plane to working plane
X      move.l d2,BLTAPT(a5) ; old first plane
X      move.l d3,BLTBPT(a5) ; old second plane
X      move.l d7,BLTCPT(a5) ; subtracting plane
X      move.w #0,BLTCON1(a5)
X      move.w #$0fc4,BLTCON0(a5)
X      move.w #bsize,BLTSIZE(a5)
X     jsr _LVOWaitBlit(a6)
X      move.l d7,BLTDPT(a5) ; new subtracting plane to storage
X      move.l d2,BLTAPT(a5) ; old first plane
X      move.l d3,BLTBPT(a5) ; old second plane
X      move.l d7,BLTCPT(a5) ; subtracting plane
X      move.w #0,BLTCON1(a5)
X      move.w #$0f02,BLTCON0(a5)
X      move.w #bsize,BLTSIZE(a5)
X     jsr _LVOWaitBlit(a6)
X      move.w DMACONR(a5),control ; save control register for later
X      move.l d5,BLTAPT(a5) ; new plane 1
X      move.l d2,BLTDPT(a5) ; copy back
X      move.w #0,BLTCON1(a5)
X      move.w #$09f0,BLTCON0(a5) ; straight copy
X      move.w #bsize,BLTSIZE(a5)
X     jsr _LVOWaitBlit(a6)
X      move.l d6,BLTAPT(a5) ; new plane 2
X      move.l d3,BLTDPT(a5) ; copy back
X      move.w #0,BLTCON1(a5)
X      move.w #$09f0,BLTCON0(a5)
X      move.w #bsize,BLTSIZE(a5)
X    jsr _LVODisownBlitter(a6) ; give it back
X     rts
X
X; add two lattices, source pointed at by (a0) and dest by (a1)
Xaddit: movea.l GraphicsBase(pc),a6 ; graphics library address in a6
X     lea _custom,a5
X     move.l (a1)+,d2 ;start of bitplane1
X     move.l (a1)+,d3 ;start of bitplane2
X     move.l (a1),d4  ;start of bitplane3
X     move.l (a0)+,d5 ;start of adding plane1
X     move.l (a0),d6  ;start of adding plane2
X    jsr _LVOOwnBlitter(a6) ; prepare to add identity to lattice
X     move.l workingplane3(pc),d7 ; for carry
X    jsr _LVOWaitBlit(a6)
X      move.l d7,BLTDPT(a5) ; carry
X      move.l d2,BLTAPT(a5) ; old first plane
X      move.l d5,BLTBPT(a5) ; identity1
X      move.w #0,BLTCON1(a5)
X      move.w #$0dc0,BLTCON0(a5)
X      move.w #modulo,BLTAMOD(a5)
X      move.w #modulo,BLTBMOD(a5)
X      move.w #modulo,BLTCMOD(a5)
X      move.w #modulo,BLTDMOD(a5)
X      move.w #$ffff,BLTAFWM(a5)
X      move.w #$ffff,BLTALWM(a5)
X      move.w #bsize,BLTSIZE(a5)
X    jsr _LVOWaitBlit(a6)
X      move.l d2,BLTDPT(a5) ; new first plane (assume old=0)
X      move.l d2,BLTAPT(a5) ; old first plane
X      move.l d5,BLTBPT(a5) ; identity1
X      move.w #0,BLTCON1(a5)
X      move.w #$0d3c,BLTCON0(a5)
X      move.w #bsize,BLTSIZE(a5)
X    jsr _LVOWaitBlit(a6)
X      move.l d4,BLTDPT(a5) ; new third bit
X      move.l d3,BLTAPT(a5) ; old second plane
X      move.l d6,BLTBPT(a5) ; identity2
X      move.l d7,BLTCPT(a5) ; old carry
X      move.w #0,BLTCON1(a5)
X      move.w #$0fe8,BLTCON0(a5)
X      move.w #bsize,BLTSIZE(a5)
X    jsr _LVOWaitBlit(a6)
X      move.l d3,BLTDPT(a5) ; new second bit
X      move.l d3,BLTAPT(a5) ; old second plane
X      move.l d6,BLTBPT(a5) ; identity2
X      move.l d7,BLTCPT(a5) ; old carry
X      move.w #0,BLTCON1(a5)
X      move.w #$0f96,BLTCON0(a5)
X      move.w #bsize,BLTSIZE(a5)
X    jsr _LVODisownBlitter(a6) ; give it back
X    rts
X
Xcredits: ; display introductory comments    
X    moveq.l #30,d2 ; length of lines
X    moveq.l #15,d3  ; number of lines
X    moveq.l #25,d4 ; starting row
X    movea.l GraphicsBase(pc),a6 ; graphics library address in a6
X    lea.l mytext(pc),a3 ; start of text information
X      movea.l rastport(pc),a1    
X      moveq.w #7,d0
X    jsr _LVOSetBPen(a6) ; set background pen color
X      movea.l rastport(pc),a1    
X      moveq.w #JAM2,d0
X    jsr _LVOSetDrMd(a6) ; set drawing mode      
X    bra startprint 
Xmyprint:   movea.l rastport(pc),a1 ; rastport
X           move.l d4,d1  ; starting row
X           moveq.l #40,d0 ; starting column
X         jsr _LVOMove(a6) ; locate pen
X           movea.l rastport(pc),a1 ; rastport
X           move.b (a3)+,d0 ; get color
X           andi.l #7,d0 ; make sure color valid 
X         jsr _LVOSetAPen(a6) ; set color
X           movea.l rastport(pc),a1 ; rastport
X           movea.l a3,a0 ; text location
X           move.l d2,d0  ; length of line
X         jsr _LVOText(a6) ; print line
X         adda.l d2,a3 ; next line
X         addi.l #8,d4 ; next row 
Xstartprint: dbf d3,myprint      
X     bsr waitformessage ; wait for key press
X     movea.l GraphicsBase(pc),a6 ; graphics library address in a6
X       movea.l rastport(pc),a1
X       moveq.l #0,d0
X     jsr _LVOSetRast(a6) ; clear screen
X    rts
Xmytext: ; initial number represents color
X  dc.b 2,'                              '
X  dc.b 2,'         BlitterSand          '
X  dc.b 2,'                              '
X  dc.b 6,'             by               '
X  dc.b 2,'                              '
X  dc.b 5,'        Michael Creutz        '
X  dc.b 6,'     creutz@bnlux0.bnl.gov    '
X  dc.b 5,'                              '
X  dc.b 5,'<esc>, q  exit                '
X  dc.b 5,'  p       pause               '
X  dc.b 5,'  d       double modulo 8     '
X  dc.b 5,'  a       pause after relax   '
X  dc.b 1,'                              '
X  dc.b 1,'    Press any key to start    '
X  dc.b 2,'                              '
X   end
END_OF_FILE
if test 29043 -ne `wc -c <'BlitterSand.asm'`; then
    echo shar: \"'BlitterSand.asm'\" unpacked with wrong size!
fi
chmod +x 'BlitterSand.asm'
# end of 'BlitterSand.asm'
fi
if test -f 'BlitterSand.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'BlitterSand.uu'\"
else
echo shar: Extracting \"'BlitterSand.uu'\" \(4689 characters\)
sed "s/^X//" >'BlitterSand.uu' <<'END_OF_FILE'
Xbegin 700 BlitterSand
XM```#\P`````````!``````````````,5```#Z0```Q5(YS\^+'@`!$*Y```#E
XMPI/)3J[^VBA`2JP`K&8``!1![`!<3J[^@$ZN_HPCP````\)#^@.<<`!.KOW8$
XM(\````/&2H!G,D/Z`YEP`$ZN_=@CP````\I*@&<280``-B)Y```#RBQX``1.1
XMKOYB(GD```/&3J[^8G``2KD```/"9PQ.KO]\(GH#/DZN_H9,WWS\3G4CSP``E
XM!%)T!T7Z`YA@&"`\```=8"(\``$``DZN_SI*@&<``@`DP%'*_^8L>@,.0?H"=
XMRDZN_SHCP````WAG``'D0?H"B$ZN_S0CP```!!IG``'*($`CZ`!6```$(B!H_
XM`#(CR```!!X@:``$(^@`"```!"8CZ``,```$*B/H`!````0N!KD```&Z```$8
XM)@:Y```!N@``!"H&N0```;H```0N+'H"E"!Z`D+1_````"Q#^@)R<`A.KO]`Q
XM80`(R")Z`M!P`4ZN_JHB>@+&<`!.KOZ>(GH"O#`\`!`R/``+3J[_$"!Z`JPPR
XM/`$O,CP`"TZN_PH@>@*<,#P!+S(\`,9.KO\*('H"C#`\`!`R/`#&3J[_"B!ZN
XM`GPP/``0,CP`"TZN_PHB>@)L<`).KOZJ(GH"8C`\`!`R/``+3J[^O")Z`E(PC
XM/`$O,CP`"TZN_KPB>@)",#P!+S(\`,9.KOZ\(GH",C`\`!`R/`#&3J[^O&$`8
XM`-Q!^@(^0_H"(F$`!08(.@`%`D!F$D'Z`A)#^@(F80`%>&$`!&!@UD'Z`@!#R
XM^@(<80`%9D'Z`@QA``7.8!AA``(:"#H`!0(,9PQ!^@'^0_H!VF$`!NQA``7F/
XM"#H`!0'T9@9A``"D8-9A``!R0?H!O$/Z`=!A``4B80`$"F$``%Y!^@'`0_H!L
XMI&$`!K9A``!.0?H!N$/Z`91A``:F80``/F#N('H!>BQZ`29.KO^X('H`S$ZNG
XM_[XL>``$=`=%^@%X8!`@/```'6`B6B()9PA.KO\N4<K_[BYZ`7Y.=6$``7P(X
XM.@`%`6YF!F$``!Y@[DIY```$4&<$80``!$YU+'@`!"!Z`21.KOZ`+'@`!"!ZT
XM`1A.KOZ,2H!F`DYU(D`D*0`4-BD`&$ZN_H8,0P`;;P#_=`Q#`'%G`/]L#$,`[
XM<&8(('H`YDZN_H`,0P!D9@1A``,V#$,`868&1GD```103G4``````4``R```*
XM`"``````&````````````````_$````````````````!0`#(``\``````4``%
XMR``#!08````/```#J@```_$`````````````!`X`"```#_\```\``/`/\``/[
XM#P\`_P```````````````&=R87!H:6-S+FQI8G)A<GD`:6YT=6ET:6]N+FQIW
XM8G)A<GD`0FQI='1E<E-A;F0@+2T@/&5S8SX@=&\@97AI=`!T;W!A>BYF;VYT[
XM`````````````````````````````````````````````````````````````
XM```````````````````````L>O]N3J[^.$OY`-_P`"0Z_\`F.O_`*#K_P"HZ9
XM_\`L.O_`+CK_P$ZN_QPK10!4(`0K0`!0!H`````H*T``3`2`````4"M``$@[L
XM?````$([?!^6`$`[?``$`&0[?``$`&([?``$`&`[?``$`&8[?/__`$0[?/_^/
XM`$8[?"\2`%A.KO\<*T8`5"`$*T``4`:`````*"M``$P$@````%`K0`!(.WP?3
XMZ`!`.WPO$@!83J[_'"`$!H```!U:*T``4"`'!H```!U:*T``5"`%!H```!U:P
XM*T``3"`&!H```!U:*T``2#M\``(`0CM\'X``0#M\?_\`1CM\+Q(`6$ZN_QP@@
XM!`:````=6BM``%`@!@:````=6BM``%0K0`!((`4&@```'5HK0`!,.WP?:@!`J
XM.WPO$@!83J[_'"`$!H```!U:*T``4"`%!H```!U:*T``5"M``$P[?!T\`$`[F
XM?"\2`%A.KO\<*T0`5"M#`%`K1@!,*T<`2#M\````0CM\#^H`0#M\__\`1CM\_
XM+Q(`6$ZN_QPK0P!4*T,`4"M&`$P[?`T\`$`[?"\2`%A.KO\<*T<`5"M"`%`K"
XM0P!,*T4`2#M\#X``0#M\+Q(`6$ZN_QPK0P!4*T(`4"M%`$PK0P!(.WP/:@!`5
XM.WPO$@!83J[_'"M$`%0K1`!0*T<`3#M\#?P`0#M\+Q(`6$ZN_QPS[0`"```$T
XM3BM"`%0K0@!0*T4`3#M\#3P`0#M\+Q(`6$ZN_C).=2QZ_41.KOXX2_D`W_``S
XM)#K]EB8Z_98H.OV63J[_'"M$`%0K0P!0.WP```!".WP)\`!`.WP`!`!D.WP`P
XM!`!B.WP`!`!@.WP`!`!F.WS__P!$.WS__P!&.WPO$@!83J[_'"M#`%0K0@!0\
XM.WP)\`!`.WPO$@!83J[_'"M"`%0[?`$``$`[?"\2`%A.KOXR3G4L>ORV2_D`K
XMW_``)!@F$"@9*A%.KOXX3J[_'"M"`%`K1`!,.WP```!".WP,/`!`.WP`!`!D5
XM.WP`!`!B.WS__P!$.WS__P!&.WPO$@!83J[_'#/M``(```1.*T,`4"M%`$P[A
XM?````$([?`P\`$`[?"\2`%A.KO\<,"T``L%Y```$3DZN_C).=2QZ_#!+^0#?S
XM\``D&"80*!DJ$4ZN_CA.KO\<*T(`4"M$`%0[?````$([?`GP`$`[?``$`&0[J
XM?``$`&8[?/__`$0[?/__`$8[?"\2`%A.KO\<*T,`4"M%`%0[?````$([?`GPL
XM`$`[?"\2`%A.KOXR3G4L>OO`2_D`W_``)!!.KOXX3J[_'"M"`%0[?````$([E
XM?`'_`$`[?``$`&8[?"\2`%A.KOXR3G4L>ON*3J[^.$OY`-_P`"0Z^]PF.OO<X
XM*CK[X"PZ^^`N.OOD3J[_'"M%`%0K0@!0*T,`3"M'`$@[?````$([?`]8`$`[E
XM?``$`&0[?``$`&([?``$`&`[?``$`&8[?/__`$0[?/__`$8[?"\2`%A.KO\<8
XM*T8`5"M"`%`K0P!,*T<`2#M\````0CM\#\0`0#M\+Q(`6$ZN_QPK1P!4*T(`3
XM4"M#`$PK1P!(.WP```!".WP/`@!`.WPO$@!83J[_'#/M``(```1.*T4`4"M"-
XM`%0[?````$([?`GP`$`[?"\2`%A.KO\<*T8`4"M#`%0[?````$([?`GP`$`[+
XM?"\2`%A.KOXR3G4L>OJ(2_D`W_``)!DF&2@1*A@L$$ZN_C@N.OKD3J[_'"M'S
XM`%0K0@!0*T4`3#M\````0CM\#<``0#M\``0`9#M\``0`8CM\``0`8#M\``0`<
XM9CM\__\`1#M\__\`1CM\+Q(`6$ZN_QPK0@!4*T(`4"M%`$P[?````$([?`T\T
XM`$`[?"\2`%A.KO\<*T0`5"M#`%`K1@!,*T<`2#M\````0CM\#^@`0#M\+Q(`^
XM6$ZN_QPK0P!4*T,`4"M&`$PK1P!(.WP```!".WP/E@!`.WPO$@!83J[^,DYUZ
XM=!YV#W@9+'KYK$?Z`&(B>OG\<`=.KOZD(GKY\G`!3J[^GF```#(B>OGD(@1PM
XM*$ZN_Q`B>OG8$!L"@`````=.KOZJ(GKYR"!+(`).KO_$U\(&A`````A1R__.U
XM80#XBBQZ^50B>OFH<`!.KO\63G4"("`@("`@("`@("`@("`@("`@("`@("`@9
XM("`@("`@`B`@("`@("`@($)L:71T97)386YD("`@("`@("`@(`(@("`@("`@@
XM("`@("`@("`@("`@("`@("`@("`@("`&("`@("`@("`@("`@(&)Y("`@("`@A
XM("`@("`@("`@`B`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(`4@("`@G
XM("`@($UI8VAA96P@0W)E=71Z("`@("`@("`&("`@("!C<F5U='I`8FYL=7@PL
XM+F)N;"YG;W8@("`@!2`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(`4\J
XM97-C/BP@<2`@97AI="`@("`@("`@("`@("`@("`%("!P("`@("`@('!A=7-EC
XM("`@("`@("`@("`@("`@!2`@9"`@("`@("!D;W5B;&4@;6]D=6QO(#@@("`@L
XM(`4@(&$@("`@("`@<&%U<V4@869T97(@<F5L87@@("`!("`@("`@("`@("`@3
XM("`@("`@("`@("`@("`@("`@`2`@("!0<F5S<R!A;GD@:V5Y('1O('-T87)TP
XM("`@(`(@("`@("`@("`@("`@("`@("`@("`@("`@("`@("``3G$```/L````P
XM'``````````*````+````#P```!0````7@```&P```!X````D@```,@```#:4
XM````Z````/(```#^```!!@```0X```$8```!(@```2P```+L```#5````W0`3
XC``.:```#G@```ZH```9>```'8@``!XH```CZ`````````_+LL
X``
Xend
Xsize 3320
END_OF_FILE
if test 4689 -ne `wc -c <'BlitterSand.uu'`; then
    echo shar: \"'BlitterSand.uu'\" unpacked with wrong size!
fi
# end of 'BlitterSand.uu'
fi
echo shar: End of archive 1 \(of 1\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have the archive.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
Mail comments to the moderator at <amiga-request@uunet.uu.net>.
Post requests for sources, and general discussion to comp.sys.amiga.