| | 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.... |
| | Oswald
Registered: Apr 2002 Posts: 5086 |
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: 504 |
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 |
| | Bitbreaker
Registered: Oct 2002 Posts: 504 |
ldx #0 ;top = 0
loop_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
bmi exit_fractal_line
subdiv_fractal_line
lsr ;ed = dx/4
asr #$fe
sta edge_displacement
lda sx2,x ;sx2 = int((sx1+sx2)/2)
sta sx2+1,x ;use it to copy to top+1
adc sx1,x
asr #$fe
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
adc sy1,x
asr #$fe
sta sy2,x
lda st2,x ;st2 = st1+st2
sta st2+1,x ;use it to copy to top+1
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
;maybe can be omitted if previous addition does never overrun?
clc ;sy2 += ed
adc edge_displacement
sta sy2,x
jmp cont1
n_equal_1
lda sy2,x ;n == 1
sec ;sy2 -= ed
sbc edge_displacement
sta sy2,x
sta sy1+1,x
inx ;top += 1
bpl loop_fractal_line
bmi exit_fractal_line
@ ;Copy new Y to top+1
lda sy2,x
cont1
sta sy1+1,x
inx ;top += 1
bpl loop_fractal_line
exit_fractal_line
Have not tried it, might be completely broken now, but that are things i see at a first glance to try. I understand that unrolling is not an option in a 16k intro :-) The storing on stack/zp is still an option as it takes two/one cycle off the stores.
You might also want to do more code duplication instead of the jmp cont1 |
| | Heaven Account closed
Registered: Jul 2008 Posts: 102 |
thanks. will have a look later and upload a version with the new "core".
and
sec
sbc sx1,x
bcs @+
eor #$FF
adc #1
I am wondering why I did not use that for ages :D |
| | Heaven Account closed
Registered: Jul 2008 Posts: 102 |
actually it stucks in the fractal loop... need to check why.
maybe as my assembler has no ASR so I looked at Graham's opcode matrix and would say its $4b? |
| | Heaven Account closed
Registered: Jul 2008 Posts: 102 |
Quote: thanks. will have a look later and upload a version with the new "core".
and
sec
sbc sx1,x
bcs @+
eor #$FF
adc #1
I am wondering why I did not use that for ages :D
ok. me getting old... it's mine :D |
| | Heaven Account closed
Registered: Jul 2008 Posts: 102 |
ldx #0 ;top = 0
;we use Xreg as top
loop_fractal_line cpx #0
bmi 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
jmp loop_fractal_line
subdiv_fractal_line lsr ;ed = dx/4
alr #$fe ;c = 0 a div 2
sta edge_displacement
lda sx2,x ;sx2 = int((sx1+sx2)/2)
sta sx2+1,x ;use it to copy to top+1
adc sx1,x
alr #$fe
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
adc sy1,x
alr #$fe
sta sy2,x
lda st2,x ;st2 = st1+st2
sta st2+1,x ;use it to copy to top+1
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
slightly optimised with my new friend ALR #$fe |
| | Bitbreaker
Registered: Oct 2002 Posts: 504 |
you still should get rid of the cpx #0 decision :-) You can do that already on the branches from inx/dex ;-) |
Previous - 1 | 2 | 3 - Next | |