WinForth32 v1.00a (с) Горчаков Г.Ю. 1999
32-разрядный Форт для платформы Win32

Создан на базе SMAL32        http://ht.psy.msu.ru/smal32
и под влиянием SPF315        http://www.eserv.ru

Компилятор, интерпретатор.

Реализация:

- В FW32 используется прямой шитый код;
- интерпретатор работает в консольном варианте, если запустить FW32.EXE без параметров;
- при указании в  командной строке имени файла, выполнится его компиляция и завершение
  работы (если нет ошибок в тексте);
- максимальная длина строки со счетчиком - 255;
- максимальная длина строки в тексте - 1023;
- в качестве разделителя слов используется BL и TAB;
- в именах определений могут использоваться любые символы;
- при поиске в словаре прописные и строчные символы не различаются;
- встроенный ассембер перенесен из Smal32 Ver 97.11.1.

   Внешне, и во многом внутренне это  SMAL32 переписанный под платформу WIN32. Сохранена
 структура словарной статьи, адресный интерпретатор. Практически без изменений перенесен
 встроенный  ассемблер,  слова  для работы с локальными переменными, процесс компиляции,
 сообщения об ошибках.

   В отличие от SMAL32:
     Нет слов USE, MAKEUNIT ( адреса работы слов в библиотеках от SMAL32 не совместимы ).
     Нет встроенной мультизадачности.
     Вместо переменных MInMem, MaxMem введена одна переменная UpMem на основании которой
  заполняются поля о размере необходимой памяти в заголовке .EXE файла. Смысл такой-же как
  в MinMem.
     Введена переменная Warning. Если в эту переменную записано True, перед создании новой
  словарной  статьи  будет  выполнена  попытка найти это имя в словаре. При удачном поиске
  выдается предупреждающее сообщение.
     В создаваемую Defer переменную первоначально записывается адрес NOOP.
     Через Defer переменные определены слова:
  Restart, >Upper, >Lower, Key, ?Key, Bye, Error, Type.
     В переменной Tabbing записано количество пробелов заменяющих символ Tab в тексте.
     При работе слова Word и при форматном преобразовании чисел используется область памяти
  WordBuf размером 256 байт, а не свободная часть словаря.
     Переменная отвечающая за совместимость слова EndCase с ANS стандартом называется ANS и
  является Value переменной.
     Слово SEE теперь дизассемблирует и Code-слова

     Для генерации исполняемого файла можно использовать слова Save и Build:

    Save
    "FileName" --> 
    Cохранение текущего состояния Forth системы со всеми определенными словами (генерация
    новых версий). Пример:
    Save newforth - будет записана новая версия "newforth.exe"

    Build
    C-Adr "FileName[.exe]" ["FileName[.map]]" -->
    C-Adr - ASCIIz строка с именем значка который будет ассоциироваться с данной программой.
    В исполняемый модуль будут включены только те слова которые используются в проекте.
    Пример:
    A" ico\\myprg" Build myprg myprg - построение файла myprg.exe с значком myprg.ico и 
    создание файла ссылок myprg.map
	Созданный файл настороен на работу как GUI приложение. Если необходимо работать как
    консольное приложение выполните слово InitConsole.
    ASCIIz -->
        Пример:  A" Консоль" InitConsole    ASCIIz строка параметров - это имя окна консоли.
    
        Процесс запуска определяется Defer переменной Restart. В интерпретаторе в этой
    переменной записан адрес слова System. При  генерации  исполняемого  модуля  словом 
    Build в эту переменную записывается исполняемый адрес последнего определенного слова.

     Импорт API функций выполняется создающим словом ImportDLL в контексте:
  AdrNameLib "Word" "NameProc" -->
     Со стека снимается адрес строки с именем библиотеки создается словарная статья с
     именем "Word" в поле параметров которого записываются ссылка на имя библиотеки,
     адрес вызова процедуры и имя прцедуры "NameProc". Адрес вызова будет заполнен после
     первого выполнения созданного слова. Определить имя библиотеки можно примерно так:
  Create  USER32.DLL A" USER32.DLL" A, Create;
     В WF32 уже определены следующие имена библиотек:
     KERNEL32.DLL, USER32.DLL, GDI32.DLL, COMCTL32.DLL.
     Используются API функции:

	Библиотека			Слово		Имя функции
	KERNEL32.DLL	ImportDLL	GetStdHandle	GetStdHandle
	KERNEL32.DLL	ImportDLL	SetConsoleTitle	SetConsoleTitleA
	KERNEL32.DLL	ImportDLL	AllocConsole	AllocConsole

	KERNEL32.DLL	ImportDLL	CloseHandle	CloseHandle
	KERNEL32.DLL	ImportDLL	CreateFile	CreateFileA
	KERNEL32.DLL	ImportDLL	DeleteFile	DeleteFileA
	KERNEL32.DLL	ImportDLL	SetFilePointer	SetFilePointer
	KERNEL32.DLL	ImportDLL	ReadFile	ReadFile
	KERNEL32.DLL	ImportDLL	WriteFile	WriteFile
	KERNEL32.DLL	ImportDLL	GetFileSize	GetFileSize

	KERNEL32.DLL	ImportDLL	ExitProcess	ExitProcess
	KERNEL32.DLL	ImportDLL	?InConsole	GetNumberOfConsoleInputEvents
	KERNEL32.DLL	ImportDLL	InConsole	ReadConsoleInputA
	KERNEL32.DLL	ImportDLL	GetCommandLine	GetCommandLineA
      
       В заголовке EXE файла явным образом импортируются следующие функции:

   LoadLibraryA, GetProcAddress - для загрузки функций API.
   GetLastError, FormatMessageA, MessageBoxA - для сообщения об ошибках загрузки функций.

      По умолчанию в WF32 значения переменных следующие:

	RStackSize, StackSize	- 16 Kbytes
	LStackSize		- 256 KBytes
	UpMem			- 1 MBytes
	Tabbing			- 8
	Warning			- False
	ANS			- False


	Заранее благодарен за все замечания и пожелания.
        Геннадий Горчаков. G.Gorchakov@rostuzes.elektra.ru