/****************************************************************************/
/*                                                                          */
/*  RMX_NUC.H:      Prototypes for iRMX NUCLEUS primitives and  definitions */
/*                  for  the  special  values and exception codes used with */
/*                  and/or returned by them.                                */
/*                                                                          */
/*  LAST UPDATE:    January 24, 1992 [13:23:34]                             */
/*                                                                          */
/*  DEPENDENCIES:   See RMX_EXC.H.                                          */
/*                                                                          */
/****************************************************************************/

#ifndef _RMX_NUC_H
#define _RMX_NUC_H

#ifndef _RMX_EXC_H
#include <rmx_exc.h>
#endif

/* ENVIRONMENTAL EXCEPTION CODES */

#define E_OK                    0x0000
#define E_TIME                  0x0001
#define E_MEM                   0x0002
#define E_BUSY                  0x0003
#define E_LIMIT                 0x0004
#define E_CONTEXT               0x0005
#define E_EXIST                 0x0006
#define E_STATE                 0x0007
#define E_NOT_CONFIGURED        0x0008
#define E_INTERRUPT_SATURATION  0x0009
#define E_INTERRUPT_OVERFLOW    0x000A
#define E_TRANSMISSION          0x000B
#define E_SLOT                  0x000C
#define E_DATA_CHAIN            0x000D

#define E_CANCELLED             0x00E1
#define E_HOST_ID               0x00E2
#define E_NO_LOCAL_BUFFER       0x00E3
#define E_NO_REMOTE_BUFFER      0x00E4
#define E_RESOURCE_LIMIT        0x00E6
#define E_TRANS_ID              0x00E8
#define E_DISCONNECTED          0x00E9
#define E_TRANS_LIMIT           0x00EA

/* PROGRAMMING EXCEPTION CODES */

#define E_ZERO_DIVIDE           0x8000
#define E_OVERFLOW              0x8001
#define E_TYPE                  0x8002
#define E_PARAM                 0x8004
#define E_BAD_CALL              0x8005
#define E_ARRAY_BOUNDS          0x8006
#define E_NDP_ERROR             0x8007
#define E_ILLEGAL_OPCODE        0x8008
#define E_EMULATOR_TRAP         0x8009
#define E_CHECK_EXCEPTION       0x800A
#define E_CPU_XFER_DATA_LIMIT   0x800B
#define E_PROTECTION            0x800C
#define E_NOT_PRESENT           0x800E
#define E_BAD_ADDR              0x800F
#define E_PROTOCOL              0x80E0
#define E_PORT_ID_USED          0x80E1
#define E_NUC_BAD_BUF           0x80E2

/* BASIC LITERALS */

#define ASYNC_TRANSMISSION      0x0010
#define BUFFER_CHAIN            1
#define BUFFER_CHAINING_ALLOWED 0x0002
#define CREATE_STACK_FOR_TASK   0
#define DEVICE_CONNECTION_TOKEN 0x0301
#define END_OF_REPLY            0
#define EXTENSION_TOKEN         7
#define FIFO_QUEUING            0
#define FILE_CONNECTION_TOKEN   0x0101
#define INDEFINITE_WAIT         0xFFFF
#define IO_JOB_TOKEN            0x0300
#define JOB_TOKEN               1
#define LAST_PSB_SLOT           19
#define MAILBOX_TOKEN           3
#define MAX_INTERCONNECT_REG    0x01FF
#define MAX_OBJ_DIR_SIZE        0x0FF0
#define MAX_JOB_PRIORITY        0
#define MAX_PSB_SLOTS           20
#define MAX_SEGMENT_SIZE        0
#define MAX_SIZE_MAILBOX        0x001E    /* 60 ENTRIES IN FAST QUEUE */
#define MIN_OS_EXTENSION        224
#define MY_TASK                 0
#define MY_JOB                  1
#define MY_PARAMETER_OBJECT     2
#define NO_BUFFER_CHAINING      0
#define NO_COMMON_DATA_SEGMENT  0
#define NO_INITIAL_DATA_SEGMENT 0
#define NO_INTERRUPT_TASK       0
#define NO_NPX_UTILIZATION      0
#define NO_OBJECT_LIMIT         0xFFFF
#define NO_PARAMETER_CHECKING   2
#define NO_PARAMETER_OBJECT     0
#define NO_TASK_LIMIT           0xFFFF
#define NO_RESPONSE_DESIRED     (RMXOBJ)0
#define PARAMETER_CHECKING      0
#define PORT_TOKEN              9
#define PRIORITY_QUEUING        1
#define REGION_TOKEN            5
#define REPLY_CONTINUES         0x0200
#define ROOT_JOB                3
#define SEGMENT_TOKEN           6
#define SEMAPHORE_TOKEN         4
#define SINGLE_BUFFER           0
#define SYNC_TRANSMISSION       0
#define TASK_TOKEN              2
#define THIS_JOB                (RMXOBJ)0
#define THIS_SLOT               31
#define THIS_TASK               (RMXOBJ)0
#define USER_OBJECT_TOKEN       0x0100
#define UTILIZES_NPX            1
#define WAIT_INDEFINITELY       0xFFFF
#define WILL_USE_RECEIVE        0x0100
#define WILL_USE_RECEIVE_REPLY  0

