...За 9 месяцев познаний и изучения форта я многое понял, благодаря
попыткам написать свою систему, но некоторые вопросы функционирования мне
остаются непонятны. Сейчас я почти написал F79(16-битный), но... Короче, у меня есть к вам вопросы
Далее я опишу часть моего кода(пишу я на FASM):
Код:
...
macro rpush [arg] { forward
dec bp
dec bp
mov [bp],arg
}
...(основные макросы)
macro AWORD name,wname
{
LAST!!=$
name#_NFA:
name#_sz db @f-name#_n
name#_n db wname
@@:
name#_LFA dw lastword
name:
name#_CFA dw name
name#_PFA dw @f
@@ dw 0
lastword=LAST!!
numwords!!=numwords!!+1
LASTCFA=name#_CFA
}
macro FWORD name,wname
{
LAST!!=$
name#_NFA:
name#_sz db @f-name#_n
name#_n db wname
@@:
name#_LFA dw lastword
name:
name#_CFA dw colon ; (?)
name#_PFA dw name
lastword=LAST!!
numwords!!=numwords!!+1
LASTCFA=name#_CFA
}
macro __IMMEDIATE
{
load c byte from LAST!!
store byte (c or 10000000b) at LAST!!
}
macro __DOES
{
store word $ at LASTCFA
store word colon at LASTCFA+2
}
macro _END { }
macro AEND { _END
jmp FNEXT }
macro FEND { _END
dw semicolon }
...
FNEXT:
cld
lodsw
jmp [ax] ; (?)
...
AWORD DIVIDE,"/DIV"
pop bx,ax
idiv bx
push dx,ax
AEND
...
FWORD _MOD,"MOD"
dw DIVIDE,SWAP,DROP
FEND
...
AWORD colon,"colon"
; AX - CFA
rpush si
mov bx,ax
inc bx
inc bx
; BX - PFA (executable parameters)
mov si,[bx]
inc bx
inc bx
push bx ; other parameters
AEND
...
AWORD semicolon,"semicolon"
rpop si
jmp FNEXT
_END
...
Раньше, до недавнего времени, я не очень понимал что такое PFA и делал так:
CFA=CODELINK(исполняемый адрес, используется обычно только при поиске)
PFA: код на форте
Т.е. в словах на ассемблере я его не учитывал.
А АИ(адресный интерпретатор) у меня был такой:
Код:
AWORD FCALL,"FCALL"
dec bp
dec bp
mov [bp],si
pop si
jmp FNEXT
AWORD FNEXT,"FNEXT"
cld
lodsw
jmp ax
AWORD FRET,"FRET"
mov si,[bp]
inc bp
inc bp
jmp FNEXT
МАКРОСЫ:
[color=#FF0000]macro _WORD a_f,name,wname,imm ; (Ещё) ранее я так не совмещал...
; a_f - asm/4th word
; name - name in sources
; wname - name in the system
; imm - immediate
{
LAST!!=$
name#_NFA:
IF imm<>0
name#_sz db (name#_LFA-name#_n) or 128
ELSE
name#_sz db name#_LFA-name#_n
END IF
name#_n db wname
name#_LFA dw lastword
LASTCFA=$
name#_CFA dw name#_PFA
name#_PFA:
IF a_f<>0
name:
call FCALL
END IF
lastword=LAST!!
numwords!!=numwords!!+1
}
macro AWORD name,wname { _WORD 0,name,wname,0
name: }
macro AWORDI name,wname { _WORD 0,name,wname,1
name: }
macro FWORD name,wname { _WORD 1,name,wname,0 }
macro FWORDI name,wname { _WORD 1,name,wname,1 }[/color]
---------------------------------------
1-й вопрос:
Так какой вариант лучше/правильнее( меня просто DOES> запутал :] )?
2-й вопрос:
Как понять строение словарей из стандартов F79/F83 (VOCABULARY)?
В одном из фортов(кажется скачал с taygeta) я нашёл такую реализацию:
Код:
( M4th KERNEL Lexicon Related Things )
VARIABLE (DICTIONARY) ( Beginning of new dictionary )
( Begin a new sub-dictionary )
: NEW-DICTIONARY ( -- ) LAST @ (DICTIONARY) ! ;
( Create dictionary )
: DICTIONARY ( -- ) (DICTIONARY) @ 0= IF
ABORT" bad dictionary scope!" THEN
CREATE LAST @ , ( LFA of new Dict )
(DICTIONARY) @ , LAST @ @ , ( Hide/Show Link )
0 (DICTIONARY) ! DOES> SWAP IF
DUP 4 + @ SWAP @ ! ( TRUE: Link in dict )
ELSE
DUP 2 + @ SWAP @ ! THEN ; ( FALSE: Remove dict )