// 2010.02.10 # Doj
// Заголовок к плагинам DEmbro
// НЕ ТРОГАТЬ НИЧЕГО! ОПИСАНИЯ ДОЛЖНЫ СОВПАДАТЬ С ЯДРОМ DEMBRO!

include" core\createwords.de"

namespace DE_PLUGIN

// {{{ constants
// params' type
0 enum paramtype:
paramtype: TYPE_INT
paramtype: TYPE_STR
paramtype: TYPE_DATA

// params' id
0 enum paramid:
paramid: ID_APPTYPE
paramid: ID_OUTPUT
paramid: ID_COMMANDS
paramid: ID_CODE

// ID_APPTYPE
0 enum apptype:
apptype: APPTYPE_CONSOLE
apptype: APPTYPE_GUI

0 enum embrotype:
// Неоднородные данные
// Если embro[i].type == ET_DATA, то участок памяти начиная
// с &embro[i+1] размером embro[i].size байт хранит данные, 
// которые нужно сохранить в первозданном виде
// Следующий значимый embroitem находится в 
//   embro[i + embro[i].size/sizeof(embroitem_t) + 1 + 
//                      embro[i].size%sizeof(embroitem_t)==0?0:1]
// Если последовательно идут два ET_DATA блока, то после преобразования
// шитого кода они должны остаться последовательными
embrotype: ET_DATA
// Опкод команды на выполнение
// В val хранится опкод команды
// При преобразованиях таблицы команд следует обновлять все опкоды
embrotype: ET_OPCODE
// Опкод команды в качестве параметра другой команды
// В val хранится опкод
// При преобразованиях таблицы команд следует обновлять все опкоды
embrotype: ET_PARAM_OPCODE
// Указатель на место в коде
// Если embro[i].type == ET_EMBRO_PTR, то 
// указатель ссылается на embro[embro[i].val]
// При преобразованиях кода следует обновлять ембро-указатели
embrotype: ET_EMBRO_PTR
// Указатель на XT-команду, хранится в val
embrotype: ET_XT
// Указатель на какую-то область данных
embrotype: ET_PTR
// Параметр команды -- умещается в 1 ячейку и не требует своего изменения
// при всяких преобразованиях. Например, (literal) использует параметр такого
// типа
embrotype: ET_PARAM
// }}}
// {{{ types
  
// 
// name -- Имя команды
// flags -- флаги; 
//   bit0 является ли команда immediate (immediate флаг)
//   bit1 является ли команда встроенной, или она является функцией (builtin флаг)
//        в первом случае код для команды подразумевается стандартное, во втором
//        он указан в поле code
//   bit2 является ли команда noname (noname флаг)
// code -- номер элемента в embro, начиная с которого идёт описание (embro указатель)
// data -- номер байта в embro, начиная с которого находятся данные для команды
// parent --  определяющее слово, которым создана данная команда
// builtin -- если команда встроенная (см. флаги), то это поле определяет её
//            название, под которым она известна в документации
0
  t_pchar -- .name
  t_int   -- .flags
  t_uint  -- .code
  t_uint  -- .data
  t_uint  -- .parent
  t_pchar -- .builin
struct command_s

// Таблица команд
//   count -- число команд в таблице
//   items -- указатель на массив, состоящий из структур command_s
0
  t_int   -- .count
  t_ptr   -- .items
struct table_s 

0
  t_uint8  -- .type
  t_uint16 -- .size
  t_uint8  -- .reserved
  align
  t_uint   -- .value
struct embroitem_s

0
  t_uint   -- .count
  t_ptr    -- .items
struct embro_s 
// }}}
// {{{ functions
: util-- c; ptr, t_ptr -- ;
0
  // Переводит число байт в число ячеек, которые они занимают
  :noname ( i-i) 1 cells 1- + 1 cells div 1 max ; 
  :c-noname t_int t_int stdcall util-- datasize->offset
struct s_utils
// }}}
// {{{ prototypes
declare-header dePlugin
// в type должно быть возвращено 1
// в version два младших разряда — minor часть, остальное — major-часть
// Например version==1234 означает версию 12.34
:a depInfo ( out name) t_ptr ( out type) t_ptr ( out version) t_ptr t_void header;
:a depSetParam ( id) t_int ( type) t_int ( val) t_ptr (size) t_int t_void header;
:a depCompile t_void header;
:a depError ( out id) t_ptr ( out pos) t_ptr ( out id) t_int header;
:a depErrorString ( id) t_int ( out pchar) t_pchar header;
// }}}
// {{{ DEmbro utils
// Nothing for non-DEmbro code
: dep-load-plugin ( filename -- p false | i) ;
: p! ( ii-) swap DE_INT swap 0 depSetParam ;
// }}}

/namespace