/* STRUCTURE DEFINITIONS AND DEFINITIONS FOR THEIR FIELDS */

#pragma noalign( _TOKEN_LIST, _MEMORY_POOL_ATTRIBS, _DATA_PORT_ATTRIBS )
#pragma noalign( _SIGNAL_PORT_ATTRIBS, _MESSAGE_SOCKET, _PORT_ATTRIBS )
#pragma noalign( _MSG_RECEIVED_ATTRIBS )

typedef struct _TOKEN_LIST
    {
    U16         slots_available;
    U16         slots_used;
    RMXOBJ      tokens[2];
    }                           TOKEN_LIST;

typedef struct _MEMORY_POOL_ATTRIBS
    {
    U16         pool_max;
    U16         pool_min;
    U16         initial_size;
    U16         allocated;
    U16         available;
    }                           MEMORY_POOL_ATTRIBS;

typedef struct _E_MEMORY_POOL_ATTRIBS
    {
    RMXOBJ      target_job;
    RMXOBJ      parent_job;
    U32         pool_max;
    U32         pool_min;
    U32         initial_size;
    U32         allocated;
    U32         available;
    U32         borrowed;
    }                           E_MEMORY_POOL_ATTRIBS;

typedef struct _DATA_PORT_ATTRIBS
    {
    U16         port_id;
    U8          type;
    U8          reserved;
    U16         flags;
    }                           DATA_PORT_ATTRIBS;

typedef struct _SIGNAL_PORT_ATTRIBS
    {
    U8          message_id;
    U8          reserved_1;
    U8          type;
    U8          reserved_2;
    U16         flags;
    }                           SIGNAL_PORT_ATTRIBS;

typedef struct _MESSAGE_SOCKET
    {
    U16         host_id;
    U16         port_id;
    }                           MESSAGE_SOCKET;

typedef struct _PORT_ATTRIBS
    {
    U16         port_id;
    U8          type;
    U8          reserved_1;
    U16         number_transactions;
    U16         reserved_2;
    U16         reserved_3;
    RMXOBJ      sink_port;
    U32         def_remote_socket;
    RMXOBJ      buffer_pool;
    U16         flags;
    U8          reserved_4;
    }                           PORT_ATTRIBS;

typedef struct _DATA_CHAIN_ELEMENT
    {
    U16         len;
    U16         ptr_offset;
    RMXOBJ      ptr_token;
    U16         reserved;
    }                           DATA_CHAIN_ELEMENT;

typedef struct _MSG_RECEIVED_ATTRIBS
    {
    U16         flags;
    U16         status;
    U16         transaction_id;
    U32         data_length;
    RMXOBJ      forwarding_port;
    U32         remote_socket;
    U8          control_msg[20];
    U8          reserved[4];
    }                           MSG_RECEIVED_ATTRIBS;

#define DATA_PORT               2
#define SIGNAL_PORT             3

