User Tag List

Результаты опроса: Использование RST

Голосовавшие
5. Вы ещё не участвовали в этом опросе
  • Предлагаемый вариант нужно обсудить…

    1 20.00%
  • Старо, как весь восьмибитный мир!

    2 40.00%
  • Автор сам понял, что написал?

    2 40.00%
Опрос с выбором нескольких вариантов ответа.
Страница 5 из 5 ПерваяПервая 12345
Показано с 41 по 47 из 47

Тема: Обфускация кода / Плюшки команды RST 7

  1. #41

    Регистрация
    20.06.2014
    Адрес
    г. Орск, Оренбургская обл.
    Сообщений
    814
    Спасибо Благодарностей отдано 
    34
    Спасибо Благодарностей получено 
    80
    Поблагодарили
    60 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Радио-86РК Посмотреть сообщение
    (Естественно, на 78 умножал не циклом, а стопкой «DAD»-команд…)
    Быстрое умножение на 78: 78*x=2*(2*2*2*(2*2*x+x)-x), умножение на два - арифметический/логический (не циклический!) сдвиг влево.
    Последний раз редактировалось LeoN65816; 14.12.2019 в 03:05.
    Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).

  2. #42
    HardWareMan
    Гость

    По умолчанию

    Цитата Сообщение от LeoN65816 Посмотреть сообщение
    Быстрое умножение на 78: 78*x=2*(2*2*2*(2*2*x+x)-x), умножение на два - арифметический/логический (не циклический!) сдвиг влево.
    DAD H так и делает сразу для 16 бит.

  3. #43

    Регистрация
    05.03.2010
    Адрес
    Ташкент
    Сообщений
    160
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    66
    Поблагодарили
    41 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от LeoN65816 Посмотреть сообщение
    Быстрое умножение на 78: 78*x=2*(2*2*2*(2*2*x+x)-x), умножение на два - арифметический/логический (не циклический!) сдвиг влево.
    В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.

  4. #44

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,396
    Спасибо Благодарностей отдано 
    765
    Спасибо Благодарностей получено 
    2,368
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Традиционный (без вычитаний) аналог процедуры у меня получился на байт короче и на 2 такта быстрее. И не портит регистры A, B, C. Если портить A, то еще -1 байт.

    - - - Добавлено - - -

    А если портить и BC, то еще -1 байт и -16 тактов

    - - - Добавлено - - -

    И это не предел, еще получается оптимизировать и по размеру и по скорости.

  5. #45

    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Если этот код используется для текстового режима и есть ограничения на 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

  6. #46

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,396
    Спасибо Благодарностей отдано 
    765
    Спасибо Благодарностей получено 
    2,368
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    blackmirror, чтобы оценить скорость надо переводить в код, но размер можно и так прикинуть. Получается в 2-2.5 раза больше процедур с dad h.

  7. #46
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  8. #47

    Регистрация
    05.03.2010
    Адрес
    Ташкент
    Сообщений
    160
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    66
    Поблагодарили
    41 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от blackmirror Посмотреть сообщение
    Если этот код используется для текстового режима и есть ограничения на X и Y, то можно обойтись без 16 разрядных команд. К примеру, если X<78 а Y<36 (потому что 37*7>255), можно сделать примерно такой вариант(от START до RET самая длинная ветка):
    Мы тут в соревновашках что ли?

    Вот этот код:
    Код:
    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.

Страница 5 из 5 ПерваяПервая 12345

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Недокументированные команды z80
    от tae1980 в разделе Программирование
    Ответов: 18
    Последнее: 09.12.2018, 09:16
  2. Неиспользуемые и редкоиспользуемые команды
    от alone в разделе Программирование
    Ответов: 120
    Последнее: 18.10.2013, 00:07
  3. Недокументированные команды
    от MadCat! в разделе Программирование
    Ответов: 46
    Последнее: 02.02.2011, 13:49
  4. Команды Z80
    от e2e4 в разделе Для начинающих
    Ответов: 11
    Последнее: 02.07.2010, 21:13
  5. Команды Z80
    от Almaz в разделе Программирование
    Ответов: 1
    Последнее: 28.10.2007, 12:50

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •