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