This is Webservice SDK for mbed. LPCXpresso1769/LPC1768/FRDM-K64F/LPC4088

Dependents:   MbedFileServer_1768MiniDK2 RedWireBridge IssueDebug_gcc MiMicRemoteMCU-for-Mbed ... more

libMiMic(MiMic library for mbed)は、WebService機能を提供するSDKです。 mbedでWebAPIに対応したネットワークデバイスを簡単に作ることが出来ます。

libMiMicはMiMic projectで開発しています。MiMic projectについてはこちらをご覧ください。 http://nyatla.jp/mimic/wp/

構成

libMiMicはmbedRTOS上で動作し、ユーザアプリケーションにAPIを提供します。コアAPIはC言語で記述されていますが、使用頻度の高いものについてはmbed向けのC++APIが準備されています。

/media/uploads/nyatla/libmimic-sdk.png

※libMiMicはmbedの標準イーサネットドライバをしようしていません。

標準イーサネットドライバと同時に使用することはできません。

  • MiMicIP - IPv4スタックです。レテンシとメモリ消費量を抑えたuipベースのライブラリです。
  • ARP/ICMP/UDP/TCP - 基礎的なソケットAPIを提供します。APIは独自です。
  • HTTP/1.1 Server - HTTP/1.1に対応したサーバです。マルチセッション・Chunked・持続性接続に対応しています。
  • HTTP Modules - HTTP/1.1の機能モジュールです。以下のモジュールがあります。
    • ROM file provider - ROMに格納したファイルイメージを公開します。
    • File system provider - mbedファイルシステムを公開します。
    • Onchip configuration - プログラムフラッシュを利用して設定を保存します。
    • MiMicVM processor - RPCリクエスト(MiMicVM)を処理します。
    • FileUpload - ファイルアップロードを受け取ります。
    • URL decoder - HTTPリクエストを解析します。
    • UPnP handler -UPnPメッセージを処理します。
    • WebSocket - Websocketサーバです。
  • mDNS - マルチキャストDNSサービスです。
  • UPnP - UPnP/1.0の機能を提供します。UPnP handlerと協調して動作します。(現在はデバイス探索(SSDP)・デスクリプション(Description)のみ実装してあります。)
  • DHCP/APIPA - ゼロコンフィギュレーション用のモジュールです。
  • HTTP/1.1 Client
  • mbed C++ class library - mbed向けのC++CPIです。C言語のものより簡単です。

対応機種

  • mbed(mbed LPC1768)
  • LPCXpresso1769

プログラム

Import programMiMicRemoteMCU-for-Mbed

MiMic RemoteMCU for mbed. This program provides MCU control API over REST API. It can control MCU from Javascript,PHP or any HTTP rest client directly. And, The application has self development environment.

Import programMbedFileServer

The program publishes files at local directory and SD filesystem. It is a full-fledged webServer somewhat.

サンプル

Import programMiMicSimpleHttpd

This is a simplest HTTP server made ​​of libMiMic. It will echo back a request path.

Import programUPnPBasicDevice

Simplest UPnP basic device example. This program to run UPnP basic device on the mbed.

Import programWebSocketSample

MiMicSDK Websocket module sample program.

Import programHttpClientSamlpe

A http client sample program.

Import programTcpSocketClientSamlpe

MiMicSDK Tcp client socket sample program.

Import programUdpSocketSamlpe

Udp socket sample program. This program will send back the received packet.

チュートリアル

English

libMiMic(MiMic library for mbed) is SDK which provides Webservice functions. It can be created networking device easily using mbed.

See more MiMic information, See MiMic project website. http://nyatla.jp/mimic/wp/

Structure

libMiMic run on mbed RTOS and provides networking API to user application. This library has C++ class API for the mbed, and low-level C language API.

/media/uploads/nyatla/libmimic-sdk.png

For WebService general, it can be written in a simple C + + API.

libMiMic does not have the standard Ethernet driver of mbed. It is not possible that will be used with the standard Ethernet driver.

  • MiMicIP - IPv4 protocol stack. This is based uip which is reduced memory and latency.
  • ARP / ICMP / UDP / TCP - Those are provide basic IP protocols.
  • HTTP/1.1 Server - The Http server compatible HTTP/1.1. It supports multi-session, chunked transport, persistent connection.
  • HTTP Modules - There are addon-module for HTTP server. The following modules.
    • ROM file module - Publish the file images in ROM.
    • File system module - Publish thefiles in mbed file system.
    • Onchip configuration module - To save the network settings to the program flash via REST.
    • MiMicVM module - To handle the (MiMicVM) RPC request.
    • FileUpload module - Accept a file via HTTP POST.
    • URL dedoce module - A versatility URL decoder.
    • UPnP handle module - To handle UPnP messages.
    • UPnP - This provides UPnP/1.0 device functions. It works together with UPnP handler.
    • Websocket - websocket (version13) server
  • mDNS Service - DNS-SD protocol server.
  • UPnP - This provides UPnP/1.0 device functions which works with UPnP handler. (You have been implemented (SSDP) ? description only (Description) device search now.) It is a module zero configuration for - DHCP / APIPA. mbed C + + class library - C of mbed for + + is the CPI. It is simple than that of the C language.
  • DHCP/APIPA - It support zero-cpnfigulation.
  • mbed C++ class library. Almost APIs for Web applications are available.
  • HTTP/1.1 Client

