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;
*/
}
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;
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";
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);
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) /* エラーもしくは終了メッセージ */
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;
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;
}
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) {
}
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;
--- /dev/null
+
+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
+};
#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)
{
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--;
}
}
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;
}
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++) {
}
}
}
-
+
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;
}
//
/* 他のCPUへ移植する人へ:
-以下は最適化のためのものなので、すべて0として簡単に移植しても問題ありません */
+ 以下は最適化のためのものなので、すべて0として簡単に移植しても問題ありません */
#define jitCompA0001_USE_R3F_CMPJMP 1*1
#define jitCompA0001_USE_R3F_IMM32 1*1
#define jitCompA0001_USE_R3F_IMM8 1*1
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 */
}
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);
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)
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(); */
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;
}
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);
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)
stacksiz = strtol(cp, NULL, 0);
}
jp = jitbuf; /* JIT-pointer */
-
+
/* フロントエンドコードをバックエンドコードに変換する */
if ((env.appBin[2] & 0xf0) != 0) {
systmp0[0] = env.appBin[0];
}
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){
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;
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
env.autoSleep = 0;
env.setjmpEnv = &setjmpEnv;
env.lastConsoleChar = '\n';
-
+
env.label = label;
env.maxLabels = JITC_MAXLABELS;
env.jitbuf = jp;
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){
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);
//int argc;
//const char **argv;
unsigned char *buf0, *buf1, *junkStack, lastConsoleChar, *junkStack1;
-
+
HOSECPU_LabelListTag *label;
int maxLabels;
unsigned char *jitbuf, *jitbuf1;
// @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
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,
--- /dev/null
+
+#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));
+}