(*
    Program.    CopperMenu
    Contents.   Menu using Copper to easily select files by Mouse
    Version.    V2.0c
    Author.     Volker Oth
    Address.    Kopernikusstr.1, 6453 Seligenstadt
    Copyright.  none,let my name in - read MenuMaker.DOC
    Language.   Modula 2
    Translator  Benchmark Modula 2 V1.0
    History.    V1.0  [Volker Oth] 18/10/1989 first V1.0 (not released on PD)
                V2.0  [Volker Oth] 12/07/1990 very new V2.0 (not, either)
                V2.0c [Volker Oth] 06/10/1990 V2.0 using ColdCapture
    Imports.    SimpleScreens
                from Simplified Amiga Library V1.0 
*)

MODULE CopperMenu;

FROM SYSTEM IMPORT
        ADDRESS,BYTE,
        ADR, INLINE;
FROM IntHardware IMPORT
    INTSetClr, INTCoper;
FROM Interrupts IMPORT
    Interrupt,
    AddIntServer, RemIntServer;
FROM Nodes IMPORT
    NTInterrupt;
FROM CustomHardware IMPORT
        custom;
FROM Copper IMPORT
        UCopListPtr, UCopList,
        FreeCopList;
FROM CopperUtil IMPORT
        CEND, CINIT, CMOVE, CWAIT;
FROM Drawing IMPORT
        SetAPen, RectFill,Move;
FROM Intuition IMPORT
        ScreenPtr,
        CloseScreen, MakeScreen, RethinkDisplay;
FROM Rasters IMPORT
        RastPortPtr,ScrollRaster,DrawModeSet;
FROM SimpleScreens IMPORT
        CreateScreen;
FROM Views IMPORT
        ViewPortPtr,SetRGB4,ViewModesSet;
FROM Text IMPORT 
        Text;
FROM Memory IMPORT
        AllocMem,MemReqSet;

CONST 
      CopOffset     = -6;
      BeamOffset    = -1;
      StartOffset   = -2;
      BeamHeight    = 11;
      Height        = 10;
      CHeight       = 8;
      Broad         = 8;
      SmallBroad    = Broad-1;
      ScreenX       = 320;
      ScreenY       = 255;
      JoySensity    = 3;
      Terminator    = CHR(00);

VAR
  scr          : ScreenPtr;
  vp           : ViewPortPtr;
  rp           : RastPortPtr;
  uc           : UCopList;
  ucp          : UCopListPtr;
  key          : CHAR;
  number,items,chosen,titles,starti,olddat,i,StartGfxPos,ScrollCopPos,
  scrollpix,LeftScreen,ScrollBottom,CharX,CX,I,J,
  ScrollStep,ScrollOffset,scrollcolour,Up,Down,StartCopPos,ScrollGfxPos 
               : CARDINAL;
  bocol,bacol,icol,iscol,ccol,cscol,tscol,CardPtr
               : POINTER TO CARDINAL;
  int          : Interrupt;   
  long         : LONGINT ;
  charptr      : POINTER TO CHAR;   
  bit          : POINTER TO SET OF [0..7];
  joy          : POINTER TO BITSET;
  LeftButton   : BOOLEAN;
  Title        : POINTER TO ARRAY[1..3] ,[0..39] OF CHAR;
  Load         : POINTER TO ARRAY[1..20],[0..39] OF CHAR;
  Show         : POINTER TO ARRAY[1..20],[0..39] OF CHAR;
  ScrollText,CBeam,CTitle,cb,ce,AScrollP,BScrollP,CScrollP,c0,c1,c2
               : ADDRESS;
  p            : POINTER TO LONGCARD;            

