Предлагаемый вариант нужно обсудить…
Старо, как весь восьмибитный мир!
Автор сам понял, что написал?
Последний раз редактировалось LeoN65816; 14.12.2019 в 03:05.
Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).
Вoт так?Код:MUL_78: PUSH H ; (11 тактов) MOV L,H ; ( 5 тактов) MOV C,H ; ( 5 тактов) XRA A ; ( 4 такта) MOV H,A ; ( 5 тактов) MOV B,H ; ( 5 тактов) MVI D,0FFH ; ( 7 тактов) MOV A,C ; ( 5 тактов) CMA ; ( 4 такта) MOV E,A ; ( 5 тактов) INX D ; ( 5 тактов) DAD H ; Y x 2 (10 тактов) DAD H ; Y x 4 (10 тактов) DAD B ; Y x 5 (10 тактов) DAD H ; Y x 10(10 тактов) DAD H ; Y x 20(10 тактов) DAD H ; Y x 40(10 тактов) DAD D ; Y x 39(10 тактов) DAD H ; Y x 78(10 тактов) POP C ; (10 тактов) MVI B,0 ; ( 7 тактов) DAD B ; Y + X (10 тактов) RET ; 24 инструкции - 169 тактов
Последний раз редактировалось Радио-86РК; 14.12.2019 в 12:22.
Традиционный (без вычитаний) аналог процедуры у меня получился на байт короче и на 2 такта быстрее. И не портит регистры A, B, C. Если портить A, то еще -1 байт.
- - - Добавлено - - -
А если портить и BC, то еще -1 байт и -16 тактов
- - - Добавлено - - -
И это не предел, еще получается оптимизировать и по размеру и по скорости.
Если этот код используется для текстового режима и есть ограничения на X и Y, то можно обойтись без 16 разрядных команд. К примеру, если X<78 а Y<36 (потому что 37*7>255), можно сделать примерно такой вариант(от START до RET самая длинная ветка):
Код:START: A = Y A /= 2 JNC Y_20 Y_31: A /= 2 H = A ;Y/4 A = X JNC Y_20 Y_3: A += 192 JNC Y_0 H +=1 Y_0: L = A ;HL = X+Y*64 A = Y A *= 2 A += Y A *= 2 A += Y ;A=7*Y A *=2 JNC Z_1 H += 1 Z_1: A += L JNC Z_2 H += 1 Z_2: L = A ;HL = X+Y*64+Y*14 RET Y_1: A += 64 JMP Y_0 Y_20: A /= 2 H = A ;Y/4 A = X JNC Y_0 Y_2: A +=128 JMP Y_0
blackmirror, чтобы оценить скорость надо переводить в код, но размер можно и так прикинуть. Получается в 2-2.5 раза больше процедур с dad h.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Мы тут в соревновашках что ли?
Вот этот код:Полностью перемещаемый, так как не использует ветвлений.Код:L0: MVI H,29 L1: MVI L,77 L2: PUSH H CALL MUL_78 LXI B,076D0H DAD B MVI A,02AH XRA M MOV M,A POP H DCR L JP L2 DCR H JP L1 JMP L0 ;;;;;;;;;;;;;;;;;;;;;;;; MUL_78: PUSH H ; (11 тактов) MOV L,H ; ( 5 тактов) MOV C,H ; ( 5 тактов) MVI H,0 ; ( 7 тактов) MOV B,H ; ( 5 тактов) MVI D,0FFH ; ( 7 тактов) MOV A,C ; ( 5 тактов) CMA ; ( 4 такта) MOV E,A ; ( 5 тактов) INX D ; ( 5 тактов) DAD H ; Y x 2 (10 тактов) DAD H ; Y x 4 (10 тактов) DAD B ; Y x 5 (10 тактов) DAD H ; Y x 10(10 тактов) DAD H ; Y x 20(10 тактов) DAD H ; Y x 40(10 тактов) DAD D ; Y x 39(10 тактов) DAD H ; Y x 78(10 тактов) POP B ; (10 тактов) MVI B,0 ; ( 7 тактов) DAD B ; Y + X (10 тактов) - 21:166 тактов RET ; (11 тактов) - 22:177 тактов ; 25 байтов
В эмуляторе (т.е. - не точно) он показывает скорость около 88 кадров в минуту: 1,47 FPS - 3432 символа/сек.
То есть, для заполнения/сколлинга экрана никак не годится.
Правда, у меня были ещё процедурки рисования линии псевдографики, которые разово её используют.
Но они заполняют экран за 5 секунд (156×60).
И Бейсиком - за 5 секунд (128×50).
Графику тяжело оптимизировать (Брезенхэма).
Самое большее, что более-менее оптимизировал - перевод координат в псевдосимвол:Не знаю, имеются ли процедурки оптимальнее (перемещаемые - без таблиц)…Код:; D - Y, E - X MOV A,D RRC SBB A ; проверяем, чётная ли строка? XRI 003H ; нечётные пиксели - 08 / 04 ANI 00FH ; чётные пиксели - 01 / 02 MOV B,A MOV A,E RAR MOV C,A SBB A ; проверяем, чётный ли столбец? XRI 009H ; нечётные пиксели - 02 / 04 ANI 00FH ; чётные пиксели - 01 / 08 ANA B ; маскируем 01/02 или 08/04 MVI B,0 DAD B ; приращиваем горизонталь ADI 008H ORA M ANI 017H MOV M,A ; ставим пиксель на экран![]()
Последний раз редактировалось Радио-86РК; 14.12.2019 в 20:09.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)