OSDN Git Service

描画関連の変数を構造体にまとめた。
authorhikarupsp <hikarupsp@users.sourceforge.jp>
Tue, 11 Mar 2014 13:19:49 +0000 (22:19 +0900)
committerhikarupsp <hikarupsp@users.sourceforge.jp>
Tue, 11 Mar 2014 13:19:49 +0000 (22:19 +0900)
dpndenv.c
function.c
main.c
osecpu.h
screen.c

index e9697af..bd04a7c 100644 (file)
--- a/dpndenv.c
+++ b/dpndenv.c
@@ -426,6 +426,6 @@ void drv_sleep(int msec)
 
 #else
 
-#error "Illegal OS type. Edit switch.h and look at DRV_OSNUM"
+#error "Illegal OS type. Edit osecpu.h and look at DRV_OSNUM"
 
 #endif
\ No newline at end of file
index 19ba8d9..17b29f7 100644 (file)
@@ -174,10 +174,12 @@ void devFunc0006(int mod, int sx, int sy, int x, int y, int c, int len, unsigned
        if (sy == 0) sy = sx;
        int xx = x + sx * 8;
        int yy = y + sy * 16;
-       if (xx <= 0 || xx > v_xsiz || yy <= 0 || yy > v_ysiz)
+       if (xx <= 0 || xx > mainWindow.xsize || yy <= 0 || yy > mainWindow.ysize){
                (*(r->errHndl))(r);
-       if (x < 0 || x >= v_xsiz || y < 0 || y >= v_ysiz)
+    }
+       if (x < 0 || x >= mainWindow.xsize || y < 0 || y >= mainWindow.ysize){
                (*(r->errHndl))(r);
+    }
        int i, ddx, ddy, j, ch, dx, dy;
 
        if ((mod & 3) == 0 && sx == 1 && sy == 1) {
@@ -189,7 +191,9 @@ void devFunc0006(int mod, int sx, int sy, int x, int y, int c, int len, unsigned
                        for (dy = 0; dy < 16; dy++) {
                                j = fontdata[(ch - ' ') * 16 + dy];
                                for (dx = 0; dx < 8; dx++) {
-                                       if ((j & (0x80 >> dx)) != 0) vram[(x + dx) + (y + dy) * v_xsiz] = c;
+                                       if ((j & (0x80 >> dx)) != 0){
+                        mainWindow.vram[(x + dx) + (y + dy) * mainWindow.xsize] = c;
+                    }
                                }
                        }
                        x += 8;
@@ -206,10 +210,20 @@ void devFunc0006(int mod, int sx, int sy, int x, int y, int c, int len, unsigned
                                for (dx = 0; dx < 8; dx++) {
                                        if ((j & (0x80 >> dx)) != 0) {
                                                for (ddx = 0; ddx < sx; ddx++) {
-                                                       if ((mod & 3) == 0) vram[x + y * v_xsiz] = c;
-                                                       if ((mod & 3) == 1) vram[x + y * v_xsiz] |= c;
-                                                       if ((mod & 3) == 2) vram[x + y * v_xsiz] ^= c;
-                                                       if ((mod & 3) == 3) vram[x + y * v_xsiz] &= c;
+                            switch (mod & 3) {
+                                case 0:
+                                    mainWindow.vram[x + y * mainWindow.xsize] = c;
+                                    break;
+                                case 1:
+                                    mainWindow.vram[x + y * mainWindow.xsize] |= c;
+                                    break;
+                                case 2:
+                                    mainWindow.vram[x + y * mainWindow.xsize] ^= c;
+                                    break;
+                                case 3:
+                                    mainWindow.vram[x + y * mainWindow.xsize] &= c;
+                                    break;
+                            }
                                                        x++;
                                                }
                                        }
@@ -232,16 +246,16 @@ void devFunc0004(int mod, int x0, int y0, int x1, int y1, int c)
        if (mod == 0) {
                for (y = y0; y <= y1; y++) {
                        for (x = x0; x <= x1; x++) {
-                               vram[x + y * v_xsiz] = c;
+                               mainWindow.vram[x + y * mainWindow.xsize] = c;
                        }
                }
        }
        else {
                for (y = y0; y <= y1; y++) {
                        for (x = x0; x <= x1; x++) {
-                               if (mod == 1) vram[x + y * v_xsiz] |= c;
-                               if (mod == 2) vram[x + y * v_xsiz] ^= c;
-                               if (mod == 3) vram[x + y * v_xsiz] &= c;
+                               if (mod == 1) mainWindow.vram[x + y * mainWindow.xsize] |= c;
+                               if (mod == 2) mainWindow.vram[x + y * mainWindow.xsize] ^= c;
+                               if (mod == 3) mainWindow.vram[x + y * mainWindow.xsize] &= c;
                        }
                }
        }
@@ -324,14 +338,15 @@ void devFunc(HOSECPU_RuntimeEnvironment *r)
        if (r->winClosed != 0)
                longjmp(*(r->setjmpEnv), 1);
        if (0xff44 <= r->ireg[0x30] && r->ireg[0x30] <= 0xff48) {
-               if (vram == NULL) {
-                       v_xsiz = 640;
-                       v_ysiz = 480;
-                       vram = malloc(640 * 480 * 4);
-                       drv_openWin(640, 480, (void *)vram, &r->winClosed);
+               if (mainWindow.vram == NULL) {
+                       mainWindow.xsize = 640;
+                       mainWindow.ysize = 480;
+                       mainWindow.vram = malloc(640 * 480 * 4);
+                       drv_openWin(640, 480, (void *)mainWindow.vram, &r->winClosed);
                        r->autoSleep = 1;
-                       for (i = 640 * 480 - 1; i >= 0; i--)
-                               vram[i] = 0;
+                       for (i = 640 * 480 - 1; i >= 0; i--){
+                               mainWindow.vram[i] = 0;
+            }
                }
        }
 
@@ -456,24 +471,26 @@ void devFunc(HOSECPU_RuntimeEnvironment *r)
 
        case 0xff40:
                /* R31とR32でサイズを指定 */
-               v_xsiz = r->ireg[0x31];
-               v_ysiz = r->ireg[0x32];
-               if (v_xsiz <= 0 || v_ysiz <= 0)
+               mainWindow.xsize = r->ireg[0x31];
+               mainWindow.ysize = r->ireg[0x32];
+        if (mainWindow.xsize <= 0 || mainWindow.ysize <= 0){
                        (*(r->errHndl))(r);
-               r->preg[0x31].p = (void *)(vram = malloc(v_xsiz * v_ysiz * 4));
+        }
+               r->preg[0x31].p = (void *)(mainWindow.vram = malloc(mainWindow.xsize * mainWindow.ysize * 4));
                r->preg[0x31].p0 = r->preg[0x31].p;
-               r->preg[0x31].p1 = r->preg[0x31].p + v_xsiz * v_ysiz * 4;
+               r->preg[0x31].p1 = r->preg[0x31].p + mainWindow.xsize * mainWindow.ysize * 4;
                drv_openWin(r->ireg[0x31], r->ireg[0x32], r->preg[0x31].p, &r->winClosed);
                //      drv_flshWin(r->ireg[1], r->ireg[2], 0, 0);
                r->autoSleep = 1;
-               for (i = v_xsiz * v_ysiz - 1; i >= 0; i--)
-                       vram[i] = 0;
+        for (i = mainWindow.xsize * mainWindow.ysize - 1; i >= 0; i--){
+                       mainWindow.vram[i] = 0;
+        }
                break;
 
        case 0xff41:
                /* R31とR32でサイズを指定、R33とR34でx0,y0指定 */
-               if (r->ireg[0x31] == -1) { r->ireg[0x31] = v_xsiz; r->ireg[0x33] &= 0; }
-               if (r->ireg[0x32] == -1) { r->ireg[0x32] = v_ysiz; r->ireg[0x34] &= 0; }
+               if (r->ireg[0x31] == -1) { r->ireg[0x31] = mainWindow.xsize; r->ireg[0x33] &= 0; }
+               if (r->ireg[0x32] == -1) { r->ireg[0x32] = mainWindow.ysize; r->ireg[0x34] &= 0; }
                checkRect(r, 0x31);
                drv_flshWin(r->ireg[0x31], r->ireg[0x32], r->ireg[0x33], r->ireg[0x34]);
                break;
@@ -486,8 +503,8 @@ void devFunc(HOSECPU_RuntimeEnvironment *r)
                if (r->ireg[0x32] < 0)
                        (*(r->errHndl))(r);
                r->autoSleep = 0;
-               if ((r->ireg[0x31] & 1) == 0 && vram != NULL)
-                       drv_flshWin(v_xsiz, v_ysiz, 0, 0);
+               if ((r->ireg[0x31] & 1) == 0 && mainWindow.vram != NULL)
+                       drv_flshWin(mainWindow.xsize, mainWindow.ysize, 0, 0);
                for (;;) {
                        if (r->winClosed != 0)
                                longjmp(*(r->setjmpEnv), 1);
@@ -528,20 +545,20 @@ void devFunc(HOSECPU_RuntimeEnvironment *r)
 
        case 0xff44:
                c = loadColor(r, 0x34);
-               if (r->ireg[0x32] < 0 || r->ireg[0x32] >= v_xsiz || r->ireg[0x33] < 0 || r->ireg[0x33] >= v_ysiz)
+               if (r->ireg[0x32] < 0 || r->ireg[0x32] >= mainWindow.xsize || r->ireg[0x33] < 0 || r->ireg[0x33] >= mainWindow.ysize)
                        (*(r->errHndl))(r);
-               if ((r->ireg[0x31] & 3) == 0) vram[r->ireg[0x32] + r->ireg[0x33] * v_xsiz] = c;
-               if ((r->ireg[0x31] & 3) == 1) vram[r->ireg[0x32] + r->ireg[0x33] * v_xsiz] |= c;
-               if ((r->ireg[0x31] & 3) == 2) vram[r->ireg[0x32] + r->ireg[0x33] * v_xsiz] ^= c;
-               if ((r->ireg[0x31] & 3) == 3) vram[r->ireg[0x32] + r->ireg[0x33] * v_xsiz] &= c;
+               if ((r->ireg[0x31] & 3) == 0) mainWindow.vram[r->ireg[0x32] + r->ireg[0x33] * mainWindow.xsize] = c;
+               if ((r->ireg[0x31] & 3) == 1) mainWindow.vram[r->ireg[0x32] + r->ireg[0x33] * mainWindow.xsize] |= c;
+               if ((r->ireg[0x31] & 3) == 2) mainWindow.vram[r->ireg[0x32] + r->ireg[0x33] * mainWindow.xsize] ^= c;
+               if ((r->ireg[0x31] & 3) == 3) mainWindow.vram[r->ireg[0x32] + r->ireg[0x33] * mainWindow.xsize] &= c;
                break;
 
        case 0xff45:
         //drawLine
                c = loadColor(r, 0x36);
-               if (r->ireg[0x32] < 0 || r->ireg[0x32] >= v_xsiz || r->ireg[0x33] < 0 || r->ireg[0x33] >= v_ysiz)
+               if (r->ireg[0x32] < 0 || r->ireg[0x32] >= mainWindow.xsize || r->ireg[0x33] < 0 || r->ireg[0x33] >= mainWindow.ysize)
                        (*(r->errHndl))(r);
-               if (r->ireg[0x34] < 0 || r->ireg[0x34] >= v_xsiz || r->ireg[0x35] < 0 || r->ireg[0x35] >= v_ysiz)
+               if (r->ireg[0x34] < 0 || r->ireg[0x34] >= mainWindow.xsize || r->ireg[0x35] < 0 || r->ireg[0x35] >= mainWindow.ysize)
                        (*(r->errHndl))(r);
                dx = r->ireg[0x34] - r->ireg[0x32];
                dy = r->ireg[0x35] - r->ireg[0x33];
@@ -563,7 +580,7 @@ void devFunc(HOSECPU_RuntimeEnvironment *r)
                }
                if ((r->ireg[0x31] & 3) == 0) {
                        for (i = 0; i < len; i++) {
-                               vram[(x >> 10) + (y >> 10) * v_xsiz] = c;
+                               mainWindow.vram[(x >> 10) + (y >> 10) * mainWindow.xsize] = c;
                                x += dx;
                                y += dy;
                        }
@@ -571,9 +588,9 @@ void devFunc(HOSECPU_RuntimeEnvironment *r)
                }
                for (i = 0; i < len; i++) {
                        //      if ((r->ireg[0x31] & 3) == 0) vram[(x >> 10) + (y >> 10) * v_xsiz] =  c;
-                       if ((r->ireg[0x31] & 3) == 1) vram[(x >> 10) + (y >> 10) * v_xsiz] |= c;
-                       if ((r->ireg[0x31] & 3) == 2) vram[(x >> 10) + (y >> 10) * v_xsiz] ^= c;
-                       if ((r->ireg[0x31] & 3) == 3) vram[(x >> 10) + (y >> 10) * v_xsiz] &= c;
+                       if ((r->ireg[0x31] & 3) == 1) mainWindow.vram[(x >> 10) + (y >> 10) * mainWindow.xsize] |= c;
+                       if ((r->ireg[0x31] & 3) == 2) mainWindow.vram[(x >> 10) + (y >> 10) * mainWindow.xsize] ^= c;
+                       if ((r->ireg[0x31] & 3) == 3) mainWindow.vram[(x >> 10) + (y >> 10) * mainWindow.xsize] &= c;
                        x += dx;
                        y += dy;
                }
@@ -581,8 +598,8 @@ void devFunc(HOSECPU_RuntimeEnvironment *r)
 
        case 0xff46:    // fillRect(opt:R31, xsiz:R32, ysiz:R33, x0:R34, y0:R35, c:R36)
                c = loadColor(r, 0x36);
-               if (r->ireg[0x32] == -1) { r->ireg[0x32] = v_xsiz; r->ireg[0x34] &= 0; }
-               if (r->ireg[0x33] == -1) { r->ireg[0x33] = v_ysiz; r->ireg[0x35] &= 0; }
+               if (r->ireg[0x32] == -1) { r->ireg[0x32] = mainWindow.xsize; r->ireg[0x34] &= 0; }
+               if (r->ireg[0x33] == -1) { r->ireg[0x33] = mainWindow.ysize; r->ireg[0x35] &= 0; }
                checkRect(r, 0x32);
                int mod3 = r->ireg[0x31] & 3, x0 = r->ireg[0x34], y0 = r->ireg[0x35], x1 = r->ireg[0x34] + r->ireg[0x32] - 1, y1 = r->ireg[0x35] + r->ireg[0x33] - 1;
                if ((r->ireg[0x31] & 0x20) == 0) {
@@ -599,8 +616,8 @@ void devFunc(HOSECPU_RuntimeEnvironment *r)
        case 0xff47:    // fillOval(opt:R31, xsiz:R32, ysiz:R33, x0:R34, y0:R35, c:R36)
                // これの計算精度はアーキテクチャに依存する.
                c = loadColor(r, 0x36);
-               if (r->ireg[0x32] == -1) { r->ireg[0x32] = v_xsiz; r->ireg[0x34] &= 0; }
-               if (r->ireg[0x33] == -1) { r->ireg[0x33] = v_ysiz; r->ireg[0x35] &= 0; }
+               if (r->ireg[0x32] == -1) { r->ireg[0x32] = mainWindow.xsize; r->ireg[0x34] &= 0; }
+               if (r->ireg[0x33] == -1) { r->ireg[0x33] = mainWindow.ysize; r->ireg[0x35] &= 0; }
                checkRect(r, 0x32);
                double dcx = 0.5 * (r->ireg[0x32] - 1), dcy = 0.5 * (r->ireg[0x33] - 1), dcxy = (dcx + 0.5) * (dcy + 0.5) - 0.1;
                dcxy *= dcxy;
@@ -613,7 +630,7 @@ void devFunc(HOSECPU_RuntimeEnvironment *r)
                                for (x = 0; x < x1; x++) {
                                        double dtx = (x - dcx) * dcy;
                                        if (dtx * dtx + dty * dty > dcxy) continue;
-                                       vram[(x + r->ireg[0x34]) + (y + r->ireg[0x35]) * v_xsiz] = c;
+                                       mainWindow.vram[(x + r->ireg[0x34]) + (y + r->ireg[0x35]) * mainWindow.xsize] = c;
                                }
                        }
                }
@@ -631,10 +648,10 @@ void devFunc(HOSECPU_RuntimeEnvironment *r)
                                        if (DRAWOVALPARAM <= x && x < x1 - DRAWOVALPARAM && DRAWOVALPARAM <= y && y < y1 - DRAWOVALPARAM) {
                                                if (dtx1 * dtx1 + dty1 * dty1 < dcxy1) continue;
                                        }
-                                       if (mod3 == 0) vram[(x + r->ireg[0x34]) + (y + r->ireg[0x35]) * v_xsiz] = c;
-                                       if (mod3 == 1) vram[(x + r->ireg[0x34]) + (y + r->ireg[0x35]) * v_xsiz] |= c;
-                                       if (mod3 == 2) vram[(x + r->ireg[0x34]) + (y + r->ireg[0x35]) * v_xsiz] ^= c;
-                                       if (mod3 == 3) vram[(x + r->ireg[0x34]) + (y + r->ireg[0x35]) * v_xsiz] &= c;
+                                       if (mod3 == 0) mainWindow.vram[(x + r->ireg[0x34]) + (y + r->ireg[0x35]) * mainWindow.xsize] = c;
+                                       if (mod3 == 1) mainWindow.vram[(x + r->ireg[0x34]) + (y + r->ireg[0x35]) * mainWindow.xsize] |= c;
+                                       if (mod3 == 2) mainWindow.vram[(x + r->ireg[0x34]) + (y + r->ireg[0x35]) * mainWindow.xsize] ^= c;
+                                       if (mod3 == 3) mainWindow.vram[(x + r->ireg[0x34]) + (y + r->ireg[0x35]) * mainWindow.xsize] &= c;
                                }
                        }
                }
@@ -676,8 +693,8 @@ void devFunc(HOSECPU_RuntimeEnvironment *r)
                dx = r->ireg[0x34];
                dy = r->ireg[0x35];
                if (dy == 0) dy = dx;
-               if (r->ireg[0x32] == -1) { r->ireg[0x32] = v_xsiz / dx; r->ireg[0x36] &= 0; }
-               if (r->ireg[0x33] == -1) { r->ireg[0x33] = v_ysiz / dy; r->ireg[0x37] &= 0; }
+               if (r->ireg[0x32] == -1) { r->ireg[0x32] = mainWindow.xsize / dx; r->ireg[0x36] &= 0; }
+               if (r->ireg[0x33] == -1) { r->ireg[0x33] = mainWindow.ysize / dy; r->ireg[0x37] &= 0; }
                for (y = 0; y < r->ireg[0x33]; y++) {
                        y0 = y * dy + r->ireg[0x37];
                        for (x = 0; x < r->ireg[0x32]; x++) {
diff --git a/main.c b/main.c
index 61dbc33..36f43aa 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,7 +1,7 @@
 #include "osecpu.h"
 
 int *keybuf, keybuf_r, keybuf_w, keybuf_c;
-int *vram, v_xsiz, v_ysiz;
+HOSECPU_Device_Window mainWindow;
 //デバッグ用。プログラム中の随所で加算される変数
 int di1_serial;
 
@@ -38,8 +38,10 @@ int HeavyOSECPUMain(int argc, char **argv)
        void(*jitfunc)(char *);
     unsigned char *jp;
     
-    //グローバル変数初期化
-    vram = NULL;
+    //Initialize mainWindow
+    mainWindow.vram = NULL;
+    mainWindow.xsize = 0;
+    mainWindow.ysize = 0;
     di1_serial = 0;
     
     //実行環境初期化
@@ -223,8 +225,8 @@ int HeavyOSECPUMain(int argc, char **argv)
                (*jitfunc)(((char *)&env) + 128); /* サイズを節約するためにEBPを128バイトずらす */
     }
        if (env.autoSleep != 0) {
-               if (vram != NULL){
-                       drv_flshWin(v_xsiz, v_ysiz, 0, 0);
+               if (mainWindow.vram != NULL){
+                       drv_flshWin(mainWindow.xsize, mainWindow.ysize, 0, 0);
         }
                while (env.winClosed == 0){
                        drv_sleep(100);
index 6e0d0ab..cb60a4b 100644 (file)
--- a/osecpu.h
+++ b/osecpu.h
@@ -98,6 +98,10 @@ struct LabelTable {
 };
 
 typedef struct Device_Window HOSECPU_Device_Window;
+struct Device_Window {
+    int *vram;
+    int xsize, ysize;
+};
 
 typedef struct Regs HOSECPU_RuntimeEnvironment;
 struct Regs {
@@ -155,7 +159,8 @@ struct Regs {
 //
 
 extern int *keybuf, keybuf_r, keybuf_w, keybuf_c;
-extern int *vram, v_xsiz, v_ysiz;
+extern HOSECPU_Device_Window mainWindow;
+//extern int *vram, v_xsiz, v_ysiz;
 //デバッグ用。プログラム中の随所で加算される変数
 extern int di1_serial;
 
index a31e7e5..def1db8 100644 (file)
--- a/screen.c
+++ b/screen.c
@@ -78,24 +78,24 @@ void checkRect(HOSECPU_RuntimeEnvironment *r, int rxx)
 {
        char c = 0;
        int i;
-       if (r->ireg[rxx + 0] <= 0 || r->ireg[rxx + 0] > v_xsiz){
+       if (r->ireg[rxx + 0] <= 0 || r->ireg[rxx + 0] > mainWindow.xsize){
         c = 1;
     }
-       if (r->ireg[rxx + 1] <= 0 || r->ireg[rxx + 1] > v_ysiz){
+       if (r->ireg[rxx + 1] <= 0 || r->ireg[rxx + 1] > mainWindow.ysize){
         c = 1;
     }
-       if (r->ireg[rxx + 2] < 0 || r->ireg[rxx + 2] >= v_xsiz){
+       if (r->ireg[rxx + 2] < 0 || r->ireg[rxx + 2] >= mainWindow.xsize){
         c = 1;
     }
-       if (r->ireg[rxx + 3] < 0 || r->ireg[rxx + 3] >= v_ysiz){
+       if (r->ireg[rxx + 3] < 0 || r->ireg[rxx + 3] >= mainWindow.ysize){
         c = 1;
     }
        i = r->ireg[rxx + 2] + r->ireg[rxx + 0];
-    if (i <= 0 || i > v_xsiz){
+    if (i <= 0 || i > mainWindow.xsize){
         c = 1;
     }
        i = r->ireg[rxx + 1] + r->ireg[rxx + 3];
-    if (i <= 0 || i > v_ysiz){
+    if (i <= 0 || i > mainWindow.ysize){
         c = 1;
     }
        if (c != 0){