changeset 7:c848a6133cfc

Fix many calculations (divisions) that assume integer variable division semantics by truncating to int(). Also add two helper functions chop2(v) and chop8(v) and use them where appropriate.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 03 Jul 2018 22:17:48 +0300
parents 07ddf9cfc6c2
children f97ee354db2a
files Interface.pde draw_inputs.pde draw_outputs.pde draw_smart.pde events.pde exporters.pde multipaint.pde
diffstat 7 files changed, 183 insertions(+), 215 deletions(-) [+]
line wrap: on
line diff
--- a/Interface.pde	Tue Jul 03 21:27:18 2018 +0300
+++ b/Interface.pde	Tue Jul 03 22:17:48 2018 +0300
@@ -368,12 +368,11 @@
             g = g >> 8;
             b = s & 0x000000ff;
             g = g + 64;
-            r = r * 2;
-            g = g * 2;
-            b = b * 2;
-            r = r / 3;
-            g = g / 3;
-            b = b / 3;
+
+            r = int((r * 2) / 3);
+            g = int((g * 2) / 3);
+            b = int((b * 2) / 3);
+
             pixels[ad + xx] = 0xff000000 + r * 0x10000 + g * 0x100 + b;
         }
         ad = ad + width;
@@ -406,7 +405,8 @@
     //draw one icon
     int ad, cad, xx, yy, pop, far;
     int metal;
-    yy = t / 16;
+
+    yy = int(t / 16);
     xx = t - yy * 16;
     xx = xx * 2;
     yy = yy * 2;
@@ -428,9 +428,11 @@
                 if (g_depressed[t] > 0) metal = 0xff303030;
                 if (t == 56 || t == 9) metal = 0xffa0a0a0;
             }
