OSDN Git Service

git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@20 47198e57-cb75-475f-84c4-a814cd6...
authornyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Tue, 4 Oct 2011 13:36:17 +0000 (13:36 +0000)
committernyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Tue, 4 Oct 2011 13:36:17 +0000 (13:36 +0000)
lib/src/mimicvm/NyLPC_cMiMicTxtCompiler.c
lib/src/mimicvm/NyLPC_cMiMicVM.c
lib/src/mimicvm/NyLPC_cMiMicVM.h

index ba1a6bb..f893259 100644 (file)
@@ -120,15 +120,15 @@ NyLPC_TcMiMicTxtCompiler_RET NyLPC_cMiMicBcCompiler_compileFragment(NyLPC_TcMiMi
                                                //パラメータのある制御命令未定義だからエラー。\r
                                                NyLPC_OnErrorGoto(ERROR);\r
                                        }\r
-                                       //END制御命令以外ならエラー\r
-                                       if(i_inst->_current_opc!=NyLPC_TcMiMicVM_CP_TYPE_END){\r
-                                               NyLPC_OnErrorGoto(ERROR);\r
+                                       //END制御命令?\r
+                                       if(i_inst->_current_opc==NyLPC_TcMiMicVM_CP_TYPE_END){\r
+                                               *o_bin_len=0;\r
+                                               *o_parsed_bc=i+1;               //パースしたBCの長さ\r
+                                               i_inst->tmp_len=0;\r
+                                               return NyLPC_TcMiMicTxtCompiler_RET_OK_END;//命令確定。(パース完了)\r
                                        }\r
-                                       //END命令\r
-                                       *o_parsed_bc=i+1;               //パースしたBCの長さ\r
-                                       *o_bin_len=0;\r
-                                       i_inst->tmp_len=0;\r
-                                       return NyLPC_TcMiMicTxtCompiler_RET_OK_END;//命令確定。(パース完了)\r
+                                       //END制御命令以外ならエラー\r
+                                       NyLPC_OnErrorGoto(ERROR);\r
                                }else{\r
                                        //不明な命令\r
                                        NyLPC_OnErrorGoto(ERROR);\r
index 8fc538b..216e9b2 100644 (file)
@@ -43,17 +43,24 @@ void NyLPC_cMiMicVM_initialize(NyLPC_TcMiMicVM_t* i_inst,struct NyLPC_TcMiMicVM_
 \r
 \r
 /**\r
- * 固定長命令+固定長データの実行\r
+ * 固定長命令+固定長データを実行します。\r
+ * 関数の終了条件は、1.EXIT命令に到達する。2.インストラクションの終端に到達する。3.エラーが発生する。です。\r
+ * \r
  */\r
-NyLPC_TBool NyLPC_cMiMicVM_run(NyLPC_TcMiMicVM_t* i_inst,const void* i_instruction)\r
+NyLPC_TBool NyLPC_cMiMicVM_run(NyLPC_TcMiMicVM_t* i_inst,const NyLPC_TUInt32* i_instruction,const NyLPC_TUInt16 i_size_of_instruction)\r
 {\r
        //データ部をgetstreamと連動させること。\r
-       const NyLPC_TUInt8* pc=i_instruction;\r
+       NyLPC_TUInt16 pc=0;\r
        NyLPC_TUInt8 proc_in_byte;\r
-       proc_in_byte=process_instruction(i_inst,(const union NyLPC_TcMiMicVM_TInstruction*)pc);\r
-       while(proc_in_byte>0){\r
+       i_inst->ret_code=0;\r
+       if(i_size_of_instruction>0){\r
+               proc_in_byte=process_instruction(i_inst,(const union NyLPC_TcMiMicVM_TInstruction*)(i_instruction+pc));\r
                pc+=proc_in_byte;\r
-               proc_in_byte=process_instruction(i_inst,(const union NyLPC_TcMiMicVM_TInstruction*)pc);\r
+               //プログラムの終端に到達するか、0バイト処理の場合にブレーク。\r
+               while(proc_in_byte>0 && pc<i_size_of_instruction){\r
+                       proc_in_byte=process_instruction(i_inst,(const union NyLPC_TcMiMicVM_TInstruction*)(i_instruction+pc));\r
+                       pc+=proc_in_byte;\r
+               }\r
        }\r
        return i_inst->ret_code==0?NyLPC_TBool_TRUE:NyLPC_TBool_FALSE;\r
 }\r
@@ -65,7 +72,7 @@ NyLPC_TBool NyLPC_cMiMicVM_run(NyLPC_TcMiMicVM_t* i_inst,const void* i_instructi
  * インストラクションを1個処理し、処理したバイト数を返す。\r
  * インストラクションの境界値はチェックされないので、コンパイル時にチェックしておくこと。\r
  * @return\r
- * å\87¦ç\90\86ã\81\97ã\81\9fã\82¤ã\83³ã\82¹ã\83\88ã\83©ã\82¯ã\82·ã\83§ã\83³ã\81®ã\83\90ã\82¤ã\83\88æ\95°\r
+ * å\87¦ç\90\86ã\81\97ã\81\9fã\82¤ã\83³ã\82¹ã\83\88ã\83©ã\82¯ã\82·ã\83§ã\83³ã\81®ã\83¯ã\83¼ã\83\89æ\95°(UInt32å\8d\98ä½\8d)\r
  * 終了した場合は0を返す。0を返したときは、ret_codeメンバをチェックして、理由を調べること。\r
  */\r
 static NyLPC_TUInt8 process_instruction(NyLPC_TcMiMicVM_t* i_inst,const union NyLPC_TcMiMicVM_TInstruction* ist)\r
@@ -229,7 +236,7 @@ static NyLPC_TUInt8 process_instruction(NyLPC_TcMiMicVM_t* i_inst,const union Ny
        default:\r
                NyLPC_OnErrorGoto(ERROR);\r
        }\r
-       //実行したコードの長さを返す。\r
+       //実行したコードのワード長を返す。\r
        switch(ist->op.oprtype){\r
        case NyLPC_TcMiMicVM_OPR_TYPE_NONE:\r
        case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
@@ -237,11 +244,11 @@ static NyLPC_TUInt8 process_instruction(NyLPC_TcMiMicVM_t* i_inst,const union Ny
        case NyLPC_TcMiMicVM_OPR_TYPE_WM:\r
        case NyLPC_TcMiMicVM_OPR_TYPE_H8:\r
        case NyLPC_TcMiMicVM_OPR_TYPE_H16:\r
-               return 4;\r
+               return 1;\r
        case NyLPC_TcMiMicVM_OPR_TYPE_WM_H16:\r
        case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
        case NyLPC_TcMiMicVM_OPR_TYPE_H32:\r
-               return 8;\r
+               return 2;\r
        }\r
 ERROR:\r
        i_inst->ret_code=1;\r
@@ -254,30 +261,52 @@ ERROR:
 #include "NyLPC_cMiMicTxtCompiler.h"\r
 void main(void)\r
 {\r
-       int a=10;\r
+       struct NyLPC_TcMiMicVM_TEvent eh;\r
+       NyLPC_TUInt32 ap;\r
+       NyLPC_TcMiMicVM_t vm;\r
+       struct NyLPC_TCharArrayPtr bc;\r
+       NyLPC_TcMiMicTxtCompiler_t inst;\r
+       struct NyLPC_TUInt32ArrayPtr bin;\r
        char BC[1024];\r
-       const char* rp;\r
-       NyLPC_TcMiMicTxtCompiler_t cm;\r
-       NyLPC_TUInt16 l;\r
-       NyLPC_TUInt8 obuf[1024];\r
-       void* ap=&a;\r
+       int ist_len;\r
 \r
-       NyLPC_TcMiMicVM_t vm;\r
-       sprintf(BC,"AA0102AB0100000001AE0203AF0200000003AI0304AJ0300000004AM07BA0505BE0607CA0304CB0300000005CE0304CF0300000005CI0304CJ0300000005DA04%08xDE04%08xEA04EE04EF00000000ZAZZ.E",ap,ap);\r
+       NyLPC_TUInt16 l,bl;\r
+       NyLPC_TUInt32 obuf[1024];\r
+       NyLPC_cMiMicBcCompiler_initialize(&inst);\r
+       sprintf(BC,"AA0102AB0100000001AE0203AF0200000003AI0304AJ0300000004AM07BA0505BE0607CA0304CB0300000005CE0304CF0300000005CI0304CJ0300000005ZA.E",&ap,&ap);\r
+       bc.ptr=(char* )BC;\r
+       bc.len=strlen(BC);\r
+       bin.ptr=obuf;\r
+       bin.len=100;\r
+       ist_len=0;\r
 \r
+       for(;;){\r
 \r
-       NyLPC_cMiMicBcCompiler_initialize(&cm);\r
-       rp=BC;\r
-       NyLPC_cMiMicTxtCompiler_setOutputBuf(&cm,obuf,1024);\r
-       if(!NyLPC_cMiMicBcCompiler_compileFragment(&cm,rp,strlen(BC),&l)){\r
-               printf("エラー");\r
-       }\r
-\r
-       NyLPC_cMiMicVM_initialize(&vm);\r
-       if(!NyLPC_cMiMicVM_run(&vm,obuf,NULL,NULL)){\r
-               printf("エンダァ");\r
+               switch(NyLPC_cMiMicBcCompiler_compileFragment(&inst,&bc,&bin,&bl,&l))\r
+               {\r
+               case NyLPC_TcMiMicTxtCompiler_RET_OK:\r
+                       //命令確定。\r
+                       NyLPC_TCharArrayPtr_seek(&bc,l);\r
+                       ist_len+=bl;\r
+                       break;\r
+               case NyLPC_TcMiMicTxtCompiler_RET_OK_END:\r
+                       //命令終端\r
+                       NyLPC_cMiMicVM_initialize(&vm,&eh);\r
+                       if(!NyLPC_cMiMicVM_run(&vm,obuf,ist_len)){\r
+                               printf("エンダァ");\r
+                       }\r
+                       printf("OK");\r
+                       break;\r
+               case NyLPC_TcMiMicTxtCompiler_RET_CONTINUE:\r
+                       //蓄積中。\r
+                       NyLPC_TCharArrayPtr_seek(&bc,l);\r
+                       break;\r
+               case NyLPC_TcMiMicTxtCompiler_RET_NG:\r
+                       printf("エラー");\r
+                       return;\r
+               default:\r
+                       break;\r
+               }\r
        }\r
-       return;\r
 }\r
-#endif\r
-\r
+#endif
\ No newline at end of file
index 30f6f60..eff3f32 100644 (file)
@@ -55,7 +55,7 @@ struct NyLPC_TcMiMicVM
 };\r
 void NyLPC_cMiMicVM_initialize(NyLPC_TcMiMicVM_t* i_inst,struct NyLPC_TcMiMicVM_TEvent* i_handler);\r
 #define NyLPC_cMiMicVM_finalize(i);\r
-NyLPC_TBool NyLPC_cMiMicVM_run(NyLPC_TcMiMicVM_t* i_inst,const void* i_instruction);\r
+NyLPC_TBool NyLPC_cMiMicVM_run(NyLPC_TcMiMicVM_t* i_inst,const NyLPC_TUInt32* i_instruction,const NyLPC_TUInt16 i_size_of_instruction);\r
 \r
 \r
 \r