📄 message.hpp
字号:
//***********************************************************************// MODULE : RCOS - Common message definitions in one convenient spot *// AUTHOR : Ron Chernich *// PURPOSE: Define messages and message structures common accross the *// RCOS suite. *// HISTORY: *// 14-MAY-93 Gathered in one place owing to sheer frustration *// 31-MAR-94 DM messages to Get/Set TTY mode added *// 17-AUG-94 CP/M File System messages added, Animations enhanced. *//***********************************************************************#ifndef _RCOS_MESSAGES_ /////////////////////////////////////////////////////////////////////// // This object is a message. Like Microsoft's NT, All messages // share a common header, with a message specific body. // class message { public: message (UINT16 us = 0, UINT16 um = 0, UINT16 up = 0, void *pb = NULL) { wSender = us, wMsgType = um, wParam = up, pBody = pb; } ~message (void) {}; UINT16 wSender; // who it's from UINT16 wMsgType; // what it is UINT16 wParam; // non-specific parameter void *pBody; // pointer to specific data }; typedef message MSG; typedef message* PMSG; //////////// // Messages can be synchronous or asynchronous, depending on how // they were passed (Send = Sync; Post = Async). The message switcher // will set the MSB of synch messages, where the reply (if any) must // be made in the body of the received message. A reply to an async // message requires a "new" message struct. // #define MM_Sync 0x8000 // bit set for a synchronous xfer #define IS_SYNCH(n) (n & MM_Sync) // macro for classifying xfer type /////////////////////////////////////////////////////////////////////// // All Device drivers must be based on this Class. The constructor // will be supplied with an ID and a pointer to a Knl class, which // will handle message passing for the driver (normally the Kernel!) // Drivers communicate by messages. These can be "posted" by calling // the Knl class member "PostMsg" - which uses a FIFO queue to effect // ascynchronous transfers, or by calling "SendMsg". This causes a // direct (synchronous) transfer where the switcher directly invokes // the recieve member of the distination port before returning to the // sender. The actual message receiver is declared as a "pure virtual" // meaning each instantiation MUST overload the function. ////////////////////////// // ..we need a forward reference to the message switcher.. ////////// class Knl; class port { public: UINT16 uID; // Unique ID of driver Knl *pTx; // pointer to the message dispatcher port (UINT16, UINT16, Knl*); // const. gets ID, class and Tx ptr void DevError (INT16, BOOL); // Issue device error message virtual void RxPort (PMSG) = 0; // Dispatcher for received messages }; /////////// // port status bits.. // #define STAT_Ready 0x0001 #define STAT_Inhibit 0x0002 #define STAT_Busy 0x0004 ///////////// // Device drivers must notify kernel what they are.. // #define CLS_SysRes 0x9000 // System Resource - unassignable #define CLS_VDU 0x1001 // in/out display device #define CLS_PRN 0x1002 // Printer, output only #define CLS_MTU 0x1003 // Mage tape unit, output only #define CLS_FSF 0x1004 // File system file, input/output /////////////// // The device may signal internal error conditions with member func // DevError() .. the Kernel will ask the console process to display // these Certain common errors are defined as .. // #define ET_InitFail 0x7F00 // initialization failed #define ET_NotOpen 0x7F01 // close of a device not open #define ET_StillOpen 0x7F02 // open of a device already open #define ET_NoSupport 0x7F03 // command not supported by device #define ET_InvalidReq 0x7F04 // device cannot perform request #define ET_FileSysErr 0x7F05 // failure in file system ///////////////////////// // Working along Unix lines (Ref: Bach, MJ (1986): "The Design of the Unix // Operating System", Prentice-Hall, Chapter 6), we maintain two levels of // indirection between a process and its memory. The Process Control Block // manager (Exec) does not need to know about Page Tables. The Memory Mgr // does not need to know about PCB's - but they need a common interface // point. Hence this structure, the "per process region table" .. // typedef struct procrtbl { HANDLE hText; // process text (code) region(s) HANDLE hStack; // handle to stack region(s) for process HANDLE hData; // Data (not used at present) handle } MCB, *PMCB; ///////////////// // This is the message body for MMU Read/Write transfers.. // wParam = HANDLE of allocated memory // typedef struct { UINT16 *pData; // destination/source for read/write UINT16 uOffset; // source/destination offset within handle UINT16 uLen; // number of bytes for transfer (Blk only) } MMU_MSG, *PMMU_MSG; ///////////////////////////////////////////////////////////////////////// // Kernel messages (KMs) sent by kernel, or to which kernel will respond.. // #define KM_Register 0x0700 // wParam = driver class // pBody = pointer to port (ie it's "this") #define KM_CheckOut 0x0701 // wParam = driver class // pBody = pointer to port (ie it's "this") #define KM_SetStatus 0x0702 // Allow port (driver) to change it's status // wParam = new status #define KM_KeyPress 0x0703 // user keyboard char received // wParam = character #define KM_DevError 0x0704 // Device driver internal Error (-ve = fatal) // wParam = Numeric internal reference #define KM_Open 0x0705 // Give me one of these (or here it is) // wParam = device type (class) #define KM_Close 0x0706 // I'm finished with it now // wParam = device ID #define KM_Read 0x0707 // Char mode read of device // wParam = char (in LO byte) #define KM_ReadBlk 0x0708 // Block mode read of device // wParam = count; pBody -> data block #define KM_Write 0x0709 // Char mode write to device // wParam = char (in LO byte) #define KM_WriteBlk 0x070a // Block mode write to device // wParam = count; pBody -> data block #define KM_IoCtrl 0x070b // Device specific control request // usually, device sets wParam = status #define KM_Signal 0x070c // Signal to process // wParam = semaphore ID | kernel signal # #define KM_Break 0x070f // Break signal from user /////////////////////////////////////////////////////////////////////// // These messages are specific to the ANIMATOR.. // #define ANI_REFRESH 0x0300 // Refresh display <wParam> #define ANI_GET_QUS 0x0301 // Get Q processes for display #define ANI_IN_RDY 0x0302 // Animate process Input -> Ready #define ANI_RDY_RUN 0x0303 // .. Ready -> Running #define ANI_RUN_RDY 0x0304 // .. Running -> Ready #define ANI_RUN_BLK 0x0305 // .. Running -> Blocked #define ANI_RDY_SRDY 0x0306 // .. Ready -> Suspended Ready #define ANI_BLK_RDY 0x0307 // .. Blocked -> Suspended Ready #define ANI_BLK_SBLK 0x0308 // .. Blocked -> Suspended Blocked #define ANI_SRDY_RDY 0x0309 // .. Suspended Ready -> Ready #define ANI_SBLK_BLK 0x030A // .. Suspended Blocked -> Blocked #define ANI_SBLK_SRDY 0x030B // .. Suspended Blocked -> Suspended Ready #define ANI_GET_PCB 0x030C // Copy current PCB to pBody-> a local one #define ANI_UPDAT_PCB 0x030D // Update displayed PCB box information #define ANI_DELETE 0x030E // Process killed by operator #define ANI_FORKS 0x030F // Process forks (spawns, whatever) #define ANI_HALT_OK 0x0310 // Process halts and deletes normally #define ANI_HALT_BAD 0x0311 // Process halts and deletes on Illegal #define ANI_PREEMPT 0x0312 // Running process pre-empted by higher one #define ANI_DCREAT 0x0320 // Message to create a new disk animation #define ANI_CHAN_ENQ 0x0321 // New disk channel request arrived #define ANI_SPIN 0x0322 // Update disk rotation indicator #define ANI_BEGIN_SEEK 0x0323 // Start of a seek #define ANI_SEEK 0x0324 // Move disk head graphic #define ANI_ONTRACK 0x0325 // Seek complete #define ANI_RWOP 0x0326 // Read/Write operation complete (de-queue) /////////////// // This message struct gets loaded with (up to) 5 Exec queue // snap-shots in support of CPU type animations.. // typedef struct aniq { UINT16 arr[5][MAX_PROC]; } MSG_ANIQ, *PMSG_ANIQ; /////////// // This one is filled with current process information.. // typedef struct anip { INT16 nPri; UINT16 uNr[7]; char *pszName; char szPCD[16]; } MSG_ANIP, *PMSG_ANIP; ///////////////////////////////////////////////////////////////////// // As well as responding to standard Kernel messages (read, write), // an MMU driver must support these messages.. // #define MMU_Allocate 0x0401 // used to create a page table #define MMU_Duplicate 0x0402 // duplicate a page table #define MMU_Resize 0x0403 // modify a page table ///////////////////// // Parameters specific to the TTY Class - passed as wParam of an // IO Control request (KM_IoCtrl).. // DM_KeyHit and DM_GetSize return data in wParam // #define DM_Reset 0x0501 // clear screen, flush buffer, etc. #define DM_KeyHit 0x0502 // wParam = TRUE/FALSE = key waiting #define DM_GetSize 0x0503 // wParam: hi byte = rows, low = cols. #define DM_GetPos 0x0504 // wParam: hi byte = row, low = column #define DM_BreakOn 0x0505 // Set line protocol driver break status #define DM_BreakOff 0x0506 // (never actually gets to the TTY..) #define DM_GetMode 0x0507 // Enquire current TTY mode via line driver #define DM_SetMode 0x0508 // Change current TTY mode via line driver ////////////////// // valid messages to and from the file system.. // #define FS_Creat 0x0FD0 #define FS_Open 0x0FD1 #define FS_ReadSeq 0x0FD2 #define FS_WriteSeq 0x0FD3 #define FS_ReadRan 0x0FD4 #define FS_WriteRan 0x0FD5 #define FS_Close 0x0FD6 #define FS_Stat 0x0FD7 #define FS_Rename 0x0FD8 #define FS_Delete 0x0FD9 #define FS_FindFirst 0x0FDa #define FS_FindNext 0x0FDb // // These are the FS response message types plus the sent // messages they are applicable to (and should be checked for).. // #define FS_Ok 0x6660 // all operations #define FS_NotFound 0x6661 // open, rename, delete, find* #define FS_DiskFull 0x6662 // creat, write #define FS_DiskError 0x6663 // all operations #define FS_Wprotect 0x6664 // write, creat #define FS_NotReady 0x6665 // all operations #define FS_Fail 0x6666 // Unrecoverable file sys error #define FS_EOF 0x6667 // read #define FS_Exists 0x6668 // Creat #define FS_Busy 0x6669 // may take a while (all) #define FS_NoHandles 0x666a // no more process file handles #define FS_BadName 0x666b // name format illegal #define FS_BadUnit 0x666c // illegal or off-line disk unit ////////////////// // Set of indicies for the Radio Button controlled Animation Windows.. // enum AniWin { CPU_DISP, MEM_DISP, DSK_DISP, TTY_DISP, NIL }; //////////////// // Here is an abstract class for all window painters.. // class WinPainter { public: WinPainter (void) { } virtual ~WinPainter (void) { } virtual void Paint (void) = 0; }; #define _RCOS_MESSAGES_#endif//************************************ EOF ******************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -