Author Topic: plotting in masm 32 bit  (Read 3873 times)

jj2007

  • Member
  • *****
  • Posts: 8734
  • Assembler is fun ;-)
    • MasmBasic
Re: plotting in masm 32 bit
« Reply #30 on: March 10, 2018, 04:29:22 AM »
Hi Mark,
you are almost there:
Code: [Select]
include \masm32\MasmBasic\Res\MbGui.asm
.data
plotpoints   REAL4  1.1,2.2,3.0,4.0,5.5 ; OPT_Assembler uasm32
.code
  Dim MySinus() As REAL4        ; prepare an array for being plotted (real4 or real8)
  For_ ecx=0 To 4
        fld  plotpoints[4*ecx]
        SetFloat MySinus(ecx)=ST(0)
  Next
Event Paint
  ArrayPlot RgbCol(192, 222, 255)               ; init & set background
  ArrayPlot MySinus(), 0, lines=2               ; draw the array with 2px lines
  ArrayPlot exit, "Playing with Sinus() plots"  ; finish with a title
EndOfCode

This puts plotpoints in the .data section and uses ecx as a counter, so that plotpoints[4*ecx] can be used. Works fine  :biggrin:
I modified two values to avoid a straight line ;-)

P.S.: Here is a variant using StringToArray:

include \masm32\MasmBasic\Res\MbGui.asm

  Dim MyR4() As REAL4
  StringToArray FileRead$("MyData.tab"), MyR4()

Event Paint
  ArrayPlot RgbCol(192, 222, 255)                      ; init & set background
  ArrayPlot MyR4(), RgbCol(255, 0, 0), lines=2         ; draw the array with 2px lines
  ArrayPlot exit, "Data read from a tab file"          ; finish with a title
EndOfCode


Sample file attached, must be in the same folder as the exe.

markallyn

  • Member
  • **
  • Posts: 192
Re: plotting in masm 32 bit
« Reply #31 on: March 10, 2018, 08:24:24 AM »
Good evening, JJ,

Once again, I would never have come up with this solution.  But, I see now how it works.

Question: In your original post you referred to a sinus() function.  I assume this is a built-in in masmbasic.  If so, where can I find a list of others, for example, exp, tan, sqrt,, etc.

Regards,
Mark

markallyn

  • Member
  • **
  • Posts: 192
Re: plotting in masm 32 bit
« Reply #32 on: March 10, 2018, 08:32:48 AM »
Good evening once more,

You may disregard my question re masmbasic functions.  I found them by looking through masmbasic.inc.  It isn't really convenient, but it works.

Thanks again,
Mark

jj2007

  • Member
  • *****
  • Posts: 8734
  • Assembler is fun ;-)
    • MasmBasic
Re: plotting in masm 32 bit
« Reply #33 on: March 10, 2018, 10:21:09 AM »
I found them by looking through masmbasic.inc

In the RichMasm menu File, there is "Guide to MasmBasic", listing about 400 functions. Press Ctrl F to search, for example, Exp
But MasmBasic is relatively weak on math; you will still need to know the FPU and roll your own.

HSE

  • Member
  • ****
  • Posts: 805
  • <AMD>< 7-32>
Re: plotting in masm 32 bit
« Reply #34 on: March 11, 2018, 01:45:35 AM »
where can I find a list of others, for example, exp, tan, sqrt,, etc.

qWord's SmplMath  :t

dedndave

  • Member
  • *****
  • Posts: 8808
  • Still using Abacus 2.0
    • DednDave
Re: plotting in masm 32 bit
« Reply #35 on: March 12, 2018, 01:14:07 PM »
the deBoorBezierSpline function wants to see an array of POINT structures
the values for each point are related to pixel locations in the window where the graph is to be drawn

the array is constructed of "knot points" and "control points"
the knot points are essentially your data points, converted into pixel locations
so, you create the array, then fill in the knot points, and pass the address to deBoorBezierSpline
you also tell the function the number of knot points in the array (must be at least 3)
the function will fill in the control points for you
when it's done, the array is suitable for use with the PolyBezier function (used in WM_PAINT code)

the total number of POINT structures in the array is Knots + 2 * (Knots - 1)

Code: [Select]
knot point
control point
control point
knot point
control point
control point
knot point
.
.
.
knot point
control point
control point
knot point

as i mentioned earlier, YOU initialize the knot points - the function fills in the control points for you

dedndave

  • Member
  • *****
  • Posts: 8808
  • Still using Abacus 2.0
    • DednDave
Re: plotting in masm 32 bit
« Reply #36 on: March 12, 2018, 02:01:48 PM »
... in the demo program, i used an array with 36 knot points
so, there are 2*(36-1) = 70 control points
a total of 106 POINT structures in the array

i make up fake data by using a random number generator
the X step is always 10 pixels and the Y points are generated randomly
equal X spacing is not a requirement, it was just easy to generate that way

i used 2 arrays, one to hold the currently displayed array, one to generate new data
i flip back and forth between the 2 arrays

