(* *****************************************************************
** File    : dsp_tools.pas
** Created : 12.02.99
** Author  : 
**
** Macro for FoldMaster
**
** **************************************************************-**)
PROGRAM dsp_tools;

(*{{{  Konstanten *)
{ Konstanten }
const
   DSP_C   = 'DSP C-Compiler';
   DSP_ASM = 'DSP Assembler';
   DSP_LNK = 'DSP Linker';
(*}}}*)

(*{{{  globale Variablen*)
{ globale Variablen
  bleiben solange bestehen, solange das
  Modul geladen ist. Diese Variablen dienen dazu Daten
  zu speichern, die von einem zum anderen Aufruf erhalten
  bleiben sollen }
var
     dsp_instpath : string;
     TransferString : String;
     ErrorFile      : String;
     ErrorMessage   : String;
     ErrorPosition  : Integer;
     ErrorLine      : Integer;
     Line           : Integer;
(*}}}*)

(*{{{  Transfermacro fuer DSP- C- Compiler*)
{ Transfermacro fuer DSP- GNU Compiler  }
procedure TxDspC(s : string);
var p1,p2 : integer;
    code  : Integer;
begin
   { Es kommt filename : Zeilennummer : Text
     nur wenn Zeilennummer gueltig ist, handelt es sich
     um eine gueltige Fehlermeldung.
     Andere Zeilen muessen  so ausgegeben werden. }
   p1 := pos(':', s);
   if (p1 = 0) then exit;
   p2 := posx(':', s, p1+1);
   if (p2 > p1) then begin
      ErrorFile := Copy(s, 1, p1-1);
      Writeln(ErrorFile);
      Val(Copy(s, p1+1, p2-p1), ErrorLine, code);
      if (code = 0) then begin
         MessageAddMessage(DSP_C,'',s,1,1);
      end else begin
         ErrorMessage := Copy(s, p2+1, 255);
         Writeln(ErrorMessage);
         TransferString := '';
         swrite(TransferString,
                FileNameGetNameExt(ErrorFile),
                '(', ErrorLine, '):',
                ErrorMessage);

         MessageAddMessage(DSP_C, ErrorFile,
                           TransferString,
                           ErrorLine, 1);
      end;
   end else begin
      MessageAddMessage(DSP_C, '', s, 1,1);
   end;
end;
(*}}}*)
(*{{{  Transfermacro fuer DSP- Assembler *)
{ Transfermacro fuer DSP- Assembler }
procedure txDspAsm(s : string);
begin
   MessageAddGenMessage (DSP_ASM, '**** %# [%f %l]: %w --- %t', s);
end;
(*}}}*)

(*{{{  define_c_compiler*)
{ define_c_compiler
  definiert den C- Compiler als Tool
}
procedure define_c_compiler;
begin
   ToolDefine       (DSP_C, concat(dsp_instpath, '\BIN\G563c.exe'),
                     '$DRIVEDIR($EDNAME)',
                     '$(DSP_C_OPT) $NAMEEXT($EDNAME) $(DSP_C_OPATH)');
   ToolDefineType   (DSP_C, '.c', '.cln', 'C/C++', 2);
   ToolDefineMode   (DSP_C, 'DSP_TOOLS/txdspc', 3);
   ToolDefineConnect(DSP_C, '', 0);
   ToolDefineOptions(DSP_C, 0, 0);
end;
(*}}}*)
(*{{{  define_assembler*)
{ define_assembler
}
procedure define_assembler;
begin
   ToolDefine       (DSP_ASM, concat(dsp_instpath, '\BIN\asm56300.exe'),
                     '$DRIVEDIR($EDNAME)',
                     '$(DSP_ASM_OPT) $NAMEEXT($EDNAME)');
   ToolDefineType   (DSP_ASM, '.asm', '.cln', 'MOTASM', 2);
   ToolDefineMode   (DSP_ASM, '**** %# [%f %l]: %w --- %t', 6);
   ToolDefineConnect(DSP_ASM, '', 0);
   ToolDefineOptions(DSP_ASM, 0, 0);
end;
(*}}}*)
(*{{{  define_linker*)
{ define_linker
  definiert den Linker
}
procedure define_linker;
begin
   ToolDefine       (DSP_LNK, concat(dsp_instpath, '\BIN\DspLnk.exe'),
                     '$DRIVEDIR($EDNAME)',
                     '$(DSP_LNK_OPT)');
   ToolDefineType   (DSP_LNK, '.ctl', '.cld', 'Plain', 2);
   ToolDefineMode   (DSP_LNK, '', 2);
   ToolDefineConnect(DSP_LNK, '', 0);
   ToolDefineOptions(DSP_LNK, 0, 0);
end;
(*}}}*)

(*{{{  procedure insert_local_variables;*)
{ procedure to insert local variables into the project file
  providing a default command line to the tools
}
procedure insert_local_variables;
begin
   InsertVariable('USE_COMPILER','DSP');
   InsertVariable('OBJPATH',     'objects');
   InsertVariable('DSP_ASM_OPT', '-B$(OBJPATH)\$NAME($EDNAME).cln  -G -L -Os,cre');
   InsertVariable('DSP_C_OPT',   concat('-c -I', GetVarValue('DSP_INSTPATH'), '\include -Wall -g -O -mauto-init -mp-mem-switchtable'));
   InsertVariable('DSP_C_OPATH', '-o $(OBJPATH)\$NAME($EDNAME).cln');
   InsertVariable('DSP_LNK_OPT', '-B$TARGET.cld -M$TARGET.map -c -G -R$TARGET.ctl -Flnkfiles.txt -Llib563cy.clb');
end;
(*}}}*)

(*{{{  set_env_values*)
{ set_env_values
  Unterprogramm traegt die notwendigen Umgebungsvariablen ein
}
procedure set_env_values;
var i : integer;
begin
   { die Umgebungsvariable DSPLOC zeigt dem Compiler an, wo die
     unterschiedlichen tools zu finden sind. Dabei erwartet der
     Compiler die Tools im Unterverzeichnis dsp\bin zu dieser
     Umgebungsvariable. Dem Inhaöt von Dsp_Instpath muss
     noch DSP abgeschnitten werden }
   if (GetEnvValue('DSPLOC') = '') then begin
      { Variable noch nicht global gesetzt }
      strlower(dsp_instpath);
      i := pos('\dsp',dsp_instpath);
      if (i > 0) then delete(dsp_instpath, i, 255);
      SetEnvValue ('DSPLOC', dsp_instpath);
   end;
end;
(*}}}*)

BEGIN
   (*{{{  Installationspfad bestimmen*)
   { ----------------------------------------------------- }
   { Installationspfad bestimmen }
   { ----------------------------------------------------- }
   { pruefen ob variable MRI_CPP_INSTPATH vorhanden ist wenn nich,
     dann nach dem Instalations verzeichnis suchen lassen }
   dsp_instpath := GetVarValue('DSP_INSTPATH');
   if (dsp_instpath = '') then begin
      { Nach Pfad suchen }
      Beep;
      if (DirectoryInput ('DSP Tools- Installations Pfad', dsp_instpath)) then begin
         SetGlobalVar('DSP_INSTPATH', dsp_instpath);
      end;
   end;
   (*}}}*)
   define_c_compiler;
   define_assembler;
   define_linker;
   MacroMenuAdd('insert_local_variables');
   (*--------------------------------------------------------*)
   (* Umgebungsvariablen setzen, diese sind nur gueltig innerhalb
      von FoldMaster und in Programmen, die aus FoldMaster heraus
      aufgerufen werden. *)
   set_env_values;
END.

