OSDN Git Service

ソース整形
authorhikarupsp <hikarupsp@users.sourceforge.jp>
Tue, 11 Mar 2014 13:40:37 +0000 (22:40 +0900)
committerhikarupsp <hikarupsp@users.sourceforge.jp>
Tue, 11 Mar 2014 13:40:37 +0000 (22:40 +0900)
comlib.c
dpndenv.c
fontdata.c [new file with mode: 0644]
function.c
jitc.c
main.c
osecpu.h
randmt.c [new file with mode: 0644]

index 9caccbb..c1db545 100644 (file)
--- a/comlib.c
+++ b/comlib.c
@@ -17,13 +17,13 @@ int ComLib_getBit(struct ComLib_Str *s)
        s->bitBufLen--;
        return (s->bitBuf >> s->bitBufLen) & 1;
     /*
-       if (s->bitBufLen == 0) {
-               s->bitBuf = s->p[0] | s->p[1] << 8;
-               s->p += 2;
-               s->bitBufLen |= 16;
-       }
-       s->bitBufLen--;
-       return (s->bitBuf >> s->bitBufLen) & 1;
+     if (s->bitBufLen == 0) {
+     s->bitBuf = s->p[0] | s->p[1] << 8;
+     s->p += 2;
+     s->bitBufLen |= 16;
+     }
+     s->bitBufLen--;
+     return (s->bitBuf >> s->bitBufLen) & 1;
      */
 }
 
index bd04a7c..ba5cd72 100644 (file)
--- a/dpndenv.c
+++ b/dpndenv.c
@@ -233,10 +233,10 @@ static int winthread(void *dmy)
        RECT r;
        int i, x, y;
        MSG msg;
-
+    
        x = dw.bmi.bmiHeader.biWidth;
        y = -dw.bmi.bmiHeader.biHeight;
-
+    
        wc.cbSize = sizeof (WNDCLASSEX);
        wc.style = CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc = WndProc;
@@ -244,10 +244,10 @@ static int winthread(void *dmy)
        wc.cbWndExtra = 0;
        wc.hInstance = dw.hi;
        wc.hIcon = (HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION),
-               IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED);
+                                IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED);
        wc.hIconSm = wc.hIcon;
        wc.hCursor = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW),
-               IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED);
+                                    IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED);
        wc.hbrBackground = (HBRUSH)COLOR_APPWORKSPACE;
        wc.lpszMenuName = NULL;
        wc.lpszClassName = L"WinClass";
@@ -260,11 +260,11 @@ static int winthread(void *dmy)
        AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW, FALSE);
        x = r.right - r.left;
        y = r.bottom - r.top;
-
+    
        char *t = "osecpu";
-
+    
        dw.hw = CreateWindowA("WinClass", t, WS_OVERLAPPEDWINDOW,
-               CW_USEDEFAULT, CW_USEDEFAULT, x, y, NULL, NULL, dw.hi, NULL);
+                          CW_USEDEFAULT, CW_USEDEFAULT, x, y, NULL, NULL, dw.hi, NULL);
        if (dw.hw == NULL)
                return 1;
        ShowWindow(dw.hw, SW_SHOW);
@@ -273,7 +273,7 @@ static int winthread(void *dmy)
        SetTimer(dw.hw, TIMER_ID + 1, TIMER_INTERVAL * 10, NULL);
        SetTimer(dw.hw, TIMER_ID + 2, TIMER_INTERVAL * 100, NULL);
        dw.flags |= 2 | 4;
-
+    
        for (;;) {
                i = GetMessage(&msg, NULL, 0, 0);
                if (i == 0 || i == -1)  /* エラーもしくは終了メッセージ */
@@ -292,7 +292,7 @@ static int winthread(void *dmy)
 void bld_openWin(int sx, int sy, char *winClosed)
 {
        static int i;
-
+    
        dw.bmi.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
        dw.bmi.bmiHeader.biWidth = sx;
        dw.bmi.bmiHeader.biHeight = -sy;
@@ -300,9 +300,9 @@ void bld_openWin(int sx, int sy, char *winClosed)
        dw.bmi.bmiHeader.biBitCount = 32;
        dw.bmi.bmiHeader.biCompression = BI_RGB;
        dw.winClosed = winClosed;
-
+    
        threadhandle = CreateThread(NULL, 0, (void *)&winthread, NULL, 0, (void *)&i);
-
+    
        return;
 }
 
@@ -320,7 +320,7 @@ LRESULT CALLBACK WndProc(HWND hw, unsigned int msg, WPARAM wp, LPARAM lp)
                PAINTSTRUCT ps;
                HDC hdc = BeginPaint(dw.hw, &ps);
                SetDIBitsToDevice(hdc, 0, 0, w.win.xsiz, w.win.ysiz,
-                       0, 0, 0, w.win.ysiz, w.win.buf, &dw.bmi, DIB_RGB_COLORS);
+                          0, 0, 0, w.win.ysiz, w.win.buf, &dw.bmi, DIB_RGB_COLORS);
                EndPaint(dw.hw, &ps);
        }
        if (msg == WM_DESTROY) {
@@ -343,7 +343,7 @@ LRESULT CALLBACK WndProc(HWND hw, unsigned int msg, WPARAM wp, LPARAM lp)
        }
        if (msg == WM_KEYDOWN || msg == WM_SYSKEYDOWN) {
                i = -1;
-
+        
                if (wp == VK_RETURN)    i = KEY_ENTER;
                if (wp == VK_ESCAPE)    i = KEY_ESC;
                if (wp == VK_BACK)              i = KEY_BACKSPACE;
diff --git a/fontdata.c b/fontdata.c
new file mode 100644 (file)
index 0000000..2a3c559
--- /dev/null
@@ -0,0 +1,99 @@
+
+unsigned char fontdata[] = {
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
+       0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x44, 0x44, 0x44, 0xfe, 0x44, 0x44, 0x44, 0x44, 0x44, 0xfe, 0x44, 0x44, 0x44, 0x00, 0x00,
+       0x10, 0x3a, 0x56, 0x92, 0x92, 0x90, 0x50, 0x38, 0x14, 0x12, 0x92, 0x92, 0xd4, 0xb8, 0x10, 0x10,
+       0x62, 0x92, 0x94, 0x94, 0x68, 0x08, 0x10, 0x10, 0x20, 0x2c, 0x52, 0x52, 0x92, 0x8c, 0x00, 0x00,
+       0x00, 0x70, 0x88, 0x88, 0x88, 0x90, 0x60, 0x47, 0xa2, 0x92, 0x8a, 0x84, 0x46, 0x39, 0x00, 0x00,
+       0x04, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x02, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x04, 0x02, 0x00,
+       0x80, 0x40, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x40, 0x80, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x92, 0x54, 0x38, 0x54, 0x92, 0x10, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0xfe, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x08, 0x08, 0x10,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
+       0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x40, 0x80, 0x80,
+       0x00, 0x18, 0x24, 0x24, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x24, 0x18, 0x00, 0x00,
+       0x00, 0x08, 0x18, 0x28, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3e, 0x00, 0x00,
+       0x00, 0x18, 0x24, 0x42, 0x42, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x7e, 0x00, 0x00,
+       0x00, 0x18, 0x24, 0x42, 0x02, 0x02, 0x04, 0x18, 0x04, 0x02, 0x02, 0x42, 0x24, 0x18, 0x00, 0x00,
+       0x00, 0x0c, 0x0c, 0x0c, 0x14, 0x14, 0x14, 0x24, 0x24, 0x44, 0x7e, 0x04, 0x04, 0x1e, 0x00, 0x00,
+       0x00, 0x7c, 0x40, 0x40, 0x40, 0x58, 0x64, 0x02, 0x02, 0x02, 0x02, 0x42, 0x24, 0x18, 0x00, 0x00,
+       0x00, 0x18, 0x24, 0x42, 0x40, 0x58, 0x64, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00,
+       0x00, 0x7e, 0x42, 0x42, 0x04, 0x04, 0x08, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00,
+       0x00, 0x18, 0x24, 0x42, 0x42, 0x42, 0x24, 0x18, 0x24, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00,
+       0x00, 0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x42, 0x26, 0x1a, 0x02, 0x42, 0x24, 0x18, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x08, 0x08, 0x10,
+       0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00,
+       0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x04, 0x08, 0x10, 0x10, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
+       0x00, 0x38, 0x44, 0x82, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x9c, 0x80, 0x46, 0x38, 0x00, 0x00,
+       0x00, 0x18, 0x18, 0x18, 0x18, 0x24, 0x24, 0x24, 0x24, 0x7e, 0x42, 0x42, 0x42, 0xe7, 0x00, 0x00,
+       0x00, 0xf0, 0x48, 0x44, 0x44, 0x44, 0x48, 0x78, 0x44, 0x42, 0x42, 0x42, 0x44, 0xf8, 0x00, 0x00,
+       0x00, 0x3a, 0x46, 0x42, 0x82, 0x80, 0x80, 0x80, 0x80, 0x80, 0x82, 0x42, 0x44, 0x38, 0x00, 0x00,
+       0x00, 0xf8, 0x44, 0x44, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x44, 0x44, 0xf8, 0x00, 0x00,
+       0x00, 0xfe, 0x42, 0x42, 0x40, 0x40, 0x44, 0x7c, 0x44, 0x40, 0x40, 0x42, 0x42, 0xfe, 0x00, 0x00,
+       0x00, 0xfe, 0x42, 0x42, 0x40, 0x40, 0x44, 0x7c, 0x44, 0x44, 0x40, 0x40, 0x40, 0xf0, 0x00, 0x00,
+       0x00, 0x3a, 0x46, 0x42, 0x82, 0x80, 0x80, 0x9e, 0x82, 0x82, 0x82, 0x42, 0x46, 0x38, 0x00, 0x00,
+       0x00, 0xe7, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42, 0x42, 0x42, 0xe7, 0x00, 0x00,
+       0x00, 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00, 0x00,
+       0x00, 0x1f, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x84, 0x48, 0x30, 0x00,
+       0x00, 0xe7, 0x42, 0x44, 0x48, 0x50, 0x50, 0x60, 0x50, 0x50, 0x48, 0x44, 0x42, 0xe7, 0x00, 0x00,
+       0x00, 0xf0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x42, 0x42, 0xfe, 0x00, 0x00,
+       0x00, 0xc3, 0x42, 0x66, 0x66, 0x66, 0x5a, 0x5a, 0x5a, 0x42, 0x42, 0x42, 0x42, 0xe7, 0x00, 0x00,
+       0x00, 0xc7, 0x42, 0x62, 0x62, 0x52, 0x52, 0x52, 0x4a, 0x4a, 0x4a, 0x46, 0x46, 0xe2, 0x00, 0x00,
+       0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00,
+       0x00, 0xf8, 0x44, 0x42, 0x42, 0x42, 0x44, 0x78, 0x40, 0x40, 0x40, 0x40, 0x40, 0xf0, 0x00, 0x00,
+       0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x92, 0x8a, 0x44, 0x3a, 0x00, 0x00,
+       0x00, 0xfc, 0x42, 0x42, 0x42, 0x42, 0x7c, 0x44, 0x42, 0x42, 0x42, 0x42, 0x42, 0xe7, 0x00, 0x00,
+       0x00, 0x3a, 0x46, 0x82, 0x82, 0x80, 0x40, 0x38, 0x04, 0x02, 0x82, 0x82, 0xc4, 0xb8, 0x00, 0x00,
+       0x00, 0xfe, 0x92, 0x92, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00, 0x00,
+       0x00, 0xe7, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x3c, 0x00, 0x00,
+       0x00, 0xe7, 0x42, 0x42, 0x42, 0x42, 0x24, 0x24, 0x24, 0x24, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
+       0x00, 0xe7, 0x42, 0x42, 0x42, 0x5a, 0x5a, 0x5a, 0x5a, 0x24, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00,
+       0x00, 0xe7, 0x42, 0x42, 0x24, 0x24, 0x24, 0x18, 0x24, 0x24, 0x24, 0x42, 0x42, 0xe7, 0x00, 0x00,
+       0x00, 0xee, 0x44, 0x44, 0x44, 0x28, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00, 0x00,
+       0x00, 0xfe, 0x84, 0x84, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x42, 0x82, 0xfe, 0x00, 0x00,
+       0x00, 0x3e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3e, 0x00,
+       0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x02, 0x02,
+       0x00, 0x7c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x7c, 0x00,
+       0x00, 0x10, 0x28, 0x44, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00,
+       0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x08, 0x04, 0x3c, 0x44, 0x84, 0x84, 0x8c, 0x76, 0x00, 0x00,
+       0xc0, 0x40, 0x40, 0x40, 0x40, 0x58, 0x64, 0x42, 0x42, 0x42, 0x42, 0x42, 0x64, 0x58, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x4c, 0x84, 0x84, 0x80, 0x80, 0x82, 0x44, 0x38, 0x00, 0x00,
+       0x0c, 0x04, 0x04, 0x04, 0x04, 0x34, 0x4c, 0x84, 0x84, 0x84, 0x84, 0x84, 0x4c, 0x36, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0xfc, 0x80, 0x82, 0x42, 0x3c, 0x00, 0x00,
+       0x0e, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x4c, 0x84, 0x84, 0x84, 0x84, 0x4c, 0x34, 0x04, 0x04, 0x78,
+       0xc0, 0x40, 0x40, 0x40, 0x40, 0x58, 0x64, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0xe3, 0x00, 0x00,
+       0x00, 0x10, 0x10, 0x00, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00,
+       0x00, 0x04, 0x04, 0x00, 0x00, 0x0c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x30,
+       0xc0, 0x40, 0x40, 0x40, 0x40, 0x4e, 0x44, 0x48, 0x50, 0x60, 0x50, 0x48, 0x44, 0xe6, 0x00, 0x00,
+       0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0xdb, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x64, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0xe3, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x64, 0x42, 0x42, 0x42, 0x42, 0x42, 0x64, 0x58, 0x40, 0xe0,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x4c, 0x84, 0x84, 0x84, 0x84, 0x84, 0x4c, 0x34, 0x04, 0x0e,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x62, 0x42, 0x40, 0x40, 0x40, 0x40, 0x40, 0xe0, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x86, 0x82, 0xc0, 0x38, 0x06, 0x82, 0xc2, 0xbc, 0x00, 0x00,
+       0x00, 0x00, 0x10, 0x10, 0x10, 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0e, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3b, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x42, 0x42, 0x42, 0x24, 0x24, 0x24, 0x18, 0x18, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x42, 0x42, 0x5a, 0x5a, 0x5a, 0x24, 0x24, 0x24, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x44, 0x28, 0x28, 0x10, 0x28, 0x28, 0x44, 0xc6, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x42, 0x42, 0x24, 0x24, 0x24, 0x18, 0x18, 0x10, 0x10, 0x60,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x82, 0x84, 0x08, 0x10, 0x20, 0x42, 0x82, 0xfe, 0x00, 0x00,
+       0x00, 0x06, 0x08, 0x10, 0x10, 0x10, 0x10, 0x60, 0x10, 0x10, 0x10, 0x10, 0x08, 0x06, 0x00, 0x00,
+       0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+       0x00, 0x60, 0x10, 0x08, 0x08, 0x08, 0x08, 0x06, 0x08, 0x08, 0x08, 0x08, 0x10, 0x60, 0x00, 0x00,
+       0x00, 0x72, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x10, 0x28, 0x44, 0x82, 0xfe, 0x82, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00
+};
index 17b29f7..23c11a6 100644 (file)
@@ -1,137 +1,6 @@
 #include "osecpu.h"
 
-static struct {
-       unsigned stat[4], mat1, mat2, tmat;
-} randStat;
-
-static unsigned char fontdata[] = {
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
-       0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x44, 0x44, 0x44, 0xfe, 0x44, 0x44, 0x44, 0x44, 0x44, 0xfe, 0x44, 0x44, 0x44, 0x00, 0x00,
-       0x10, 0x3a, 0x56, 0x92, 0x92, 0x90, 0x50, 0x38, 0x14, 0x12, 0x92, 0x92, 0xd4, 0xb8, 0x10, 0x10,
-       0x62, 0x92, 0x94, 0x94, 0x68, 0x08, 0x10, 0x10, 0x20, 0x2c, 0x52, 0x52, 0x92, 0x8c, 0x00, 0x00,
-       0x00, 0x70, 0x88, 0x88, 0x88, 0x90, 0x60, 0x47, 0xa2, 0x92, 0x8a, 0x84, 0x46, 0x39, 0x00, 0x00,
-       0x04, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x02, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x04, 0x02, 0x00,
-       0x80, 0x40, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x40, 0x80, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x92, 0x54, 0x38, 0x54, 0x92, 0x10, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0xfe, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x08, 0x08, 0x10,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
-       0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x40, 0x80, 0x80,
-       0x00, 0x18, 0x24, 0x24, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x24, 0x18, 0x00, 0x00,
-       0x00, 0x08, 0x18, 0x28, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3e, 0x00, 0x00,
-       0x00, 0x18, 0x24, 0x42, 0x42, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x7e, 0x00, 0x00,
-       0x00, 0x18, 0x24, 0x42, 0x02, 0x02, 0x04, 0x18, 0x04, 0x02, 0x02, 0x42, 0x24, 0x18, 0x00, 0x00,
-       0x00, 0x0c, 0x0c, 0x0c, 0x14, 0x14, 0x14, 0x24, 0x24, 0x44, 0x7e, 0x04, 0x04, 0x1e, 0x00, 0x00,
-       0x00, 0x7c, 0x40, 0x40, 0x40, 0x58, 0x64, 0x02, 0x02, 0x02, 0x02, 0x42, 0x24, 0x18, 0x00, 0x00,
-       0x00, 0x18, 0x24, 0x42, 0x40, 0x58, 0x64, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00,
-       0x00, 0x7e, 0x42, 0x42, 0x04, 0x04, 0x08, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00,
-       0x00, 0x18, 0x24, 0x42, 0x42, 0x42, 0x24, 0x18, 0x24, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00,
-       0x00, 0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x42, 0x26, 0x1a, 0x02, 0x42, 0x24, 0x18, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x08, 0x08, 0x10,
-       0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00,
-       0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x04, 0x08, 0x10, 0x10, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
-       0x00, 0x38, 0x44, 0x82, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x9c, 0x80, 0x46, 0x38, 0x00, 0x00,
-       0x00, 0x18, 0x18, 0x18, 0x18, 0x24, 0x24, 0x24, 0x24, 0x7e, 0x42, 0x42, 0x42, 0xe7, 0x00, 0x00,
-       0x00, 0xf0, 0x48, 0x44, 0x44, 0x44, 0x48, 0x78, 0x44, 0x42, 0x42, 0x42, 0x44, 0xf8, 0x00, 0x00,
-       0x00, 0x3a, 0x46, 0x42, 0x82, 0x80, 0x80, 0x80, 0x80, 0x80, 0x82, 0x42, 0x44, 0x38, 0x00, 0x00,
-       0x00, 0xf8, 0x44, 0x44, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x44, 0x44, 0xf8, 0x00, 0x00,
-       0x00, 0xfe, 0x42, 0x42, 0x40, 0x40, 0x44, 0x7c, 0x44, 0x40, 0x40, 0x42, 0x42, 0xfe, 0x00, 0x00,
-       0x00, 0xfe, 0x42, 0x42, 0x40, 0x40, 0x44, 0x7c, 0x44, 0x44, 0x40, 0x40, 0x40, 0xf0, 0x00, 0x00,
-       0x00, 0x3a, 0x46, 0x42, 0x82, 0x80, 0x80, 0x9e, 0x82, 0x82, 0x82, 0x42, 0x46, 0x38, 0x00, 0x00,
-       0x00, 0xe7, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42, 0x42, 0x42, 0xe7, 0x00, 0x00,
-       0x00, 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00, 0x00,
-       0x00, 0x1f, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x84, 0x48, 0x30, 0x00,
-       0x00, 0xe7, 0x42, 0x44, 0x48, 0x50, 0x50, 0x60, 0x50, 0x50, 0x48, 0x44, 0x42, 0xe7, 0x00, 0x00,
-       0x00, 0xf0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x42, 0x42, 0xfe, 0x00, 0x00,
-       0x00, 0xc3, 0x42, 0x66, 0x66, 0x66, 0x5a, 0x5a, 0x5a, 0x42, 0x42, 0x42, 0x42, 0xe7, 0x00, 0x00,
-       0x00, 0xc7, 0x42, 0x62, 0x62, 0x52, 0x52, 0x52, 0x4a, 0x4a, 0x4a, 0x46, 0x46, 0xe2, 0x00, 0x00,
-       0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00,
-       0x00, 0xf8, 0x44, 0x42, 0x42, 0x42, 0x44, 0x78, 0x40, 0x40, 0x40, 0x40, 0x40, 0xf0, 0x00, 0x00,
-       0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x92, 0x8a, 0x44, 0x3a, 0x00, 0x00,
-       0x00, 0xfc, 0x42, 0x42, 0x42, 0x42, 0x7c, 0x44, 0x42, 0x42, 0x42, 0x42, 0x42, 0xe7, 0x00, 0x00,
-       0x00, 0x3a, 0x46, 0x82, 0x82, 0x80, 0x40, 0x38, 0x04, 0x02, 0x82, 0x82, 0xc4, 0xb8, 0x00, 0x00,
-       0x00, 0xfe, 0x92, 0x92, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00, 0x00,
-       0x00, 0xe7, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x3c, 0x00, 0x00,
-       0x00, 0xe7, 0x42, 0x42, 0x42, 0x42, 0x24, 0x24, 0x24, 0x24, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
-       0x00, 0xe7, 0x42, 0x42, 0x42, 0x5a, 0x5a, 0x5a, 0x5a, 0x24, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00,
-       0x00, 0xe7, 0x42, 0x42, 0x24, 0x24, 0x24, 0x18, 0x24, 0x24, 0x24, 0x42, 0x42, 0xe7, 0x00, 0x00,
-       0x00, 0xee, 0x44, 0x44, 0x44, 0x28, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00, 0x00,
-       0x00, 0xfe, 0x84, 0x84, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x42, 0x82, 0xfe, 0x00, 0x00,
-       0x00, 0x3e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3e, 0x00,
-       0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x02, 0x02,
-       0x00, 0x7c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x7c, 0x00,
-       0x00, 0x10, 0x28, 0x44, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00,
-       0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x08, 0x04, 0x3c, 0x44, 0x84, 0x84, 0x8c, 0x76, 0x00, 0x00,
-       0xc0, 0x40, 0x40, 0x40, 0x40, 0x58, 0x64, 0x42, 0x42, 0x42, 0x42, 0x42, 0x64, 0x58, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x4c, 0x84, 0x84, 0x80, 0x80, 0x82, 0x44, 0x38, 0x00, 0x00,
-       0x0c, 0x04, 0x04, 0x04, 0x04, 0x34, 0x4c, 0x84, 0x84, 0x84, 0x84, 0x84, 0x4c, 0x36, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0xfc, 0x80, 0x82, 0x42, 0x3c, 0x00, 0x00,
-       0x0e, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x4c, 0x84, 0x84, 0x84, 0x84, 0x4c, 0x34, 0x04, 0x04, 0x78,
-       0xc0, 0x40, 0x40, 0x40, 0x40, 0x58, 0x64, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0xe3, 0x00, 0x00,
-       0x00, 0x10, 0x10, 0x00, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00,
-       0x00, 0x04, 0x04, 0x00, 0x00, 0x0c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x30,
-       0xc0, 0x40, 0x40, 0x40, 0x40, 0x4e, 0x44, 0x48, 0x50, 0x60, 0x50, 0x48, 0x44, 0xe6, 0x00, 0x00,
-       0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0xdb, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x64, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0xe3, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x64, 0x42, 0x42, 0x42, 0x42, 0x42, 0x64, 0x58, 0x40, 0xe0,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x4c, 0x84, 0x84, 0x84, 0x84, 0x84, 0x4c, 0x34, 0x04, 0x0e,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x62, 0x42, 0x40, 0x40, 0x40, 0x40, 0x40, 0xe0, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x86, 0x82, 0xc0, 0x38, 0x06, 0x82, 0xc2, 0xbc, 0x00, 0x00,
-       0x00, 0x00, 0x10, 0x10, 0x10, 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0e, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3b, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x42, 0x42, 0x42, 0x24, 0x24, 0x24, 0x18, 0x18, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x42, 0x42, 0x5a, 0x5a, 0x5a, 0x24, 0x24, 0x24, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x44, 0x28, 0x28, 0x10, 0x28, 0x28, 0x44, 0xc6, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x42, 0x42, 0x24, 0x24, 0x24, 0x18, 0x18, 0x10, 0x10, 0x60,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x82, 0x84, 0x08, 0x10, 0x20, 0x42, 0x82, 0xfe, 0x00, 0x00,
-       0x00, 0x06, 0x08, 0x10, 0x10, 0x10, 0x10, 0x60, 0x10, 0x10, 0x10, 0x10, 0x08, 0x06, 0x00, 0x00,
-       0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
-       0x00, 0x60, 0x10, 0x08, 0x08, 0x08, 0x08, 0x06, 0x08, 0x08, 0x08, 0x08, 0x10, 0x60, 0x00, 0x00,
-       0x00, 0x72, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x10, 0x28, 0x44, 0x82, 0xfe, 0x82, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-
-
-// tinyMTの32bit版のアルゴリズムを使っています : http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/TINYMT/index-jp.html
-void randStatNext()
-{
-       unsigned x, y;
-       x = (randStat.stat[0] & 0x7fffffff) ^ randStat.stat[1] ^ randStat.stat[2];
-       y = randStat.stat[3];
-       x ^= x << 1;
-       y ^= (y >> 1) ^ x;
-       randStat.stat[1] = randStat.stat[2] ^ (-((int)(y & 1)) & randStat.mat1);
-       randStat.stat[2] = x ^ (y << 10) ^ (-((int)(y & 1)) & randStat.mat2);
-       randStat.stat[3] = y;
-       return;
-}
-
-void randStatInit(unsigned seed)
-{
-       int i;
-       randStat.stat[0] = seed;
-       randStat.stat[1] = randStat.mat1 = 0x8f7011ee;
-       randStat.stat[2] = randStat.mat2 = 0xfc78ff1f;
-       randStat.stat[3] = randStat.tmat = 0x3793fdff;
-       for (i = 1; i < 8; i++)
-               randStat.stat[i & 3] ^= i + ((unsigned)1812433253) * (randStat.stat[(i - 1) & 3] ^ (randStat.stat[(i - 1) & 3] >> 30));
-       for (i = 0; i < 8; i++)
-               randStatNext();
-       return;
-}
+extern unsigned char fontdata[];    // @fontdata.c
 
 const char *searchArg(int argc, const char **argv, const char *tag, int i)
 {
@@ -142,7 +11,9 @@ const char *searchArg(int argc, const char **argv, const char *tag, int i)
                for (j = 1; j < argc; j++) {
                        if (strncmp(argv[j], tag, l) == 0) {
                                r = argv[j] + l;
-                               if (i == 0)     break;
+                               if (i == 0){
+                    break;
+                }
                                i--;
                        }
                }
@@ -151,12 +22,16 @@ const char *searchArg(int argc, const char **argv, const char *tag, int i)
                for (j = 1; j < argc; j++) {
                        if (strchr(argv[j], ':') == NULL) {
                                r = argv[j];
-                               if (i == 0)     break;
+                               if (i == 0){
+                    break;
+                }
                                i--;
                        }
                }
        }
-       if (i != 0) r = NULL;
+       if (i != 0){
+        r = NULL;
+    }
        return r;
 }
 
@@ -171,17 +46,23 @@ void devFunc0001(int len, unsigned char *puc, HOSECPU_RuntimeEnvironment *r)
 
 void devFunc0006(int mod, int sx, int sy, int x, int y, int c, int len, unsigned char *puc, HOSECPU_RuntimeEnvironment *r)
 {
-       if (sy == 0) sy = sx;
-       int xx = x + sx * 8;
-       int yy = y + sy * 16;
+    int xx;
+    int yy;
+    int i, ddx, ddy, j, ch, dx, dy;
+    
+       if (sy == 0){
+        sy = sx;
+    }
+       xx = x + sx * 8;
+       yy = y + sy * 16;
        if (xx <= 0 || xx > mainWindow.xsize || yy <= 0 || yy > mainWindow.ysize){
                (*(r->errHndl))(r);
     }
        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) {
                // メジャーケースを高速化.
                for (i = 0; i < len; i++) {
@@ -349,367 +230,369 @@ void devFunc(HOSECPU_RuntimeEnvironment *r)
             }
                }
        }
-
+    
        switch (r->ireg[0x30]) {
-       case 0xff00:
-               printf("R31=%d(dec)\n", r->ireg[0x31]);
-               break;
-
-       case 0xff01:
-               /* return: R30, P31 */
-               if (r->buf0 == NULL)
-                       r->buf0 = malloc(1024 * 1024);
-               if (r->mainArgc <= r->ireg[0x31]) {
-                       fprintf(stderr, "devFunc: error: R30=ff01: argc error: R31=%08X\n", r->ireg[0x31]);
-                       exit(1);
-               }
-               fp = fopen(r->mainArgv[r->ireg[0x31]], "rb");
-               if (fp == NULL) {
-                       fprintf(stderr, "devFunc: error: R30=ff01: fopen error: '%s'\n", r->mainArgv[r->ireg[0x31]]);
-                       exit(1);
-               }
-               i = (int)fread(r->buf0, 1, 1024 * 1024 - 4, fp);
-               if (i >= 1024 * 1024 - 4 || i < 0) {
-                       fprintf(stderr, "devFunc: error: R30=ff01: fread error: '%s'\n", r->mainArgv[r->ireg[0x31]]);
-                       exit(1);
-               }
-               fclose(fp);
-               r->preg[0x31].p = r->buf0;
-               r->preg[0x31].p0 = r->buf0;
-               r->preg[0x31].p1 = r->buf0 + i;
-               r->preg[0x31].typ = 3; // T_UINT8
-               r->ireg[0x30] = i;
-               break;
-
-       case 0xff02:
-               /* return: none */
-               if (r->mainArgc <= r->ireg[0x31]) {
-                       fprintf(stderr, "devFunc: error: R30=ff02: argc error: R31=%08X\n", r->ireg[0x31]);
-                       exit(1);
-               }
-               fp = fopen(r->mainArgv[r->ireg[0x31]], "wb");
-               if (fp == NULL) {
-                       fprintf(stderr, "devFunc: error: R30=ff02: fopen error: '%s'\n", r->mainArgv[r->ireg[0x31]]);
-                       exit(1);
-               }
-               if (r->ireg[0x32] >= 1024 * 1024 || r->ireg[0x32] < 0){
-                       fprintf(stderr, "devFunc: error: R30=ff02: fwrite error: R02=%08X\n", r->ireg[0x32]);
-                       exit(1);
-               }
-               fwrite(r->preg[0x31].p, 1, r->ireg[0x32], fp);
-               fclose(fp);
-               break;
-
-       case 0xff03:
-               /* return: P31 */
-               if (r->buf1 == NULL)
-                       r->buf1 = malloc(1024 * 1024);
-               r->preg[0x31].p = r->buf1;
-               r->preg[0x31].p0 = r->buf1;
-               r->preg[0x31].p1 = r->buf1 + 1024 * 1024;
-               break;
-
-       case 0xff04:
-               printf("P31.(p-p0)=%d(dec)\n", (int)(r->preg[0x31].p - r->preg[0x31].p0));
-               break;
-
-       case 0xff05:
-               fwrite(r->preg[0x31].p, 1, r->ireg[0x31], stdout);
-               break;
-
-       case 0xff06:
-               // R31はリターンコード.
-               // これを反映すべきだが、現状は手抜きでいつも正常終了.
-               longjmp(*(r->setjmpEnv), 1);
-               break;
-
-       case 0xff07:
-               // マシになった文字列表示.OSASK文字列に対応.offにすれば通常の文字列処理もできる.現状はonのみサポート.
-               checkString(r, 0x31, 0x31);
-               devFunc0001(r->ireg[0x31], r->preg[0x31].p, r);
-               break;
-
-       case 0xff08:
-               // JITC on JITC
-               // R31: 言語(back-end, front-end, ...
-               // R32: level
-               // R33: debugInfo1
-               checkString(r, 0x34, 0x31);
-               if (r->ireg[0x33] < 0 || r->ireg[0x33] > 15 || r->debugInfo1 > 15)
-                       (*(r->errHndl))(r);
-               for (i = 0; i < r->maxLabels; i++)
-                       r->label[i].opt = 0;
-               puc = r->preg[0x31].p;
-               i = jitCompiler(r->jitbuf, r->jitbuf1, puc, puc + r->ireg[0x34], puc, r->label, r->maxLabels, r->ireg[0x32], di1_serial, JITC_NOSTARTUP + 0);
-               if (i == 0) {
-                       i = jitCompiler(r->jitbuf, r->jitbuf1, puc, puc + r->ireg[0x34], puc, r->label, r->maxLabels, r->ireg[0x32], di1_serial, JITC_NOSTARTUP + JITC_PHASE1 + 0);
-                       if (i >= 0) {
-                               r->mapDi1s[r->debugInfo1][r->ireg[0x33]] = di1_serial;
-                               di1_serial++;
-                               r->ireg[0x30] = 0;
-                               r->preg[0x31].p = r->jitbuf;
-                               r->preg[0x31].typ = 0; // TYP_CODE
-                               r->preg[0x31].p0 = r->jitbuf;
-                               r->preg[0x31].p1 = r->jitbuf + 1;
-                               //int j; for (j = 0; j < i; j++) printf("%02X ", r->jitbuf[j]); putchar('\n');
-                               r->jitbuf += i;
-                               static unsigned char ff08_ret[3] = { 0x1e, 0x3f, 0x30 };
-                               i = jitCompiler(r->jitbuf, r->jitbuf1, ff08_ret, ff08_ret + 3, puc, r->label, r->maxLabels, r->ireg[0x32], -1, JITC_NOSTARTUP + JITC_PHASE1 + 0);
-                               r->jitbuf += i;
-                               break;
-                       }
-               }
-               r->ireg[0x30] = -1;
-               break;
-
-       case 0xff09:
-               // たぶんbit7を使ったテキストはうまく処理できない(これはもはや仕様にしても問題ないかも).
-               checkString(r, 0x31, 0x31);
-               len = devFunc0016(sizeof pucbuf, pucbuf, r->ireg[0x31], r->preg[0x31].p, r->ireg[0x32], (int *)r->preg[0x32].p, r);
-               devFunc0001(len, pucbuf, r);
-               break;
-
-       case 0xff40:
-               /* R31とR32でサイズを指定 */
-               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 *)(mainWindow.vram = malloc(mainWindow.xsize * mainWindow.ysize * 4));
-               r->preg[0x31].p0 = r->preg[0x31].p;
-               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 = 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] = 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;
-
-       case 0xff42:
-               if (r->ireg[0x32] == -1) {
-                       r->autoSleep = 1;
-                       longjmp(*(r->setjmpEnv), 1);
-               }
-               if (r->ireg[0x32] < 0)
-                       (*(r->errHndl))(r);
-               r->autoSleep = 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);
-                       drv_sleep(r->ireg[0x32]);
-                       if ((r->ireg[0x31] & 2) != 0 && keybuf_c <= 0) continue;
-                       break;
-               }
-               break;
-
-       case 0xff43:
-               //  1:peek
-               //  2:stdin
-               //      4,8: ソース指定.
-               //      16: shift, lock系を有効化.
-               //      32: 左右のshift系を区別する.
-               if (r->ireg[0x31] == 2) {       // なぜ3にしなかったのか...
-                       r->ireg[0x30] = fgetc(stdin);
-                       if (r->ireg[0x30] == EOF)
-                               r->ireg[0x30] = -1;
-                       break;
-               }
-               r->ireg[0x30] |= -1;
-               if (keybuf_c > 0) {
-                       r->ireg[0x30] = keybuf[keybuf_r];
-                       if ((r->ireg[0x31] & 16) == 0) r->ireg[0x30] &= 0x3e3effff;
-                       if ((r->ireg[0x31] & 32) == 0) r->ireg[0x30] |= (r->ireg[0x30] >> 8) & 0xff0000;
-                       if ((r->ireg[0x31] & 1) != 0) {
-                               keybuf_c--;
-                               keybuf_r = (keybuf_r + 1) & (KEYBUFSIZ - 1);
-                       }
-               }
-               r->ireg[0x32] = r->ireg[0x33] = 0;
-               if (r->ireg[0x30] == 4132) r->ireg[0x32]--;
-               if (r->ireg[0x30] == 4133) r->ireg[0x33]--;
-               if (r->ireg[0x30] == 4134) r->ireg[0x32]++;
-               if (r->ireg[0x30] == 4135) r->ireg[0x33]++;
-               break;
-
-       case 0xff44:
-               c = loadColor(r, 0x34);
-               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) 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] >= mainWindow.xsize || r->ireg[0x33] < 0 || r->ireg[0x33] >= mainWindow.ysize)
-                       (*(r->errHndl))(r);
-               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];
-               x = r->ireg[0x32] << 10;
-               y = r->ireg[0x33] << 10;
-               if (dx < 0) dx = -dx;
-               if (dy < 0) dy = -dy;
-               if (dx >= dy) {
-                       len = dx + 1; dx = 1024;
-                       if (r->ireg[0x32] > r->ireg[0x34]) dx *= -1;
-                       if (r->ireg[0x33] > r->ireg[0x35]) dy *= -1;
-                       dy = (dy << 10) / len;
-               }
-               else {
-                       len = dy + 1; dy = 1024;
-                       if (r->ireg[0x33] > r->ireg[0x35]) dy *= -1;
-                       if (r->ireg[0x32] > r->ireg[0x34]) dx *= -1;
-                       dx = (dx << 10) / len;
-               }
-               if ((r->ireg[0x31] & 3) == 0) {
-                       for (i = 0; i < len; i++) {
-                               mainWindow.vram[(x >> 10) + (y >> 10) * mainWindow.xsize] = c;
-                               x += dx;
-                               y += dy;
-                       }
-                       break;
-               }
-               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) 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;
-               }
-               break;
-
-       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] = 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) {
-                       devFunc0004(mod3, x0, y0, x1, y1, c);
-               }
-               else {  // drawRect
-                       devFunc0004(mod3, x0, y0, x1, y0, c);
-                       devFunc0004(mod3, x0, y1, x1, y1, c);
-                       devFunc0004(mod3, x0, y0, x0, y1, c);
-                       devFunc0004(mod3, x1, y0, x1, y1, c);
-               }
-               break;
-
-       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] = 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;
-               mod3 = r->ireg[0x31] & 3;
-               x1 = r->ireg[0x32];
-               y1 = r->ireg[0x33];
-               if (mod3 == 0 && (r->ireg[0x31] & 0x20) == 0) {
-                       for (y = 0; y < y1; y++) {
-                               double dty = (y - dcy) * dcx;
-                               for (x = 0; x < x1; x++) {
-                                       double dtx = (x - dcx) * dcy;
-                                       if (dtx * dtx + dty * dty > dcxy) continue;
-                                       mainWindow.vram[(x + r->ireg[0x34]) + (y + r->ireg[0x35]) * mainWindow.xsize] = c;
-                               }
-                       }
-               }
-               else {
+        case 0xff00:
+            printf("R31=%d(dec)\n", r->ireg[0x31]);
+            break;
+            
+        case 0xff01:
+            /* return: R30, P31 */
+            if (r->buf0 == NULL)
+                r->buf0 = malloc(1024 * 1024);
+            if (r->mainArgc <= r->ireg[0x31]) {
+                fprintf(stderr, "devFunc: error: R30=ff01: argc error: R31=%08X\n", r->ireg[0x31]);
+                exit(1);
+            }
+            fp = fopen(r->mainArgv[r->ireg[0x31]], "rb");
+            if (fp == NULL) {
+                fprintf(stderr, "devFunc: error: R30=ff01: fopen error: '%s'\n", r->mainArgv[r->ireg[0x31]]);
+                exit(1);
+            }
+            i = (int)fread(r->buf0, 1, 1024 * 1024 - 4, fp);
+            if (i >= 1024 * 1024 - 4 || i < 0) {
+                fprintf(stderr, "devFunc: error: R30=ff01: fread error: '%s'\n", r->mainArgv[r->ireg[0x31]]);
+                exit(1);
+            }
+            fclose(fp);
+            r->preg[0x31].p = r->buf0;
+            r->preg[0x31].p0 = r->buf0;
+            r->preg[0x31].p1 = r->buf0 + i;
+            r->preg[0x31].typ = 3; // T_UINT8
+            r->ireg[0x30] = i;
+            break;
+            
+        case 0xff02:
+            /* return: none */
+            if (r->mainArgc <= r->ireg[0x31]) {
+                fprintf(stderr, "devFunc: error: R30=ff02: argc error: R31=%08X\n", r->ireg[0x31]);
+                exit(1);
+            }
+            fp = fopen(r->mainArgv[r->ireg[0x31]], "wb");
+            if (fp == NULL) {
+                fprintf(stderr, "devFunc: error: R30=ff02: fopen error: '%s'\n", r->mainArgv[r->ireg[0x31]]);
+                exit(1);
+            }
+            if (r->ireg[0x32] >= 1024 * 1024 || r->ireg[0x32] < 0){
+                fprintf(stderr, "devFunc: error: R30=ff02: fwrite error: R02=%08X\n", r->ireg[0x32]);
+                exit(1);
+            }
+            fwrite(r->preg[0x31].p, 1, r->ireg[0x32], fp);
+            fclose(fp);
+            break;
+            
+        case 0xff03:
+            /* return: P31 */
+            if (r->buf1 == NULL)
+                r->buf1 = malloc(1024 * 1024);
+            r->preg[0x31].p = r->buf1;
+            r->preg[0x31].p0 = r->buf1;
+            r->preg[0x31].p1 = r->buf1 + 1024 * 1024;
+            break;
+            
+        case 0xff04:
+            printf("P31.(p-p0)=%d(dec)\n", (int)(r->preg[0x31].p - r->preg[0x31].p0));
+            break;
+            
+        case 0xff05:
+            fwrite(r->preg[0x31].p, 1, r->ireg[0x31], stdout);
+            break;
+            
+        case 0xff06:
+            // R31はリターンコード.
+            // これを反映すべきだが、現状は手抜きでいつも正常終了.
+            longjmp(*(r->setjmpEnv), 1);
+            break;
+            
+        case 0xff07:
+            // マシになった文字列表示.OSASK文字列に対応.offにすれば通常の文字列処理もできる.現状はonのみサポート.
+            checkString(r, 0x31, 0x31);
+            devFunc0001(r->ireg[0x31], r->preg[0x31].p, r);
+            break;
+            
+        case 0xff08:
+            // JITC on JITC
+            // R31: 言語(back-end, front-end, ...
+            // R32: level
+            // R33: debugInfo1
+            checkString(r, 0x34, 0x31);
+            if (r->ireg[0x33] < 0 || r->ireg[0x33] > 15 || r->debugInfo1 > 15)
+                (*(r->errHndl))(r);
+            for (i = 0; i < r->maxLabels; i++)
+                r->label[i].opt = 0;
+            puc = r->preg[0x31].p;
+            i = jitCompiler(r->jitbuf, r->jitbuf1, puc, puc + r->ireg[0x34], puc, r->label, r->maxLabels, r->ireg[0x32], di1_serial, JITC_NOSTARTUP + 0);
+            if (i == 0) {
+                i = jitCompiler(r->jitbuf, r->jitbuf1, puc, puc + r->ireg[0x34], puc, r->label, r->maxLabels, r->ireg[0x32], di1_serial, JITC_NOSTARTUP + JITC_PHASE1 + 0);
+                if (i >= 0) {
+                    r->mapDi1s[r->debugInfo1][r->ireg[0x33]] = di1_serial;
+                    di1_serial++;
+                    r->ireg[0x30] = 0;
+                    r->preg[0x31].p = r->jitbuf;
+                    r->preg[0x31].typ = 0; // TYP_CODE
+                    r->preg[0x31].p0 = r->jitbuf;
+                    r->preg[0x31].p1 = r->jitbuf + 1;
+                    //int j; for (j = 0; j < i; j++) printf("%02X ", r->jitbuf[j]); putchar('\n');
+                    r->jitbuf += i;
+                    static unsigned char ff08_ret[3] = { 0x1e, 0x3f, 0x30 };
+                    i = jitCompiler(r->jitbuf, r->jitbuf1, ff08_ret, ff08_ret + 3, puc, r->label, r->maxLabels, r->ireg[0x32], -1, JITC_NOSTARTUP + JITC_PHASE1 + 0);
+                    r->jitbuf += i;
+                    break;
+                }
+            }
+            r->ireg[0x30] = -1;
+            break;
+            
+        case 0xff09:
+            // たぶんbit7を使ったテキストはうまく処理できない(これはもはや仕様にしても問題ないかも).
+            checkString(r, 0x31, 0x31);
+            len = devFunc0016(sizeof pucbuf, pucbuf, r->ireg[0x31], r->preg[0x31].p, r->ireg[0x32], (int *)r->preg[0x32].p, r);
+            devFunc0001(len, pucbuf, r);
+            break;
+            
+        case 0xff40:
+            /* R31とR32でサイズを指定 */
+            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 *)(mainWindow.vram = malloc(mainWindow.xsize * mainWindow.ysize * 4));
+            r->preg[0x31].p0 = r->preg[0x31].p;
+            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 = 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] = 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;
+            
+        case 0xff42:
+            if (r->ireg[0x32] == -1) {
+                r->autoSleep = 1;
+                longjmp(*(r->setjmpEnv), 1);
+            }
+            if (r->ireg[0x32] < 0)
+                (*(r->errHndl))(r);
+            r->autoSleep = 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);
+                drv_sleep(r->ireg[0x32]);
+                if ((r->ireg[0x31] & 2) != 0 && keybuf_c <= 0) continue;
+                break;
+            }
+            break;
+            
+        case 0xff43:
+            //  1:peek
+            //  2:stdin
+            // 4,8: ソース指定.
+            // 16: shift, lock系を有効化.
+            // 32: 左右のshift系を区別する.
+            if (r->ireg[0x31] == 2) {  // なぜ3にしなかったのか...
+                r->ireg[0x30] = fgetc(stdin);
+                if (r->ireg[0x30] == EOF)
+                    r->ireg[0x30] = -1;
+                break;
+            }
+            r->ireg[0x30] |= -1;
+            if (keybuf_c > 0) {
+                r->ireg[0x30] = keybuf[keybuf_r];
+                if ((r->ireg[0x31] & 16) == 0) r->ireg[0x30] &= 0x3e3effff;
+                if ((r->ireg[0x31] & 32) == 0) r->ireg[0x30] |= (r->ireg[0x30] >> 8) & 0xff0000;
+                if ((r->ireg[0x31] & 1) != 0) {
+                    keybuf_c--;
+                    keybuf_r = (keybuf_r + 1) & (KEYBUFSIZ - 1);
+                }
+            }
+            r->ireg[0x32] = r->ireg[0x33] = 0;
+            if (r->ireg[0x30] == 4132) r->ireg[0x32]--;
+            if (r->ireg[0x30] == 4133) r->ireg[0x33]--;
+            if (r->ireg[0x30] == 4134) r->ireg[0x32]++;
+            if (r->ireg[0x30] == 4135) r->ireg[0x33]++;
+            break;
+            
+        case 0xff44:
+            c = loadColor(r, 0x34);
+            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) 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] >= mainWindow.xsize || r->ireg[0x33] < 0 || r->ireg[0x33] >= mainWindow.ysize)
+                (*(r->errHndl))(r);
+            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];
+            x = r->ireg[0x32] << 10;
+            y = r->ireg[0x33] << 10;
+            if (dx < 0) dx = -dx;
+            if (dy < 0) dy = -dy;
+            if (dx >= dy) {
+                len = dx + 1; dx = 1024;
+                if (r->ireg[0x32] > r->ireg[0x34]) dx *= -1;
+                if (r->ireg[0x33] > r->ireg[0x35]) dy *= -1;
+                dy = (dy << 10) / len;
+            }
+            else {
+                len = dy + 1; dy = 1024;
+                if (r->ireg[0x33] > r->ireg[0x35]) dy *= -1;
+                if (r->ireg[0x32] > r->ireg[0x34]) dx *= -1;
+                dx = (dx << 10) / len;
+            }
+            if ((r->ireg[0x31] & 3) == 0) {
+                for (i = 0; i < len; i++) {
+                    mainWindow.vram[(x >> 10) + (y >> 10) * mainWindow.xsize] = c;
+                    x += dx;
+                    y += dy;
+                }
+                break;
+            }
+            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) 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;
+            }
+            break;
+            
+        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] = 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) {
+                devFunc0004(mod3, x0, y0, x1, y1, c);
+            }
+            else {     // drawRect
+                devFunc0004(mod3, x0, y0, x1, y0, c);
+                devFunc0004(mod3, x0, y1, x1, y1, c);
+                devFunc0004(mod3, x0, y0, x0, y1, c);
+                devFunc0004(mod3, x1, y0, x1, y1, c);
+            }
+            break;
+            
+        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] = 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;
+            mod3 = r->ireg[0x31] & 3;
+            x1 = r->ireg[0x32];
+            y1 = r->ireg[0x33];
+            if (mod3 == 0 && (r->ireg[0x31] & 0x20) == 0) {
+                for (y = 0; y < y1; y++) {
+                    double dty = (y - dcy) * dcx;
+                    for (x = 0; x < x1; x++) {
+                        double dtx = (x - dcx) * dcy;
+                        if (dtx * dtx + dty * dty > dcxy) continue;
+                        mainWindow.vram[(x + r->ireg[0x34]) + (y + r->ireg[0x35]) * mainWindow.xsize] = c;
+                    }
+                }
+            }
+            else {
 #define DRAWOVALPARAM  1
-                       double dcx1 = 0.5 * (r->ireg[0x32] - (1 + DRAWOVALPARAM * 2)), dcy1 = 0.5 * (r->ireg[0x33] - (1 + DRAWOVALPARAM * 2)), dcxy1 = (dcx1 + 0.5) * (dcy1 + 0.5) - 0.1;
-                       dcxy1 *= dcxy1;
-                       for (y = 0; y < y1; y++) {
-                               double dty = (y - dcy) * dcx;
-                               double dty1 = (y - dcy) * dcx1;
-                               for (x = 0; x < x1; x++) {
-                                       double dtx = (x - dcx) * dcy;
-                                       double dtx1 = (x - dcx) * dcy1;
-                                       if (dtx * dtx + dty * dty > dcxy) continue;
-                                       if (DRAWOVALPARAM <= x && x < x1 - DRAWOVALPARAM && DRAWOVALPARAM <= y && y < y1 - DRAWOVALPARAM) {
-                                               if (dtx1 * dtx1 + dty1 * dty1 < dcxy1) continue;
-                                       }
-                                       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;
-                               }
-                       }
-               }
-               break;
-
-       case 0xff48:    // drawString(opt:R31, xsiz:R32, ysiz:R33, x0:R34, y0:R35, c:R36, s.len:R37, s.p:P31)
-               checkString(r, 0x37, 0x31);
-               devFunc0006(r->ireg[0x31], r->ireg[0x32], r->ireg[0x33], r->ireg[0x34], r->ireg[0x35], loadColor(r, 0x36), r->ireg[0x37], r->preg[0x31].p, r);
-               break;
-
-       case 0xff49:    /* 適当な乱数を返す */
-               randStatNext();
-               unsigned u32t;
-               u32t = randStat.stat[0] + (randStat.stat[2] >> 8);
-               r->ireg[0x30] = randStat.stat[3] ^ u32t ^ (-((int)(u32t & 1)) & randStat.tmat);
-               if (r->ireg[0x31] > 0)
-                       r->ireg[0x30] = (r->ireg[0x30] & 0x7fffffff) % (r->ireg[0x31] + 1);
-               break;
-
-       case 0xff4a:    /* seedの指定 */
-               randStatInit(r->ireg[0x31]);
-               break;
-
-       case 0xff4b:    /* 適当なseedを提供 */
-               r->ireg[0x30] = (int)(time(NULL) ^ (long)0x55555555);
-               break;
-
-       case 0xff4c:
-               checkString(r, 0x37, 0x31);
-               len = devFunc0016(sizeof pucbuf, pucbuf, r->ireg[0x37], r->preg[0x31].p, r->ireg[0x38], (int *)r->preg[0x32].p, r);
-               devFunc0006(r->ireg[0x31], r->ireg[0x32], r->ireg[0x33], r->ireg[0x34], r->ireg[0x35], loadColor(r, 0x36), len, pucbuf, r);
-               break;
-
-       case 0xff4d:
-               // bitblt(mod, xsiz, ysiz, xscale, yscale, x0, y0, lineskip, inv, p_buf, typ0, p_table, typ1); 
-               // mod: 0x20:use_table, 0x40:inv_is_visible & typ1_is_color
-               puc = r->preg[0x31].p;
-               mod3 = r->ireg[0x31] & 3;
-               dx = r->ireg[0x34];
-               dy = r->ireg[0x35];
-               if (dy == 0) dy = dx;
-               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++) {
-                               x0 = x * dx + r->ireg[0x36];
-                               c = iColor1[*puc++];
-                               devFunc0004(mod3, x0, y0, x0 + dx, y0 + dy, c);
-                       }
-                       puc += r->ireg[0x38];
-               }
-               break;
-
-       default:
-               printf("devFunc: error: R30=%08X\n", r->ireg[0x30]);
-               exit(1);
-
+                double dcx1 = 0.5 * (r->ireg[0x32] - (1 + DRAWOVALPARAM * 2)), dcy1 = 0.5 * (r->ireg[0x33] - (1 + DRAWOVALPARAM * 2)), dcxy1 = (dcx1 + 0.5) * (dcy1 + 0.5) - 0.1;
+                dcxy1 *= dcxy1;
+                for (y = 0; y < y1; y++) {
+                    double dty = (y - dcy) * dcx;
+                    double dty1 = (y - dcy) * dcx1;
+                    for (x = 0; x < x1; x++) {
+                        double dtx = (x - dcx) * dcy;
+                        double dtx1 = (x - dcx) * dcy1;
+                        if (dtx * dtx + dty * dty > dcxy) continue;
+                        if (DRAWOVALPARAM <= x && x < x1 - DRAWOVALPARAM && DRAWOVALPARAM <= y && y < y1 - DRAWOVALPARAM) {
+                            if (dtx1 * dtx1 + dty1 * dty1 < dcxy1) continue;
+                        }
+                        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;
+                    }
+                }
+            }
+            break;
+            
+        case 0xff48:   // drawString(opt:R31, xsiz:R32, ysiz:R33, x0:R34, y0:R35, c:R36, s.len:R37, s.p:P31)
+            checkString(r, 0x37, 0x31);
+            devFunc0006(r->ireg[0x31], r->ireg[0x32], r->ireg[0x33], r->ireg[0x34], r->ireg[0x35], loadColor(r, 0x36), r->ireg[0x37], r->preg[0x31].p, r);
+            break;
+            
+        case 0xff49:
+            // **** junkApi_rand(i, max) ****
+            // 0 <= i <= maxとなるiを返す。
+            // max==0のとき、iはSINT32全体を範囲とする乱数となる。
+            
+            r->ireg[0x30] = randGetNextUInt32();
+            if (r->ireg[0x31] > 0){
+                r->ireg[0x30] = (r->ireg[0x30] & 0x7fffffff) % (r->ireg[0x31] + 1);
+            }
+            break;
+            
+        case 0xff4a:   /* seedの指定 */
+            randStatInit(r->ireg[0x31]);
+            break;
+            
+        case 0xff4b:   /* 適当なseedを提供 */
+            r->ireg[0x30] = (int)(time(NULL) ^ (long)0x55555555);
+            break;
+            
+        case 0xff4c:
+            checkString(r, 0x37, 0x31);
+            len = devFunc0016(sizeof pucbuf, pucbuf, r->ireg[0x37], r->preg[0x31].p, r->ireg[0x38], (int *)r->preg[0x32].p, r);
+            devFunc0006(r->ireg[0x31], r->ireg[0x32], r->ireg[0x33], r->ireg[0x34], r->ireg[0x35], loadColor(r, 0x36), len, pucbuf, r);
+            break;
+            
+        case 0xff4d:
+            // bitblt(mod, xsiz, ysiz, xscale, yscale, x0, y0, lineskip, inv, p_buf, typ0, p_table, typ1); 
+            // mod: 0x20:use_table, 0x40:inv_is_visible & typ1_is_color
+            puc = r->preg[0x31].p;
+            mod3 = r->ireg[0x31] & 3;
+            dx = r->ireg[0x34];
+            dy = r->ireg[0x35];
+            if (dy == 0) dy = dx;
+            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++) {
+                    x0 = x * dx + r->ireg[0x36];
+                    c = iColor1[*puc++];
+                    devFunc0004(mod3, x0, y0, x0 + dx, y0 + dy, c);
+                }
+                puc += r->ireg[0x38];
+            }
+            break;
+            
+        default:
+            printf("devFunc: error: R30=%08X\n", r->ireg[0x30]);
+            exit(1);
+            
        }
        return;
 }