#define ASSIGN_FREE_PORT_ID     0
#define FIRST_USER_PORT_ID      0x0800

#define FIFO_QUEUING_PORT       0x0000
#define PRIORITY_QUEUING_PORT   0x0002
#define DO_MESSAGE_FRAGMENTING  0x0000
#define NO_MESSAGE_FRAGMENTING  0x0004

#define MSG_IN_SINGLE_BUFFER    0x0000
#define MSG_IN_DATA_CHAIN       0x0001

#define TRANSACTIONLESS_MSG     0x0000
#define SYSTEM_RMXRET_MSG       0x0010
#define TRANSACTION_REQUEST_MSG 0x0020
#define TRANSACTION_REPLY_MSG   0x0040

/* ROUTINE PROTOTYPES */

#pragma fixedparams( RQACCEPTCONTROL, RQALTERCOMPOSITE, RQATTACHBUFFERPOOL)
#pragma fixedparams( RQATTACHPORT, RQBROADCAST, RQCANCEL, RQCATALOGOBJECT )
#pragma fixedparams( RQCONNECT, RQCREATEBUFFERPOOL, RQCREATECOMPOSITE )
#pragma fixedparams( RQCREATEEXTENSION, RQCREATEJOB, RQCREATEMAILBOX )
#pragma fixedparams( RQCREATEPORT, RQCREATEREGION, RQCREATESEGMENT )
#pragma fixedparams( RQCREATESEMAPHORE, RQCREATETASK, RQDELETEBUFFERPOOL )
#pragma fixedparams( RQDELETECOMPOSITE, RQDELETEEXTENSION, RQDELETEJOB )
#pragma fixedparams( RQDELETEMAILBOX, RQDELETEPORT, RQDELETEREGION )
#pragma fixedparams( RQDELETESEGMENT, RQDELETESEMAPHORE, RQDELETETASK )
#pragma fixedparams( RQDETACHBUFFERPOOL, RQDETACHPORT, RQDISABLE )
#pragma fixedparams( RQDISABLEDELETION, RQECHANGEDESCRIPTOR )
#pragma fixedparams( RQECHANGEOBJECTACCESS, RQECREATEDESCRIPTOR, RQECREATEJOB )
#pragma fixedparams( RQEDELETEDESCRIPTOR, RQEGETADDRESS, RQEGETOBJECTACCESS )
#pragma fixedparams( RQEGETPOOLATTRIB, RQENABLE, RQENABLEDELETION )
#pragma fixedparams( RQENDINITTASK, RQENTERINTERRUPT, RQEOFFSPRING )
#pragma fixedparams( RQESETOSEXTENSION, RQETIMEDINTERRUPT, RQEXITINTERRUPT )
#pragma fixedparams( RQFORCEDELETE, RQGETHOSTID, RQGETINTERCONNECT )
#pragma fixedparams( RQGETLEVEL, RQGETPOOLATTRIB, RQGETPORTATTRIBUTES )
#pragma fixedparams( RQGETPRIORITY, RQGETSIZE, RQGETTASKTOKENS, RQGETTYPE )
#pragma fixedparams( RQINSPECTCOMPOSITE, RQLOOKUPOBJECT, RQOFFSPRING )
#pragma fixedparams( RQRECEIVE, RQRECEIVECONTROL, RQRECEIVEDATA )
#pragma fixedparams( RQRECEIVEFRAGMENT, RQRECEIVEMESSAGE, RQRECEIVEREPLY )
#pragma fixedparams( RQRECEIVESIGNAL, RQRECEIVEUNITS, RQRELEASEBUFFER )
#pragma fixedparams( RQREQUESTBUFFER, RQRESETINTERRUPT, RQRESUMETASK, RQSEND )
#pragma fixedparams( RQSENDCONTROL, RQSENDDATA, RQSENDMESSAGE, RQSENDREPLY )
#pragma fixedparams( RQSENDRSVP, RQSENDSIGNAL, RQSENDUNITS, RQSETINTERCONNECT )
#pragma fixedparams( RQSETINTERRUPT, RQSETPOOLMIN, RQSETPRIORITY )
#pragma fixedparams( RQSIGNALEXCEPTION, RQSIGNALINTERRUPT, RQSLEEP )
#pragma fixedparams( RQSUSPENDTASK, RQUNCATALOGOBJECT, RQWAITINTERRUPT )

