Subversion Repositories SvarDOS

Rev

Rev 1863 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1863 Rev 1877
Line 30... Line 30...
30
 
30
 
31
#include "rmodinit.h"
31
#include "rmodinit.h"
32
 
32
 
33
 
33
 
34
/* returns far pointer to rmod's settings block on success */
34
/* returns far pointer to rmod's settings block on success */
35
struct rmod_props far *rmod_install(unsigned short envsize, unsigned char *rmodcore, unsigned short rmodcore_len) {
35
struct rmod_props far *rmod_install(unsigned short envsize, unsigned char *rmodcore, unsigned short rmodcore_len, unsigned char *cfgflags) {
36
  char far *myptr, far *mcb;
36
  char far *myptr, far *mcb;
37
  unsigned short far *owner;
37
  unsigned short far *owner;
38
  const unsigned short sizeof_rmodandprops_paras = (0x100 + rmodcore_len + sizeof(struct rmod_props) + 15) / 16;
38
  const unsigned short sizeof_rmodandprops_paras = (0x100 + rmodcore_len + sizeof(struct rmod_props) + 15) / 16;
39
  unsigned short rmodseg = 0xffff;
39
  unsigned short rmodseg = 0xffff;
40
  unsigned short envseg, origenvseg;
40
  unsigned short envseg, origenvseg;
Line 44... Line 44...
44
  envseg = *((unsigned short *)0x2c);
44
  envseg = *((unsigned short *)0x2c);
45
  origenvseg = envseg;
45
  origenvseg = envseg;
46
 
46
 
47
  /* printf("original (PSP) env buffer at %04X\r\n", envseg); */
47
  /* printf("original (PSP) env buffer at %04X\r\n", envseg); */
48
 
48
 
-
 
49
  /* if my environment seg was zeroed, then I am the init process (under DR-DOS and MS-DOS 5 at least) */
-
 
50
  if (envseg == 0) {
-
 
51
    *cfgflags |= FLAG_PERMANENT; /* imply /P so AUTOEXEC.BAT is executed */
-
 
52
 
49
  /* if envseg is zero, then enforce our own one (MSDOS 5 does not provide a default env) */
53
    /* make sure to enforce our own env (MSDOS 5 does not provide a default env) */
50
  if ((envseg == 0) && (envsize == 0)) envsize = 256;
54
    if (envsize == 0) envsize = 256;
-
 
55
  }
51
 
56
 
52
  /* if custom envsize requested, convert it to number of paragraphs */
57
  /* if custom envsize requested, convert it to number of paragraphs */
53
  if (envsize != 0) {
58
  if (envsize != 0) {
54
    envsize += 15;
59
    envsize += 15;
55
    envsize /= 16;
60
    envsize /= 16;
Line 173... Line 178...
173
  mcb = MK_FP(envseg - 1, 0);
178
  mcb = MK_FP(envseg - 1, 0);
174
  owner = (void far *)(mcb + 1);
179
  owner = (void far *)(mcb + 1);
175
  *owner = rmodseg;
180
  *owner = rmodseg;
176
  _fmemcpy(mcb + 8, "SVARENV", 8);
181
  _fmemcpy(mcb + 8, "SVARENV", 8);
177
 
182
 
178
  /* if env block is newly allocated, fill it with a few NULLs */
183
  /* if env block is newly allocated, then:
-
 
184
   *  if an original env is present then copy it
-
 
185
   *  otherwise fill the new env with a few NULs */
179
  if (envsize != 0) {
186
  if (envsize != 0) {
180
    owner = MK_FP(envseg, 0);
187
    owner = MK_FP(envseg, 0);
181
    owner[0] = 0;
188
    owner[0] = 0;
182
    owner[1] = 0;
189
    owner[1] = 0;
-
 
190
 
-
 
191
    /* do we have an original environment? if yes copy it (envsize is a number of paragraphs) */
-
 
192
    if (origenvseg != 0) _fmemcpy(owner, MK_FP(origenvseg, 0), envsize * 16);
183
  }
193
  }
184
 
194
 
185
  /* set CTRL+BREAK and CRITERR handlers to rmod */
195
  /* set CTRL+BREAK and CRITERR handlers to rmod */
186
  _asm {
196
  _asm {
187
    push ax
197
    push ax
Line 213... Line 223...
213
 
223
 
214
  /* prepare result (rmod props) */
224
  /* prepare result (rmod props) */
215
  res = MK_FP(rmodseg, 0x100 + rmodcore_len);
225
  res = MK_FP(rmodseg, 0x100 + rmodcore_len);
216
  _fmemset(res, 0, sizeof(*res));  /* zero out */
226
  _fmemset(res, 0, sizeof(*res));  /* zero out */
217
  res->rmodseg = rmodseg;          /* rmod segment */
227
  res->rmodseg = rmodseg;          /* rmod segment */
218
  res->origenvseg = origenvseg;    /* original environment segment */
-
 
219
 
228
 
220
  /* write env segment to rmod's PSP */
229
  /* write env segment to rmod's PSP */
221
  owner = MK_FP(rmodseg, RMOD_OFFSET_ENVSEG);
230
  owner = MK_FP(rmodseg, RMOD_OFFSET_ENVSEG);
222
  *owner = envseg;
231
  *owner = envseg;
223
 
232