Как сокращать исходники.
© 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╔
Вот и всё, теперь мои исходники для вас
не китайская грамота :)))
Сайт управляется системой
uCoz