Главная

Код

Главная
SINT
Ликбез
Уровни
Монитор
Код

Карта

Программный код




1 void TFC __Monitor ()
2 //
3 // Обработка стека очередей объектов
4 // ВХОД:  нет (текущий адрес в стеке очередей объектов)
5 // ВЫХОД: нет
6 // Авторы:
7 //  Владимир Рыбинкин: 20.01.01 - 08.14.17
8 //
9 {
10  UI16 NWPar; // число слов входных параметров метода
11  TDP Addr; // адрес параметров текущего объекта
12
13  for (;;) // выход из цикла только по команде монитора
14  { // или по окончанию стека очередей
15 #pragma warn -pro // транслятор зачем-то требует prototype
16   (*(VMF)SINT.FE) (); // вызов текущего обработчика ошибки
17 #pragma warn +pro // транслятор зачем-то требует prototype
18   switch (SINT.CMD) // анализ текущей команды монитора
19   { // переключатель по типу команды
20    case c_NOP: // нет команды (продолжить работу)
21     (*(TEQS TPD *)SINT.APQ).LastAddr = (*(TEQS TPD *)SINT.APQ).Addr;
22     SINT.mC = // вычисляем текущий объект очереди и его класс
23       __GetClassOfObject (SINT.cM = *(UI16MD)(*(TEQS TPD *)SINT.APQ).Addr);
24     Addr = ((*(TEQS TPD *)SINT.APQ).Addr += sizeof (SINT.cM));
25     if ((SINT.cM & SACC) == SACC)
26      Addr = (TDP)&SINT.ACC; // ставим указатель параметров на аккумулятор
27     if ((SINT.cM & SPTR) == (UI16)SPTR)
28      Addr = *(DMD)Addr; // косвенная адресация параметров объекта
29     SINT.icM = // индекс текущего метода в таблице класса
30       (SINT.cM & (~(SPTR | SACC))) - __ObjectClassesT[SINT.mC] - 1;
31     switch (SINT.mC) // класс текущего метода определяет
32     { // действия монитора по его обработке
33      case c_StrOfObjects: // вложенная строка (очередь) объектов
34       *(DMD)(TDP)&SINT.ACC = Addr;
35       __PushStack (SINT.APSQ);
36       (*(TEQS TPD *)SINT.APQ).Addr = (*(TEQS TPD *)SINT.APQ).QueueAddr
37 = (*(TEQS TPD *)SINT.APQ).LastAddr
38 = _SOT[SINT.cM - m_StrOfObjects - 1].Addr;
39       continue; // переходим к обработке очередного объекта
40      case c_Func: // функции
41       NWPar = _FT[SINT.icM].Tag << 1;
42       if (NWPar) // если есть параметры
43        __PushPar (Addr, NWPar); // прячем их в программный стек
44 #pragma warn -pro // транслятор зачем-то требует prototype
45       *(UI32MD)(TDP)&SINT.ACC = (*(UI32MF)_FT[SINT.icM].Addr) ();
46 #pragma warn +pro // транслятор зачем-то требует prototype
47       if (NWPar) // если есть параметры
48        __PopDumm (NWPar); // восстанавливаем стек
49       if ((SINT.cM & SACC) != SACC)
50        if (NWPar) // параметры лежат вместе с объектом
51 if ((SINT.cM & SPTR) == (UI16)SPTR)
52  (*(TEQS TPD *)SINT.APQ).Addr
53    = (*(TEQS TPD *)SINT.APQ).Addr + sizeof (Addr);
54 else // и не по косвенной адресации
55  (*(TEQS TPD *)SINT.APQ).Addr = (*(TEQS TPD *)SINT.APQ).Addr + NWPar;
56       continue; // переходим к обработке очередного объекта
57      case c_Special: // системные методы
58       switch (SINT.cM) // имена методов известны программе
59       { // по умолчанию
60        case m_EndSO: // пустой объект (конец очереди)
61 __PopStack (SINT.APSQ);
62         if ((*(TS TPD *)SINT.APSQ).iStack == -1)
63          goto LQMonitor; // стек закончился, выход из монитора
64        case m_NOP: // пустое действие (задержка, заглушка)
65         continue; // переходим к следующему объекту
66        default: // метод не опознан
67 goto LSetErrBadClassName;
68       } // конец переключателя системных объектов
69      default: // класс метода не опознан
70 LSetErrBadClassName: // метка для аналогичных ошибок
71       ErrorCode = BadClassName;// ошибка в программе или в данных
72       continue; // переходим к обработке очередного объекта
73     } // конец переключателя по классу метода
74    case c_ABORT: // закончить обработку стека очередей
75     goto LQMonitor; // выход из монитора
76    case c_EXIT: // выход из программы (авария)
77    default: // неверное имя команды
78     ErrorCode = GeneralFault; // такого быть не должно
79     continue; // ошибка будет обработана
80   } // конец переключателя по команде монитора
81  } // конец бесконечного цикла монитора
82 LQMonitor:; // выход из монитора по case
83 } // __Monitor ()
08.12.2017 21:09
 
`