┌──────────────────────────────┐
│ │
│ НОВЫЕ ПРОГРАММЫ │
│ │
└──────────────────────────────┘
Music by ZET
Xas редактор-ассемблер 128k
(v 5.05)
(c) Макс Петров
Предлагаю Вам описание пос-
ледней версии программы, отличия
от предыдущей оговорены и обоз-
начены значком "*".
1. Вводная информация
1.1. Что такое, зачем надо
и почему
Сейчас, как известно, для
нашего многострадального, но лю-
бимого друга существует несколь-
ко подобных программ с бесспор-
ным лидером Tasm'ом (есть еще
какой-то Zxasm, но я его не ви-
дел). Однако Tasm уже с момента
своего появления отталкивал не-
которых юзеров (меня) своей 64-
символьностью, а сегодня вообще
устарел со своей over'ностью и
букетом глюков. Собственно, вот
и вся причина появления моей
программы, за что спасибо Rst 7.
Основываясь на опыте работы
в Tasmе, на котором и писалась
первая версия программы, а так-
же на собственных мечтах и поже-
ланиях VL, IK и AB, получилась
такая штука:
- ассемблирование в 4,4 раза
быстрее Tasm 3.x.
- дисковые операции в 2-3 раза
быстрее, при большом количестве
файлов на дискете - до 10-20 (!)
раз.
- поиск в тексте - почти мгно-
венный (соответственно в 20-30
раз (!))
- буфер на 1820 меток (* 1500)
(tasm - 740).
- редактирование двух текстов
одновременно с возможность пере-
носа блоков из одного текста в
другой.
- текст программы в 1,79 раза
меньше, чем аналогичный в tasm.
- количество кнопок, которые
необходимо нажать для набора од-
ного и того же текста, в 1,333..
1,5 раза меньше.
- объем текста, который может
быть отассемблирован без единого
обращения к дисководу - в 2,23
раза больше, чем в tasm (!)
- максимальный объем одного
текста в 1,12 раза больше, чем в
tasm.
- время, уходящее на поиск
строки, содержащей ошибку, кото-
рая выявилась при ассемблирова-
нии - в 50..1000 раз меньше;).
- работа с половинами ix и iy;
- возможность ассемблирования
выделенного участка n-е число
раз (* - нет);
- макросы, которые в любой мо-
мент можно отредактировать;
- большие русские и большие и
маленькие латинские буквы;
- режимы ins и ovr;
- 42 символа в строке;
- сохранение текущей позиции в
тексте при любых операциях;
- автотабуляция;
- загрузка по курсору; время
загрузки и записи не зависит от
кол-ва файлов на дискете (чего
не скажешь о Tasme, который при
работе с диском с 40-ка файлами
просто засыпает);
- называется Xas [ksas];
- много удобных, неожиданных,
новых вещей...
Недостатки:
- нет merge; (но с лихвой оку-
пается возможностью переноса по-
меченного блока текста из одного
окна в другое);
- нет замены при find;
- метки до 7 символов (осталь-
ные символы при ассемблировании
игнорируются), (Tasm - до 14);
- defb не любит стрингов;
- глупенький equ (в выражении
не должно быть неопределенных
меток);
1.2. Загрузка и запуск
На диске находятся два фай-
ла: сам xas и (должен быть запи-
сан сразу за ним) STS 3.21. Если
Вы вышли из XASa в basic, то
вернуться обратно можно выпол-
нив RUN, если жива программа на
бейсике (первую строку можно
удалить), usr 23465, если Вы не
трогали буфер принтера по адре-
сам 23465-23471 или usr 49152,
включив банк 1 (out 32765,81).
1.3. Расположение в памяти
Ramtop устанавливается на
адрес 24575, но его можно перес-
тавить в любые адреса до 32768.
Xas находится в странице 1, в
странице 3 - первый текст, в
4-ой - второй текст, в 6-й мак-
рос, таблица меток и буфер для
блочных операций, в 7-ой страни-
це находится STS. При входе/вы-
ходе из Xasa также используется
память в адресах 23440-23471. Вы
можете использовать страницу 6
(даже убив макрос), а также
страницу 4, если не будете заг-
ружать в нее второй текст, и ес-
ли в ассемблируемой программе
нет опций loadtext.
Кстати, следует сказать, что
loadcode и save code пользуются
экранной памятью STSа (т.е. бан-
ком 7).
В общем-то, можно изгадить и
3-й банк - к зависанию это не
приведет.
И, естественно, в Вашем рас-
поряжении вся 48-я память (стра-
ницы 0, 2 и 5), кроме некоторых
системных переменных бейсика.
Если у Вас 256/512K через
порт #fd биты 6 и 7, то исполь-
зуется 2-й банк 128K (т.е. #10
банк вместо 0, #17 - 7-ого...),
что обычно приводит к сохранению
текста в памяти даже после нажа-
тия reset...
2. Ввод текста
2.1. Загрузка
При любых операциях с диском
смена цвета бордюра означает
ошибку чтения/записи. После че-
тырех попыток выдается запрос:
Error t/s. Retry, Ignore, Abort.
где t/s - номер дорожки/сектора
с ошибкой.
При ответе Retry будет сде-
лано еще 14 попыток... Прерыва-
ние операции с диском - space.
При запуске редактора-ассем-
блера (далее р-а), если в памя-
ти нет текста, то на диске ищет-
ся файл XMACROS.XaS (макрос) и
загружается в случае наличия (и
отсутствия в памяти). Затем, ес-
ли на диске имеются файлы с рас-
ширениями XAS, xAS и XaS, перед
Вами появится их списочек и ко-
личество свободных на диске сек-
торов. Вы можете выбрать нужный
файл с помощью курсорных клавиш
и enterа, или отказаться от заг-
рузки, нажав edit (отмена заг-
рузки) или ext mode (удаление
текста из памяти). Space - пере-
зачтение каталога. Если файлов
на диске нет, то р-а сразу вый-
дет в редактор.
2.2. Экран
Войдя в редактор, вы увидите
несколько буковок и цифирок вни-
зу экрана.
INS - означает, что включен
режим вставки (CS/3), OVR - за-
мены; LAT - выбран латинский ал-
фавит (edit), РУС - русский; 0/1
- первое число показывает номер
текущей строки (с нуля), второе
- количество строк в тексте
(т.е. максимальное значение для
первого числа). В тексте не мо-
жет быть менее двух строк;
Самое Правое Число - показы-
вает номер текущего текста:
1 - текст в банке 3,
2 - в банке 4 и
3 - макрос в банке 6.
Цвет цифры означает следующее:
белый - Вы еще не редактиро-
вали текст после загрузки,
желтый - текст еще не редак-
тировался после записи,
красный - текст уже редакти-
ровался, и при следующей записи
его на диск увеличится число,
показывающее кол-во редакций;
число, которое - кол-во редакций
текста, находится перед правым
числом; если оно равно нулю (но-
вый текст или только что переко-
дированный), то оно не показыва-
ется.
Внизу находится строка из
29-ти символов. Это комментарий,
который хранится в тексте.
В третьей снизу строке час-
то напечатана модель для поиска
(* нет).
2.3. Редактор
Довольно хитрая вещь: при по-
пытке выйти за пределы стро-
ки он ее упакует, проверит эле-
ментарный синтаксис и, если все
в порядке, сделает автотабуляцию
(т.е. строка вида
LabEL lD Hl #4000 ;МДААА ..
превратится в
label LD HL #4000; МДААА ..
При синтаксических ошибках,
как-то: две метки подряд в на-
чале строки, использование имен
регистров и условий в качестве
меток, более 3-х меток в строке
(у Z80 нет команд с четырьмя па-
раметрами) (к def-ам ограниче-
ние не относится), редактор что-
то пропищит и никуда уйти не по-
зволит.
Будьте осторожны при вводе
вложенных друг в друга кавычек в
defm: если у Вас две рядом стоя-
щие кавычки, то после них реко-
мендую продолжать ввод со сле-
дующей строки: например, нужен
текст: "a""b" - его следует наб-
рать не defm ""a""b"", а
defm """
defm "a"""
defm "b""
Операции в строке
ext mode - выход из редакто-
ра;
ss/q - рус/lat; расположение
русских букв 'яверты' как в is-
dos;
ss/a - табуляция (самая редко
используемая кнопка);
cs/2 - ovr/ins;
edit - home/end (начало/конец
строки);
cursor - курсор;
graph - префикс макроса (см.
ниже);
delete - догадайтесь; если
нажать в начале пустой строки,
то строка удалится;
break - удаление по курсору;
ss/w - удаление строки;
ss/enter - восстановление
строки; возвращает строке вид,
который она имела до редактиро-
вания;
ss/e - пометка строки для
блочных операций; не обязатель-
но метить строки подряд; чтобы
снять пометку, нажмите повторно,
отметьте другим видом пометки
(см. cs/ent) или нажмите enter;
(см. также ss/s);
cs/ent - пометка строки для
памяти, этой же пометкой метит
строку ассемблер, если в ней об-
наружена ошибка; снять пометку -
см. ss/e;
Операции в тексте
cs/3/4 - страница вверх/вниз;
ss/g - начало/конец текста;
ss/y/u - найти предыд./след.
помеченную строку; если таких
нет, ничего не происходит;
ss/s - отмена пометки;
ss/f - поиск следующей моде-
ли; если такой нет, то меняется
цвет бордюра; (см. ниже find);
graph ent - поиск с начала
текста слова, на котором стоит
курсор; очень удобная вещь для
поиска меток; не обязательно
ставить курсор на начало слова -
это будет сделано автоматически;
для поиска следующего такого
слова нажимайте ss/f;
Блочные операции
ss/d - удаление помеченных
ss/e строк;
ss/i - копирование помеченных
ss/e строк; если помеченных
строк нет, то происходит вставка
текста из буфера;
graph ss/i - копирование по-
меченных строк в буфер, напри-
мер, для переноса их в другой
текст;
(* - несколько другое распо-
ложение клавиш:
edit - рус/lat;
cs/2 - tab;
cs/3 - ovr/ins;
cs/4 - home/end;
ss/q/a - pgup/ /pgdw).
Чтобы скопировать строки из
одного текста в другой, надо
сначала поместить их в буфер.
Помеченные строки помещаются в
буфер при нажатии ss/i или graph
ss/i. Затем следует перейти в
другой текст (загрузить его или
просто переключиться на другое
окно), убрать в нем желтую по-
метку (ss/e) и нажать ss/i.
При ассемблировании с боль-
шим количеством меток они могут
наехать на буфер.
(* при ассемблировании буфер
очищается)
2.4. Команды Xas
При нажатии ext в редакторе
вы попадаете в командную строку.
Вернуться в редактор можно на-
жав ext. Команды выбираются на-
жатием соответствующих клавиш:
aUto (соответственно - 'u') -
отмена/включение необходимости
подтверждения выбора команды en-
terом (эта команда, на самом де-
ле, рудимент, и в след. версиях
ее не будет, так что наслаждай-
тесь сейчас);
Edit - возврат в редактор;
Save text - запись текста на
диск; предлагает сменить имя; во
время ввода имени команду мож-
но отменить, нажав ext, при этом
изменение имени сохраняется; ес-
ли на диске такой файл есть, он
удаляется; если на диске нет
места, сообщений не выдается,
меняется цвет бордюра на крас-
ный.
Load text - загрузка файла по
каталогу; если на диске нет фай-
лов с типами XAS, XaS, xAS или
xaS, то каталог не появляется и
xas возрващается в командную
строку; при выборе файла рабо-
тают следующие клавиши:
space - перезачтение каталога,
edit - отмена загрузки,
ext - удаление текста из памяти;
файлы, начинающиеся с символа
'▒' - удаленные, но их можно
свободно загрузить; тип файла
'T' означает текст, 'M' - макрос
(он автоматически загружается в
окно 3, независимо от текущего);
sTs - выход в sts (* - нет);
при нажатии cs/t в pc будет за-
писан адрес старта отассемблиро-
ванной программы, а в memadr -
последнее напечатанное в кальку-
ляторе число (для sts 4.x);
Quit - выход в basic, который
все равно запускает sts;
Find - ввод модели для поиска
по ss/f и поиск первой с начала
текста;
ext - отмена редактирования
модели и поиск старой модели;
при вводе модели надо учесть,
что если вводимые слова не огра-
ничены кавычками и не являются
комментарием, то, если они яв-
ляются именами операций или опе-
рандов, то будут найдены именно
операции и операнды; это значит,
что для поиска регистра "A" сле-
дует набрать "A", для поиска же
буквы "A" (регистр найден не бу-
дет), надо ввести ";A"; пример:
ввели "IN" - будут найдены все
операции "IN"; ввели ";IN" - все
слова, включающие "IN" (но не
операции IN); если надо найти
слово, не являющееся именем ком.
или опер., то символ ";" вво-
дить не надо; если надо найти
модель, начинающуюся с символа
";", то надо ввести ";;"; при
поиске меток и чисел вводите их
большими буквами;
Run - запуск отассемблирован-
ной программы с последнего ent
или, если entов нет, с последне-
го org или, если orgов нет, с
#8000; если программа собирает-
ся вернуться в xas, то она не
должна портить память по адресам
23465-23471, системные перемен-
ные, связанные с потоком N2, и
заканчивать свою работу опера-
цией ret; cs/r - после возврата
из программы и до очистки экра-
на будет ожидаться нажатие любой
клавиши;
remarK - редактирование ком-
ментария;
Assemble - ассемблирование;
fullCat - полный каталог дис-
ка; cs/c - все данные выводятся
в десятичном виде;
neW - удаление текста из па-
мяти; надо подтвердить 'Y';
laBels - вывод на экран таб-
лицы меток, отсортированной по
первому символу; для прерывания
нажмите space; если после ассем-
блирования Вы пользовались блоч-
ной операцией 'копирование' и
меток было очень много, то Вы
увидите не все метки; cs/b - пе-
чать в десятичном виде; (* - не
поддерживает нажатие с cs, а за-
дает вопрос 'hex?', на который
надо ответить 'n', если нужна
печать в десятичной системе);
save cOde - запись объектно-
го кода; при длине кода более
#c000 запись не производится,
т.к. таких длин в памяти 48K не
бывает;
Mac edit - редактирование
файла макросов, который находит-
ся в 3-ем окне;
aNother - переключение на ре-
дактирование другого окна: 1>2,
2>1, 3>1;
comPute - калькулятор. Можно
набирать выражения как и в тек-
сте программы (имена меток, дво-
ичные и символьные констан-
ты...), результат будет напеча-
тан в десятичной и шестнадцате-
ричной системах; калькулятором
можно пользоваться для перевода
чисел из одной системы в другую,
просмотра значений меток, уста-
новки адреса sts на значение
метки (см. sTs) (* - нет);
3. Ассемблирование
Ассемблирование в два прохо-
да, но не традиционное. На пер-
вом проходе составляется табли-
ца меток. По окончании его поя-
вится сообщение о длине и конце
объектного кода.
Почти все ошибки объявляют-
ся на втором проходе. Ассембли-
рование можно прервать на вто-
ром проходе, нажав cs. Второй
проход заканчивается звуковым
сигналом. Теперь программу мож-
но запустить (см. run) или запи-
сать на диск (save code).
Хочется заметить, что время
ассемблирования, в основном, за-
висит от количества меток, а от,
скажем, длины текста - значи-
тельно меньше. Отсюда очень про-
стой вывод: делайте меньше ме-
ток, и формула для примерного
вычисления времени ассемблирова-
ния: t=0.000163*n^1.72, где t -
время в секундах, а n - кол-во
меток.
3.1. Ошибки
При обнаружении ошибки, на
экран выводится строка с ошиб-
кой, ниже - ее номер, название
ошибки и, если текст загружает-
ся loadtextом или просто нахо-
дится во второй странице, его
имя. При этом строка помечает-
ся красным цветом (см. cs/ent),
чтобы ее можно было легко найти
и отредактировать ((c) мой).
Список ошибок
No Label - нет такой метки;
Syntax In Number - синтаксичес-
кая ошибка в числе;
Label Exists - выдается на пер-
вом проходе; метка с та-
ким именем уже существует
(см. введение);
Syntax - синтаксическая ошибка
в параметре операции (на-
пример (ix+));
Target Too Far - операция jr или
djnz не может прыгнуть
так далеко;
Number Too Big - в операциях, не
связанных с (ix/iy+d) -
просто предупреждение,
что параметром является
число, превышающее допус-
тимое для данной опера-
ции (например, bit 3+15,
a), при этом будут взяты
младшие разряды числа; в
параметре же для (ix/iy+
d) может означать ошибку;
Fatal Error - обычно ошибка в
параметре операции, кото-
рая исключает возможность
ее ассемблирования (ld
sp,bc);
LTB Over - нет больше места в
таблице меток; появляет-
ся на первом проходе и
останавливает ассемблиро-
вание;
No File - нет файла в командах
loadcode и loadtext;
Skipping - предупреждение об
игнорировании команды
loadtext, если она встре-
тилась в тексте во вто-
ром окне (см. ниже) или
команды loadcode, если
файл отсутствует (на вто-
ром проходе); предупреж-
дение о вложенном !assm;
Внимание! При ошибках Fatal
Error объектный код является
настолько некорректным, что его
использование невозможно (это
связано с невозможностью опреде-
ления длины операции в байтах,
что приводит к неправильному
составлению таблицы меток. Дру-
гие р-а при подобных ошибках
вообще останавливают ассемблиро-
вание.
3.2. Текст программы
Текст можно набирать малень-
кими и большими буквами, с табу-
ляторами или без них, вместо за-
пятых можно набирать пробелы
(кроме def-ов). Маленькие буквы
набираются с cs. Макросы наби-
раются нажатием graph и затем
какой-либо клавиши. При попытке
выйти за пределы строки, она бу-
дет перекодирована; пробелы, где
надо, заменены запятыми, метки
для повышения читабельности (мо-
жет, сначала Вам это будет ме-
шать, но затем, надеюсь, Вы оце-
ните мои старания) будут напеча-
таны маленькими буквами. Если в
строке есть ошибки, Вы не сможе-
те выйти за ее пределы, не ис-
правив ее.
Русские буквы нельзя исполь-
зовать в метках.
Вместо (ix/iy+0) можно на-
бирать (ix/iy); половинки ix/iy
обозначаются hx/y и lx/y.
В ex af,af' апостроф можно
не ставить.
При наборе шестнадцатерич-
ных чисел вместо значка '#' мож-
но нажимать '.'.
В операциях ld (adr),rp; ld
(adr),a; out (n),a; in a,(n)
скобки ставить не обязательно
(т.е. можно ld l01+50/3,de).
В out (c),r и in r,(c) '(c)'
можно опускать (out l). (* -
нет).
Несколько push или pop под-
ряд можно заменить одним, пере-
числив регистровые пары через
запятую: pop af:pop iy:pop bc =
pop af,iy,bc.
Числа
Вместо любых чисел можно на-
бирать выражения, где
- буквы в кавычках - число,
состоящее из кодов букв (в
кавычках (кроме defm) могут
быть одна или две буквы),
причем первая буква - стар-
ший байт, вторая - младший.
Если буква одна, то первый
байт равен нулю;
- скобки и приоритет операций
не поддерживаются;
- допустимые операции: +,-,*,/
и ! - xor (например: "B"!
#80; 1520!label1!#f001).
Поддерживаются двоичные чис-
ла, они должны начинаться со
знака '%' и лежать в диапа-
зоне 0..65535.
Еще две логические операции:
&l - взять только младший байт,
&h - взять только старший байт,
поместив его в младший, т.е.
#5cf4&h = #5c;
'l - циклический сдвиг ре-
зультата влево, 'r - то же впра-
во, т.е. #a703'r = #d381. Если
надо сдвинуть несколько раз, то
операцию надо просто продублиро-
вать.
Особенности
(def, work, ent, org,
loadcode, loadtext, !assm)
defs - поддерживает до двух
параметров; если второго пара-
метра нет, то он принимается
равным нулю. Второй параметр -
двухбайтовое число, которым бу-
дет заполнять память defs. При-
меры:
1) надо 15 нулей - defs 15
2) надо 31 push af - defs
31,#f5f5
3) надо 10,0,10 - defs 3,10
4) надо 32 ldi (ed a0) -
defs 64,#a0ed
work - позволяет создавать
программы, работающие не с тех
адресов, в которые они будут ас-
семблироваться. Параметр озна-
чает адрес, с которого будет ра-
ботать данная программа. Рас-
пространяется на всю программу и
все org'и и сохраняет свое влия-
ние до опции work без параметра.
Рекомендую ставить ее в начале
программы после org'a. Пример:
нужно отассемблировать програм-
му для работы с адреса 0:
org #9000
work 0
lab1 .....
org #a005
lab2 work
lab3 .....
метка lab1 будет иметь зна-
чение #0000, lab2 - #1005, а lab3
- #a005.
ent - позволяет указать ад-
рес, с которого будет запус-
каться программа командой run.
Используется без параметра.
org - указывает текущий ад-
рес для расположения программы.
Если org'a нет, то адрес будет
равен #8000. Внимание! Если в
начале Вашего текста org'а нет,
но оrg'и есть дальше, и если они
все больше #8000, то длина объ-
ектного кода будет вычислена
неправильно! (не будет учтен org
#8000). Поэтому, если Вы желае-
те воспользоваться save code, то
в данном случае надо поставить в
начале текста org #8000.
loadcode "name" - имя должно
быть в кавычках; грузится файл
типа code;
loadtext "name" - если во
второй странице уже есть файл
с таким именем, то обращения к
диску не происходит (!!!), если
же его нет, то он загрузится
туда, удалив текст, который там
был до этого. Из второй страни-
цы, по понятной причине, не ра-
ботает. Если кто не знает, что
такое loadtext - эта опция поз-
воляет иметь программу на ас-
семблере, состоящую из множества
текстов, которые грузятся и ас-
семблируются по очереди; при
этом они пользуются одной табли-
цей меток, поэтому из одних фай-
лов можно без ограничений ссы-
латься на метки из других фай-
лов.
!assm !on/!off
Еще имеется оригинальная оп-
ция !assm, которая может иметь
параметр !on или !off. Она дает
возможность выделять куски тек-
ста, которые надо отассемблиро-
вать только один раз, или вооб-
ще не надо ассемблировать. Пара-
метр !on означает, что опция
!assm игнорируется, но после ас-
семблирования он будет пере-
веден в !off. !off же вызывает
пропуск текста до опции !cont.
Пример: Вы пишите драйверок пе-
чати, который пользуется загру-
жаемым фонтом. Так зачем же его
загружать при каждом ассемблиро-
вании? Можно загрузить его толь-
ко один раз, и потом он будет
сидеть в памяти:
...
font org #7000
!assm !on
loadcode "font51"
!cont
org #7300
...
или Вам не надо, чтобы ассембли-
ровалась какая-то часть кода, и
чтобы не забивать все строки в
комментарии, просто ограничьте
их опциями !assm !off и !cont.
!assm n (* - нет)
Параметр n - кол-во повто-
ров. Позволяет отассемблировать
кусок текста до опции !cont n
раз. Напоминает о defs Tasmа, но
на порядок круче ее:
!assm 128
ld hl,0
push hl
!cont
!assm #50/2-%0101
"i zachem eto?"
ld hl,0
all 1
!cont
Вместо n может стоять метка,
если она определяется выше.
Ставить метки между !assm n и
!cont не рекомендуется. Пользуй-
тесь $.
Вложенность !assm с любыми
параметрами не допускается!
defm - вместо defm "string"
можно набирать просто "string",
в этом случае количество симво-
лов в строке увеличится до 40.
defb - если в defb у Вас
только шестнадцатеричные числа,
то можно вместо defb #n1,#n2,
#n3,#n4... набирать просто #n1n2
n3n4... Здесь первый символ '#'
обязателен и каждое число дол-
жно быть набрано двумя цифрами
(0=00, #a=0a...); числа для наг-
лядности можно разделять знач-
ками '#' (#n1#n2n3#n4... - как
угодно) и, конечно, вместо '#'
можно жать '.'
4. Макрос
Макросы набираются нажатием
graph (cs/9) и затем одной из
клавиш с шифтами или без. При
этом на экран выведется строка,
которая присвоена файлом макро-
са данной букве. Файл макроса
строится следующим образом: он
состоит из строк, где первым
символом должен стоять знак ';',
вторым - символ, при нажатии ко-
торого на экран будет выводиться
строка, которая расположена за
этим вторым (т.е. до 40 симво-
лов). Если в конце строки необ-
ходимы пробелы, то последний
пробел следует заменить на под-
черкивание (ss/0), иначе они бу-
дут обрезаны редактором. Если
надо, чтобы после вывода макро-
са автоматически нажимался en-
ter, заканчивайте макрос точ-
кой.
Длина файла макроса не дол-
жна превышать #b20, чего, соб-
ственно, вполне достаточно, что-
бы иметь макрос на всех возмож-
ных символах (их около 90).
Ограничение длины связано с таб-
лицей меток: при блочной опера-
ции копирования макрос будет
урезан до указанной длины. Если
в Вашей программе огромное коли-
чество меток (>1500), то файл
макросов в памяти может быть
частично или полностью уничто-
жен, что, впрочем, к подвисанию
не приведет, просто, если Вы
пользуетесь макросами, надо бу-
дет их перезагрузить.
5. Формат текста
Раздел для тех, кто хочет
написать свои перекодировщики и
др. или разобраться в работе
р-а...
Первые 29 байт файла хранят
комментарий; затем 2 байта - ад-
рес текущей позиции в тексте
(адрес _начала_ текущей строки);
далее 2 байта - текущие коорди-
наты курсора (x, потом y); 1
байт признак ovr/ins; 1 байт -
кол-во редакций файла (0..127);
байт #01 - признак начала тек-
ста. Формат строки текста объяс-
ню на примере:
Экран:
label LD HL,#4d00-" a"; ПРИМЕР
память:
LABEL',#ac,#d2,'#4D00-" a"; ПРИМЕР',#0d
метки хранятся большими буквами;
табуляторы отсутствуют; запятые
могут быть только в коммента-
риях, кавычках или в качестве
разделителей в defах; пробелы
могут быть только в кавычках или
в комментариях; последний байт в
строке может быть #0d - строка
обычного цвета, #09 - желтого
или #0c - красного;
такой пример:
LD (IX+"1"!2),"V"
в памяти:
#ac,'(',#d3,'+"1"!2)V',#0d
Русские буквы: схожие по на-
чертанию с латинскими в фонте не
дублируются и имеют коды латин-
ских, остальные имеют коды:
ДЖИЙЛПУФЦЧЫЬЭЮЯЪ - с #10 до #1f,
ШЩБГ - с #7b до #7e.
И самым последним байтом в
тексте должен стоять #00.
6. Советы по программированию
новичкам
Может, конечно, это наглость
с моей стороны давать какие-ли-
бо советы, но все-таки я напи-
сал уже две серьезные программы,
так что кое-что могло бы Вам
пригодиться.
1) постарайтесь спланировать
программу перед ее написанием.
Точно решите, что она будет де-
лать и как.
2) старайтесь делать меньше
меток - и ассемблирование пойдет
быстрее, и не будет проблем с
переполнением таблицы - исполь-
зуйте значок '$', который озна-
чает текущий адрес; если рядом
стоят несколько меток, то можно
обратиться к одной, используя
имя другой + смещение.
3) для экономии памяти поль-
зуйтесь следующими вещами: если
вам нужна ячейка, то не делайте
подобного:
label defb 0
....
ld a,(label)
....
ld (label), a
а заменяйте на:
label ld a,0
ld (label+1),a
В качестве ячеек для хране-
ния чего-либо можно использо-
вать переменные бейсика. Для,
например, печати через свой
драйвер можно переопределить ка-
нал и пользоваться rst 16.
О быстродействии: помните,
что jp работает быстрее jr, ldi
быстрее ldir, что самый быстрый
способ запихнуть в память байт
или достать его оттуда - это
push и pop.
4) О '$': помните, что $
указывает адрес начала текущей
операции, т.е.
label djnz label эквивалентно
djnz $
а не, скажем, $-2.
7. Перекодировщик
Перекодировщик написал hac-
ker Cris, и вещь, я Вам скажу,
довольно крутая: перекодирует он
из gens, isdos assembler или
tasm 3.0 в xas и из xasa в txt,
причем формат текста (gens/is-
dos/tasm/xas) определяет сам,
так что думать вообще не надо.
При перекодировке в xas он
пишет количество ошибок - пере-
полнений строки (т.к. в tasme и
isdose строки до 255(?), а у ме-
ня до 42 символов, и длинные
строки режутся пополам. При этом
строка будет помечена красным
цветом, и ее можно легко найти в
xasе (по ss/y/u) и подправить.
После перекодировки может воз-
никнуть глючок: при ассемблиро-
вании находится ошибка, тогда
как строка выглядит нормально.
Здесь надо просто встать на эту
строку и нажать что-либо отлич-
ное от курсор вверх и вниз. Нап-
ример, можно просто нажимать
ss/u или y.
8. The End
Ну все, закончена эта убой-
ная работа по набиванию helpа,
теперь можно расслабиться и соз-
наться, что весь help и весь Xas
написал Макс Петров из Санкт-Пе-
тербурга в январе 1996 года с
телефоном 598 0159 (по которому
можно сообщить о глюках).
А также сказать, что переко-
дировщик написал hacker Cris,
похоже, не без помощи своего
виртуального брата Johna Stun-
nera. За что им спасибо, т.к. во
время писания они поймали часть
глючков в Xasе. Johnnу еще одно
спасибо за ускорение оч. ма-
ленькой, но оч. важной процедур-
ки, результатом которой стало
повышение скорости ассемблирова-
ния на 15% по сравнению с исход-
ным, а больше всего я ему благо-
дарен за то, что его ускорение
навело меня на мысль о еще
большем ускорении, и я получил
еще 32-х процентное уменьшение
времени ассемблирования... В ре-
зультате, счет в нашу пользу
увеличился в полтора раза.
И, наконец, передать привет
и пожелания счастья в новом го-
ду всем юзерам, плейерам, хаке-
рам и сочувствующим.
* * *