K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
>一年以上のお久しぶりです。8ヶ月ほど別のソフトを作っていたので、その間 >何もしていませんでした。が、まだまだ作っています。 >グラフィック部分をメインに作成しているので、なかなか見れる物ができません。 >現在約4万5千行ほどのプログラムになっています。 > また、日記みたいに書いてしまうかもしれません、問題がありましたら注意 >してください。でも、ここで書く事も1つのモチベーションになるので、ご迷惑 >でなければよろしくお願いいたします。 >言語のインプリメントですが色々変えすぎて、何を変えたか分からなくなるほ >どです。 > まずはバイトコードが変わりました。 >C++のwstringはやはり重たく、zwstringをオリジナルに作りました。 >もちろんガーベージコレクションを必要としない可変長文字列変数です。 >↓がオペコードリストです。 > > {L"dummy", L"", 0}, > {L"push_int_1byte", L"b",8}, > {L"push_int_2byte", L"s",8}, > {L"push_int_4byte", L"i",8}, // 実際の値を持つ > {L"push_double_0", L"", 12}, > {L"push_double_1", L"", 12}, > {L"push_double_8byte", L"d",12}, // 実際の値を持つ > {L"push_string_const", L"s",12}, // 文字列の位置NOを持つ0~ > {L"push_null", L"", 8}, > /**********/ > {L"push_stack_int", L"s", 8}, // intローカル変数をスタックに > {L"push_stack_double", L"s", 8}, // > {L"push_stack_string", L"s", 12}, // > {L"pop_stack_int", L"s", -8}, // スタックのintをローカル変数に > {L"pop_stack_double", L"s", -8}, // > {L"pop_stack_string", L"s", -12}, // > /**********/ > {L"push_static_int", L"s", 8}, // int静的変数をスタックに 予約 > {L"push_static_double", L"s", 12}, // > {L"push_static_string", L"s", 12}, // > {L"pop_static_int", L"s", -8}, // スタックのintを静的変数に 予約 > {L"pop_static_double", L"s", -12}, // > {L"pop_static_string", L"s", -12}, // > /**********/ > {L"push_sheet", L"s", 8}, // sheet番号をスタックに > {L"push_sheet_int ", L"s", 8}, // sheet変数をスタックに > {L"push_sheet_double", L"s", 12}, // > {L"push_sheet_str ", L"s", 12}, // > {L"pop_sheet_int ", L"s", -24}, // スタックからsheet変数に > {L"pop_sheet_double", L"s", -28}, // > {L"pop_sheet_str ", L"s", -28}, // > /**********/ > {L"push_array_ref ", L"s", 8}, // 配列参照 > {L"push_array_int ", L"s", -1}, // int配列処理 > {L"push_array_double", L"s", -1}, // > {L"push_array_string", L"s", -1}, // > {L"pop_array_int ", L"s", -1}, // スタックからint配列に > {L"pop_array_double", L"s", -1}, // > {L"pop_array_string", L"s", -1}, // > /**********/ > {L"and_int", L"", -8}, // 以下は総て算術演算子 > {L"or_int", L"", -8}, > {L"xor_int", L"", -8}, > {L"add_int", L"", -8}, > {L"add_double", L"", -12}, > {L"add_string", L"", -12}, > {L"sub_int", L"", -8}, > {L"sub_double", L"", -12}, > {L"mul_int", L"", -8}, > {L"mul_double", L"", -12}, > {L"div_int", L"", -8}, > {L"div_double", L"", -12}, > {L"mod_int", L"", -8}, > {L"mod_double", L"", -12}, > {L"minus_int", L"", 0}, > {L"minus_double", L"", 0}, > {L"increment", L"", 0}, > {L"decrement", L"", 0}, // ここまで算術演算子 > /**********/ > {L"cast_int_to_double", L"", 4}, // 以下はキャスト処理 > {L"cast_double_to_int", L"", -4}, > {L"cast_string_to_int", L"", -4}, > {L"cast_string_to_double", L"", -0}, > {L"cast_boolean_to_string", L"", 4}, > {L"cast_int_to_string", L"", 4}, > {L"cast_double_to_string", L"", 0}, // ここまでキャスト処理 > /**********/ > {L"eq_int", L"", -8}, // 以下は総て論理演算子 > {L"eq_double", L"", -16}, > {L"eq_string", L"", -16}, > {L"gt_int", L"", -8}, > {L"gt_double", L"", -16}, > {L"gt_string", L"", -16}, > {L"ge_int", L"", -8}, > {L"ge_double", L"", -16}, > {L"ge_string", L"", -16}, > {L"lt_int", L"", -8}, > {L"lt_double", L"", -16}, > {L"lt_string", L"", -16}, > {L"le_int", L"", -8}, > {L"le_double", L"", -16}, > {L"le_string", L"", -16}, > {L"ne_int", L"", -8}, > {L"ne_double", L"", -16}, > {L"ne_string", L"", -16}, // ここまで論理演算子 > {L"logical_and",L"", -8}, // > {L"logical_or", L"", -8}, // > {L"logical_not",L"", 0}, // > /**********/ > {L"pop", L"", -8}, // スタックを1つ減らす > {L"duplicate", L"", 16}, // スタック内容をコピーしてスタックに > {L"jump", L"s", 0}, // 指定ポインターにjump > {L"jump_if_true", L"s", -8}, // スタックがtrueならjump > {L"jump_if_false", L"s", -8}, // スタックがfalseならjump > {L"nop------------",L"", 0}, // nop > /**********/ > {L"push_function", L"", 0}, // 関数情報をスタック、未使用 > {L"call_function", L"ssss", 0}, // 関数コール > {L"return", L"", -1}, // 関数戻り > /**********/ > {L"set_array_literal_int", L"ss", 0}, // int定数配列を変数にコピー > {L"set_array_literal_double",L"ss", 0}, // double定数配列を変数にコピー > {L"set_array_literal_string",L"ss", 0}, // string定数配列を変数にコピー > > >また、メイン関数も1つのスレッドになり、待機リターンをしてVMを保持しないようにしました。 > ↓例 >//===================================================================== >// 最初に実行されるmein関数 >//===================================================================== >int main(int qid,int p1) >{ > if(qid == スレッド開始) { > main_init(); > return スレッド待機; > } elsif(qid == 終了指示) { > return スレッド終了; > } > return スレッドエラー終了; >} > >また、配列操作のバイトコードもよりシンプルになり 2/3以下のバイトコードになりました。 > >シートの宣言も関数外で↓のようにラベル宣言するようにしました。 > >sheet s_system[10][20]; // システム設定のシート定義(変更不可) >sheet s_key_input[2][256]; // キー入力定義(変更不可) >sheet s_mouse_input[2][11]; // マウス入力定義(変更不可) >sheet s_pad_input[8][20]; // パッド入力定義(変更不可) > >初期バージョン完成にはまだまだかかりそうです。
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!