Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''ENCLOSE''' (окружить) — фортовское слово [[Каллисто]]. | | '''ENCLOSE''' (окружить) — стандартное слово [[Каллисто]]. |
| ENCLOSE ( a1 c −− a2 u1 u2 ) Окружить. Выделить лексему с адреса a1 и ограничительным символом c.
| |
| Слово ENCLOSE — важный [[примитив]], делающий «чёрную работу» для [[WORD]].
| |
|
| |
|
| == Ввод слова ENCLOSE == | | == Ввод слова ENCLOSE == |
Строка 17: |
Строка 15: |
|
| |
|
| == Реализация == | | == Реализация == |
| <pre>
| | Слово ENCLOSE в ФОРТ-ЕС было [[примитив]]ом. Вот его определение: |
| 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> | | <PRE> |
| ENCLOSE * A,C->A,N1,N2,N3 ВВОД СЛОВА 27
| |
|
| |
| Экран номер 27 | | Экран номер 27 |
| ( 31.03.66 ENCLOSE WORD ) | | ( 31.03.66 ENCLOSE WORD ) |
Строка 75: |
Строка 29: |
| 2 =Н 1 PUSH, RW1 14 LR, PUSHRW1 В, END-CODE | | 2 =Н 1 PUSH, RW1 14 LR, PUSHRW1 В, END-CODE |
| </PRE> | | </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]]
| |
|
| |
|
|
| |
|
Строка 123: |
Строка 35: |
| [[Категория:Слова Каллисто]] | | [[Категория:Слова Каллисто]] |
| [[Категория:Примитивы]] | | [[Категория:Примитивы]] |
| | [[Категория:Слова Каллисто без стековых диаграмм]] |