OSDN Git Service

MacOSXでのキーボード入力対応!
[heavyosecpu/HeavyOSECPU.git] / function.c
index c5a557d..2a5765e 100644 (file)
@@ -1,4 +1,5 @@
 #include "osecpu.h"\r
+#include "jitc.h"\r
 \r
 extern unsigned char fontdata[];    // @fontdata.c\r
 \r
@@ -256,7 +257,7 @@ void devFunc(HOSECPU_RuntimeEnvironment *r)
        unsigned char pucbuf[256];\r
        \r
        //サイズを節約するためにEBPを128バイトずらしているのを元に戻す\r
-       r = (HOSECPU_RuntimeEnvironment *) (((char *)r) - 128);\r
+       r = (HOSECPU_RuntimeEnvironment *) (((char *)r) - jitCompA0001_EBP128);\r
        \r
        if (r->winClosed != 0){\r
                longjmp(r->setjmpEnv, 1);\r
@@ -450,15 +451,22 @@ void devFunc(HOSECPU_RuntimeEnvironment *r)
                        \r
                case 0xff42:\r
                        // junkApi_sleep(opt, msec) R31=opt; R32=msec\r
+                       // opt:\r
+                       //              1 = ついでにウィンドウを更新する\r
+                       //              2 = キー入力されるまでずっと待つ\r
                        if (r->ireg[0x32] == -1) {\r
+                               // sleep forever (事実上実行は終了)\r
                                r->autoSleep = 1;\r
                                longjmp(r->setjmpEnv, 1);\r
                        }\r
                        if (r->ireg[0x32] < 0){\r
+                               // マイナス秒スリープするなんておかしい\r
                                (*(r->errHndl))(r);\r
                        }\r
+                       //スリープしたので終了時の自動スリープ無効\r
                        r->autoSleep = 0;\r
                        if ((r->ireg[0x31] & 1) == 0 && mainWindow.vram != NULL){\r
+                               // opt1:ついでにウィンドウを更新する\r
                                drv_flshWin(mainWindow.xsize, mainWindow.ysize, 0, 0);\r
                        }\r
                        for (;;) {\r
@@ -467,45 +475,62 @@ void devFunc(HOSECPU_RuntimeEnvironment *r)
                                }\r
                                drv_sleep(r->ireg[0x32]);\r
                                if ((r->ireg[0x31] & 2) != 0 && keybuf_c <= 0){\r
+                                       // opt2:キー入力があったので戻る\r
                                        continue;\r
                                }\r
+                               // 時間指定ならここに来て終了\r
                                break;\r
                        }\r
                        break;\r
                        \r
                case 0xff43:\r
                        // junkApi_inkey(_i, mod) R31=mod; _i=R30\r
-                       //  1:peek\r
+                       //  1:peek(キーを「のぞき見る」だけで、バッファは進めない)\r
                        //  2:stdin\r
                        //      4,8: ソース指定.\r
                        //      16: shift, lock系を有効化.\r
                        //      32: 左右のshift系を区別する.\r
-                       if (r->ireg[0x31] == 2) {       // なぜ3にしなかったのか...\r
+                       // カーソルキーの左右でR32は減少,増加する。\r
+                       // カーソルキーの上下でR33は減少,増加する。\r
+                       if (r->ireg[0x31] == 2) {\r
+                               // 標準入力から\r
                                r->ireg[0x30] = fgetc(stdin);\r
                                if (r->ireg[0x30] == EOF){\r
-                                       r->ireg[0x30] = -1;\r
+                                       r->ireg[0x30] = KEY_EMPTY;\r
                                }\r
                                break;\r
                        }\r
                        r->ireg[0x30] |= -1;\r
                        if (keybuf_c > 0) {\r
+                               // 入力された文字がある\r
                                r->ireg[0x30] = keybuf[keybuf_r];\r
                                if ((r->ireg[0x31] & 16) == 0){\r
+                                       // shift, lockキー([C]マークのあるキー)の無効化\r
                                        r->ireg[0x30] &= 0x3e3effff;\r
                                }\r
                                if ((r->ireg[0x31] & 32) == 0){\r
+                                       // 左右の区別を無効化\r
                                        r->ireg[0x30] |= (r->ireg[0x30] >> 8) & 0xff0000;\r
                                }\r
                                if ((r->ireg[0x31] & 1) != 0) {\r
+                                       // peekでないならバッファを進める\r
                                        keybuf_c--;\r
                                        keybuf_r = (keybuf_r + 1) & (KEYBUFSIZ - 1);\r
                                }\r
                        }\r
                        r->ireg[0x32] = r->ireg[0x33] = 0;\r
-                       if (r->ireg[0x30] == 4132) r->ireg[0x32]--;\r
-                       if (r->ireg[0x30] == 4133) r->ireg[0x33]--;\r
-                       if (r->ireg[0x30] == 4134) r->ireg[0x32]++;\r
-                       if (r->ireg[0x30] == 4135) r->ireg[0x33]++;\r
+                       if (r->ireg[0x30] == KEY_LEFT){\r
+                               r->ireg[0x32]--;\r
+                       }\r
+                       if (r->ireg[0x30] == KEY_UP){\r
+                               r->ireg[0x33]--;\r
+                       }\r
+                       if (r->ireg[0x30] == KEY_RIGHT){\r
+                               r->ireg[0x32]++;\r
+                       }\r
+                       if (r->ireg[0x30] == KEY_DOWN){\r
+                               r->ireg[0x33]++;\r
+                       }\r
                        break;\r
                        \r
                case 0xff44:\r