home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 500.lha / AngusCopy_v2.0 / AngusCopy2.0.mod < prev    next >
Text File  |  1991-04-08  |  25KB  |  838 lines

  1. (*
  2. Program:   AngusCopy 2.0
  3. Release:   2.0   2-Feb-91  20.00 
  4. Copyright: © Copyright 1991 by Andreas Gunßer 
  5. Author:    Andreas Gunßer
  6. Address:   Großheppacherstr. 34    D-7056 Weinstadt-Endersbach    Germany
  7. Phone:     07151/61846
  8. Use:       Copy a Disk in 1:34 minutes
  9. Language:  Modula-2
  10. History:   1.0 (28-Jan-91)
  11. History:   2.0 ( 2-Feb-91)
  12. History:
  13. Greetings: Alle Modula-2 Programmierer      
  14.            Alle PD-Fans
  15.            Roni,Andi,Günther,Dani,Jutta,Biggi,Kitty,Pet Shop Boys
  16. Thanks to: The author of TrackDiskSupport -- great work !!
  17. *)
  18.  
  19. MODULE AngusCopy;
  20.  
  21. FROM SYSTEM           IMPORT ADR;
  22. FROM Intuition        IMPORT NewWindow,WindowPtr,IDCMPFlags,IDCMPFlagSet,
  23.                              WindowFlags,WindowFlagSet,OpenWindow,CloseWindow,
  24.                              IntuiMessage,IntuiText,Gadget,boolGadget,
  25.                              GadgetFlags,GadgetFlagSet,ActivationFlags,
  26.                              ActivationFlagSet,Border,ScreenFlagSet,
  27.                              ScreenFlags,StringInfo,strGadget;
  28. FROM Exec             IMPORT Byte,GetMsg,ReplyMsg,WaitPort;
  29. FROM Heap             IMPORT AllocMem,Deallocate;
  30. FROM Graphics         IMPORT jam1,Move,Text,RastPortPtr,SetAPen;
  31. FROM Arts             IMPORT Assert;
  32. FROM Strings          IMPORT Length;
  33. FROM Conversions      IMPORT ValToStr;
  34. FROM TrackDiskSupport IMPORT OpenTrackDisk,CloseTrackDisk,GetDiskChange,
  35.                              FormatTrack,ReadCycSec;
  36. FROM TrackDisk        IMPORT notSpecified,noSecHdr,badSecPreamble,badSecId,
  37.                              badHdrSum,badSecSum,tooFewSecs,badSecHdr,writeProt,
  38.                              diskChanged,seekError,noMem,badUnitNum,
  39.                              badDriveType,driveInUse,postReset;
  40.                                                           
  41. CONST 
  42.   s0gad = 0;
  43.   s1gad = 1;
  44.   s2gad = 2;
  45.   s3gad = 3;
  46.   d0gad = 4;
  47.   d1gad = 5;
  48.   d2gad = 6;
  49.   d3gad = 7;
  50.   strackgad = 8;
  51.   etrackgad = 9;
  52.   startgad  = 10;
  53.   aboutgad  = 11;
  54.   TrackSize = 512*22;
  55.   
  56.   
  57. VAR
  58.   Fenster       : NewWindow;
  59.   FensterPtr    : WindowPtr;
  60.   FensterTitle  : ARRAY [0..70] OF CHAR;
  61.   FRPort        : RastPortPtr;
  62.   class         : IDCMPFlagSet;
  63.   IntuiMsg      : POINTER TO IntuiMessage;
  64.   
  65.   sGadget       : Gadget;
  66.   sGadgetRahmen : Border;
  67.   sGadgetText   : IntuiText;
  68.   sXYFeld       : ARRAY [0..9] OF INTEGER;
  69.   
  70.   aGadget       : Gadget;
  71.   aGadgetRahmen : Border;
  72.   aGadgetText   : IntuiText;
  73.   aXYFeld       : ARRAY [0..9] OF INTEGER;  
  74.   
  75.   sTrGadget       : Gadget;
  76.   sTrGadgetRahmen : Border;
  77.   sTrXYFeld       : ARRAY [0..9] OF INTEGER;
  78.   sTrInfo         : StringInfo;
  79.   sTrBuffer       : ARRAY [0..80] OF CHAR;
  80.   sTrUndoBuffer   : ARRAY [0..80] OF CHAR;
  81.   
  82.   eTrGadget       : Gadget;
  83.   eTrGadgetRahmen : Border;
  84.   eTrXYFeld       : ARRAY [0..9] OF INTEGER;
  85.   eTrInfo         : StringInfo;
  86.   eTrBuffer       : ARRAY [0..80] OF CHAR;
  87.   eTrUndoBuffer   : ARRAY [0..80] OF CHAR;
  88.       
  89.   dGadget       : ARRAY [1..8] OF Gadget;
  90.   dGadgetRahmen : ARRAY [1..8] OF Border;
  91.   dGadgetText   : ARRAY [1..8] OF IntuiText;
  92.   dGadgetNo     : ARRAY [1..8],[0..1] OF CHAR;
  93.   dXYFeld       : ARRAY [0..9] OF INTEGER;                            
  94.   
  95.   null,eins,zwei,drei : CHAR;
  96.   whichGadget         : POINTER TO Gadget;
  97.   quelle,ziel         : CARDINAL;
  98.   sTrack,eTrack       : CARDINAL;
  99.   TrackBuffer         : POINTER TO ARRAY [0..TrackSize-1] OF CHAR;
  100.   gadgzahl            : CARDINAL;  
  101.   z1                  : INTEGER; (* counter *)
  102.  
  103.  
  104. PROCEDURE About;
  105.   VAR
  106.     aFenster      : NewWindow;
  107.     aFensterPtr   : WindowPtr;
  108.     aFensterTitle : ARRAY [0..70] OF CHAR;
  109.     aFRPort       : RastPortPtr;
  110.     aclass        : IDCMPFlagSet;
  111.     aIntuiMsg     : POINTER TO IntuiMessage;
  112.   
  113.   BEGIN (* About *)
  114.     aFensterTitle := "About AngusCopy 2.0";
  115.     WITH aFenster DO
  116.       leftEdge    := 160;
  117.       topEdge     := 30;
  118.       width       := 330;
  119.       height      := 180;
  120.       detailPen   := 0;
  121.       blockPen    := 1;
  122.       idcmpFlags  := IDCMPFlagSet {closeWindow};
  123.       flags       := WindowFlagSet {windowDrag,windowDepth,windowClose,
  124.                                     activate};
  125.       firstGadget := NIL;
  126.       checkMark   := NIL;
  127.       title       := ADR (aFensterTitle);
  128.       type        := ScreenFlagSet {wbenchScreen};
  129.     END (* WITH *);
  130.     aFensterPtr := OpenWindow (aFenster);
  131.     Assert (aFensterPtr # NIL,ADR ("Can`t open AboutWindow"));
  132.     aFRPort := aFensterPtr^.rPort;
  133.     
  134.     SetAPen (aFRPort,1);
  135.     Move (aFRPort,108,20);
  136.       Text (aFRPort,ADR("AngusCopy 2.0"),13);
  137.     Move (aFRPort,24,45);
  138.       Text (aFRPort,ADR("© Copyright 1991 by Andreas Gunßer"),34);
  139.     Move (aFRPort,92,58);
  140.       Text (aFRPort,ADR("This is ShareWare"),17);
  141.     Move (aFRPort,72,71);
  142.       Text (aFRPort,ADR("Send 10 U$ or 15 DM to"),22);
  143.     Move (aFRPort,104,91);
  144.       Text (aFRPort,ADR("Andreas Gunßer"),14);        
  145.     Move (aFRPort,80,104);
  146.       Text (aFRPort,ADR("Großheppacherstr. 34"),20);
  147.     Move (aFRPort,52,117);
  148.       Text (aFRPort,ADR("D-7056 Weinstadt-Endersbach"),27);
  149.     Move (aFRPort,132,130);
  150.       Text (aFRPort,ADR("Germany"),7);
  151.     Move (aFRPort,124,150);
  152.       Text (aFRPort,ADR("Thanks to"),9);                  
  153.     Move (aFRPort,40,163);
  154.       Text (aFRPort,ADR("The Author of TrackDiskSupport"),30);
  155.     
  156.     LOOP
  157.       WaitPort (aFensterPtr^.userPort);
  158.       aIntuiMsg := GetMsg (aFensterPtr^.userPort);
  159.       WHILE (aIntuiMsg # NIL) DO
  160.         aclass := aIntuiMsg^.class;
  161.         ReplyMsg (aIntuiMsg);
  162.         IF (closeWindow IN aclass) THEN
  163.           EXIT;
  164.         END;
  165.         aIntuiMsg := GetMsg (aFensterPtr^.userPort);
  166.       END (* WHILE *);
  167.     END (* LOOP *);
  168.     
  169.     CloseWindow (aFensterPtr);
  170. END About;
  171.               
  172.  
  173.  
  174.  
  175. PROCEDURE cError (ceFensterTitle:ARRAY OF CHAR;whaterr:Byte;
  176.                                                where:INTEGER):BOOLEAN;
  177.   CONST
  178.     cancelgad = 0;
  179.     skipgad   = 1;
  180.        
  181.   VAR
  182.     ceFenster    : NewWindow;
  183.     ceFensterPtr : WindowPtr;
  184.     ceFrPort     : RastPortPtr;
  185.     ceclass      : IDCMPFlagSet;
  186.     ceIntuiMsg   : POINTER TO IntuiMessage;
  187.     ceGadget     : ARRAY [0..1] OF Gadget;
  188.     ceRahmen     : ARRAY [0..1] OF Border;
  189.     ceXYFeld     : ARRAY [0..9] OF INTEGER;
  190.     ceText       : ARRAY [0..1] OF IntuiText;
  191.     cancelText   : ARRAY [0..50] OF CHAR;
  192.     skipText     : ARRAY [0..50] OF CHAR;
  193.     gadgets      : CARDINAL;
  194.     errorString  : ARRAY [0..50] OF CHAR;
  195.     ceiGadget    : POINTER TO Gadget;
  196.     whereString  : ARRAY [0..10] OF CHAR;
  197.     dummyb       : BOOLEAN;
  198.              
  199.   BEGIN (* cError *)
  200.     WITH ceFenster DO
  201.       leftEdge    := 170;
  202.       topEdge     := 70;
  203.       width       := 300;
  204.       height      := 116;
  205.       detailPen   := 0;
  206.       blockPen    := 1;
  207.       idcmpFlags  := IDCMPFlagSet {gadgetUp};
  208.       flags       := WindowFlagSet {windowDrag,windowDepth,activate};
  209.       firstGadget := ADR (ceGadget[0]);
  210.       checkMark   := NIL;
  211.       title       := ADR (ceFensterTitle);
  212.       bitMap      := NIL;
  213.       type        := ScreenFlagSet {wbenchScreen};
  214.     END (* WITH *);
  215.       
  216.     ceXYFeld[0] := 0;
  217.     ceXYFeld[1] := 0;
  218.     ceXYFeld[2] := 121;
  219.     ceXYFeld[3] := 0;
  220.     ceXYFeld[4] := 121;
  221.     ceXYFeld[5] := 11;
  222.     ceXYFeld[6] := 0;
  223.     ceXYFeld[7] := 11;
  224.     ceXYFeld[8] := 0;
  225.     ceXYFeld[9] := 0;        
  226.     
  227.     FOR gadgets := 0 TO 1 DO
  228.       WITH ceRahmen[gadgets] DO
  229.         leftEdge := -1;
  230.         topEdge  := -1;
  231.         frontPen := 1;
  232.         backPen  := 0;
  233.         drawMode := jam1;
  234.         count    := 5;
  235.         xy       := ADR (ceXYFeld);
  236.         nextBorder:= NIL;
  237.       END (* WITH *);        
  238.       
  239.       WITH ceText[gadgets] DO        
  240.         frontPen := 1;
  241.         backPen  := 0;
  242.         topEdge  := 2;
  243.         drawMode := jam1;
  244.         nextText := NIL;
  245.       END (* WITH *);
  246.       ceText[0].leftEdge := 16;
  247.       ceText[0].iText    := ADR ("Cancel Copy");
  248.       ceText[1].leftEdge := 20;
  249.       ceText[1].iText    := ADR ("Skip Track");
  250.       
  251.       WITH ceGadget[gadgets] DO
  252.         topEdge      := 90;
  253.         width        := 120;
  254.         height       := 10;
  255.         flags        := GadgetFlagSet {};
  256.         activation   := ActivationFlagSet {gadgImmediate,relVerify};
  257.         gadgetType   := boolGadget;
  258.         gadgetRender := ADR (ceRahmen[gadgets]);
  259.         selectRender := NIL;
  260.         gadgetText   := ADR (ceText[gadgets]);
  261.         specialInfo  := NIL;
  262.         userData     := NIL;
  263.       END (* WITH *);
  264.     END (* FOR *);
  265.        
  266.        ceGadget[0].nextGadget := ADR (ceGadget[1]);
  267.        ceGadget[0].leftEdge   := 20;
  268.        ceGadget[0].gadgetID   := cancelgad;
  269.        ceGadget[1].nextGadget := NIL;
  270.        ceGadget[1].leftEdge   := 160;
  271.        ceGadget[1].gadgetID   := skipgad;
  272.        
  273.        ceFensterPtr := OpenWindow (ceFenster);
  274.        Assert (ceFensterPtr # NIL,ADR ("Can`t open a Window !"));
  275.        ceFrPort := ceFensterPtr^.rPort;
  276.        
  277.        CASE whaterr OF
  278.          notSpecified:   errorString := "Not specified Error";|
  279.          noSecHdr:       errorString := "No Sector Header";|
  280.          badSecPreamble: errorString := "Bad Sector Preamble";|
  281.          badSecId:       errorString := "Bad Sector Identifier";|
  282.          badHdrSum:      errorString := "Header-Checksum Error";|
  283.          badSecSum:      errorString := "Sector-Checksum Error";|
  284.          tooFewSecs:     errorString := "Too few Sectors";|
  285.          badSecHdr:      errorString := "Bad Sector Header";|
  286.          writeProt:      errorString := "Disk write-protected";|
  287.          diskChanged:    errorString := "No Disk in Drive";|
  288.          seekError:      errorString := "Seek Error";|
  289.          noMem:          errorString := "Not enough memory";|
  290.          badUnitNum:     errorString := "Drive not connected";|
  291.          badDriveType:   errorString := "Bad Drive-Type";|
  292.          driveInUse:     errorString := "Drive in use";|
  293.          postReset:      errorString := "User Reset";|
  294.        ELSE
  295.          errorString := "Unknown Error";
  296.        END (* CASE *);            
  297.        
  298.        ValToStr (where,TRUE,whereString,10,+2," ",dummyb);
  299.        
  300.        Move (ceFrPort,20,20);
  301.          Text (ceFrPort,ADR ("Track:"),6);   
  302.        Move (ceFrPort,20,35);
  303.          Text (ceFrPort,ADR ("Error:"),6);
  304.        Move (ceFrPort,76,20);
  305.          Text (ceFrPort,ADR (whereString),Length(whereString));
  306.        Move (ceFrPort,76,35);
  307.          Text (ceFrPort,ADR (errorString),Length (errorString));
  308.             
  309.        LOOP
  310.          WaitPort (ceFensterPtr^.userPort);
  311.          ceIntuiMsg := GetMsg (ceFensterPtr^.userPort);
  312.          WHILE (ceIntuiMsg # NIL) DO
  313.            ceclass := ceIntuiMsg^.class;
  314.            ceiGadget:= ceIntuiMsg^.iAddress;
  315.            ReplyMsg (ceIntuiMsg);
  316.            IF (gadgetUp IN class) THEN
  317.              IF (ceiGadget^.gadgetID = cancelgad) THEN
  318.                CloseWindow (ceFensterPtr);
  319.                RETURN FALSE;
  320.              ELSIF (ceiGadget^.gadgetID = skipgad) THEN
  321.                CloseWindow (ceFensterPtr);
  322.                RETURN TRUE;  
  323.              END (* IF *);
  324.            END (* IF *);  
  325.            ceIntuiMsg := GetMsg (ceFensterPtr^.userPort);
  326.          END (* WHILE *);  
  327.        END (* LOOP *);
  328. END cError;
  329.  
  330.        
  331.              
  332.        
  333. PROCEDURE OpenError (fRow:ARRAY OF CHAR;sRow:ARRAY OF CHAR);
  334.   VAR
  335.     oeFenster      : NewWindow;
  336.     oeFensterPtr   : WindowPtr;
  337.     oeFensterTitle : ARRAY [0..70] OF CHAR;
  338.     oeFrPort       : RastPortPtr;
  339.     oeclass        : IDCMPFlagSet;
  340.     oeIntuiMsg     : POINTER TO IntuiMessage;
  341.      
  342.   BEGIN (* OpenError *)
  343.     oeFensterTitle := "Fatal Error !";
  344.     WITH oeFenster DO
  345.       leftEdge := 170;
  346.       topEdge  := 100;
  347.       width    := 300;
  348.       height   := 50;
  349.       detailPen := 0;
  350.       blockPen := 1;
  351.       idcmpFlags := IDCMPFlagSet {closeWindow};
  352.       flags := WindowFlagSet {windowDrag,windowClose,windowDepth,activate};
  353.       firstGadget := NIL;
  354.       checkMark   := NIL;
  355.       title := ADR (oeFensterTitle);
  356.       bitMap := NIL;
  357.       type := ScreenFlagSet {wbenchScreen};
  358.     END (* WITH *);
  359.     oeFensterPtr := OpenWindow (oeFenster);
  360.     Assert (oeFensterPtr # NIL,ADR ("Can`t open a Window !"));
  361.     oeFrPort := oeFensterPtr^.rPort;
  362.     Move (oeFrPort,20,20);
  363.       Text (oeFrPort,ADR (fRow),Length (fRow));
  364.     Move (oeFrPort,20,32);
  365.       Text (oeFrPort,ADR (sRow),Length (sRow));
  366.     
  367.     LOOP
  368.       WaitPort (oeFensterPtr^.userPort);
  369.       oeIntuiMsg := GetMsg (oeFensterPtr^.userPort);
  370.       WHILE (oeIntuiMsg # NIL) DO
  371.         oeclass := oeIntuiMsg^.class;
  372.         ReplyMsg (oeIntuiMsg);
  373.         IF (closeWindow IN oeclass) THEN
  374.           EXIT;
  375.         END (* IF *);
  376.         oeIntuiMsg := GetMsg (oeFensterPtr^.userPort);                          
  377.       END (* WHILE *);
  378.     END (* LOOP *);
  379.     CloseWindow (oeFensterPtr);
  380. END OpenError;
  381.         
  382.     
  383.  
  384.  
  385. PROCEDURE TrackCopy (track:CARDINAL;from:CARDINAL;to:CARDINAL):BOOLEAN;
  386.   VAR
  387.     error      : Byte;
  388.     fehlerbool : BOOLEAN;
  389.         
  390.   BEGIN (* TrackCopy *)
  391.     (* Read the Track *)
  392.     error := ReadCycSec (from,track,0,0,TrackBuffer,22,GetDiskChange(from));
  393.     IF (error # 0) THEN
  394.       fehlerbool := cError ("Error on Sourcedrive",error,track);
  395.       (* Skip Track:.... *)
  396.       IF (fehlerbool = TRUE) THEN
  397.         RETURN TRUE;  
  398.       (* Cancel Backup:... *)  
  399.       ELSIF (fehlerbool = FALSE) THEN
  400.         RETURN FALSE;
  401.       END (* IF *);
  402.     END (* IF *);
  403.     
  404.     (* Write the Track *)
  405.     error := FormatTrack (to,track,TrackBuffer,1,GetDiskChange(to));     
  406.     IF (error # 0) THEN
  407.       fehlerbool := cError ("Error on Desinationdrive",error,track);
  408.       (* Skip Track *)
  409.       IF (fehlerbool = TRUE) THEN
  410.         RETURN TRUE;  
  411.       (* Cancel Backup:... *)  
  412.       ELSIF (fehlerbool = FALSE) THEN
  413.         RETURN FALSE;
  414.       END (* IF *);
  415.     END (* IF *);
  416.     RETURN TRUE;
  417. END TrackCopy;
  418.  
  419.  
  420.     
  421.  
  422. PROCEDURE DiskCopy (source:CARDINAL;desti:CARDINAL;sTr:CARDINAL;eTr:CARDINAL);
  423.   VAR
  424.     err1,err2 : Byte;
  425.     tracks    : INTEGER;
  426.     bool      : BOOLEAN;
  427.     
  428.   BEGIN (* DiskCopy *);  
  429.     IF (sTr > eTr) THEN
  430.       OpenError ("Your Starttrack is higher than","your Endtrack");
  431.       RETURN;
  432.     END (* IF *);  
  433.     
  434.     IF ((sTr < 0) OR (sTr > 79)) THEN
  435.       OpenError ("Your Starttrack is out of range","x >= 0 <= 79");
  436.       RETURN;
  437.     END (* IF *);  
  438.     
  439.     IF ((eTr < 0) OR (eTr > 79)) THEN
  440.       OpenError ("Your Endtrack is out of range","x >= 0 <= 79");
  441.       RETURN;
  442.     END (* IF *);
  443.     
  444.     IF (source = desti) THEN
  445.       OpenError ("Your Sourcedrive is the same","as your Destinationdrive");
  446.       RETURN;  
  447.     END (* IF *);
  448.     
  449.     err1 := OpenTrackDisk (source,TRUE);
  450.     IF (err1 # 0) THEN
  451.       OpenError ("There is s.th. wrong with","your Sourcedrive");
  452.       RETURN;
  453.     END (* IF *);
  454.        
  455.     err2 := OpenTrackDisk (desti,TRUE);
  456.     IF (err2 # 0) THEN
  457.       OpenError ("There is s.th wrong with","your Destinationdrive");
  458.       CloseTrackDisk (source);
  459.       RETURN;
  460.     END (* IF *);
  461.     
  462.     AllocMem (TrackBuffer,SIZE(TrackBuffer^),TRUE);    
  463.     (*------ Copy ---------------------------------------------*)
  464.     LOOP
  465.       FOR tracks := sTr TO eTr DO
  466.         bool := TrackCopy (tracks,source,desti);
  467.         IF (bool = FALSE) THEN 
  468.           EXIT (* LOOP *);
  469.         END (* IF *);
  470.       END (* FOR *);
  471.       EXIT (* LOOP *);  
  472.     END (* LOOP *);
  473.     CloseTrackDisk (source);
  474.     CloseTrackDisk (desti);
  475.     Deallocate (TrackBuffer);
  476. END DiskCopy;
  477.  
  478.  
  479. (* ------- ab hier geht`s so  richtig los ------------------------------- *)
  480.  
  481. BEGIN (* main program *)
  482.   quelle := 0;
  483.   ziel   := 1;
  484.   sTrack := 0;
  485.   eTrack := 79;
  486.   
  487.   null := "0";
  488.   eins := "1";
  489.   zwei := "2";
  490.   drei := "3";
  491.   
  492.   dGadgetNo[1,0] := "0";
  493.   dGadgetNo[2,0] := "1";
  494.   dGadgetNo[3,0] := "2";
  495.   dGadgetNo[4,0] := "3";
  496.   dGadgetNo[5,0] := "0";
  497.   dGadgetNo[6,0] := "1";
  498.   dGadgetNo[7,0] := "2";
  499.   dGadgetNo[8,0] := "3";
  500.   
  501.   FensterTitle := "AngusCopy 2.0          by Andreas Gunßer";
  502.   WITH Fenster DO
  503.     leftEdge := 115;
  504.     topEdge  := 63;
  505.     width    := 405;
  506.     height   := 110;
  507.     detailPen:= 0;
  508.     blockPen := 1;
  509.     idcmpFlags:= IDCMPFlagSet {closeWindow,gadgetUp};
  510.     flags := WindowFlagSet {windowDrag,windowDepth,windowClose,activate};
  511.     firstGadget := ADR (dGadget[1]);
  512.     checkMark   := NIL;
  513.     title := ADR (FensterTitle);
  514.     bitMap := NIL;
  515.     type := ScreenFlagSet {wbenchScreen};
  516.   END (* WITH *);
  517.     
  518.   (* ------------------- Drive-Gadgets ----------------------------- *)
  519.   
  520.   dXYFeld[0] := 0;
  521.   dXYFeld[1] := 0;
  522.   dXYFeld[2] := 21;
  523.   dXYFeld[3] := 0;
  524.   dXYFeld[4] := 21;
  525.   dXYFeld[5] := 11;
  526.   dXYFeld[6] := 0;
  527.   dXYFeld[7] := 11;
  528.   dXYFeld[8] := 0;
  529.   dXYFeld[9] := 0;
  530.   
  531.   dGadgetText[1].iText := ADR (null);
  532.   dGadgetText[2].iText := ADR (eins);
  533.   dGadgetText[3].iText := ADR (zwei);
  534.   dGadgetText[4].iText := ADR (drei);
  535.   dGadgetText[5].iText := ADR (null);
  536.   dGadgetText[6].iText := ADR (eins);
  537.   dGadgetText[7].iText := ADR (zwei);
  538.   dGadgetText[8].iText := ADR (drei);
  539.   
  540.   FOR gadgzahl := 1 TO 8 DO
  541.     WITH dGadgetRahmen[gadgzahl] DO
  542.       leftEdge   := -1;
  543.       topEdge    := -1; 
  544.       frontPen   := 1;
  545.       backPen    := 0;
  546.       drawMode   := jam1;
  547.       count      := 5;
  548.       xy         := ADR (dXYFeld);
  549.       nextBorder := NIL;
  550.     END (* WITH *);
  551.     
  552.     WITH dGadgetText[gadgzahl] DO
  553.       frontPen := 1;
  554.       backPen  := 0;
  555.       drawMode := jam1;
  556.       leftEdge := 6;
  557.       topEdge  := 2;
  558.       iText    := ADR (dGadgetNo[gadgzahl]);
  559.       nextText := NIL;
  560.     END (* WITH *);
  561.     
  562.     WITH dGadget[gadgzahl] DO
  563.       width := 20;
  564.       height := 10;
  565.       flags := GadgetFlagSet {};
  566.       activation := ActivationFlagSet {relVerify};
  567.       gadgetType := boolGadget;
  568.       gadgetRender := ADR (dGadgetRahmen[gadgzahl]);
  569.       selectRender := NIL;
  570.       gadgetText := ADR (dGadgetText[gadgzahl]);
  571.       specialInfo := NIL;
  572.       userData := NIL;
  573.     END (* WITH *);
  574.   END (* FOR *);          
  575.   
  576.   dGadget[1].nextGadget := ADR (dGadget[2]);
  577.   dGadget[1].leftEdge   := 100;
  578.   dGadget[1].topEdge    := 30;
  579.   dGadget[1].gadgetID   := s0gad;  
  580.   
  581.   dGadget[2].nextGadget := ADR (dGadget[3]);
  582.   dGadget[2].leftEdge   := 140;
  583.   dGadget[2].topEdge    := 30;
  584.   dGadget[2].gadgetID   := s1gad;   
  585.       
  586.   dGadget[3].nextGadget := ADR (dGadget[4]);
  587.   dGadget[3].leftEdge   := 180;
  588.   dGadget[3].topEdge    := 30;
  589.   dGadget[3].gadgetID   := s2gad;  
  590.   
  591.   dGadget[4].nextGadget := ADR (dGadget[5]);
  592.   dGadget[4].leftEdge   := 220;
  593.   dGadget[4].topEdge    := 30;
  594.   dGadget[4].gadgetID   := s3gad;  
  595.   
  596.   dGadget[5].nextGadget := ADR (dGadget[6]);
  597.   dGadget[5].leftEdge   := 100;
  598.   dGadget[5].topEdge    := 50;
  599.   dGadget[5].gadgetID   := d0gad;  
  600.   
  601.   dGadget[6].nextGadget := ADR (dGadget[7]);
  602.   dGadget[6].leftEdge   := 140;
  603.   dGadget[6].topEdge    := 50;
  604.   dGadget[6].gadgetID   := d1gad;  
  605.   
  606.   dGadget[7].nextGadget := ADR (dGadget[8]);
  607.   dGadget[7].leftEdge   := 180;
  608.   dGadget[7].topEdge    := 50;
  609.   dGadget[7].gadgetID   := d2gad;  
  610.   
  611.   dGadget[8].nextGadget := ADR (sGadget);
  612.   dGadget[8].leftEdge   := 220;
  613.   dGadget[8].topEdge    := 50;
  614.   dGadget[8].gadgetID   := d3gad;
  615.   
  616.   (* --------------- Start & About Gadget ---------------------------- *)
  617.   
  618.   sXYFeld[0] := 0;
  619.   sXYFeld[1] := 0;
  620.   sXYFeld[2] := 51;
  621.   sXYFeld[3] := 0;
  622.   sXYFeld[4] := 51;
  623.   sXYFeld[5] := 11;
  624.   sXYFeld[6] := 0;
  625.   sXYFeld[7] := 11;
  626.   sXYFeld[8] := 0;
  627.   sXYFeld[9] := 0;
  628.   
  629.   WITH sGadgetRahmen DO
  630.     leftEdge   := -1;
  631.     topEdge    := -1;
  632.     frontPen   := 1;
  633.     backPen    := 0;
  634.     drawMode   := jam1;
  635.     count      := 5;
  636.     xy         := ADR (sXYFeld);
  637.     nextBorder := NIL;
  638.   END (* WITH *);
  639.   
  640.   WITH sGadgetText DO
  641.     frontPen := 1;
  642.     backPen  := 0;
  643.     drawMode := jam1;
  644.     leftEdge := 5;
  645.     topEdge  := 2;
  646.     nextText := NIL;
  647.     iText    := ADR ("Start");
  648.   END (* WITH *);
  649.   
  650.   WITH sGadget DO
  651.     nextGadget   := ADR (aGadget);
  652.     leftEdge     := 100;
  653.     topEdge      := 75;
  654.     width        := 50;
  655.     height       := 10;
  656.     flags        := GadgetFlagSet {};
  657.     activation   := ActivationFlagSet {relVerify};
  658.     gadgetType   := boolGadget;
  659.     gadgetRender := ADR (sGadgetRahmen);
  660.     selectRender := NIL;
  661.     gadgetText   := ADR (sGadgetText);
  662.     specialInfo  := NIL;
  663.     gadgetID     := startgad;
  664.     userData     := NIL;
  665.   END (* WITH *);
  666.   
  667.   FOR z1 := 0 TO 9 DO
  668.     aXYFeld[z1] := sXYFeld[z1];
  669.   END (* FOR *);
  670.   
  671.   aGadgetRahmen := sGadgetRahmen;
  672.     aGadgetRahmen.xy := ADR (aXYFeld);
  673.   aGadgetText := sGadgetText;
  674.     aGadgetText.iText := ADR ("About");
  675.   aGadget := sGadget;
  676.   
  677.   WITH aGadget DO
  678.     nextGadget   := ADR (sTrGadget);
  679.     leftEdge     := 255;
  680.     gadgetRender := ADR (aGadgetRahmen);
  681.     gadgetText   := ADR (aGadgetText);
  682.     gadgetID     := aboutgad;
  683.   END (* WITH *);
  684.   
  685.   (* ---------- Start & End Track Gadgets --------------------- *)
  686.   
  687.   sTrXYFeld[0] := 0;
  688.   sTrXYFeld[1] := 0;
  689.   sTrXYFeld[2] := 31;
  690.   sTrXYFeld[3] := 0;
  691.   sTrXYFeld[4] := 31;
  692.   sTrXYFeld[5] := 11;
  693.   sTrXYFeld[6] := 0;
  694.   sTrXYFeld[7] := 11;
  695.   sTrXYFeld[8] := 0;
  696.   sTrXYFeld[9] := 0;
  697.   
  698.   WITH sTrGadgetRahmen DO
  699.     leftEdge   := -1;
  700.     topEdge    := -3;
  701.     frontPen   := 1;
  702.     backPen    := 0;
  703.     drawMode   := jam1;
  704.     count      := 5;
  705.     xy         := ADR (sTrXYFeld);
  706.     nextBorder := NIL;
  707.   END (* WITH *);
  708.     
  709.   sTrBuffer := "0";
  710.   sTrUndoBuffer := "0";
  711.   
  712.   WITH sTrInfo DO
  713.     buffer     := ADR (sTrBuffer);
  714.     undoBuffer := ADR (sTrUndoBuffer);
  715.     bufferPos  := 0;
  716.     maxChars   := 3;
  717.     dispPos    := 0;
  718.   END (* WITH *);  
  719.   
  720.   WITH sTrGadget DO
  721.     nextGadget := ADR (eTrGadget);
  722.     leftEdge := 360;
  723.     topEdge :=  32;
  724.     width := 30;
  725.     height := 10;
  726.     flags := GadgetFlagSet {};
  727.     activation := ActivationFlagSet {longint,stringCenter,toggleSelect,
  728.                                                          relVerify};
  729.     gadgetType := strGadget;
  730.     gadgetRender := ADR (sTrGadgetRahmen);
  731.     selectRender := NIL;
  732.     gadgetText := NIL;
  733.     specialInfo := ADR (sTrInfo);
  734.     gadgetID := strackgad;
  735.     userData := NIL;
  736.   END (* WITH *);
  737.   
  738.   
  739.   FOR z1 := 0 TO 9 DO
  740.     eTrXYFeld[z1] := sTrXYFeld[z1];
  741.   END (* FOR *);
  742.   
  743.   eTrGadgetRahmen := sTrGadgetRahmen;
  744.     eTrGadgetRahmen.xy := ADR (eTrXYFeld);
  745.   eTrInfo := sTrInfo;
  746.     eTrBuffer := "79";
  747.     eTrInfo.buffer := ADR (eTrBuffer);
  748.     eTrInfo.undoBuffer := ADR (eTrUndoBuffer);
  749.   eTrGadget := sTrGadget;
  750.   
  751.   WITH eTrGadget DO
  752.     nextGadget   := NIL;
  753.     topEdge      := 52;
  754.     gadgetRender := ADR (eTrGadgetRahmen);
  755.     selectRender := NIL;
  756.     gadgetText   := NIL;
  757.     specialInfo  := ADR (eTrInfo);
  758.     gadgetID     := etrackgad;
  759.     userData     := NIL;
  760.   END (* WITH *);
  761.               
  762.   
  763.   
  764.   
  765.   
  766.   
  767.   
  768.   FensterPtr := OpenWindow (Fenster);
  769.   Assert (FensterPtr #  NIL,ADR ("Can`t open Window !"));       
  770.   FRPort := FensterPtr^.rPort;
  771.   
  772.   SetAPen (FRPort,1);
  773.   Move (FRPort,10,38);
  774.     Text (FRPort,ADR ("Source:"),7);
  775.   Move (FRPort,10,58);
  776.     Text (FRPort,ADR ("Dest.:"),6);
  777.   Move (FRPort,265,38);
  778.     Text (FRPort,ADR ("Starttrack:"),11);
  779.   Move (FRPort,265,58);
  780.     Text (FRPort,ADR ("Endtrack:"),9);  
  781.   Move (FRPort,75,38);
  782.     Text (FRPort,ADR (null),1);
  783.   Move (FRPort,75,58);
  784.     Text (FRPort,ADR (eins),1);       
  785.   
  786.   LOOP
  787.     WaitPort (FensterPtr^.userPort);
  788.     IntuiMsg := GetMsg (FensterPtr^.userPort);
  789.     WHILE (IntuiMsg # NIL) DO
  790.       class := IntuiMsg^.class;
  791.       whichGadget := IntuiMsg^.iAddress;
  792.       ReplyMsg (IntuiMsg);
  793.       IF (closeWindow IN class) THEN
  794.         EXIT;
  795.       ELSIF (gadgetUp IN class) THEN
  796.         CASE whichGadget^.gadgetID OF
  797.           aboutgad  : About;|
  798.           startgad  : Move (FRPort,20,22);
  799.                       Text (FRPort,ADR ("Copying..."),10);
  800.                       DiskCopy (quelle,ziel,sTrack,eTrack);
  801.                       Move (FRPort,20,22);
  802.                       Text (FRPort,ADR ("Ready     "),10);|
  803.           s0gad     : quelle := 0;
  804.                       Move (FRPort,75,38);
  805.                       Text (FRPort,ADR (null),1);|
  806.           s1gad     : quelle := 1;
  807.                       Move (FRPort,75,38);
  808.                       Text (FRPort,ADR (eins),1);|
  809.           s2gad     : quelle := 2;
  810.                       Move (FRPort,75,38);
  811.                       Text (FRPort,ADR (zwei),1);|
  812.           s3gad     : quelle := 3;
  813.                       Move (FRPort,75,38);
  814.                       Text (FRPort,ADR (drei),1);|
  815.           d0gad     : ziel := 0;
  816.                       Move (FRPort,75,58);
  817.                       Text (FRPort,ADR (null),1);|
  818.           d1gad     : ziel := 1;
  819.                       Move (FRPort,75,58);
  820.                       Text (FRPort,ADR (eins),1);|            
  821.           d2gad     : ziel := 2;
  822.                       Move (FRPort,75,58);
  823.                       Text (FRPort,ADR (zwei),1);|      
  824.           d3gad     : ziel := 3;
  825.                       Move (FRPort,75,58);
  826.                       Text (FRPort,ADR (drei),1);| 
  827.           strackgad : sTrack := ABS (sTrInfo.longInt);|
  828.           etrackgad : eTrack := ABS (eTrInfo.longInt);|
  829.         ELSE
  830.         END (* CASE *);
  831.       END (* IF *);
  832.       IntuiMsg := GetMsg (FensterPtr^.userPort);
  833.     END (* WHILE *);
  834.   END (* LOOP *);
  835.   CloseWindow (FensterPtr);
  836. END AngusCopy.
  837.  
  838.