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 >
Wrap
C/C++ Source or Header
|
1998-09-26
|
6KB
|
179 lines
/* START_PD V 1.02
(c) 1997 by Dimitri Junker
Adenauerallee 30
52066 Aachen */
/* Dieses Programm dient als Starter für PD. es ist nötig um beim Start
aus PC heraus die Wahl zwischen PD_1.PRG (1-Monitor) und PD_2.PRG (2-Monitore)
zu haben. Au₧erdem erlaubt es den Start von PD_i per AV_STARTPROG, und
somit falls durch Shell und OS unterstützt den Start als Singeltask
Da PC als Debugger immer PD.PRG startet mu₧ diese Programm so hei₧en*/
/* -------------------------------------------------------------------- */
/* Includes */
/* -------------------------------------------------------------------- */
#include "easyfsel.h"
/* -------------------------------------------------------------------- */
/* Makros. & Konstanten */
/* -------------------------------------------------------------------- */
#define PRG_NAME "PD "
#define STASK 1
#define ZWEIMON 2
#define AV_PROTOKOLL (0x4700)
#define AV_STARTPROG (0x4722)
/* -------------------------------------------------------------------- */
/* lokale Funktionsprototypen */
/* -------------------------------------------------------------------- */
int setup(int flags);
void send_av_stpr(int z_id,int my_id,char *prg_name,char *cmd,int id);
void send_av_prot(int z_id,int my_id,char *prg_name,int flags);
int Mxmask (void);
/* -------------------------------------------------------------------- */
/* Funktionen */
/* -------------------------------------------------------------------- */
int main(int argc, const char *argv[])
{ int flags=-1,i,my_id,ab=1,mxmask;
char *pfad,*cmd,pd_aname[9];
long kb;
FILE *file;
if(argc<2)
{ form_alert(1,"[3][Dieses Programm ist da um von|PC aufgerufen zu werden][Schade]");
exit(0);
}
kb=Kbshift(-1);
my_id=appl_init();
send_av_prot(0,my_id,PRG_NAME,0);
if((file=fopen("START_PD.INF","rb"))!=NULL)
{ fread(&flags,sizeof(flags),1,file);
fclose(file);
}
if((kb&8l)==8l || flags==-1) /* wenn Alternate oder entsprechendes Flag*/
flags=setup(flags);
if((mxmask=Mxmask())==0)
pfad=Malloc(430);
else
pfad=Mxalloc(430,mxmask&0x2B);
cmd=&pfad[300];
get_akt_path(pfad);
if((flags&ZWEIMON)==ZWEIMON)
{ build_filename(pfad,pfad,"PD_2.PRG");
strcpy(pd_aname,"PD_2 ");
}
else
{ build_filename(pfad,pfad,"PD_1.PRG");
strcpy(pd_aname,"PD_1 ");
}
*cmd='\0';
/* Falls PD mit gedrückter Shift-Taste (PC) gestartet wurde, so hat sich PC
beendet und mu₧ später wieder gestartet werden, dies geschiet normalerweise
dadurch, da₧ PD in der Komandozeile ein entsprechender Befehl übergeben
wird, dies klappt hier aber nicht mehr, deshalb wartet dieses PRG
darauf, da₧ sich PD beendet und startet dann PC neu */
if(strstr(argv[1],"-X="))
ab=2;
for(i=ab;i<argc;i++)
{ strcat(cmd," ");
strcat(cmd,argv[i]);
}
*cmd=(char)(strlen(cmd)-1);
if((flags&STASK)==STASK)
{ send_av_stpr(0,my_id,pfad,&cmd[1],'PD');
if(ab==2)
{ evnt_timer(5000,0); /* nach 5s sollte PD gestartet sein*/
while(appl_find(pd_aname)>-1); /* warten bis nicht mehr vorhanden */
}
}
else
Pexec(0,pfad,cmd,NULL); /* hier braucht nicht gewartet zu werden, da Pexec erst zurückkehrt wenn PRG beendet*/
if(ab==2) /* PC wieder starten */
shel_write(1,1,0,&strstr(argv[1],"-X=")[3],"");
appl_exit();
return(0);
}
/* ggf Setup erfragen */
int setup(int flags)
{ int flags_neu;
FILE *file;
flags_neu =(form_alert((flags&STASK)/STASK+1,"[2][Soll PD im Singeltaskmodus|ausgeführt werden?][Nein| Ja ]")-1)*STASK;
flags_neu|=(form_alert((flags&ZWEIMON)/ZWEIMON+1,"[2][Soll PD im Zweimonitormodus|ausgeführt werden?][Nein| Ja ]")-1)*ZWEIMON;
if(form_alert(2,"[2][Sollen diese Einstellungen|abgespeichert werden?][Nein| Ja ]")==2)
{ if((file=fopen("START_PD.INF","wb"))!=NULL)
{ fwrite(&flags_neu,sizeof(flags_neu),1,file);
fclose(file);
}
}
return(flags_neu);
}
/* Startet Programm über AV-Server, falls Shell und OS es unterstützen
wird es dann im Singeltask gestartet, dazu mu₧ es natürlich entsprechend
angemeldet sein. */
void send_av_stpr(int z_id,int my_id,char *prg_name,char *cmd,int id)
{ int buffer[8]={AV_STARTPROG,0,0};
if(z_id>-1)
{ buffer[1]=my_id;
*((char **)&buffer[3])=prg_name;
*((char **)&buffer[5])=cmd;
buffer[7]=id;
appl_write(z_id,16,buffer);
}
}
/* Anmeldung bei AV-Server */
void send_av_prot(int z_id,int my_id,char *prg_name,int flags)
{ int buffer[8]={AV_PROTOKOLL,0,0};
if(z_id>-1)
{ buffer[1]=my_id;
buffer[3]=flags;
buffer[4]=buffer[5]=0;
*((char **)&buffer[6])=prg_name;
appl_write(z_id,16,buffer);
}
}
/* ermittelt, ob es Mxalloc gibt, und welche Modi diese unterstützt */
int Mxmask (void)
{
void *svStack; /* Supervisorstack */
long sRAM, sRAMg; /* ST-RAM */
long aRAM, aRAMg; /* Alternate RAM */
/*
// Beispieltabelle moeglicher Werte:
// | newfashion | oldfashion
// sRAM aRAM | sRAMg aRAMg | sRAMg aRAMg
// 1 0 | 1 0 | 1 1
// 0 2 | 0 2 | 2 2
// 1 2 | 1 2 | 3 3
*/
svStack = (void *) Super( 0); /* unterbinde Taskwechsel */
sRAM = (long) Mxalloc( -1, 0);
sRAMg = (long) Mxalloc( -1, 0x40); /* im Fehlerfall Mxalloc( -1, 3) */
aRAM = (long) Mxalloc( -1, 1);
aRAMg = (long) Mxalloc( -1, 0x41); /* im Fehlerfall Mxalloc( -1, 3) */
Super( svStack); /* erlaube Taskwechsel */
if (sRAM == -32)
return 0x0000; /* Mxalloc() ist nicht implementiert */
else if ( ((sRAM + aRAM) == sRAMg) && ((sRAM + aRAM) == aRAMg) )
return 0x0003; /* oldfashion Mxalloc() */
else
return 0xFFFF;
} /* Mxmask */