Subversion Repositories SvarDOS

Rev

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

Rev 987 Rev 1587
Line 102... Line 102...
102
  if (rmodseg == 0xffff) {
102
  if (rmodseg == 0xffff) {
103
    outputnl("malloc error");
103
    outputnl("malloc error");
104
    return(NULL);
104
    return(NULL);
105
  }
105
  }
106
 
106
 
107
  /* copy rmod to its destination, prefixed with a copy of my own PSP */
107
  /* copy my own PSP where RMOD is about to land, so it has a proper PSP as well */
-
 
108
  /* take care to init the JFT (20 bytes starting at offset 0x18) to 0xff, which
-
 
109
   * essentially means "empty JFT slot" */
108
  myptr = MK_FP(rmodseg, 0);
110
  myptr = MK_FP(rmodseg, 0);
109
  {
111
  {
110
    unsigned short i;
112
    unsigned short i;
111
    char *mypsp = (void *)0;
113
    char *mypsp = (void *)0;
112
    for (i = 0; i < 0x100; i++) myptr[i] = mypsp[i];
114
    for (i = 0; i < 0x100; i++) myptr[i] = mypsp[i];
-
 
115
    for (i = 0x18; i < 0x18+20; i++) myptr[i] = 0xff;
113
  }
116
  }
-
 
117
 
-
 
118
  /* patch up RMOD's PSP: Parent's PSP segment @ 0x16-0x17 */
-
 
119
  myptr[0x16] = rmodseg & 0xff; /* RMOD is his own parent */
-
 
120
  myptr[0x17] = rmodseg >> 8;
-
 
121
 
-
 
122
  /* patch up RMOD's PSP: SS:SP pointer @ 0x2E-0x31 */
-
 
123
  myptr[0x2e] = 254; /* I abuse the PSP's command line tail as stack */
-
 
124
  myptr[0x2f] = 0;
-
 
125
  myptr[0x30] = rmodseg & 0xff;
-
 
126
  myptr[0x31] = rmodseg >> 8;
-
 
127
 
-
 
128
  /* patch up RMOD's PSP: JFT size @ 0x32-0x33 */
-
 
129
  myptr[0x32] = 0; /* default JFT size (max that fits without an extra allocation) */
-
 
130
  myptr[0x33] = 0;
-
 
131
 
-
 
132
  /* patch up RMOD's PSP: JFT pointer @ 0x34-0x37 */
-
 
133
  myptr[0x34] = 0x18; /* the JFT is in the PSP itself */
-
 
134
  myptr[0x35] = 0;
-
 
135
  myptr[0x36] = rmodseg & 0xff;
-
 
136
  myptr[0x37] = rmodseg >> 8;
-
 
137
 
-
 
138
  /* patch up RMOD's PSP: pointer to previous PSP @ 0x38-0x3B */
-
 
139
  myptr[0x38] = 0;
-
 
140
  myptr[0x39] = 0;
-
 
141
  myptr[0x3A] = rmodseg & 0xff;
-
 
142
  myptr[0x3B] = rmodseg >> 8;
-
 
143
 
-
 
144
  /* copy rmod to its destination (right past the PSP I prepared) */
114
  myptr = MK_FP(rmodseg, 0x100);
145
  myptr = MK_FP(rmodseg, 0x100);
115
  _fmemcpy(myptr, rmodcore, rmodcore_len);
146
  _fmemcpy(myptr, rmodcore, rmodcore_len);
116
 
147
 
117
  /* mark rmod memory as "self owned" */
148
  /* mark rmod memory (MCB) as "self owned" */
118
  mcb = MK_FP(rmodseg - 1, 0);
149
  mcb = MK_FP(rmodseg - 1, 0);
119
  owner = (void far *)(mcb + 1);
150
  owner = (void far *)(mcb + 1);
120
  *owner = rmodseg;
151
  *owner = rmodseg;
121
  _fmemcpy(mcb + 8, "SVARCOM", 8);
152
  _fmemcpy(mcb + 8, "SVARCOM", 8);
122
 
153
 
123
  /* mark env memory as "owned by rmod" */
154
  /* mark env memory (MCB) as "owned by rmod" */
124
  mcb = MK_FP(envseg - 1, 0);
155
  mcb = MK_FP(envseg - 1, 0);
125
  owner = (void far *)(mcb + 1);
156
  owner = (void far *)(mcb + 1);
126
  *owner = rmodseg;
157
  *owner = rmodseg;
127
  _fmemcpy(mcb + 8, "SVARENV", 8);
158
  _fmemcpy(mcb + 8, "SVARENV", 8);
128
 
159