Supported target

  • mbed(mbed LPC1768)
  • LPCXpresso1769

Application

Import programMiMicRemoteMCU-for-Mbed

MiMic RemoteMCU for mbed. This program provides MCU control API over REST API. It can control MCU from Javascript,PHP or any HTTP rest client directly. And, The application has self development environment.

Import programMbedFileServer

The program publishes files at local directory and SD filesystem. It is a full-fledged webServer somewhat.

Sample

Import programMiMicSimpleHttpd

This is a simplest HTTP server made ​​of libMiMic. It will echo back a request path.

Import programUPnPBasicDevice

Simplest UPnP basic device example. This program to run UPnP basic device on the mbed.

Import programWebSocketSample

MiMicSDK Websocket module sample program.

Import programHttpClientSamlpe

A http client sample program.

Import programTcpSocketClientSamlpe

MiMicSDK Tcp client socket sample program.

Import programUdpSocketSamlpe

Udp socket sample program. This program will send back the received packet.

Tutorial

Committer:
nyatla
Date:
Wed Mar 27 12:07:47 2013 +0000
Revision:
2:b96c1e90d120
???????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nyatla 2:b96c1e90d120 1 /*********************************************************************************
nyatla 2:b96c1e90d120 2 * PROJECT: MiMic
nyatla 2:b96c1e90d120 3 * --------------------------------------------------------------------------------
nyatla 2:b96c1e90d120 4 *
nyatla 2:b96c1e90d120 5 * This file is part of MiMic
nyatla 2:b96c1e90d120 6 * Copyright (C)2011 Ryo Iizuka
nyatla 2:b96c1e90d120 7 *
nyatla 2:b96c1e90d120 8 * MiMic is free software: you can redistribute it and/or modify
nyatla 2:b96c1e90d120 9 * it under the terms of the GNU Lesser General Public License as published
nyatla 2:b96c1e90d120 10 * by the Free Software Foundation, either version 3 of the License, or
nyatla 2:b96c1e90d120 11 * (at your option) any later version.
nyatla 2:b96c1e90d120 12 *
nyatla 2:b96c1e90d120 13 * This program is distributed in the hope that it will be useful,
nyatla 2:b96c1e90d120 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nyatla 2:b96c1e90d120 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
nyatla 2:b96c1e90d120 16 * GNU General Public License for more details.
nyatla 2:b96c1e90d120 17 *
nyatla 2:b96c1e90d120 18 * You should have received a copy of the GNU Lesser General Public License
nyatla 2:b96c1e90d120 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
nyatla 2:b96c1e90d120 20 *
nyatla 2:b96c1e90d120 21 * For further information please contact.
nyatla 2:b96c1e90d120 22 * http://nyatla.jp/
nyatla 2:b96c1e90d120 23 * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
nyatla 2:b96c1e90d120 24 *
nyatla 2:b96c1e90d120 25 *********************************************************************************/
nyatla 2:b96c1e90d120 26 #include <ctype.h>
nyatla 2:b96c1e90d120 27 #include <stdlib.h>
nyatla 2:b96c1e90d120 28 #include "NyLPC_cMiMicVM_protected.h"
nyatla 2:b96c1e90d120 29
nyatla 2:b96c1e90d120 30 static NyLPC_TUInt8 process_instruction(NyLPC_TcMiMicVM_t* i_inst,const union NyLPC_TcMiMicVM_TInstruction* ist,NyLPC_TUInt32* o_code);
nyatla 2:b96c1e90d120 31
nyatla 2:b96c1e90d120 32
nyatla 2:b96c1e90d120 33
nyatla 2:b96c1e90d120 34 void NyLPC_cMiMicVM_initialize(NyLPC_TcMiMicVM_t* i_inst,struct NyLPC_TcMiMicVM_TEvent* i_handler)
nyatla 2:b96c1e90d120 35 {
nyatla 2:b96c1e90d120 36 NyLPC_Assert(i_inst!=NULL);
nyatla 2:b96c1e90d120 37 NyLPC_Assert(i_handler!=NULL);
nyatla 2:b96c1e90d120 38 NyLPC_Assert(i_handler->get_stream!=NULL);
nyatla 2:b96c1e90d120 39 NyLPC_Assert(i_handler->put_stream!=NULL);
nyatla 2:b96c1e90d120 40 NyLPC_Assert(i_handler->sleep!=NULL);
nyatla 2:b96c1e90d120 41 i_inst->_event_handler=i_handler;
nyatla 2:b96c1e90d120 42 return;
nyatla 2:b96c1e90d120 43 }
nyatla 2:b96c1e90d120 44
nyatla 2:b96c1e90d120 45
nyatla 2:b96c1e90d120 46 /**
nyatla 2:b96c1e90d120 47 * 固定長命令+固定長データを実行します。
nyatla 2:b96c1e90d120 48 * 関数の終了条件は、1.EXIT命令に到達する。2.インストラクションの終端に到達する。3.エラーが発生する。
nyatla 2:b96c1e90d120 49 *
nyatla 2:b96c1e90d120 50 */
nyatla 2:b96c1e90d120 51 NyLPC_TUInt32 NyLPC_cMiMicVM_run(NyLPC_TcMiMicVM_t* i_inst,const NyLPC_TUInt32* i_instruction,const NyLPC_TUInt16 i_size_of_instruction)
nyatla 2:b96c1e90d120 52 {
nyatla 2:b96c1e90d120 53 //データ部をgetstreamと連動させること。
nyatla 2:b96c1e90d120 54 NyLPC_TUInt32 retcode=NyLPC_cMiMicVM_RESULT_OK;
nyatla 2:b96c1e90d120 55 NyLPC_TUInt16 pc=0;
nyatla 2:b96c1e90d120 56 NyLPC_TUInt8 proc_in_byte;
nyatla 2:b96c1e90d120 57 if(i_size_of_instruction>0){
nyatla 2:b96c1e90d120 58 proc_in_byte=process_instruction(i_inst,(const union NyLPC_TcMiMicVM_TInstruction*)(i_instruction+pc),&retcode);
nyatla 2:b96c1e90d120 59 pc+=proc_in_byte;
nyatla 2:b96c1e90d120 60 //プログラムの終端に到達するか、0バイト処理の場合にブレーク。
nyatla 2:b96c1e90d120 61 while(proc_in_byte>0 && pc<i_size_of_instruction){
nyatla 2:b96c1e90d120 62 proc_in_byte=process_instruction(i_inst,(const union NyLPC_TcMiMicVM_TInstruction*)(i_instruction+pc),&retcode);
nyatla 2:b96c1e90d120 63 pc+=proc_in_byte;
nyatla 2:b96c1e90d120 64 }
nyatla 2:b96c1e90d120 65 }
nyatla 2:b96c1e90d120 66 return retcode;
nyatla 2:b96c1e90d120 67 }
nyatla 2:b96c1e90d120 68 /**
nyatla 2:b96c1e90d120 69 * 出力ストリームへ32ビット値を書き出す。
nyatla 2:b96c1e90d120 70 */
nyatla 2:b96c1e90d120 71 NyLPC_TBool NyLPC_cMiMicVM_sput(NyLPC_TcMiMicVM_t* i_inst,NyLPC_TUInt32 i_val)
nyatla 2:b96c1e90d120 72 {
nyatla 2:b96c1e90d120 73 if(!i_inst->_event_handler->put_stream(i_inst->_event_handler,i_val)){
nyatla 2:b96c1e90d120 74 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 75 }
nyatla 2:b96c1e90d120 76 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 77 }
nyatla 2:b96c1e90d120 78 /**
nyatla 2:b96c1e90d120 79 * 入力ストリームから32ビット値を読み出す。
nyatla 2:b96c1e90d120 80 */
nyatla 2:b96c1e90d120 81 NyLPC_TBool NyLPC_cMiMicVM_sget(NyLPC_TcMiMicVM_t* i_inst,NyLPC_TUInt32* o_val)
nyatla 2:b96c1e90d120 82 {
nyatla 2:b96c1e90d120 83 if(!i_inst->_event_handler->get_stream(i_inst->_event_handler,o_val)){
nyatla 2:b96c1e90d120 84 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 85 }
nyatla 2:b96c1e90d120 86 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 87 }
nyatla 2:b96c1e90d120 88
nyatla 2:b96c1e90d120 89
nyatla 2:b96c1e90d120 90
nyatla 2:b96c1e90d120 91 /**
nyatla 2:b96c1e90d120 92 * インストラクションを1個処理し、処理したバイト数を返す。
nyatla 2:b96c1e90d120 93 * インストラクションの境界値はチェックされないので、コンパイル時にチェックしておくこと。
nyatla 2:b96c1e90d120 94 * @return
nyatla 2:b96c1e90d120 95 * 処理したインストラクションのワード数(UInt32単位)。
nyatla 2:b96c1e90d120 96 * 終了した場合は0を返す。0を返したときは、ret_codeにMiMicVMの終了コードを返す。
nyatla 2:b96c1e90d120 97 */
nyatla 2:b96c1e90d120 98 static NyLPC_TUInt8 process_instruction(NyLPC_TcMiMicVM_t* i_inst,const union NyLPC_TcMiMicVM_TInstruction* ist,NyLPC_TUInt32* o_code)
nyatla 2:b96c1e90d120 99 {
nyatla 2:b96c1e90d120 100 NyLPC_TUInt32 tret;
nyatla 2:b96c1e90d120 101 switch(ist->op.opc){
nyatla 2:b96c1e90d120 102 case NyLPC_TcMiMicVM_OP_TYPE_AND:
nyatla 2:b96c1e90d120 103 switch(ist->op.oprtype){
nyatla 2:b96c1e90d120 104 case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:
nyatla 2:b96c1e90d120 105 i_inst->wm[ist->wmwm_32.wm1]&=i_inst->wm[ist->wmwm_32.wm2];
nyatla 2:b96c1e90d120 106 break;
nyatla 2:b96c1e90d120 107 case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:
nyatla 2:b96c1e90d120 108 i_inst->wm[ist->wmh32_64.wm]&=ist->wmh32_64.h32;
nyatla 2:b96c1e90d120 109 break;
nyatla 2:b96c1e90d120 110 default:
nyatla 2:b96c1e90d120 111 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 112 }
nyatla 2:b96c1e90d120 113 break;
nyatla 2:b96c1e90d120 114 case NyLPC_TcMiMicVM_OP_TYPE_OR:
nyatla 2:b96c1e90d120 115 switch(ist->op.oprtype){
nyatla 2:b96c1e90d120 116 case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:
nyatla 2:b96c1e90d120 117 i_inst->wm[ist->wmwm_32.wm1]|=i_inst->wm[ist->wmwm_32.wm2];
nyatla 2:b96c1e90d120 118 break;
nyatla 2:b96c1e90d120 119 case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:
nyatla 2:b96c1e90d120 120 i_inst->wm[ist->wmh32_64.wm]|=ist->wmh32_64.h32;
nyatla 2:b96c1e90d120 121 break;
nyatla 2:b96c1e90d120 122 default:
nyatla 2:b96c1e90d120 123 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 124 }
nyatla 2:b96c1e90d120 125 break;
nyatla 2:b96c1e90d120 126 case NyLPC_TcMiMicVM_OP_TYPE_XOR:
nyatla 2:b96c1e90d120 127 switch(ist->op.oprtype){
nyatla 2:b96c1e90d120 128 case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:
nyatla 2:b96c1e90d120 129 i_inst->wm[ist->wmwm_32.wm1]^=i_inst->wm[ist->wmwm_32.wm2];
nyatla 2:b96c1e90d120 130 break;
nyatla 2:b96c1e90d120 131 case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:
nyatla 2:b96c1e90d120 132 i_inst->wm[ist->wmh32_64.wm]^=ist->wmh32_64.h32;
nyatla 2:b96c1e90d120 133 break;
nyatla 2:b96c1e90d120 134 default:
nyatla 2:b96c1e90d120 135 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 136 }
nyatla 2:b96c1e90d120 137 break;
nyatla 2:b96c1e90d120 138 case NyLPC_TcMiMicVM_OP_TYPE_NOT:
nyatla 2:b96c1e90d120 139 switch(ist->op.oprtype){
nyatla 2:b96c1e90d120 140 case NyLPC_TcMiMicVM_OPR_TYPE_WM:
nyatla 2:b96c1e90d120 141 i_inst->wm[ist->wm_32.wm]=~i_inst->wm[ist->wm_32.wm];
nyatla 2:b96c1e90d120 142 break;
nyatla 2:b96c1e90d120 143 default:
nyatla 2:b96c1e90d120 144 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 145 }
nyatla 2:b96c1e90d120 146 break;
nyatla 2:b96c1e90d120 147 case NyLPC_TcMiMicVM_OP_TYPE_SHL:
nyatla 2:b96c1e90d120 148 switch(ist->op.oprtype){
nyatla 2:b96c1e90d120 149 case NyLPC_TcMiMicVM_OPR_TYPE_WM_H08:
nyatla 2:b96c1e90d120 150 i_inst->wm[ist->wmh08_32.wm]=i_inst->wm[ist->wmh08_32.wm]<<ist->wmh08_32.h8;
nyatla 2:b96c1e90d120 151 break;
nyatla 2:b96c1e90d120 152 case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:
nyatla 2:b96c1e90d120 153 i_inst->wm[ist->wmwm_32.wm1]=i_inst->wm[ist->wmwm_32.wm1]<<i_inst->wm[ist->wmwm_32.wm2];
nyatla 2:b96c1e90d120 154 break;
nyatla 2:b96c1e90d120 155 default:
nyatla 2:b96c1e90d120 156 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 157 }
nyatla 2:b96c1e90d120 158 break;
nyatla 2:b96c1e90d120 159 case NyLPC_TcMiMicVM_OP_TYPE_SHR:
nyatla 2:b96c1e90d120 160 switch(ist->op.oprtype){
nyatla 2:b96c1e90d120 161 case NyLPC_TcMiMicVM_OPR_TYPE_WM_H08:
nyatla 2:b96c1e90d120 162 i_inst->wm[ist->wmh08_32.wm]=i_inst->wm[ist->wmh08_32.wm]>>ist->wmh08_32.h8;
nyatla 2:b96c1e90d120 163 break;
nyatla 2:b96c1e90d120 164 case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:
nyatla 2:b96c1e90d120 165 i_inst->wm[ist->wmwm_32.wm1]=i_inst->wm[ist->wmwm_32.wm1]>>i_inst->wm[ist->wmwm_32.wm2];
nyatla 2:b96c1e90d120 166 break;
nyatla 2:b96c1e90d120 167 default:
nyatla 2:b96c1e90d120 168 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 169 }
nyatla 2:b96c1e90d120 170 break;
nyatla 2:b96c1e90d120 171 case NyLPC_TcMiMicVM_OP_TYPE_ADD:
nyatla 2:b96c1e90d120 172 switch(ist->op.oprtype){
nyatla 2:b96c1e90d120 173 case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:
nyatla 2:b96c1e90d120 174 i_inst->wm[ist->wmwm_32.wm1]+=i_inst->wm[ist->wmwm_32.wm2];
nyatla 2:b96c1e90d120 175 break;
nyatla 2:b96c1e90d120 176 case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:
nyatla 2:b96c1e90d120 177 i_inst->wm[ist->wmh32_64.wm]+=ist->wmh32_64.h32;
nyatla 2:b96c1e90d120 178 break;
nyatla 2:b96c1e90d120 179 default:
nyatla 2:b96c1e90d120 180 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 181 }
nyatla 2:b96c1e90d120 182 break;
nyatla 2:b96c1e90d120 183 case NyLPC_TcMiMicVM_OP_TYPE_SUB:
nyatla 2:b96c1e90d120 184 switch(ist->op.oprtype){
nyatla 2:b96c1e90d120 185 case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:
nyatla 2:b96c1e90d120 186 i_inst->wm[ist->wmwm_32.wm1]-=i_inst->wm[ist->wmwm_32.wm2];
nyatla 2:b96c1e90d120 187 break;
nyatla 2:b96c1e90d120 188 case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:
nyatla 2:b96c1e90d120 189 i_inst->wm[ist->wmh32_64.wm]-=ist->wmh32_64.h32;
nyatla 2:b96c1e90d120 190 break;
nyatla 2:b96c1e90d120 191 default:
nyatla 2:b96c1e90d120 192 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 193 }
nyatla 2:b96c1e90d120 194 break;
nyatla 2:b96c1e90d120 195 case NyLPC_TcMiMicVM_OP_TYPE_MUL:
nyatla 2:b96c1e90d120 196 switch(ist->op.oprtype){
nyatla 2:b96c1e90d120 197 case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:
nyatla 2:b96c1e90d120 198 i_inst->wm[ist->wmwm_32.wm1]*=i_inst->wm[ist->wmwm_32.wm2];
nyatla 2:b96c1e90d120 199 break;
nyatla 2:b96c1e90d120 200 case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:
nyatla 2:b96c1e90d120 201 i_inst->wm[ist->wmh32_64.wm]*=ist->wmh32_64.h32;
nyatla 2:b96c1e90d120 202 break;
nyatla 2:b96c1e90d120 203 default:
nyatla 2:b96c1e90d120 204 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 205 }
nyatla 2:b96c1e90d120 206 break;
nyatla 2:b96c1e90d120 207 case NyLPC_TcMiMicVM_OP_TYPE_MGET:
nyatla 2:b96c1e90d120 208 switch(ist->op.oprtype){
nyatla 2:b96c1e90d120 209 case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:
nyatla 2:b96c1e90d120 210 i_inst->wm[ist->wmh32_64.wm]=*((NyLPC_TUInt32*)(ist->wmh32_64.h32));
nyatla 2:b96c1e90d120 211 break;
nyatla 2:b96c1e90d120 212 case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:
nyatla 2:b96c1e90d120 213 i_inst->wm[ist->wmwm_32.wm1]=*((NyLPC_TUInt32*)(i_inst->wm[ist->wmwm_32.wm2]));
nyatla 2:b96c1e90d120 214 break;
nyatla 2:b96c1e90d120 215 default:
nyatla 2:b96c1e90d120 216 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 217 }
nyatla 2:b96c1e90d120 218 break;
nyatla 2:b96c1e90d120 219 case NyLPC_TcMiMicVM_OP_TYPE_MPUT:
nyatla 2:b96c1e90d120 220 switch(ist->op.oprtype){
nyatla 2:b96c1e90d120 221 case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:
nyatla 2:b96c1e90d120 222 *((NyLPC_TUInt32*)(ist->wmh32_64.h32))=i_inst->wm[ist->wmh32_64.wm];
nyatla 2:b96c1e90d120 223 break;
nyatla 2:b96c1e90d120 224 case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:
nyatla 2:b96c1e90d120 225 *((NyLPC_TUInt32*)(i_inst->wm[ist->wmwm_32.wm2]))=i_inst->wm[ist->wmwm_32.wm1];
nyatla 2:b96c1e90d120 226 break;
nyatla 2:b96c1e90d120 227 default:
nyatla 2:b96c1e90d120 228 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 229 }
nyatla 2:b96c1e90d120 230 break;
nyatla 2:b96c1e90d120 231 case NyLPC_TcMiMicVM_OP_TYPE_SGET:
nyatla 2:b96c1e90d120 232 switch(ist->op.oprtype){
nyatla 2:b96c1e90d120 233 case NyLPC_TcMiMicVM_OPR_TYPE_WM:
nyatla 2:b96c1e90d120 234 if(!i_inst->_event_handler->get_stream(i_inst->_event_handler,&(i_inst->wm[ist->wm_32.wm]))){
nyatla 2:b96c1e90d120 235 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 236 }
nyatla 2:b96c1e90d120 237 break;
nyatla 2:b96c1e90d120 238 default:
nyatla 2:b96c1e90d120 239 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 240 }
nyatla 2:b96c1e90d120 241 break;
nyatla 2:b96c1e90d120 242 case NyLPC_TcMiMicVM_OP_TYPE_SPUT:
nyatla 2:b96c1e90d120 243 switch(ist->op.oprtype){
nyatla 2:b96c1e90d120 244 case NyLPC_TcMiMicVM_OPR_TYPE_WM:
nyatla 2:b96c1e90d120 245 if(!i_inst->_event_handler->put_stream(i_inst->_event_handler,i_inst->wm[ist->wm_32.wm])){
nyatla 2:b96c1e90d120 246 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 247 }
nyatla 2:b96c1e90d120 248 break;
nyatla 2:b96c1e90d120 249 case NyLPC_TcMiMicVM_OPR_TYPE_H32:
nyatla 2:b96c1e90d120 250 if(!i_inst->_event_handler->put_stream(i_inst->_event_handler,ist->h32_64.h32)){
nyatla 2:b96c1e90d120 251 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 252 }
nyatla 2:b96c1e90d120 253 break;
nyatla 2:b96c1e90d120 254 default:
nyatla 2:b96c1e90d120 255 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 256 }
nyatla 2:b96c1e90d120 257 break;
nyatla 2:b96c1e90d120 258 case NyLPC_TcMiMicVM_OP_TYPE_LD:
nyatla 2:b96c1e90d120 259 switch(ist->op.oprtype){
nyatla 2:b96c1e90d120 260 case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:
nyatla 2:b96c1e90d120 261 i_inst->wm[ist->wmwm_32.wm1]=i_inst->wm[ist->wmwm_32.wm2];
nyatla 2:b96c1e90d120 262 break;
nyatla 2:b96c1e90d120 263 case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:
nyatla 2:b96c1e90d120 264 i_inst->wm[ist->wmh32_64.wm]=ist->wmh32_64.h32;
nyatla 2:b96c1e90d120 265 break;
nyatla 2:b96c1e90d120 266 default:
nyatla 2:b96c1e90d120 267 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 268 }
nyatla 2:b96c1e90d120 269 break;
nyatla 2:b96c1e90d120 270 case NyLPC_TcMiMicVM_OP_TYPE_NOP:
nyatla 2:b96c1e90d120 271 switch(ist->op.oprtype){
nyatla 2:b96c1e90d120 272 case NyLPC_TcMiMicVM_OPR_TYPE_NONE:
nyatla 2:b96c1e90d120 273 break;
nyatla 2:b96c1e90d120 274 case NyLPC_TcMiMicVM_OPR_TYPE_H08:
nyatla 2:b96c1e90d120 275 i_inst->_event_handler->sleep(i_inst->_event_handler,ist->h8_32.h8);
nyatla 2:b96c1e90d120 276 break;
nyatla 2:b96c1e90d120 277 default:
nyatla 2:b96c1e90d120 278 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 279 }
nyatla 2:b96c1e90d120 280 break;
nyatla 2:b96c1e90d120 281 //native call
nyatla 2:b96c1e90d120 282 case NyLPC_TcMiMicVM_OP_TYPE_CALL:
nyatla 2:b96c1e90d120 283 switch(ist->op.oprtype){
nyatla 2:b96c1e90d120 284 case NyLPC_TcMiMicVM_OPR_TYPE_WM:
nyatla 2:b96c1e90d120 285 tret=i_inst->_event_handler->native_call(i_inst->_event_handler,i_inst->wm[ist->wm_32.wm],i_inst);
nyatla 2:b96c1e90d120 286 if(!NyLPC_cMiMicVM_RESULT_isOK(tret)){
nyatla 2:b96c1e90d120 287 *o_code=tret;
nyatla 2:b96c1e90d120 288 NyLPC_OnErrorGoto(ERROR_INHERIT);//エラー継承
nyatla 2:b96c1e90d120 289 }
nyatla 2:b96c1e90d120 290 break;
nyatla 2:b96c1e90d120 291 case NyLPC_TcMiMicVM_OPR_TYPE_H32:
nyatla 2:b96c1e90d120 292 tret=i_inst->_event_handler->native_call(i_inst->_event_handler,ist->h32_64.h32,i_inst);
nyatla 2:b96c1e90d120 293 if(!NyLPC_cMiMicVM_RESULT_isOK(tret)){
nyatla 2:b96c1e90d120 294 *o_code=tret;
nyatla 2:b96c1e90d120 295 NyLPC_OnErrorGoto(ERROR_INHERIT);//エラー継承
nyatla 2:b96c1e90d120 296 }
nyatla 2:b96c1e90d120 297 break;
nyatla 2:b96c1e90d120 298 default:
nyatla 2:b96c1e90d120 299 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 300 }
nyatla 2:b96c1e90d120 301 break;
nyatla 2:b96c1e90d120 302 case NyLPC_TcMiMicVM_OP_TYPE_EXIT:
nyatla 2:b96c1e90d120 303 *o_code=NyLPC_cMiMicVM_RESULT_OK;//OKに上書き
nyatla 2:b96c1e90d120 304 return 0;
nyatla 2:b96c1e90d120 305 default:
nyatla 2:b96c1e90d120 306 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 307 }
nyatla 2:b96c1e90d120 308 //実行したコードのワード長を返す。
nyatla 2:b96c1e90d120 309 switch(ist->op.oprtype){
nyatla 2:b96c1e90d120 310 case NyLPC_TcMiMicVM_OPR_TYPE_NONE:
nyatla 2:b96c1e90d120 311 case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:
nyatla 2:b96c1e90d120 312 case NyLPC_TcMiMicVM_OPR_TYPE_WM_H08:
nyatla 2:b96c1e90d120 313 case NyLPC_TcMiMicVM_OPR_TYPE_WM:
nyatla 2:b96c1e90d120 314 case NyLPC_TcMiMicVM_OPR_TYPE_H08:
nyatla 2:b96c1e90d120 315 case NyLPC_TcMiMicVM_OPR_TYPE_H16:
nyatla 2:b96c1e90d120 316 *o_code=NyLPC_cMiMicVM_RESULT_OK;//OKに上書き
nyatla 2:b96c1e90d120 317 return 1;
nyatla 2:b96c1e90d120 318 case NyLPC_TcMiMicVM_OPR_TYPE_WM_H16:
nyatla 2:b96c1e90d120 319 case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:
nyatla 2:b96c1e90d120 320 case NyLPC_TcMiMicVM_OPR_TYPE_H32:
nyatla 2:b96c1e90d120 321 *o_code=NyLPC_cMiMicVM_RESULT_OK;//OKに上書き
nyatla 2:b96c1e90d120 322 return 2;
nyatla 2:b96c1e90d120 323 }
nyatla 2:b96c1e90d120 324 ERROR:
nyatla 2:b96c1e90d120 325 *o_code=NyLPC_cMiMicVM_RESULT_RUNTIME_NG;//ランタイムNG
nyatla 2:b96c1e90d120 326 ERROR_INHERIT:
nyatla 2:b96c1e90d120 327 return 0;
nyatla 2:b96c1e90d120 328 }
nyatla 2:b96c1e90d120 329
nyatla 2:b96c1e90d120 330 #define TEST
nyatla 2:b96c1e90d120 331 #ifndef TEST
nyatla 2:b96c1e90d120 332
nyatla 2:b96c1e90d120 333 #include "NyLPC_cMiMicTxtCompiler.h"
nyatla 2:b96c1e90d120 334 void main(void)
nyatla 2:b96c1e90d120 335 {
nyatla 2:b96c1e90d120 336 struct NyLPC_TcMiMicVM_TEvent eh;
nyatla 2:b96c1e90d120 337 NyLPC_TUInt32 ap;
nyatla 2:b96c1e90d120 338 NyLPC_TcMiMicVM_t vm;
nyatla 2:b96c1e90d120 339 struct NyLPC_TCharArrayPtr bc;
nyatla 2:b96c1e90d120 340 NyLPC_TcMiMicTxtCompiler_t inst;
nyatla 2:b96c1e90d120 341 struct NyLPC_TUInt32ArrayPtr bin;
nyatla 2:b96c1e90d120 342 char BC[1024];
nyatla 2:b96c1e90d120 343 int ist_len;
nyatla 2:b96c1e90d120 344
nyatla 2:b96c1e90d120 345 NyLPC_TUInt16 l,bl;
nyatla 2:b96c1e90d120 346 NyLPC_TUInt32 obuf[1024];
nyatla 2:b96c1e90d120 347 NyLPC_cMiMicBcCompiler_initialize(&inst);
nyatla 2:b96c1e90d120 348 sprintf(BC,"AA0102AB0100000001AE0203AF0200000003AI0304AJ0300000004AM07BA0505BE0607CA0304CB0300000005CE0304CF0300000005CI0304CJ0300000005ZA.E",&ap,&ap);
nyatla 2:b96c1e90d120 349 bc.ptr=(char* )BC;
nyatla 2:b96c1e90d120 350 bc.len=strlen(BC);
nyatla 2:b96c1e90d120 351 bin.ptr=obuf;
nyatla 2:b96c1e90d120 352 bin.len=100;
nyatla 2:b96c1e90d120 353 ist_len=0;
nyatla 2:b96c1e90d120 354
nyatla 2:b96c1e90d120 355 for(;;){
nyatla 2:b96c1e90d120 356
nyatla 2:b96c1e90d120 357 switch(NyLPC_cMiMicBcCompiler_compileFragment(&inst,&bc,&bin,&bl,&l))
nyatla 2:b96c1e90d120 358 {
nyatla 2:b96c1e90d120 359 case NyLPC_TcMiMicTxtCompiler_RET_OK:
nyatla 2:b96c1e90d120 360 //命令確定。
nyatla 2:b96c1e90d120 361 NyLPC_TCharArrayPtr_seek(&bc,l);
nyatla 2:b96c1e90d120 362 ist_len+=bl;
nyatla 2:b96c1e90d120 363 break;
nyatla 2:b96c1e90d120 364 case NyLPC_TcMiMicTxtCompiler_RET_OK_END:
nyatla 2:b96c1e90d120 365 //命令終端
nyatla 2:b96c1e90d120 366 NyLPC_cMiMicVM_initialize(&vm,&eh);
nyatla 2:b96c1e90d120 367 if(!NyLPC_cMiMicVM_run(&vm,obuf,ist_len)){
nyatla 2:b96c1e90d120 368 printf("エンダァ");
nyatla 2:b96c1e90d120 369 }
nyatla 2:b96c1e90d120 370 printf("OK");
nyatla 2:b96c1e90d120 371 break;
nyatla 2:b96c1e90d120 372 case NyLPC_TcMiMicTxtCompiler_RET_CONTINUE:
nyatla 2:b96c1e90d120 373 //蓄積中。
nyatla 2:b96c1e90d120 374 NyLPC_TCharArrayPtr_seek(&bc,l);
nyatla 2:b96c1e90d120 375 break;
nyatla 2:b96c1e90d120 376 case NyLPC_TcMiMicTxtCompiler_RET_NG:
nyatla 2:b96c1e90d120 377 printf("エラー");
nyatla 2:b96c1e90d120 378 return;
nyatla 2:b96c1e90d120 379 default:
nyatla 2:b96c1e90d120 380 break;
nyatla 2:b96c1e90d120 381 }
nyatla 2:b96c1e90d120 382 }
nyatla 2:b96c1e90d120 383 }
nyatla 2:b96c1e90d120 384 #endif