home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 037.lha / DU / MyStart.mod < prev    next >
Text File  |  1987-05-16  |  4KB  |  122 lines

  1. IMPLEMENTATION MODULE MyStart;
  2.  
  3. (* Original code provided by TDI *)
  4. (* Turned into a module by Mike Lawrence:CIS 70030,160 *)
  5. (* Rev: 3/14/87 1:55pm  for 3/87 release of TDI Modula-2 *)
  6. (* Revised way back to my DirUtil needs - 4/28/87 - G. Browne    *)
  7.  
  8. (* THIS STARTUP IS SPECIFIC TO MY DIRUTIL NEEDS. IT DOESN'T CONSIDER
  9.    ANY CLICKED IN OR TAIL ARGUMENTS AND DOESN'T BOTHER TO CD TO THE
  10.    PASSED IN DIRECTORY LOCK.
  11. *)
  12. (*$S-,$T-,$A+*)
  13.  
  14. FROM SYSTEM         IMPORT  CODE,ADR,SETREG,REGISTER,NULL,ADDRESS;
  15. FROM DOSLibrary     IMPORT  DOSName,DOSBase;
  16. FROM DOSFiles       IMPORT  Open,Close,Write,CurrentDir,FileHandle,FileLock,
  17.                             ModeNewFile,ModeOldFile,Output,Input;
  18. FROM DOSExtensions  IMPORT  ProcessPtr,FileHandleBlock;
  19. FROM Libraries      IMPORT  OpenLibrary,CloseLibrary;
  20. FROM Ports          IMPORT  GetMsg,ReplyMsg,WaitPort,MessagePtr;
  21. FROM Workbench      IMPORT  WBStartup,WBArgPtr;
  22. FROM Interrupts     IMPORT  Forbid;
  23. FROM Strings        IMPORT  Length,Concat;
  24.  
  25.  
  26.  
  27. (* Replacement for findtask *)
  28.   CONST
  29.     D0 = 0; A1 = 9; A6 = 14;
  30.     JSRA6 = 4EAEH; SAVEA6 = 2F0EH; RESTOREA6 = 2C5FH;
  31.     FindTaskVec = -30-264;
  32.   VAR
  33.   (* My AMIGAX has a problem. Kludge the ExecBase right here *)
  34.     ExecBase[4] : ADDRESS;
  35.   (* Tasks.FindTask has a bug.  Use this instead *)
  36.   PROCEDURE FindTask(name: ADDRESS): ADDRESS;
  37.     (* find a task with a given name, or find oneself. *)
  38.   BEGIN
  39.     CODE(SAVEA6);
  40.     SETREG(A1, name);
  41.     SETREG(A6,ExecBase);
  42.     CODE(JSRA6,FindTaskVec);
  43.     CODE(RESTOREA6);
  44.     RETURN REGISTER(D0);
  45.   END FindTask;
  46.  
  47.  
  48.   TYPE
  49.    ProjectString = ARRAY [0..40] OF CHAR;
  50.  
  51.   VAR
  52.     myProcess   : ProcessPtr;
  53.     WBenchMsg   : POINTER TO WBStartup;
  54.     name        : POINTER TO ProjectString;
  55.     args        : WBArgPtr;
  56.     Window, tool: FileHandle;
  57.     oldLock     : FileLock;
  58.     fh          : POINTER TO FileHandleBlock;
  59.     wName,
  60.     ProjectName : ProjectString;
  61.     FROMwb      : BOOLEAN;
  62.     OrigConsTask: ADDRESS;
  63.  
  64. PROCEDURE EnteredFromWorkbench():BOOLEAN;
  65. (*
  66.    Sets up for either CLI or WB  RETURNS TRUE IF WB
  67. *)
  68.  
  69. BEGIN
  70.   myProcess := ProcessPtr(FindTask(NULL));
  71.  
  72.   IF myProcess^.prCLI <> NULL THEN     (* running from CLI : *)
  73.  
  74.     InitialInput := Input();
  75.     InitialOutput := Output();
  76.     FROMwb :=  FALSE;
  77.  
  78.   ELSE
  79.  
  80.     (* OTHERWISE running from Workbench : wait for the WB startup message *)
  81.  
  82.     WBenchMsg := WaitPort(ADR(myProcess^.prMsgPort));
  83.     WBenchMsg := GetMsg(ADR(myProcess^.prMsgPort));
  84.     args := WBenchMsg^.smArgList;
  85.     IF DOSBase = 0 THEN DOSBase := OpenLibrary(DOSName,0) END;
  86.     wName := "RAW:0/0/320/80/";
  87.  
  88. (*  don't bother with matching directories since we change to ram: soon
  89.     IF args <> NULL THEN
  90.       oldLock := CurrentDir(FileLock(args^.waLock))
  91.     END;
  92. *)
  93.     name := ADDRESS(args^.waName);
  94.     ProjectName := name^;
  95.     Concat(wName,ProjectName,wName);   (* window name = tool name *)
  96.     InitialOutput := Open(wName, ModeNewFile);
  97.     InitialInput := InitialOutput;
  98.     fh :=  ADDRESS(InitialOutput * 4);
  99.     myProcess^.prConsoleTask := fh^.fhType;
  100.       (* needed for window handlers *)
  101.     FROMwb := TRUE;
  102.   END;
  103.   RETURN FROMwb;
  104. END EnteredFromWorkbench;
  105.  
  106.  
  107. PROCEDURE CleanUpAndExit;
  108. BEGIN
  109.   IF FROMwb THEN (* was started from Workbench *)
  110.     Close(InitialInput);
  111.     IF DOSBase <> 0 THEN CloseLibrary(DOSBase) END;
  112.     Forbid;  (* very important - will fail without the forbid *)
  113.     ReplyMsg(MessagePtr(WBenchMsg)); (* free memory *)
  114.   ELSIF DOSBase <> 0 THEN CloseLibrary(DOSBase)  (* Close if from CLI *)
  115.   END;
  116. END CleanUpAndExit;
  117.  
  118. BEGIN
  119. END MyStart.
  120.  
  121.  
  122.