Subversion Repositories SvarDOS

Rev

Rev 454 | Rev 465 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 454 Rev 459
Line 35... Line 35...
35
 
35
 
36
/* returns far pointer to rmod's settings block on success */
36
/* returns far pointer to rmod's settings block on success */
37
struct rmod_props far *rmod_install(unsigned short envsize) {
37
struct rmod_props far *rmod_install(unsigned short envsize) {
38
  char far *myptr, far *mcb;
38
  char far *myptr, far *mcb;
39
  unsigned short far *owner;
39
  unsigned short far *owner;
40
  const unsigned short sizeof_rmodandprops_paras = rmod_len + sizeof(struct rmod_props) + 15 / 16;
40
  const unsigned short sizeof_rmodandprops_paras = (0x100 + rmod_len + sizeof(struct rmod_props) + 15) / 16;
41
  unsigned short rmodseg = 0xffff;
41
  unsigned short rmodseg = 0xffff;
42
  unsigned short envseg, origenvseg;
42
  unsigned short envseg, origenvseg;
43
  struct rmod_props far *res = NULL;
43
  struct rmod_props far *res = NULL;
44
 
44
 
45
  /* read my current env segment from PSP and save it */
45
  /* read my current env segment from PSP and save it */
Line 104... Line 104...
104
  if (rmodseg == 0xffff) {
104
  if (rmodseg == 0xffff) {
105
    outputnl("malloc error");
105
    outputnl("malloc error");
106
    return(NULL);
106
    return(NULL);
107
  }
107
  }
108
 
108
 
109
  /* copy rmod to its destination */
109
  /* copy rmod to its destination, prefixed with a copy of my own PSP */
110
  myptr = MK_FP(rmodseg, 0);
110
  myptr = MK_FP(rmodseg, 0);
-
 
111
  {
-
 
112
    unsigned short i;
-
 
113
    char *mypsp = (void *)0;
-
 
114
    for (i = 0; i < 0x100; i++) myptr[i] = mypsp[i];
-
 
115
  }
-
 
116
  myptr = MK_FP(rmodseg, 0x100);
111
  _fmemcpy(myptr, rmod, rmod_len);
117
  _fmemcpy(myptr, rmod, rmod_len);
112
 
118
 
113
  /* mark rmod memory as "self owned" */
119
  /* mark rmod memory as "self owned" */
114
  mcb = MK_FP(rmodseg - 1, 0);
120
  mcb = MK_FP(rmodseg - 1, 0);
115
  owner = (void far *)(mcb + 1);
121
  owner = (void far *)(mcb + 1);
Line 128... Line 134...
128
    owner[0] = 0;
134
    owner[0] = 0;
129
    owner[1] = 0;
135
    owner[1] = 0;
130
  }
136
  }
131
 
137
 
132
  /* prepare result (rmod props) */
138
  /* prepare result (rmod props) */
133
  res = MK_FP(rmodseg, rmod_len);
139
  res = MK_FP(rmodseg, 0x100 + rmod_len);
134
  _fmemset(res, 0, sizeof(*res));  /* zero out */
140
  _fmemset(res, 0, sizeof(*res));  /* zero out */
135
  res->rmodseg = rmodseg;          /* rmod segment */
141
  res->rmodseg = rmodseg;          /* rmod segment */
136
  res->inputbuf[0] = 128;          /* input buffer for INT 0x21, AH=0Ah*/
142
  res->inputbuf[0] = 128;          /* input buffer for INT 0x21, AH=0Ah*/
137
  res->echoflag = 1;               /* ECHO ON */
143
  res->echoflag = 1;               /* ECHO ON */
138
  res->origenvseg = origenvseg;    /* original environment segment */
144
  res->origenvseg = origenvseg;    /* original environment segment */
139
 
145
 
140
  /* write env segment to rmod buffer */
146
  /* write env segment to rmod's PSP */
141
  owner = MK_FP(rmodseg, RMOD_OFFSET_ENVSEG);
147
  owner = MK_FP(rmodseg, RMOD_OFFSET_ENVSEG);
142
  *owner = envseg;
148
  *owner = envseg;
143
 
149
 
144
  /* write boot drive to rmod bootdrive field */
150
  /* write boot drive to rmod bootdrive field */
145
  _asm {
151
  _asm {
Line 183... Line 189...
183
  unsigned short *parent = (void *)0x0C; /* parent's seg in PSP[Ch] ("prev. int22 handler") */
189
  unsigned short *parent = (void *)0x0C; /* parent's seg in PSP[Ch] ("prev. int22 handler") */
184
  unsigned short far *ptr;
190
  unsigned short far *ptr;
185
  const unsigned short sig[] = {0x1983, 0x1985, 0x2017, 0x2019};
191
  const unsigned short sig[] = {0x1983, 0x1985, 0x2017, 0x2019};
186
  unsigned char i;
192
  unsigned char i;
187
  /* is it rmod? */
193
  /* is it rmod? */
188
  ptr = MK_FP(*parent, 0);
194
  ptr = MK_FP(*parent, 0x100);
189
  for (i = 0; i < 4; i++) if (ptr[i] != sig[i]) return(NULL);
195
  for (i = 0; i < 4; i++) if (ptr[i] != sig[i]) return(NULL);
190
  /* match successfull (rmod is my parent) */
196
  /* match successfull (rmod is my parent) */
191
  return(MK_FP(*parent, rmod_len));
197
  return(MK_FP(*parent, 0x100 + rmod_len));
192
}
198
}
193
 
199
 
194
 
200
 
195
/* update rmod's pointer to comspec */
201
/* update rmod's pointer to comspec */
196
void rmod_updatecomspecptr(unsigned short rmod_seg, unsigned short env_seg) {
202
void rmod_updatecomspecptr(unsigned short rmod_seg, unsigned short env_seg) {