не потерял надежды сделать таблицу для DDP по данным dx и dy
а ты подсчитывал, сколько памяти тогда уйдёт под все циклы всех секторов и сколько цикл для диагонали будет работать?
сейчас тестирую альтернативный метод, позволяющий диагональ построить в цикле за ~8300 и к тому же перспективнее для коротких (правда, код опять разбухнет под 8кб)
парни, я, конечно, всё понимаю. у вас азарт и взаимопонимание с полуслова. но вы бы хоть выкладывали потом результат наработок-то для простых сметрных:)
По сути, ты ускорил не длинную линию а короткую. У меня короткая линия до 30 пикселов обгоняет линию эксперта, а с этим трюком можно наверное и до 35-40 дотянуть.
Эх, это не та табличка! :) Я не потерял надежды сделать таблицу для DDP по данным dx и dy.
Ну т.е. конечно в компактном случае повеселее, и сама возможность гнать сразу две точки…
Ммм..., это конечно далеко от того, где я думал, но тоже довольно сексуально выглядит.
применять можно вместе с обсуждавшейся процедурой или отдельно
тогда примерно или +1кб и +10% скорости, или -6кб и -10% скорости
щас прикинул, может быть, даже и развёрнутую быструю процедуру утоптать получится в ~4кб без особенной потери скорости на коротких, а на длинных даже с выигрышем
Да сама табличка сверхпримитивная, основное — где она расположена, нужно выделить удобные адреса (из нескольких вариантов). Где и что у неё внутри, должно быть понятно из кода сразу. Смотри, вот так может выглядеть DOWN_HL для компактной неразвёрнутой процедуры:
djnz (на inc h)
ld b,c (или ld b,8)
add hl,sp
ld h,(hl)
inc h
Что средневзвешенно на полтора+ такта быстрее чем pop:add и не использует стек (только временно его указатель), а потому может применяться и при рисовании с двух концов (для UP_HL код аналогичный, но с альтернативной парой вместо sp и второй таблицей). Прерывания тоже не страшны, если над (sp) немного места зарезервировать. В сам sp грузим константу #XX20, где XX зависит от адресов таблиц и экрана. Например, в sp можно поместить #E020 если с #C000 рисуем на двух экранах. Код короткий, для таблиц на каждый сегмент экрана нужно 256*2 байт (на последний сегмент можно только 256, если закольцовывать не хотим).
Для развёрнутых процедур DOWN_HL будет соответственно «inc h» или «add sp:ld h,(hl)»
Средневзвешенно минус три такта на ступеньку.
Вот и всё, я даже засомневался, что никто еще до этого не допёр. :D
сейчас тестирую альтернативный метод, позволяющий диагональ построить в цикле за ~8300 и к тому же перспективнее для коротких (правда, код опять разбухнет под 8кб)
Ну т.е. конечно в компактном случае повеселее, и сама возможность гнать сразу две точки…
Ммм..., это конечно далеко от того, где я думал, но тоже довольно сексуально выглядит.
Альбом демодуляции добавил + DiHalt lite 2020.
Всячески приветствуется заливка фоточек с мероприятий.
ps. подлил в мультик 17 и 18.
Что средневзвешенно на полтора+ такта быстрее чем pop:add и не использует стек (только временно его указатель), а потому может применяться и при рисовании с двух концов (для UP_HL код аналогичный, но с альтернативной парой вместо sp и второй таблицей). Прерывания тоже не страшны, если над (sp) немного места зарезервировать. В сам sp грузим константу #XX20, где XX зависит от адресов таблиц и экрана. Например, в sp можно поместить #E020 если с #C000 рисуем на двух экранах. Код короткий, для таблиц на каждый сегмент экрана нужно 256*2 байт (на последний сегмент можно только 256, если закольцовывать не хотим).
Для развёрнутых процедур DOWN_HL будет соответственно «inc h» или «add sp:ld h,(hl)»
Средневзвешенно минус три такта на ступеньку.
Вот и всё, я даже засомневался, что никто еще до этого не допёр. :D