diff --git a/jitc.c b/jitc.c
index d9668a7..8f6e3ff 100644 (file)
--- a/jitc.c
+++ b/jitc.c
@@ -50,7 +50,7 @@ int jitCompCmdLen(const unsigned char *src)
 //
 
 /* 他のCPUへ移植する人へ:
-以下は最適化のためのものなので、すべて0として簡単に移植しても問題ありません */
+ 以下は最適化のためのものなので、すべて0として簡単に移植しても問題ありません */
 #define        jitCompA0001_USE_R3F_CMPJMP             1*1
 #define        jitCompA0001_USE_R3F_IMM32              1*1
 #define jitCompA0001_USE_R3F_IMM8              1*1
@@ -328,7 +328,7 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr
        w.dst = w.dst0 = dst;
        w.err = 0;
        w.maxLabels = maxLabels;
-
+    
        if ((flags & JITC_NOSTARTUP) == 0) {
                jitCompPutByte1(w.dst, 0x60); /* PUSHAD(); */
                jitCompA000_loadRegCacheAll(&w); /* start-up */
@@ -351,1082 +351,1082 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr
                }
        prefix_continue:        // CND命令実行後ここに戻る
                switch (*src) {
-
-               case 0x00:      /* NOP */
-                       if (w.prefix != 0) { w.err = JITC_ERR_PREFIX; goto err_w; }     // 「条件付きでNOPを実行」するなんて、矛盾している!
-                       break;
-
-               case 0x01:      /* LB */
-                       
-                       /*
-                        * LB : ラベル設置命令。(6byte)
-                        * ・prefex = 1にする
-                        * ・timecount++し、timecountのチェックをする。
-                        * ・ラベル位置を登録する。
-                        * ・割り込みがある場合、このタイミングで割り込みを発生させる。
-                        *
-                        *  1   2       3       456
-                        *      LB      01      opt     imm32
-                        *
-                        */
-                       
-                       if (enter0 == NULL && (src[6] == 0x3c /* 多数のレジスタをスタックに退避 */ || (src[6] == 0xfe/* REMARK */ && src[7] == 0x01 && src[9] == 0x3c))) {       //beginFunc()中のLB
-                               // LB命令の後に0x3C命令・・・beginFunc()
-                               jitCompPutByte1(w.dst, 0xe9);   // (x86) JMP rel32 : 次の命令との相対オフセットだけ相対ニアジャンプする
-                               enter0 = w.dst;
-                               jitCompPutImm32(&w, 0); // 飛び相対座標が0 ・・・パイプラインのフラッシュ??
-                       }
-                       if (src[6] == 0x34) {   // LBの次の命令がDATA ・・・DAT_SA0(label, typ32, length) ・・・メモリ確保命令
-                               tmp_ucp = w.dst;
-                               jitCompPutByte1(w.dst, 0xe9);   // (x86) JMP rel32 : 次の命令との相対オフセットだけ相対ニアジャンプする
-                               i = jitCompGetImm32(&src[7]);   // type32 を取得
-                               j = 32;
-                               if (i != 1) {
-                                       i = jitCompA000_convTyp(i);
-                                       j = 0;
-                                       if (i == 2 || i == 3) { j = 1; }
-                                       if (i == 4 || i == 5) { j = 2; }
-                                       if (i == 6 || i == 7) { j = 4; }
-                               }
-                               j *= jitCompGetImm32(&src[11]);
-                               if (j <= 0) w.err = JITC_ERR_BADTYPE;
-                               jitCompPutImm32(&w, j);
+                
+            case 0x00: /* NOP */
+                if (w.prefix != 0) { w.err = JITC_ERR_PREFIX; goto err_w; }    // 「条件付きでNOPを実行」するなんて、矛盾している!
+                break;
+                
+            case 0x01: /* LB */
+                
+                /*
+                 * LB : ラベル設置命令。(6byte)
+                 * ・prefex = 1にする
+                 * ・timecount++し、timecountのチェックをする。
+                 * ・ラベル位置を登録する。
+                 * ・割り込みがある場合、このタイミングで割り込みを発生させる。
+                 *
+                 *  1  2       3       456
+                 *     LB      01      opt     imm32
+                 *
+                 */
+                
+                if (enter0 == NULL && (src[6] == 0x3c /* 多数のレジスタをスタックに退避 */ || (src[6] == 0xfe/* REMARK */ && src[7] == 0x01 && src[9] == 0x3c))) {      //beginFunc()中のLB
+                    // LB命令の後に0x3C命令・・・beginFunc()
+                    jitCompPutByte1(w.dst, 0xe9);      // (x86) JMP rel32 : 次の命令との相対オフセットだけ相対ニアジャンプする
+                    enter0 = w.dst;
+                    jitCompPutImm32(&w, 0);    // 飛び相対座標が0 ・・・パイプラインのフラッシュ??
+                }
+                if (src[6] == 0x34) {  // LBの次の命令がDATA ・・・DAT_SA0(label, typ32, length) ・・・メモリ確保命令
+                    tmp_ucp = w.dst;
+                    jitCompPutByte1(w.dst, 0xe9);      // (x86) JMP rel32 : 次の命令との相対オフセットだけ相対ニアジャンプする
+                    i = jitCompGetImm32(&src[7]);      // type32 を取得
+                    j = 32;
+                    if (i != 1) {
+                        i = jitCompA000_convTyp(i);
+                        j = 0;
+                        if (i == 2 || i == 3) { j = 1; }
+                        if (i == 4 || i == 5) { j = 2; }
+                        if (i == 6 || i == 7) { j = 4; }
+                    }
+                    j *= jitCompGetImm32(&src[11]);
+                    if (j <= 0) w.err = JITC_ERR_BADTYPE;
+                    jitCompPutImm32(&w, j);
 #if (jitCompA0001_OPTIMIZE_JMP != 0)
-                               if (j <= 127 - jitCompA0001_OPTIMIZE_ALIGN) {
-                                       w.dst -= 5;
-                                       jitCompPutByte2(w.dst, 0xeb, j);
-                               }
+                    if (j <= 127 - jitCompA0001_OPTIMIZE_ALIGN) {
+                        w.dst -= 5;
+                        jitCompPutByte2(w.dst, 0xeb, j);
+                    }
 #endif
-                       }
+                }
 #if (jitCompA0001_OPTIMIZE_ALIGN != 0)
-                       for (;;) {
-                               i = ((int)w.dst) & (jitCompA0001_OPTIMIZE_ALIGN - 1); /* ALIGNで割ったあまりを計算 */
-                               if (i == 0) break;
-                               i = jitCompA0001_OPTIMIZE_ALIGN - i;
-                               if (i == 1) { jitCompPutByte1(w.dst, 0x90); j += i; } /* NOP(); */
-                               if (i == 2) { jitCompPutByte2(w.dst, 0x89, 0xc0); j += i; } /* MOV(EAX, EAX); */
-                               if (i == 3) { jitCompPutByte3(w.dst, 0x8d, 0x76, 0x00); j += i; } /* LEA(ESI, [ESI+0]); */
-                               if (i == 4) { jitCompPutByte4(w.dst, 0x8d, 0x74, 0x26, 0x00); j += i; } /* LEA(ESI, [ESI*1+0]); */
-                               if (i == 5) { jitCompPutByte1(w.dst, 0x0d); jitCompPutImm32(&w, 0); j += i; } /* OR(EAX, 0); */
-                               if (i == 6) { jitCompPutByte2(w.dst, 0x8d, 0xb6); jitCompPutImm32(&w, 0); j += i; } /* LEA(ESI, [ESI+0]); */
-                               if (i >= 7) { jitCompPutByte3(w.dst, 0x8d, 0xb4, 0x26); jitCompPutImm32(&w, 0); j += 7; } /* LEA(ESI, [ESI*1+0]); */
-                       }
+                for (;;) {
+                    i = ((int)w.dst) & (jitCompA0001_OPTIMIZE_ALIGN - 1); /* ALIGNで割ったあまりを計算 */
+                    if (i == 0) break;
+                    i = jitCompA0001_OPTIMIZE_ALIGN - i;
+                    if (i == 1) { jitCompPutByte1(w.dst, 0x90); j += i; } /* NOP(); */
+                    if (i == 2) { jitCompPutByte2(w.dst, 0x89, 0xc0); j += i; } /* MOV(EAX, EAX); */
+                    if (i == 3) { jitCompPutByte3(w.dst, 0x8d, 0x76, 0x00); j += i; } /* LEA(ESI, [ESI+0]); */
+                    if (i == 4) { jitCompPutByte4(w.dst, 0x8d, 0x74, 0x26, 0x00); j += i; } /* LEA(ESI, [ESI*1+0]); */
+                    if (i == 5) { jitCompPutByte1(w.dst, 0x0d); jitCompPutImm32(&w, 0); j += i; } /* OR(EAX, 0); */
+                    if (i == 6) { jitCompPutByte2(w.dst, 0x8d, 0xb6); jitCompPutImm32(&w, 0); j += i; } /* LEA(ESI, [ESI+0]); */
+                    if (i >= 7) { jitCompPutByte3(w.dst, 0x8d, 0xb4, 0x26); jitCompPutImm32(&w, 0); j += 7; } /* LEA(ESI, [ESI*1+0]); */
+                }
 #endif
-                       if (src[6] == 0x34) {
-                               tmp_ucp[1] = j & 0xff;
-                               if (*tmp_ucp == 0xe9) {
-                                       tmp_ucp[2] = (j >> 8) & 0xff;
-                                       tmp_ucp[3] = (j >> 16) & 0xff;
-                                       tmp_ucp[4] = (j >> 24) & 0xff;
-                               }
-                       }
-                       if ((flags & JITC_PHASE1) == 0) {
-                               i = jitCompGetLabelNum(&w, src + 2);
-                               //printf("i=%06X %06X\n", i, src-src0);
-                               if (label[i].opt != 0 && w.err == 0) { w.err = JITC_ERR_LABELREDEF; goto err_w; }
-                               if (w.prefix != 0) { w.err = JITC_ERR_PREFIX; goto err_w; }
-                               label[i].opt = src[1] + 1;
-                               label[i].typ = 0; /* TYP_CODE */
-                               label[i].p = w.dst;
-                               label[i].p1 = w.dst + 1;
-                               lastlabel = i;
-                       }
-                       cmp0reg = -1;
-                       timecount = 0;
-                       /* 未完成(timeoutチェックコードを入れる) */
-                       break;
-
-               case 0x02:      /* LIMM */      
-                       
-                       /*
-                        * LIMM : 定数即値代入命令(6byte)
-                        * 
-                        *      1       2               3456
-                        *      02      reg0R   imm32
-                        *
-                        * ・reg3F は条件比較慣用句指定用&演算命令即値慣用句指定用。よってCND命令の直後では使用できない。
-                        */
-                       
-                       if (src[1] == 0x3f && w.prefix != 0) w.err = JITC_ERR_PREFIX;   // CND命令の直後でR3Fを書き換えるなんて変だよね
-
+                if (src[6] == 0x34) {
+                    tmp_ucp[1] = j & 0xff;
+                    if (*tmp_ucp == 0xe9) {
+                        tmp_ucp[2] = (j >> 8) & 0xff;
+                        tmp_ucp[3] = (j >> 16) & 0xff;
+                        tmp_ucp[4] = (j >> 24) & 0xff;
+                    }
+                }
+                if ((flags & JITC_PHASE1) == 0) {
+                    i = jitCompGetLabelNum(&w, src + 2);
+                    //printf("i=%06X %06X\n", i, src-src0);
+                    if (label[i].opt != 0 && w.err == 0) { w.err = JITC_ERR_LABELREDEF; goto err_w; }
+                    if (w.prefix != 0) { w.err = JITC_ERR_PREFIX; goto err_w; }
+                    label[i].opt = src[1] + 1;
+                    label[i].typ = 0; /* TYP_CODE */
+                    label[i].p = w.dst;
+                    label[i].p1 = w.dst + 1;
+                    lastlabel = i;
+                }
+                cmp0reg = -1;
+                timecount = 0;
+                /* 未完成(timeoutチェックコードを入れる) */
+                break;
+                
+            case 0x02: /* LIMM */
+                
+                /*
+                 * LIMM : 定数即値代入命令(6byte)
+                 *
+                 *     1       2               3456
+                 *     02      reg0R   imm32
+                 *
+                 * ・reg3F は条件比較慣用句指定用&演算命令即値慣用句指定用。よってCND命令の直後では使用できない。
+                 */
+                
+                if (src[1] == 0x3f && w.prefix != 0) w.err = JITC_ERR_PREFIX;  // CND命令の直後でR3Fを書き換えるなんて変だよね
+                
 #if (jitCompA0001_USE_R3F_IMM32 != 0)
-                       if (src[1] == 0x3f) {           // R3Fへの代入は例外敵に、 w.r3f を使用
-                               w.r3f = jitCompGetImm32(src + 2);
-                               break;
-                       }
+                if (src[1] == 0x3f) {          // R3Fへの代入は例外敵に、 w.r3f を使用
+                    w.r3f = jitCompGetImm32(src + 2);
+                    break;
+                }
 #endif
-                       i = jitCompGetImm32(src + 2);   // 与えられた即値(第二引数)を取得
-
-                       /* R00-R02 なら EBX, ECX, EDX 、それ以外なら EAX のレジスタIDを reg0 に代入 */
-                       reg0 = jitCompA000_selectRegCache(src[1], 0 /* EAX */);
-
+                i = jitCompGetImm32(src + 2);  // 与えられた即値(第二引数)を取得
+                
+                /* R00-R02 なら EBX, ECX, EDX 、それ以外なら EAX のレジスタIDを reg0 に代入 */
+                reg0 = jitCompA000_selectRegCache(src[1], 0 /* EAX */);
+                
 #if (jitCompA0001_OPTIMIZE_MOV != 0)
-                       if (i == 0) {
-                               jitCompPutByte2(w.dst, 0x31, 0xc0 | reg0 << 3 | reg0);  /* XOR(reg0, reg0); */
-                               jitCompA0001_movRxxEax(&w, src[1]);
-                               break;
-                       }
+                if (i == 0) {
+                    jitCompPutByte2(w.dst, 0x31, 0xc0 | reg0 << 3 | reg0);     /* XOR(reg0, reg0); */
+                    jitCompA0001_movRxxEax(&w, src[1]);
+                    break;
+                }
 #endif
-                       
-                       /* reg0 のレジスタに対応したMOV命令を発行 */
-                       jitCompPutByte1(w.dst, 0xb8 | reg0);    /* MOV(reg0, ?);  == 10111000b+wr imm32 */
-                       jitCompPutImm32(&w, i);
-
-                       if (reg0 == 0)  // R03以降の、レジスタの内容をメモリ上に格納してエミュレートする場合
-                               
-                               jitCompA0001_movRxxEax(&w, src[1]);
-                       break;
-
-               case 0x03:      /* PLIMM */     /* 未完成(plsまで対応) */
-
-                       /*
-                       * PLIMM : ラベル番号代入命令(6byte)
-                       *
-                       *       1       2       3456
-                       *       03      PXX     imm32
-                       *
-                       * ・P28 はAPI用
-                       * ・P30 はリターンアドレス
-                       * ・P3F はプログラムカウンタ
-                       */
-
-                       i = jitCompGetLabelNum(&w, src + 2);    // Pxxに代入するラベルの番号(第二引数)
-                       if ((flags & JITC_PHASE1) != 0 && w.err == 0) { // Phase 1であるならば
-                               if (label[i].opt == 0) { w.err = JITC_ERR_LABELNODEF; goto err_w; }             // 指定されたラベル番号は存在しない
-                               if (src[1] != 0x3f && label[i].opt != 2) { w.err = JITC_ERR_LABELTYP; goto err_w; }     // 
-                               if (src[1] == 0x3f && label[i].typ != 0) { w.err = JITC_ERR_LABELTYP; goto err_w; } // プログラムカウンタに TYP_CODEでない値は代入できない
-                       }
-                       if (src[1] == 0x3f) {   // プログラムカウンタへの代入なら
-                               if (w.prefix == 0) {    // CND命令による条件付きでなければ、即座に移動
-                                       jitCompPutByte1(w.dst, 0xe9); /* JMP(?); */
-                               }
-                               else {  // 直前はCND命令。
-                                       
-                                       /*
-                                        * CND命令
-                                        *      1       2       
-                                        *      04      reg0R
-                                        *
-                                        * いま、dstの末端はJZ命令になっている。 0x0F 0x84 cd
-                                        */
-
-                                        // JZのとび先アドレスの書き換え?
-                                       w.dst[-1] = w.dst[-2] ^ 0xf1; /* 74->85, 75->84 */
-                                       w.dst[-2] = 0x0f;
-
-                                       w.prefix = 0;
-                               }
-                               j = 0;
-                               if ((flags & JITC_PHASE1) != 0 || (((flags & JITC_PHASE1) == 0) && label[i].opt != 0))  // label番号iが確保されていれば (このif文は意味をなさない)
-                                       j = label[i].p - (w.dst + 4);   // j はとび先の相対番地 
-                               jitCompPutImm32(&w, j); // JMP もしくは JZ 命令のアドレス部を記述
+                
+                /* reg0 のレジスタに対応したMOV命令を発行 */
+                jitCompPutByte1(w.dst, 0xb8 | reg0);   /* MOV(reg0, ?);  == 10111000b+wr imm32 */
+                jitCompPutImm32(&w, i);
+                
+                if (reg0 == 0) // R03以降の、レジスタの内容をメモリ上に格納してエミュレートする場合
+                    
+                    jitCompA0001_movRxxEax(&w, src[1]);
+                break;
+                
+            case 0x03: /* PLIMM */     /* 未完成(plsまで対応) */
+                
+                /*
+                 * PLIMM : ラベル番号代入命令(6byte)
+                 *
+                 *     1       2       3456
+                 *     03      PXX     imm32
+                 *
+                 * ・P28 はAPI用
+                 * ・P30 はリターンアドレス
+                 * ・P3F はプログラムカウンタ
+                 */
+                
+                i = jitCompGetLabelNum(&w, src + 2);   // Pxxに代入するラベルの番号(第二引数)
+                if ((flags & JITC_PHASE1) != 0 && w.err == 0) {        // Phase 1であるならば
+                    if (label[i].opt == 0) { w.err = JITC_ERR_LABELNODEF; goto err_w; }                // 指定されたラベル番号は存在しない
+                    if (src[1] != 0x3f && label[i].opt != 2) { w.err = JITC_ERR_LABELTYP; goto err_w; }        //
+                    if (src[1] == 0x3f && label[i].typ != 0) { w.err = JITC_ERR_LABELTYP; goto err_w; } // プログラムカウンタに TYP_CODEでない値は代入できない
+                }
+                if (src[1] == 0x3f) {  // プログラムカウンタへの代入なら
+                    if (w.prefix == 0) {       // CND命令による条件付きでなければ、即座に移動
+                        jitCompPutByte1(w.dst, 0xe9); /* JMP(?); */
+                    }
+                    else {     // 直前はCND命令。
+                        
+                        /*
+                         * CND命令
+                         *     1       2
+                         *     04      reg0R
+                         *
+                         * いま、dstの末端はJZ命令になっている。 0x0F 0x84 cd
+                         */
+                        
+                        // JZのとび先アドレスの書き換え?
+                        w.dst[-1] = w.dst[-2] ^ 0xf1; /* 74->85, 75->84 */
+                        w.dst[-2] = 0x0f;
+                        
+                        w.prefix = 0;
+                    }
+                    j = 0;
+                    if ((flags & JITC_PHASE1) != 0 || (((flags & JITC_PHASE1) == 0) && label[i].opt != 0))     // label番号iが確保されていれば (このif文は意味をなさない)
+                        j = label[i].p - (w.dst + 4);  // j はとび先の相対番地
+                    jitCompPutImm32(&w, j);    // JMP もしくは JZ 命令のアドレス部を記述
 #if (jitCompA0001_OPTIMIZE_JMP != 0)
-                               if (-128 - 3 <= j && j < 0) {
-                                       if (w.dst[-5] == 0xe9) {
-                                               j += 3;
-                                               w.dst -= 5;
-                                               jitCompPutByte1(w.dst, 0xeb); /* JMP(?); */
-                                       }
-                                       else {
-                                               j += 4;
-                                               w.dst -= 6;
-                                               jitCompPutByte1(w.dst, w.dst[1] ^ 0xf0);
-                                       }
-                                       jitCompPutByte1(w.dst, j & 0xff);
-                               }
+                    if (-128 - 3 <= j && j < 0) {
+                        if (w.dst[-5] == 0xe9) {
+                            j += 3;
+                            w.dst -= 5;
+                            jitCompPutByte1(w.dst, 0xeb); /* JMP(?); */
+                        }
+                        else {
+                            j += 4;
+                            w.dst -= 6;
+                            jitCompPutByte1(w.dst, w.dst[1] ^ 0xf0);
+                        }
+                        jitCompPutByte1(w.dst, j & 0xff);
+                    }
 #endif
-                       }
-                       else {  // プログラムカウンタ以外への代入
-                               
-                               // 代入先が P01, P02なら ESI, EDI,それ以外ならEAXを指定
-                               reg0 = jitCompA000_selectPRegCache(src[1], 0 /* EAX */);
-                               jitCompPutByte1(w.dst, 0xb8 | reg0);    /* MOV(reg0, ?); */
-                               jitCompPutImm32(&w, (int)label[i].p);   // ラベルのパスを各レジスタに代入
-
-                               // レジスタへの代入をメモリでエミュレーションする場合は、スタックに積む。
-                               if (reg0 == 0)
-                                       jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32, 0); /* MOV([EBP+?], EAX); */
-
-                               if (level < JITC_LV_FASTEST) {
-                                       jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + 8, reg0); /* MOV([EBP+?], reg0); */ /* p0 */
-                                       jitCompPutByte1(w.dst, 0xb8); /* MOV(EAX, ?); */
-                                       jitCompPutImm32(&w, label[i].typ);
-                                       jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + 4, 0); /* MOV([EBP+?], EAX); */ /* typ */
-                                       jitCompPutByte1(w.dst, 0xb8); /* MOV(EAX, ?); */
-                                       jitCompPutImm32(&w, (int)label[i].p1);
-                                       jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + 12, 0); /* MOV([EBP+?], EAX); */ /* p1 */
-                                       jitCompPutByte2(w.dst, 0x31, 0xc0);     /* XOR(EAX, EAX); */
-                                       jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + 16, 0); /* MOV([EBP+?], EAX); */ /* liveSign */
-                                       jitCompA0001_movReg32EbpDisp(&w, 0, 2320); /* MOV(EAX, ptrCtrl); */
-                                       jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + 20, 0); /* MOV([EBP+?], EAX); */ /* pls */
-                               }
-                       }
-                       break;
-
-               case 0x04:      /* CND (prefix) */
-
-                       /*
-                        * CND命令
-                        * 与えられたRxxの最下位ビットが1であれば後続の命令を実行、そうでなければ飛ばす。
-                        */
-                       
-                       if (src[1] >= 0x40) w.err = JITC_ERR_REGNUM;    // R00-R3F 以外のレジスタは比較対象にできない
-
-                       // 比較対象のレジスタがメモリ上にあれば-1, それ以外なら適切なレジスタ番号を返す
-                       reg0 = jitCompA000_selectRegCache(src[1], -1 /* mem */);
-
-                       /* TEST命令を発行 */
-                       if (reg0 < 0) { //比較対象のレジスタはメモリ上にある
-                               jitCompPutByte1(w.dst, 0xf7); /* TEST([EBP+?],1); */
-                               jitCompA0001_85DispN(&w, src[1] * 4, 0);
-                       }
-                       else {
-                               jitCompPutByte2(w.dst, 0xf7, 0xc0 | reg0); /* TEST(reg0,1); */
-                       }
-                       jitCompPutImm32(&w, 1);
-
-                       /* JZ命令を発行 */
-                       jitCompPutByte2(w.dst, 0x74, 0x00);     /* JZ($+2) */
-                       cmp0reg = -1;
-                       if (w.err != 0) goto err_w;
-                       src += 2;
-                       w.prefix = 1;   // プリフィックスをセット
-                       w.dst0 = w.dst; 
-                       goto prefix_continue;
-
-               case 0x08: /* LMEM */   /* 完成 */
-                       i = jitCompGetImm32(src + 2);
-                       if (i == 0x0001) w.err = JITC_ERR_BADTYPE;
-                       if (level < JITC_LV_FASTER) {
-                               jitCompA0001_checkType(&w, src[6], i, 0); // read
-                               cmp0reg = -1;
-                       }
-                       reg0 = jitCompA000_selectRegCache(src[1], 0 /* EAX */);
-                       reg1 = jitCompA000_selectPRegCache(src[6], 2 /* EDX */);
-                       if (reg0 != 0 /* EAX */ && reg1 == 2 /* EDX */)
-                               reg1 = 0; /* EAX */
-                       if (reg1 == 2 /* EDX */)
-                               jitCompA000_storeRegCacheEdx(&w);
-                       if (reg1 <= 3 /* EAX, EDX */)
-                               jitCompA0001_movReg32EbpDisp(&w, reg1, 256 + src[6] * 32 + 0); /* MOV(reg1, [EBP+?]); */
-                       if (level < JITC_LV_FASTER)
-                               jitCompA0001_checkLimit(&w, reg1, src[6]);
-                       i = jitCompA000_convTyp(jitCompGetImm32(src + 2));
-                       switch (i) {
-                       case 0x0002:
-                               jitCompPutByte3(w.dst, 0x0f, 0xbe, reg0 << 3 | reg1);   /* MOVSX(reg0,BYTE [reg1]); */
-                               break;
-                       case 0x0003:
-                               jitCompPutByte3(w.dst, 0x0f, 0xb6, reg0 << 3 | reg1);   /* MOVZX(reg0,BYTE [reg1]); */
-                               break;
-                       case 0x0004:
-                               jitCompPutByte3(w.dst, 0x0f, 0xbf, reg0 << 3 | reg1);   /* MOVSX(reg0,WORD [reg1]); */
-                               break;
-                       case 0x0005:
-                               jitCompPutByte3(w.dst, 0x0f, 0xb7, reg0 << 3 | reg1);   /* MOVZX(reg0,WORD [reg1]); */
-                               break;
-                       case 0x0006:
-                       case 0x0007:
-                               jitCompPutByte2(w.dst, 0x8b, reg0 << 3 | reg1); /* MOV(reg0, [reg1]); */
-                               break;
-                       default:
-                               w.err = JITC_ERR_BADTYPE;
-                       }
-                       if (reg0 == 0 /* EAX */)
-                               jitCompA0001_movRxxEax(&w, src[1]);
-                       if (reg1 == 2 /* EDX */)
-                               jitCompA000_loadRegCacheEdx(&w);
-                       break;
-
-               case 0x09: /* SMEM */   /* 完成 */
-                       i = jitCompGetImm32(src + 2);
-                       if (i == 0x0001) w.err = JITC_ERR_BADTYPE;
-                       if (level < JITC_LV_FASTER) {
-                               jitCompA0001_checkType(&w, src[6], i, 1); // write
-                               cmp0reg = -1;
-                       }
-                       reg0 = jitCompA000_selectRegCache(src[1], 0 /* EAX */);
-                       reg1 = jitCompA000_selectPRegCache(src[6], 2 /* EDX */);
-                       if (reg0 != 0 /* EAX */ && reg1 == 2 /* EDX */)
-                               reg1 = 0; /* EAX */
-                       if (reg1 == 2 /* EDX */)
-                               jitCompA000_storeRegCacheEdx(&w);
-                       if (reg1 <= 3 /* EAX, EDX */)
-                               jitCompA0001_movReg32EbpDisp(&w, reg1, 256 + src[6] * 32 + 0); /* MOV(reg1, [EBP+?]); */
-                       if (level < JITC_LV_FASTER)
-                               jitCompA0001_checkLimit(&w, reg1, src[6]);
-                       if (reg0 == 0 /* EAX */)
-                               jitCompA0001_movEaxRxx(&w, src[1]);
-                       /* 値の範囲チェック */
-                       i = jitCompA000_convTyp(jitCompGetImm32(src + 2));
-                       switch (i) {
-                       case 0x0002:
-                       case 0x0003:
-                               jitCompPutByte2(w.dst, 0x88, reg0 << 3 | reg1); /* MOV([reg1], BYTE(reg0)); */
-                               break;
-                       case 0x0004:
-                       case 0x0005:
-                               jitCompPutByte3(w.dst, 0x66, 0x89, reg0 << 3 | reg1);   /* MOV([reg1], WORD(reg0)); */
-                               break;
-                       case 0x0006:
-                       case 0x0007:
-                               jitCompPutByte2(w.dst, 0x89, reg0 << 3 | reg1); /* MOV([reg1], reg0); */
-                               break;
-                       default:
-                               w.err = JITC_ERR_BADTYPE;
-                       }
-                       if (reg1 == 2 /* EDX */)
-                               jitCompA000_loadRegCacheEdx(&w);
-                       break;
-
-               case 0x0a: /* PLMEM */  /* 完成 */
-                       i = jitCompGetImm32(src + 2);
-                       if (i != 0x0001) w.err = JITC_ERR_BADTYPE;
-                       if (level < JITC_LV_FASTER) {
-                               jitCompA0001_checkType(&w, src[6], i, 0); // read
-                               cmp0reg = -1;
-                       }
-                       reg0 = jitCompA000_selectPRegCache(src[1], 0 /* EAX */);
-                       reg1 = jitCompA000_selectPRegCache(src[6], 2 /* EDX */);
-                       //      if (reg0 != 0 /* EAX */ && reg1 == 2 /* EDX */) /* これをやってはいけない!(by K, 2013.08.02) */
-                       //              reg1 = 0; /* EAX */
-                       if (reg0 == reg1 && reg0 != 0) {        // bugfix: hinted by yao, 2013.09.14. thanks!
-                               jitCompA000_storePRegCacheAll(&w);
-                               reg1 = 2; /* EDX */
-                       }
-                       if (reg1 == 2 /* EDX */)
-                               jitCompA000_storeRegCacheEdx(&w);
-                       if (reg1 <= 3 /* EAX, EDX */)
-                               jitCompA0001_movReg32EbpDisp(&w, reg1, 256 + src[6] * 32 + 0); /* MOV(reg1, [EBP+?]); */
-                       if (level < JITC_LV_FASTER)
-                               jitCompA0001_checkLimit(&w, reg1, src[6]);
-                       jitCompPutByte2(w.dst, 0x8b, reg0 << 3 | reg1); /* MOV(reg0, [reg1]); */
-                       if (reg0 == 0 /* EAX */)
-                               jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + 0, 0); /* MOV([EBP+?], EAX); */
-                       for (i = 4; i < 32; i += 4) {
-                               jitCompPutByte3(w.dst, 0x8b, 0x40 | reg1, i);   /* MOV(EAX, [reg1+?]); */
-                               jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + i, 0 /* EAX */); /* MOV([EBP+?], EAX); */
-                       }
-                       if (reg1 == 2 /* EDX */)
-                               jitCompA000_loadRegCacheEdx(&w);
-                       break;
-
-               case 0x0b: /* PSMEM */  /* 完成 */
-                       i = jitCompGetImm32(src + 2);
-                       if (i != 0x0001) w.err = JITC_ERR_BADTYPE;
-                       if (level < JITC_LV_FASTER) {
-                               jitCompA0001_checkType(&w, src[6], i, 1); // write
-                               cmp0reg = -1;
-                       }
-                       reg0 = jitCompA000_selectPRegCache(src[1], 0 /* EAX */);
-                       reg1 = jitCompA000_selectPRegCache(src[6], 2 /* EDX */);
-                       //      if (reg0 != 0 /* EAX */ && reg1 == 2 /* EDX */) /* これをやってはいけない!(by K, 2013.08.02) */
-                       //              reg1 = 0; /* EAX */
-                       if (reg1 == 2 /* EDX */)
-                               jitCompA000_storeRegCacheEdx(&w);
-                       if (reg1 <= 3 /* EAX, EDX */)
-                               jitCompA0001_movReg32EbpDisp(&w, reg1, 256 + src[6] * 32 + 0); /* MOV(reg1, [EBP+?]); */
-                       if (level < JITC_LV_FASTER)
-                               jitCompA0001_checkLimit(&w, reg1, src[6]);
-                       if (reg0 == 0 /* EAX */)
-                               jitCompA0001_movReg32EbpDisp(&w, reg0, 256 + src[1] * 32 + 0); /* MOV(reg0, [EBP+?]); */
-                       jitCompPutByte2(w.dst, 0x89, reg0 << 3 | reg1); /* MOV([reg1], reg0); */
-                       for (i = 4; i < 32; i += 4) {
-                               jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, 256 + src[1] * 32 + i); /* MOV(EAX, [EBP+?]); */
-                               jitCompPutByte3(w.dst, 0x89, 0x40 | reg1, i);   /* MOV([reg1+?], EAX); */
-                       }
-                       if (reg1 == 2 /* EDX */)
-                               jitCompA000_loadRegCacheEdx(&w);
-                       break;
-
-               case 0x0e: /* PADD */           /* 完成 */
-                       if (level < JITC_LV_FASTER) {
-                               jitCompA0001_checkType0(&w, src[6], jitCompGetImm32(src + 2), 2); // other, aliveテストはとりあえずしない.
-                               cmp0reg = -1;
-                       }
-                       reg0 = jitCompA000_selectPRegCache(src[1], 0 /* EAX */);
-                       reg1 = jitCompA000_selectPRegCache(src[6], -1 /* mem */);
-                       if (reg1 < 0 /* mem */)
-                               jitCompA0001_movReg32EbpDisp(&w, reg0, 256 + src[6] * 32 + 0); /* MOV(reg0, [EBP+?]); */
-                       if (reg1 >= 0 && reg0 != reg1) {
-                               jitCompPutByte2(w.dst, 0x89, 0xc0 | reg1 << 3 | reg0); /* MOV(reg0, reg1); */
-                       }
-                       i = jitCompGetImm32(src + 2);
-                       j = -1;
-                       if (i == 1)
-                               j = 5; /* 32 */
-                       else {
-                               i = jitCompA000_convTyp(i);
-                               if (0x0002 <= i && i <= 0x0007)
-                                       j = (i - 0x0002) >> 1;
-                       }
-                       if (j < 0) { w.err = JITC_ERR_BADTYPE; goto err_w; }
+                }
+                else { // プログラムカウンタ以外への代入
+                    
+                    // 代入先が P01, P02なら ESI, EDI,それ以外ならEAXを指定
+                    reg0 = jitCompA000_selectPRegCache(src[1], 0 /* EAX */);
+                    jitCompPutByte1(w.dst, 0xb8 | reg0);       /* MOV(reg0, ?); */
+                    jitCompPutImm32(&w, (int)label[i].p);      // ラベルのパスを各レジスタに代入
+                    
+                    // レジスタへの代入をメモリでエミュレーションする場合は、スタックに積む。
+                    if (reg0 == 0)
+                        jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32, 0); /* MOV([EBP+?], EAX); */
+                    
+                    if (level < JITC_LV_FASTEST) {
+                        jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + 8, reg0); /* MOV([EBP+?], reg0); */ /* p0 */
+                        jitCompPutByte1(w.dst, 0xb8); /* MOV(EAX, ?); */
+                        jitCompPutImm32(&w, label[i].typ);
+                        jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + 4, 0); /* MOV([EBP+?], EAX); */ /* typ */
+                        jitCompPutByte1(w.dst, 0xb8); /* MOV(EAX, ?); */
+                        jitCompPutImm32(&w, (int)label[i].p1);
+                        jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + 12, 0); /* MOV([EBP+?], EAX); */ /* p1 */
+                        jitCompPutByte2(w.dst, 0x31, 0xc0);    /* XOR(EAX, EAX); */
+                        jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + 16, 0); /* MOV([EBP+?], EAX); */ /* liveSign */
+                        jitCompA0001_movReg32EbpDisp(&w, 0, 2320); /* MOV(EAX, ptrCtrl); */
+                        jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + 20, 0); /* MOV([EBP+?], EAX); */ /* pls */
+                    }
+                }
+                break;
+                
+            case 0x04: /* CND (prefix) */
+                
+                /*
+                 * CND命令
+                 * 与えられたRxxの最下位ビットが1であれば後続の命令を実行、そうでなければ飛ばす。
+                 */
+                
+                if (src[1] >= 0x40) w.err = JITC_ERR_REGNUM;   // R00-R3F 以外のレジスタは比較対象にできない
+                
+                // 比較対象のレジスタがメモリ上にあれば-1, それ以外なら適切なレジスタ番号を返す
+                reg0 = jitCompA000_selectRegCache(src[1], -1 /* mem */);
+                
+                /* TEST命令を発行 */
+                if (reg0 < 0) {        //比較対象のレジスタはメモリ上にある
+                    jitCompPutByte1(w.dst, 0xf7); /* TEST([EBP+?],1); */
+                    jitCompA0001_85DispN(&w, src[1] * 4, 0);
+                }
+                else {
+                    jitCompPutByte2(w.dst, 0xf7, 0xc0 | reg0); /* TEST(reg0,1); */
+                }
+                jitCompPutImm32(&w, 1);
+                
+                /* JZ命令を発行 */
+                jitCompPutByte2(w.dst, 0x74, 0x00);    /* JZ($+2) */
+                cmp0reg = -1;
+                if (w.err != 0) goto err_w;
+                src += 2;
+                w.prefix = 1;  // プリフィックスをセット
+                w.dst0 = w.dst;
+                goto prefix_continue;
+                
+            case 0x08: /* LMEM */      /* 完成 */
+                i = jitCompGetImm32(src + 2);
+                if (i == 0x0001) w.err = JITC_ERR_BADTYPE;
+                if (level < JITC_LV_FASTER) {
+                    jitCompA0001_checkType(&w, src[6], i, 0); // read
+                    cmp0reg = -1;
+                }
+                reg0 = jitCompA000_selectRegCache(src[1], 0 /* EAX */);
+                reg1 = jitCompA000_selectPRegCache(src[6], 2 /* EDX */);
+                if (reg0 != 0 /* EAX */ && reg1 == 2 /* EDX */)
+                    reg1 = 0; /* EAX */
+                if (reg1 == 2 /* EDX */)
+                    jitCompA000_storeRegCacheEdx(&w);
+                if (reg1 <= 3 /* EAX, EDX */)
+                    jitCompA0001_movReg32EbpDisp(&w, reg1, 256 + src[6] * 32 + 0); /* MOV(reg1, [EBP+?]); */
+                if (level < JITC_LV_FASTER)
+                    jitCompA0001_checkLimit(&w, reg1, src[6]);
+                i = jitCompA000_convTyp(jitCompGetImm32(src + 2));
+                switch (i) {
+                    case 0x0002:
+                        jitCompPutByte3(w.dst, 0x0f, 0xbe, reg0 << 3 | reg1);  /* MOVSX(reg0,BYTE [reg1]); */
+                        break;
+                    case 0x0003:
+                        jitCompPutByte3(w.dst, 0x0f, 0xb6, reg0 << 3 | reg1);  /* MOVZX(reg0,BYTE [reg1]); */
+                        break;
+                    case 0x0004:
+                        jitCompPutByte3(w.dst, 0x0f, 0xbf, reg0 << 3 | reg1);  /* MOVSX(reg0,WORD [reg1]); */
+                        break;
+                    case 0x0005:
+                        jitCompPutByte3(w.dst, 0x0f, 0xb7, reg0 << 3 | reg1);  /* MOVZX(reg0,WORD [reg1]); */
+                        break;
+                    case 0x0006:
+                    case 0x0007:
+                        jitCompPutByte2(w.dst, 0x8b, reg0 << 3 | reg1);        /* MOV(reg0, [reg1]); */
+                        break;
+                    default:
+                        w.err = JITC_ERR_BADTYPE;
+                }
+                if (reg0 == 0 /* EAX */)
+                    jitCompA0001_movRxxEax(&w, src[1]);
+                if (reg1 == 2 /* EDX */)
+                    jitCompA000_loadRegCacheEdx(&w);
+                break;
+                
+            case 0x09: /* SMEM */      /* 完成 */
+                i = jitCompGetImm32(src + 2);
+                if (i == 0x0001) w.err = JITC_ERR_BADTYPE;
+                if (level < JITC_LV_FASTER) {
+                    jitCompA0001_checkType(&w, src[6], i, 1); // write
+                    cmp0reg = -1;
+                }
+                reg0 = jitCompA000_selectRegCache(src[1], 0 /* EAX */);
+                reg1 = jitCompA000_selectPRegCache(src[6], 2 /* EDX */);
+                if (reg0 != 0 /* EAX */ && reg1 == 2 /* EDX */)
+                    reg1 = 0; /* EAX */
+                if (reg1 == 2 /* EDX */)
+                    jitCompA000_storeRegCacheEdx(&w);
+                if (reg1 <= 3 /* EAX, EDX */)
+                    jitCompA0001_movReg32EbpDisp(&w, reg1, 256 + src[6] * 32 + 0); /* MOV(reg1, [EBP+?]); */
+                if (level < JITC_LV_FASTER)
+                    jitCompA0001_checkLimit(&w, reg1, src[6]);
+                if (reg0 == 0 /* EAX */)
+                    jitCompA0001_movEaxRxx(&w, src[1]);
+                /* 値の範囲チェック */
+                i = jitCompA000_convTyp(jitCompGetImm32(src + 2));
+                switch (i) {
+                    case 0x0002:
+                    case 0x0003:
+                        jitCompPutByte2(w.dst, 0x88, reg0 << 3 | reg1);        /* MOV([reg1], BYTE(reg0)); */
+                        break;
+                    case 0x0004:
+                    case 0x0005:
+                        jitCompPutByte3(w.dst, 0x66, 0x89, reg0 << 3 | reg1);  /* MOV([reg1], WORD(reg0)); */
+                        break;
+                    case 0x0006:
+                    case 0x0007:
+                        jitCompPutByte2(w.dst, 0x89, reg0 << 3 | reg1);        /* MOV([reg1], reg0); */
+                        break;
+                    default:
+                        w.err = JITC_ERR_BADTYPE;
+                }
+                if (reg1 == 2 /* EDX */)
+                    jitCompA000_loadRegCacheEdx(&w);
+                break;
+                
+            case 0x0a: /* PLMEM */     /* 完成 */
+                i = jitCompGetImm32(src + 2);
+                if (i != 0x0001) w.err = JITC_ERR_BADTYPE;
+                if (level < JITC_LV_FASTER) {
+                    jitCompA0001_checkType(&w, src[6], i, 0); // read
+                    cmp0reg = -1;
+                }
+                reg0 = jitCompA000_selectPRegCache(src[1], 0 /* EAX */);
+                reg1 = jitCompA000_selectPRegCache(src[6], 2 /* EDX */);
+                //     if (reg0 != 0 /* EAX */ && reg1 == 2 /* EDX */) /* これをやってはいけない!(by K, 2013.08.02) */
+                //             reg1 = 0; /* EAX */
+                if (reg0 == reg1 && reg0 != 0) {       // bugfix: hinted by yao, 2013.09.14. thanks!
+                    jitCompA000_storePRegCacheAll(&w);
+                    reg1 = 2; /* EDX */
+                }
+                if (reg1 == 2 /* EDX */)
+                    jitCompA000_storeRegCacheEdx(&w);
+                if (reg1 <= 3 /* EAX, EDX */)
+                    jitCompA0001_movReg32EbpDisp(&w, reg1, 256 + src[6] * 32 + 0); /* MOV(reg1, [EBP+?]); */
+                if (level < JITC_LV_FASTER)
+                    jitCompA0001_checkLimit(&w, reg1, src[6]);
+                jitCompPutByte2(w.dst, 0x8b, reg0 << 3 | reg1);        /* MOV(reg0, [reg1]); */
+                if (reg0 == 0 /* EAX */)
+                    jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + 0, 0); /* MOV([EBP+?], EAX); */
+                for (i = 4; i < 32; i += 4) {
+                    jitCompPutByte3(w.dst, 0x8b, 0x40 | reg1, i);      /* MOV(EAX, [reg1+?]); */
+                    jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + i, 0 /* EAX */); /* MOV([EBP+?], EAX); */
+                }
+                if (reg1 == 2 /* EDX */)
+                    jitCompA000_loadRegCacheEdx(&w);
+                break;
+                
+            case 0x0b: /* PSMEM */     /* 完成 */
+                i = jitCompGetImm32(src + 2);
+                if (i != 0x0001) w.err = JITC_ERR_BADTYPE;
+                if (level < JITC_LV_FASTER) {
+                    jitCompA0001_checkType(&w, src[6], i, 1); // write
+                    cmp0reg = -1;
+                }
+                reg0 = jitCompA000_selectPRegCache(src[1], 0 /* EAX */);
+                reg1 = jitCompA000_selectPRegCache(src[6], 2 /* EDX */);
+                //     if (reg0 != 0 /* EAX */ && reg1 == 2 /* EDX */) /* これをやってはいけない!(by K, 2013.08.02) */
+                //             reg1 = 0; /* EAX */
+                if (reg1 == 2 /* EDX */)
+                    jitCompA000_storeRegCacheEdx(&w);
+                if (reg1 <= 3 /* EAX, EDX */)
+                    jitCompA0001_movReg32EbpDisp(&w, reg1, 256 + src[6] * 32 + 0); /* MOV(reg1, [EBP+?]); */
+                if (level < JITC_LV_FASTER)
+                    jitCompA0001_checkLimit(&w, reg1, src[6]);
+                if (reg0 == 0 /* EAX */)
+                    jitCompA0001_movReg32EbpDisp(&w, reg0, 256 + src[1] * 32 + 0); /* MOV(reg0, [EBP+?]); */
+                jitCompPutByte2(w.dst, 0x89, reg0 << 3 | reg1);        /* MOV([reg1], reg0); */
+                for (i = 4; i < 32; i += 4) {
+                    jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, 256 + src[1] * 32 + i); /* MOV(EAX, [EBP+?]); */
+                    jitCompPutByte3(w.dst, 0x89, 0x40 | reg1, i);      /* MOV([reg1+?], EAX); */
+                }
+                if (reg1 == 2 /* EDX */)
+                    jitCompA000_loadRegCacheEdx(&w);
+                break;
+                
+            case 0x0e: /* PADD */              /* 完成 */
+                if (level < JITC_LV_FASTER) {
+                    jitCompA0001_checkType0(&w, src[6], jitCompGetImm32(src + 2), 2); // other, aliveテストはとりあえずしない.
+                    cmp0reg = -1;
+                }
+                reg0 = jitCompA000_selectPRegCache(src[1], 0 /* EAX */);
+                reg1 = jitCompA000_selectPRegCache(src[6], -1 /* mem */);
+                if (reg1 < 0 /* mem */)
+                    jitCompA0001_movReg32EbpDisp(&w, reg0, 256 + src[6] * 32 + 0); /* MOV(reg0, [EBP+?]); */
+                if (reg1 >= 0 && reg0 != reg1) {
+                    jitCompPutByte2(w.dst, 0x89, 0xc0 | reg1 << 3 | reg0); /* MOV(reg0, reg1); */
+                }
+                i = jitCompGetImm32(src + 2);
+                j = -1;
+                if (i == 1)
+                    j = 5; /* 32 */
+                else {
+                    i = jitCompA000_convTyp(i);
+                    if (0x0002 <= i && i <= 0x0007)
+                        j = (i - 0x0002) >> 1;
+                }
+                if (j < 0) { w.err = JITC_ERR_BADTYPE; goto err_w; }
 #if (jitCompA0001_USE_R3F_IMM32 != 0)