markallyn

  • Member
  • **
  • Posts: 192
Re: plotting in masm 32 bit
« Reply #37 on: March 13, 2018, 07:26:04 AM »
Dave and JJ,

I had to briefly abandon the plot problem due to traveling.  I'm back home now and will resume its solution--thanks to all of your help.

I will post a .zip file that contains a set of plot points that are the solution of a simple ordinary diff eqn.  This will give you a typical data set from the sort of math problems I enjoy solving.  In the past I have used C and called GnuScientificLibrary routines or Octave or similar.  I want to do the same thing in assembly.

Thanks.  Please keep tuned to this thread.

Regards,
Mark

jj2007

  • Member
  • *****
  • Posts: 8734
  • Assembler is fun ;-)
    • MasmBasic
Re: plotting in masm 32 bit
« Reply #38 on: March 13, 2018, 11:20:12 AM »
I will post a .zip file that contains a set of plot points that are the solution of a simple ordinary diff eqn.  This will give you a typical data set

Very good. If you want to try yourself, see reply #30:
Code: [Select]
  Dim MySinus() As REAL4        ; prepare an array for being plotted (real4 or real8)
  For_ ecx=0 To 4
        fld plotpoints[4*ecx]    ; <<<< replace with whatever produces your values.
        SetFloat MySinus(ecx)=ST(0)   ; this pops the value from ST(0) to the array
  Next

AW

  • Member
  • *****
  • Posts: 1482
  • Let's Make ASM Great Again!
Re: plotting in masm 32 bit
« Reply #39 on: March 13, 2018, 04:15:31 PM »
This may sound like a sacrilege but there pretty good online 2-D plotters. At least as good as others I have seen around here.
http://itools.subhashbose.com/grapher/index.php

markallyn

  • Member
  • **
  • Posts: 192
Re: plotting in masm 32 bit
« Reply #40 on: March 14, 2018, 06:05:03 AM »
Hello JJ and others, most recently aw27:

Apologies for being a little late to the party with a test data set:  rk4.zip contains values of time from 0 to 1 for the solution to dy/dt=1-2*y(2).  Y0 is 1.0.  A very simple function solved using 4th order runge-kutta technique.

First column of doubles is clearly t and second is y(t).

Thanks for all your inputs.

I'll check out the 2-D plotter mentioned by aw27.

Regards,
Mark

markallyn

  • Member
  • **
  • Posts: 192
Re: plotting in masm 32 bit
« Reply #41 on: March 14, 2018, 06:06:48 AM »
...OOPs.

Equation should read: 

Quote
dy/dt=1-2*y(t)

Lousy at typos!

Mark

dedndave

  • Member
  • *****
  • Posts: 8808
  • Still using Abacus 2.0
    • DednDave
Re: plotting in masm 32 bit
« Reply #42 on: March 14, 2018, 06:45:51 AM »
i am currently working on a simplified form of the PolyBezier demo program
it is for a single static graph - you enter data points and assemble
i am adding a little complexity in that, when you re-size the window, it re-scales the graph
should finish it later today or tomorrow
i will use your data set  :t

jj2007

  • Member
  • *****
  • Posts: 8734
  • Assembler is fun ;-)
    • MasmBasic
Re: plotting in masm 32 bit
« Reply #43 on: March 14, 2018, 08:47:51 AM »
test data set:  rk4.zip contains values of time from 0 to 1 for the solution to dy/dt=1-2*y(2).  Y0 is 1.0

include \masm32\MasmBasic\Res\MbGui.asm
  Dim rk() As REAL4             ; define a REAL4 array
  StringToArray 99, rk()        ; fill it; 99 is the resource ID for rk4.txt
Event Paint
  ArrayPlot RgbCol(192, 255, 255)                      ; init & set background
  ArrayPlot rk(XY), RgbCol(222, 0, 0), lines=2         ; draw the array with 2px red lines
  ArrayPlot exit, "Data read from a resource"          ; finish with a title
EndOfCode


Does it look correct? Project attached - to build it, rk4.txt must be in the same folder.

markallyn

  • Member
  • **
  • Posts: 192
Re: plotting in masm 32 bit
« Reply #44 on: March 14, 2018, 09:07:30 AM »
JJ, Dave, and aw27,

aw27:  Yes, there are a number of excellent 2-d plotters available.  Gnuplot is one, and it's excellent and opensource, but there are many others too.  What I am trying to accomplish is to write in assembly (masm, uasm, Jwasm, goasm, poasm,nasm,  etc.) a numerical integrator that can call a plotter written also in assembly.  Why?  I could write a c/c++ program, write results to a file, and then call a plotter.  It would be much easier, but not nearly as much fun or as instructive.

Dave:  Great news.  Go for it!

JJ:  Yup.  That's it!  Subsequent to the posting I ran the integrator again and generated plot points out to 2.0.  It clearly shows that the function asymptotes at 0.5.  Now, here's my challenge:  How to put labeled axes and tick marks on the plot.  Can it be done?

Regards,
Mark