Как сокращать исходники.

© 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╔

   Вот и всё, теперь мои исходники для вас
не китайская грамота :)))