-                       if (src[7] == 0x3f) {
-                               j = w.r3f << j;
+                if (src[7] == 0x3f) {
+                    j = w.r3f << j;
 #if (jitCompA0001_USE_R3F_IMM8 != 0)
-                               if (-0x80 <= j && j <= 0x7f) {
+                    if (-0x80 <= j && j <= 0x7f) {
 #if (jitCompA0001_USE_R3F_INCDEC != 0)
-                                       if (j == 1) { jitCompPutByte1(w.dst, 0x40 | reg0); goto padd1; } /* INC */
-                                       if (j == -1) { jitCompPutByte1(w.dst, 0x48 | reg0); goto padd1; } /* DEC */
+                        if (j == 1) { jitCompPutByte1(w.dst, 0x40 | reg0); goto padd1; } /* INC */
+                        if (j == -1) { jitCompPutByte1(w.dst, 0x48 | reg0); goto padd1; } /* DEC */
 #endif
-                                       jitCompPutByte3(w.dst, 0x83, 0xc0 | reg0, j & 0xff);    /* ADD(reg0, im8); */
-                                       goto padd1;
-                               }
+                        jitCompPutByte3(w.dst, 0x83, 0xc0 | reg0, j & 0xff);   /* ADD(reg0, im8); */
+                        goto padd1;
+                    }
 #endif
-                               if (reg0 == 0) {
-                                       jitCompPutByte1(w.dst, 0x05);   /* ADD(reg0, ?); */
-                               }
-                               else {
-                                       jitCompPutByte2(w.dst, 0x81, 0xc0 | reg0);      /* ADD(reg0, ?); */
-                               }
-                               jitCompPutImm32(&w, j);
-                               goto padd1;
-                       }
+                    if (reg0 == 0) {
+                        jitCompPutByte1(w.dst, 0x05);  /* ADD(reg0, ?); */
+                    }
+                    else {
+                        jitCompPutByte2(w.dst, 0x81, 0xc0 | reg0);     /* ADD(reg0, ?); */
+                    }
+                    jitCompPutImm32(&w, j);
+                    goto padd1;
+                }
 #endif
