From: hikarupsp Date: Tue, 11 Mar 2014 13:19:49 +0000 (+0900) Subject: 描画関連の変数を構造体にまとめた。 X-Git-Url: http://git.osdn.net/view?p=heavyosecpu%2FHeavyOSECPU.git;a=commitdiff_plain;h=cbc4ee7e5db271ca32cfec111adf6e3c9dbfe579 描画関連の変数を構造体にまとめた。 --- diff --git a/dpndenv.c b/dpndenv.c index e9697af..bd04a7c 100644 --- 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 diff --git a/function.c b/function.c index 19ba8d9..17b29f7 100644 --- a/function.c +++ b/function.c @@ -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 --- 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); diff --git a/osecpu.h b/osecpu.h index 6e0d0ab..cb60a4b 100644 --- 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; diff --git a/screen.c b/screen.c index a31e7e5..def1db8 100644 --- 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){