#include "pmc.h"
long __pascal fileexec (STR fnm, STR cline)
{
REGSTRUCT rs;
DWORD oldlowsize;
STR nextstr = (STR)_lowbufptr + 22;
int r;
rs.w.FLAGS = rs.d.SSSP = 0;
if (((DWORD)fnm + database) > 0xfffff)
{
nextstr = stpcpy (nextstr, fnm) + 1;
fnm = (STR)_lowbufptr + 22;
}
strcpy (nextstr + 2, cline);
r = strlen (cline);
nextstr[0] = r + 1;
nextstr[1] = ' ';
nextstr[2 + r] = 0xd;
cline = nextstr;
((WORD *)_lowbufptr)[0] = envseg;
((WORD *)_lowbufptr)[1] = (DWORD)cline + database & 15;
((WORD *)_lowbufptr)[2] = (DWORD)cline + database >> 4;
((WORD *)_lowbufptr)[3] = 0x5c;
((WORD *)_lowbufptr)[4] = pspseg;
((WORD *)_lowbufptr)[5] = 0x6c;
((WORD *)_lowbufptr)[6] = pspseg;
oldlowsize = lowheapblock.size;
mbsquish (&lowheapblock);
rs.w.ES = pspseg;
rs.w.BX = ((lowheapblock.base + lowheapblock.size + 15) - pspbase) >> 4;
rs.b.AH = 0x4a;
xlt_simrmint (0x21, &rs, 0);
rs.w.ES = (DWORD)_lowbufptr + database >> 4;
rs.w.BX = (DWORD)_lowbufptr + database & 15;
rs.w.DS = (DWORD)fnm + database >> 4;
rs.w.DX = (DWORD)fnm + database & 15;
rs.w.AX = 0x4b00;
r = xlt_simrmint (0x21, &rs, 0);
if (!r && (rs.w.FLAGS & fCF))
r = rs.d.EAX | 0xffff0000;
mbunsquish (&lowheapblock, oldlowsize);
rs.w.ES = pspseg;
rs.w.BX = ((lowheapblock.base + lowheapblock.size + 15) - pspbase) >> 4;
rs.b.AH = 0x4a;
xlt_simrmint (0x21, &rs, 0);
if (r < 0)
return r;
rs.b.AH = 0x4d;
xlt_simrmint (0x21, &rs, 0);
return rs.b.AL;
}