Как сокращать исходники. © Alone Coder Текстина предназначена для особо крутых кодеров, а конкретнее,для той их разновид- ности,которая может выкинуть все коммента- рии из программы, лишь бы уменьшить объём ассемблерного текста и таким образом "улу- чшить читабельность";) Категорически не рекомендуется к проч- тению начинающими! Не знаю,как вы,а я почему-то люблю,ког- да в программе поменьше исходников. Может быть, это и пережиток моего 128-го прошло- го,когда в ассемблер нельзя было загрузить одновременно больше трёх текстов, а может, мне не нравится мовировать диски после многократного "SAVE +".Я думаю,меня поймут даже пользователи STORM'а,хотя речь пойдёт не о нём. Речь пойдёт о сокращении ALASM'овских исходников. Глава 1. Как выбрать странички под исходники. Есть несколько плюсов в настройке ALASM для помещения его в #11 страничку (#51 для 512k). Во-первых, в Mr.Gluk Reset Service есть опция выхода в XAS (#51, JP #C000), причём она несколько ближе, чем аналогичная опция для выхода в #14 ASM. И следует учесть,что #14 ASM не находится в верхней памяти для счастливых обладателей PENTAGON 512-1024k. Во-вторых, в выбранном варианте ассемб- лер больше не перекрывает 4 страничку, в которой помещается часть экрана 384x304 и DMA-области Sound Blaster'а. Хотя лично я сейчас прохладно отношусь к этим устройст- вам (особенно к DMA SB), но кто скажет,что будет потом... В-третьих,совсем маленькая выгода: если в системной программе огранизовано вирту- альное адресное пространство на 64k,то ра- змещение этого пространства по страничкам 0,3,6,1 даёт один байт выигрыша по сравне- нию с классическим расположением 0,1,3,4. Расчёт номера странички по адресу байта в виртуальной памяти: ;было (0,1,3,4) ;стало (0,3,6,1) LD A,H LD A,H SET 7,H SET 7,H SET 6,H SET 6,H RLCA RLCA RLCA RLCA AND 3 AND 3 CP 2 XOR 1 SBC A,-17 INC A XOR 18 (+1 байт) Обратный процесс: ;было (0,1,3,4) ;стало (0,3,6,1) CP 18 DEC A ADC A,#ED AND 3 RRCA RRCA RRCA RRCA AND H XOR H LD H,A LD H,A (-1 байт) Вычисление номера следующей странички: ;было (0,1,3,4) ;стало (0,3,6,1) INC A SUB -3 CP 18 AND 23 JR Z,$-3 (-1 байт) Вот так вот ;))) Как связан третий пункт с расположением ассемблера? А так:ассемблер лежит в после- дней банке по списку, т.е. запарывается в последнюю очередь! Значит, ассемблер должен быть настроен так:(универсально,как для 128k,так и выше) #41 - system page #47 - sts #47 - disk buffer [#d200-#daff] (это освобождает место под ещё один сорс!) #c6 - source start #43 - symbols list Если у твоей тачки >128k, а программа содержит жуткое количество меток, то post symbols page следует установить не равным symbols list page. Я пока что видел только один сорс, где это потребовалось, и этот сорс был не мой :)) Следует учесть,что при изменении system page нужно прописать её ручками в код ала- сма, иначе он не будет возвращаться из вы- зываемых программ ;(. Место, где надо про- писать,находится в районе драйвера верхней памяти. При изменении system page и sts main page желательно изменить соответствующие странички и в загрузчике аласма,иначе каж- дый раз при загрузке ассемблера будут пор- титься указанные там по умолчанию нижние банки (#14 и #17,а также часть #11,где ле- жит кусок sts'а). Я хотел поместить настроенный таким об- разом ALASM 4.1 6x7 (ага! вот я в чём пишу 8)) в архивчик с исходниками ACEdit.Но тут откуда ни возьмись появилась более совре- менная версия 6x7 - 4.43,с большим пакетом файлов,так что в приложение я её класть не буду ;). Интересно,что там после смены си- стемной странички код аласма трогать уже не надо :)) Итого получаем странички для исходников (для 128k, остальным и думать не надо ;)): #14, #16, #17 (только #1200 байт!) и #10 (временно, т.е. чтобы просто загрузить и скопировать несколько строчек в другой сорс). Если памяти всё равно не хватит, можно практиковать следующий трюк:пусть програм- ма портит страничку с аласмом, а на выходе - подгружает его с дискеты! Глава 2. Простое сокращение текста. Во-первых, никогда не ставьте табуляцию между командой и операндом! Пробел занима- ет на 1 байт меньше,да и текст с пробелами выглядит понятнее... Во-вторых, совет любителям шестнадцати- ричной арифметики: старайтесь записывать константы в той системе счисления, где они выглядят короче. Разумеется, только в том случае,когда наглядность от этого не пост- радает. Пишите 32,а не #20.А написание #07 вместо 7 вообще ничто не может оправдать! Не гнушайтесь констант с минусом. -1 короче, чем 255, и тем более короче,чем #ffff. В-третьих (вывод из следствия к преды- дущему совету):заменяйте ADD A,x на SUB -x в случае, когда флаги после такой операции не важны. В-четвёртых,закрывающая кавычка в конце строковой константы в большинстве случаев не нужна. Если строку замыкает символ из первой половины кодовой таблицы, то ошибки при компиляции не будет, и результат оста- нется таким же. Почти всегда ;) Дальше просто советы,понять которые мо- жно по аналогии с предыдущими: RLA или RLCA могут в некоторых случаях заменить "длинную" команду ADD A,A. Лишние метки не нужны. DJNZ $ короче, чем LxCF0 DJNZ LxCF0 DUP 4 RLA EDUP короче,чем RLA RLA RLA RLA DUP 7 LD A,(HL) LD (DE),A INC L INC D EDUP LD A,(HL) LD (DE),A можно заменить на DUP 8 LD A,(HL) LD (DE),A INC L INC D EDUP ORG $-2 (если не забыть поставить в конце програм- мы ORG <адрес запуска>) Массив констант в DEFW занимает меньше места, чем в DEFB. Не пишите "LD L,.address"! Точка здесь совсем не нужна! XOR A OR (HL) короче,чем обычное LD A,(HL) OR A Глава 3. Злое сокращение текста. Все предыдущие советы объединяет одно: они не нарушают читабельность программы,то есть команды остаются командами. Но есть способ злее.Он столь же резуль- тативен,сколь и неудобен с непривычки.Сра- зу предупреждаю: если у вас проблемы с па- мятью, не читайте дальше! Иначе вы имеете шанс, последуя инструкциям, угробить свой проект, т.к. просто перестанете в нём раз- бираться ;( Замена первая. DB ") это то же самое, что и ADD HL,HL. А если ADD'ов несколько? DB "))))) Замена вторая. LD A,"S заменяем на DB ">S Аналогично вместо LD HL,"R"*256+"C пишем DB "!CR Замена третья. DB "w это LD (HL),A. Как запомнить? "write" DB "~ это LD A,(HL). Тильда находится на кнопке "A", там же, где оператор "READ". DB ", это INC L.Само по себе не даёт выигрыша,но в комбинации сильно сокращает программу: DB ",w, вместо трёх строк исходника! Аналогично, DB "- это DEC L. $=INC H, %=DEC H, +=DEC HL, #=INC HL. Как запомнить,решайте сами ;) p=LD (HL),B q=LD (HL),C и т.д. ы=EX DE,HL Короче,так "токенизировать" можно почти все команды в диапазоне кодов от 32 до 127 и часть команд с кодами >128. Насколько у вас памяти хватит ;)))) Степень токенизации каждого отдельного участка кода должна зависеть от того, нас- колько часто вы планируете его изменять. Особенно хорошо будет выглядеть подпро- грамма Down HL (точнее, тот её вариант,ко- торый возвращает CY=1 при пересечении зна- коместа - см. ZG#1): DHL DB "$|ц'└}╞ o╪|╞°g╔ Вот и всё, теперь мои исходники для вас не китайская грамота :)))