-            pop = 1;
-            cad = 65536 + (xx + x / 8) + yy * 256 + y * 32;
-            if (int(g_icons[cad]) == 0) pop = 0;
+
+            cad = 65536 + (xx + int(x / 8)) + yy * 256 + y * 32;
+
+            pop = (int(g_icons[cad]) == 0) ? 0 : 1;
+
             if (int(g_icons[ad + x]) == pop) {
                 far = metal;
                 if (mm == 1) far = 0xffffff80;
@@ -453,7 +455,7 @@
     int ad, cad, x, y, xx, yy, far;
     far = 0xff000000;
     t = t - 32;
-    yy = t / 32;
+    yy = int(t / 32);
     xx = t - yy * 32;
     yy = yy + 18;
     for (y = 0; y <= 7; y++) {
@@ -583,8 +585,9 @@
         if (a < X && b < Y) {
             printat(0, 0, str(a));
             printat(4, 0, str(b));
-            printat(0, 1, str(a / 8));
-            printat(4, 1, str(b / 8));
+            printat(0, 1, str(int(a / 8)));
+            printat(4, 1, str(int(b / 8)));
+
             if (tool() == 6 && g_phase == 1) {
                 printat(0, 2, nf(dist(0, 0, a - 1, b - 1), 0, 2));
                 float av = getangel(g_rx2 - g_rx, g_ry2 - g_ry);
@@ -1031,13 +1034,11 @@
     far = 0xff000000;
 
     maxp = g_maxcolors;
-    xonko = 512 / g_maxcolors;
-    xonko = xonko / 2;
-    xonko = xonko * g_uizoom;
+    xonko = int(int(512 / g_maxcolors) / 2) * g_uizoom;
 
     if (g_maxcolors > 32) {
-        maxp = g_maxcolors / 2;
-        xonko = 1024 / g_maxcolors;
+        maxp = int(g_maxcolors / 2);
+        xonko = int(1024 / g_maxcolors);
     }
     if (machine == PLUS4 || machine == PLUS4M) xonko = 15 * g_uizoom;
 
@@ -1106,8 +1107,8 @@
                     e_rect(xloc, yloc + 1, xonko / 8, yhei / 4, far);
                 }
                 if (g_backg == x) {
-                    e_rect(xloc + xonko - xonko / 4, yloc + yhei - 2, xonko / 4, yhei / 4, far);
-                    e_rect(xloc + xonko - xonko / 8, yloc + yhei - 3, xonko / 8, yhei / 4, far);
+                    e_rect(xloc + xonko - xonko / 4, yloc + yhei - 2, int(xonko / 4), int(yhei / 4), far);
+                    e_rect(xloc + xonko - xonko / 8, yloc + yhei - 3, int(xonko / 8), int(yhei / 4), far);
                 }
             }
             if (int(g_map[0]) == x) {
@@ -1121,13 +1122,13 @@
             if (int(g_map[1]) == x) {
                 far = 0xff000000;
                 if (dist(g_r[x], g_g[x], g_b[x], 0, 0, 0) < 1) far = 0xffffffff;
-                e_rect(xloc + xonko / 4, yloc + yhei / 4, xonko / 4, yhei / 4, far);
+                e_rect(xloc + int(xonko / 4), yloc + int(yhei / 4), int(xonko / 4), int(yhei / 4), far);
             }
             if (machine == PLUS4 || machine == PLUS4M) {
                 if (int(g_map[1]) != 255 && int(g_map[2]) == x) {
                     far = 0xff000000;
                     if (dist(g_r[x], g_g[x], g_b[x], 0, 0, 0) < 1) far = 0xffffffff;
-                    e_rect(xloc + xonko - (xonko / 4) * 2, yloc + yhei - (yhei / 4) * 2, xonko / 4, yhei / 4, far);
+                    e_rect(xloc + xonko - int(xonko / 4) * 2, yloc + yhei - int(yhei / 4) * 2, int(xonko / 4), int(yhei / 4), far);
                 }
             }
         }
@@ -1352,7 +1353,7 @@
                     int po, vop;
 
                     for (x = 0; x <= 7; x++) { //pixel columns inside pixel row
-                        vop = x / 2;
+                    vop = int(x / 2);
                         if (g_multic == 0) {
                             if (int(g_map[ad + x]) == 1) {
                                 fari = a;
@@ -1376,8 +1377,7 @@
                         if (g_rubbermode == 1) { // rubberband mode
                             rubx = x;
                             if (g_multic == 1 || g_hzoomer == 2) {
-                                rubx = x / 2;
-                                rubx = rubx * 2;
+                            rubx = chop2(x);
                             }
                             if (fylli() == 1) {
                                 if (xx * 8 + rubx == g_rx || xx * 8 + rubx == g_rx2) {
@@ -1579,23 +1579,21 @@
                 //draw grid
                 //can in principle be non-square
                 if (int(g_data[int('g')]) == 1) {
-                    int lapx;
-                    lapx = (xx * 8) / g_gridx;
-                    lapx = lapx * g_gridx;
+                int lapx = int((xx * 8) / g_gridx) * g_gridx;
                     if (lapx == (xx * 8)) {
                         t_rect(xo * mag + winsux, yo * mag + winsuy, 1, mag, g_rgb[257]);
                         if (g_gridx == 4) {
-                            t_rect(xo * mag + winsux + 4 * psize, yo * mag + winsuy + 1, 1, mag / 2 - 2, g_rgb[257]);
-                            t_rect(xo * mag + winsux + 4 * psize, yo * mag + winsuy + mag - mag / 2 + 2, 1, mag / 2 - 2, g_rgb[257]);
+                        t_rect(xo * mag + winsux + 4 * psize, yo * mag + winsuy + 1, 1, int(mag / 2) - 2, g_rgb[257]);
+                        t_rect(xo * mag + winsux + 4 * psize, yo * mag + winsuy + mag - int(mag / 2) + 2, 1, int(mag / 2) - 2, g_rgb[257]);
                         }
                     }
-                    lapx = (yy * 8) / g_gridy;
-                    lapx = lapx * g_gridy;
+                lapx = int((yy * 8) / g_gridy) * g_gridy;
+
                     if (lapx == (yy * 8)) {
                         t_rect(xo * mag + winsux + 1, yo * mag + winsuy, mag - 1, 1, g_rgb[257]);
                         if (g_gridy == 4) {
-                            t_rect(xo * mag + winsux + 1, yo * mag + winsuy + 4 * psize, mag / 2 - 2, 1, g_rgb[257]);
-                            t_rect(xo * mag + winsux + 2 + mag - mag / 2, yo * mag + winsuy + 4 * psize, mag / 2 - 2, 1, g_rgb[257]);
+                        t_rect(xo * mag + winsux + 1, yo * mag + winsuy + 4 * psize, int(mag / 2) - 2, 1, g_rgb[257]);
+                        t_rect(xo * mag + winsux + 2 + mag - int(mag / 2), yo * mag + winsuy + 4 * psize, int(mag / 2) - 2, 1, g_rgb[257]);
                         }
                     }
                 }
--- a/draw_inputs.pde	Tue Jul 03 21:27:18 2018 +0300
+++ b/draw_inputs.pde	Tue Jul 03 22:17:48 2018 +0300
@@ -28,11 +28,11 @@
 //the "slow" call to mark "dirty block"
 void updatepoint(int xx, int yy) {
     if (yy < 0 || xx < 0 || xx >= X || yy >= Y) return;
-    xx = xx / 8;
-    yy = yy / 8;
-    xx = xx + yy * MX;
-    g_redo[xx] = byte(0); //block update
-    g_remdo[xx] = byte(1); //block update
+    xx = int(xx / 8);
+    yy = int(yy / 8);
+    int ad = xx + yy * MX;
+    g_redo[ad] = byte(0); //block update
+    g_remdo[ad] = byte(1); //block update
 }
 
 int getmultibrush(int x1, int y1) {
@@ -43,7 +43,7 @@
     if (g_multic == 2) return g_brush[1024 + x1 + y1 * X];
 
     ad = 1024 + x1 + y1 * X;
-    looks = 65536 + (x1 / 8) + (y1 / 8) * MX;
+    looks = 65536 + int(x1 / 8) + int(y1 / 8) * MX;
     mmc = g_brush[ad] + g_brush[ad + 1] * 2;
     switch (mmc) {
         case 0:
@@ -71,12 +71,11 @@
         if (mode == 0) return g_map[looks];
         if (mode == 1) return g_brush[looks];
     }
-    x1 = x1 / 2;
-    x1 = x1 * 2;
+    x1 = chop2(x1);
     ad = 1024 + x1 + y1 * X;
     source1 = 0;
     source2 = 0;
-    looks = 65536 + (x1 / 8) + (y1 / 8) * MX;
+    looks = 65536 + int(x1 / 8) + int(y1 / 8) * MX;
     if (mode == 0) {
         source1 = g_map[ad];
         source2 = g_map[ad + 1];
@@ -134,8 +133,8 @@
         if (mode == 0) return getmultic(xx, yy, 0);
         return g_map[1]; // was 0?
     }
-    xx = xx / 8;
-    yv = yy / 8;
+    xx = int(xx / 8);
+    yv = int(yy / 8);
     int ad = 65536 + xx + yy * MX;
     if (mode == 0) {
         val = g_map[ad];
@@ -155,8 +154,7 @@
     int chek;
     val = 0;
     sad = 1024 + xx + yy * X;
-    xx = xx / 8;
-    ad = 65536 + xx + yy * MX;
+    ad = 65536 + int(xx / 8) + yy * MX;
     chek = int(g_map[sad]);
     if (chek == 100 || chek == 200) return chek;
 
@@ -270,10 +268,10 @@
     int horisize;
     int molox = 1;
     if (g_multic == 1) molox = 2;
-    horisize = X / g_animx;
+    horisize = int(X / g_animx);
     g_animno = g_animno + 1;
     if (g_animno > g_animframes) g_animno = 1;
-    by = g_animno / horisize;
+    by = int(g_animno / horisize);
     bx = g_animno - (by * horisize);
     g_bsourcex = bx * g_animx;
     g_bsourcey = by * g_animy;
@@ -293,12 +291,10 @@
     xx = xx + g_raster_offset_x * molox;
     yy = yy + g_raster_offset_y;
     if (g_multic == 1 || g_hzoomer == 2) {
-        xx = xx / 2;
+        xx = int(xx / 2);
     }
-    int mx = xx / 8;
-    int my = yy / 8;
-    mx = mx * 8;
-    my = my * 8;
+    int mx = chop8(xx);
+    int my = chop8(yy);
     xx = xx - mx;
     yy = yy - my;
     return g_fixedraster[xx + yy * 8];
--- a/draw_outputs.pde	Tue Jul 03 21:27:18 2018 +0300
+++ b/draw_outputs.pde	Tue Jul 03 22:17:48 2018 +0300
@@ -1,6 +1,17 @@
 // Collect all that "writes" the virtual image in some way or other
 // plus other active manipulations
 
+int chop2(int v)
+{
+  return int(v / 2) * 2;
+}
+
+int chop8(int v)
+{
+  return int(v / 8) * 8;
+}
+
+
 void createpoint(int x, int y, int mo) {
     if (mo == LEFT) makepoint(x, y);
     if (mo == RIGHT) clearpoint(x, y);
@@ -94,21 +105,19 @@
             if (tempx > g_bsourcex + 16) tempx = g_bsourcex + 16;
             if (tempy > g_bsourcey + 16) tempy = g_bsourcey + 16;
         }
-        midx = (g_bsourcex2 - g_bsourcex) / 2;
-        midy = (g_bsourcey2 - g_bsourcey) / 2;
+        midx = int((g_bsourcex2 - g_bsourcex) / 2);
+        midy = int((g_bsourcey2 - g_bsourcey) / 2);
         if (g_data[int('c')] == 1 || g_shift == true) {
             if (g_data[int('q')] == 1) {
-                midy = midy / g_gridx;
-                midy = midy * g_gridx;
-                midx = midx / g_gridx;
-                midx = midx * g_gridx;
+                // XXX is this g_gridx an error?
+                midy = int(midy / g_gridx) * g_gridx;
+                midx = int(midx / g_gridx) * g_gridx;
             }
         }
         int orient;
         orient = g_data[int('x')] * 100 + g_data[int('y')] * 10 + g_data[int('q')];
         if (g_multic == 1 || g_hzoomer == 2) {
-            x = x / 2;
-            x = x * 2;
+            x = chop2(x);
             molox = 2;
             passes = 1;
         }
@@ -242,10 +251,8 @@
     molox = 1;
     //multicolor 160 pixel reso
     if (g_multic == 1 || g_hzoomer == 2) {
-        xfrom = xfrom / 2;
-        xfrom = xfrom * 2;
-        xto = xto / 2;
-        xto = xto * 2;
+        xfrom = chop2(xfrom);
+        xto = chop2(xto);
     }
 
     craft(xfrom, yfrom, 0);
@@ -255,8 +262,8 @@
     if (prevent == 0) craft(xto, yto, 0);
 
     if (g_multic == 1 || g_hzoomer == 2) {
-        xfrom = xfrom / 2;
-        xto = xto / 2;
+        xfrom = int(xfrom / 2);
+        xto = int(xto / 2);
         molox = 2;
     }
 
@@ -352,7 +359,8 @@
 
 void docircle(int x1, int y1, int x2, int y2) {
     float dds, a, t, sx, sy, gear1, gear2, x0, y0;
-    int kimea, prex, prey;
+    int prex, prey;
+
     dds = dist(x1, y1, x2, y2);
     gear1 = int(dds);
     if (gear1 <= 12) gear1 = 12;
@@ -365,10 +373,6 @@
     if (g_data[int('t')] == 1 && x2 > x1 + 15) x2 = x1 + 16;
     if (g_data[int('t')] == 1 && y2 > y1 + 15) y2 = y1 + 16;
 
-    prex = 0;
-    prey = 0;
-    kimea = y1 - (y2 - y1);
-
     if (g_data[int('f')] == 1 && g_btype != 9) {
         if (g_multic == 1 && g_data[int('d')] == 0) {
             g_farge = g_map[1];
@@ -378,6 +382,8 @@
         docircx(x1, y1, abs(x2 - int(x1)), abs(y2 - int(y1)));
     }
 
+    prex = 0;
+    prey = 0;
     for (t = 0; t <= (gear2); t++) {
         a = t / (gear1) * PI;
         sx = (x2 - x1) * sin(a);
@@ -392,14 +398,10 @@
     int x0, y0, molox;
     int yt, xt;
     int xf, yf;
-    xf = x1 / 8;
-    xf = xf * 8;
-    xt = x2 / 8;
-    xt = xt * 8;
-    yf = y1 / 8;
-    yf = yf * 8;
-    yt = y2 / 8;
-    yt = yt * 8;
+    xf = chop8(x1);
+    xt = chop8(x2);
+    yf = chop8(y1);
+    yt = chop8(y2);
     yt = yt + 7;
     xt = xt + 6;
     molox = 1;
@@ -520,8 +522,7 @@
     }
 
     if (g_multic == 1 || g_hzoomer == 2) {
-        xx = xx / 2;
-        xx = xx * 2;
+        xx = chop2(xx);
     }
 
     if (g_data[int('r')] == 1) { //simple raster
@@ -531,22 +532,20 @@
     if (g_data[int('R')] == 1) { //user defined raster
         if (g_bsourcex2 > g_bsourcex && g_bsourcey2 > g_bsourcey) {
 
-            int x0 = xx / ((g_bsourcex2 + 1) - g_bsourcex);
-            int y0 = yy / ((g_bsourcey2 + 1) - g_bsourcey);
+            int x0 = int(xx / ((g_bsourcex2 + 1) - g_bsourcex));
+            int y0 = int(yy / ((g_bsourcey2 + 1) - g_bsourcey));
             int x1 = xx - x0 * ((g_bsourcex2 + 1) - g_bsourcex);
             int y1 = yy - y0 * ((g_bsourcey2 + 1) - g_bsourcey);
             int xr = g_bsourcex + x1;
             int yr = g_bsourcey + y1;
             if (g_multic == 1 || g_hzoomer == 2) {
-                x0 = xx / ((g_bsourcex2 + 2) - g_bsourcex);
-                y0 = yy / ((g_bsourcey2 + 1) - g_bsourcey);
+                x0 = int(xx / ((g_bsourcex2 + 2) - g_bsourcex));
+                y0 = int(yy / ((g_bsourcey2 + 1) - g_bsourcey));
                 x1 = xx - x0 * ((g_bsourcex2 + 2) - g_bsourcex);
-                x1 = x1 / 2;
-                x1 = x1 * 2;
+                x1 = chop2(x1);
                 y1 = yy - y0 * ((g_bsourcey2 + 1) - g_bsourcey);
                 xr = g_bsourcex + x1;
-                xr = xr / 2;
-                xr = xr * 2;
+                xr = chop2(xr);
                 yr = g_bsourcey + y1;
                 if (getmultic(xr, yr, 1) == g_backg) ignore = 1;
             } else {
@@ -563,11 +562,9 @@
         aba = getattra(xx, yy, 0);
         baba = getattra(xx, yy, 1);
         if (g_multic == 0) {
-            ojox = xx / 8;
-            ojoy = yy / 8;
-            ojox = ojox * 8;
-            ojoy = ojoy * 8;
-            miny = (yy - ojoy);
+            ojox = chop8(xx);
+            ojoy = chop8(yy);
+            miny = yy - ojoy;
             maxy = miny;
             if (g_attrimode == 1) {
                 miny = 0;
@@ -590,15 +587,15 @@
                 ignore = 1;
             }
         }
-        xc = xx / 8;
-        yc = yy / 8;
+        xc = int(xx / 8);
+        yc = int(yy / 8);
         g_redo[xc + yc * MX] = byte(0); //block update
         g_remdo[xc + yc * MX] = byte(1); //block update
     }
 
     if (ignore == 0) {
-        xc = xx / 8;
-        yc = yy / 8;
+        xc = int(xx / 8);
+        yc = int(yy / 8);
         g_redo[xc + yc * MX] = byte(0); //block update
         g_remdo[xc + yc * MX] = byte(1); //block update
 
@@ -614,12 +611,10 @@
                     if (getattra(xx, yy, 1) == fari) {
                         g_map[1024 + xx + yy * X] = byte(0);
                     } else {
-                        int ojox = xx / 8;
-                        int ojoy = yy / 8;
+                        int ojox = chop8(xx);
+                        int ojoy = chop8(yy);
                         int mac, macpre, maxos;
                         int maxoy, miny, maxy;
-                        ojox = ojox * 8;
-                        ojoy = ojoy * 8;
                         mac = 0;
                         macpre = 0;
                         miny = 0;
@@ -680,11 +675,11 @@
                     // X Y mirrors
                     if (g_data[int('t')] == 1) {
                         if (tiler == 0) {
-                            int ex = X / g_gridx;
-                            int ey = Y / g_gridy;
+                            int ex = int(X / g_gridx);
+                            int ey = int(Y / g_gridy);
                             for (int tilx = -ex; tilx <= ex; tilx++) {
                                 for (int tily = -ey; tily <= ey; tily++) {
-                                    makepoint(20000 + xx + (X / ex) * tilx, yy + (Y / ey) * tily);
+                                    makepoint(20000 + xx + int(X / ex) * tilx, yy + int(Y / ey) * tily);
                                 }
                             }
                         }
@@ -708,11 +703,11 @@
                 fars[1] = zeroc;
                 fars[2] = zeroc;
                 fars[3] = zeroc;
-                mex = xx / 8;
-                mey = yy / 8;
+                mex = int(xx / 8);
+                mey = int(yy / 8);
                 looks = 65536 + mex + mey * MX;
-                mex = mex * 8;
-                mey = mey * 8;
+                mex = int(mex * 8);
+                mey = int(mey * 8);
                 int saps = 1024 + mex + mey * X;
 
                 for (metay = 0; metay <= 7; metay++) {
@@ -829,11 +824,11 @@
 
     if (g_data[int('t')] == 1) {
         if (tiler == 0) {
-            int ex = X / g_gridx;
-            int ey = Y / g_gridy;
+            int ex = int(X / g_gridx);
+            int ey = int(Y / g_gridy);
             for (int tilx = -(ex); tilx <= ex; tilx++) {
                 for (int tily = -(ey); tily <= ey; tily++) {
-                    makepoint(20000 + xx + (X / ex) * tilx, yy + (Y / ey) * tily);
+                    makepoint(20000 + xx + int(X / ex) * tilx, yy + int(Y / ey) * tily);
                 }
             }
         }
@@ -856,8 +851,7 @@
         return;
     }
     if (g_multic == 1) {
-        xx = xx / 2;
-        xx = xx * 2;
+        xx = chop2(xx);
     }
     g_farge = g_backg;
     makepoint(xx, yy);
@@ -892,8 +886,7 @@
         return;
     }
     if (g_multic == 1 || g_hzoomer == 2) {
-        xx = xx / 2;
-        xx = xx * 2;
+        xx = chop2(xx);
     }
     if (g_data[int('b')] == 1) return;
     if (g_data[int('r')] == 1) { //raster
@@ -902,8 +895,8 @@
 
     if (g_data[int('R')] == 1) { //user defined raster
         if (g_bsourcex2 > g_bsourcex && g_bsourcey2 > g_bsourcey) {
-            int x0 = xx / ((g_bsourcex2 + 1) - g_bsourcex);
-            int y0 = yy / ((g_bsourcey2 + 1) - g_bsourcey);
+            int x0 = int(xx / ((g_bsourcex2 + 1) - g_bsourcex));
+            int y0 = int(yy / ((g_bsourcey2 + 1) - g_bsourcey));
             int x1 = xx - x0 * ((g_bsourcex2 + 1) - g_bsourcex);
             int y1 = yy - y0 * ((g_bsourcey2 + 1) - g_bsourcey);
             int xr = g_bsourcex + x1;
@@ -915,8 +908,8 @@
     if (ignore == 0) {
         g_map[1024 + xx + yy * X] = byte(0);
         if (g_multic == 1 || g_hzoomer == 2) g_map[1024 + xx + yy * X + 1] = byte(0);
-        int xc = xx / 8;
-        int yc = yy / 8;
+        int xc = int(xx / 8);
+        int yc = int(yy / 8);
         g_redo[xc + yc * MX] = byte(0); //block update
         g_remdo[xc + yc * MX] = byte(1); //block update
     }
@@ -929,9 +922,9 @@
 
 void simplepaint(int xx, int yy, int mode, int attr) {
     int ad, swad, j, miny, maxy, ojyx;
-    xx = xx / 8;
-    ojyx = yy / 8;
-    ojyx = ojyx * 8;
+    xx = int(xx / 8);
+    ojyx = chop8(yy);
+
     ad = 0;
     swad = 0;
     miny = yy - ojyx;
@@ -960,7 +953,7 @@
     }
 }
 
-void do_tool(int x, int y, int mb) {
+void do_tool(int qqx, int qqy, int mb) {
     int tt, ox, oy, psizex, psizey;
     tt = tool();
     psizex = g_magpix[magmode()];
@@ -970,25 +963,26 @@
 
     if (g_data[int('m')] == 0 && g_data[int('M')] == 0) {
         if (g_uizoom == 1) {
-            x = x / 2;
-            y = y / 2;
+            x = int(qqx / 2);
+            y = int(qqy / 2);
         }
         if (g_uizoom == 2) {
-            x = x / 3;
-            y = y / 3;
+            x = int(qqx / 3);
+            y = int(qqy / 3);
         }
         if (g_uizoom == 3) {
-            x = x / 4;
-            y = y / 4;
+            x = int(qqx / 4);
+            y = int(qqy / 4);
         }
+    } else
+    if (g_data[int('m')] == 1 || g_data[int('M')] == 1) {
+        x = int(qqx / psizex) + g_ofx * 8;
+        y = int(qqy / psizey) + g_ofy * 8;
+    } else {
+        x = int(qqx);
+        y = int(qqy);
     }
 
-    if (g_data[int('m')] == 1 || g_data[int('M')] == 1) {
-        x = x / psizex;
-        y = y / psizey;
-        x = x + g_ofx * 8;
-        y = y + g_ofy * 8;
-    }
 
     ox = x;
     oy = y;
@@ -1000,23 +994,19 @@
     //brush handle mid point
     //some tools are exempted
     if (g_btype == 9 && tool() != 4 && tool() != 0 && mb != 255) {
-        midx = (g_bsourcex2 - g_bsourcex) / 2;
-        midy = (g_bsourcey2 - g_bsourcey) / 2;
+        midx = int((g_bsourcex2 - g_bsourcex) / 2);
+        midy = int((g_bsourcey2 - g_bsourcey) / 2);
         x = x - midx;
         y = y - midy;
     }
     if (g_data[int('c')] == 1 || g_shift) {
-        x = x / g_gridx;
-        x = x * g_gridx;
-        y = y / g_gridy;
-        y = y * g_gridy;
+        x = int(x / g_gridx) * g_gridx;
+        y = int(y / g_gridy) * g_gridy;
     }
 
     if (g_multic == 1 || g_hzoomer == 2) {
-        x = x / 2;
-        x = x * 2;
-        ox = ox / 2;
-        ox = ox * 2;
+        x = chop2(x);
+        ox = chop2(ox);
     }
 
     if (mb == 254) { //block picker
@@ -1026,10 +1016,9 @@
         g_data[int('y')] = 0;
         g_data[int('q')] = 0;
         g_data[int('z')] = 0;
-        x = ox / g_gridx;
-        x = x * g_gridx;
-        y = oy / g_gridy;
-        y = y * g_gridy;
+        x = int(ox / g_gridx) * g_gridx;
+        y = int(oy / g_gridy) * g_gridy;
+
         g_bsourcex = x;
         g_bsourcey = y;
         g_bsourcex2 = x + g_gridx - 1;
@@ -1042,16 +1031,14 @@
     if (mb == 255) { // color picker
         if (g_multic == 2) {
             if (g_hzoomer == 2) {
-                ox = ox / 2;
-                ox = ox * 2;
+                ox = chop2(ox);
             }
             selectcolor(0, getmultic(ox, oy, 0));
             return;
         }
         selectcolor(0, getabsa(ox, oy, 0));
         if (g_multic == 1 || g_hzoomer == 2) {
-            ox = ox / 2;
-            ox = ox * 2;
+            ox = chop2(ox);
             selectcolor(0, getattra(ox, oy, 0));
         }
         g_ofarge = g_farge;
@@ -1126,12 +1113,12 @@
 
     if (tt == 0) { // magnifier graphic tool
         g_data[int('m')] = 1;
-        g_rx = x - (magx() / 2) * 8;
         g_orx = x;
-        g_ry = y - (magy() / 2) * 8;
         g_ory = y;
-        g_rx2 = x + (magx() / 2 + odd(magx())) * 8;
-        g_ry2 = y + (magy() / 2 + odd(magy())) * 8;
+        g_rx = x - int(magx() / 2) * 8;
+        g_ry = y - int(magy() / 2) * 8;
+        g_rx2 = x + (int(magx() / 2) + odd(magx())) * 8;
+        g_ry2 = y + (int(magy() / 2) + odd(magy())) * 8;
         g_data[int('m')] = 0;
         g_rubbermode = 1;
         if (g_phase == 1) {
@@ -1139,8 +1126,9 @@
             g_data[int('m')] = 1;
             set_tool(g_prevtool);
             g_phase = 0;
-            g_ofx = x / 8 - magx() / 2;
-            g_ofy = y / 8 - magy() / 2;
+
+            g_ofx = int(x / 8) - int(magx() / 2);
+            g_ofy = int(y / 8) - int(magy() / 2);
             refresh();
             g_repanel = -2;
         }
--- a/draw_smart.pde	Tue Jul 03 21:27:18 2018 +0300
+++ b/draw_smart.pde	Tue Jul 03 22:17:48 2018 +0300
@@ -60,8 +60,7 @@
 
     if (g_multic == 1 || g_hzoomer == 2) molox = 2;
     if (molox == 2) {
-        xx = xx / 2;
-        xx = xx * 2;
+        xx = chop2(xx);
     }
     if (mou == LEFT) {
         par = g_farge;
@@ -150,11 +149,10 @@
     int aa, bb, pp, ya, yb;
     ya = 0;
     yb = 0;
-    xx = xx / 8;
+    xx = int(xx / 8);
 
     if (g_attrimode == 1) {
-        yy = yy / 8;
-        yy = yy * 8;
+        yy = chop8(yy);
         ya = 0;
         yb = 7;
     } //zx spec etc
@@ -194,10 +192,9 @@
     pt = int(g_map[1024 + xx + yy * X]);
     if (pt == 0 && g_data[int('r')] == 0 && g_data[int('R')] == 0) {
         //println("trans char "+xx+"."+yy);
-        xx = xx / 8;
+        xx = int(xx / 8);
         if (g_attrimode == 1) {
-            yy = yy / 8;
-            yy = yy * 8;
+            yy = chop8(yy);
             ya = 0;
             yb = 7;
         } //zx spec etc
@@ -309,19 +306,18 @@
         if (foreg == 8 || backg == 8 || foreg == 0 || backg == 0) return;
     }
 
-    miny = y / 8;
-    miny = miny * 8;
+    miny = chop8(y);
     maxy = y - miny;
     miny = maxy;
-    y = y / 8;
-    y = y * 8;
+    y = chop8(y);
+
     if (g_attrimode == 1) {
         miny = 0;
         maxy = 7;
     }
 
     for (int i = miny; i <= maxy; i++) {
-        bad = 65536 + (x / 8) + (y + i) * MX;
+        bad = 65536 + int(x / 8) + (y + i) * MX;
         cad = bad + MX * (MY * 8);
         if (foreg >= 0) {
             g_map[bad] = byte(foreg);
@@ -343,8 +339,8 @@
 //bit different for C64 and PLUS4M
 
 void skaveri(int x, int y, int foreg, int backg) {
-    int mx = x / 8;
-    int my = y / 8;
+    int mx = int(x / 8);
+    int my = int(y / 8);
     if (g_control == false) return;
     int cc = easygetcolor(x, y);
     mx = mx * 8;
@@ -360,8 +356,8 @@
 }
 
 void mkaveri(int x, int y, int foreg, int backg) {
-    int mx = x / 8;
-    int my = y / 8;
+    int mx = int(x / 8);
+    int my = int(y / 8);
     int ad, bad, cad, dad, b0, b1;
     int f0, f1, f2, f3, free1, free2, free3;
     int f, order, numb, suffocatelimit;
@@ -579,8 +575,8 @@
     int farge0, farge1;
     if (g_multic != 0 || g_hzoomer == 2) return;
     if (g_data[int('d')] == 1) return;
-    mx = x / 8;
-    my = y / 8;
+    mx = int(x / 8);
+    my = int(y / 8);
 
     if (g_attrimode == 1) {
         k_max = 64;
@@ -588,8 +584,7 @@
         maxy = 7;
     } else {
         k_max = 8;
-        miny = y / 8;
-        miny = miny * 8;
+        miny = chop8(y);
         maxy = y - miny;
         miny = maxy;
     }
@@ -730,11 +725,10 @@
     k_v0 = 0;
     k_v1 = 0;
     k_tipping = 4;
-    k_xx = x / 8;
-    k_yy = y / 8;
+    k_xx = chop8(x);
     k_yy = k_yy * 8;
-    k_ojox = x / 8;
-    k_ojoy = y / 8;
+    k_ojox = int(x / 8);
+    k_ojoy = int(y / 8);
     k_ojox = k_ojox * 8;
     k_ojoy = k_ojoy * 8;
     k_miny = (y - k_ojoy);
--- a/events.pde	Tue Jul 03 21:27:18 2018 +0300
+++ b/events.pde	Tue Jul 03 22:17:48 2018 +0300
@@ -176,10 +176,8 @@
             g_data[int('n')] = 0;
             switcher(2);
             if (g_multic == 1 || g_hzoomer == 2) {
-                g_rx = g_rx / 2;
-                g_rx = g_rx * 2;
-                g_rx2 = g_rx2 / 2;
-                g_rx2 = g_rx2 * 2;
+                g_rx = chop2(g_rx);
+                g_rx2 = chop2(g_rx2);
             }
             g_bsourcex = g_rx;
             g_bsourcey = g_ry;
@@ -470,8 +468,8 @@
 
         if (g_data[int('M')] == 1) {
             if (ckey == 'M') {
-                g_ofx = g_storedcoordx / 8 - magx() / 2;
-                g_ofy = g_storedcoordy / 8 - magy() / 2;
+                g_ofx = int(g_storedcoordx / 8) - int(magx() / 2);
+                g_ofy = int(g_storedcoordy / 8) - int(magy() / 2);
                 g_data[int('m')] = 0;
                 message("Super|Magnify");
                 if (tool() == 0) {
@@ -648,10 +646,10 @@
             if (ckey == 'm') {
                 g_data[int('M')] = 0;
                 int moux, mouy;
-                moux = g_mx / g_wzoom;
-                mouy = g_my / g_wzoom;
-                g_ofx = moux / (8) - magx() / 2;
-                g_ofy = mouy / (8) - magy() / 2;
+                moux = int(g_mx / g_wzoom);
+                mouy = int(g_my / g_wzoom);
+                g_ofx = int(moux / 8) - int(magx() / 2);
+                g_ofy = int(mouy / 8) - int(magy() / 2);
                 message("Magnify");
                 if (tool() == 0) {
                     set_tool(g_prevtool);
--- a/exporters.pde	Tue Jul 03 21:27:18 2018 +0300
+++ b/exporters.pde	Tue Jul 03 22:17:48 2018 +0300
@@ -1039,7 +1039,7 @@
     for (y2 = 0; y2 <= 7; y2++) {
         for (y = 0; y < 25; y++) {
             outputter("  .byte ", false);
-            for (x = 0; x < xwid / 2; x++) {
+            for (x = 0; x < int(xwid / 2); x++) {
                 ad = 1024 + (y * 8) * X + (y2 * X) + x * 4;
 
                 val1 = int(g_map[ad]);
@@ -1067,7 +1067,7 @@
                 outputter(str(int(val2)), false);
                 write_head(val2);
                 pp++;
-                if (x < xwid / 2 - 1) {
+                if (x < int(xwid / 2) - 1) {
                     outputter(",", false);
                 }
             }
@@ -1355,10 +1355,8 @@
             for (cx = 0; cx < MX; cx++) {
                 for (yy = cy * vertti; yy <= cy * vertti + vertti - 1; yy++) {
                     for (xx = cx * 8; xx <= cx * 8 + 7; xx = xx + molox) {
-                        fx2 = (ww / X) * xx;
-                        fy2 = (hh / Y) * yy;
-                        x2 = int(fx2);
-                        y2 = int(fy2);
+                        x2 = int(ww / X) * xx;
+                        y2 = int(hh / Y) * yy;
                         rr = 0;
                         gg = 0;
                         bb = 0;
@@ -1419,10 +1417,8 @@
             }
             for (yy = cy * vertti; yy <= cy * vertti + vertti - 1; yy++) {
                 for (xx = cx * 8; xx <= cx * 8 + 7; xx = xx + molox) {
-                    fx2 = (ww / X) * xx;
-                    fy2 = (hh / Y) * yy;
-                    x2 = int(fx2);
-                    y2 = int(fy2);
+                    x2 = int(ww / X) * xx;
+                    y2 = int(hh / Y) * yy;
                     rr = 0;
                     gg = 0;
                     bb = 0;
@@ -1473,10 +1469,8 @@
                 for (yy = cy * vertti; yy <= cy * vertti + vertti - 1; yy++) {
                     for (xx = cx * 8; xx <= cx * 8 + 7; xx = xx + molox) {
 
-                        fx2 = (ww / X) * xx;
-                        fy2 = (hh / Y) * yy;
-                        x2 = int(fx2);
-                        y2 = int(fy2);
+                        x2 = int(ww / X) * xx;
+                        y2 = int(hh / Y) * yy;
 
                         rr = 0;
                         gg = 0;
--- a/multipaint.pde	Tue Jul 03 21:27:18 2018 +0300
+++ b/multipaint.pde	Tue Jul 03 22:17:48 2018 +0300
@@ -202,16 +202,16 @@
 
     set_machine(machine);
     g_windowx = width - (g_hedge) - (g_wzoom * X);
-    g_windowx = g_windowx / 2;
+    g_windowx = int(g_windowx / 2);
     g_windowy = height - (g_vedge) - (g_wzoom * Y);
-    g_windowy = g_windowy / 2;
+    g_windowy = int(g_windowy / 2);
 
     switcher(3);
 
     g_map[4] = byte(g_maxcolors - 1);
     g_ofarge = g_farge;
-    MX = X / 8;
-    MY = Y / 8;
+    MX = int(X / 8);
+    MY = int(Y / 8);
     g_realfront = byte(g_farge);
     g_realback = byte(g_backg);