(*$D-*)
PROCEDURE StringLength(s: ARRAY OF CHAR):CARDINAL;
VAR l : CARDINAL;
BEGIN
  l := 0;
  WHILE (s[l] # 0C) AND (l # 40) DO
    INC(l)
  END;
  RETURN(l);  
END StringLength;
(*$D+*)

PROCEDURE CopyBufferB(frombuffer:ADDRESS;tobuffer:ADDRESS;num:LONGCARD);
VAR count   : LONGCARD;
    fromptr,toptr : POINTER TO CHAR;
BEGIN
   count := 0D;
   fromptr := frombuffer;
   toptr   := tobuffer;
   LOOP
      toptr^ := fromptr^;
      INC(LONGCARD(fromptr));
      INC(LONGCARD(toptr));
      INC(count);
      IF count = num THEN EXIT;END;
   END; (* OF LOOP *)
END CopyBufferB;

PROCEDURE ColourDat;
BEGIN
  INLINE(02143H,04F4FH,05021H,04901H); (* !COOP!I1 *)
  INLINE(0000H,00000H,0FFFH,0777H,0FCCH,0D77H,0007H);
  (*
      BorderCol     = 1
      BackgroundCol = 2;
      ItemsCol      = 3;
      IShadowCol    = 4;
      ChoosenCol    = 5;
      CShadowCol    = 6;
      TShadowCol    = 7;
  *)
END ColourDat;

PROCEDURE CScrollDat;
BEGIN
  INLINE(02143H,04F4FH,05021H,04902H); (* !COOP!I2 *)
  INLINE(002EH); (* ColMax *)
  INLINE(0CE3H,0AE3H,08E3H,07E3H,05E3H,04E3H,03E4H,03E5H,03E7H,03E8H);
  INLINE(03EAH,03EBH,03ECH,03EEH,03DEH,03CEH,03AEH,039EH,037EH,034EH);
  INLINE(033EH,043EH,063EH,073EH,083EH,0A3EH,0B3EH,0C3EH,0E3EH,0E3DH);
  INLINE(0E3BH,0E3AH,0E39H,0E37H,0E36H,0E34H,0E33H,0E53H,0E63H,0E83H);
  INLINE(0E93H,0EA3H,0EB3H,0EC3H,0EE3H,0DE3H,0F00H,0000H,0000H,0000H);
  INLINE(0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H);
  INLINE(0000H,0000H,0000H,0000H); (* 46 of 64 Colours *)
END CScrollDat;

PROCEDURE CTitleDat;
BEGIN
  INLINE(02143H,04F4FH,05021H,04903H); (* !COOP!I3 *)
  INLINE(011FH,033FH,044FH,055FH,066FH,055FH,044FH,033FH);
END CTitleDat;
 
PROCEDURE CBeamDat;
BEGIN
  INLINE(02143H,04F4FH,05021H,04904H); (* !COOP!I4 *)
  INLINE(0500H,0700H,0900H,0B00H,0E00H,0F00H,0E00H,0B00H,0900H,0700H,0500H);
END CBeamDat; 

PROCEDURE TitleDat;
BEGIN
 INLINE(02143H,04F4FH,05021H,04905H); (* !COOP!I5 *)
 INLINE(07979H,05959H,0A2A2H,0A2A2H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 2ND LINE *)  
 INLINE(02A2AH,07979H,05959H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 3RD LINE *)
 INLINE(02A2AH,0A2A2H,07979H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
END TitleDat;
 
PROCEDURE ShowDat;
BEGIN
 INLINE(02143H,04F4FH,05021H,04906H); (* !COOP!I6 *)
 INLINE(07979H,05959H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 2 *)
 INLINE(05959H,07979H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 3 *)
 INLINE(0A2A2H,05959H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 4 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 5 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 6 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 7 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 8 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 9 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 10 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 11 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 12 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 13 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 14 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 15 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 16 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 17 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 18 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 19 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 20 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
END ShowDat;

PROCEDURE LoadDat;
BEGIN
 INLINE(02143H,04F4FH,05021H,04907H); (* !COOP!I7 *)
 INLINE(00000H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 2 *)
 INLINE(03232H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 3 *)
 INLINE(03333H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 4 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 5 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 6 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 7 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 8 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 9 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 10 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 11 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 12 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 13 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 14 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 15 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 16 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 17 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 18 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 19 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 20 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
END LoadDat;

PROCEDURE ScrollDat;
BEGIN
 INLINE(02143H,04F4FH,05021H,04908H); (* !COOP!I8 *)
 INLINE(04142H,04344H,04546H,04748H,0494AH,04B4CH,04E4DH,07979H,07979H,05959H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 2 *)
 INLINE(0A2A2H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 3 *)
 INLINE(04142H,04344H,04546H,04748H,0494AH,04B4CH,04D4FH,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 4 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 5 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 6 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 7 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 8 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 9 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 10 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 11 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 12 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 13 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 14 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 15 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 16 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 17 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 18 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 19 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 20 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 21 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 22 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 23 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 24 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 (* 25 *)
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
 INLINE(00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H);
END ScrollDat;

PROCEDURE DefineAll;
BEGIN
  cb         := ADR(CScrollDat);INC(LONGCARD(cb)        ,20);
  CardPtr    := ADR(CScrollDat);INC(LONGCARD(CardPtr)   ,18);
  ce         := cb ;INC(LONGCARD(ce),CardPtr^);
  INC(LONGCARD(ce),CardPtr^);DEC(LONGCARD(ce),2);
  CBeam      := ADR(CBeamDat);  INC(LONGCARD(CBeam)     ,18);
  CTitle     := ADR(CTitleDat); INC(LONGCARD(CTitle)    ,18);
  Title      := ADR(TitleDat);  INC(LONGCARD(Title)     ,18);
  Show       := ADR(ShowDat);   INC(LONGCARD(Show)      ,18);
  Load       := ADR(LoadDat);   INC(LONGCARD(Load)      ,18);
  ScrollText := ADR(ScrollDat); INC(LONGCARD(ScrollText),18);
  CardPtr    := ADR(ColourDat); INC(LONGCARD(CardPtr)   ,18);
  bocol := CardPtr; INC(LONGCARD(CardPtr),2);
  bacol := CardPtr; INC(LONGCARD(CardPtr),2);
  icol  := CardPtr; INC(LONGCARD(CardPtr),2);
  iscol := CardPtr; INC(LONGCARD(CardPtr),2);
  ccol  := CardPtr; INC(LONGCARD(CardPtr),2);
  cscol := CardPtr; INC(LONGCARD(CardPtr),2);
  tscol := CardPtr;
  c0    := ADR(custom^.color[00]);
  c1    := ADR(custom^.color[01]);
  c2    := ADR(custom^.color[02]); 
  (* OFFSET : 10 FOR PROC-HEADER + 8 FOR COOP-IDENTIFIER = 18 *)
END DefineAll;

PROCEDURE DrawCopperLine;
VAR 
    copline : CARDINAL;   

BEGIN 
    ucp := CINIT(uc, 200);

    CWAIT(uc ,0,0);
    CMOVE(uc, ADR(custom^.spr[00]),0);
    CMOVE(uc, c0,bocol^);    
    CMOVE(uc, ADR(custom^.intreq),{INTSetClr,INTCoper});
    (* Upper Line *)
    copline := Up;  
    CardPtr := BScrollP;   
    FOR I := 54 TO 68  DO
      CWAIT(uc, copline, I );
      CMOVE(uc, c0, CardPtr^);
      INC(LONGCARD(CardPtr),2);
      IF LONGCARD(CardPtr) > LONGCARD(ce) THEN CardPtr := cb;END;
    END;     
    INC(LONGCARD(BScrollP),2);
    IF LONGCARD(BScrollP) > LONGCARD(ce) THEN BScrollP := cb;END;
    INC(copline);
    CWAIT(uc, copline,0);
    CMOVE(uc, c0, bacol^);
    CMOVE(uc, c2, tscol^);
    (* Title *)
    copline := StartCopPos;
    FOR J := 1 TO titles DO
      CardPtr := CTitle;
      FOR I := 1 TO CHeight  DO
         CWAIT(uc, copline,0); 
         CMOVE(uc, c1,CardPtr^);
         INC(copline);
         INC(LONGCARD(CardPtr),2)
      END;
      INC(copline);
    END;
    (* Scroller *)
    copline := ScrollCopPos;
    CardPtr := CScrollP;
    FOR I := 1 TO 4 DO
      CWAIT(uc, copline,0);
      CMOVE(uc, c1,CardPtr^);
      INC(LONGCARD(CardPtr),2);
      INC(copline,2);
      IF LONGCARD(CardPtr) > LONGCARD(ce) THEN CardPtr := cb;END;
    END;
    INC(LONGCARD(CScrollP),2);
    IF LONGCARD(CScrollP) > LONGCARD(ce) THEN CScrollP := cb;END;
    (* Items *)
    INC(copline);
    CWAIT(uc, copline,0);
    CMOVE(uc, c1, icol^);
    CMOVE(uc, c2, iscol^);
    (* Beam *)
    copline := i;
    CWAIT(uc, copline, 0);
    CMOVE(uc, c1, ccol^);
    CMOVE(uc, c2, cscol^);
    CardPtr := CBeam;
    CMOVE(uc, c0, CardPtr^);
    INC(copline);
    INC(LONGCARD(CardPtr),2);
    FOR I := 2 TO BeamHeight DO
      CWAIT(uc, copline, 0);
      CMOVE(uc, c0, CardPtr^);
      INC(copline);
      INC(LONGCARD(CardPtr),2);
    END;
    (* Items *)
    CWAIT(uc, copline,0);
    CMOVE(uc, c1, icol^);
    CMOVE(uc, c2, iscol^);
    CMOVE(uc, c0, bacol^);
    (* Lower Line *)
    copline := Down;
    CardPtr := AScrollP;
    FOR I := 54 TO 68 DO
      CWAIT(uc, copline, I);
      CMOVE(uc, c0, CardPtr^);
      DEC(LONGCARD(CardPtr),2);
      IF LONGCARD(CardPtr) < LONGCARD(cb) THEN CardPtr := ce;END;
    END;  
    INC(LONGCARD(AScrollP),2);
    IF LONGCARD(AScrollP) > LONGCARD(ce) THEN AScrollP := cb;END;
    INC(copline);
    CWAIT(uc, copline,0);
    CMOVE(uc, c0, bocol^);
    CEND(uc);
END DrawCopperLine;

PROCEDURE CenterString(string:ARRAY OF CHAR;y:INTEGER);
VAR pixlen,vertpos : INTEGER;

BEGIN
   pixlen := StringLength(string) * Broad;
   vertpos := (ScreenX - pixlen) DIV 2;
   SetAPen(rp^,2);
   Move(rp^,vertpos+1,y+1);
   Text(rp^,ADR(string),StringLength(string));
   SetAPen(rp^,1);
   Move(rp^,vertpos,y);
   Text(rp^,ADR(string),StringLength(string));
END CenterString;
   
PROCEDURE ShowAll;
VAR UsedPixels,currentY : INTEGER;
    I : CARDINAL;
    
BEGIN
   number :=0;items := 0;titles := 0;
   FOR I := 1 TO 3 DO
      IF Title^[I,0] # Terminator THEN
         INC(number);INC(titles);
      END;
   END;
   FOR I := 1 TO 20 DO
      IF Show^[I,0] # Terminator THEN
         INC(number);INC(items);
      END;
   END;
   UsedPixels :=  number * Height;
   StartGfxPos := INTEGER((ScreenY - UsedPixels) DIV 2);
   INC(StartGfxPos,StartOffset);
   StartCopPos := INTEGER(StartGfxPos);
   INC(StartCopPos,CopOffset);
   currentY := StartGfxPos;
   SetAPen(rp^,1);
   FOR I := 1 TO titles DO 
     CenterString(Title^[I],currentY);
     INC(currentY,Height);
   END;
   INC(currentY,2*Height);
   FOR I := 1 TO items DO
     CenterString(Show^[I],currentY);
     INC(currentY,Height);
   END;
   Down := currentY;
   INC(Down,CopOffset);
   INC(Down,CHeight);   
END ShowAll;

PROCEDURE DefineScroller;
BEGIN
   CScrollP := cb;
   AScrollP := ce;
   BScrollP := cb;
   ScrollGfxPos   := StartGfxPos + titles*Height + (Height DIV 2);
   ScrollCopPos   := INTEGER(ScrollGfxPos) + CopOffset;
   scrollpix := 0;
   LeftScreen := ScreenX; INC(LeftScreen,3*Broad);
   CharX      := ScreenX; INC(CharX,Broad);
   ScrollBottom := ScrollCopPos;INC(ScrollBottom,CHeight);
   ScrollStep := JoySensity;
END DefineScroller;

PROCEDURE Scroll():LONGINT;
BEGIN
   INLINE(48E7H, 03F3EH); (* MOVEM.L D2-D7/A2-A6,-(SP) *)   
   ScrollRaster
     (rp^,(ScrollStep DIV JoySensity),0,0,ScrollCopPos,LeftScreen,ScrollBottom);
   INC(scrollpix,(ScrollStep DIV JoySensity));
   IF scrollpix > SmallBroad THEN
      CX := CharX;
      ScrollOffset := scrollpix;
      DEC(ScrollOffset,Broad);
      DEC(CX,ScrollOffset);
      Move(rp^,CX,ScrollGfxPos);
      Text(rp^,charptr,1);
      INC(LONGCARD(charptr));scrollpix := ScrollOffset;
      IF charptr^ = Terminator THEN 
         charptr := ScrollText;
      END;
   END;
   LeftButton := NOT (6 IN bit^);
   IF (1 IN joy^) AND (ScrollStep > 0) THEN 
      DEC(ScrollStep);
   END;
   IF (9 IN joy^) AND (ScrollStep < (Broad*JoySensity)) THEN 
      INC(ScrollStep);
   END; 
   IF custom^.joy0dat # olddat THEN 
     chosen := custom^.joy0dat DIV number;INC(chosen);
     IF chosen > items THEN
       chosen := 1;
       custom^.joy0dat := olddat;
     ELSE
       olddat  := custom^.joy0dat;
     END;
   END;
   INLINE(4CDFH, 07CFCH); (* MOVEM.L (SP)+,D2-D7/A2-A6 *)
   RETURN (0D); (* Return D0 = 0 Continue Server Chain  *)
END Scroll;
    
BEGIN
  DefineAll;
  (* BorderCol is divided in 3 Bytes for SetRGB4 *)
  number  :=  bocol^               DIV 256;
  items   := (bocol^ - number*256) DIV 16;
  chosen  := (bocol^ - number*256 - items*16);
 
  scr := CreateScreen(ScreenX+3*Broad, ScreenY, 2, NIL);
  IF scr = NIL THEN HALT;END;
  vp := ADR(scr^.ViewPort);
  rp := ADR(scr^.RastPort);
  vp^.Modes := ViewModesSet{}; 
  SetRGB4(vp^,0,number,items,chosen);  
  SetAPen(rp^,0);
  RectFill(rp^,0,0,ScreenX+3*Broad,10);
  MakeScreen(scr^);
  rp^.DrawMode := DrawModeSet{ };
  ShowAll;
  Up := StartCopPos;DEC(Up,Height);
  IF INTEGER(Up)  <  0 THEN Up := 0;END;
  DefineScroller;
  LeftButton := FALSE;
  bit := ADDRESS(0BFE001H);
  joy := ADDRESS(0DFF00CH);
  charptr := ScrollText;

  i := INTEGER(StartCopPos + (titles * Height) +Height) + BeamOffset ;
  starti := i;
  chosen := 1;
  number := (256 DIV items)* 256 ; (* just as dongle *)
  WITH int DO
    isNode.lnType := NTInterrupt;
    isNode.lnPri  := BYTE(0);
    isNode.lnName := NIL;
    isCode        := ADR(Scroll);
    isData        := NIL;
  END;
  AddIntServer(INTCoper, int);
   
  custom^.joy0dat := 0;olddat := 0;
  REPEAT 
    i := starti;INC(i,chosen*Height);  
    DrawCopperLine;
    vp^.UCopIns := ADR(uc);
    RethinkDisplay();
  UNTIL LeftButton; 

  vp^.UCopIns := NIL;
  FreeCopList(uc.FirstCopList^);
  RemIntServer(INTCoper,int);
  CloseScreen(scr^);
  IF Load^[1,0] = 0C THEN HALT;END;        (* Fuer Aufruf im MenuMaker *)
  
  (* Alloc Mem and put its Address in ColdCapture *)
  c0 := AllocMem(44D,MemReqSet{0});        (* Allocate 44 Bytes Public *)
  CopyBufferB(ADR(Load^[chosen]),c0,40D);  (* String > Buffer *)
  p  := ADDRESS(04D);                      (* $04 = Poiter to ExecBase *)
  c1 := ADDRESS(p^);                       (* c1 := ExecBase *)
  INC(LONGCARD(c1),42);                    (* c1 := ColdCapture *)
  p :=  c1;                                (* p  := ColdCapture *)
  p^ := LONGCARD(c0);                      (* Start of Buffer > ColdCapture*)
  
  (* Put OldColdCapture behind String *)
  p  := c0;                                (* p := Start of Buffer *)
  INC(LONGCARD(p),40);                     (* p := 41th Byte *)
  p^ := LONGCARD(c1);                      (* Put OldColdCapture in Buffer *) 
END CopperMenu.