aboutsummaryrefslogtreecommitdiff
path: root/load.c
blob: 0d2067ac59d244ff7d06a95ce8291e2640c208eb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/***********************************************************************
*
*	Module Name:	load
*
*	Purpose: To provide support for loading files.
*
*	Functions in Module:
*		load

************************************************************************/

#include <dos.h>        /* Borland header file */
#include <fcntl.h>      /* Borland header file */
#include <dir.h>        /* Borland header file */

#include "mpx.h"

#define intnum 33 	/* int86 number for load only */
#define success 0	/* return code for successful process load */
#define error   -1      /* return code for failure on process load */


/**************************************************************************
 *
 *	Function: load
 *	Abstract: Dynamically loads a file from disk
 *	Algorithm:
 *                 This procedure dynamically loads a process with a
 *                 file extension of .MPX.  The memory address provided
 *		   is the segment address at which to load the process.
 *                 The process with the name in the string pname is
 *		   loaded into memory at the segment address found in
 *                 load_addr.  If load is successful, load returns a 0
 *                 return code, otherwise it returns a -1  return code
 *
 **************************************************************************/

int load(unsigned *load_addr,char pname[])
{
    int i,flags,carry;
    char fname[30];

    struct PRMBLK
      {
	 int segaddr;
	 int reloctn;
      };

    struct PRMBLK prmbk;
    union  REGS *inregs;     /* input registers pointer */
    union  REGS *outregs;    /* output registers pointer */
    struct SREGS *segregs;  /* segment registers pointer */

    union  REGS inr;	   /* input register structure */
    union  REGS outr;	   /* output register structure */
    struct SREGS segr;	   /* segment register structure */

    disable();

    /* SEGMENT REGISTER VALUE CALL */

    segregs = &segr;
    segread(segregs);    /* returns current segment register values */

    strcpy(fname, pname);
    strcat(fname, ".MPX");

    inregs = &inr;
    outregs = &outr;
    inregs->h.ah = 75;
    inregs->x.dx = &fname[0];
    prmbk.segaddr = load_addr;
    prmbk.reloctn = load_addr;
    segr.es = segr.ds;		/* assigning the ES to the data segment */
    inregs->x.bx = &prmbk;
    inregs->h.al = 3;		/* load only */

    flags = int86x(intnum,inregs,outregs,segregs);
    carry = flags;   /* Could be omitted */
    carry = outregs->x.cflag;
    if(carry)
    {
	printf("\nerror code:%3d",outregs->x.ax);
	enable();
	return(error);
    }

    /* load successful */
    enable();
    return(success);
  }

/***********************************************************************/