/*                     DmaSwitch 2.0

    Written by Andreas Jung in May 1988

    Anschrift:   Andreas Jung
                 Klosterstraße 21
                 6602 Dudweiler

    Beschreibung: Das Programm funktioniert genau wie FSwitch, nur das
    die BildschirmDMA abgeschaltet wird. Ideal um den Bildschirm fremden
    Blicken zu verschließen.
                                                                          */

#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[]="DMASwitch";
   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("DMA-Switch 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("DMA-Switch on\n");

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





void Prog()

 {
   long i;
   char *keypoint  = 0xbfec01;
label: i=1;
      #asm
      move.w #$8380,$dff096
      #endasm
   for (i=0;i<40000;i++);
   while (*keypoint != 55);
      #asm
      move.w #$180,$dff096
      #endasm
   for (i=0;i<40000;i++);
   while (*keypoint != 55);
   goto label;
   }

void Finish()
{}
