FreeCalypso > hg > fc-selenite
comparison src/gpf/osl/os_com_ir.c @ 6:8b2a9a374324
src/gpf: addition of Magnetite src/gpf2
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 15 Jul 2018 08:15:49 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
5:1ea54a97e831 | 6:8b2a9a374324 |
---|---|
1 /* | |
2 * This C module is a reconstruction based on the disassembly of | |
3 * os_com.obj in frame_na7_db_ir.lib from the Leonardo package. | |
4 */ | |
5 | |
6 /* set of included headers from COFF symtab: */ | |
7 #include <stdio.h> | |
8 #include <string.h> | |
9 #include "nucleus.h" | |
10 #include "typedefs.h" | |
11 #include "os.h" | |
12 #include "gdi.h" | |
13 #include "os_types.h" | |
14 #include "os_glob.h" | |
15 | |
16 extern TC_PROTECT TCD_System_Protect; | |
17 extern VOID TCT_Protect(TC_PROTECT *protect); | |
18 extern VOID TCT_Unprotect(VOID); | |
19 extern VOID TCT_Unprotect_Specific(TC_PROTECT *protect); | |
20 | |
21 #define My_System_Protect() TCT_Protect(&TCD_System_Protect) | |
22 #define My_System_Unprotect() TCT_Unprotect_Specific(&TCD_System_Protect) | |
23 | |
24 extern T_OS_COM_TABLE_ENTRY ComTable[]; | |
25 extern unsigned os_tick_to_time_multiplier; | |
26 | |
27 extern int ObtainSemaphoreCB(NU_SEMAPHORE *SemCB, ULONG Timeout, | |
28 USHORT wait_check); | |
29 extern int ReleaseSemaphoreCB(NU_SEMAPHORE *SemCB); | |
30 | |
31 GLOBAL LONG | |
32 os_SendToQueue(OS_HANDLE TaskHandle, OS_HANDLE ComHandle, USHORT Priority, | |
33 ULONG Suspend, OS_QDATA *Msg) | |
34 { | |
35 T_OS_COM_TABLE_ENTRY *pTable; | |
36 T_QDATA_ELEMENT *elem; | |
37 T_QUEUE *queue; | |
38 int ret; | |
39 NU_SEMAPHORE *CBPtr; | |
40 USHORT watmark; | |
41 | |
42 if (ComHandle <= 0 || ComHandle > MaxCommunications) | |
43 return(OS_INVALID_QUEUE); | |
44 pTable = ComTable + ComHandle; | |
45 if (!pTable->Name[0]) | |
46 return(OS_INVALID_QUEUE); | |
47 CBPtr = &pTable->FreeSemCB; | |
48 ret = ObtainSemaphoreCB(CBPtr, Suspend, 1); | |
49 if (ret == OS_ERROR || ret == OS_TIMEOUT) | |
50 return(ret); | |
51 My_System_Protect(); | |
52 elem = pTable->pFreeElement; | |
53 pTable->pFreeElement = elem->pNext; | |
54 memcpy(&elem->Data, Msg, sizeof(OS_QDATA)); | |
55 queue = &pTable->Queue[Priority - OS_MIN_PRIORITY]; | |
56 *queue->pWrite++ = &elem->Data; | |
57 if (queue->pWrite - queue->pStart >= pTable->Entries + 1) | |
58 queue->pWrite = queue->pStart; | |
59 watmark = pTable->Entries - CBPtr->sm_semaphore_count; | |
60 if (pTable->MaxUsed < watmark) | |
61 pTable->MaxUsed = watmark; | |
62 My_System_Unprotect(); | |
63 ReleaseSemaphoreCB(&pTable->UsedSemCB); | |
64 return(ret); | |
65 } | |
66 | |
67 GLOBAL LONG | |
68 os_ReceiveFromQueue(OS_HANDLE TaskHandle, OS_HANDLE ComHandle, | |
69 OS_QDATA *Msg, ULONG Timeout) | |
70 { | |
71 T_QDATA_ELEMENT *pElem; | |
72 UNSIGNED c_time; | |
73 int ret; | |
74 USHORT i; | |
75 T_QUEUE *pQueue; | |
76 T_OS_COM_TABLE_ENTRY *pTable; | |
77 | |
78 pTable = ComTable + ComHandle; | |
79 if (!pTable->Name[0]) | |
80 return(OS_ERROR); | |
81 pTable->current_msg.type = 0; | |
82 ret = ObtainSemaphoreCB(&pTable->UsedSemCB, Timeout, 0); | |
83 if (ret == OS_ERROR || ret == OS_TIMEOUT) | |
84 return(ret); | |
85 My_System_Protect(); | |
86 for (i = OS_MAX_PRIORITY; i >= OS_MIN_PRIORITY; i--) { | |
87 pQueue = &pTable->Queue[i - OS_MIN_PRIORITY]; | |
88 if (pQueue->pWrite != pQueue->pRead) | |
89 break; | |
90 } | |
91 if (i < OS_MIN_PRIORITY) { | |
92 My_System_Unprotect(); | |
93 ReleaseSemaphoreCB(&pTable->FreeSemCB); | |
94 return(OS_ERROR); | |
95 } | |
96 memcpy(Msg, *pQueue->pRead, sizeof(OS_QDATA)); | |
97 pElem = (T_QDATA_ELEMENT *)*pQueue->pRead++; | |
98 pElem->Data.data16 = 0; | |
99 pElem->pNext = pTable->pFreeElement; | |
100 pTable->pFreeElement = pElem; | |
101 if (pQueue->pRead - pQueue->pStart >= pTable->Entries + 1) | |
102 pQueue->pRead = pQueue->pStart; | |
103 pTable->current_msg.type = Msg->data16; | |
104 pTable->current_msg.opc = Msg->data32; | |
105 c_time = NU_Retrieve_Clock(); | |
106 pTable->current_msg.time = SYSTEM_TICKS_TO_TIME(c_time); | |
107 pTable->current_msg.ptr = Msg->ptr; | |
108 My_System_Unprotect(); | |
109 ReleaseSemaphoreCB(&pTable->FreeSemCB); | |
110 return(OS_OK); | |
111 } |