|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 18432 (0x4800) Types: Ada Source Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Mch_Main, seg_005386
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000 └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« └─⟦this⟧
with Calendar; with Text_Io; with Xlbt_Arithmetic; use Xlbt_Arithmetic; with Xlbt_Atom_Defs; use Xlbt_Atom_Defs; with Xlbt_Basic; use Xlbt_Basic; with Xlbt_Event; use Xlbt_Event; with Xlbt_Gc; use Xlbt_Gc; with Xlbt_Geometry; use Xlbt_Geometry; with Xlbt_Graphics; use Xlbt_Graphics; with Xlbt_Pointer; use Xlbt_Pointer; with Xlbt_String; use Xlbt_String; with Xlbt_Window; use Xlbt_Window; with Xlbp_Display; use Xlbp_Display; with Xlbp_Event; use Xlbp_Event; with Xlbp_Gc; use Xlbp_Gc; with Xlbp_Geometry; use Xlbp_Geometry; with Xlbp_Graphics; use Xlbp_Graphics; with Xlbp_Sync; use Xlbp_Sync; with Xlbp_Window; use Xlbp_Window; with Xlbp_Window_Property; use Xlbp_Window_Property; package body Mch_Main is ------------------------------------------------------------------------------ -- Originally: muncher.c ------------------------------------------------------------------------------ -- static char *rcsid = "$Header: muncher.c,v 1.5 88/02/09 13:16:48 jim Exp $"; ------------------------------------------------------------------------------ -- Description: -- The famous munching squares. -- -- Brought to you by Jef Poskanzer. -- -- Copyright (C) 1987 by UniSoft Systems. Permission to use, copy, -- modify, and distribute this software and its documentation for any -- purpose and without fee is hereby granted, provided that this copyright -- notice appear in all copies and in all supporting documentation. No -- representation is made about the suitability of this software for any -- purpose. It is provided "as is" without express or implied warranty. -- -- Arguments: -- -r display on root window instead of creating a new one -- -s seed use this for the seed -- =wxh+x+y X geometry for new window (default 256x256 centered) -- host:display X display on which to run ------------------------------------------------------------------------------ ----Some good seeds - if the user does not specify one, one of these gets -- chosen randomly. Seeds : constant S_Long_Array := (0 => 16#00000001#, 1 => 16#00000002#, 2 => 16#00000101#, 3 => 16#00000666#, 4 => 16#11111111#, 5 => 16#12121212#, 6 => 16#12491249#, 7 => 16#22222222#, 8 => 16#33333333#, 9 => 16#00004001#, 10 => 16#04444444#, 11 => 16#12525252#, 12 => 16#15555555#, 13 => 16#00006666#, 14 => 16#00008001#, 15 => 16#00008010#, 16 => 54321); Seedsi : S_Natural := 16; procedure Main (Display : X_String := ""; Geometry : X_String := ""; Use_Root : Boolean := False; Muncher_Seed : S_Long := 0; Verbose_Mode : Boolean := False) is Seed : S_Long := Muncher_Seed; Win : X_Window; Winx : S_Short; Winy : S_Short; Winw : U_Short; Winh : U_Short; Xswa : X_Set_Window_Attributes; Dpy : X_Display; Scr : X_Screen; Gc : X_Gc; Xev : X_Event; Batch_Size : constant := 400; Points : X_Point_Array (0 .. Batch_Size - 1); Size : S_Long; N : Natural; Nmask : S_Long; Acc : S_Long; X : S_Short; Y : S_Short; Xoffset : S_Short; Yoffset : S_Short; Env : constant X_String := X_Display_Name (Display); Error : X_Error_String; begin X_Open_Display (Env, Dpy, Error); if "=" (Dpy, None_X_Display) then Text_Io.Put_Line ("Cannot open display: " & To_String (Err (Error))); raise Program_Error; end if; Scr := X_Default_Screen_Of_Display (Dpy); ----Set up window parameters, create and map window if necessary: if Use_Root then Win := X_Default_Root_Window (Dpy); Winx := 0; Winy := 0; Winw := X_Display_Width (Dpy, X_Default_Screen (Dpy)); Winh := X_Display_Height (Dpy, X_Default_Screen (Dpy)); else Winw := 256; Winh := 256; Winx := (S_Short (X_Width_Of_Screen (Scr)) - S_Short (Winw)) / 2; Winy := (S_Short (X_Height_Of_Screen (Scr)) - S_Short (Winh)) / 2; if Geometry /= "" then declare Flags : X_Parse_Geometry_Flags; begin X_Parse_Geometry (Geometry, Winx, Winy, Winw, Winh, Flags); if Flags (X_Negative) then Winx := S_Short (X_Display_Width (Dpy, X_Default_Screen (Dpy))) - Winx - S_Short (Winw); end if; if Flags (Y_Negative) then Winy := S_Short (X_Display_Height (Dpy, X_Default_Screen (Dpy))) - Winy - S_Short (Winh); end if; end; end if; Xswa.Event_Mask := X_Event_Mask'(Button_Press_Mask | Exposure_Mask | Structure_Notify_Mask => True, others => False); Xswa.Background_Pixel := X_Black_Pixel_Of_Screen (Scr); Win := X_Create_Window (Dpy, X_Root_Window_Of_Screen (Scr), Winx, Winy, Winw, Winh, 0, X_Default_Depth_Of_Screen (Scr), Input_Output, X_Default_Visual_Of_Screen (Scr), (Cw_Event_Mask | Cw_Back_Pixel => True, others => False), Xswa); X_Set_Text_Property (Dpy, Win, "Muncher", Xa_Wm_Name); X_Map_Window (Dpy, Win); end if; ----Set up a graphics context: Gc := X_Create_Gc (Dpy, Win.Drawable, None_X_Gc_Components, None_X_Gc_Values); X_Set_Foreground (Dpy, Gc, X_White_Pixel_Of_Screen (Scr) xor X_Black_Pixel_Of_Screen (Scr)); X_Set_Function (Dpy, Gc, Gx_Xor); -- X_Set_Foreground (Dpy, Gc, X_White_Pixel_Of_Screen (Scr)); -- X_Set_Function (Dpy, Gc, Gx_Invert); -- X_Set_Function(dpy, gc, GX_copy); ----Initialize munch algorithm. if Seed = 0 then Seedsi := S_Long (Calendar.Seconds (Calendar.Clock)) rem Seeds'Length; Seed := Seeds (Seedsi); end if; <<New_Width_Height>> null; if Winw > Winh then Size := S_Long (Winw); else Size := S_Long (Winh); end if; if Size <= 0 then Size := 1; end if; N := 30; Nmask := 16#40000000#; loop if (Size and Nmask) /= 0 then exit; end if; if N = 0 then exit; end if; N := N - 1; Nmask := Nmask / 2; end loop; Nmask := Shift (S_Long (1), N); if Nmask < Size then Nmask := Nmask * 2; end if; Size := Nmask; Nmask := Nmask - 1; Xoffset := (S_Short (Winw) - S_Short (Size)) / 2; Yoffset := (S_Short (Winh) - S_Short (Size)) / 2; if Verbose_Mode then Text_Io.Put ("size := "); S_Long_Io.Put (Size); Text_Io.Put (", seed := "); S_Long_Io.Put (Seed, Base => 16, Width => 0); Text_Io.New_Line; end if; Acc := 0; ----Loop forever computing and drawing batches of points. X_Clear_Window (Dpy, Win); loop if X_Pending (Dpy) /= 0 then X_Next_Event (Dpy, Xev); if Xev.Kind = Configure_Notify then if Winw /= Xev.Configure.Width or else Winh /= Xev.Configure.Height then Winw := Xev.Configure.Width; Winh := Xev.Configure.Height; goto New_Width_Height; end if; elsif Xev.Kind = Expose then while Xev.Expose.Count /= 0 loop X_Next_Event (Dpy, Xev); end loop; X_Clear_Window (Dpy, Win); elsif Xev.Kind = Button_Press then if Xev.Button.Button = Button_2 then exit; elsif Xev.Button.Button = Button_3 then Seedsi := (Seedsi + 1) rem Seeds'Length; Seed := Seeds (Seedsi); if Verbose_Mode then Text_Io.Put ("size := "); S_Long_Io.Put (Size); Text_Io.Put (", seed := "); S_Long_Io.Put (Seed, Base => 16, Width => 0); Text_Io.New_Line; end if; X_Clear_Window (Dpy, Win); end if; end if; end if; for I in S_Natural range 0 .. Batch_Size - 1 loop X := S_Short (Acc and Nmask); Y := S_Short ((Shift (Acc, -Integer (N)) and Nmask) xor S_Long (X)); Points (I).X := X + Xoffset; Points (I).Y := Y + Yoffset; Acc := (Acc + Seed) and 16#3FFFFFFF#; end loop; X_Draw_Points (Dpy, Win.Drawable, Gc, Points, Coord_Mode_Origin); -- X_Sync (Dpy, Discard => False); end loop; X_Close_Display (Dpy); end Main; end Mch_Main;
nblk1=11 nid=10 hdr6=20 [0x00] rec0=2e rec1=00 rec2=01 rec3=04e [0x01] rec0=14 rec1=00 rec2=02 rec3=02a [0x02] rec0=12 rec1=00 rec2=03 rec3=042 [0x03] rec0=18 rec1=00 rec2=11 rec3=00a [0x04] rec0=03 rec1=00 rec2=04 rec3=02a [0x05] rec0=20 rec1=00 rec2=05 rec3=006 [0x06] rec0=01 rec1=00 rec2=0f rec3=01a [0x07] rec0=14 rec1=00 rec2=06 rec3=014 [0x08] rec0=15 rec1=00 rec2=07 rec3=04a [0x09] rec0=1a rec1=00 rec2=08 rec3=03e [0x0a] rec0=00 rec1=00 rec2=0e rec3=004 [0x0b] rec0=1e rec1=00 rec2=09 rec3=03e [0x0c] rec0=01 rec1=00 rec2=0d rec3=014 [0x0d] rec0=1b rec1=00 rec2=0a rec3=03e [0x0e] rec0=17 rec1=00 rec2=0b rec3=036 [0x0f] rec0=0e rec1=00 rec2=0c rec3=000 [0x10] rec0=00 rec1=00 rec2=00 rec3=000 tail 0x2170089288197893460df 0x42a00088462063203 Free Block Chain: 0x10: 0000 00 00 00 77 80 19 20 28 30 20 2e 2e 20 42 61 74 ┆ w (0 .. Bat┆