JJ, I was going to answer, but Timo did it 1st

Anyway, here is attached the converted routines of caballero in asm listing using

https://godbolt.org, online compiler. It won´t assemble in ml.exe, but it can be converted to masm by hand :) (The logic is not hard to understand when reading the code flow from godbolt) - Or... you can do the same with Timo using Ollydbg

Routines converted:

`#include <math.h>`

#define cdXPos 128

#define cdYPos 128

#define cdXSize 960

#define cdYSize 600

#define cdColFondo 0 // COLOR_BTNFACE + 1

#define cdVBarTipo 0

#define cdVBtnTipo WS_VISIBLE+WS_SYSMENU+WS_MINIMIZEBOX

#define cdMainIcon 100

#define cdIdTimer 1

#define cdDosPI 6.283185307179586476925286766559

#define cdFSize 140

#define PI128 0.02454369260617025967548940143187

int waves[4][2];

double sins1[360*6], sins2[360*6], sins3[360*6], sins4[360*6];

double coss1[360*6], coss2[360*6], coss3[360*6], coss4[360*6];

int f = 0, s1off = 0, s2off = 0, s3off = 0;

int c1off = 0, c2off = 0, c3off = 0, coloff = 0;

int hLogoDIB = 0;

int *pMainDIB = 0, *pLogoDIB = 0;

unsigned char mtImagen[cdXSize*cdYSize], mtLogo [cdXSize*cdYSize];

struct stPaleta {

unsigned char Azul;

unsigned char Verde;

unsigned char Rojo;

unsigned char Alfa;

} miPaleta[256];

void CreaImagen (void) {

int i;

for (i = 0; i < cdXSize*cdYSize; i++)

mtImagen[i] = (unsigned char) *(pLogoDIB+i);

}

void pal (int col, int r, int g, int b) {

miPaleta[col].Rojo = r; miPaleta[col].Verde = g; miPaleta[col].Azul = b;

}

void grad (int col1, double r1, double g1, double b1,

int col2, double r2, double g2, double b2) {

int col, cols;

cols = col2 - col1 + 1;

double rstep, gstep, bstep, r, g, b;

rstep = (double) ((r2 - r1 + 1) / cols);

gstep = (double) ((g2 - g1 + 1) / cols);

bstep = (double) ((b2 - b1 + 1) / cols);

r = r1;

g = g1;

b = b1;

for (col = col1; col <= col2; col++) {

r += rstep;

g += gstep;

b += bstep;

if (r > 255) r = 255;

if (r < 0 ) r = 0 ;

if (g > 255) g = 255;

if (g < 0 ) g = 0 ;

if (b > 255) b = 255;

if (b < 0 ) b = 0 ;

pal (col, (int)r, (int)g, (int)b);

}

}

void makePlasma (void) {

int i, r, g, b, r1, g1, b1, r2, g2, b2;

r1 = r = rand()&255; g1 = g = rand()&255; b1 = b = rand()&255;

for (i = 0; i <= 3; i++) {

r2 = rand()&255; g2 = rand()&255; b2 = rand()&255;

grad (64 * i, r, g, b, 64 * i + 63, r2, g2, b2);

r = r2; g = g2; b = b2;

}

grad (64 * 3, r, g, b, 255, r1, g1, b1);

for (i = 0; i < 3; i++) {

waves[i][0] = rand()&255;

waves[i][1] = 360 + rand()%180;

}

for (i = 0; i <= 360*6; i++) {

sins1[i] = (double) ((double) waves[0][0] * sin((double) i / waves[0][1] * cdDosPI));

sins2[i] = (double) ((double) waves[1][0] * sin((double) i / waves[1][1] * cdDosPI));

sins3[i] = (double) ((double) waves[2][0] * sin((double) i / waves[2][1] * cdDosPI));

coss1[i] = (double) ((double) waves[0][0] * cos((double) i / waves[0][1] * cdDosPI));

coss2[i] = (double) ((double) waves[1][0] * cos((double) i / waves[1][1] * cdDosPI));

coss3[i] = (double) ((double) waves[2][0] * cos((double) i / waves[2][1] * cdDosPI));

}

}

void doPlasma (void) {

int x, y, p, m;

double cy;

s1off = (s1off + 1) % waves[0][1];

c1off = (c1off + 3) % waves[0][1];

s2off = (s2off + 3) % waves[1][1];

c2off = (c2off + 2) % waves[1][1];

s3off = (s3off + 2) % waves[2][1];

c3off = (c3off + 1) % waves[2][1];

coloff = (coloff + 1) & 255;

p = 0;

for (y = 160; y < cdYSize; y++) {

cy = coloff + coss1[y + c1off] + sins2[y + s2off] + sins3[y + s3off];

for (x = 0; x < cdXSize; x++) {

if (mtImagen[p]!=0) {

m = ((int) (cy + sins1[x + s1off] + coss2[x + c2off] + coss3[x + y + c3off]))&255;

*(pMainDIB + p) = (miPaleta[m].Rojo<<16)|(miPaleta[m].Verde<<8)|miPaleta[m].Azul;

}

p ++;

}

}

}

If you want to read from a browser, simply paste those C code in

https://godbolt.org and select

*(X86 msvc v 19.10 - WINE)*