У меня вопрос скорее по Z80, чем по Спектруму. Но предположил, что лучших знатоков z80 скорее можно встретить только тут.
Недавно на pouet было выложено интро для БК, размером 242 байта, которое шустро строит Мандельброты - https://www.pouet.net/prod.php?which=87739
Решил портануть этот код на Амстрад. Получилось почти 500 байт и процентов на 60% медленнее, чем БК0010. На Спек не получится, так как интро использует весь экран БК, реализуя 128х256 графику с 2х1 текстурами. Для Амстрада сделал два кода. Аналогичный с текстурами и с 16 цветами. Oбращение к видеопамяти на Амстраде существенно сложнее и поэтому несколько тормознее, чем на многих других платформах. Но главный тормоз не здесь, а в самом алгоритме расчета Мандельброта. На БК главный цикл занимает 14 строк
Код:
1$:
mov sqr(r1), r3 ; r3 = y^2
add r0, r1 ; r1 = x+y
mov sqr(r0), r0 ; r0 = x^2
add r3, r0 ; r0 = x^2+y^2
cmp r0, r6 ; if r0 >= 4.0 then
bge 2$ ; overflow
mov sqr(r1), r1 ; r1 = (x+y)^2
sub r0, r1 ; r1 = (x+y)^2-x^2-y^2 = 2*x*y
add r5, r1 ; r1 = 2*x*y+b, updated y
sub r3, r0 ; r0 = x^2
sub r3, r0 ; r0 = x^2-y^2
add r4, r0 ; r0 = x^2-y^2+a, updated x
sob r2, 1$ ; to next iteration
Для Z80 у меня получилось кода заметно больше
Код:
loc1:
r1 equ $+1
ld hl,0
ld a,l
and $fe
ld l,a
ld a,high(sqrbase)
add a,h
ld h,a
ld a,(hl)
inc l
ld h,(hl)
ld l,a
ex de,hl ;de = r3 = sqr[r1&0xfffe]
pop bc ;r0
ld hl,(r1)
add hl,bc
ld (r1),hl ;r1 += r0
ld h,b
ld a,c
and $fe
ld l,a
ld a,high(sqrbase)
add a,h
ld h,a
ld a,(hl)
inc l
ld h,(hl)
ld l,a ;r0 = sqr[r0&0xfffe]
add hl,de
push hl ;r0 += r3
ld a,h
cp 8
jr nc,loc2
ld hl,(r1)
ld a,high(sqrbase)
add a,h
ld h,a
ld a,l
and $fe ;sets C=0
ld l,a
ld a,(hl)
inc l
ld h,(hl)
ld l,a ;r1 = sqr[r1&0xfffe]
pop bc ;r0
push bc
sbc hl,bc ;C=0
r5 equ $+1
ld bc,0
add hl,bc
ld (r1),hl
pop hl
r4 equ $+1
ld bc,0
add hl,bc ;r0 += r4
sbc hl,de ;r0 -= r3
sbc hl,de
push hl ;r0 -= r3
ld hl,tniter
dec (hl) ;r2
jr nz,loc1
На 8-битных вычислениях Спек обычно несколько быстрее БК. Но на интенсивных 16-битных расчётах БК похоже заметно быстрее при гораздо лучшей компактности кода. Могу ещё предположить, что на таких расчётах 6502 будет выглядеть совсем бледно. Буду очень признателен, если кто-нибудь найдет способ сделать главный цикл расчёта Мандельброта быстрее и/или компактнее.
В архиве исходники и бинарники для Амстрада. В эмуляторе запуск через RUN"M4 или RUN"M16 