in __mkargv.o the es register is modified during the processing of the arguments and never restored. At the same time we can correct the missing program name the arg[0].
extern int psp;
extern int envseg;
void set_program_name(argv)
char \argv;
{
unsigned char *ptr;
int src,len;
__set_es(__envseg);
src=0;
while(__peek_es(src++)!=0)
{
while(__peek_es(src++)!=0);
}
src+=2; // step over 0x0001
len=0;
while (__peek_es(src+len++)!=0);
ptr=sbrk(len);
__argv[0]=ptr;
while(len--)
{
*ptr++=__peek_es(src++);
}
}
mkargv(argc, argv)
int argc;
char * __argv;
{
int length, i, argc=1, s=0;
unsigned char ptr, *p;
int es=__get_es();
set_program_name(__argv);
__set_es(psp); /* Pointer to the args */
....
set_es(es);
}
in __mkargv.o the es register is modified during the processing of the arguments and never restored. At the same time we can correct the missing program name the arg[0].
extern int psp; extern int envseg;
void set_program_name(argv) char \ argv; { unsigned char *ptr; int src,len;
}
mkargv(argc, argv) int argc; char * __argv; { int length, i, argc=1, s=0; unsigned char ptr, *p; int es=__get_es();
set_program_name(__argv);
__set_es(psp); /* Pointer to the args */ .... set_es(es); }