program LOADER;

{ © by QXC & VWP! All Rights Reserved! Siehe "Programmierung.Guide" und
  "Grammophon.eff.p" für ausführliche Copyright-Infos }

Uses ExecIO;

type Image=ptr;
type Window=ptr;
type Screen=ptr;
type IntuiText=ptr;

{$incl "libraries/dos.h","exec/memory.h"};
{$path "WaveTracer/","RAM:include/";incl "WTIncl.mod","ModIncl.mod"}

{ WTIncl.mod  - Alle wichtigen Strukturen und Konstanten
  ModIncl.mod - Alle für das Modulehandling wichtigen Proceduren, Strukturen
                und Variablendefinitionen }

var Addr1,Addr8,l,m                             :long;
var Data8                                       :^byte;
var Data1                                       :^long;
var i                                           :integer;
var MemLS                                       :long;
var ChCnt                                       :byte;



procedure CHECKSIZE;

begin
   with MyWTStdMsg^ do begin
      l:=DosSeek(ActFHandle,0,OFFSET_END);
      MemLS:=DosSeek(ActFHandle,0,OFFSET_BEGINNING);
      Flags:=0;
      WTMsgPrc^:=MsgPrc(WTM_CHANNELREQ,'Welche Kanäle enthält das RAW-Sample?',
                        '','','','',$3F,ActiveChannels,0,0,0,NIL);
      MESSAGEHANDLE;
                                         { WaveTracer interne Funktion für einen
                                           Kanal-Requester, das Ergebnis steht bei
                                           Erfolg in PRC_Long1 }
      if WTMsgPrc^.PRC_Long1=-1 then ActiveChannels:=1 else ActiveChannels:=WTMsgPrc^.PRC_Long1;
      ChCnt:=0;
      l:=1;   for i:=1 to 6 do begin
         if not (ActiveChannels and l=0) then ChCnt:=ChCnt+1;
      l:=l*2; end;
      if ActiveChannels in [CH_CENTER,CH_LEFT,CH_RIGHT] then ActiveMode:=MD_MONO
      else if ActiveChannels<=CH_LEFT+CH_RIGHT then ActiveMode:=MD_STEREO
      else if ActiveChannels<=CH_LEFT+CH_RIGHT+CH_CENTER then ActiveMode:=MD_3CH;
      if not (ActiveChannels and CH_SLEFT=0) then ActiveMode:=MD_SURROUND;
      if not (ActiveChannels and CH_SRIGHT=0) then ActiveMode:=MD_AC3_SUB;
      if not (ActiveChannels and CH_SUB=0) then Activemode:=MD_AC3;
      MemLS:=MemLS div ChCnt;
                                         { Anhand der vom User angegebenen
                                           Kanäle feststellen, welcher Sound-
                                           mode vorliegt }
      Flags:=MDE_READY;
   end;
end;



procedure LOADRAW;

begin
   with MyWTstdMsg^ do begin
      m:=1;
      for i:=1 to 6 do begin
         if not (ActiveChannels and m=0) and (MemA24[i]<>0) then begin
            l:=DosRead(ActFHandle,ptr(MemA24[i]+MemL24-MemLS),MemLS);
            if l<MemLS then begin
               Flags:=0;
               WTMsgPrc^:=MsgPrc(WTM_TASKREQ,'Kann Daten nicht laden!','Operation abgebrochen!',
                                 '','OK','',0,0,0,0,0,NIL);
               MESSAGEHANDLE;            { Fehler aufgetreten: Fehlermeldung ab-
                                           geben und mit MDE_ERROR beenden }
               Flags:=MDE_ERROR;
               exit;
            end;
            Addr1:=MemA24[i];
            Addr8:=MemA24[i]+MemL24-MemLS;
            repeat
               Data8:=ptr(Addr8); Addr8:=Addr8+1;
               Data1:=ptr(Addr1); Addr1:=Addr1+4;
               Data1^:=(Data8^-127)*65535;
            until Addr8>=MemA24[i]+MemL24;
            PlayL24:=Addr1-MemA24[i];    { Geladene 8Bit-Daten werden in das
                                           24Bit Longword-Format des
                                           WaveTracer umgewandelt }
         end;
         m:=m*2;
      end;
      Flags:=MDE_READY;
   end;
end;


begin
   OpenLib(DosBase,'dos.library',0);
   if CREATEPORTS(PORT_LOADER) then begin  { Eigenen Port anlegen }
      with MyWTStdMsg^ do if Version=VERSION_LOADER then begin
         if Flags=MDC_ASKREADY then begin  { Lademodul wurde neu selektiert }
            Flags:=0;
            WTMsgPrc^:=MsgPrc(WTM_TASKREQ,'8 Bit AC3 PC-/MacIntosh®-RAW Lademodul',
                              COPYRIGHT,'','OK','',0,0,0,0,0,NIL);
            MESSAGEHANDLE;                 { Copyright-Info ausgeben }
            Flags:=MDE_READY;
         end else if ActFHandle<>0 then begin
            { FileHandle auf die bereits geöffnete Datei findet sich in
              MyWTStdMsg^.ActFHandle; sie darf nicht mit DosClose geschlossen
              werden, das erledigt der WaveTracer }
            if Flags=MDC_DEFINEIT then begin
                                           { Sample wurde selektiert: der
                                             WaveTracer erwartet jetzt die An-
                                             gaben über Länge, Kanäle und Sound-
                                             mode }
               CHECKSIZE;
               ActWaveOp^.Operator[1]:=MemLS;
            end else if Flags=MDC_DOIT then begin
                                           { Funktionsgenerator wurde mit "OK" ver-
                                             lassen, das Sample soll mit den ange-
                                             gebenen Werten für Länge, Kanälke und
                                             Soundmode geladen werden }
               MemLS:=ActWaveOp^.Operator[1];
               LOADRAW;
            end;
         end else Flags:=MDE_ERROR;        { Unbekanntes Kommando vom WaveTracer }
      end else Flags:=MDE_WRONG_MODULEVERSION;
                                           { Unbekannte Schnittstellen-Version }
      MESSAGEHANDLE;
      RemPort(MyPort);                     { Erfolgs-Flag (MDE_...) absenden
                                             und eigenen Port entfernen }
   end;
   CloseLib(DosBase);
end.
