ну да.
Попалось мне быстрое умножение:
вот только я никак не соображу, как реализовать это.Код:Fast multiply: don't blink or you'll miss it. Let f(x) = x^2 / 4. Then a*b = f(a+b) - f(a-b) Thus with a table of squares you can do integer multiplies very quickly. To see an implementation of this algorithm, see C=Hacking.
SoftLight, приятно, что понял, о чем я говорю.
по идее, можно сделать два лукапа:
256 байт - это младший байт x*x/4
256 байт - это старший байт x*x/4
и потом выходит полный трэшак, если реализовать такое быстрое умножение..
а на потом есть еще один интересный алгоритм, на котором я залип![]()
Я тут вспомнил про свою статью для Demo or Die 2000 года
Код:Табличное умножение 8*8 с учетом знака. ------------------------------------------ Умножение производится на основе одной из формул сокращенного умножения,в частности: (a-b)(a+b)=a^2-b^2 Пусть: ┌── │ X=a-b │ Y=a+b └── Решая эту систему уравнений получим: a=(X+Y)/2 b=(Y-X)/2 Тогда произведение X и Y будет определять ся из выражения: X*Y=a^2-b^2=((X+Y)^2 - (Y-X)^2) / 4 Это может выглядеть например так: IMUL_HL=D*E ;---------------------------------- ; IN: H=TB_XX/256 ; D=X[-128,127] ; E=Y[-128,127] ; BC-NoT USED ; OUT:HL=D*E ; A=0 ! ;---------------------------------- imul ;---------------------------------- ld h,tb_xx[ ;---------------------------------- ld a,e sub d ; y-x ld l,a ld a,e ; y add a,d ; x+y ld e,(hl) inc h ld d,(hl) ; (y-x)^2 ld l,a ld a,(hl) dec h ld l,(hl) ld h,a ; (x+y)^2 xor a ;... может кому пригодится? :) sbc hl,de ;---------------------------------- ret min/max=83 tps (без учета RET) Структура таблицы TB_XX (таблица квадратов чисел от -128 до 127) аналогична структуре таблицs описанной в Spectrum Expert#1 - имеет рaзмер 256*16 бит, с учетом знaкa числa. Единственное отличие, в таблице хранятся квадраты чисел/4 Тaблицa оргaнизовaнa следующим образом: млaдшие бaйты лежaт в первом сегменте,a стaршие в следующем (т.е. по смещению 256) Процедура генерации несколько отличается от приведенной в SE#1.(Процедура крайне не оптимизирована, но все же более компактна и быстродейственна) ;gen_table x*x x=(-128;127) ;-------------------------------- gen_xx ld hl,tb_xx ld d,l,e,l ld bc,de lp1 ld (hl),e inc h ld (hl),d dec h ex de,hl inc bc add hl,bc inc bc ex de,hl inc l jp p,lp1 ld de,hl lp2 ld a,(hl) ld (de),a inc d,h ld a,(hl) ld (de),a dec d,h inc e dec l jr nz,lp2 ret ---------------------------- 37b
---------- Post added at 09:48 ---------- Previous post was at 09:31 ----------
Это была вторая часть статьи, а начало статьи было примерно таким.
Код:Вычисление площади треугольника матричным методом ────────────────────────────────────────── (c) raid`00 Пусть A(x1,y1),B(x2,y2),C(x3,y3)-вершины треугольника,площадь которого определяется из выражения: ┌ ┐ │ x1-x3 y1-y3 │ S=+-1/2│ │ (1) │ x2-x3 y2-y3 │ └ ┘ Выражение,находящиеся в правой части уравнения представляет собой определитель второго порядка. Тем, кто еще не знаком с матричной алгеброй (или по каким-то причинам уже успел забыть ;) напомню, что решением уравнения (1), будет выражение: S=+-(1/2)*((x1-x3)*(y2-y3)-(y1-y3)*(x2-x3)) Минус перед 1/2 берется в случаи,когда получившийся определитель имеет отрица тельное значение, в противном случаи плюс. ;---------------------------------- ; IN: H=COORD_TAB[ ; Формат таблицы: ; x1,x2,x3,y1,y2,3:[-128,127] ; OUT: HL-площадь треугольника ; в кв.пикселах :) ;---------------------------------- ld a,(hl):inc l ;* ld b,(hl):inc l ;* ld c,(hl):inc l ;* sub c ;* ld d,a ;* ld a,b ;* sub c ;* ld c,a ;* ld b,(hl):inc l ;* ld a,(hl):inc l ;* ld l,(hl) ;* sub l ;* ld e,a ;* ld a,b ;* sub c ;* ld b,a ;* call IMUL ; см.ниже ld de,bc ld bc,hl call IMUL ld de,bc or a:sbc hl,de inc h dec h jp p,loop1 ex de,hl ld h,a ;обнуляется в IMUL!!! ld l,a or a:sbc hl,de loop1 srl h:rr l ret Возможен случай,когда координаты вершин получаются в результате вычислений, при этом координаты задаются через регис тры. Для этого,участок отмеченный звездоч ками нужно заменить на следующий: ;--------------------------------- ; IN: A-X1 D-Y1 ; B-X2 H-Y2 ; C-X3 L-Y3 ;--------------------------------- sub c ld e,a ld a,b sub c ld c,a ld a,d sub l ld b,a ld a,h sub l ld d,a
Последний раз редактировалось rajdee; 21.04.2014 в 11:38.
Засунул генерилку таблицы gen_table в ужасм и потестил, и вот что-то она мне возвращает таблицу длиной 96 чисел только вместо 256 ( а стоп, надо просто tb_xx задать началом параграфа, типа $c000 ))
Последний раз редактировалось SoftLight; 21.04.2014 в 11:57.
Наткнулся на вот такое:
Retro Programming: Plotting the Mandelbrot Set on the ZX Spectrum
это достойно, я считаю.
denpopov, AAA, AloneCoder делал фрактальчик атрибутный
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)