Редактирование: ENCLOSE

Перейти к навигации Перейти к поиску
Внимание: Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы войдёте или создадите учётную запись, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий ниже, чтобы убедиться, что это нужная вам правка, и запишите страницу ниже, чтобы отменить правку.

Текущая версия Ваш текст
Строка 1: Строка 1:
'''ENCLOSE''' (окружить) — фортовское слово [[Каллисто]].
'''ENCLOSE''' (окружить) — стандартное слово [[Каллисто]].
ENCLOSE        ( a1 c −− a2 u1 u2 )                Окружить. Выделить лексему с адреса a1 и ограничительным символом c.
Слово ENCLOSE — важный [[примитив]], делающий «чёрную работу» для [[WORD]].


== Ввод слова ENCLOSE ==
== Ввод слова ENCLOSE ==
Строка 15: Строка 13:
         This proceedure will not process past an ascii 'null', treating it
         This proceedure will not process past an ascii 'null', treating it
         as an unconditional delimiter.
         as an unconditional delimiter.
== Реализация ==
<pre>
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
</pre>
=== Советская реализация ===
Слово ENCLOSE в ФОРТ-ЕС было [[примитив]]ом. Вот его описание и определение:
<PRE>
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
</PRE>
В FORTH ИТЭФ слово ENCLOSE называлось ENCL и также было [[примитив]]ом, вот его определение:
<PRE>
  ;        ******************
            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
</PRE>
== Ссылки ==
* {{Исходник|ENCLOSE|ENCLOSE}}
* См. слово [[WORD]]




Строка 122: Строка 18:
{{заготовка}}
{{заготовка}}
[[Категория:Слова Каллисто]]
[[Категория:Слова Каллисто]]
[[Категория:Примитивы]]
[[Категория:Слова Каллисто без стековых диаграмм]]
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:

Отменить Справка по редактированию (в новом окне)