
; *****************************************************************************
;          Этот файл поможет Вам писать Форт-слова на языке ассемблера
;   Здесь, конечно, больше комментариев, чем всено остального, но все равно -
;             информации, содержащейся в этом файле - слишки мало
;           За более подробными сведениями - читайте файл forth.doc
; *****************************************************************************

; Эта макрокоманда кажется, на первый взгляд, немного странной
; После подключения модуля, в поле кода каждого слова, начинающегося
; машинной командой HLT, будет записана команда CALL на точку
; CALL адресного интерпретатора
; Подробнее - в файле FORTH.DOC
do              macro
                hlt
                hlt
                hlt
                endm

dj              macro           adrs
                dw              adrs-$-2
                endm

; Переход на точку NEXT адресного интерпретатора
next            macro
                jmp             word ptr [nextentry]
                endm

                model           tiny

                .code

                org             103h


; *****************************************************************************
; Переменная                    Значение        Адрес
; *****************************************************************************

; Версия Форт системы в двоично-десятичном коде
; Эта переменная подскажет Вам, какая версия Форт-транслятора
; компилировала интересующую Вас программу
version:        db              92,8            ; 103

; Адрес точки NEXT адресного интерпретатора
; Если Вам вдруг, вздумается писать отладчик, Вы можете изменить значение этой
; переменной. В Вашу версию точки NEXT управление будет передаваться перед
; выполнением каждого слова выполняемой программы.
nextentry:      dw              ?               ; 105

; Адрес поля кода Форт-слова, с которого начинается выполнение
; Форт-программы. После инициализации Форт-системы управление
; передается на адрес, хранящийся в этой переменной
restart:        dw              ?               ; 107

; Переменная, содержащая адрес вершины словаря
; Значение этой переменной оставляется на стеке словом HERE
upvoc:          dw              ?               ; 109
; Адрес поля имени последнего слова в словаре
; Так как, все слова в словаре Форт-система связаны в список, то
; для прохода по этому списку необходимо иметь указатель на первый
; элемент списка. Для этой цели и используется эта переменная
; Ее значение оставляется на стеке словом LATEST
lastword:       dw              ?               ; 10B

; Две следующие переменный дублируют значения двух предыдущих
; Такое дублирование необходимо для работы с подключаемыми модулями
; При инициализации Форт-системы в эти переменные записываются значения
; из переменных upvoc и lastword. Если значение "оригинальных"
; переменных изменяется при работе Форт-системы, то переменные-дубли
; остаются неизменными и позволяют в любой момент времени
; отделить стандартный Форт-код от кода, скомпилированного на
; данном сеансе трансляции
up2:            dw              ?               ; 10D
last2:          dw              ?               ; 10F

; Необходимый размер арифметического стека
; Значение этой переменной используется на этапе инициализации системы
; Переменная доступна программисту через использование слова STACKSIZE
st_size:        dw              ?               ; 111 Stack size in bytes
; Размер стека возвратов
; Переменная доступна программисту через использование слова RETURNSTACKSIZE
rs_size:        dw              ?               ; 113 Return stack size
; Размер динамической памяти для словаря Форт-системы
; Переменная доступна программисту через использование слова MEMORYSIZE
m_size:         dw              ?               ; 115 Dynamic memory size

; Текущая система счисления для ввода и вывода чисел
; При инициализации Форт системы в переменную BASE заносится 10
; Адрес этой переменной оставляется на стеке словом BASE
base:           dw              ?               ; 117
; Текущее состояние текстового интерпретатороа Форт-системы - программы,
; управляющей приемом текста из входного потока и его компиляцией
; Адрес этой переменной оставляется на стеке словом STATE
state:          dw              ?               ; 119
; Количество символов в строке, введенной с клавиатуры с использованием
; слова EXPECT. Форт-слово SPAN оставляет на стеке адрес этой переменной
span:           dw              ?               ; 11B
; Количество символов после десятичной (или 16-ричной, 2-ичной 7-ричной и т.д.)
; точки в последнем числе, обработанном словом VAL
; Адрес этой переменной оставляется на стеке словом DPL
dpl:            dw              ?               ; 11D

; Переменная, содержащая адрес дна арифметического стека
; Ее значение используется словом DEPTH для определения количества
; чисел, лежащих на стеке
; Адрес этой переменной оставляется на стеке словом S0
s0:             dw              ?               ; 11F
; Переменная, содержащая адрес дна стека возвратов
; Адрес этой переменной оставляется на стеке словом R0
r0:             dw              ?               ; 121


; Переменная, содержащая адрес буфера для входного потока Форт-системы
tibadr:         dw              ?               ; 123
; Количество символов в очередной (обрабатываемой) строке входного потока
maxpos:         dw              ?               ; 125
; Смещение относительно начала буфера входного потока первого
; необработанного символа. Адрес этой переменной оставляет на стеке слово >IN
inpos:          dw              ?               ; 127

;
maxchar:        dw              ?               ; 129

; Переменная, в которой Форт-слова, вызывающие функции DOS сохраняют
; возвращенный им код ошибки
; Адрес этой переменной оставляет на стеке слово ERRNO
errcode:        dw              ?               ; 12B
; Эта переменная содержит адрес поля кода слова обработки ошибок
; После получения управления слово должно считать код ошибки из
; системной переменной ERRNO. Возможные коды ошибок и их истолкования
; приведены в файле forth.doc
errorproc:      dw              ?               ; 12D

