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