void        RQACCEPTCONTROL( RMXOBJ region, RMXRET *status );
void        RQALTERCOMPOSITE( RMXOBJ extension, RMXOBJ composite,
                U16 component_index, RMXOBJ replacing_obj, RMXRET *status );
void        RQATTACHBUFFERPOOL( RMXOBJ buffer_pool_tkn, RMXOBJ port_tkn,
                RMXRET *status );
void        RQATTACHPORT( RMXOBJ port_tkn, RMXOBJ sink_port, RMXRET *status );
void        RQBROADCAST( RMXOBJ port_tkn, U32 socket, U8 *control_ptr,
                RMXRET *status );
void        RQCANCEL( RMXOBJ port_tkn, U16 transaction_id, RMXRET *status );
void        RQCATALOGOBJECT( RMXOBJ job_tkn, RMXOBJ obj_tkn, RMXSTR *name,
                RMXRET *status );
void        RQCONNECT( RMXOBJ port_tkn, U32 socket, RMXRET *status );
RMXOBJ      RQCREATEBUFFERPOOL( U16 max_buffs, U16 buff_flags,
                RMXRET *status );
RMXOBJ      RQCREATECOMPOSITE( RMXOBJ extension, TOKEN_LIST *tkn_list,
                RMXRET *status );
RMXOBJ      RQCREATEEXTENSION( U16 type_code, RMXOBJ deletion_mbx,
                RMXRET *status );
RMXOBJ      RQCREATEJOB( U16 dir_size, RMXOBJ param_obj, NATIVE_WORD pool_min,
                NATIVE_WORD pool_max, U16 max_objects, U16 max_tasks,
                U8 max_priority, EXCP_HANDLER_ATTRIBS *excp_handler_attribs,
                U16 job_flags, U8 task_priority,
                void (far *start_address)(void), RMXOBJ data_seg,
                void *stack_ptr, NATIVE_WORD stack_size, U16 task_flags,
                RMXRET *status );
RMXOBJ      RQCREATEMAILBOX( U16 mbx_flags, RMXRET *status );
RMXOBJ      RQCREATEPORT( U16 protocol_type, void *info_ptr, RMXRET *status );
RMXOBJ      RQCREATEREGION( U16 region_flags, RMXRET *status );
RMXOBJ      RQCREATESEGMENT( NATIVE_WORD size, RMXRET *status );
RMXOBJ      RQCREATESEMAPHORE( U16 initial_num_units, U16 max_num_units,
                U16 sema_flags, RMXRET *status );
RMXOBJ      RQCREATETASK( U8 priority, void (far *start_address)(void),
                RMXOBJ data_seg, void *stack_ptr, NATIVE_WORD stack_size,
                U16 task_flags, RMXRET *status );
void        RQDELETEBUFFERPOOL( RMXOBJ pool_tkn, RMXRET *status );
void        RQDELETECOMPOSITE( RMXOBJ extension_tkn, RMXOBJ composite_tkn,
                RMXRET *status );
void        RQDELETEEXTENSION( RMXOBJ extension_tkn, RMXRET *status );
void        RQDELETEJOB( RMXOBJ job_tkn, RMXRET *status );
void        RQDELETEMAILBOX( RMXOBJ mbx_tkn, RMXRET *status );
void        RQDELETEPORT( RMXOBJ port_tkn, RMXRET *status );
void        RQDELETEREGION( RMXOBJ region_tkn, RMXRET *status );
void        RQDELETESEGMENT( RMXOBJ segment_tkn, RMXRET *status );
void        RQDELETESEMAPHORE( RMXOBJ semaphore_tkn, RMXRET *status );
void        RQDELETETASK( RMXOBJ task_tkn, RMXRET *status );
RMXOBJ      RQDETACHBUFFERPOOL( RMXOBJ port_tkn, RMXRET *status );
void        RQDETACHPORT( RMXOBJ port_tkn, RMXRET *status );
void        RQDISABLE( U16 interrupt_level, RMXRET *status );
void        RQDISABLEDELETION( RMXOBJ object_tkn, RMXRET *status );
void        RQECHANGEDESCRIPTOR( RMXOBJ desc, U32 abs_addr, NATIVE_WORD size,
                RMXRET *status );
