ZX Review #11-12
26 ноября 1997

Новые программы - Обзор Xas редактор-ассемблер 128К (v5.05).


Программное обеспечение Описание Ассемблеры

┌──────────────────────────────┐
│                              │
│       НОВЫЕ  ПРОГРАММЫ       │
│                              │
└──────────────────────────────┘

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-х  процентное  уменьшение
времени ассемблирования... В ре-
зультате,  счет  в  нашу  пользу
увеличился в полтора раза.
    И, наконец, передать  привет
и пожелания счастья в новом  го-
ду всем  юзерам, плейерам, хаке-
рам и сочувствующим.

           *   *   *




Другие статьи номера:

Авторская разработка - С.Зонов, А.Ларченко. О контроллере SMUC (HDD и IBM периферия).

Компьютерная новелла - Воины Звезд (по игре Shadowfire).

Новые программы - Обзор Digital Studio v1.12, Digital Studio Compiler v1.01

Новые программы - Обзор Xas редактор-ассемблер 128К (v5.05).

Новые программы - Обзор Музыкального редактора Instrument v3.01

Новые программы - Обзор программ FASTzasm и @-zasm.

Новые программы - Обзор программы No Kempston.

Профессиональный подход - Алгоритмы построения и прохождения Лабиринтов.

Смех без причины... - Материалы из юмористического журнала SpectrofUn.

Советы экспертов - Игра FEUD.

Советы экспертов - Игра Killed Until Dead.

Советы экспертов - Игра War in Middle Earth.

Форум - Конверсия цветной спектрумовской картинки на IBM. Конверсия ч/б картинки с IBM на ZX Spectrum.

Форум - О русификации игровых программ.

Форум - Программа детекта эмулятора.

Форум - Процедура "цветные полосы на бордюре". Снижение шума FDD.

Форум - Процедура перевода числа в десятичный вид. Процедура - сканер пароля.

Форум - Снятие защиты Microprotector'а.

Форум - Эмуляторы, которые мы выбираем: 'UKV Spectrum Debugger', 'Z80TRDOS'.

Читатель-читателю - Драйвер ввода в режимах последовательного и прямого доступа из файлов системы TR-DOS.

Этюды - Графический эффект "плазма 2".

Этюды - Графический эффект "плазма 2".

Этюды - Графический эффект "плазма".

Этюды - Полезные советы. Быстрая переброска экрана.

Этюды - Ремейк процедур 93 года.

Этюды - Эффект "пламя".


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

Похожие статьи:
Система - Обзор ассемблеров: ZEUS , TASM , PRIMUS , GENS4 , GEMUS.
Кофейникам - Как вызвать встроенный редактор.
Система - программа для начинающих и опытных программистов - ассемблер МАSМ v1.0.

В этот день...   8 декабря