/*                       FilterSwitch 2.0

             Written by Andreas Jung in May 1988

   Anschrift:
                Andreas Jung
              Klosterstraße  21
           D-6602 Dudweiler/Germany

   Mit FSwutch läßt sich der Tiefpaßfilter des Amiga bequem kontrollieren.
   Das Programm kann sowohl von der Workbench als auch von CLI aus
   gestartet werden. Beim Start von der Workbench brauchen Sie nur das
   Icon anzuklicken. Der Start vom CLI erfolgt durch die Eingabe von
   '1> fswitch'. Nach dem Start kann der Tiefpaßfilter durch drücken der
   linken Alt-Taste an- und ausgeschaltet werden. Die Power-LED geht dann
   ebenfalls an und aus, da Sie mit dem Tiefpaßfilter gekoppelt ist.

   Um FSwitch zu beenden müssen Sie genauso vorgehen wie beim Starten des
   Programmes.

   Compiling:  cc +l filter.c
               ln filter.o -lc      (Atzek 3.4a)                          */


  

#include <functions.h>
#include <exec/types.h>
#include <exec/tasks.h>
#include <exec/memory.h>

#define SIZE_STACK 1000

main()
   {
   void Prog(),Finish();
   APTR fscode;
   static char TaskName[]="FSwitch";
   register APTR c1,c2;
   long st;
   char *filtpoint=0xbfe001;

   struct alltask {
   struct Task tc;
   char Name[sizeof(TaskName)],Stack[SIZE_STACK];
   } *ftask;


   st=FindTask(TaskName);                 /* Existiert Task bereits ??? */
   if (st != 0)
      {
        RemTask(st);
        printf("FilterSwitch switched off !!!\n");
        FreeMem(st,2000);
        *filtpoint=*filtpoint&253;
        exit(0);
      }

   ftask=AllocMem(2000,MEMF_PUBLIC|MEMF_CLEAR);   /* Speicher reservieren */
   if(ftask==0)
      {
        printf("No memory free !\n");
        exit(0);
      }

   fscode=AllocMem((ULONG)Finish-(ULONG)Prog+50,MEMF_PUBLIC);
   if(fscode==0)
      {
        FreeMem(ftask,(ULONG)sizeof(*ftask));
        printf("No memory free !\n");
        exit(0);
      }

   strcpy(ftask->Name,TaskName);                     /* Task installieren */

   ftask->tc.tc_SPLower=ftask->Stack;
   ftask->tc.tc_SPUpper=ftask->Stack+SIZE_STACK;
   ftask->tc.tc_SPReg  =ftask->tc.tc_SPUpper;
   ftask->tc.tc_Node.ln_Type=NT_TASK;
   ftask->tc.tc_Node.ln_Name=ftask->Name;

   for(c1=Prog,c2=fscode;c1<=Finish;*c2++=*c1++);

   printf("FilterSwitch by Andreas Jung, YET-electronic 1988");
   printf("\nPress left Alt-key to switch Low-Filter on/off");
   printf("\nThis task can be stopped by starting the task again !!!\n");

   AddTask(ftask,fscode,0L);   /* Task freigeben */
   SetTaskPri(ftask,-125);     /* Priorität erniedrigen */
   }





void Prog()

 {
   long i;
   char *filtpoint = 0xbfe001;        /* Pointer auf Low-Passfilter */
   char *keypoint  = 0xbfec01;

label: *filtpoint = *filtpoint | 2;   /* Disable Filter             */
   for (i=0;i<40000;i++);             /* Verzögerung                */
   while (*keypoint != 55);           /* Abfrage linke Alt-Taste gedrückt  */
   *filtpoint = *filtpoint & 253;     /* Enable Filter              */
   for (i=0;i<40000;i++);
   while (*keypoint != 55);
   goto label;                        /* Endlosschleife             */
   }

void Finish()
{
}
