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.