void        RQECHANGEOBJECTACCESS( RMXOBJ object_tkn, U8 access_code,
                U8 reserved, RMXRET *status );
RMXOBJ      RQECREATEDESCRIPTOR( U32 abs_addr, NATIVE_WORD size,
                RMXRET *status );
RMXOBJ      RQECREATEJOB( U16 dir_size, RMXOBJ param_obj, U32 pool_min,
                U32 pool_max, U16 max_objexts, U16 max_tasks, U8 max_priority,
                EXCP_HANDLER_ATTRIBS *excp_handler_attribs, U16 job_flags,
                U8 task_priority, void (far *start_address)(void),
                RMXOBJ data_seg, void *stack_ptr, NATIVE_WORD stack_size,
                U16 task_flags, RMXRET *status );
void        RQEDELETEDESCRIPTOR( RMXOBJ desc, RMXRET *status );
U32         RQEGETADDRESS( void *logical_address, RMXRET *status );
void        RQEGETOBJECTACCESS( RMXOBJ object_tkn, void *access_ptr,
                RMXRET *status );
void        RQEGETPOOLATTRIB( E_MEMORY_POOL_ATTRIBS *attrib_ptr,
                RMXRET *status );
void        RQENABLE( U16 interrupt_level, RMXRET *status );
void        RQENABLEDELETION( RMXOBJ object_tkn, RMXRET *status );
void        RQENDINITTASK( void );
void        RQENTERINTERRUPT( U16 interrupt_level, RMXRET *status );
void        RQEOFFSPRING( RMXOBJ job_tkn, TOKEN_LIST *list_ptr,
                RMXRET *status );
void        RQESETOSEXTENSION( U16 gate_num, void (far *start_address)(void),
                RMXRET *status );
void        RQETIMEDINTERRUPT( U16 interrupt_level, U16 time_limit,
                RMXRET *status );
void        RQEXITINTERRUPT( U16 interrupt_level, RMXRET *status );
void        RQFORCEDELETE( RMXOBJ composite_tkn, RMXOBJ object_tkn,
                RMXRET *status );
U16         RQGETHOSTID( RMXRET *status );
U8          RQGETINTERCONNECT( U8 slot_num, U16 register_num, RMXRET *status );
U16         RQGETLEVEL( RMXRET *status );
void        RQGETPOOLATTRIB( MEMORY_POOL_ATTRIBS *info_ptr, RMXRET *status );
void        RQGETPORTATTRIBUTES( RMXOBJ port_tkn, PORT_ATTRIBS *info_ptr,
                RMXRET *status );
U8          RQGETPRIORITY( RMXOBJ task_tkn, RMXRET *status );
NATIVE_WORD RQGETSIZE( RMXOBJ segment_tkn, RMXRET *status );
RMXOBJ      RQGETTASKTOKENS( U8 task_code, RMXRET *status );
U16         RQGETTYPE( RMXOBJ object_tkn, RMXRET *status );
void        RQINSPECTCOMPOSITE( RMXOBJ extension_tkn, RMXOBJ composite_tkn,
                TOKEN_LIST *tkn_list_ptr, RMXRET *status );
RMXOBJ      RQLOOKUPOBJECT( RMXOBJ job_tkn, RMXSTR *name, U16 time_limit,
                RMXRET *status );
RMXOBJ      RQOFFSPRING( RMXOBJ job_tkn, RMXRET *status );
void far *  RQRECEIVE( RMXOBJ port_tkn, U16 time_limit,
                MSG_RECEIVED_ATTRIBS *info_ptr, RMXRET *status );
