ENCLOSE

Материал из ПМК вики
Перейти к навигации Перейти к поиску

ENCLOSE (окружить) — фортовское слово Каллисто.

ENCLOSE        ( a1 c −− a2 u1 u2 )                 Окружить. Выделить лексему с адреса a1 и ограничительным символом c.

Слово ENCLOSE — важный примитив, делающий «чёрную работу» для WORD.

Ввод слова ENCLOSE[править]

В режиме ЛАТ последовательно нажмите клавиши  ИП   4   С/П      5   1   ИП 

ENCLOSE в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]

ENCLOSE addr1 c -- addr1 n1 n2 n3
       The text scanning primitive used by WORD. From the text address
       addr1 and an ascii delimiting character c, is determined the byte
       offset to the first non-delimiter character n1, the offset to the
       first delimiter after the text n2, and the offset to the first
       character not included.
       This proceedure will not process past an ascii 'null', treating it
       as an unconditional delimiter.

Реализация[править]

 930 ;#ENCLOSE
 931 ; ENCLOSE          ( a1 c −− a2 u1 u2 )                 Окружить. Выделить лексему с адреса a1 и ограничительной литерой c.
 932 ;               ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
 933 ; Делает смелое предположение, что дело происходит не в памяти программ
 934 LENCL:          .DB     7
 935                 .TEXT   "ENCLOSE"               ; ENCLOSE  ( a1 c −− a2 len da )
 936                 .DW     LGREAT
 937 ENCL:           .DW     JENCL
 938 JENCL:          RM3 MA 1 + MB
 939                 KRMA M0                         ; R0 Разделитель
 940                 KRMB 1 EE 4 − M8 M5             ; R5 Начальный адрес
 941 A:              Cx KRM8 RM0 −                   ; Обход разделителей в начале
 942                 FX=0 NOTEQ
 943 AAA:            RM8 1 + M8  GOTO A
 944 NOTEQ:          RM0 32 −  FX=0 ENCLNSP          ; Только если пробел, проверить другие литеры
 945                 KRM8 9 −  FX!=0 AAA             ;  9 TAB
 946                 1 −  FX!=0 AAA                  ; 10 LF
 947                 3 −  FX!=0 AAA                  ; 13 CR
 948 ENCLNSP:        Cx EE 4 RM8 M7 + KMB            ; Начало лексемы
 949                 RM0 32 −  FX!=0 AASP
 950 AA:             Cx KRM8  PX!=0 ZZZ              ; Если нуль
 951                 RM0 −  PX!=0 EQW
 952                 RM8 1 + M8  GOTO AA
 953 AASP0:          RM8 1 + M8
 954 AASP:           Cx KRM8  PX!=0 ZZZ              ; Если нуль
 955                 32 −  PX!=0 EQW                 ; 32 пробел
 956                 FX<0 AASP0                      ; Пропустить всё, что больше пробела
 957                 23 +  FX!=0 EQW                 ;  9 TAB
 958                 1 −  FX!=0 EQW                  ; 10 LF
 959                 3 −  PX=0 AASP0                 ; 13 CR
 960 EQW:            RM8 RM7 − KMA
 961                 RM8 1 + RM5 − KM3
 962                 KGOTO9
 963 ZZZ:            RM8 RM7 −  FX=0 EQW0
 964                 EE                              ; 0 −> 1
 965 EQW0:           KMA
 966                 RM8 RM5 − KM3
 967                 KGOTO9

Советская реализация[править]

Слово ENCLOSE в ФОРТ-ЕС было примитивом. Вот его описание и определение:

ENCLOSE  * A,C->A,N1,N2,N3 ВВОД СЛОВА                           27

                     Экран номер 27
( 31.03.66    ENCLOSE  WORD )

CODE ENCLOSE ( A,C->A,N1,N2,N3) 14  LHRW12 BAL, RW1 RMASK NR,
  RW1 RFORTH AR,  14 14 SR,   0 0 SR,
 BEGIN,   0 0 (, 14  RW1 IC,   0 0 LTR,   2 =F  BZ,
     14 1 (, 0 14 LA, 0 RW2 CR, ?NE UNTIL,  14 0 BCTR,
2 =Н 14 PUT,
BEGIN,   1 14 LR,  0 0 (, 1 RW1 IC, 0 0 LTR,
  2 =F BZ,  14 1 (, 0 14 LA, 0 RW2 CR,   ?E UNTIL,
2 =Н  1 PUSH, RW1 14 LR,   PUSHRW1 В, END-CODE

В FORTH ИТЭФ слово ENCLOSE называлось ENCL и также было примитивом, вот его определение:

   ;         ******************

             HEAD    204Q,'ENC',314Q,ENCL                 ; ENCLOSE
             POP   AX         ; разделитель

             POP   CX         ; начальный адрес
             MOV   BX, CX
   A:        CMP   BYTE PTR  [BX], AL ; обход разделителей в начале
             JNE   NOTEQ
   AAA:      INC   BX
             JMP   A
   NOTEQ:    CMP   BYTE PTR  [BX], 15Q
             JE    AAA
             CMP   BYTE PTR  [BX], 12Q
             JE    AAA
             MOV   DX, BX               ; начало лексемы
             PUSH  DX
   AA:       CMP   BYTE PTR  [BX],  0
             JE    ZZZ                  ; если нуль
             CMP   BYTE PTR  [BX], AL  ; не нуль, ищем конец лексемы
             JE    QW
             INC   BX
             JMP   AA
   EQW:      MOV   AX, BX
             SUB   BX, DX
             PUSH  BX
             SUB   AX, CX
             INC   AX
             PUSH  AX
             NEXT
   ZZZ:      CHP   BX, DX
             JNE   EQW
             INC   BX
             JMP   EQW

Ссылки[править]


  Nopictures-icon.png У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их.


  Stub-icon-48px.png Это заготовка статьи. Вы можете помочь проекту, дополнив её.