penguin.gif

SMAL32 Forth for Linux

Текущая версия SMAL32 for Linux - Альфа-версия, но вполне работающая. Первый глюк, с которым вы неизбежно столкнетесь, - это не работающая клавиша Backspace в командном режиме. На что автор посоветовал использовать Ctrl+H. Далее приводится почти полный текст прилагающегося Readme.

Особенности Linux-версии Small/32:

1. Отсутствие документации. Для выяснения важных для Вас вопросов обращайтесь к тексту стандартов или DOS-версии SMAL32.

2. Название. Если раньше название компилятора определялось инициалами двух разработчиков (Сергей Макаренков - SM, Александр Ларионов - AL), то теперь, это просто "маленький 32-разрядный Форт". ;-) Small/32 - это новое название Форт-компилятора.

3. Остутствие практически всех платформо-зависимых библиотек. Возможно, они появятся в будущем.

4. Small/32 создает полностью независимые исполняемые модули в формате ELF, не использующие ни статические, ни динамические libc-библиотеки. Все обращения к ядру идут через INT 80h.

5. Слова BUILD, SAVE, MAKEUNIT, LOADDATA, LOADFONT не добавляют расширения к именам файлов. Имя директоии добавляется, если в имени файла она не указана явно (отсутствуют символы /).

6. Из слов, входивших в версии DOS в основной модуль (FORTH.EXE) сохранены практически все, кроме слов, обеспечивающих внутреннюю многозадачность (под Linux это менее актуально, да и если будет необходимость их я тоже перенесу) и слов типа SETDRIVE, GETDRIVE, привязанных к файловой структуре DOS.

7. ?KEY всегда возвращает FALSE. Видимо, скоро доделаю.

8. Пока не реализованы слова GETDIR, RENAMEDIR, FSETTIME, FGETTIME. Появятся по мере моего ознакомления с соответсвующими системными вызовами.

9. Добавлено слово UNIXDATE, возвращающее количество секунд, прошедших с 1-го января (если не ошибаюсь) 1970-го года. Реализованы слова PACKDATE ( sec min hour day month year --> unixdate ) и UNPACKDATE ( unixdate --> sec min hours day month year ).

10. Слово MAKEDIR требует второй параметр - атрибуты (permissions) создаваемой директории.

11. Об атирибутах файлов: если в качестве второго параметра в словах FCREATE и MAKEDIR указать 0, вместо нуля будет использоваться содержимое переменной FILEMODE (перврначальное значение = 1b6h). Для совместимости с DOS-версией, где нулевое значение при создании файла - наиболее часто используемое.

12. При инициализации системы используется файл small32.ini в текущей директории. Если он не найден - файл small32.ini из HOME-директории пользователя.

13. Слова \LIBS, \EXE, \DATA, \FONTS и \INC теперь называются /LIBS, /EXE, /DATA, /FONTS и /INC соответсвенно.

14. Удален механизм внутренней обработки GPF. Удалены слова ?DPMI, FORCEDPMI, ADDEXT, ADUMP, NOTRAPS, TRAPPROC, STDTRAP.

15. Системые ошибки пока диагносцируются адекватно. STDERR интерпретирует значение ERRNO в контексте linux.

16. При старте forth меняет параметры терминала. При выходе по BYE - восстанавливает старые. При выходе по Ctrl+C этого не происходит. Сейчас, когда есть обработка сигналов, Вы можете это сделать сами.

17. FCREATE пока не реализует "обрезание" файла при нулевом значении длины записываемых данных, как было в DOS.

18. PARSECOMMANDLINE теперь работает сложнее. Извлекая информацию о параметрах командной строки он записывает ее в TIB и переустанавливает туда (на TIB) входной поток. Семантика сохранена.

19. MINMEM, MAXMEM, BUILD, COMPRESS, ENVSEARCH, etc... нормально работают. Слова для работы с виртуальным экраном также сохранены. Шрифты в .RF-формате, входившие в архив с DOS-версией могут пригодиться.

20. Слово CR теперь выводит только один символ: 0ah.

21. ...

22. StartUp-код занимает 128 байт всесто 8-Кб под DOS. Это связано с отсутствием экстендера.

23. Чтение директории выполняется словом READDIR, которому на вход передаются два параметра: дескриптор директории (открытой словом FOPEN) и адрес буфера для заполнения прочитанными данными (на вершине стека). После выполнения в случае успеха (очередной элемент директории прочитан) на стеке лежит True. В случае неудачи - False. Если при этом содержимое ERRNO нулевое - значит, просто больше элементов в данной диреткории не содержится, если отличается от нуля, - значит, произошла системная ошибка. Имя файла в данном буфере хранится по смещению 74, длина - по смещению 20, время модификации (по Гринвичу!) - по смещению 40, права доступа (атрибуты) - по смещению 8. Все смещения указаны в десятичной системе счисления. Буфер должен быть досточной длины для хранения имени файла любой допустимой в системе длины. Концептуально слово об'единяет в себе два системных вызова: readdir (именно системного вызова, - см. "man 2 readdir") и lstat. Содержимое буфера определяется структурами данных, возвращаемыми этими системными вызовами. После окончания работы с директорией ее необходимо закрыть словом FCLOSE.

24. Слово FORK ( --> ChildPID|0 True | False ) порождает дочерний процесс - точную копию текущего.

Я проверял работоспособность Small/32 ТОЛЬКО под Red Hat Linux версий 5.0 и 6.1. Нынешняя версия моего ядра - 2.2.5-15. Не исключено, однако, что он будет нормально работать и под другими версиями Linux. Буду благодарен за любую информацию подобного рода.

Александр Ларионов, laric@laric.msk.ru

По поводу последнего замечания добавлю, что Caldera OpenLinux Lite 1.1 (ядро версии 2.0.29) не имела конфликтов со Small/32.

Small32/Linux Forth System Version 99.12.16 (76Kb)

Small32/Linux Forth System Version 99.8.3 (76Kb)

Возврат


RU FIG