-                       if (src[7] >= 0x40) w.err = JITC_ERR_REGNUM;
-                       if (j == 0) {
-                               reg1 = jitCompA000_selectRegCache(src[7], -1 /* mem */);
-                               if (reg1 >= 0) {
-                                       jitCompPutByte2(w.dst, 0x01, 0xc0 | reg1 << 3 | reg0);  /* ADD(reg0, reg1); */
-                               }
-                               else {
-                                       jitCompPutByte1(w.dst, 0x03);   /* ADD(reg0, [EBP+?]); */
-                                       jitCompA0001_85DispN(&w, src[7] * 4, reg0);
-                               }
-                       }
-                       else {
-                               reg1 = jitCompA000_selectRegCache(src[7], -1 /* mem */);
-                               reg2 = 2; /* EDX */
-                               jitCompA000_storeRegCacheEdx(&w);
-                               if (reg1 < 0)
-                                       jitCompA0001_movReg32EbpDisp(&w, reg2, src[7] * 4); /* MOV(reg2, [EBP+?]); */
-                               if (reg1 >= 0 && reg1 != reg2) {
-                                       jitCompPutByte2(w.dst, 0x89, 0xc0 | reg1 << 3 | reg2); /* MOV(reg2, reg1); */
-                               }
-                               jitCompPutByte3(w.dst, 0xc1, 0xe0 | reg2, j);   /* SHL(reg2, ?); */
-                               jitCompPutByte2(w.dst, 0x01, 0xc0 | reg2 << 3 | reg0);  /* ADD(reg0, reg2); */
-                               jitCompA000_loadRegCacheEdx(&w);
-                       }
+                if (src[7] >= 0x40) w.err = JITC_ERR_REGNUM;
+                if (j == 0) {
+                    reg1 = jitCompA000_selectRegCache(src[7], -1 /* mem */);
+                    if (reg1 >= 0) {
+                        jitCompPutByte2(w.dst, 0x01, 0xc0 | reg1 << 3 | reg0); /* ADD(reg0, reg1); */
+                    }
+                    else {
+                        jitCompPutByte1(w.dst, 0x03);  /* ADD(reg0, [EBP+?]); */
+                        jitCompA0001_85DispN(&w, src[7] * 4, reg0);
+                    }
+                }
+                else {
+                    reg1 = jitCompA000_selectRegCache(src[7], -1 /* mem */);
+                    reg2 = 2; /* EDX */
+                    jitCompA000_storeRegCacheEdx(&w);
+                    if (reg1 < 0)
+                        jitCompA0001_movReg32EbpDisp(&w, reg2, src[7] * 4); /* MOV(reg2, [EBP+?]); */
+                    if (reg1 >= 0 && reg1 != reg2) {
+                        jitCompPutByte2(w.dst, 0x89, 0xc0 | reg1 << 3 | reg2); /* MOV(reg2, reg1); */
+                    }
+                    jitCompPutByte3(w.dst, 0xc1, 0xe0 | reg2, j);      /* SHL(reg2, ?); */
+                    jitCompPutByte2(w.dst, 0x01, 0xc0 | reg2 << 3 | reg0);     /* ADD(reg0, reg2); */
+                    jitCompA000_loadRegCacheEdx(&w);
+                }
 #if (jitCompA0001_USE_R3F_IMM32 != 0)
-               padd1:
+            padd1:
 #endif
-                       if (reg0 == 0 /* EAX */)
-                               jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + 0, reg0); /* MOV([EBP+?], reg0); */
-                       if (src[1] != src[6]) {
-                               for (i = 4; i < 32; i += 4) {
-                                       jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, 256 + src[6] * 32 + i); /* MOV(EAX, [EBP+?]); */
-                                       jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + i, 0 /* EAX */); /* MOV([EBP+?], EAX); */
-                               }
-                       }
-                       cmp0reg = -1;
-                       break;
-
-               case 0x0f: /* PDIF */   /* 未完成 */
-                       reg0 = jitCompA000_selectRegCache(src[1], 0 /* EAX */);
-                       jitCompA000_storePRegCacheAll(&w); // 手抜き.
-                       jitCompA0001_checkCompPtr(&w, src[6], src[7]);
-                       jitCompA0001_movReg32EbpDisp(&w, reg0, 256 + src[6] * 32 + 0); /* MOV(reg0, [EBP+?]); */
-                       jitCompPutByte1(w.dst, 0x2b);   /* SUB(EAX, [EBP+?]); */
-                       jitCompA0001_85DispN(&w, 256 + src[7] * 32 + 0, reg0);
-                       i = jitCompA000_convTyp(jitCompGetImm32(src + 2));
-                       j = -1;
-                       if (0x0002 <= i && i <= 0x0007)
-                               j = (i - 0x0002) >> 1;
-                       if (j < 0) { w.err = JITC_ERR_BADTYPE; goto err_w; }
-                       if (j > 0) {
-                               jitCompPutByte3(w.dst, 0xc1, 0xf8 | reg0, j);   /* SAR(reg0,?); */
-                       }
-                       if (reg0 == 0 /* EAX */)
-                               jitCompA0001_movRxxEax(&w, src[1]);
-                       cmp0reg = src[1]; cmp0lev = 1;
-                       break;
-
-               case 0x10:      /* OR */
-               case 0x11:      /* XOR */
-               case 0x12:      /* AND */
-               case 0x14:      /* ADD */
-               case 0x15:      /* SUB */
-               case 0x16:      /* MUL */
-                       if (src[1] >= 0x3f) w.err = JITC_ERR_REGNUM;
-                       reg0 = jitCompA000_selectRegCache(src[1], 0 /* EAX */);
-                       reg1 = jitCompA000_selectRegCache(src[2], -1 /* mem */);
+                if (reg0 == 0 /* EAX */)
+                    jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + 0, reg0); /* MOV([EBP+?], reg0); */
+                if (src[1] != src[6]) {
+                    for (i = 4; i < 32; i += 4) {
+                        jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, 256 + src[6] * 32 + i); /* MOV(EAX, [EBP+?]); */
+                        jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + i, 0 /* EAX */); /* MOV([EBP+?], EAX); */
+                    }
+                }
+                cmp0reg = -1;
+                break;
+                
+            case 0x0f: /* PDIF */      /* 未完成 */
+                reg0 = jitCompA000_selectRegCache(src[1], 0 /* EAX */);
+                jitCompA000_storePRegCacheAll(&w); // 手抜き.
+                jitCompA0001_checkCompPtr(&w, src[6], src[7]);
+                jitCompA0001_movReg32EbpDisp(&w, reg0, 256 + src[6] * 32 + 0); /* MOV(reg0, [EBP+?]); */
+                jitCompPutByte1(w.dst, 0x2b);  /* SUB(EAX, [EBP+?]); */
+                jitCompA0001_85DispN(&w, 256 + src[7] * 32 + 0, reg0);
+                i = jitCompA000_convTyp(jitCompGetImm32(src + 2));
+                j = -1;
+                if (0x0002 <= i && i <= 0x0007)
+                    j = (i - 0x0002) >> 1;
+                if (j < 0) { w.err = JITC_ERR_BADTYPE; goto err_w; }
+                if (j > 0) {
+                    jitCompPutByte3(w.dst, 0xc1, 0xf8 | reg0, j);      /* SAR(reg0,?); */
+                }
+                if (reg0 == 0 /* EAX */)
+                    jitCompA0001_movRxxEax(&w, src[1]);
+                cmp0reg = src[1]; cmp0lev = 1;
+                break;
+                
+            case 0x10: /* OR */
+            case 0x11: /* XOR */
+            case 0x12: /* AND */
+            case 0x14: /* ADD */
+            case 0x15: /* SUB */
+            case 0x16: /* MUL */
+                if (src[1] >= 0x3f) w.err = JITC_ERR_REGNUM;
+                reg0 = jitCompA000_selectRegCache(src[1], 0 /* EAX */);
+                reg1 = jitCompA000_selectRegCache(src[2], -1 /* mem */);
 #if (jitCompA0001_USE_R3F_IMM32 != 0)
-                       if (src[2] == 0x3f) {   // SUBのみ該当.
-                               if (*src != 0x15) w.err = JITC_ERR_REGNUM;
-                               reg2 = jitCompA000_selectRegCache(src[3], -1 /* mem */);
-                               if (reg2 >= 0)
-                                       jitCompA000_storeRegCacheAll(&w);
-                               jitCompPutByte1(w.dst, 0xb8 | reg0);    /* MOV(reg0, ?); */
-                               jitCompPutImm32(&w, w.r3f);
-                               jitCompPutByte1(w.dst, 0x2b);
-                               jitCompA0001_85DispN(&w, src[3] * 4, reg0);
-                               if (reg0 == 0)
-                                       jitCompA0001_movRxxEax(&w, src[1]);
-                               break;
-                       }
+                if (src[2] == 0x3f) {  // SUBのみ該当.
+                    if (*src != 0x15) w.err = JITC_ERR_REGNUM;
+                    reg2 = jitCompA000_selectRegCache(src[3], -1 /* mem */);
+                    if (reg2 >= 0)
+                        jitCompA000_storeRegCacheAll(&w);
+                    jitCompPutByte1(w.dst, 0xb8 | reg0);       /* MOV(reg0, ?); */
+                    jitCompPutImm32(&w, w.r3f);
+                    jitCompPutByte1(w.dst, 0x2b);
+                    jitCompA0001_85DispN(&w, src[3] * 4, reg0);
+                    if (reg0 == 0)
+                        jitCompA0001_movRxxEax(&w, src[1]);
+                    break;
+                }
 #endif
