Listing 2 (CSIMINT.H)

#define   _INTRPT_      0x7f

/* This structure is used to hold status information
   on a process */

struct _statusT
{
  int kill_flag : 2;
  int wait_flag : 2;
  int fill_flag : 12;
};

/* This structure holds all of the information that
   defines a processes context */

struct _simprocessT
{
  struct _simprocessT *next;
  struct _simprocessT *prev;
  int init;
  int proc_id;
  struct _statusT status;
  unsigned long start_time;
  void *waitpost;
  int reg_ax;
  int reg_bx;
  int reg_cx;
  int reg_dx;
  int reg_es;
  int reg_ds;
  int reg_si;
  int reg_di;
  int reg_bp;
  int reg_sp;
  int reg_ss;
  int reg_cs;
  int reg_ip;
  int reg_flag;
};

typedef struct _simprocessT *pprocess;

/* this is the interprocess communications structure, for
   communications and synchronization */

struct _postT
{
  struct _postT *next;
  struct _postT *prev;
  char name[30];
  int handle;
  void *value;
  pprocess *waiting;
};

/*     Process header block list, which is circular */

struct _simprocessT *processlist;

/*      This process responds to the keyboard        */

struct _simprocessT *kbprocess;
int set_kb_process = 0;

/*      Total number of process                         */

int totalprocs = 1;

/*      List of all current posts                    */

struct _postT *postlist;

/*      Total number of posts in the system             */
int unsigned totalposts;

/*      Storage for the original interrupt vector,
     which is replaced by task_handler */

void interrupt (*old_vector)
();

/*      Globals used by setup_task                   */
int _sim_init_val = 2;
int glbl_sp;
int glbl_ss;
int glbl_bp;
void (*glbl_fc)(void)=NULL;

/*      Quick way to the system timer                */

long unsigned *systimer = MK_FP(0x0040, 0x006c);

/*      Simulation Time used by system              */

long unsigned _sim_system_time;

long unsigned _last_update_time;

/*      Simulation Time ratio used by system        */

float _sim_time_ratio = 0;

/*      Hidden routines handle installation of task
     switcher, and actual task switching */

int install_handler(void);
void interrupt task_handler(unsigned bp, unsigned di,
                       unsigned si, unsigned ds,
                       unsigned es, unsigned dx,
                       unsigned cx, unsigned bx,
                       unsigned ax, unsigned ip,
                       unsigned cs, unsigned flags);
void sim_start(void);

/*      Simulation time available to programmer            */

long unsigned CurrentTime;     /*  Visible to programs  */

/*      Visible routine for process control                */

int start_kb_process(void (*func)(void), int stacksize);
int start_process(void (*func)(void), int stacksize);
void stop_process(int process_id);
int my_process_id(void);

/*   Visible routines for control of
   process time utilivation  */

int wait_until_time(long unsigned starttime);
int wait_for_time(float delaytime);

/* Sets the sim time to real time ratio - maximum running
   speed. If this is set to 0.0, the system will run as
   fast as possible */

int set_time_ratio(float ratio);

/*     Visible routines for the handling of posts      */

int init_post(char *postname);
int set_post(int posthandle, void *pointer);
void *get_post(int posthandle);
void *wait_post(int posthandle);

/*    Exiting the system, and cleaning up the interrupts
     reports the value of the exit condition before
     exiting, useful for signalling certain errors */

void exit_processing(int condition);