| |
Heaven Account closed
Registered: Jul 2008 Posts: 102 |
Release id #172238 : Waves 16k
<Post edited by moderator on 11/12-2018 15:33>
ldx #0 ;top = 0
;we use Xreg as top
loop_fractal_line cpx #0
bpl @+ ;if x<0 go to drawing
jmp exit_fractal_line
@ lda sx2,x ;dx = abs(sx2-sx1)
sec
sbc sx1,x
bcs @+
eor #$FF
adc #1
@ cmp #2 ;if dx<2 skip to plot point
bcs subdiv_fractal_line
ldy sx1,x
lda sy1,x
sta heights,y
dex
bne loop_fractal_line
beq loop_fractal_line
subdiv_fractal_line lsr ;ed = dx/4
lsr
sta edge_displacement
lda sx2,x ;sx2 = int((sx1+sx2)/2)
sta sx2+1,x ;use it to copy to top+1
clc
adc sx1,x
lsr
sta sx2,x
sta sx1+1,x ;copy to top+1 also
lda sy2,x ;sy2 = int((sy1+sy2)/2)
sta sy2+1,x ;use it to copy to top+1
clc
adc sy1,x
lsr
sta sy2,x
lda st2,x ;st2 = st1+st2
sta st2+1,x ;use it to copy to top+1
clc
adc st1,x
sta st2,x
sta st1+1,x ;copy to top+1 also
bvs @+ ;if v<>0 skip displacement
bmi n_equal_1
lda sy2,x ;n == 0
clc ;sy2 += ed
adc edge_displacement
sta sy2,x
jmp @+
n_equal_1 lda sy2,x ;n == 1
sec ;sy2 -= ed
sbc edge_displacement
sta sy2,x
@ ;Copy new Y to top+1
lda sy2,x
sta sy1+1,x
inx ;top += 1
jmp loop_fractal_line
exit_fractal_line
|
|
... 18 posts hidden. Click here to view all posts.... |
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
What
Groepaz
said |
| |
iAN CooG
Registered: May 2002 Posts: 3132 |
I edited the 1st post to reformat it with the code tags |
| |
Heaven Account closed
Registered: Jul 2008 Posts: 102 |
@bitbreaker
ah thx. I guess I will revisit the fractal core. :D
btw. if you wonder what ST1 and ST2 is. It's what Carpenter calls "node tag values" and those represent the characteristics of the line (e.h. "mountain" or "cloud" etc).
so... say fractline(0,100,4 to 319,100,4) will be different to fractline(0,100,20 to 319,100,4). Even Tag1 4 and Tag2 5 should be different.
http://old.siggraph.org/publications/rarities/carpenter-1980sup.. |
| |
Heaven Account closed
Registered: Jul 2008 Posts: 102 |
Quote: All the lsr could be replaced with an asr #$fe and thus carry will stay clear and clc can be dropped, and i see even more potential :-) (sta sy2,x being stored and loaded again just on the next step, a comparision would suffice on the abs function, and that would save a sec)
another idea was exchange x reg with y reg as I moved the height array into ZP... just saw in c64debugger that STA height,y is $00xx.... |
| |
Bitbreaker
Registered: Oct 2002 Posts: 499 |
If things happen linearly one could also push bytes to stack instead of storing and read them back with lda $0100,y
Interrupts should not matter, as they add bytes at the bottom end. X gets interesting as index then again as tsx fethes the proper position in stack for indexed reads again. |
| |
Bitbreaker
Registered: Oct 2002 Posts: 499 |
the cpx #0 can also be omitted, as this point is eitehr reached after ldx, dex, inx that all set the minus-flag anyway, also
bne loop_fractal_line
beq loop_fractal_line
can be replaced by a jmp |
| |
Oswald
Registered: Apr 2002 Posts: 5017 |
as far as I understand this is a recursive line routine except at each subdiv step it semi randomly decides if y should be displaced or not, + or -, while displacement value is /2-ed on each subdiv step. |
| |
Heaven Account closed
Registered: Jul 2008 Posts: 102 |
Quote: the cpx #0 can also be omitted, as this point is eitehr reached after ldx, dex, inx that all set the minus-flag anyway, also
bne loop_fractal_line
beq loop_fractal_line
can be replaced by a jmp
the atari version has JMP but I thought that BNE/BEQ combo is faster as 3 cycles vs 2 (assuming no page boundary crossing happened... dont tell me that I do cross :D) |
| |
Bitbreaker
Registered: Oct 2002 Posts: 499 |
jmp takes 3 cycles, a taken branch as well, so your combo takes 3 or 5 cycles and one byte more than a jmp. |
| |
Heaven Account closed
Registered: Jul 2008 Posts: 102 |
Quote: jmp takes 3 cycles, a taken branch as well, so your combo takes 3 or 5 cycles and one byte more than a jmp.
haha... Jez... so I misoptimised it and me thought I am clever :D |
Previous - 1 | 2 | 3 | 4 - Next |