ewhac@well.UUCP (Leo 'Bols Ewhac' Schwab) (07/02/86)
[ Deletion of this line is a violation of Federal Law ] Here's something to watch when you're bored. I watched it for about five minutes, and it occurred to me that this may give some people headaches. I therefore disclaim any and all responsibility for minds lost or stolen. Putting this program together is rather icky, so be patient; it really does do something interesting. Remember, this is only a crock. Schwab Display Hacks, Inc. @*S^i$(^!)U&#)(&@#(*^!^%@&U@* It slices, it dices... *S!&o%@(@)*!)T&!)(&@! #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create: # nart.readme # nart.c # rnd.s # rotate.s # This archive created: Wed Jul 2 00:43:29 1986 # By: Leo 'Bols Ewhac' Schwab () export PATH; PATH=/bin:/usr/bin:$PATH if test -f 'nart.readme' then echo shar: "will not over-write existing file 'nart.readme'" else cat << \SHAR_EOF > 'nart.readme' How to make this beastie: Assumptions: source is in current directory, MetaComCo assembler is in df1:, Alink is in your C: directory. 1> df1:c/assem rnd.s -o rnd.o 1> df1:c/assem rotate.s -i df1:include -o rotate.o At this point, put your Lattice compiler in df1: 1> df1:c/lc1 -idf1:include/ nart 1> df1:c/lc2 -v nart ; -v really isn't necessary 1> alink df1:lib/astartup.obj+nart.o+rnd.o+rotate.o library df1:lib/amiga.lib+df1:lib/lc.lib to nart faster SYNOPSIS nart DESCRIPTION NART is the New Art program (if you have the Manx compiler with an examples directory, you have the old art program). It's a display hack that I finally got around to making "flow." May actually hold your interest for a few seconds. May give some people headaches. -------- I originally tried to write this under Manx, but it became non-trivial, so I didn't bother. Getting what I wanted to happen under Lattice was no picnic either. If you manage to coerce this to work under Manx, let me know. Yes, including lc.lib is necessary, but by trickery and deceit at the linking stage, I have managed to keep the code size down. _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ ________ ___ \ /___--__ Leo L. Schwab ___ ___ /\ ---##\ ihnp4!ptsfa!well!ewhac / X \_____ | __ _---)) ..or.. / /_\-- -----+==____\ // \ _ well ---\ ___ ( o---+------------------O/ \/ \ dual ----> !unicom!ewhac \ / ___ \_ (`o ) hplabs -/ ("AE-wack") ____ \___/ \_/ Recumbent Bikes: "Work FOR? I don't work FOR The _O_n_l_y Way To Fly! anybody! I'm just having fun." SHAR_EOF fi if test -f 'nart.c' then echo shar: "will not over-write existing file 'nart.c'" else cat << \SHAR_EOF > 'nart.c' /* :ts=8 bk=0 * In the tradition of stupid programs, Leo Schwab presents (yet again) * The Art Program. * * Modofied to do even neater things. * 8607.1 */ #include <exec/types.h> #include <graphics/gfxbase.h> #include <intuition/intuition.h> #define XSIZE 319 #define YSIZE 199 extern int rnd(); struct IntuitionBase *IntuitionBase; struct GfxBase *GfxBase; struct Screen *scr, *OpenScreen(); struct Window *win, *OpenWindow(); struct ViewPort *vp; struct NewScreen scrdef = { 0, 0, XSIZE+1, YSIZE+1, 4, /* 16 colors */ 0, 1, /* detail/block pens */ /* "Automatically" set up screen format */ ((XSIZE>320) ? HIRES : 0) | ((YSIZE>200) ? LACE : 0), CUSTOMSCREEN, NULL, NULL, NULL, NULL /* no special font, title, gadg, or bitmap */ }; struct NewWindow windef = { 0, 0, XSIZE+1, YSIZE+1, 0, 1, CLOSEWINDOW, WINDOWCLOSE | BACKDROP | BORDERLESS, NULL, NULL, NULL, /* no special gadget, checkmark or title */ NULL, /* screen pointer; will get set later */ NULL, /* no custom bitmap */ 0, 0, 0, 0, /* ignored */ CUSTOMSCREEN }; main () { register struct RastPort *rp; int i, dx1, dy1, dx2, dy2, pen = 16, flag = 0, xa1[150], ya1[150], xa2[150], ya2[150]; register int x1, y1, x2, y2; openstuff (); rnd (-87634); /* rp = win -> RPort; <-- This is slower because of layers */ rp = & (scr -> RastPort); SetDrMd (rp, COMPLEMENT); ShowTitle (scr, FALSE); SetRast (rp, 0); x1 = rnd (XSIZE+1); y1 = rnd (YSIZE+1); x2 = rnd (XSIZE+1); y2 = rnd (YSIZE+1); setdisp (&dx1, &dy1); setdisp (&dx2, &dy2); while (1) { for (i=0; i<150; i++) { rotate (); if (GetMsg (win -> UserPort)) { closestuff (); exit (TRUE); } if (rnd (12) == 3) if (rnd (2)) setdisp (&dx1, &dy1); else setdisp (&dx2, &dy2); x1 += dx1; y1 += dy1; if (x1 > XSIZE || x1 < 0) { dx1 = -dx1; x1 = x1<0 ? 0 : XSIZE; } if (y1 > YSIZE || y1 < 0) { dy1 = -dy1; y1 = y1<0 ? 0 : YSIZE; } x2 += dx2; y2 += dy2; if (x2 > XSIZE || x2 < 0) { dx2 = -dx2; x2 = x2<0 ? 0 : XSIZE; } if (y2 > YSIZE || y2 < 0) { dy2 = -dy2; y2 = y2<0 ? 0 : YSIZE; } if (!--pen) pen = 15; rp -> Mask = pen; /* kludge; COMPLEMENT does not */ Move (rp, x1, y1); /* perform as advertised */ Draw (rp, x2, y2); if (flag) { Move (rp, xa1[i], ya1[i]); Draw (rp, xa2[i], ya2[i]); } xa1[i] = x1; ya1[i] = y1; xa2[i] = x2; ya2[i] = y2; } flag = 1; } /* End of the while */ } openstuff () { if (!(IntuitionBase = (struct IntuitionBase *) OpenLibrary ("intuition.library", 1))) { printf ("Awright, where's Intuition?\n"); exit (FALSE); } if (!(GfxBase = (struct GfxBase *) OpenLibrary ("graphics.library", 1))) { printf ("Graphics? Heeeere graphics....\n"); exit (FALSE); } if (!(scr = OpenScreen (&scrdef))) { printf ("Can't open your screen.\n"); exit (FALSE); } windef.Screen = scr; if (!(win = OpenWindow (&windef))) { printf ("Window painted shut.\n"); exit (FALSE); } vp = &(scr -> ViewPort); setcolors (); } closestuff () { CloseWindow (win); CloseScreen (scr); CloseLibrary (GfxBase); CloseLibrary (IntuitionBase); } setdisp (x, y) register int *x, *y; { *x = rnd (9) - 4; *y = rnd (9) - 4; } /* What I really wanted was the HSL color wheel. Oh well.... */ setcolors () { int r, g, b, i; for (i=1; i<16; i++) { if (i <= 5) { r = (6-i) * 15 / 5; g = (i-1) * 15 / 5; b = 0; } else if (i > 5 && i <= 10) { r = 0; g = (11-i) * 15 / 5; b = (i-5) * 15 / 5; } else if (i > 10) { r = (i-10) * 15 / 5; g = 0; b = (16-i) * 15 / 5; } SetRGB4 (vp, i, r, g, b); } SetRGB4 (vp, 0, 0, 0, 0); } SHAR_EOF fi if test -f 'rnd.s' then echo shar: "will not over-write existing file 'rnd.s'" else cat << \SHAR_EOF > 'rnd.s' *\ * :ts=8 bk=0 * Yet Another random number generator. By Leo Schwab. * Based on an idea posted on the USENET (Thanks, Sam Dicker!) * For the MetaComCo assembler * * Calling convention: * long rnd (range); * long range; * * Assembling: * df1:c/assem rnd.s -o rnd.o * * 8606.30 */ section code xdef _rnd _rnd lea rndseed,a0 Get address of seed move.l 4(sp),d1 Get range argument tst.l d1 ble.s setseed Go reset seed move.l (a0),d0 Get seed ADD.L D0,D0 BHI.S over EORI.L #$1D872B41,D0 over move.l d0,(a0) Save new seed andi.l #$ffff,d0 Coerce into word andi.l #$ffff,d1 divu d1,d0 Divide by range swap d0 and get remainder (modulus) ext.l d0 rts setseed neg.l d1 Probably don't need this move.l d1,(a0) rts section data rndseed dc.l 0 SHAR_EOF fi if test -f 'rotate.s' then echo shar: "will not over-write existing file 'rotate.s'" else cat << \SHAR_EOF > 'rotate.s' *\ :ts=8 bk=0 * The color rotater for the New Art program. * This was written in machine code for speed (Lattice has this odd habit * of pessimizing code). * * Calling convention: * rotate (); * * Assembling: * df1:c/assem rotate.s -i df1:include -o rotate.o * * 8607.1 */ include "exec/types.i" include "exec/libraries.i" include "graphics/view.i" xlib macro xref _LVO\1 endm callsys macro CALLLIB _LVO\1 endm xdef _rotate xref _GfxBase xref _vp xlib LoadRGB4 rorg 0 _rotate movem.l a2-a3/a6,-(sp) movea.l _vp,a0 movea.l a0,a1 movea.l vp_ColorMap(a1),a1 movea.l cm_ColorTable(a1),a1 movea.l a1,a2 adda.w #1*2,a2 Point at the colors we want movea.l a2,a3 addq.w #2,a3 moveq #13,d0 move.w (a2),d1 loop move.w (a3)+,(a2)+ dbra d0,loop move.w d1,(a2) movea.l _GfxBase,a6 moveq #32,d0 callsys LoadRGB4 movem.l (sp)+,a2-a3/a6 rts end SHAR_EOF fi exit 0 # End of shell archive