void        RQRECEIVECONTROL( RMXOBJ region_tkn, RMXRET *status );
U16         RQRECEIVEDATA( RMXOBJ mbx_tkn, void *msg_ptr, U16 time_limit,
                RMXRET *status );
void        RQRECEIVEFRAGMENT( RMXOBJ port_tkn, U32 socket, U16 rsvp_trans_id,
                void *fragment_ptr, U32 fragment_length, U16 flags,
                RMXRET *status );
RMXOBJ      RQRECEIVEMESSAGE( RMXOBJ mbx_tkn, U16 time_limit,
                RMXOBJ *response_ptr, RMXRET *status );
void far *  RQRECEIVEREPLY( RMXOBJ port_tkn, U16 rsvp_trans_id, U16 time_limit,
                MSG_RECEIVED_ATTRIBS *info_ptr, RMXRET *status );
void        RQRECEIVESIGNAL( RMXOBJ port_tkn, U16 time_limit, RMXRET *status );
U16         RQRECEIVEUNITS( RMXOBJ semaphore_tkn, U16 num_units,
                U16 time_limit, RMXRET *status );
void        RQRELEASEBUFFER( RMXOBJ pool_tkn, RMXOBJ buffer_tkn, U16 flags,
            RMXRET *status );
RMXOBJ      RQREQUESTBUFFER( RMXOBJ buffer_tkn, U32 size, RMXRET *status );
void        RQRESETINTERRUPT( U16 interrupt_level, RMXRET *status );
void        RQRESUMETASK( RMXOBJ task_tkn, RMXRET *status );
U16         RQSEND( RMXOBJ port_tkn, U32 socket, void *control_ptr,
                void *data_ptr, U32 data_length, U16 flags, RMXRET *status );
void        RQSENDCONTROL( RMXRET *status );
void        RQSENDDATA( RMXOBJ mbx_tkn, void *msg_ptr, U16 length,
                RMXRET *status );
void        RQSENDMESSAGE( RMXOBJ mbx_tkn, RMXOBJ object_tkn,
                RMXOBJ response_tkn, RMXRET *status );
U16         RQSENDREPLY( RMXOBJ port_tkn, U32 socket, U16 rsvp_trans_id,
                void *control_ptr, void *data_ptr, U32 data_length, U16 flags,
                RMXRET *status );
U16         RQSENDRSVP( RMXOBJ port_tkn, U32 socket, void *control_ptr,
                void *data_ptr, U32 data_length, void *rsvp_data_ptr,
                U32 rsvp_data_length, U16 flags, RMXRET *status );
void        RQSENDSIGNAL( RMXOBJ port_tkn, RMXRET *status );
void        RQSENDUNITS( RMXOBJ semaphore_tkn, U16 num_units, RMXRET *status );
void        RQSETINTERCONNECT( U8 reg_value, U8 slot_num, U16 reg_num,
                RMXRET *status );
void        RQSETINTERRUPT( U16 interrupt_level, U16 flags,
                void (far *handler_address)(void), RMXOBJ handler_ds_tkn,
                RMXRET *status );
void        RQSETPOOLMIN( U16 new_min, RMXRET *status );
void        RQSETPRIORITY( RMXOBJ task_tkn, U8 priority, RMXRET *status );
void        RQSIGNALEXCEPTION( U16 exception_code, U8 parameter_num,
                U16 stack_ptr, U16 primitive, U16 npx_status, RMXRET *status );
void        RQSIGNALINTERRUPT( U16 interrupt_level, RMXRET *status );
void        RQSLEEP( U16 num_ticks, RMXRET *status );
void        RQSUSPENDTASK( RMXOBJ task_tkn, RMXRET *status );
void        RQUNCATALOGOBJECT( RMXOBJ job_tkn, RMXSTR *name, RMXRET *status );
void        RQWAITINTERRUPT( U16 interrupt_level, RMXRET *status );

#if _ARCHITECTURE_ > 286
#pragma fixedparams( RQESETMAXPRIORITY )
void RQESETMAXPRIORITY( RMXOBJ job_tkn, U8 max_priority, RMXRET *status );
#endif

#endif /* ndef _RMX_NUC_H */