-                       if (reg1 < 0) {
-                               jitCompA0001_movReg32EbpDisp(&w, reg0, src[2] * 4); /* MOV(reg0, [EBP+?]); */
-                       }
-                       if (reg1 >= 0 && reg0 != reg1) {
-                               jitCompPutByte2(w.dst, 0x89, 0xc0 | reg1 << 3 | reg0); /* MOV(reg0, reg1); */
-                       }
-                       if (!(src[0] == 0x10 && src[3] == 0xff)) {  // bugfix: hinted by Iris, 2013.06.26. thanks!
-                               cmp0reg = src[1];
-                               cmp0lev = 1;
-                               if (src[0] < 0x14)
-                                       cmp0lev = 2;
-                               if (src[0] == 0x16)
-                                       cmp0reg = -1;
-                       }
-                       if (!(src[0] == 0x10 && src[3] == 0xff)) {
+                if (reg1 < 0) {
+                    jitCompA0001_movReg32EbpDisp(&w, reg0, src[2] * 4); /* MOV(reg0, [EBP+?]); */
+                }
+                if (reg1 >= 0 && reg0 != reg1) {
+                    jitCompPutByte2(w.dst, 0x89, 0xc0 | reg1 << 3 | reg0); /* MOV(reg0, reg1); */
+                }
+                if (!(src[0] == 0x10 && src[3] == 0xff)) {  // bugfix: hinted by Iris, 2013.06.26. thanks!
+                    cmp0reg = src[1];
+                    cmp0lev = 1;
+                    if (src[0] < 0x14)
+                        cmp0lev = 2;
+                    if (src[0] == 0x16)
+                        cmp0reg = -1;
+                }
+                if (!(src[0] == 0x10 && src[3] == 0xff)) {
 #if (jitCompA0001_USE_R3F_IMM32 != 0)
-                               if (src[3] == 0x3f) {
-                                       if (*src == 0x16 && w.r3f == -1) {
-                                               jitCompPutByte2(w.dst, 0xf7, 0xd8 | reg0); /* NEG(reg0); */
-                                               if (reg0 == 0)
-                                                       jitCompA0001_movRxxEax(&w, src[1]);
-                                               break;
-                                       }
+                    if (src[3] == 0x3f) {
+                        if (*src == 0x16 && w.r3f == -1) {
+                            jitCompPutByte2(w.dst, 0xf7, 0xd8 | reg0); /* NEG(reg0); */
+                            if (reg0 == 0)
+                                jitCompA0001_movRxxEax(&w, src[1]);
+                            break;
+                        }
 #if (jitCompA0001_USE_R3F_INCDEC != 0)
-                                       if ((*src == 0x14 && w.r3f == 1) || (*src == 0x15 && w.r3f == -1)) {
-                                               jitCompPutByte1(w.dst, 0x40 | reg0);    /* INC(reg0); */
-                                               if (reg0 == 0)
-                                                       jitCompA0001_movRxxEax(&w, src[1]);
-                                               break;
-                                       }
-                                       if ((*src == 0x15 && w.r3f == 1) || (*src == 0x14 && w.r3f == -1)) {
-                                               jitCompPutByte1(w.dst, 0x48 | reg0);    /* DEC(reg0); */
-                                               if (reg0 == 0)
-                                                       jitCompA0001_movRxxEax(&w, src[1]);
-                                               break;
-                                       }
+                        if ((*src == 0x14 && w.r3f == 1) || (*src == 0x15 && w.r3f == -1)) {
+                            jitCompPutByte1(w.dst, 0x40 | reg0);       /* INC(reg0); */
+                            if (reg0 == 0)
+                                jitCompA0001_movRxxEax(&w, src[1]);
+                            break;
+                        }
+                        if ((*src == 0x15 && w.r3f == 1) || (*src == 0x14 && w.r3f == -1)) {
+                            jitCompPutByte1(w.dst, 0x48 | reg0);       /* DEC(reg0); */
+                            if (reg0 == 0)
+                                jitCompA0001_movRxxEax(&w, src[1]);
+                            break;
+                        }
 #endif
 #if (jitCompA0001_USE_R3F_IMM8 != 0)
-                                       if (-0x80 <= w.r3f && w.r3f <= 0x7f) {
-                                               if (*src != 0x16) {
-                                                       static unsigned char basic_op_table_im8[] = { 0xc8, 0xf0, 0xe0, 0, 0xc0, 0xe8 };
-                                                       jitCompPutByte3(w.dst, 0x83, basic_op_table_im8[*src - 0x10] | reg0, w.r3f & 0xff);
-                                               }
-                                               else {
-                                                       jitCompPutByte3(w.dst, 0x6b, 0xc0 | reg0 << 3 | reg0, w.r3f & 0xff);
-                                               }
-                                               if (reg0 == 0)
-                                                       jitCompA0001_movRxxEax(&w, src[1]);
-                                               break;
-                                       }
+                        if (-0x80 <= w.r3f && w.r3f <= 0x7f) {
+                            if (*src != 0x16) {
+                                static unsigned char basic_op_table_im8[] = { 0xc8, 0xf0, 0xe0, 0, 0xc0, 0xe8 };
+                                jitCompPutByte3(w.dst, 0x83, basic_op_table_im8[*src - 0x10] | reg0, w.r3f & 0xff);
+                            }
+                            else {
+                                jitCompPutByte3(w.dst, 0x6b, 0xc0 | reg0 << 3 | reg0, w.r3f & 0xff);
+                            }
+                            if (reg0 == 0)
+                                jitCompA0001_movRxxEax(&w, src[1]);
+                            break;
+                        }
 #endif
-                                       if (reg0 == 0 /* EAX */) {
-                                               static unsigned char basic_op_table_im32_eax[] = { 0x0d, 0x35, 0x25, 0, 0x05, 0x2d, 0xc0 };
-                                               if (*src == 0x16) { jitCompPutByte1(w.dst, 0x69); }
-                                               jitCompPutByte1(w.dst, basic_op_table_im32_eax[*src - 0x10]);
-                                       }
-                                       else {
-                                               if (*src != 0x16) {
-                                                       static unsigned char basic_op_table_im32_reg[] = { 0xc8, 0xf0, 0xe0, 0, 0xc0, 0xe8 };
-                                                       jitCompPutByte2(w.dst, 0x81, basic_op_table_im32_reg[*src - 0x10] | reg0);
-                                               }
-                                               else {
-                                                       jitCompPutByte2(w.dst, 0x69, 0xc0 | reg0 << 3 | reg0);
-                                               }
-                                       }
-                                       jitCompPutImm32(&w, w.r3f);
-                                       if (reg0 == 0)
-                                               jitCompA0001_movRxxEax(&w, src[1]);
-                                       break;
-                               }
+                        if (reg0 == 0 /* EAX */) {
+                            static unsigned char basic_op_table_im32_eax[] = { 0x0d, 0x35, 0x25, 0, 0x05, 0x2d, 0xc0 };
+                            if (*src == 0x16) { jitCompPutByte1(w.dst, 0x69); }
+                            jitCompPutByte1(w.dst, basic_op_table_im32_eax[*src - 0x10]);
+                        }
+                        else {
+                            if (*src != 0x16) {
+                                static unsigned char basic_op_table_im32_reg[] = { 0xc8, 0xf0, 0xe0, 0, 0xc0, 0xe8 };
+                                jitCompPutByte2(w.dst, 0x81, basic_op_table_im32_reg[*src - 0x10] | reg0);
+                            }
+                            else {
+                                jitCompPutByte2(w.dst, 0x69, 0xc0 | reg0 << 3 | reg0);
+                            }
+                        }
+                        jitCompPutImm32(&w, w.r3f);
+                        if (reg0 == 0)
+                            jitCompA0001_movRxxEax(&w, src[1]);
+                        break;
+                    }
 #endif
-                               reg1 = jitCompA000_selectRegCache(src[3], -1 /* mem */);
-                               if (src[3] >= 0x40) w.err = JITC_ERR_REGNUM;
-                               if (*src != 0x16) {
-                                       if (reg1 >= 0) {
-                                               static unsigned char basic_op_table_rr[] = { 0x09, 0x31, 0x21, 0, 0x01, 0x29 }; /* op(reg,reg); */
-                                               jitCompPutByte2(w.dst, basic_op_table_rr[*src - 0x10], 0xc0 | reg1 << 3 | reg0);
-                                       }
-                                       else {
-                                               static unsigned char basic_op_table_rm[] = { 0x0b, 0x33, 0x23, 0, 0x03, 0x2b, 0xaf }; /* op(reg,mem); */
-                                               jitCompPutByte1(w.dst, basic_op_table_rm[*src - 0x10]);
-                                               jitCompA0001_85DispN(&w, src[3] * 4, reg0);
-                                       }
-                               }
-                               else {
-                                       if (reg1 >= 0) {
-                                               jitCompPutByte3(w.dst, 0x0f, 0xaf, 0xc0 | reg0 << 3 | reg1);
-                                       }
-                                       else {
-                                               jitCompPutByte2(w.dst, 0x0f, 0xaf);
-                                               jitCompA0001_85DispN(&w, src[3] * 4, reg0);
-                                       }
-                               }
-                       }
-                       if (reg0 == 0)
-                               jitCompA0001_movRxxEax(&w, src[1]);
-                       break;
-
-               case 0x18:      /* SHL */
-               case 0x19:      /* SAR */
-                       if (src[1] >= 0x3f) w.err = JITC_ERR_REGNUM;
-                       if (src[3] >= 0x40) w.err = JITC_ERR_REGNUM;
+                    reg1 = jitCompA000_selectRegCache(src[3], -1 /* mem */);
+                    if (src[3] >= 0x40) w.err = JITC_ERR_REGNUM;
+                    if (*src != 0x16) {
+                        if (reg1 >= 0) {
+                            static unsigned char basic_op_table_rr[] = { 0x09, 0x31, 0x21, 0, 0x01, 0x29 }; /* op(reg,reg); */
+                            jitCompPutByte2(w.dst, basic_op_table_rr[*src - 0x10], 0xc0 | reg1 << 3 | reg0);
+                        }
+                        else {
+                            static unsigned char basic_op_table_rm[] = { 0x0b, 0x33, 0x23, 0, 0x03, 0x2b, 0xaf }; /* op(reg,mem); */
+                            jitCompPutByte1(w.dst, basic_op_table_rm[*src - 0x10]);
+                            jitCompA0001_85DispN(&w, src[3] * 4, reg0);
+                        }
+                    }
+                    else {
+                        if (reg1 >= 0) {
+                            jitCompPutByte3(w.dst, 0x0f, 0xaf, 0xc0 | reg0 << 3 | reg1);
+                        }
+                        else {
+                            jitCompPutByte2(w.dst, 0x0f, 0xaf);
+                            jitCompA0001_85DispN(&w, src[3] * 4, reg0);
+                        }
+                    }
+                }
+                if (reg0 == 0)
+                    jitCompA0001_movRxxEax(&w, src[1]);
+                break;
+                
+            case 0x18: /* SHL */
+            case 0x19: /* SAR */
+                if (src[1] >= 0x3f) w.err = JITC_ERR_REGNUM;
+                if (src[3] >= 0x40) w.err = JITC_ERR_REGNUM;
 #if (jitCompA0001_USE_R3F_IMM32 != 0)
-                       if (src[3] == 0x3f) {
-                               reg0 = jitCompA000_selectRegCache(src[1], 0 /* EAX */);
-                               reg1 = jitCompA000_selectRegCache(src[2], -1 /* mem */);
-                               if (src[1] >= 0x3f) w.err = JITC_ERR_REGNUM;
-                               if (reg1 == -1)
-                                       jitCompA0001_movReg32EbpDisp(&w, reg0, src[2] * 4); /* MOV(reg1, [EBP+?]); */
-                               else {
-                                       if (reg0 != reg1) {
-                                               jitCompPutByte2(w.dst, 0x89, 0xc0 | reg1 << 3 | reg0); /* MOV(reg0, reg1); */
-                                       }
-                               }
-                               if (*src == 0x18) { jitCompPutByte3(w.dst, 0xc1, 0xe0 | reg0, w.r3f); } /* SHL(reg0, im8); */
-                               if (*src == 0x19) { jitCompPutByte3(w.dst, 0xc1, 0xf8 | reg0, w.r3f); } /* SAR(reg0, im8); */
-                               if (reg0 == 0 /* EAX */)
-                                       jitCompA0001_movRxxEax(&w, src[1]);
-                               cmp0reg = src[1];
-                               cmp0lev = 1;
-                               break;
-                       }
+                if (src[3] == 0x3f) {
+                    reg0 = jitCompA000_selectRegCache(src[1], 0 /* EAX */);
+                    reg1 = jitCompA000_selectRegCache(src[2], -1 /* mem */);
+                    if (src[1] >= 0x3f) w.err = JITC_ERR_REGNUM;
+                    if (reg1 == -1)
+                        jitCompA0001_movReg32EbpDisp(&w, reg0, src[2] * 4); /* MOV(reg1, [EBP+?]); */
+                    else {
+                        if (reg0 != reg1) {
+                            jitCompPutByte2(w.dst, 0x89, 0xc0 | reg1 << 3 | reg0); /* MOV(reg0, reg1); */
+                        }
+                    }
+                    if (*src == 0x18) { jitCompPutByte3(w.dst, 0xc1, 0xe0 | reg0, w.r3f); } /* SHL(reg0, im8); */
+                    if (*src == 0x19) { jitCompPutByte3(w.dst, 0xc1, 0xf8 | reg0, w.r3f); } /* SAR(reg0, im8); */
+                    if (reg0 == 0 /* EAX */)
+                        jitCompA0001_movRxxEax(&w, src[1]);
+                    cmp0reg = src[1];
+                    cmp0lev = 1;
+                    break;
+                }
 #endif
-                       jitCompA000_storeRegCacheAll(&w); // 手抜き.
-                       jitCompA0001_movReg32EbpDisp(&w, 1 /* ECX */, src[3] * 4); /* MOV(ECX, [EBP+?]); */
+                jitCompA000_storeRegCacheAll(&w); // 手抜き.
+                jitCompA0001_movReg32EbpDisp(&w, 1 /* ECX */, src[3] * 4); /* MOV(ECX, [EBP+?]); */
 #if (jitCompA0001_USE_R3F_IMM32 != 0)
-                       if (src[2] == 0x3f) {
-                               jitCompPutByte1(w.dst, 0xb8);   /* MOV(EAX, ?); */
-                               jitCompPutImm32(&w, w.r3f);
-                       }
-                       else {
-                               jitCompA0001_movEaxRxx(&w, src[2]);
-                       }
+                if (src[2] == 0x3f) {
+                    jitCompPutByte1(w.dst, 0xb8);      /* MOV(EAX, ?); */
+                    jitCompPutImm32(&w, w.r3f);
+                }
+                else {
+                    jitCompA0001_movEaxRxx(&w, src[2]);
+                }
 #else
-                       jitCompA0001_movEaxRxx(&w, src[2]);
+                jitCompA0001_movEaxRxx(&w, src[2]);
 #endif
-                       if (*src == 0x18) { jitCompPutByte2(w.dst, 0xd3, 0xe0); } /* SHL(EAX, CL); */
-                       if (*src == 0x19) { jitCompPutByte2(w.dst, 0xd3, 0xf8); } /* SAR(EAX, CL); */
-                       jitCompA0001_movRxxEax(&w, src[1]);
-                       jitCompA000_loadRegCacheAll(&w); // 手抜き.
-                       cmp0reg = src[1];
-                       cmp0lev = 1;
-                       break;
-
-               case 0x1a:      /* DIV */
-               case 0x1b:      /* MOD */
-                       if (src[1] >= 0x3f) w.err = JITC_ERR_REGNUM;
-                       if (src[2] >= 0x40) w.err = JITC_ERR_REGNUM;
-                       if (src[3] >= 0x40) w.err = JITC_ERR_REGNUM;
-                       jitCompA000_storeRegCacheAll(&w); // 手抜き.
+                if (*src == 0x18) { jitCompPutByte2(w.dst, 0xd3, 0xe0); } /* SHL(EAX, CL); */
+                if (*src == 0x19) { jitCompPutByte2(w.dst, 0xd3, 0xf8); } /* SAR(EAX, CL); */
+                jitCompA0001_movRxxEax(&w, src[1]);
+                jitCompA000_loadRegCacheAll(&w); // 手抜き.
+                cmp0reg = src[1];
+                cmp0lev = 1;
+                break;
+                
+            case 0x1a: /* DIV */
+            case 0x1b: /* MOD */
+                if (src[1] >= 0x3f) w.err = JITC_ERR_REGNUM;
+                if (src[2] >= 0x40) w.err = JITC_ERR_REGNUM;
+                if (src[3] >= 0x40) w.err = JITC_ERR_REGNUM;
+                jitCompA000_storeRegCacheAll(&w); // 手抜き.
 #if (jitCompA0001_USE_R3F_IMM32 != 0)
-                       if (src[3] == 0x3f) {
-                               jitCompPutByte1(w.dst, 0xb8 | 1);       /* MOV(ECX, ?); */
-                               jitCompPutImm32(&w, w.r3f);
-                       }
-                       else {
-                               jitCompA0001_movReg32EbpDisp(&w, 1 /* ECX */, src[3] * 4); /* MOV(ECX, [EBP+?]); */
-                       }
-                       if (src[2] == 0x3f) {
-                               jitCompPutByte1(w.dst, 0xb8 | 0);       /* MOV(EAX, ?); */
-                               jitCompPutImm32(&w, w.r3f);
-                       }
-                       else {
-                               jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, src[2] * 4); /* MOV(EAX, [EBP+?]); */
-                       }
+                if (src[3] == 0x3f) {
+                    jitCompPutByte1(w.dst, 0xb8 | 1);  /* MOV(ECX, ?); */
+                    jitCompPutImm32(&w, w.r3f);
+                }
+                else {
+                    jitCompA0001_movReg32EbpDisp(&w, 1 /* ECX */, src[3] * 4); /* MOV(ECX, [EBP+?]); */
+                }
+                if (src[2] == 0x3f) {
+                    jitCompPutByte1(w.dst, 0xb8 | 0);  /* MOV(EAX, ?); */
+                    jitCompPutImm32(&w, w.r3f);
+                }
+                else {
+                    jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, src[2] * 4); /* MOV(EAX, [EBP+?]); */
+                }
 #else
-                       jitCompA0001_movReg32EbpDisp(&w, 1 /* ECX */, src[3] * 4); /* MOV(ECX, [EBP+?]); */
-                       jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, src[2] * 4); /* MOV(EAX, [EBP+?]); */
+                jitCompA0001_movReg32EbpDisp(&w, 1 /* ECX */, src[3] * 4); /* MOV(ECX, [EBP+?]); */
+                jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, src[2] * 4); /* MOV(EAX, [EBP+?]); */
 #endif
-                       jitCompPutByte1(w.dst, 0x99);   /* CDQ(); */
-                       /* ECXがゼロではないことを確認すべき */
-                       jitCompPutByte2(w.dst, 0xf7, 0xf9);     /* IDIV(ECX); */
-                       if (*src == 0x1a) { jitCompA0001_movEbpDispReg32(&w, src[1] * 4, 0 /* EAX */); }
-                       if (*src == 0x1b) { jitCompA0001_movEbpDispReg32(&w, src[1] * 4, 2 /* EDX */); }
-                       jitCompA000_loadRegCacheAll(&w); // 手抜き.
-                       cmp0reg = -1;
-                       break;
-
-               case 0x1c:      /* PLMT0 */
-               case 0x1d:      /* PLMT1 */
-                       if (src[1] >= 0x40 || src[2] >= 0x40) w.err = JITC_ERR_PREGNUM;
-                       if (level < JITC_LV_FASTEST) {
-                               cmp0reg = -1;
-                               if (level < JITC_LV_FASTER) {
-                                       // typ が一致していることを確認.
-                                       // plsとliveSignが一致していることを確認.
-
-                                       // preg1はp0 <= p <= p1 を満たしているか?.
-                                       // 新しいp0/p1は古いp0〜p1に適合しているか?.
-
-                               }
-                       }
-
-               case 0x1e: /* PCP */            /* 未完成(p1まで完成) */
-                       if (src[1] >= 0x40 || src[2] >= 0x40) w.err = JITC_ERR_PREGNUM;
-                       if (src[2] == 0x3f) w.err = JITC_ERR_PREGNUM;
-                       if (src[1] != 0x3f) {
-                               /* src[2] == 0xff の場合に対応できてない */
-                               jitCompA000_storePRegCacheAll(&w); // 手抜き.
-                               for (i = 0; i < 32; i += 4) {
-                                       jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, 256 + src[2] * 32 + i); /* MOV(EAX, [EBP+?]); */
-                                       jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + i, 0 /* EAX */); /* MOV([EBP+?], EAX); */
-                               }
-                               jitCompA000_loadPRegCacheAll(&w); // 手抜き.
-                       }
-                       else {
-                               if (level < JITC_LV_FASTER) {
-                                       jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, 256 + src[2] * 32 + 4); /* MOV(EAX, [EBP+?]); */  /* typ */
-                                       jitCompPutByte3(w.dst, 0x83, 0xf8, 0);  /* CMP(EAX, 0); */
-                                       jitCompPutByte2(w.dst, 0x0f, 0x85); /* JNE */
-                                       jitCompPutImm32(&w, errfnc - (w.dst + 4));
-                                       /* セキュリティチェックが足りてない!(aliveとか) */
-                               }
-                               reg0 = 0; /* EAX */
-                               jitCompA000_storePRegCacheAll(&w); // 手抜き.
-                               jitCompA0001_movReg32EbpDisp(&w, reg0, 256 + src[2] * 32 + 0); /* MOV(EAX, [EBP+?]); */
-                               if (level < JITC_LV_FASTER) {
-                                       jitCompPutByte1(w.dst, 0x3b);   /* CMP(reg0, [EBP+?]); */
-                                       jitCompA0001_85DispN(&w, 256 + src[2] * 32 + 8, reg0);  /* p0 */
-                                       jitCompPutByte2(w.dst, 0x0f, 0x85); /* JNE */
-                                       jitCompPutImm32(&w, errfnc - (w.dst + 4));
-                               }
-                               jitCompPutByte2(w.dst, 0xff, 0xe0);     /* JMP(EAX); */
-                       }
-                       break;
-
-               case 0x1f: /* PCST */
-                       if (jitCompGetImm32(src + 2) == 0) {
-                               if (level < JITC_LV_FASTER)
-                                       jitCompA0001_checkType0(&w, src[6], jitCompGetImm32(src + 7), 2);
-                               jitCompA000_storePRegCacheAll(&w); // 手抜き.
-                               for (i = 0; i < 32 - 4; i += 4) {
-                                       jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, 256 + src[6] * 32 + i); /* MOV(EAX, [EBP+?]); */
-                                       if (i == 4) {
-                                               jitCompPutByte1(w.dst, 0x0d); /* OR(EAX, ?); */
-                                               jitCompPutImm32(&w, 0x80000000);
-                                       }
-                                       jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + i, 0 /* EAX */); /* MOV([EBP+?], EAX); */
-                               }
-                               jitCompPutByte1(w.dst, 0xb8);   /* MOV(EAX, ?); */
-                               jitCompPutImm32(&w, debugInfo1);
-                               jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + 28, 0 /* EAX */); /* MOV([EBP+?], EAX); */
-                               jitCompA000_loadPRegCacheAll(&w); // 手抜き.
-                               cmp0reg = -1;
-                               break;
-                       }
-                       if (jitCompGetImm32(src + 7) == 0) {
-                               jitCompA000_storePRegCacheAll(&w); // 手抜き.
-                               for (i = 0; i < 32 - 4; i += 4) {
-                                       jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, 256 + src[6] * 32 + i); /* MOV(EAX, [EBP+?]); */
-                                       if (i == 4) {
-                                               jitCompPutByte1(w.dst, 0x25); /* AND(EAX, ?); */
-                                               jitCompPutImm32(&w, 0x7fffffff);
-                                       }
-                                       jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + i, 0 /* EAX */); /* MOV([EBP+?], EAX); */
-                               }
-                               if (level < JITC_LV_FASTER) {
-                                       jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, 256 + src[6] * 32 + 28); /* MOV(EAX, [EBP+?]); */
-                                       jitCompPutByte1(w.dst, 0x3d);   /* CMP(EAX, ?); */
-                                       jitCompPutImm32(&w, debugInfo1);
-                                       jitCompPutByte2(w.dst, 0x74, 8); /* JE */
-                                       jitCompPutByte2(w.dst, 0x31, 0xc0);     /* XOR(EAX, EAX); (2) */
-                                       jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + 0, 0 /* EAX */); /* MOV([EBP+?], EAX); (1+1+4) */
-                               }
-                               jitCompA000_loadPRegCacheAll(&w); // 手抜き.
-                               cmp0reg = -1;
-                               break;
-                       }
-                       w.err = JITC_ERR_OPECODE;
-                       goto err_w;
-
-               case 0x20:      /* CMPE */
-               case 0x21:      /* CMPNE */
-               case 0x22:      /* CMPL */
-               case 0x23:      /* CMPGE */
-               case 0x24:      /* CMPLE */
-               case 0x25:      /* CMPG */
-               case 0x26:      /* TSTZ */
-               case 0x27:      /* TSTNZ */
-                       reg0 = jitCompA000_selectRegCache(src[2], 0 /* EAX */);
-                       reg1 = jitCompA000_selectRegCache(src[3], -1 /* mem */);
-                       if (src[1] == 0x3f) {
-                               /* 特殊構文チェック */
-                               if (w.prefix != 0) { w.err = JITC_ERR_PREFIX; goto err_w; }
-                               if (src[4] != 0x04 || src[5] != 0x3f || src[6] != 0x03 || src[7] != 0x3f) {
-                                       w.err = JITC_ERR_IDIOM; goto err_w;
-                               }
-                       }
-                       if (reg0 == 0)
-                               jitCompA0001_movEaxRxx(&w, src[2]);
+                jitCompPutByte1(w.dst, 0x99);  /* CDQ(); */
+                /* ECXがゼロではないことを確認すべき */
+                jitCompPutByte2(w.dst, 0xf7, 0xf9);    /* IDIV(ECX); */
+                if (*src == 0x1a) { jitCompA0001_movEbpDispReg32(&w, src[1] * 4, 0 /* EAX */); }
+                if (*src == 0x1b) { jitCompA0001_movEbpDispReg32(&w, src[1] * 4, 2 /* EDX */); }
+                jitCompA000_loadRegCacheAll(&w); // 手抜き.
+                cmp0reg = -1;
+                break;
+                
+            case 0x1c: /* PLMT0 */
+            case 0x1d: /* PLMT1 */
+                if (src[1] >= 0x40 || src[2] >= 0x40) w.err = JITC_ERR_PREGNUM;
+                if (level < JITC_LV_FASTEST) {
+                    cmp0reg = -1;
+                    if (level < JITC_LV_FASTER) {
+                        // typ が一致していることを確認.
+                        // plsとliveSignが一致していることを確認.
+                        
+                        // preg1はp0 <= p <= p1 を満たしているか?.
+                        // 新しいp0/p1は古いp0〜p1に適合しているか?.
+                        
+                    }
+                }
+                
+            case 0x1e: /* PCP */               /* 未完成(p1まで完成) */
+                if (src[1] >= 0x40 || src[2] >= 0x40) w.err = JITC_ERR_PREGNUM;
+                if (src[2] == 0x3f) w.err = JITC_ERR_PREGNUM;
+                if (src[1] != 0x3f) {
+                    /* src[2] == 0xff の場合に対応できてない */
+                    jitCompA000_storePRegCacheAll(&w); // 手抜き.
+                    for (i = 0; i < 32; i += 4) {
+                        jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, 256 + src[2] * 32 + i); /* MOV(EAX, [EBP+?]); */
+                        jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + i, 0 /* EAX */); /* MOV([EBP+?], EAX); */
+                    }
+                    jitCompA000_loadPRegCacheAll(&w); // 手抜き.
+                }
+                else {
+                    if (level < JITC_LV_FASTER) {
+                        jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, 256 + src[2] * 32 + 4); /* MOV(EAX, [EBP+?]); */ /* typ */
+                        jitCompPutByte3(w.dst, 0x83, 0xf8, 0); /* CMP(EAX, 0); */
+                        jitCompPutByte2(w.dst, 0x0f, 0x85); /* JNE */
+                        jitCompPutImm32(&w, errfnc - (w.dst + 4));
+                        /* セキュリティチェックが足りてない!(aliveとか) */
+                    }
+                    reg0 = 0; /* EAX */
+                    jitCompA000_storePRegCacheAll(&w); // 手抜き.
+                    jitCompA0001_movReg32EbpDisp(&w, reg0, 256 + src[2] * 32 + 0); /* MOV(EAX, [EBP+?]); */
+                    if (level < JITC_LV_FASTER) {
+                        jitCompPutByte1(w.dst, 0x3b);  /* CMP(reg0, [EBP+?]); */
+                        jitCompA0001_85DispN(&w, 256 + src[2] * 32 + 8, reg0); /* p0 */
+                        jitCompPutByte2(w.dst, 0x0f, 0x85); /* JNE */
+                        jitCompPutImm32(&w, errfnc - (w.dst + 4));
+                    }
+                    jitCompPutByte2(w.dst, 0xff, 0xe0);        /* JMP(EAX); */
+                }
+                break;
+                
+            case 0x1f: /* PCST */
+                if (jitCompGetImm32(src + 2) == 0) {
+                    if (level < JITC_LV_FASTER)
+                        jitCompA0001_checkType0(&w, src[6], jitCompGetImm32(src + 7), 2);
+                    jitCompA000_storePRegCacheAll(&w); // 手抜き.
+                    for (i = 0; i < 32 - 4; i += 4) {
+                        jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, 256 + src[6] * 32 + i); /* MOV(EAX, [EBP+?]); */
+                        if (i == 4) {
+                            jitCompPutByte1(w.dst, 0x0d); /* OR(EAX, ?); */
+                            jitCompPutImm32(&w, 0x80000000);
+                        }
+                        jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + i, 0 /* EAX */); /* MOV([EBP+?], EAX); */
+                    }
+                    jitCompPutByte1(w.dst, 0xb8);      /* MOV(EAX, ?); */
+                    jitCompPutImm32(&w, debugInfo1);
+                    jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + 28, 0 /* EAX */); /* MOV([EBP+?], EAX); */
+                    jitCompA000_loadPRegCacheAll(&w); // 手抜き.
+                    cmp0reg = -1;
+                    break;
+                }
+                if (jitCompGetImm32(src + 7) == 0) {
+                    jitCompA000_storePRegCacheAll(&w); // 手抜き.
+                    for (i = 0; i < 32 - 4; i += 4) {
+                        jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, 256 + src[6] * 32 + i); /* MOV(EAX, [EBP+?]); */
+                        if (i == 4) {
+                            jitCompPutByte1(w.dst, 0x25); /* AND(EAX, ?); */
+                            jitCompPutImm32(&w, 0x7fffffff);
+                        }
+                        jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + i, 0 /* EAX */); /* MOV([EBP+?], EAX); */
+                    }
+                    if (level < JITC_LV_FASTER) {
+                        jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, 256 + src[6] * 32 + 28); /* MOV(EAX, [EBP+?]); */
+                        jitCompPutByte1(w.dst, 0x3d);  /* CMP(EAX, ?); */
+                        jitCompPutImm32(&w, debugInfo1);
+                        jitCompPutByte2(w.dst, 0x74, 8); /* JE */
+                        jitCompPutByte2(w.dst, 0x31, 0xc0);    /* XOR(EAX, EAX); (2) */
+                        jitCompA0001_movEbpDispReg32(&w, 256 + src[1] * 32 + 0, 0 /* EAX */); /* MOV([EBP+?], EAX); (1+1+4) */
+                    }
+                    jitCompA000_loadPRegCacheAll(&w); // 手抜き.
+                    cmp0reg = -1;
+                    break;
+                }
+                w.err = JITC_ERR_OPECODE;
+                goto err_w;
+                
+            case 0x20: /* CMPE */
+            case 0x21: /* CMPNE */
+            case 0x22: /* CMPL */
+            case 0x23: /* CMPGE */
+            case 0x24: /* CMPLE */
+            case 0x25: /* CMPG */
+            case 0x26: /* TSTZ */
+            case 0x27: /* TSTNZ */
+                reg0 = jitCompA000_selectRegCache(src[2], 0 /* EAX */);
+                reg1 = jitCompA000_selectRegCache(src[3], -1 /* mem */);
+                if (src[1] == 0x3f) {
+                    /* 特殊構文チェック */
+                    if (w.prefix != 0) { w.err = JITC_ERR_PREFIX; goto err_w; }
+                    if (src[4] != 0x04 || src[5] != 0x3f || src[6] != 0x03 || src[7] != 0x3f) {
+                        w.err = JITC_ERR_IDIOM; goto err_w;
+                    }
+                }
+                if (reg0 == 0)
+                    jitCompA0001_movEaxRxx(&w, src[2]);
 #if (jitCompA0001_USE_R3F_IMM32 != 0)
