проще подготовить 6 фаз и кидать на экран по очереди.
Вид для печати
ну да.
Попалось мне быстрое умножение:
вот только я никак не соображу, как реализовать это.Код: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
Засунул генерилку таблицы gen_table в ужасм и потестил, и вот что-то она мне возвращает таблицу длиной 96 чисел только вместо 256 ( а стоп, надо просто tb_xx задать началом параграфа, типа $c000 ))
Наткнулся на вот такое:
Retro Programming: Plotting the Mandelbrot Set on the ZX Spectrum
это достойно, я считаю.
denpopov, AAA, AloneCoder делал фрактальчик атрибутный