; В следующих четырех переменных хранится координаты активной области
; на экране
; x1, y1 - верхний левый угол рабочей области
; x2, y2 - нижний правый угол рабочей области
x1:             db              ?               ; 12F
y1:             db              ?               ; 130
x2:             db              ?               ; 131
y2:             db              ?               ; 132

; Текущий атрибут для вывода символов словом EMIT
; Эта переменная устанавливается словом COLOR из CRT модуля
; Следует отметить, что версия слова EMIT из стандартной библиотеки
; осуществляет вывод символов, обращаясь к функции DOS, а потому,
; ее совершенно не интересует значение этой переменной. Им пользуется
; только верси слова EMIT из CRT модуля
curattr:        db              ?               ; 133
; Номер активного драйвера экрана
; Для получения сколько-нибудь полезной информации о том, что здесь
; подразумевается по драйвером экрана советую заглянуть в файл forth.doc
; в описание слова EMIT и ESC-последовательностей, им обрабатываемым
cursortype:     db              ?               ; 134
; Говоря откровенно, я уже забыл, для какой цели я выделил эту переменную
drivetype:      db              ?               ; 135
; Эта переменноа определяет внешний вид курсора
; За более полной информацией обращайтесь в файл forth.doc в описание
; ESC-последовательности "ESC B <n>"
cursorattr:     db              ?               ; 136
; Для драйвера экрана #2 эта переменная определяет атрибут символа,
; на котором стоит курсор. Подробности - в файле forth.doc
undercursor:    db              ?               ; 137
; Переменная, содержащая сегментный адрес виртуального экрана
; При инициализации CRT модуля автоматически устанавливается:
; = 0b800h - для цветного дисплея
; = 0b000h - для монохромного дисплея
; Кроме того, у Вас есть возможность записать сюда любое значение
; Конечно, если Вы не хотите, чтобы экранный драйвер использовал
; в качестве виртуального экрана произвольно выбранный сегмент памяти,
; неплохо было бы подготовить сегмент через слово MALLOC.
; Этого, однако, делать не стоит, если Вы не собираетесь изменять
; значение этой переменной для того, например, чтобы реализовать
; какой-нибудь "супер"-видеоэффект
vram:           dw              ?               ; 138
; Переменная, содержащая адрес дна экранного стека
; Адрес этой переменной оставляется на стеке словом SS0
ss0:            dw              ?               ; 13A
; Переменная, содержащая указатель экранного стека, на который, в отличие
; от указателей арифметического стека и стека возвратов, не хватило регистров
; центрального процессора
; Адрес этой переменной оставляется на стеке словом SSP
ssp:            dw              ?               ; 13C
; Необходимый размер экранного стека
; Значение этой переменной используется на этапе инициализации системы
; Переменная доступна программисту через использование слова SCREENSTACKSIZE
ss_size:        dw              ?               ; 13E - Screen stack size

; Следующие две переменные определяют позицию курсора на виртуальном экране
; Получить из значения можно используя слова WHEREX и WHEREY
crx:            db              ?               ; 140 - Cursor X
cry:            db              ?               ; 141 - Cursor Y

; Эта переменная содержит адрес порта контроллера 6845
; Иными словами, не обращайте на нее внимания
port:           dw              ?               ; 142

; Если к моменту запуска оптимизатора кода, заключенного в слово BUILD,
; значение этой переменной отлично от нуля, то все слова, включаемые в
; исполняемый файл, будут включены вместе со своими именами, что даст
; следующие возможности
; 1) Вносить динамические изменения в программу на этапе ее работы
; 2) Создавать на этапе работы программы выполняемые модули, используя
;    тот же оптимизатор Форт-кода
debug:          dw              0               ; 144

; Эта переменная дублирует значение сегментного регистра SS
; На всякий случай
stack_seg:      dw              ?               ; 146

; Указатель регистрового стека
; Чтобы окончательно не запутывать всех, дочитавших этот файл до этого
; места, воздержусь от попытки рассказать, что именно, я решил
; назвать регистровым стеком
; Всех, для кого узнать, что такое регистровый стек - вопрос
; жизни и смерти - прошу позвонить по телефону в москве 288-26-60
regpnt:         dw              ?               ; 148

; Эти четыре переменные зарезервированы специально для локального
; использования. В словах, написанных Вами как на Форте, так и на
; языке ассемблера, Вы можете их использовать для любых целей
; Только  не забывайте, что многие Форт-слова как из основного
; модуля, так и из подключаемых Форт-библиотек, также их используют
time_x:         dw              ?               ; 14a
time_y:         dw              ?               ; 14c
time_z:         dw              ?               ; 14e
time_t:         dw              ?               ; 150

                org             100h
module:

;    Для обеспечения доступа к стандартным переменным из ядра Форт-системы
; включите этот файл в Ваш модуль, написанный на языке ассемблера,
; используя директиву ассемблера include.
;    Кроме того, помните, что значения, записанные в описанных в этом
; файле переменных не фиксируются. В следующих (по крайней мере - в
; ближайших) версиях Форт-трансляторов будут сохранены только их адреса.
;
;                С уважением - Александр Ларионов

