home *** CD-ROM | disk | FTP | other *** search
/ ST-Computer Leser 1998 October / STC_CD_10_1998.iso / BASE / PD_PATCH / START_PD.C < prev    next >
C/C++ Source or Header  |  1998-09-26  |  6KB  |  179 lines

  1. /*        START_PD     V 1.02
  2.         (c) 1997 by Dimitri Junker
  3.             Adenauerallee 30
  4.             52066 Aachen    */
  5.  
  6. /* Dieses Programm dient als Starter für PD. es ist nötig um beim Start
  7. aus PC heraus die Wahl zwischen PD_1.PRG (1-Monitor) und PD_2.PRG (2-Monitore)
  8. zu haben. Au₧erdem erlaubt es den Start von PD_i per AV_STARTPROG, und
  9. somit falls durch Shell und OS unterstützt den Start als Singeltask 
  10. Da PC als Debugger immer PD.PRG startet mu₧ diese Programm so hei₧en*/
  11.  
  12.  
  13. /* -------------------------------------------------------------------- */
  14. /*        Includes                                                        */
  15. /* -------------------------------------------------------------------- */
  16.  
  17. #include "easyfsel.h"
  18.  
  19. /* -------------------------------------------------------------------- */
  20. /*       Makros. & Konstanten                                           */
  21. /* -------------------------------------------------------------------- */
  22.  
  23. #define PRG_NAME    "PD      "
  24. #define        STASK                1
  25. #define        ZWEIMON                2
  26. #define        AV_PROTOKOLL        (0x4700)
  27. #define        AV_STARTPROG        (0x4722)
  28.  
  29. /* -------------------------------------------------------------------- */
  30. /*         lokale Funktionsprototypen                                        */
  31. /* -------------------------------------------------------------------- */
  32.  
  33. int setup(int flags);
  34. void send_av_stpr(int z_id,int my_id,char *prg_name,char *cmd,int id);
  35. void send_av_prot(int z_id,int my_id,char *prg_name,int flags);
  36. int Mxmask (void);
  37.  
  38. /* -------------------------------------------------------------------- */
  39. /*        Funktionen                                                        */
  40. /* -------------------------------------------------------------------- */
  41.  
  42.  
  43.  
  44.  
  45. int main(int argc, const char *argv[])
  46. {    int flags=-1,i,my_id,ab=1,mxmask;
  47.     char *pfad,*cmd,pd_aname[9];
  48.     long kb;
  49.     FILE *file;
  50.     if(argc<2)
  51.     {    form_alert(1,"[3][Dieses Programm ist da um von|PC aufgerufen zu werden][Schade]");
  52.         exit(0);
  53.     }
  54.     kb=Kbshift(-1);
  55.     my_id=appl_init();
  56.     send_av_prot(0,my_id,PRG_NAME,0);
  57.     if((file=fopen("START_PD.INF","rb"))!=NULL)
  58.     {    fread(&flags,sizeof(flags),1,file);
  59.         fclose(file);
  60.     }
  61.     if((kb&8l)==8l || flags==-1)    /* wenn Alternate oder entsprechendes Flag*/
  62.         flags=setup(flags);
  63.     if((mxmask=Mxmask())==0)
  64.         pfad=Malloc(430);
  65.     else
  66.         pfad=Mxalloc(430,mxmask&0x2B);
  67.     cmd=&pfad[300];
  68.  
  69.     get_akt_path(pfad);
  70.     if((flags&ZWEIMON)==ZWEIMON)
  71.     {    build_filename(pfad,pfad,"PD_2.PRG");
  72.         strcpy(pd_aname,"PD_2    ");
  73.     }
  74.     else
  75.     {    build_filename(pfad,pfad,"PD_1.PRG");
  76.         strcpy(pd_aname,"PD_1    ");
  77.     }
  78.     *cmd='\0';
  79. /* Falls PD mit gedrückter Shift-Taste (PC) gestartet wurde, so hat sich PC
  80.     beendet und mu₧ später wieder gestartet werden, dies geschiet normalerweise
  81.     dadurch, da₧ PD in der Komandozeile ein entsprechender Befehl übergeben
  82.     wird, dies klappt hier aber nicht mehr, deshalb wartet dieses PRG
  83.     darauf, da₧ sich PD beendet und startet dann PC neu    */
  84.     if(strstr(argv[1],"-X="))
  85.         ab=2;
  86.     for(i=ab;i<argc;i++)
  87.     {    strcat(cmd," ");
  88.         strcat(cmd,argv[i]);
  89.     }
  90.     *cmd=(char)(strlen(cmd)-1);
  91.     if((flags&STASK)==STASK)
  92.     {    send_av_stpr(0,my_id,pfad,&cmd[1],'PD');
  93.         if(ab==2)
  94.         {    evnt_timer(5000,0);        /* nach 5s sollte PD gestartet sein*/
  95.             while(appl_find(pd_aname)>-1);    /* warten bis nicht mehr vorhanden    */
  96.         }
  97.     }
  98.     else
  99.         Pexec(0,pfad,cmd,NULL);        /* hier braucht nicht gewartet zu werden, da Pexec erst zurückkehrt wenn PRG beendet*/
  100.     if(ab==2)    /* PC wieder starten    */
  101.         shel_write(1,1,0,&strstr(argv[1],"-X=")[3],"");
  102.     appl_exit();
  103.     return(0);
  104. }
  105. /* ggf Setup erfragen    */
  106. int setup(int flags)
  107. {    int flags_neu;
  108.     FILE *file;
  109.     flags_neu =(form_alert((flags&STASK)/STASK+1,"[2][Soll PD im Singeltaskmodus|ausgeführt werden?][Nein| Ja ]")-1)*STASK;
  110.     flags_neu|=(form_alert((flags&ZWEIMON)/ZWEIMON+1,"[2][Soll PD im Zweimonitormodus|ausgeführt werden?][Nein| Ja ]")-1)*ZWEIMON;
  111.     if(form_alert(2,"[2][Sollen diese Einstellungen|abgespeichert werden?][Nein| Ja ]")==2)
  112.     {    if((file=fopen("START_PD.INF","wb"))!=NULL)
  113.         {    fwrite(&flags_neu,sizeof(flags_neu),1,file);
  114.             fclose(file);
  115.         }
  116.     }
  117.     return(flags_neu);
  118. }
  119. /*    Startet Programm über AV-Server, falls Shell und OS es unterstützen
  120.     wird es dann im Singeltask gestartet, dazu mu₧ es natürlich entsprechend
  121.     angemeldet sein.    */
  122. void send_av_stpr(int z_id,int my_id,char *prg_name,char *cmd,int id)
  123. {    int buffer[8]={AV_STARTPROG,0,0};
  124.     if(z_id>-1)
  125.     {    buffer[1]=my_id;
  126.         *((char **)&buffer[3])=prg_name;
  127.         *((char **)&buffer[5])=cmd;
  128.         buffer[7]=id;
  129.         appl_write(z_id,16,buffer);
  130.     }
  131. }            
  132. /*    Anmeldung bei AV-Server    */
  133. void send_av_prot(int z_id,int my_id,char *prg_name,int flags)
  134. {    int buffer[8]={AV_PROTOKOLL,0,0};
  135.     if(z_id>-1)
  136.     {    buffer[1]=my_id;
  137.         buffer[3]=flags;
  138.         buffer[4]=buffer[5]=0;
  139.         *((char **)&buffer[6])=prg_name;
  140.         appl_write(z_id,16,buffer);
  141.     }
  142. }
  143. /* ermittelt, ob es Mxalloc gibt, und welche Modi diese unterstützt */
  144. int Mxmask (void)
  145. {
  146.     void *svStack;      /* Supervisorstack */
  147.     long sRAM, sRAMg;   /* ST-RAM          */
  148.     long aRAM, aRAMg;   /* Alternate RAM   */
  149.  
  150.     /*
  151.     // Beispieltabelle moeglicher Werte:
  152.     //           | newfashion  | oldfashion
  153.     // sRAM aRAM | sRAMg aRAMg | sRAMg aRAMg
  154.     //   1    0  |   1     0   |   1     1
  155.     //   0    2  |   0     2   |   2     2
  156.     //   1    2  |   1     2   |   3     3
  157.     */
  158.  
  159.     svStack = (void *) Super( 0);  /* unterbinde Taskwechsel */
  160.  
  161.     sRAM  = (long) Mxalloc( -1, 0);
  162.     sRAMg = (long) Mxalloc( -1, 0x40); /* im Fehlerfall Mxalloc( -1, 3) */
  163.     aRAM  = (long) Mxalloc( -1, 1);
  164.     aRAMg = (long) Mxalloc( -1, 0x41); /* im Fehlerfall Mxalloc( -1, 3) */
  165.  
  166.     Super( svStack);  /* erlaube Taskwechsel */
  167.  
  168.     if (sRAM == -32)
  169.         return 0x0000;  /* Mxalloc() ist nicht implementiert */
  170.  
  171.     else if ( ((sRAM + aRAM) == sRAMg) && ((sRAM + aRAM) == aRAMg) )
  172.         return 0x0003;  /* oldfashion Mxalloc() */
  173.  
  174.     else
  175.         return 0xFFFF;
  176.  
  177. } /* Mxmask */
  178.  
  179.