{ ==============================================================
                      Program and Coding by
                  Peter Kusserow & Andre Wanzlik
                           in June 1990
  ============================================================== }

Program ShowMem152;

{$path "ram:include/","Pascal:include/";incl"intuition.lib","exec/memory.h"}

TYPE BorDatTyp = Array[1..10] of integer;  { Typ für Borderdata }

VAR  Win            : ^Window;
     Con            : ptr;
     c,f,g          : long;
     Msg            : ^IntuiMessage;
     basis,top,left : integer;
     AktGad         : ^Gadget;
     Gad1,Gad2,Gad3,Gad4,Gad5 : Gadget;
     Tex1,Tex2,Tex3,Tex4,Tex5 : IntuiText;
     Bor1,Bor2,Bor3,Bor4,Bor5 : Border;
     BDt1,BDt2,BDt3,BDt4,BDt5 : BorDatTyp;
{--------------------------------------------------------------}
PROCEDURE WriteInt(Con: ptr;i: Long;b,f: integer);
 VAR  s         : String[40];
      j,k,z,len : integer;
      i2        : Long;
 BEGIN
  b:=Basis;
  j:=40;
  s[40]:=chr(0);                     { Nullbyte am Ende }
  i2:=abs(i);
  REPEAT
    j:= j-1;
    z:= i2 mod Basis;                { letzte Ziffer von i2 }
    IF z<10 THEN
      s[j]:=chr(z+ord('0'))          { Ziffern 0 bis 10 }
    ELSE
      s[j]:=chr(z-10+ord('A'));      { Hexziffern A bis F }
    i2:= i2 DIV Basis;
  UNTIL i2=0;
  IF Basis=16 THEN
    BEGIN
      j:=j-1;s[j]:='$'               { Hex-Zahlen mit "$" }
    END;
  IF Basis=2 THEN
    BEGIN
      j:=j-1;s[j]:='%';              { Binär-Zahlen mit "%" }
    END;
  IF Basis=8 THEN
    BEGIN
      j:=j-1; s[j]:='&'              { Oktal-Zahlen mit "&" }
    END;
  len:=40-j;                         { Gesamtlänge der Zahl }
  FOR k:=1 TO f-len DO
    WriteCon(Con,' ');               { Am Anfang mit Blanks auffüllen }
  WriteCon(Con,Str(^s[j]))           { ab j-tem Zeichen ausgeben }
 END;
{--------------------------------------------------------------}
PROCEDURE Byebye;
  BEGIN
    CloseConsole(Con);
    RemoveGadgets(Win,^Gad1);RemoveGadgets(Win,^Gad2);
    RemoveGadgets(Win,^Gad3);RemoveGadgets(Win,^Gad4);
    RemoveGadgets(Win,^Gad5);Close_Window(Win);
    CloseLib(IntBase);DisposeAll;
  END;
{--------------------------------------------------------------}
PROCEDURE MakeGadget;
 BEGIN
   Gad1:=Gadget(^Gad2,         { nächste Gadget-Struktur: }
                15,15,48,9,    { Position & Größe = anklickbarer Bereich }
                GADGHCOMP,     { Gadget wird invertiert }
                RELVERIFY,     { Activation Flags }
                BOOLGADGET,    { Typ }
                ^Bor1,         { Zeiger auf Borderstruktur }
                Nil,           { kein Select-Border }
                ^Tex1,         { Zeiger auf Text }
                0, Nil, 1, 0); { Nummer 1 }
   Tex1:=IntuiText(1,0,0,10,1,Nil,'DEC',Nil);
   Bor1:=Border(0,0,3,0,0,5,^BDt1,Nil);
   BDt1:=BorDatTyp(-3,-2,50,-2,50,10,-3,10,-3,-2);

   Gad2:=Gadget(^Gad3,68,15,48,9,GADGHCOMP,RELVERIFY,
   BOOLGADGET,^Bor2,Nil,^Tex2,0,Nil,2,0); { Nummer 2 }
   Tex2:=IntuiText(1,0,0,10,1,Nil,'HEX',Nil);
   Bor2:=Border(0,0,3,0,0,5,^BDt2,Nil);
   BDt2:=BorDatTyp(-3,-2,50,-2,50,10,-3,10,-3,-2);

   Gad3:=Gadget(^Gad4,15,27,48,9,GADGHCOMP,RELVERIFY,
   BOOLGADGET,^Bor3,Nil,^Tex3,0,Nil,3,0);
   Tex3:=IntuiText(1,0,0,10,1,Nil,'BIN',Nil);
   Bor3:=Border(0,0,3,0,0,5,^BDt3,Nil);
   BDt3:=BorDatTyp(-3,-2,50,-2,50,10,-3,10,-3,-2);

   Gad4:=Gadget(^Gad5,68,27,48,9,GADGHCOMP,RELVERIFY,
   BOOLGADGET,^Bor4,Nil,^Tex4,0,Nil,4,0);
   Tex4:=IntuiText(1,0,0,10,1,Nil,'OCT',Nil);
   Bor4:=Border(0,0,3,0,0,5,^BDt4,Nil);
   BDt4:=BorDatTyp(-3,-2,50,-2,50,10,-3,10,-3,-2);

   Gad5:=Gadget(Nil,15,39,101,9,GADGHCOMP,RELVERIFY,
   BOOLGADGET,^Bor5,Nil,^Tex5,0,Nil,5,0);
   Tex5:=IntuiText(1,0,0,35,1,Nil,'INFO',Nil);
   Bor5:=Border(0,0,3,0,0,5,^BDt5,Nil);
   BDt5:=BorDatTyp(-3,-2,103,-2,103,10,-3,10,-3,-2);

   AddGadget(Win,^Gad1,Nil);  AddGadget(Win,^Gad2,Nil);
   AddGadget(Win,^Gad3,Nil);  AddGadget(Win,^Gad4,Nil);
   AddGadget(Win,^Gad5,Nil);

   RefreshGadgets(Win^.FirstGadget,Win,Nil);
 END;
{--------------------------------------------------------------}
PROCEDURE ClearWin;
 BEGIN
   WriteCon(Con,''\e'2;17H'\e'K');
   WriteCon(Con,''\e'3;17H'\e'K');
   WriteCon(Con,''\e'4;17H'\e'K');
 END;
{--------------------------------------------------------------}
PROCEDURE InfoWindow;
 BEGIN
   WriteCon(Con,''\e'2;16H   '\e'42m     Show-Mem (c) 1990     '\e'm    ');
   WriteCon(Con,''\e'3;16H   '\e'42;7m  P.Kusserow & A. Wanzlik  '\e'm    ');
   WriteCon(Con,''\e'4;16H   '\e'42m   written in KickPascal   '\e'm    ');
   Msg:=Wait_Port(Win^.UserPort);
   Msg:=Get_Msg(Win^.UserPort);
   IF Msg^.Class = MENUPICK THEN ClearWin;
   IF Msg^.Class = _CLOSEWINDOW THEN ClearWin;
 END;
{--------------------------------------------------------------}
PROCEDURE Fenster;
  BEGIN
    Win:=Open_Window(left,top,400,54,$0102,$300,$100E,
    '« SHOW-MEM 1.52 »',Nil,400,54,400,54);
    Con:=OpenConsole(Win);
  END;
{--------------------------------------------------------------}
PROCEDURE LittleFenster;
  BEGIN
    Win:=Open_Window(left,top,220,10,$0102,$300,$100E,
    '« SHOW-MEM 1.52 »',Nil,220,10,220,10)
  END;
{--------------------------------------------------------------}
PROCEDURE Refresh;
  BEGIN
    REPEAT
      c:=AvailMem(MEMF_CHIP);
      f:=AvailMem(MEMF_FAST);
      g:=f+c;
        WriteCon(Con,''\e'0 p');
        WriteCon(Con,''\e'2;16H ChipMem: ');
        WriteInt(Con,c,basis,8);
        WriteCon(Con,''\e'3;16H FastMem: ');
        WriteInt(Con,f,basis,8);
        WriteCon(Con,''\e'4;16H '\e'33mGesamt : '\e'm');
        WriteInt(Con,g,basis,8);
        Delay(5);
        AktGad:=Msg^.IAddress;
        IF (Gad1.Flags AND SELECTED)<>0 THEN
          BEGIN
            basis:=10;
            ClearWin;
          END;
        IF (Gad2.Flags AND SELECTED)<>0 THEN
          BEGIN
            basis:=16;
            ClearWin;
          END;
        IF (Gad3.Flags AND SELECTED)<>0 THEN
          BEGIN
            basis:=2;
            ClearWin;
          END;
        IF (Gad4.Flags AND SELECTED)<>0 THEN
          BEGIN
            basis:=8;
            ClearWin;
          END;
        IF (Gad5.Flags AND SELECTED)<>0 THEN InfoWindow;
  Msg:= Get_Msg(Win^.UserPort);
  IF Msg^.Class = MENUPICK THEN
    Begin
      top:=Win^.TopEdge;left:=Win^.LeftEdge;
      Close_Window(Win);
      CloseConsole(Con);
      LittleFenster;
      Msg:= Wait_Port(Win^.UserPort);
      Msg:= Get_Msg(Win^.UserPort);
      IF Msg^.Class = MENUPICK THEN
        top:=Win^.TopEdge;left:=Win^.LeftEdge;
        IF ((left > 240) or (top > 202)) THEN
          BEGIN
            Close_Window(Win);
            left:=240;top:=0;Fenster;MakeGadget;
          END
        ELSE IF ((left <= 240) or (top <= 202)) THEN
          BEGIN
            Close_Window(Win);
            Fenster;MakeGadget;
          END;
        END;
    UNTIL Msg^.Class = _CLOSEWINDOW
 END;
{--------------------------------------------------------------}
BEGIN             { Hauptprogramm }
  OpenLib(IntBase,'intuition.library',0);
   basis:=10;left:=240;top:=0;
    Fenster;
    MakeGadget;
   Refresh;
  Byebye;
END.


