Oct 30, 2016 15:28
WORD: setmodule
HERE - адрес поля имени
HEADER - заголовок с полем связи
HERE - поле кода
CELL+ DUP >R - прячем адрес первой ячейки поля парметров, сюда будет сохранен адрес модуля
CELL+ , - плюс 2 ячейки это адрес исполняющей части слова
1+ (SetModule) - адрес поля имени был положен выше, откусываем счетчик и получаем адрес прилинкованного модуля
R> ! - пишем адрес
Заметка: использование >R R> уже плохо. Можно ли избавиться?
Сперва получим адрес, а потом уже будем формировать исполняющую часть
WORD: setmodule
HERE 1+ HEADER (SetModule)
HERE 0 , - временное поле кода
HERE SWAP! - сохраним адрес
не выходит.
Попробуем декомпозировать.
Отдельно получение и сохранение адреса, отдельно - создание поля кода.
WORD: procAddress ( на входе - адрес поля имени. его надо скомпилировать в первую ячейку поля параметров )
1+ (SetModule) , ;WORD
WORD: fillCfa ( на входе - адрес поля имени )
N>LINK CELL+ DUP CELL+ CELL+ SWAP! ;WORD
WORD: NAME> N>LINK CELL+ ;WORD
игого:
WORD: setmodule HERE DUP HEADER procAddress fillCfa
( Далее компилируем низкоуровнгевый код )
1_int invoke ;WORD
Заново:
WORD: setmodule
HERE
HEADER HERE 0 , SWAP
1+ (SetModule) ,
HERE SWAP!
1_int invoke ;WORD