From 750fedcbfc340d957c5ca1adc76e2a9395d533e8 Mon Sep 17 00:00:00 2001 From: otya128 Date: Tue, 25 Aug 2015 19:52:40 +0900 Subject: [PATCH] =?UTF-8?q?RESTORE=20(=E5=BC=8F)=E3=81=AB=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SMILEBASIC/VM.d | 20 ++++++++++++++++++++ SMILEBASIC/builtinfunctions.d | 14 +++++++++++++- SMILEBASIC/compiler.d | 17 ++++++++++++++++- SMILEBASIC/petitcomputer.d | 3 ++- 4 files changed, 51 insertions(+), 3 deletions(-) diff --git a/SMILEBASIC/VM.d b/SMILEBASIC/VM.d index d5d18ec..77ad1b5 100644 --- a/SMILEBASIC/VM.d +++ b/SMILEBASIC/VM.d @@ -1332,6 +1332,26 @@ class RestoreCode : Code return "restore " ~ label.to!string; } } +class RestoreExprCode : Code +{ + DataTable datatable; + this(DataTable datatable) + { + this.datatable = datatable; + } + override void execute(VM vm) + { + Value label; + vm.pop(label); + if(!label.isString) + throw new TypeMismatch(); + datatable.dataIndex = datatable.label[label.stringValue]; + } + override string toString(VM vm) + { + return "restore expr"; + } +} class PushSystemVariable : Code { SystemVariable var; diff --git a/SMILEBASIC/builtinfunctions.d b/SMILEBASIC/builtinfunctions.d index 3c538ef..a6aa56a 100644 --- a/SMILEBASIC/builtinfunctions.d +++ b/SMILEBASIC/builtinfunctions.d @@ -699,6 +699,18 @@ class BuiltinFunction { p.getBG(layer).rot(rot); } + static void EFCON() + { + } + static void EFCOFF() + { + } + static void EFCSET(Value[]) + { + } + static void EFCWET(Value[]) + { + } //alias void function(PetitComputer, Value[], Value[]) BuiltinFunc; static BuiltinFunction[wstring] builtinFunctions; static this() @@ -1066,7 +1078,6 @@ template AddFuncArg(int L, int N, int M, int O, T, string NAME, P...) } template OutArgsInit(T, string N, int I = 0, int J = 0) { - enum tuple = ParameterStorageClassTuple!(__traits(getMember, T, N))[I]; alias param = ParameterTypeTuple!(__traits(getMember, T, N)); static if(!param.length) { @@ -1074,6 +1085,7 @@ template OutArgsInit(T, string N, int I = 0, int J = 0) } else { + enum tuple = ParameterStorageClassTuple!(__traits(getMember, T, N))[I]; static if(tuple & ParameterStorageClass.out_) { enum add = 1; diff --git a/SMILEBASIC/compiler.d b/SMILEBASIC/compiler.d index a85ca01..fd853ed 100644 --- a/SMILEBASIC/compiler.d +++ b/SMILEBASIC/compiler.d @@ -847,7 +847,22 @@ class Compiler compileRead(cast(Read)i, s); break; case NodeType.Restore: - genCode(new RestoreCodeS((cast(Constant)(cast(Restore)i).label).value.stringValue)); + { + Restore restore = cast(Restore)i; + Expression label = restore.label; + if(label.type == NodeType.Constant) + { + Constant cons = cast(Constant)label; + if(cons.value.isString) + { + genCode(new RestoreCodeS(cons.value.stringValue)); + break; + //文字列じゃないならば定数でも実行時エラー + } + } + compileExpression(label, s); + genCode(new RestoreExprCode(s.data)); + } break; case NodeType.On: compileOn(cast(On)i, s); diff --git a/SMILEBASIC/petitcomputer.d b/SMILEBASIC/petitcomputer.d index 9a422bc..8c2cee5 100644 --- a/SMILEBASIC/petitcomputer.d +++ b/SMILEBASIC/petitcomputer.d @@ -856,10 +856,11 @@ class PetitComputer //とりあえず auto parser = new Parser( //readText("./SYS/GAME6TALK.TXT").to!wstring + readText("./SYS/GAME4SHOOTER.TXT").to!wstring //readText("./SYS/GAME2RPG.TXT").to!wstring //readText("./SYS/GAME1DOTRC.TXT").to!wstring //readText(input("LOAD PROGRAM:", true).to!string).to!wstring - readText("./SYS/EX8TECDEMO.TXT").to!wstring + //readText("./SYS/EX8TECDEMO.TXT").to!wstring //readText("./SYS/EX1TEXT.TXT").to!wstring //readText("FIZZBUZZ.TXT").to!wstring //readText("TEST.TXT").to!wstring