home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Global Amiga Experience
/
globalamigaexperience.iso
/
compressed
/
development
/
clusterdemo.dms
/
clusterdemo.adf
/
Modules.lha
/
work
/
txt
/
ApfelDemo.mod
next >
Wrap
Text File
|
1980-01-07
|
7KB
|
275 lines
|##########|
|#MAGIC #|HAHEAMHI
|#PROJECT #|"ApfelDemo"
|#PATHS #|"StdProject"
|#FLAGS #|xx---x--x---x-x-----------------
|#USERSW #|--------------------------------
|#USERMASK#|--------------------------------
|#SWITCHES#|xx---x----------
|##########|
MODULE ApfelDemo;
$$StackChk:=FALSE;
FROM System IMPORT LONGSET,BITSET,Regs;
FROM Intuition IMPORT ScreenPtr,NewScreen,OpenScreen,CloseScreen,
customScreen,ScreenToBack,ModifyIDCMP,
ScreenToFront,ActivateWindow,WBenchToFront,
WindowPtr,NewWindow,OpenWindow,CloseWindow,
WindowFlags,WindowFlagSet,IDCMPFlags,IDCMPFlagSet,
IntuiMessagePtr;
FROM Input IMPORT Qualifiers,lButton,rButton;
FROM Graphics IMPORT SetRGB4,SetRast,RastPortPtr,OwnBlitter,DisownBlitter,
WaitBlit,WaitTOF,ViewPortPtr,WaitBOVP,
ViewModes,ViewModeSet,Text,Move,
SetAPen,SetDrMd,DrawModeSet;
FROM T_Exec IMPORT GetMsg,ReplyMsg,MessagePtr,TaskPtr,CreateTask,
SetSignal,Signal,Wait,FindTask,DeleteTask,TaskSigSet,
TaskSignals;
VAR
MyScreen : ScreenPtr;
MyWindow : ARRAY [0..3] OF WindowPtr;
VAR
MyNewScreen := NewScreen:(leftEdge=0,topEdge=0,width=320,height=256,
depth=4,detailPen=1,blockPen=3,
viewModes=ViewModeSet:{},
type=customScreen,
font=NIL,defaultTitle=NIL,gadgets=NIL,
customBitMap=NIL);
MyNewWindow := NewWindow:(width=160,height=128,
detailPen=1,blockPen=2,
idcmpFlags=IDCMPFlagSet:{},
flags=WindowFlagSet:{borderless},
firstGadget=NIL,checkMark=NIL,title=NIL,
screen=NIL,bitMap=NIL,type=customScreen);
TYPE
NameType = ARRAY [0..3] OF CLASSPTR TO STRING;
CONST
Names = NameType:("LONGREAL"'PTR,"REAL=FFP"'PTR,
"INTEGER"'PTR,"NONE"'PTR);
PROCEDURE OpenAll;
VAR i,j,k : INTEGER;
BEGIN
MyScreen:=OpenScreen(MyNewScreen);
IF MyScreen=NIL THEN
HALT(1002);
END;
MyNewWindow.screen:=MyScreen;
FOR i:=0 TO 3 DO
MyNewWindow.leftEdge:=(i MOD 2)*160;
MyNewWindow.topEdge:=(i DIV 2)*128;
MyWindow[i]:=OpenWindow(MyNewWindow);
IF MyWindow[i]=NIL THEN
HALT(1010+i);
END;
SetRast(MyWindow[i]^.rPort,8+i*2);
SetDrMd(MyWindow[i]^.rPort,DrawModeSet:{});
FOR k:=0 TO 127 BY 24 DO
FOR j:=0 TO 15 DO
Move(MyWindow[i]^.rPort,k+15-j,k+j);
SetAPen(MyWindow[i]^.rPort,j);
Text(MyWindow[i]^.rPort,Names[i].data'PTR,Names[i].len);
END;
END;
END;
FOR i:=0 TO 15 DO
SetRGB4(MyScreen^.viewPort'PTR,i,0,i,i);
END;
END OpenAll;
(* $W- $E- $L- *)
PROCEDURE WritePixel(x IN 2,y IN 3,c IN 4 : INTEGER);
VAR i IN 1 : INTEGER;
disp IN 5 : LONGINT;
TYPE BitPtr = POINTER TO BITSET;
BEGIN
disp:=LMUL(y,40)+(x DIV 16)*2;x:=15-(x MOD 16);
FOR i:=3 TO 0 BY -1 DO
IF i IN CAST(BITSET,c) THEN
INCL(BitPtr(MyScreen^.bitMap.planes[i]+disp)^,x);
ELSE
EXCL(BitPtr(MyScreen^.bitMap.planes[i]+disp)^,x);
END
END
END WritePixel;
CONST
xStart = -2.;
yStart = -1.4;
delta = 3.5/160.;
limes = 4.;
maxDepth = 64;
VAR
Ready : ARRAY [0..3] OF BOOLEAN;
Tasks : ARRAY [0..3] OF TaskPtr;
HomeTask : TaskPtr;
SDummy : TaskSigSet;
letsBreak : BOOLEAN;
PROCEDURE CalcApfel0;
VAR xm,ym,
xc,yc,
xx,yy : LONGREAL;
xi,yi,
depth : INTEGER;
dummy : LONGSET;
BEGIN
xc:=xStart;
FOR xi:=0 TO 159 DO
yc:=yStart;
FOR yi:=0 TO 127 DO
xm:=xc;ym:=yc;
depth:=0;
REPEAT
xx:=xm*xm;yy:=ym*ym;
ym:=2.*xm*ym+yc;
xm:=xx-yy+xc;
INC(depth);
UNTIL (depth=maxDepth) OR (xx+yy>limes);
WritePixel(xi,yi,depth);
yc:=yc+delta;
END;
xc:=xc+delta;
IF letsBreak THEN xi:=159 END;
END;
Ready[0]:=TRUE;
Signal(HomeTask,CAST(TaskSigSet,LONGSET:{20}));
END CalcApfel0;
PROCEDURE CalcApfel1;
VAR xc,yc : FFP;
xi,yi,
depth : INTEGER;
BEGIN
xc:=xStart;
FOR xi:=160 TO 319 DO
yc:=yStart;
FOR yi:=0 TO 127 DO
(* $W- *)
WITH FFP AS xm,
FFP AS ym,
FFP AS xx,
FFP AS yy,
depth DO
xm:=xc;ym:=yc;
depth:=0;
REPEAT
xx:=xm*xm;yy:=ym*ym;
ym:=2.*xm*ym+yc;
xm:=xx-yy+xc;
INC(depth);
UNTIL (depth=maxDepth) OR (xx+yy>limes);
END;
WritePixel(xi,yi,depth);
yc:=yc+delta;
END;
IF letsBreak THEN xi:=319 END;
xc:=xc+delta
END;
Ready[1]:=TRUE;
Signal(HomeTask,CAST(TaskSigSet,LONGSET:{20}));
END CalcApfel1;
CONST
xStartI = -16384;
yStartI = -11468;
deltaI = 179;
limesI = 268435456;
PROCEDURE CalcApfel2;
VAR xc,yc : INTEGER;
xi,yi,
depth : INTEGER;
BEGIN
xc:=xStartI;
FOR xi:=0 TO 159 DO
yc:=yStartI;
FOR yi:=128 TO 255 DO
(* $W- *)
WITH INTEGER AS xm,
INTEGER AS ym,
LONGINT AS xx,
LONGINT AS yy,xc,yc,
depth DO
xm:=xc;ym:=yc;
depth:=0;
REPEAT
xx:=LMUL(xm,xm);yy:=LMUL(ym,ym);
ym:=INTEGER(LMUL(xm,ym) SHR 12) +yc;
xm:=INTEGER((xx-yy) SHR 13) + xc;
INC(depth);
UNTIL (depth=maxDepth) OR (xx+yy>limesI);
END;
WritePixel(xi,yi,depth);
yc:=yc+deltaI
END;
IF letsBreak THEN xi:=159 END;
xc:=xc+deltaI;
END;
Ready[2]:=TRUE;
Signal(HomeTask,CAST(TaskSigSet,LONGSET:{20}));
END CalcApfel2;
PROCEDURE CalcApfel3;
VAR xc,yc : INTEGER;
xo,yo : INTEGER;
xi,yi,
depth : INTEGER;
BEGIN
FOR xi:=160 TO 319 DO
FOR yi:=128 TO 255 DO
WritePixel(xi,yi,xi+yi);
END;
IF letsBreak THEN xi:=319 END;
END;
Ready[3]:=TRUE;
Signal(HomeTask,CAST(TaskSigSet,LONGSET:{20}));
END CalcApfel3;
BEGIN
MyScreen:=NIL;
OpenAll;
Ready[0]:=FALSE;
Ready[1]:=FALSE;
Ready[2]:=FALSE;
Ready[3]:=FALSE;
HomeTask:=FindTask(NIL);
HomeTask^.sigExcept:=CAST(TaskSigSet,LONGSET:{});
Tasks[0]:=NIL;
Tasks[1]:=NIL;
Tasks[2]:=NIL;
Tasks[3]:=NIL;
letsBreak:=FALSE;
Tasks[0]:=CreateTask("Apfel0",-1,CalcApfel0,4000);Ready[0]:=FALSE;
Tasks[1]:=CreateTask("Apfel1",-1,CalcApfel1,4000);Ready[1]:=FALSE;
Tasks[2]:=CreateTask("Apfel2",-1,CalcApfel2,4000);Ready[2]:=FALSE;
Tasks[3]:=CreateTask("Apfel3",-1,CalcApfel3,4000);Ready[3]:=FALSE;
REPEAT
FORGET SetSignal(CAST(TaskSigSet,LONGSET:{}),CAST(TaskSigSet,LONGSET:{12,20}));
SDummy:=Wait(CAST(TaskSigSet,LONGSET:{12,20}));
IF TaskSignals(12) IN SDummy THEN letsBreak:=TRUE END;
UNTIL Ready[0] AND Ready[1] AND Ready[2] AND Ready[3];
CLOSE
IF MyScreen#NIL THEN
IF MyWindow[0]#NIL THEN CloseWindow(MyWindow[0]) END;
IF MyWindow[1]#NIL THEN CloseWindow(MyWindow[1]) END;
IF MyWindow[2]#NIL THEN CloseWindow(MyWindow[2]) END;
IF MyWindow[3]#NIL THEN CloseWindow(MyWindow[3]) END;
FORGET CloseScreen(MyScreen)
END;
END ApfelDemo.