но это вариант "общего назначения", в микродеме как правило можно еще сократить за счет трюков.Код:SetPal:
lxi h,COLR15
mvi e,15
SetPalLoop:
mov a,e
out 2
mov a,m
out 0Ch
xthl
xthl
dcx h
dcr e
mov a,a
out 0Ch
jp SetPalLoop
Вид для печати
но это вариант "общего назначения", в микродеме как правило можно еще сократить за счет трюков.Код:SetPal:
lxi h,COLR15
mvi e,15
SetPalLoop:
mov a,e
out 2
mov a,m
out 0Ch
xthl
xthl
dcx h
dcr e
mov a,a
out 0Ch
jp SetPalLoop
Improver, ivagor спасибо !!
ivagor, а какое назначение команд xthl и mov a,a ? Это чтобы просто паузу создать между двумя out 0Ch ?
Да, нужно обойти "зоны непрограммируемости". Если временно отвлечься от темы оптимизации по размеру, то есть и оптимальный по скорости вариант, там для каждого цвета out 0Ch только один раз.
Для сокращения кода хочу убрать следующие команды при инициализации программы
;MVI A,0C3H ; установить переход (код команды JMP) в
;STA 0038H ; адрес вызова прерывания.
;LXI H,INIT ;УСТАНОВКА ВЕКТОРА ПРЕРЫВАНИЯ.
;SHLD 0039H
Допустимо ли такой вариант ORG 0031h ?
Пока что у меня чёрный экран выходит.
;==================================
ORG 0031h
STRINT: DI
LXI SP,7E03h ;100H
jmp Progrm
;=================================== обработка прерываний
INIT:
PUSH PSW
.......................
POP PSW
EI
RET ; выход из прерываний
;================================================= СТАРТ ПРОГРАММЫ
Progrm:
EI
lxi h, 0e000h ; куда в экран
...............
;==================================
С ORG 0031h это вопрос скорее к организаторам конкурса, какие векторовские форматы они принимают и как (откуда) будут запускать демы. Если допустима загрузка с магнитофонного входа, то стартовый адрес д.б. кратен 256 байтам. Если запуск из доса, то два варианта - или 100h (com/rom) или, если с "запускалкой", r0m (согласны ли организаторы использовать запускалку?). Грузить с (более-менее) произвольного адреса можно в монитор-отладчик или, например, эмулятор РК/Микроши. Опять же - организаторы согласны на это? И, кстати, если грузить в монитор отладчик затирая вектор прерываний, то это скорее всего закончится не вполне хорошо.
Не назвал бы это трюком, я несколько о другом.
Например можно расположить палитру в памяти с адреса кратного 256 (100h) и тогда не нужен отдельный счетчик цветов (тут я не обязательно про дему в 256 байт). Убираем mvi e,15; dcr e; меняем dcx h на dcr l. Можно этот трюк модифицировать и для некоторых других адресов. Подобные придумки перечислить в рамках форумного поста вряд ли возможно.
Вопрос и простой и сложный одновременно... Трюков, вроде, не так много, но определённого их сборника или каталога нет, перечислять их тут -- как написать книгу. :) Попробуйте посмотреть в каталоге Базис периодические и электронные издания: Вектор-User, Байт, Scaner, InVector и др., там встречалось много советов по программированию, и спрашивайте конкретные моменты тут, посоветуем, как лучше.
Ответ можно разбить на две части: собственно программные трюки под конкретный проц - раз; учет аппаратных особенностей компа - два.
8080, конечно, не совсем Z80, но кое-какие мысли изложу, а что подойдет для Вектора - кодерам под 8080 виднее.
Именно для компактности кода, а не скорости исполнения, забываем про развернутые циклы и подобные "бусты" на скорость.
Начинаем с выравнивания кода и данных по "ровным" HEX-адресам, а также циклов (с некоторыми допущениями).
Для циклов это избавит в части случаев от задания количества повторов цикла в регистре, либо сверки его с конкретным числом.
Например, заполняем некую область данными, при этом на старте HL=#XX00, нам нужно забить 100/128/200 байт. Ниже коды Z80, но общий смысл, думаю, будет понятен.
Можно организовать цикл на 100 (или сколько там) повторений, а можно просто увеличивать регистр L, пока он не обнулится. То бишь конструкцией вида INC L: JR NZ,repeat.
Аналогично, проверяя аккумулятор через ротацию и зная, какое число в нем было изначально (для Z80 можно и любой регистр), можно сделать нужный счетчик.
Например, нам нужен цикл с повторением 4 (либо с реакцией на каждый 4-й проход), при этом сам счетчик даже необязательно перезагружать.
Для этого в аккумулятор грузим #88 (%10001000 бинарно), а в программе циклически сдвигаем (RRCA или как там у 8080 пишется) и делаем переход/нужное по флагу переноса.
Флаг этот будет устанавливаться каждый четвертый проход, при этом "счетчик" будет самовосстанавливаться. Таким же путем делаются счетчики на 2 и 8, числами #AA и #80.
Учитывая аппаратные особенности конкретного компа (строение экрана, например), можно тоже сокращать код. Особенно часто это делается на Спектруме с его хитрым экраном.
Выше уже писали насчет палитр Вектора, вот как раз на эту тему.