PROGRAM $CHMS
3 VALUE LENGRP [Вместимость уровня приоритетов]
4 VALUE QChannels
LENGRP 3 * 1+ VALUE LenPrioQue [длина очереди приоритетов. Очередь -- с 0]
: N2CH [N] QChannels * 0A + [NCHAN] ;
LenPrioQue 1+ N2CH 10 * LONG VCTR CHDATA [память параметров каналов]
[для каждого канала можно завести 16. различных параметров]
: CHMS.INIT 0 !!! PrioQueOID
0 LenPrioQue DO SETNQ D ;
: SETNQ C C ! PrioQueNUM C N2CH [NUM CHAN1]
[вычислили номер канала для очередного объекта кэша]
C C3 1 ! Channels
1+ C C3 2 ! Channels
1+ C C3 3 ! Channels
1+ C C3 4 ! Channels D 1+ ;
[при обращении к объекту нужно повысить его приоритет]
: HIPRIODD D HIPRIO ;
: HIPRIO [OID] FINDOID C BR- D HIPRIO1 ;
: HIPRIO1 [N] C LENGRP / D C IF+ 1- LENGRP * [N N'] E2 UPOID [] ;
[Новый объект добавляется на последн. поз-ю, а затем к нему примен. HIPRIO]
LenPrioQue LONG VCTR PrioQueOID [список OID]
LenPrioQue WORD VCTR PrioQueNUM [номера записей в массиве каналов]
LenPrioQue QChannels 2 WORD ARR Channels
[обменять в очереди с соседним вышестоящим]
: SWP2OBJ [N] C IF0 LEAVE C PrioQueOID C2 1- PrioQueOID
C3 ! PrioQueOID C2 1- ! PrioQueOID
C PrioQueNUM C2 1- PrioQueNUM C3 ! PrioQueNUM C2 1- ! PrioQueNUM 1- [N-1] ;
: SWP2OBJDD SWP2OBJ DD ;
: FINDOID [OID] 0 LenPrioQue DO CMPOID E2D C LenPrioQue = IF+ T-1 [-1/N] ;
: CMPOID [OID] C PrioQueOID [OID N OID(N)] C3 = EX+ 1+ ;
[Поднять объект от N_DOWN к N_UP в очереди]
: UPOID [N_UP N_DOWN ] C E3 - DO SWP2OBJ D [] ;
[Просмотр очереди (кэш объектов)]
: Q.VIEW 0 LenPrioQue
." M.Hdr D.Hdr M.Dat D.His"
DO QELVIEW D ;
: QELVIEW [n] CR C C 2 TON LENGRP / E2D BR0 #- #) TOB
C PrioQueOID ." OID=" .D C PrioQueNUM ." Num=" .
." Channels= " 1 QChannels DO PriNCH
DD 1+ ;
: PriNCH [NOID NCH] C2C2 Channels 4 TON SP SP 1+ [NOID NCH+1] ;