User Tag List

Страница 105 из 113 ПерваяПервая ... 101102103104105106107108109 ... ПоследняяПоследняя
Показано с 1,041 по 1,050 из 1128

Тема: ЭТЮДЫ

  1. #1041

    Регистрация
    05.09.2007
    Адрес
    Орск
    Сообщений
    1,071
    Спасибо Благодарностей отдано 
    269
    Спасибо Благодарностей получено 
    1,245
    Поблагодарили
    370 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Да код и не нужен.
    О таком преобразовании я что-то и не подумал.

  2. #1042

    Регистрация
    05.09.2007
    Адрес
    Орск
    Сообщений
    1,071
    Спасибо Благодарностей отдано 
    269
    Спасибо Благодарностей получено 
    1,245
    Поблагодарили
    370 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    цель задачи
    (Number)=(Number)-(Number)*c/#10000

    Код:
    ;трехбайтное число
    Number
    low db 0
    med db 0
    high db 0
    
    
    ;определение множителя
    	ld	hl,Tabl
    	and	#7F
    	jr	z,.gtm01
    	add	a,l
    	ld	l,a
    	ld	c,(hl)
    ;c - множитель
    
    ;high
    	ld	a,(high)
    	and	#7F
    	ld	b,a
    ;  умножение hl=c*b
    	sub	c
    	jr	nc,.gtm02
    	ld	a,c
    	sub	b
    .gtm02	rra
    	ld	h,TableSqr/#100
    	ld	l,a
    	ld	e,(hl)
    	inc	h
    	ld	d,(hl)
    	ld	a,b
    	add	a,c
    	rra
    	ld	l,a
    	ld	a,(hl)
    	dec	h
    	ld	l,(hl)
    	ld	h,a
    	and	a
    	sbc	hl,de
    
    ;med
    	push	hl
    	ld	a,(med)
    ;  умножение hl=a*c
    	ld	b,a
    	sub	c
    	jr	nc,.gtm03
    	ld	a,c
    	sub	b
    .gtm03	rra
    	ld	h,TableSqr/#100
    	ld	l,a
    	ld	a,b
    	add	a,c
    	rra
    	ld	e,(hl)
    	inc	h
    	ld	d,(hl)
    	ld	l,a
    	ld	a,(hl)
    	dec	h
    	ld	l,(hl)
    	ld	h,a
    	and	a
    	sbc	hl,de
    	pop	de
    	ld	a,l
    	ld	l,h
    	ld	h,#00
    ;hla = med*c
    ;de = high*c
    
    ;сложим
    	add	hl,de
    	ld	b,a
    	ex	de,hl
    
    ;low
    	ld	a,(low)
    	ld	h,a
    	sub	c
    	jr	nc,.gtm04
    	ld	a,c
    	sub	h
    .gtm04	rra
    	ld	l,a
    	ld	a,h
    	add	a,c
    	rra
    	ld	h,TableSqr/#100+1
    	ld	c,(hl)
    	ld	l,a
    	ld	a,(hl)
    	sub	c
    
    	add	a,b
    	jr	nc,.gtm05
    	inc	de
    
    .gtm05	ld	hl,(low)
    	ld	a,(high)
    	or	a
    	sbc	hl,de
    	sbc	a,0
    	ld	(low),hl
    	ld	(high),a
    .gtm01
    оптимизацию по скорости может кто предложить?
    выровнять Tabl на параграф не предлагать

  3. #1043

    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,101
    Спасибо Благодарностей отдано 
    1,335
    Спасибо Благодарностей получено 
    322
    Поблагодарили
    151 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вместо длинного вычисление множителя через таблицу, не подойдёт-ли чтонибудь простое, вроде CPL или NEG?

    Умножать MED однобайтово, а LOW вообще не умножать.

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

    (Number)=(Number)-(Number)*c/#10000
    изменить так:
    (Number)=(Number)-(Number)*#100/#10000+(Number)*nn/#10000
    то есть вернуться обратно к nn

  4. #1044

    Регистрация
    05.09.2007
    Адрес
    Орск
    Сообщений
    1,071
    Спасибо Благодарностей отдано 
    269
    Спасибо Благодарностей получено 
    1,245
    Поблагодарили
    370 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Reobne Посмотреть сообщение
    Вместо длинного вычисление множителя через таблицу, не подойдёт-ли чтонибудь простое, вроде CPL или NEG?
    не вариант.
    на входе A=[+/0..#F]
    таблица #00,#01,#03,#05,#09,#0D,#12,#19,#20,#29,#33,#3D,#4 9,#55,#63,#71
    Цитата Сообщение от Reobne Посмотреть сообщение
    Умножать MED однобайтово, а LOW вообще не умножать.
    погрешность слишком большая будет набегать

  5. #1045

    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,101
    Спасибо Благодарностей отдано 
    1,335
    Спасибо Благодарностей получено 
    322
    Поблагодарили
    151 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от LW Посмотреть сообщение
    погрешность слишком большая будет набегать
    А погрешность проанализировать, возможно её можно как-то по простому компенсировать.

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

    Цитата Сообщение от LW Посмотреть сообщение
    таблица #00,#01,#03,#05,#09,#0D,#12,#19,#20,#29,#33,#3D,#4 9,#55,#63,#71
    Да это же практически (x^2+1)>>1. Таблица квадратов есть. Может можно как нибудь приспособить?

    Этот пользователь поблагодарил Reobne за это полезное сообщение:

    LW(17.12.2021)

  6. #1046

    Регистрация
    05.09.2007
    Адрес
    Орск
    Сообщений
    1,071
    Спасибо Благодарностей отдано 
    269
    Спасибо Благодарностей получено 
    1,245
    Поблагодарили
    370 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вы полагаете расчет, даже с использование таблицы квадратов, будет быстрее табличной выборки?

  7. #1047

    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,101
    Спасибо Благодарностей отдано 
    1,335
    Спасибо Благодарностей получено 
    322
    Поблагодарили
    151 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Да, предполагал, что если TableSqr выравнена, а Tabl не выровнена, то такое возможно. Но раз нет, то нет.

  8. #1048

    Регистрация
    05.09.2007
    Адрес
    Орск
    Сообщений
    1,071
    Спасибо Благодарностей отдано 
    269
    Спасибо Благодарностей получено 
    1,245
    Поблагодарили
    370 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Хотя вариант имеет право на жизнь

  9. #1049

    Регистрация
    18.07.2021
    Адрес
    г. Хмельницкий, Украина
    Сообщений
    105
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    33
    Поблагодарили
    25 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от GriV Посмотреть сообщение
    Есть такие замечательные команды как adc и sbc - используют флаг CY

    Например типовая задача уменьшить значение аккумулятора не менее какого то (например 23).
    обычно делают:
    dec a
    cp 23
    jr nc,$+3
    inc a
    а можно вот так аккуратно:
    sub 23
    adc a,22
    работает много элегантнее и что очень важно имеет всегда одну и ту же длительность (что особенно интересно демописателям где каждый раз приходиться пересчитывать такты).
    Или обратная задача - увеличить значение но не более какого то (например 75)
    В этом случае делаем так:
    add a,-75
    sbc a,-1-75
    В этом случае выше 75 ну никак не поднимется с теми же преимуществами.
    Прошло всего-то 14 лет - а кто-то проверял, как это работает? Я проверил (понадобилось). Немного не так работает, как заявлено.

    Код:
    ld a, 23
    sub 23
    adc a, 22
    оставляет в А значение 22, хотя должно быть 23.
    То есть, формула должна быть:

    sub x+1
    adc a, x

    а не

    sub x
    adc a, x-1


    К этому:
    Код:
    add a,-75
    sbc a,-1-75
    претензий нет.
    Последний раз редактировалось 0xDEAD; 08.06.2022 в 19:33.

  10. #1050

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

    По умолчанию

    Цитата Сообщение от 0xDEAD Посмотреть сообщение
    sub x+1
    adc a, x
    При этом
    1. Если исходно Aисх>x, то на выходе A=Aисх-1
    2. Если исходно x>=Aисх>=0, то на выходе A=Aисх

Страница 105 из 113 ПерваяПервая ... 101102103104105106107108109 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Этюды: как бы написать поизящнее.
    от AndTorp в разделе Программирование
    Ответов: 5
    Последнее: 17.03.2008, 00:43
  2. Ответов: 0
    Последнее: 18.08.2006, 22:40
  3. Этюды: печать шрифтом 5x5...
    от breeze в разделе Программирование
    Ответов: 12
    Последнее: 27.03.2005, 05:21

Метки этой темы

Ваши права

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