Log inRegister an accountBrowse CSDbHelp & documentationFacts & StatisticsThe forumsAvailable RSS-feeds on CSDbSupport CSDb Commodore 64 Scene Database
You are not logged in - nap
CSDb User Forums


Forums > C64 Coding > Simple bilinear interpolation in assembler
2018-05-08 16:24
ws

Registered: Apr 2012
Posts: 251
Simple bilinear interpolation in assembler

Hello,

for some reason, with increasing age, i am no longer interested in spending much time on re-inventing the wheel.

Therefore, i'd like to ask if any of you wizards perhaps know of a close solution to this problem:

Lets say you have a "heatmap" in a matrix of 20x10 cells.

Does anyone perhaps already have a fast and simple routine for interpolating all the values within these cells, so that when you have some cells with very high values and some cells with very low values, that more or less smooth transitions (image blur) can be achieved in very few rasterlines?

Google just spat out hardcore math for me, which i feel unable to wrap my head around, when attempted to translate to a c64 assembler solution. (I code in assembly, directly, no c++ or the like, pretty please).

best regards
WS
 
... 24 posts hidden. Click here to view all posts....
 
2018-05-19 08:03
ChristopherJam

Registered: Aug 2004
Posts: 1409
Quoting wertstahl
ps: if anyone hints me towards formatting source code nicely in this csdb thing, i will happily comply.

Just follow the Read more link on the comment entry form.

But in short, wrap your code segments in [ code]/[ /code] (only without the spaces after the "["s)
2018-06-09 00:39
ws

Registered: Apr 2012
Posts: 251

;-------------------------------------------------

linenums    = #$05
linecount   byte $05 ;(+1)

blur        lda  linenums  ;---
            sta  linecount ;---

            ldx #$00

do_blurX    ldy #$26

x_blurX     lda $0400+1,x
            lsr
            lsr
            lsr
            sta pot

            lda $0400-1,x
            lsr
            lsr
            lsr
            clc
            adc pot
            sta pot

            lda $0400,x
            lsr
            clc
            adc pot
            bcc noclip
            lda #$ff
noclip      sta $0400,x

            inx

            dey
            bne x_blurX

            inx ;---
            inx ;--- these and this mechanism is 
                ;--- just there to provide a visual gap
                ;--- ofcourse the scanning could be seamless 

            dec linecount ;---
            bne do_blurX  ;---

            rts

            ;================

pot         byte $0



needs deeper thought, but it works, horizontally, though.
2018-06-09 11:04
Digger

Registered: Mar 2005
Posts: 437
.prg would be good :)
2018-06-09 11:12
Rastah Bar
Account closed

Registered: Oct 2012
Posts: 336
I can see some optimizations. For example, you can get rid of 2 LSRs by first adding ($0401,x)/2 and ($3ff,x)/2 and dividing the result by 4.


lda $401,x
lsr
sta pot
lda $03ff,x
lsr
clc
adc pot
lsr
lsr
sta pot

Also, does it ever clip? ($400,x)/2 <= 128 and ($3ff,x)/8+($401,x)/8 <= 64, so their sum will not exceed 192.

And I would use a ZP address for pot.
2018-06-09 15:38
Sparta

Registered: Feb 2017
Posts: 49
(clc)
lda 03ff,x
adc 0401,x
ror
adc 0400,x
ror
sta 0400,x
adc 0402,x
ror
adc 0401,x
ror
sta 0401,x


Ps. Check out my fire effect in Tunnel Vision.
Edit. If unrolled, you can omit ,x indexing.
2018-06-09 16:39
ws

Registered: Apr 2012
Posts: 251
sparta, that looks very sleek. i was afraid that something like that, which i do not fully understand, might work. how did you come up with this solution?
2018-06-09 16:54
Sparta

Registered: Feb 2017
Posts: 49
Many many years of code optimization. :))

(JK, I am just a hobby coder)

Actually, I used something similar in my fire effect in Tunnel Vision. Except, I did not have enough memory to fully unroll the loop and I also modified the result using a cosine tab. In the fire effect, the 3rd addition comes from the char line below. Something like this:

0400=(((03ff+0401)/2)+0428)/2

When you add to 8-bit numbers, the result will be a 9-bit number with 1-8th bits in AR and the 9th bit in C. ROR will divide this 9-bit number by 2, rolling the C in AR. This will also modify C again, however, CLC can be safely omitted in most of the cases, because the difference in your result is <=1, and the next ROR will half that, too.
2018-06-09 16:54
ws

Registered: Apr 2012
Posts: 251


although the rol solution (above) also has this effect of smearing things into one direction, which i am currently trying to suppress so i can do everything in one go, using lookup tables: (having some brightness trouble currently, though)



way less easy than i thought.

(both images show a 4x3 cross and a 3x3 square blurred)


Oh! Thank you for your explanation Sparta! Much appreciated!
2018-06-09 16:59
Sparta

Registered: Feb 2017
Posts: 49
Double buffering will avoid the skew as you will not overwrite your original values.

Also, keep in mind the above solution is not a true average of the 3 values:

b=(a+2b+c)/4
2018-06-09 17:00
ws

Registered: Apr 2012
Posts: 251
And, because i didnt yet say what this is for: it is for a battle tactics ki precalculation. Now i said it.
Previous - 1 | 2 | 3 | 4 - Next
RefreshSubscribe to this thread:

You need to be logged in to post in the forum.

Search the forum:
Search   for   in  
All times are CET.
Search CSDb
Advanced
Users Online
Freeze/Blazon
Walt/Bonzai
Peacemaker/CENSOR/Hi..
Steffan/BOOM!
Perplex/Offence
Martin Piper
RS-232
Chesser/Blazon
Airwolf/F4CG
Guests online: 108
Top Demos
1 Next Level  (9.7)
2 13:37  (9.7)
3 Mojo  (9.7)
4 Coma Light 13  (9.6)
5 Edge of Disgrace  (9.6)
6 What Is The Matrix 2  (9.6)
7 The Demo Coder  (9.6)
8 Uncensored  (9.6)
9 Comaland 100%  (9.6)
10 Wonderland XIV  (9.6)
Top onefile Demos
1 Layers  (9.6)
2 No Listen  (9.6)
3 Cubic Dream  (9.6)
4 Party Elk 2  (9.6)
5 Copper Booze  (9.6)
6 Dawnfall V1.1  (9.5)
7 Rainbow Connection  (9.5)
8 Onscreen 5k  (9.5)
9 Morph  (9.5)
10 Libertongo  (9.5)
Top Groups
1 Performers  (9.3)
2 Booze Design  (9.3)
3 Oxyron  (9.3)
4 Triad  (9.3)
5 Censor Design  (9.3)
Top Fullscreen Graphicians
1 Joe  (9.7)
2 Sulevi  (9.6)
3 The Sarge  (9.6)
4 Veto  (9.6)
5 Facet  (9.6)

Home - Disclaimer
Copyright © No Name 2001-2024
Page generated in: 0.047 sec.