-                       if (src[3] == 0x3f) {
+                if (src[3] == 0x3f) {
 #if (jitCompA0001_OPTIMIZE_CMP != 0)
-                               if ((*src <= 0x25 && w.r3f == 0) || (*src >= 0x26 && w.r3f == -1)) {
-                                       i = 0;
-                                       if (cmp0reg == src[2]) {
-                                               if (cmp0lev >= 1 && (src[0] == 0x20 || src[0] == 0x21 || src[0] == 0x26 || src[0] == 0x27))
-                                                       i = 1;
-                                               if (cmp0lev >= 2 && (src[0] == 0x22 || src[0] == 0x23 || src[0] == 0x24 || src[0] == 0x25))
-                                                       i = 1;
-                                       }
-                                       if (i == 0) {
-                                               jitCompPutByte2(w.dst, 0x85, 0xc0 | reg0 << 3 | reg0);  /* TEST(reg0, reg0); */
-                                       }
-                                       cmp0reg = src[2];
-                                       cmp0lev = 2;
-                                       goto cmpcc1;
-                               }
+                    if ((*src <= 0x25 && w.r3f == 0) || (*src >= 0x26 && w.r3f == -1)) {
+                        i = 0;
+                        if (cmp0reg == src[2]) {
+                            if (cmp0lev >= 1 && (src[0] == 0x20 || src[0] == 0x21 || src[0] == 0x26 || src[0] == 0x27))
+                                i = 1;
+                            if (cmp0lev >= 2 && (src[0] == 0x22 || src[0] == 0x23 || src[0] == 0x24 || src[0] == 0x25))
+                                i = 1;
+                        }
+                        if (i == 0) {
+                            jitCompPutByte2(w.dst, 0x85, 0xc0 | reg0 << 3 | reg0);     /* TEST(reg0, reg0); */
+                        }
+                        cmp0reg = src[2];
+                        cmp0lev = 2;
+                        goto cmpcc1;
+                    }
 #endif
 #if (jitCompA0001_USE_R3F_IMM8 != 0)
-                               if (-0x80 <= w.r3f && w.r3f <= 0x7f && *src <= 0x25) {
-                                       jitCompPutByte3(w.dst, 0x83, 0xf8 | reg0, w.r3f);
-                                       goto cmpcc1;
-                               }
+                    if (-0x80 <= w.r3f && w.r3f <= 0x7f && *src <= 0x25) {
+                        jitCompPutByte3(w.dst, 0x83, 0xf8 | reg0, w.r3f);
+                        goto cmpcc1;
+                    }
 #endif
-                               if (reg0 == 0) {
-                                       if (*src <= 0x25) { jitCompPutByte1(w.dst, 0x3d); }
-                                       if (*src >= 0x26) { jitCompPutByte1(w.dst, 0xa9); }
-                               }
-                               else {
-                                       if (*src <= 0x25) { jitCompPutByte2(w.dst, 0x81, 0xf8 | reg0); }
-                                       if (*src >= 0x26) { jitCompPutByte2(w.dst, 0xf7, 0xc0 | reg0); }
-                               }
-                               jitCompPutImm32(&w, w.r3f);
-                               goto cmpcc1;
-                       }
+                    if (reg0 == 0) {
+                        if (*src <= 0x25) { jitCompPutByte1(w.dst, 0x3d); }
+                        if (*src >= 0x26) { jitCompPutByte1(w.dst, 0xa9); }
+                    }
+                    else {
+                        if (*src <= 0x25) { jitCompPutByte2(w.dst, 0x81, 0xf8 | reg0); }
+                        if (*src >= 0x26) { jitCompPutByte2(w.dst, 0xf7, 0xc0 | reg0); }
+                    }
+                    jitCompPutImm32(&w, w.r3f);
+                    goto cmpcc1;
+                }
 #endif
-                       if (src[3] >= 0x40) w.err = JITC_ERR_PREGNUM;
-                       if (reg1 >= 0) {
-                               if (*src <= 0x25) { jitCompPutByte2(w.dst, 0x39, 0xc0 | reg1 << 3 | reg0); }
-                               if (*src >= 0x26) { jitCompPutByte2(w.dst, 0x85, 0xc0 | reg1 << 3 | reg0); }
-                       }
-                       else {
-                               if (*src <= 0x25) { jitCompPutByte1(w.dst, 0x3b); }
-                               if (*src >= 0x26) { jitCompPutByte1(w.dst, 0x85); }
-                               jitCompA0001_85DispN(&w, src[3] * 4, reg0);
-                       }
-               cmpcc1:
-                       if (w.err != 0) goto err_w;
-                       static unsigned char cmpcc_table0[] = {
-                               0x04, 0x05, 0x0c, 0x0d, 0x0e, 0x0f, 0x04, 0x05, /* CMPcc, TSTcc */
-                               0x04, 0x05, 0x02, 0x03, 0x06, 0x07                              /* PCMPcc */
-                       };
+                if (src[3] >= 0x40) w.err = JITC_ERR_PREGNUM;
+                if (reg1 >= 0) {
+                    if (*src <= 0x25) { jitCompPutByte2(w.dst, 0x39, 0xc0 | reg1 << 3 | reg0); }
+                    if (*src >= 0x26) { jitCompPutByte2(w.dst, 0x85, 0xc0 | reg1 << 3 | reg0); }
+                }
+                else {
+                    if (*src <= 0x25) { jitCompPutByte1(w.dst, 0x3b); }
+                    if (*src >= 0x26) { jitCompPutByte1(w.dst, 0x85); }
+                    jitCompA0001_85DispN(&w, src[3] * 4, reg0);
+                }
+            cmpcc1:
+                if (w.err != 0) goto err_w;
+                static unsigned char cmpcc_table0[] = {
+                    0x04, 0x05, 0x0c, 0x0d, 0x0e, 0x0f, 0x04, 0x05,    /* CMPcc, TSTcc */
+                    0x04, 0x05, 0x02, 0x03, 0x06, 0x07                         /* PCMPcc */
+                };
 #if (jitCompA0001_USE_R3F_CMPJMP != 0)
-                       if (src[1] == 0x3f) {
-                               /* 特殊構文を利用した最適化 */
-                               jitCompPutByte2(w.dst, 0x0f, 0x80 | cmpcc_table0[*src - 0x20]);
-                               src += 6;
-                               i = jitCompGetLabelNum(&w, src + 2);
-                               if ((flags & JITC_PHASE1) != 0 && w.err != 0) {
-                                       if (label[i].opt == 0) { w.err = JITC_ERR_LABELNODEF; goto err_w; }
-                                       //      if (label[i].typ != 1) { w.err = JITC_ERR_LABELTYP; goto err_w; }
-                               }
-                               j = 0;
-                               if ((flags & JITC_PHASE1) != 0 || (((flags & JITC_PHASE1) == 0) && label[i].opt != 0))
-                                       j = label[i].p - (w.dst + 4);
-                               jitCompPutImm32(&w, j);
+                if (src[1] == 0x3f) {
+                    /* 特殊構文を利用した最適化 */
+                    jitCompPutByte2(w.dst, 0x0f, 0x80 | cmpcc_table0[*src - 0x20]);
+                    src += 6;
+                    i = jitCompGetLabelNum(&w, src + 2);
+                    if ((flags & JITC_PHASE1) != 0 && w.err != 0) {
+                        if (label[i].opt == 0) { w.err = JITC_ERR_LABELNODEF; goto err_w; }
+                        //     if (label[i].typ != 1) { w.err = JITC_ERR_LABELTYP; goto err_w; }
+                    }
+                    j = 0;
+                    if ((flags & JITC_PHASE1) != 0 || (((flags & JITC_PHASE1) == 0) && label[i].opt != 0))
+                        j = label[i].p - (w.dst + 4);
+                    jitCompPutImm32(&w, j);
 #if (jitCompA0001_OPTIMIZE_JMP != 0)
-                               if (-128 - 4 <= j && j < 0) {
-                                       j += 4;
-                                       w.dst -= 6;
-                                       jitCompPutByte2(w.dst, w.dst[1] ^ 0xf0, j & 0xff);
-                               }
+                    if (-128 - 4 <= j && j < 0) {
+                        j += 4;
+                        w.dst -= 6;
+                        jitCompPutByte2(w.dst, w.dst[1] ^ 0xf0, j & 0xff);
+                    }
 #endif
-                               src += 6;
-                               if (w.err != 0) goto err_w;
-                               continue;
-                       }
+                    src += 6;
+                    if (w.err != 0) goto err_w;
+                    continue;
+                }
 #endif
