Listing 3

// npx.hpp - Non-Preemptive eXecutive Header
//           Copyright 1990 by Cnapse
//           Written by: M. de Champlain

#include "std.h"
#include "list.h"

typedef word   *reg;
typedef enum { TERMINATED, READY, RUNNING, SUSPENDED } taskState;

class Task {
friend class StateQ;
friend class ReadyQ;
  LINK       n;
  reg        sp;
  word      *stackBase;
  taskState  state;
  void      (*taskStartingAddress)();
  word       stackSizeInBytes;
  Task      *self;
  Task      *parent;
  void       Schedule(void);
public:
  Task(void  (*task)(), word stackSize) { taskStartingAddress = task;
                                   stackSizeInBytes    = stackSize; }
  Task *Start(void);
  Task *Self(void);
  Task *Parent(void);
  void  ReSchedule(void);
  void  Terminate(Task *id);
  void  Suspend(Task *id);
  void  Resume(Task *id);
};

extern Task *running;