Текущая версия |
Ваш текст |
Строка 53: |
Строка 53: |
|
| |
|
| == Реализация == | | == Реализация == |
| В [[Каллисто|Каллисто 1.0]] примитив EXIT тесно связан с остальным [[Адресный интерпретатор|адресным интерпретатором]], сложность которого вызвана необходимостью исполнять [[шитый код]] как из [[Регистры байтовых данных|области данных]], так и из [[Память программ|памяти программ]]:
| |
| <pre>
| |
| 1768 ;#EXIT
| |
| 1769 ; EXIT ( −− ) Закончить исполнение текущего определения.
| |
| 1770 LEXIT: .DB 4
| |
| 1771 .TEXT "EXIT"
| |
| 1772 .DW LRPSTO
| |
| 1773 EXIT: .DW RETURN ; При использовании EXIT внутри FOR .. NEXT нужно предварительно выполнить UNLOOP
| |
| …
| |
| 2470 SETRIDAT:
| |
| 2471 M6 ; RI := RX
| |
| 2472 SETDAT: .NUMT RPUSHRID
| |
| 2473 MC ; RC := RPUSHRID ;∗∗ Следующий вызов −− из памяти данных
| |
| 2474 .NUM NEXTD
| |
| 2475 M9 ; R9 := NEXTD ;∗∗
| |
| 2476 NEXTD: ; NEXT для шитого кода из памяти данных.
| |
| 2477 KRM6 RME ∗ KRM6 + M7 ; W := MEMW[RI++] считать шитый код
| |
| 2478 1 EE 4 − FX>=0 NEXTPP ; Слово из памяти программ?
| |
| 2479 NEXTDD: M7 M5 KRM7 RME ∗ KRM5 + ; Считать MEMW[W], это должно быть CFA очередного слова в шитом коде
| |
| 2480 M8 KGOTO8 ; передать управление на адрес, записанный в CFA
| |
| 2481 ;
| |
| 2482 RETURN: ; Обработчик EXIT
| |
| 2483 RM2 1 − M5 3 + M2
| |
| 2484 KRM5 RME ∗ KRM5 +
| |
| 2485 PPM 9042 ; Регистр, увы, мучаем в любом случае
| |
| 2486 10001 −
| |
| 2487 FX<0 SETRIDAT
| |
| 2488 GOTO SETPRG
| |
| …
| |
| 2495 SETPRG: .NUMT RPUSHRIP
| |
| 2496 MC ; RC := RPUSHRIP ;∗∗ Следующий вызов −− из памяти программ
| |
| 2497 .NUM NEXTP
| |
| 2498 M9 ; R9 := NEXTP ;∗∗
| |
| 2499 NEXTP: ; NEXT для шитого кода из памяти программ.
| |
| 2500 PPRM 9044 RME ∗ PPRM 9044 +
| |
| 2501 DOEXECRX: M7 ; W := MEMW[RI++] считать шитый код
| |
| 2502 1 EE 4 − FX<0 NEXTDD ; Слово из области двоичных данных?
| |
| 2503 NEXTPP: RM7 KPRGM RME ∗ RM7 1 + KPRGM + ; Считать MEMW[W], это должно быть CFA очередного слова в шитом коде
| |
| 2504 M8 KGOTO8 ; передать управление на адрес, записанный в CFA
| |
| </pre>
| |
| Реализации из SP-Forth 4.20:
| |
| <pre>
| |
| : RET, ( -> ) \ скомпилировать инструкцию RET
| |
| ?SET SetOP 0xC3 C, OPT OPT_CLOSE
| |
| ;
| |
| …
| |
| : EXIT
| |
| RET,
| |
| ; IMMEDIATE
| |
| </pre>
| |
| <pre>
| |
| \ : EXIT ( REDEFINE EXIT TO TAKE CARE OF MACROS )
| |
| \ IN-MACRO? IF LEAVE-MACRO THEN R> DROP ;
| |
| ( REDEFINE EXIT TO BE CLOSER TO STANDARD )
| |
| : ?LEAVE-MACRO ( CONDITIONALLY UNNEST A MACRO )
| |
| IN-MACRO? IF LEAVE-MACRO THEN ;
| |
|
| |
| : EXIT ( REDEFINE EXIT TO TAKE CARE OF MACROS )
| |
| STATE @ IF POSTPONE ?LEAVE-MACRO POSTPONE EXIT ELSE
| |
| ?LEAVE-MACRO EXIT THEN ; ALSO FORTH IMMEDIATE PREVIOUS
| |
| </pre>
| |
| <pre>
| |
| : EXIT
| |
| ?SET SetOP 0xC3 C, OPT OPT_CLOSE ; IMMEDIATE
| |
| </pre>
| |
|
| |
| === Советская реализация ===
| |
| Слово EXIT в ФОРТ-ЕС было [[примитив]]ом. Вот его описание и определение: | | Слово EXIT в ФОРТ-ЕС было [[примитив]]ом. Вот его описание и определение: |
| <PRE> | | <PRE> |
Строка 158: |
Строка 91: |
| [[Категория:Стандартные слова]] | | [[Категория:Стандартные слова]] |
| [[Категория:1994 CORE]] | | [[Категория:1994 CORE]] |
| [[Категория:2012 CORE]]
| |