-                       /* 一般的なJITC */
-                       reg0 = jitCompA000_selectRegCache(src[1], 0 /* EAX */);
-                       jitCompPutByte3(w.dst, 0x0f, 0x90 | cmpcc_table0[*src - 0x20], 0xc0 | reg0);    /* SETcc(BYTE(reg0)); */
-                       jitCompPutByte3(w.dst, 0x0f, 0xb6, 0xc0 | reg0 << 3 | reg0);    /* MOVZX(reg0, BYTE(reg0)); */
-                       jitCompPutByte2(w.dst, 0xf7, 0xd8 | reg0);      /* NEG(reg0); */
-                       if (reg0 == 0)
-                               jitCompA0001_movRxxEax(&w, src[1]);
-                       cmp0reg = src[2];
-                       cmp0lev = 1;
-                       break;
-
-               case 0x28:      /* PCMPE */
-               case 0x29:      /* PCMPNE */
-               case 0x2a:      /* PCMPL */
-               case 0x2b:      /* PCMPGE */
-               case 0x2c:      /* PCMPLE */
-               case 0x2d:      /* PCMPG */
-                       if (src[1] == 0x3f) {
-                               /* 特殊構文チェック */
-                               if (w.prefix != 0) { w.err = JITC_ERR_PREFIX; goto err_w; }
-                               if (src[4] != 0x04 || src[5] != 0x3f || src[6] != 0x03 || src[7] != 0x3f) {
-                                       w.err = JITC_ERR_IDIOM; goto err_w;
-                               }
-                       }
-                       if (src[2] >= 0x40) w.err = JITC_ERR_PREGNUM;
-                       jitCompA000_storePRegCacheAll(&w); // 手抜き.
-                       if (src[3] != 0xff)
-                               jitCompA0001_checkCompPtr(&w, src[2], src[3]);
-                       jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, 256 + src[2] * 32 + 0); /* MOV(EAX, [EBP+?]); */
-                       if (src[3] != 0xff) {
-                               jitCompPutByte1(w.dst, 0x3b);   /* CMP(EAX, [EBP+?]); */
-                               jitCompA0001_85DispN(&w, 256 + src[3] * 32 + 0, 0);
-                       }
-                       else {
-                               /* ヌルポインタとの比較はこれでいいのか?たぶんよくない */
-                               jitCompPutByte3(w.dst, 0x83, 0xf8, 0x00);       /* CMP(EAX, 0); */
-                       }
-                       cmp0reg = -1;
-                       goto cmpcc1;
-
-               case 0x30:      /* talloc(old:F4) */
-               case 0x31:      /* tfree(old:F5) */
-               case 0x32:      /* malloc(old:F6) */
-               case 0x33:      /* mfree(old:F7) */
-                       jitCompA000_storeRegCacheAll(&w); // 手抜き.
-                       jitCompA000_storePRegCacheAll(&w); // 手抜き.
-                       jitCompPutByte2(w.dst, 0x6a, src[3]);   /* PUSH(?); */
-                       jitCompPutByte2(w.dst, 0x6a, src[2]);   /* PUSH(?); */
-                       jitCompPutByte2(w.dst, 0x6a, src[1]);   /* PUSH(?); */
-                       jitCompPutByte1(w.dst, 0x55);   /* PUSH(EBP); */
-                       jitCompPutByte1(w.dst, 0xe8);
-                       if (*src == 0x30) j = ((unsigned char *)&funcf4) - (w.dst + 4);
-                       if (*src == 0x31) j = ((unsigned char *)&funcf5) - (w.dst + 4);
-                       if (*src == 0x32) j = ((unsigned char *)&funcf6) - (w.dst + 4);
-                       if (*src == 0x33) j = ((unsigned char *)&funcf7) - (w.dst + 4);
-                       jitCompPutImm32(&w, j);
-                       jitCompPutByte3(w.dst, 0x83, 0xc4, 0x10);       /* ADD(ESP,16); */
-                       jitCompA000_loadRegCacheAll(&w); // 手抜き.
-                       jitCompA000_loadPRegCacheAll(&w); // 手抜き.
-                       cmp0reg = -1;
-                       break;
-
-               case 0x34:      /* data (暫定) */
-                       cmp0reg = -1;
-                       if (w.prefix != 0) { w.err = JITC_ERR_PREFIX; goto err_w; }
-                       int k = jitCompGetImm32(&src[1]), tmpData, bitCount, dataWidth = jitCompA000_dataWidth(k);
-                       if (lastlabel >= 0 && label[lastlabel].typ == 0)
-                               label[lastlabel].typ = k;
-                       if (k != 1) {
-                               i = jitCompA000_convTyp(k);
-                               if (i < 2 || i > 7) { w.err = JITC_ERR_BADTYPE; goto err_w; }
-                       }
-                       j = jitCompGetImm32(&src[5]);
-                       oldsrc = src;
-                       src += 9;
-                       if (k != 1) {
-                               bitCount = 7;
-                               while (j > 0) {
-                                       if (src >= src1) { w.err = JITC_ERR_SRC1; src = oldsrc; goto err_w; }
-                                       if (w.dst + 256 > dst1) { w.err = JITC_ERR_DST1; src = oldsrc; goto err_w; }
-                                       tmpData = 0;
-                                       for (k = 0; k < dataWidth; k++) {
-                                               tmpData = tmpData << 1 | ((*src >> bitCount) & 1);
-                                               bitCount--;
-                                               if (bitCount < 0) {
-                                                       bitCount = 7;
-                                                       src++;
-                                               }
-                                       }
-                                       if ((i & 1) == 0 && dataWidth <= 31 && (tmpData >> (dataWidth - 1)) != 0) {
-                                               tmpData -= 1 << dataWidth;
-                                       }
-                                       if (i == 2 || i == 3) { jitCompPutByte1(w.dst, tmpData & 0xff); }
-                                       if (i == 4 || i == 5) { jitCompPutByte2(w.dst, tmpData & 0xff, (tmpData >> 8) & 0xff); }
-                                       if (i == 6 || i == 7) { jitCompPutByte4(w.dst, tmpData & 0xff, (tmpData >> 8) & 0xff, (tmpData >> 16) & 0xff, (tmpData >> 24) & 0xff); }
-                                       j--;
-                               }
-                       }
-                       else {
-                               while (j > 0) {
-                                       if (src >= src1) { w.err = JITC_ERR_SRC1; src = oldsrc; goto err_w; }
-                                       if (w.dst + 256 > dst1) { w.err = JITC_ERR_DST1; src = oldsrc; goto err_w; }
-                                       i = jitCompGetImm32(src);
-                                       src += 4;
-                                       if ((flags & JITC_PHASE1) != 0 && w.err == 0) {
-                                               if (label[i].opt == 0) { w.err = JITC_ERR_LABELNODEF; goto err_w; }
-                                       }
-                                       jitCompPutImm32(&w, (int)label[i].p);
-                                       jitCompPutImm32(&w, label[i].typ);
-                                       jitCompPutImm32(&w, (int)label[i].p);
-                                       jitCompPutImm32(&w, (int)label[i].p1);
-                                       jitCompPutImm32(&w, 0); /* liveSign */
-                                       jitCompPutImm32(&w, 2320); /* pls */
-                                       jitCompPutImm32(&w, 0);
-                                       jitCompPutImm32(&w, 0);
-                                       j--;
-                               }
-                       }
-                       if (lastlabel >= 0 && label[lastlabel].p1 < w.dst)
-                               label[lastlabel].p1 = w.dst;
-                       continue;
-
-               case 0x3c:      /* ENTER */
-                       jitCompA000_storeRegCacheAll(&w); // 手抜き.
-                       jitCompA000_storePRegCacheAll(&w); // 手抜き.
-                       jitCompPutByte2(w.dst, 0x6a, src[6]);   /* PUSH(?); */
-                       jitCompPutByte2(w.dst, 0x6a, src[5]);   /* PUSH(?); */
-                       jitCompPutByte2(w.dst, 0x6a, src[4] & 0x0f);    /* PUSH(?); */
-                       jitCompPutByte2(w.dst, 0x6a, (src[4] >> 4) & 0x0f);     /* PUSH(?); */
-                       jitCompPutByte2(w.dst, 0x6a, src[3]);   /* PUSH(?); */
-                       jitCompPutByte2(w.dst, 0x6a, src[2]);   /* PUSH(?); */
-                       jitCompPutByte2(w.dst, 0x6a, src[1]);   /* PUSH(?); */
-                       jitCompPutByte1(w.dst, 0x55);   /* PUSH(EBP); */
-                       jitCompPutByte1(w.dst, 0xe8);
-                       j = ((unsigned char *)&func3c) - (w.dst + 4);
-                       jitCompPutImm32(&w, j);
-                       jitCompPutByte3(w.dst, 0x83, 0xc4, 0x20);       /* ADD(ESP,32); */
-                       jitCompA000_loadRegCacheAll(&w); // 手抜き.
-                       jitCompA000_loadPRegCacheAll(&w); // 手抜き.
-                       cmp0reg = -1;
-                       break;
-
-               case 0x3d:      /* LEAVE */
-                       jitCompA000_storeRegCacheAll(&w); // 手抜き.
-                       jitCompA000_storePRegCacheAll(&w); // 手抜き.
-                       jitCompPutByte2(w.dst, 0x6a, src[6]);   /* PUSH(?); */
-                       jitCompPutByte2(w.dst, 0x6a, src[5]);   /* PUSH(?); */
-                       jitCompPutByte2(w.dst, 0x6a, src[4] & 0x0f);    /* PUSH(?); */
-                       jitCompPutByte2(w.dst, 0x6a, (src[4] >> 4) & 0x0f);     /* PUSH(?); */
-                       jitCompPutByte2(w.dst, 0x6a, src[3]);   /* PUSH(?); */
-                       jitCompPutByte2(w.dst, 0x6a, src[2]);   /* PUSH(?); */
-                       jitCompPutByte2(w.dst, 0x6a, src[1]);   /* PUSH(?); */
-                       jitCompPutByte1(w.dst, 0x55);   /* PUSH(EBP); */
-                       jitCompPutByte1(w.dst, 0xe8);
-                       j = ((unsigned char *)&func3d) - (w.dst + 4);
-                       jitCompPutImm32(&w, j);
-                       jitCompPutByte3(w.dst, 0x83, 0xc4, 0x20);       /* ADD(ESP,32); */
-                       jitCompA000_loadRegCacheAll(&w); // 手抜き.
-                       jitCompA000_loadPRegCacheAll(&w); // 手抜き.
-                       cmp0reg = -1;
-                       break;
-
-               case 0xfe:      /* remark */
-                       if (src[1] == 0x01 && src[2] == 0x00) { // DBGINFO1
-                               if (level <= JITC_LV_SLOWER) {
-                                       jitCompPutByte1(w.dst, 0xb8);   /* MOV(EAX, ?); */
-                                       jitCompPutImm32(&w, debugInfo1);
-                                       jitCompA0001_movEbpDispReg32(&w, 2304 + 4, 0 /* EAX */); /* MOV(debugInfo1, EAX); */
-                               }
-                       }
-                       if (src[1] == 0x01 && src[2] == 0x03) { // DBGINFO1CLR
-                               if (level <= JITC_LV_SLOWER) {
-                                       jitCompPutByte1(w.dst, 0xb8);   /* MOV(EAX, ?); */
-                                       jitCompPutImm32(&w, -1);
-                                       jitCompA0001_movEbpDispReg32(&w, 2304 + 4, 0 /* EAX */); /* MOV(debugInfo1, EAX); */
-                               }
-                       }
-                       if (src[1] == 0x05 && src[2] == 0x00) { // DBGINFO0
-                               if (level <= JITC_LV_SLOWEST) {
-                                       debugInfo0 = jitCompGetImm32(src + 3);
-                                       //      jitCompPutByte1(w.dst, 0xbf);   /* MOV(EDI, ?); */
-                                       //      jitCompPutImm32(&w, debugInfo0);
-                                       jitCompPutByte1(w.dst, 0xb8);   /* MOV(EAX, ?); */
-                                       jitCompPutImm32(&w, debugInfo0);
-                                       jitCompA0001_movEbpDispReg32(&w, 2304 + 0, 0 /* EAX */); /* MOV(debugInfo0, EAX); */
-                               }
-                       }
-                       break;
-
-               default:
-                       w.err = JITC_ERR_OPECODE;
-                       goto err_w;
+                /* 一般的なJITC */
+                reg0 = jitCompA000_selectRegCache(src[1], 0 /* EAX */);
+                jitCompPutByte3(w.dst, 0x0f, 0x90 | cmpcc_table0[*src - 0x20], 0xc0 | reg0);   /* SETcc(BYTE(reg0)); */
+                jitCompPutByte3(w.dst, 0x0f, 0xb6, 0xc0 | reg0 << 3 | reg0);   /* MOVZX(reg0, BYTE(reg0)); */
+                jitCompPutByte2(w.dst, 0xf7, 0xd8 | reg0);     /* NEG(reg0); */
+                if (reg0 == 0)
+                    jitCompA0001_movRxxEax(&w, src[1]);
+                cmp0reg = src[2];
+                cmp0lev = 1;
+                break;
+                
+            case 0x28: /* PCMPE */
+            case 0x29: /* PCMPNE */
+            case 0x2a: /* PCMPL */
+            case 0x2b: /* PCMPGE */
+            case 0x2c: /* PCMPLE */
+            case 0x2d: /* PCMPG */
+                if (src[1] == 0x3f) {
+                    /* 特殊構文チェック */
+                    if (w.prefix != 0) { w.err = JITC_ERR_PREFIX; goto err_w; }
+                    if (src[4] != 0x04 || src[5] != 0x3f || src[6] != 0x03 || src[7] != 0x3f) {
+                        w.err = JITC_ERR_IDIOM; goto err_w;
+                    }
+                }
+                if (src[2] >= 0x40) w.err = JITC_ERR_PREGNUM;
+                jitCompA000_storePRegCacheAll(&w); // 手抜き.
+                if (src[3] != 0xff)
+                    jitCompA0001_checkCompPtr(&w, src[2], src[3]);
+                jitCompA0001_movReg32EbpDisp(&w, 0 /* EAX */, 256 + src[2] * 32 + 0); /* MOV(EAX, [EBP+?]); */
+                if (src[3] != 0xff) {
+                    jitCompPutByte1(w.dst, 0x3b);      /* CMP(EAX, [EBP+?]); */
+                    jitCompA0001_85DispN(&w, 256 + src[3] * 32 + 0, 0);
+                }
+                else {
+                    /* ヌルポインタとの比較はこれでいいのか?たぶんよくない */
+                    jitCompPutByte3(w.dst, 0x83, 0xf8, 0x00);  /* CMP(EAX, 0); */
+                }
+                cmp0reg = -1;
+                goto cmpcc1;
+                
+            case 0x30: /* talloc(old:F4) */
+            case 0x31: /* tfree(old:F5) */
+            case 0x32: /* malloc(old:F6) */
+            case 0x33: /* mfree(old:F7) */
+                jitCompA000_storeRegCacheAll(&w); // 手抜き.
+                jitCompA000_storePRegCacheAll(&w); // 手抜き.
+                jitCompPutByte2(w.dst, 0x6a, src[3]);  /* PUSH(?); */
+                jitCompPutByte2(w.dst, 0x6a, src[2]);  /* PUSH(?); */
+                jitCompPutByte2(w.dst, 0x6a, src[1]);  /* PUSH(?); */
+                jitCompPutByte1(w.dst, 0x55);  /* PUSH(EBP); */
+                jitCompPutByte1(w.dst, 0xe8);
+                if (*src == 0x30) j = ((unsigned char *)&funcf4) - (w.dst + 4);
+                if (*src == 0x31) j = ((unsigned char *)&funcf5) - (w.dst + 4);
+                if (*src == 0x32) j = ((unsigned char *)&funcf6) - (w.dst + 4);
+                if (*src == 0x33) j = ((unsigned char *)&funcf7) - (w.dst + 4);
+                jitCompPutImm32(&w, j);
+                jitCompPutByte3(w.dst, 0x83, 0xc4, 0x10);      /* ADD(ESP,16); */
+                jitCompA000_loadRegCacheAll(&w); // 手抜き.
+                jitCompA000_loadPRegCacheAll(&w); // 手抜き.
+                cmp0reg = -1;
+                break;
+                
+            case 0x34: /* data (暫定) */
+                cmp0reg = -1;
+                if (w.prefix != 0) { w.err = JITC_ERR_PREFIX; goto err_w; }
+                int k = jitCompGetImm32(&src[1]), tmpData, bitCount, dataWidth = jitCompA000_dataWidth(k);
+                if (lastlabel >= 0 && label[lastlabel].typ == 0)
+                    label[lastlabel].typ = k;
+                if (k != 1) {
+                    i = jitCompA000_convTyp(k);
+                    if (i < 2 || i > 7) { w.err = JITC_ERR_BADTYPE; goto err_w; }
+                }
+                j = jitCompGetImm32(&src[5]);
+                oldsrc = src;
+                src += 9;
+                if (k != 1) {
+                    bitCount = 7;
+                    while (j > 0) {
+                        if (src >= src1) { w.err = JITC_ERR_SRC1; src = oldsrc; goto err_w; }
+                        if (w.dst + 256 > dst1) { w.err = JITC_ERR_DST1; src = oldsrc; goto err_w; }
+                        tmpData = 0;
+                        for (k = 0; k < dataWidth; k++) {
+                            tmpData = tmpData << 1 | ((*src >> bitCount) & 1);
+                            bitCount--;
+                            if (bitCount < 0) {
+                                bitCount = 7;
+                                src++;
+                            }
+                        }
+                        if ((i & 1) == 0 && dataWidth <= 31 && (tmpData >> (dataWidth - 1)) != 0) {
+                            tmpData -= 1 << dataWidth;
+                        }
+                        if (i == 2 || i == 3) { jitCompPutByte1(w.dst, tmpData & 0xff); }
+                        if (i == 4 || i == 5) { jitCompPutByte2(w.dst, tmpData & 0xff, (tmpData >> 8) & 0xff); }
+                        if (i == 6 || i == 7) { jitCompPutByte4(w.dst, tmpData & 0xff, (tmpData >> 8) & 0xff, (tmpData >> 16) & 0xff, (tmpData >> 24) & 0xff); }
+                        j--;
+                    }
+                }
+                else {
+                    while (j > 0) {
+                        if (src >= src1) { w.err = JITC_ERR_SRC1; src = oldsrc; goto err_w; }
+                        if (w.dst + 256 > dst1) { w.err = JITC_ERR_DST1; src = oldsrc; goto err_w; }
+                        i = jitCompGetImm32(src);
+                        src += 4;
+                        if ((flags & JITC_PHASE1) != 0 && w.err == 0) {
+                            if (label[i].opt == 0) { w.err = JITC_ERR_LABELNODEF; goto err_w; }
+                        }
+                        jitCompPutImm32(&w, (int)label[i].p);
+                        jitCompPutImm32(&w, label[i].typ);
+                        jitCompPutImm32(&w, (int)label[i].p);
+                        jitCompPutImm32(&w, (int)label[i].p1);
+                        jitCompPutImm32(&w, 0); /* liveSign */
+                        jitCompPutImm32(&w, 2320); /* pls */
+                        jitCompPutImm32(&w, 0);
+                        jitCompPutImm32(&w, 0);
+                        j--;
+                    }
+                }
+                if (lastlabel >= 0 && label[lastlabel].p1 < w.dst)
+                    label[lastlabel].p1 = w.dst;
+                continue;
+                
+            case 0x3c: /* ENTER */
+                jitCompA000_storeRegCacheAll(&w); // 手抜き.
+                jitCompA000_storePRegCacheAll(&w); // 手抜き.
+                jitCompPutByte2(w.dst, 0x6a, src[6]);  /* PUSH(?); */
+                jitCompPutByte2(w.dst, 0x6a, src[5]);  /* PUSH(?); */
+                jitCompPutByte2(w.dst, 0x6a, src[4] & 0x0f);   /* PUSH(?); */
+                jitCompPutByte2(w.dst, 0x6a, (src[4] >> 4) & 0x0f);    /* PUSH(?); */
+                jitCompPutByte2(w.dst, 0x6a, src[3]);  /* PUSH(?); */
+                jitCompPutByte2(w.dst, 0x6a, src[2]);  /* PUSH(?); */
+                jitCompPutByte2(w.dst, 0x6a, src[1]);  /* PUSH(?); */
+                jitCompPutByte1(w.dst, 0x55);  /* PUSH(EBP); */
+                jitCompPutByte1(w.dst, 0xe8);
+                j = ((unsigned char *)&func3c) - (w.dst + 4);
+                jitCompPutImm32(&w, j);
+                jitCompPutByte3(w.dst, 0x83, 0xc4, 0x20);      /* ADD(ESP,32); */
+                jitCompA000_loadRegCacheAll(&w); // 手抜き.
+                jitCompA000_loadPRegCacheAll(&w); // 手抜き.
+                cmp0reg = -1;
+                break;
+                
+            case 0x3d: /* LEAVE */
+                jitCompA000_storeRegCacheAll(&w); // 手抜き.
+                jitCompA000_storePRegCacheAll(&w); // 手抜き.
+                jitCompPutByte2(w.dst, 0x6a, src[6]);  /* PUSH(?); */
+                jitCompPutByte2(w.dst, 0x6a, src[5]);  /* PUSH(?); */
+                jitCompPutByte2(w.dst, 0x6a, src[4] & 0x0f);   /* PUSH(?); */
+                jitCompPutByte2(w.dst, 0x6a, (src[4] >> 4) & 0x0f);    /* PUSH(?); */
+                jitCompPutByte2(w.dst, 0x6a, src[3]);  /* PUSH(?); */
+                jitCompPutByte2(w.dst, 0x6a, src[2]);  /* PUSH(?); */
+                jitCompPutByte2(w.dst, 0x6a, src[1]);  /* PUSH(?); */
+                jitCompPutByte1(w.dst, 0x55);  /* PUSH(EBP); */
+                jitCompPutByte1(w.dst, 0xe8);
+                j = ((unsigned char *)&func3d) - (w.dst + 4);
+                jitCompPutImm32(&w, j);
+                jitCompPutByte3(w.dst, 0x83, 0xc4, 0x20);      /* ADD(ESP,32); */
+                jitCompA000_loadRegCacheAll(&w); // 手抜き.
+                jitCompA000_loadPRegCacheAll(&w); // 手抜き.
+                cmp0reg = -1;
+                break;
+                
+            case 0xfe: /* remark */
+                if (src[1] == 0x01 && src[2] == 0x00) {        // DBGINFO1
+                    if (level <= JITC_LV_SLOWER) {
+                        jitCompPutByte1(w.dst, 0xb8);  /* MOV(EAX, ?); */
+                        jitCompPutImm32(&w, debugInfo1);
+                        jitCompA0001_movEbpDispReg32(&w, 2304 + 4, 0 /* EAX */); /* MOV(debugInfo1, EAX); */
+                    }
+                }
+                if (src[1] == 0x01 && src[2] == 0x03) {        // DBGINFO1CLR
+                    if (level <= JITC_LV_SLOWER) {
+                        jitCompPutByte1(w.dst, 0xb8);  /* MOV(EAX, ?); */
+                        jitCompPutImm32(&w, -1);
+                        jitCompA0001_movEbpDispReg32(&w, 2304 + 4, 0 /* EAX */); /* MOV(debugInfo1, EAX); */
+                    }
+                }
+                if (src[1] == 0x05 && src[2] == 0x00) {        // DBGINFO0
+                    if (level <= JITC_LV_SLOWEST) {
+                        debugInfo0 = jitCompGetImm32(src + 3);
+                        //     jitCompPutByte1(w.dst, 0xbf);   /* MOV(EDI, ?); */
+                        //     jitCompPutImm32(&w, debugInfo0);
+                        jitCompPutByte1(w.dst, 0xb8);  /* MOV(EAX, ?); */
+                        jitCompPutImm32(&w, debugInfo0);
+                        jitCompA0001_movEbpDispReg32(&w, 2304 + 0, 0 /* EAX */); /* MOV(debugInfo0, EAX); */
+                    }
+                }
+                break;
+                
+            default:
+                w.err = JITC_ERR_OPECODE;
+                goto err_w;
                }
                if (w.err != 0) goto err_w;
                jitCompA0001_fixPrefix(&w);
@@ -1448,7 +1448,7 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr
        if ((flags & JITC_PHASE1) != 0)
                return w.dst - dst00;
        return 0;
-
+    
 err_w:
        if ((w.err & JITC_ERR_PHASE0ONLY) != 0) {
                if ((flags & JITC_PHASE1) == 0)
@@ -1497,10 +1497,10 @@ unsigned char *jitCompCallFunc(unsigned char *dst, void *func)
        jitCompPutByte1(w.dst, 0x55);   /* PUSH(EBP); */
        jitCompPutByte1(w.dst, 0xe8);   /* CALL(func); */
        int j = ((unsigned char *)func) - (w.dst + 4);
-
+    
        //この関数の中では結局w->dstしか参照していない
        jitCompPutImm32(&w, j);
-
+    
        jitCompPutByte1(w.dst, 0x58);   /* POP(EAX); */         /* (win32では不要なのだけど、MacOSには必要らしい) */
        jitCompPutByte1(w.dst, 0x58);   /* POP(EAX); */
        jitCompPutByte1(w.dst, 0x61);   /* POPAD(); */
@@ -1648,24 +1648,24 @@ int jitc0(unsigned char **qq, unsigned char *q1, const unsigned char *p0, const
        unsigned char *q = *qq;
        if (p0[0] != 0x05 || p0[1] != SIGN1)    // OSECPUのヘッダ (05E1) を確認
                return 1;
-
+    
        *q++ = 0x55; /* PUSH(EBP); */
        *q++ = 0x8b; *q++ = 0x6c; *q++ = 0x24; *q++ = 0x08; /* MOV(EBP,[ESP+8]); */
-
+    
        int i;
        for (i = 0; i < JITC_MAXLABELS; i++)
                label[i].opt = 0;
-
+    
        // 以下のjitCompile()呼び出しでは第二引数をq1-2にした方がよいのではないか?
        i = jitCompiler(q, q1, p0 + 2, p1, p0, label, JITC_MAXLABELS, level, di1_serial, 0);
        if (i != 0) return 2;
        i = jitCompiler(q, q1, p0 + 2, p1, p0, label, JITC_MAXLABELS, level, di1_serial, JITC_PHASE1 + 0);
        if (i < 0) return 2;
        q += i;
-
+    
        *q++ = 0x5d; /* POP(EBP); */
        *q++ = 0xc3; /* RET(); */
-
+    
        *qq = q;
        return 0;
 }
diff --git a/main.c b/main.c
index 36f43aa..80927f6 100644 (file)
--- a/main.c
+++ b/main.c
@@ -67,14 +67,14 @@ int HeavyOSECPUMain(int argc, char **argv)
        keybuf = malloc(KEYBUFSIZ * sizeof (int));
        keybuf_r = keybuf_w = keybuf_c = 0;
        ptrCtrl = malloc(PTRCTRLSIZ * sizeof (HOSECPU_PointerControlTag));
-
+    
        randStatInit((unsigned int)time(NULL));
        for (i = 0; i < PTRCTRLSIZ; i++) {
                ptrCtrl[i].liveSign = 0;
                ptrCtrl[i].size = -1;
        }
        ptrCtrl[0].size = -2;
-
+    
     /* syslibの読み込み */
     syslib = Init_LoadSysLib(argv[0], systmp0);
     
@@ -86,16 +86,16 @@ int HeavyOSECPUMain(int argc, char **argv)
                fputs("syslib-file JITC error.\n", stderr);
                return 1;
        }
-
+    
        // エラー時にデバッグ用に表示する変数を加算
        di1_serial++;
-
+    
     /* アプリバイナリの読み込み */
     LoadAppBin(&env);
     
     /* クロック初期化 */
        tm0 = clock() / (double)CLOCKS_PER_SEC;
-
+    
        if (env.appBin[2] == 0xf0) {
         // tek5圧縮がかかっている
 #if (USE_TEK5 != 0)
@@ -119,7 +119,7 @@ int HeavyOSECPUMain(int argc, char **argv)
         stacksiz = strtol(cp, NULL, 0);
     }
        jp = jitbuf; /* JIT-pointer */
-
+    
        /* フロントエンドコードをバックエンドコードに変換する */
        if ((env.appBin[2] & 0xf0) != 0) {
                systmp0[0] = env.appBin[0];
@@ -154,12 +154,12 @@ int HeavyOSECPUMain(int argc, char **argv)
        }
     
        if ((argDebug & 2) != 0) {
-         /*変換後のバックエンドコードをファイルへ保存*/
+        /*変換後のバックエンドコードをファイルへ保存*/
                fp = fopen("debug2.bin", "wb");
                fwrite(systmp0, 1, tmpsiz, fp);
                fclose(fp);
        }
-
+    
     //JITコンパイル
        i = jitc0(&jp, jitbuf + 1024 * 1024, systmp0, systmp0 + tmpsiz, env.executionLevel, label);
        if (i == 1){
@@ -170,14 +170,14 @@ int HeavyOSECPUMain(int argc, char **argv)
         return 1;
     }
        di1_serial++;
-
+    
        int appsiz2 = jp - jitbuf;
-
+    
        unsigned char *p28 = jp;
        jp = jitCompCallFunc(jp, &devFunc);
-
+    
        tm1 = clock() / (double)CLOCKS_PER_SEC;
-
+    
        /* レジスタ初期化 */
        for (i = 0; i < 64; i++){
                env.ireg[i] = 0;
@@ -188,7 +188,7 @@ int HeavyOSECPUMain(int argc, char **argv)
                env.preg[i].p0 = NULL;
                env.preg[i].p1 = NULL;
        }
-
+    
        env.buf0 = env.buf1 = NULL;
        env.preg[0x28].p = p28;
        env.preg[0x28].typ = 0; // TYP_CODE
@@ -201,7 +201,7 @@ int HeavyOSECPUMain(int argc, char **argv)
        env.autoSleep = 0;
        env.setjmpEnv = &setjmpEnv;
        env.lastConsoleChar = '\n';
-
+    
        env.label = label;
        env.maxLabels = JITC_MAXLABELS;
        env.jitbuf = jp;
@@ -212,13 +212,13 @@ int HeavyOSECPUMain(int argc, char **argv)
        if (searchArg(argc, (const char **)argv, "dbgr:1", 0) != NULL){
         env.dbgr = 1;
     }
-
+    
        if ((argDebug & 1) != 0) {
                fp = fopen("debug1.bin", "wb");
                fwrite(jitbuf, 1, jp - jitbuf, fp);
                fclose(fp);
        }
-
+    
        /* JITコード実行 */
        jitfunc = (void *)jitbuf;
        if (setjmp(setjmpEnv) == 0){
@@ -235,9 +235,9 @@ int HeavyOSECPUMain(int argc, char **argv)
        if (env.lastConsoleChar != '\n'){
                putchar('\n');
     }
-
+    
        tm2 = clock() / (double)CLOCKS_PER_SEC;
-
+    
        /* 実行結果確認のためのレジスタダンプ */
        if (searchArg(argc, (const char **)argv, "verbose:1", 0) != NULL) {
                printf("time: JITC=%.3f[sec], exec=%.3f[sec]\n", tm1 - tm0, tm2 - tm1);
index cb60a4b..da20826 100644 (file)
--- a/osecpu.h
+++ b/osecpu.h
@@ -125,7 +125,7 @@ struct Regs {
        //int argc;
        //const char **argv;
        unsigned char *buf0, *buf1, *junkStack, lastConsoleChar, *junkStack1;
-
+    
        HOSECPU_LabelListTag *label;
        int maxLabels;
        unsigned char *jitbuf, *jitbuf1;
@@ -184,8 +184,6 @@ void drv_sleep(int msec);
 // @function.c
 void dbgrMain(HOSECPU_RuntimeEnvironment *r);
 const char *searchArg(int argc, const char **argv, const char *tag, int i); // コマンドライン引数処理.
-void randStatInit(unsigned int seed);
-void randStatNext();
 void devFunc(HOSECPU_RuntimeEnvironment *r); // junkApiを処理する関数
 
 // @jitc.c
@@ -206,6 +204,11 @@ unsigned char *jitCompCallFunc(unsigned char *dst, void *func);
 unsigned char *jitCompInit(unsigned char *dst);
 void errorHandler(HOSECPU_RuntimeEnvironment *r);
 
+// @randmt.c
+void randStatInit(unsigned int seed);
+void randStatNext();
+unsigned int randGetNextUInt32(void);
+
 // @screen.c
 static int iColor1[] = {
        0x000000, 0xff0000, 0x00ff00, 0xffff00,
diff --git a/randmt.c b/randmt.c
new file mode 100644 (file)
index 0000000..0502178
--- /dev/null
+++ b/randmt.c
@@ -0,0 +1,44 @@
+
+#include "osecpu.h"
+
+static struct {
+       unsigned stat[4], mat1, mat2, tmat;
+} randStat;
+
+// tinyMTの32bit版のアルゴリズムを使っています : http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/TINYMT/index-jp.html
+void randStatNext()
+{
+       unsigned x, y;
+       x = (randStat.stat[0] & 0x7fffffff) ^ randStat.stat[1] ^ randStat.stat[2];
+       y = randStat.stat[3];
+       x ^= x << 1;
+       y ^= (y >> 1) ^ x;
+       randStat.stat[1] = randStat.stat[2] ^ (-((int)(y & 1)) & randStat.mat1);
+       randStat.stat[2] = x ^ (y << 10) ^ (-((int)(y & 1)) & randStat.mat2);
+       randStat.stat[3] = y;
+       return;
+}
+
+void randStatInit(unsigned seed)
+{
+       int i;
+       randStat.stat[0] = seed;
+       randStat.stat[1] = randStat.mat1 = 0x8f7011ee;
+       randStat.stat[2] = randStat.mat2 = 0xfc78ff1f;
+       randStat.stat[3] = randStat.tmat = 0x3793fdff;
+       for (i = 1; i < 8; i++)
+               randStat.stat[i & 3] ^= i + ((unsigned)1812433253) * (randStat.stat[(i - 1) & 3] ^ (randStat.stat[(i - 1) & 3] >> 30));
+       for (i = 0; i < 8; i++)
+               randStatNext();
+       return;
+}
+
+unsigned int randGetNextUInt32(void)
+{
+    //次の乱数を取得する。
+    unsigned int u32t;
+    
+    randStatNext();
+    u32t = randStat.stat[0] + (randStat.stat[2] >> 8);
+    return (randStat.stat[3] ^ u32t ^ (-((int)(u32t & 1)) & randStat.tmat));
+}