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
Ссылки
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |