ZXNet эхоконференция «zxnet.soft»


тема: ZX-ASM 3.1 и STS



от: Eugene Stahov
кому: Eugene Palenock
дата: 24 Aug 2000
Hello Eugene.

21 Авг 00 23:29, you wrote to me:

ES>> Перебирайся на ALASM 4.2 РУЛЕЗ HЕМЕРЯHHЫЙ. (После M80:-))

EP> И где его взять ? Какие отличия от 4.1/64 ?

Я брал на zx.da.ru (правда, там кажись что-то было намудрено с загрузчиком - я
старый от 4.1 вставил :)


=== Cut ===
Alasm v4.2 (upgraded by KVA of E-mage from v4.1 by ALEM)

0. Предисловие.

Сразу хочу извиниться перед автором Alasm'а за то, что посмел
внести кусок своего кода внутрь ассемблера. Поводом для этого
послужило то, что ALEM, на сколько я понял, забил на спектрум
вообще (в частности на Alasm). Поэтому было решено немного его
навернуть в плане условной компиляции и макросов.

1. Загрузка и после.

В самом начале происходит тест памяти. Затем печатается
сообщеиние автора и встроенный help'ик. После всего этого вы
попадаете в главную командную строку, где можно набирать
команды:

Help - выдаст help об командах
Quit [адрес][,страница] - выход, если параметр не указан, то
происходит выод по стеку
Debug - вызов Stalker'а
Run [адрес][,страница] - запустить программу (по умолчанию
берется адрес последнего ORG'а и
страница 0)
Work [d:][name[.ext]] - загрузить файл, если имя не указано,
то перед вами появятся все аласмовские
файлы, которые находятся на диске.
Если файла с таким именем не было на
диске, то он создастся.
(здесь и везде далее, где идет работа
с файлами можно вместо имени
использовать маску: ? - любой символ,
* - любые символы до конца. Также
везде перед именем файла можно
указывать drive)
Catalogue [d:][mask] - вывести каталог диска
nUmbers [параметр] - сменить тип вывода чисел (HEX/DEC)
Print [bytes list] - выводятся на принтер сначала байты,
указанные в строке, а потом текст
Name [name[.ext]] - смена имени файла
Edit [d:][name[.ext]] - редактирование файла (если указано
имя, то он сначала подгрузится)
Merge [имя файла] - соединит два файла
counT [арифм.выражение] - калькулятор, можно использовать все
операции, что и при ассемблировании.
Также можно использовать и метки.
sYmbol [mask] - выдаст список меток, которые подходят
под маску (по умолчанию маска = *.*)
<число> - это метка
NoDef - метка, к которой было
обращение, но она не была определена.
Macro - имя макроса
Wrong - тип ошибочный (глюки в памяти)
Jumb [+] - заменяет все минусы на плюсы в тексте
или во всех текстах (если указан +)
Save [+][d:] - запись текста на диск. Если указан +,
то будут записаны все несохраненные
тексты, которые были обнаружены в
памяти.
Assemble - ассемблирование файла
Info - выдаст версию ассемблера и имена всех
текстов, которые найдет в памяти (если
после текста стоит +, то в нем есть
несохраненные изменения)
paGe [номер страницы] - переключиться на текст в странице
SS+SPACE или SS+ENTER - появится список с текстами, которые
находятся в памяти, в нем можно
выбрать нужные вам.
Ban [+] - удаляет из памяти текст (+ - тексты)
conFig - вызов конфига, который подгружается
с диска. Вся же конфигурационная
информация хранится в первых 256-и
байтах файла alasm.C
Object - выгрузка объектного кода пока не
реализована (пока на эту команду
я повесил небольшой изврат - выгрузка
меток)

2. Редактирования файла.

Внизу написано имя файла, его расширение, количество сободных
байт для этого текста. Затем может быть указано количество байт,
которое лежит в кармане (если за этой цифрой стоит |, то они
были занесены в краман с помощью команды SS+Q).

SS+D - переключение RUS/LAT
SS+I - продолжение поиска
SS+E - текущая строка заносится в карман и курсор переходит
на следующую строку.
SS+Q - удаление текущей строки, при этом она заносится в
карман (если там не было строк, занесенных по SS+E)
SS+W - вставить пустую строку
CS+1 - табляция
CS+2 - вставить пробел
CS+9 - удалить символ, который стоит справа от курсора

В режиме EXTEND:

[Q] Quit - выход в главное меню
[B] Begin - переход в начало текста
[E] End - переход в конец текста
[S] Search [что ищем] - поиск
[Y] sYmbol [метка] - поиск метки (метка должна начинаться с
начала строки
[D] coDe xxx-[код] - вывести символ с данным кодом, xxx - код
символа, на котором стоит курсор
[R] Restore - вставить строки из кармана
[C] Clear - очистить карман
[X] Replace [что]->[на что] - замена, при нахождении образца
будет появляться строка Replace(Y/N/G), Y - да, N - нет,
G - да для всех остальных
[L] Line [номер строки] - переход на нужную строку

3. Конфигурация.

Alasm можно полностью конфигурировать, это делается нажатием
клавиши F (conFig)

- SHELL

nUmbers - формат вывода чисел при загрузке (HEX/DEC)
beEp - звук при нажатии клавиши (ACT/OFF)
bOrder - цвет бордюра экрана
pAper - цвет фона
iNk - цвет чернил
briGht - яркость (ACT/OFF)

- KEYBOARD

Russian - раскладка русской клавиатуры (ЯВЕРТ/ЙЦУКЕ)
KBD Forming - задержка перед формированием нажатия клавиши
KBD Holder - задержка при удерживании клавиши
KBD Wait - пауза после первого срабатывания клавиши

- PAGES

SRC sTarting - начальная страница текста
Debugger - страница отладчика (при старте делается JP #DB00)
disk Buffer - буфер для дисковых операций (страница и адрес)
Config program - буфер, куда подгружается config
System - страница, где лежит сам ассемблер
Pocket data - страница кармана (обычно равна symbols list page)
Macro data - страница для макросов
Symbols list - страница для меток
Post symbols - страница для постметок (ассемблер однопроходный)

- Прочие

- загрузить новый шрифт
HiMEM DRIVER - загрузить новый драйвер верхней памяти
<Ок> - выйти без сохранения на диск
- записать конфигурацию в файл

4. Компилятор.

Alasm - стандартный ассемблер. Формат аласмовской строки такой:

[+/-] [метка] [команда] [;комментарий]

Если перед строкой стои минус, то эта строка не будет
компилироваться. Если стоит плюс, то она откомпилируется, а плюс
заменится на минус, что позволяет некоторые блоки компилировать
только один раз. При загрузке файла все минусы заменяются на
плюсы в файле (естественно только те, которые стоят перед
командой) Hасильно эту операцию можно сделать с помощью команды
JUMB в главном режиме.

В строке может быть не более одной команды (аналогично и
метки). Метка может состоять из символов с кодами от #40 до #7B,
а также из цифр (начинаться с цифр не может).

Половинки IX и IY адресуются как HX и HY, LX и LY. Также
компилируют недокументированные команды типа INF.

В командах, где используются какое-либо выражение могут
присутствовать операторы:
a+b - сложение
a-b - вычитание
a*b - умножение
a/b - деление
a&b - операция AND (*)
a|b - операция OR (*)
a!b - операция XOR (*)
a>b - циклический сдвиг слова a на b позиций вправо (*)
a () - операторные скобки (сначала рассчитываются они) (*)
{a} - слово, находящееся в памяти по адресу a
~ - инвертирование текущего результата
?метка - возвращает 0, если метка уже определена, #ffff, если не
определена, и 1, если не определена, но к ней было уже
обращение. Если метка это название макроса, то функция
выдает 2. (*)
'a - старший байт a
.a - младший байт a

Константы могут быть в трех системах исчисления:

const - десятичная
#const - шестнадцатиричная
%const - двоичная (*)

Символ $ выдает адрес первого байта текущей компилируемой
команды.

Во всех операциях кроме + и - не допускается использование
меток, которые еще будут определены (из-за однопроходности)

(*) - было доделано мной в 4.2

5. Директивы ассемблера.

[] - необязательный параметр

- DEFB или DB

затем идут байты, которые положатся просто так при
ассемблировании

- DEFM

то же, что и DB, только для текста, но так как и в DB можно
вставить текст, то эта функция устарела, и ей никто не
пользуется

- DEFW или DW

затем идут слова, которые положатся просто так при
ассемблировании

- DEFS или DS <число>[,строка байтов]

Повторяет строку <число> раз в памяти, если строка не указана,
то считается, что там стоит просто #00.

- INCLUDE "[d:]<имя_файла>"[,<банка>]

Откомпилировать файл <имя_файла> из банки <банка>. Если в этой
банке данного файла не будет, то он будет подгружен. Если вы
используете одну и ту же банку, то после компиляции файла
<имя_файла> будет подргужен тот файл, из которого он был вызван.
Т.е. допускается вложенность INCLUDE'ов (ограничена только
стеком).

- MAIN "[d:]<имя_файла>"[,<банка>]

Имя и банка главного файла. Эта директива должна быть одной из
первых директив в файле. Она делает безвозвратный переход на
главный файл. Далее MAIN игнорируется.

- INCBIN "[d:]<имя_файла>"[,<длина>]

Подгружает файл <имя_файлa> либо полностью (если длина не
указана), либо кусок его размером <длина>

- ORG <адрес>[,<банка>]

Установка адреса компиляции с адреса <адреса> и в банку <банка>.

- DUP <количество>
<тело>
EDUP

Повторяет кусок <тело> <количество> раз подряд. Допускаются
вложенные определения:

DUP 100
DUP 2
INC H
EDUP
INC L
EDUP

- <метка> EQU <выражение>

Присваивает метке <метка> значение <выражение>. Если метка уже
была создана, то выдает ошибку.

- <метка> = <выражение>

То же, что и EQU, только не смотрит на то, что метка уже была
создана - в любом случае метка принимает значение <выражение>
без ошибки

- DISP <выражение>

Hачинает компилирует код под адрес <выражение>

- ENT <выражение>

Hачинает компилировать код под адрес, в который код ложится.

- IF <выражение> (*)
<тело1>
ELSE
<тело2>
ENDIF

Если выражение <выражение>=0, то компилируется <тело1>, иначе
компилируется <тело2>

IFN <выражение> (*)
<тело1>
ELSE
<тело2>
ENDIF

Если выражение <выражение>=0, то компилируется <тело2>, иначе
<тело1>

Допускается вложенность условной компиляции (максимально
возможная - 254-я вложенность)

- LOCAL
<тело>
ENDL

Объявление локальных меток. Все метки в пределах этой
оператоеной скобки будут невидимы вне ее (кроме меток,
начинающихся с символа @ - это глобальные метки). Допускаются и
вложенные конструкции.

В пределах локальных меток не стоит определять метки с именами,
к которым обращались вне этой конструкции:

LD HL,LABEL
LOCAL
LABEL
ENDL

В данном примере LABEL будет все-таки глобальной меткой ...

- MACRO <имя_макросa> (*)
<тело>
ENDM

Определение макроса. В теле макроса могут быть использованы
следующие дополнительные команды:
:0 .. :9 - параметр номер 1, 2, ... 9.
:C - текущий символ
:N - перейти на следующий символ (ничего не выдает)
:R - установить указатель на начало строки параметров
:S - строка от текущего символа до символа

(сделано так же само, как и в TASM 4.12)

<имя_макроса> [параметр1 [,параметр2 [...]]] (*)

Запустить макрос в действие. Если параметр не заключен в
кавычки, то все пробелы около него удаляются при передаче
макросу (сделано для того, чтобы меньше на стеке мусорить).
Разделителем параметров служит исключительно запятая (запятая,
заключенная в кавычки не считается разделителем).

Пример использования макросов:

MACRO DOWN

LOCAL

INC :C
LD A,:C
AND 7
JR NZ,LABEL
LD A,:N:C
SUB #E0
LD :C,A
JR NC,LABEL
LD A,:R:C
SUB 8
LD :C,A
LABEL
ENDL

ENDM

Теперь мы можем процедуру DOWN HL и DOWN DE компилировать по их
именам - DOWN HL, DOWN DE и т.д.

6. Ошибки компилятора.

0 - синтаксическая ошибка
1 - reserved
2 - reserved
3 - короткий переход неверен (вышел за границы)
4 - reserved
5 - reserved
6 - повторное описание метки
7 - reserved
8 - reserved
9 - reserved
10 - компиляция в ПЗУ
11 - недопустимая операция
12 - неправильная MACRO операция
13 - not used
14 - ошибка системного стека
15 - ошибка диска

7. После компиляции.

После компиляции alasm выдает сроку типа:

Symbols: - -

показывает до куда выросли post symbols (растут от #C000,
поэтому можно ставить symbol list равным post symbols лист, если
у вас только не огромное количество меток)

показывает до куда вырос symbols list (растет вниз от
#FFFF до #C000)

(*) показывает до куда была использована банка macro data
(macro data растет от #C000 к верху). Если вы не пользуетесь
макросами, то эта банка трогаться не будет.

Далее могут выдаваться ошибки, возникшие при восстановлении
post symbols (особенность однопроходности). Могут быть ошибки
типа Can't count (использование операций не сложения или
вычитания с метками ранее не определенными), Wrong short
(неправильный ближний переход), Not define (к метке было
обращение, но она так и осталась не определена)

6. Послесловие.

Могу только на последок сказать, что на сегодняшний день это
самый гибкий ассемблер - можно настраивать практически ВСЕ, что
тебе взбредет в голову. Да и количество файлов, которое можно
хранить одновременно в памяти ограничено только количетсвом
сободных страниц памяти.

Alasm 4.2 полностью интегрирован с sts'ом версии 6.2.
В прилагаемом пакете можете сделать свой загрузчик - он
ничего злобного сам не делает, там только tuboloader.
Файл sts6.2 в пакете тоже немного подправлен - делает reset при
смене драйва и правильно работает на пентагонах команда Get
Subroutine tacts

Да и кстати, при компилировании строк макросов, где присутствуют
параметры (:), будут тормоза, так как происходит распаковка
строки из полукомпилированного формата в ASCII, а потом обратно,
после чего уже идет компиляция.

7. Что будет если меня не убъет автор alasm'а, либо еще
кто-нибудь.

а) отведу под метки 4 банки
б) исправлю один маленький глючок (он возникает при условии
разрезания команды границой #8000)
в) может будет сделана выгрузка кода (пока на object save висит
изврат - выгрузка меток)
г) может полностью реассемблирую его и увеличу скорость
ассемблирования

KVA of E-mage 17.08.1999
=== Cut ===

Eugene




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
От автора - На ваших экранах новая электронная газета под названием ZX-ZОNE
Вступление - Беларусские новости из мира Спектрума.
Почта - Письма читателей: Андрей Яковлев, Денис Токарчук, Алексей Гаркулим, Александр Гордеев, Евгений Шумилов, Ниточкин Вадим, Михаил Ларкин.
ХИТ-Пародия - хит-парад по продажам за последний месяц (информация по Екатеринбургу...)
Видео - Боевик "Боеголовка".

В этот день...   19 апреля