( óÌÏ×Á ÎÅÍÅÄÌÅÎÎÏÇÏ ×ÙÐÏÌÎÅÎÉÑ, ÉÓÐÏÌØÚÕÅÍÙÅ ÐÒÉ ËÏÍÐÉÌÑÃÉÉ
ÓÔÒÕËÔÕÒ ÕÐÒÁ×ÌÅÎÉÑ × ÔÅÌÅ ×ÙÓÏËÏÕÒÏ×ÎÅ×ÏÇÏ ÏÐÒÅÄÅÌÅÎÉÑ.
ïó-ÎÅÚÁ×ÉÓÉÍÙÅ ÏÐÒÅÄÅÌÅÎÉÑ.
Copyright [C] 1992-1999 A.Cherezov ac@forth.org
ðÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÉÚ 16-ÒÁÚÒÑÄÎÏÇÏ × 32-ÒÁÚÒÑÄÎÙÊ ËÏÄ - 1995-96ÇÇ
òÅ×ÉÚÉÑ - ÓÅÎÔÑÂÒØ 1999
)
: IF \ 94
\ éÎÔÅÒÐÒÅÔÁÃÉÑ: ÓÅÍÁÎÔÉËÁ ÎÅÏÐÒÅÄÅÌÅÎÁ.
\ ëÏÍÐÉÌÑÃÉÑ: ( C: -- orig )
\ ðÏÌÏÖÉÔØ ÎÁ ÕÐÒÁ×ÌÑÀÝÉÊ ÓÔÅË ÐÏÚÉÃÉÀ ÎÏ×ÏÊ ÎÅÒÁÚÒÅÛÅÎÎÏÊ ÓÓÙÌËÉ ×ÐÅÒÅÄ orig.
\ äÏÂÁ×ÉÔØ ÓÅÍÁÎÔÉËÕ ×ÒÅÍÅÎÉ ×ÙÐÏÌÎÅÎÉÑ, ÄÁÎÎÕÀ ÎÉÖÅ, Ë ÔÅËÕÝÅÍÕ ÏÐÒÅÄÅÌÅÎÉÀ.
\ óÅÍÁÎÔÉËÁ ÎÅÚÁ×ÅÒÛÅÎÁ, ÐÏËÁ orig ÎÅ ÒÁÚÒÅÛÉÔÓÑ, ÎÁÐÒÉÍÅÒ, ÐÏ THEN ÉÌÉ ELSE.
\ ÷ÒÅÍÑ ×ÙÐÏÌÎÅÎÉÑ: ( x -- )
\ åÓÌÉ ×ÓÅ ÂÉÔÙ x ÎÕÌÅ×ÙÅ, ÐÒÏÄÏÌÖÁÔØ ×ÙÐÏÌÎÅÎÉÅ Ó ÐÏÚÉÃÉÉ, ÚÁÄÁÎÎÏÊ
\ ÒÁÚÒÅÛÅÎÉÅÍ orig.
?COMP DP @ ?BRANCH, >MARK 1
; IMMEDIATE
: ELSE \ 94
\ éÎÔÅÒÐÒÅÔÁÃÉÑ: ÓÅÍÁÎÔÉËÁ ÎÅÏÐÒÅÄÅÌÅÎÁ.
\ ëÏÍÐÉÌÑÃÉÑ: ( C: orig1 -- orig2 )
\ ðÏÌÏÖÉÔØ ÎÁ ÕÐÒÁ×ÌÑÀÝÉÊ ÓÔÅË ÐÏÚÉÃÉÀ ÎÏ×ÏÊ ÎÅÒÁÚÒÅÛÅÎÎÏÊ ÓÓÙÌËÉ ×ÐÅÒÅÄ orig2.
\ äÏÂÁ×ÉÔØ ÓÅÍÁÎÔÉËÕ ×ÒÅÍÅÎÉ ×ÙÐÏÌÎÅÎÉÑ, ÄÁÎÎÕÀ ÎÉÖÅ, Ë ÔÅËÕÝÅÍÕ ÏÐÒÅÄÅÌÅÎÉÀ.
\ óÅÍÁÎÔÉËÁ ÎÅÚÁ×ÅÒÛÅÎÁ, ÐÏËÁ orig2 ÎÅ ÒÁÚÒÅÛÉÔÓÑ (ÎÁÐÒÉÍÅÒ, ÐÏ THEN).
\ òÁÚÒÅÛÉÔØ ÓÓÙÌËÕ ×ÐÅÒÅÄ orig1, ÉÓÐÏÌØÚÕÑ ÐÏÚÉÃÉÀ ÓÌÅÄÕÀÝÅÊ ÄÏÂÁ×ÌÅÎÎÏÊ
\ ÓÅÍÁÎÔÉËÉ ×ÙÐÏÌÎÅÎÉÑ.
\ ÷ÒÅÍÑ ×ÙÐÏÌÎÅÎÉÑ: ( -- )
\ ðÒÏÄÏÌÖÉÔØ ×ÙÐÏÌÎÅÎÉÅ Ó ÐÏÚÉÃÉÉ, ÚÁÄÁÎÎÏÊ ÒÁÚÒÅÛÅÎÉÅÍ orig2.
?COMP DP @ BRANCH,
>ORESOLVE
>MARK 2
; IMMEDIATE
: THEN \ 94
\ éÎÔÅÒÐÒÅÔÁÃÉÑ: ÓÅÍÁÎÔÉËÁ ÎÅÏÐÒÅÄÅÌÅÎÁ.
\ ëÏÍÐÉÌÑÃÉÑ: ( C: orig -- )
\ òÁÚÒÅÛÉÔØ ÓÓÙÌËÕ ×ÐÅÒÅÄ orig, ÉÓÐÏÌØÚÕÑ ÐÏÚÉÃÉÀ ÓÅÍÁÎÔÉËÉ ×ÙÐÏÌÎÅÎÉÑ.
\ äÏÂÁ×ÉÔØ ÓÅÍÁÎÔÉËÕ ×ÒÅÍÅÎÉ ×ÙÐÏÌÎÅÎÉÑ, ÄÁÎÎÕÀ ÎÉÖÅ, Ë ÔÅËÕÝÅÍÕ ÏÐÒÅÄÅÌÅÎÉÀ.
\ ÷ÒÅÍÑ ×ÙÐÏÌÎÅÎÉÑ: ( -- )
\ ðÒÏÄÏÌÖÉÔØ ×ÙÐÏÌÎÅÎÉÅ.
?COMP \ HERE TO :-SET
>ORESOLVE
; IMMEDIATE
: BREAK
POSTPONE EXIT POSTPONE THEN ; IMMEDIATE
: BEGIN \ 94
\ éÎÔÅÒÐÒÅÔÁÃÉÑ: ÓÅÍÁÎÔÉËÁ ÎÅÏÐÒÅÄÅÌÅÎÁ.
\ ëÏÍÐÉÌÑÃÉÑ: ( C: -- dest )
\ ðÏÌÏÖÉÔØ ÓÌÅÄÕÀÝÕÀ ÐÏÚÉÃÉÀ ÐÅÒÅÄÁÞÉ ÕÐÒÁ×ÌÅÎÉÑ, dest, ÎÁ ÕÐÒÁ×ÌÑÀÝÉÊ ÓÔÅË.
\ äÏÂÁ×ÉÔØ ÓÅÍÁÎÔÉËÕ ×ÒÅÍÅÎÉ ×ÙÐÏÌÎÅÎÉÑ, ÄÁÎÎÕÀ ÎÉÖÅ, Ë ÔÅËÕÝÅÍÕ ÏÐÒÅÄÅÌÅÎÉÀ.
\ ÷ÒÅÍÑ ×ÙÐÏÌÎÅÎÉÑ: ( -- )
\ ðÒÏÄÏÌÖÉÔØ ×ÙÐÏÌÎÅÎÉÅ.
?COMP
4 ALIGN-NOP
\ HERE TO :-SET
<MARK 3
; IMMEDIATE
: UNTIL \ 94
\ éÎÔÅÒÐÒÅÔÁÃÉÑ: ÓÅÍÁÎÔÉËÁ ÎÅÏÐÒÅÄÅÌÅÎÁ.
\ ëÏÍÐÉÌÑÃÉÑ: ( C: dest -- )
\ äÏÂÁ×ÉÔØ ÓÅÍÁÎÔÉËÕ ×ÒÅÍÅÎÉ ×ÙÐÏÌÎÅÎÉÑ, ÄÁÎÎÕÀ ÎÉÖÅ, Ë ÔÅËÕÝÅÍÕ ÏÐÒÅÄÅÌÅÎÉÀ.
\ òÁÚÒÅÛÉÔØ ÓÓÙÌËÕ ÎÁÚÁÄ dest.
\ ÷ÒÅÍÑ ×ÙÐÏÌÎÅÎÉÑ: ( x -- )
\ åÓÌÉ ×ÓÅ ÂÉÔÙ x ÎÕÌÅ×ÙÅ, ÐÒÏÄÏÌÖÁÔØ ×ÙÐÏÌÎÅÎÉÅ Ó ÐÏÚÉÃÉÉ, ÚÁÄÁÎÎÏÊ dest.
?COMP 3 <> IF -2004 THROW THEN \ ABORT" UNTIL ÂÅÚ BEGIN !"
?BRANCH,
0xFFFFFF80 DP @ 4 - @ U<
IF DP @ 5 - W@ 0x3F0 + DP @ 6 - W! -4 ALLOT
THEN
; IMMEDIATE
: WHILE \ 94
\ éÎÔÅÒÐÒÅÔÁÃÉÑ: ÓÅÍÁÎÔÉËÁ ÎÅÏÐÒÅÄÅÌÅÎÁ.
\ ëÏÍÐÉÌÑÃÉÑ: ( C: dest -- orig dest )
\ ðÏÌÏÖÉÔØ ÐÏÚÉÃÉÀ ÎÏ×ÏÊ ÎÅÒÁÚÒÅÛÅÎÎÏÊ ÓÓÙÌËÉ ×ÐÅÒÅÄ orig ÎÁ ÕÐÒÁ×ÌÑÀÝÉÊ ÓÔÅË
\ ÐÏÄ ÉÍÅÀÝÉÍÓÑ dest. äÏÂÁ×ÉÔØ ÓÅÍÁÎÔÉËÕ ×ÒÅÍÅÎÉ ×ÙÐÏÌÎÅÎÉÑ, ÄÁÎÎÕÀ ÎÉÖÅ, Ë
\ ÔÅËÕÝÅÍÕ ÏÐÒÅÄÅÌÅÎÉÀ. óÅÍÁÎÔÉËÁ ÎÅÚÁ×ÅÒÛÅÎÁ, ÐÏËÁ orig É dest ÎÅ ÒÁÚÒÅÛÁÔÓÑ
\ (ÎÁÐÒÉÍÅÒ, ÐÏ REPEAT).
\ ÷ÒÅÍÑ ×ÙÐÏÌÎÅÎÉÑ: ( x -- )
\ åÓÌÉ ×ÓÅ ÂÉÔÙ x ÎÕÌÅ×ÙÅ, ÐÒÏÄÏÌÖÁÔØ ×ÙÐÏÌÎÅÎÉÅ Ó ÐÏÚÉÃÉÉ, ÚÁÄÁÎÎÏÊ
\ ÒÁÚÒÅÛÅÎÉÅÍ orig.
?COMP [COMPILE] IF
2SWAP
; IMMEDIATE
: REPEAT \ 94
\ éÎÔÅÒÐÒÅÔÁÃÉÑ: ÓÅÍÁÎÔÉËÁ ÎÅÏÐÒÅÄÅÌÅÎÁ.
\ ëÏÍÐÉÌÑÃÉÑ: ( C: orig dest -- )
\ äÏÂÁ×ÉÔØ ÓÅÍÁÎÔÉËÕ ×ÒÅÍÅÎÉ ×ÙÐÏÌÎÅÎÉÑ, ÄÁÎÎÕÀ ÎÉÖÅ, Ë ÔÅËÕÝÅÍÕ ÏÐÒÅÄÅÌÅÎÉÀ,
\ ÒÁÚÒÅÛÉ× ÓÓÙÌËÕ ÎÁÚÁÄ dest. òÁÚÒÅÛÉÔØ ÓÓÙÌËÕ ×ÐÅÒÅÄ orig, ÉÓÐÏÌØÚÕÑ
\ ÐÏÚÉÃÉÀ ÄÏÂÁ×ÌÅÎÎÏÊ ÓÅÍÁÎÔÉËÉ ×ÙÐÏÌÎÅÎÉÑ.
\ ÷ÒÅÍÑ ×ÙÐÏÌÎÅÎÉÑ: ( -- )
\ ðÒÏÄÏÌÖÉÔØ ×ÙÐÏÌÎÅÎÉÅ Ó ÐÏÚÉÃÉÉ, ÚÁÄÁÎÎÏÊ dest.
?COMP
3 <> IF -2005 THROW THEN \ ABORT" REPEAT ÂÅÚ BEGIN !"
DUP DP @ 2+ - DUP
SHORT?
IF SetJP 0xEB C, C, DROP
ELSE DROP BRANCH, THEN
>ORESOLVE
; IMMEDIATE
: AGAIN \ 94 CORE EXT
\ éÎÔÅÒÐÒÅÔÁÃÉÑ: ÓÅÍÁÎÔÉËÁ ÎÅÏÐÒÅÄÅÌÅÎÁ.
\ ëÏÍÐÉÌÑÃÉÑ: ( C: dest -- )
\ äÏÂÁ×ÉÔØ ÓÅÍÁÎÔÉËÕ ×ÒÅÍÅÎÉ ×ÙÐÏÌÎÅÎÉÑ, ÄÁÎÎÕÀ ÎÉÖÅ, Ë ÔÅËÕÝÅÍÕ ÏÐÒÅÄÅÌÅÎÉÀ,
\ ÒÁÚÒÅÛÉ× ÓÓÙÌËÕ ÎÁÚÁÄ dest.
\ ÷ÒÅÍÑ ×ÙÐÏÌÎÅÎÉÑ: ( -- )
\ ðÒÏÄÏÌÖÉÔØ ×ÙÐÏÌÎÅÎÉÅ Ó ÐÏÚÉÃÉÉ, ÚÁÄÁÎÎÏÊ dest. åÓÌÉ ÄÒÕÇÉÅ ÕÐÒÁ×ÌÑÀÝÉÅ ÓÌÏ×Á
\ ÎÅ ÉÓÐÏÌØÚÕÀÔÓÑ, ÔÏ ÌÀÂÏÊ ÐÒÏÇÒÁÍÍÎÙÊ ËÏÄ ÐÏÓÌÅ AGAIN ÎÅ ÂÕÄÅÔ ×ÙÐÏÌÎÑÔØÓÑ.
?COMP 3 <> IF -2006 THROW THEN \ ABORT" AGAIN ÂÅÚ BEGIN !"
DUP DP @ 2+ - DUP
SHORT?
IF SetJP 0xEB C, C, DROP
ELSE DROP BRANCH, THEN DP @ TO :-SET
; IMMEDIATE
: RECURSE \ 94
\ éÔÅÒÐÒÅÔÁÃÉÑ: ÓÅÍÁÎÔÉËÁ ÎÅ ÏÐÒÅÄÅÌÅÎÁ.
\ ëÏÍÐÉÌÑÃÉÑ: ( -- )
\ äÏÂÁ×ÉÔØ ÓÅÍÁÎÔÉËÕ ×ÙÐÏÌÎÅÎÉÑ ÔÅËÕÝÅÇÏ ÏÐÒÅÄÅÌÅÎÉÑ × ÔÅËÕÝÅÅ ÏÐÒÅÄÅÌÅÎÉÅ.
\ îÅÏÄÎÏÚÎÁÞÎÁÑ ÓÉÔÕÁÃÉÑ ×ÏÚÎÉËÁÅÔ, ÅÓÌÉ RECURSE ÉÓÐÏÌØÚÕÅÔÓÑ ÐÏÓÌÅ DOES>.
?COMP
LAST-NON DUP 0=
IF DROP LATEST NAME> THEN _COMPILE,
; IMMEDIATE