diff --git a/SMILEBASIC/TEST.txt b/SMILEBASIC/TEST.txt index de1072f..088081d 100644 --- a/SMILEBASIC/TEST.txt +++ b/SMILEBASIC/TEST.txt @@ -1,3 +1,7 @@ +TABSTEP=4 +FOR i=0 TO 20 +?"A","B", +NEXT SPSET 0,1206 SPANIM 0,"I",-90,1209,0 WHILE 1 diff --git a/SMILEBASIC/VM.d b/SMILEBASIC/VM.d index f081e33..0498631 100644 --- a/SMILEBASIC/VM.d +++ b/SMILEBASIC/VM.d @@ -224,7 +224,7 @@ class PrintCode : Code case ValueType.String: //write(arg.stringValue); if(vm.petitcomputer) - vm.petitcomputer.printConsole(arg.stringValue); + vm.petitcomputer.printConsoleString(arg.stringValue); break; default: //type mismatch @@ -1421,7 +1421,7 @@ class PushSystemVariable : Code } override void execute(VM vm) { - vm.push(var.value(vm)); + vm.push(var.value); } override string toString(VM vm) { diff --git a/SMILEBASIC/compiler.d b/SMILEBASIC/compiler.d index b616a88..4f6df42 100644 --- a/SMILEBASIC/compiler.d +++ b/SMILEBASIC/compiler.d @@ -192,12 +192,20 @@ class Compiler sysVariable["CSRZ"] = new CSRZ(); addSystemVariable("VERSION", new Version()); addSystemVariable("FREEMEM", new FreeMem()); + addSystemVariable("TABSTEP", new TabStep()); } void addSystemVariable(wstring name, SystemVariable var) { global[name] = VMVariable(-1); sysVariable[name] = var; } + void registerSystemVariable(VM vm) + { + foreach(k, ref v; sysVariable) + { + v.vm = vm; + } + } SystemVariable[wstring] sysVariable; Code[] code; VMVariable[wstring] global; @@ -1030,7 +1038,9 @@ class Compiler code[i] = new RestoreCode(s.data.label[restore.label], s.data); } } - return new VM(code, globalIndex + 1, global, functions, s.data, globalLabel, debugInfo); + VM vm = new VM(code, globalIndex + 1, global, functions, s.data, globalLabel, debugInfo); + registerSystemVariable(vm); + return vm; } } diff --git a/SMILEBASIC/petitcomputer.d b/SMILEBASIC/petitcomputer.d index 4e3c927..65690bf 100644 --- a/SMILEBASIC/petitcomputer.d +++ b/SMILEBASIC/petitcomputer.d @@ -1602,7 +1602,10 @@ class PetitComputer printConsoleString(i.to!wstring); } } + //0<=TABSTEP<=16 + int TABSTEP = 4; byte consoleAttr; + int tab; void printConsoleString(wstring text) { //consolem.lock(); @@ -1614,16 +1617,32 @@ class PetitComputer { CSRY = consoleHeightC - 1; } - if(c != '\r' && c != '\n') + if(c == '\t') { - consoleC[CSRY][CSRX].character = c; - consoleC[CSRY][CSRX].foreColor = consoleForeColor; - consoleC[CSRY][CSRX].backColor = consoleBackColor; - consoleC[CSRY][CSRX].z = CSRZ; - consoleC[CSRY][CSRX].attr = consoleAttr; + import std.algorithm : min; + if(tab == 2 && CSRX == 0) + { + CSRX--; + } + else + { + auto t = min(CSRX + TABSTEP - CSRX % TABSTEP, consoleWidthC - 1); + consoleC[CSRY][CSRX..t] = ConsoleCharacter(0, consoleForeColor, consoleBackColor, consoleAttr, CSRZ); + CSRX += TABSTEP - (CSRX % TABSTEP) - 1; + if(CSRX + 1 >= consoleWidthC) + { + CSRX = consoleWidthC - 2; + } + tab = true; + } + } + else if(c != '\n') + { + consoleC[CSRY][CSRX] = ConsoleCharacter(c, consoleForeColor, consoleBackColor, consoleAttr, CSRZ); + tab = tab ? 2 : 0; } CSRX++; - if(CSRX >= consoleWidthC || c == '\n' || c == '\r') + if(CSRX >= consoleWidthC || c == '\n') { CSRX = 0; CSRY++; diff --git a/SMILEBASIC/systemvariable.d b/SMILEBASIC/systemvariable.d index dd96578..650a2d5 100644 --- a/SMILEBASIC/systemvariable.d +++ b/SMILEBASIC/systemvariable.d @@ -4,8 +4,9 @@ import otya.smilebasic.error; import otya.smilebasic.vm; class SystemVariable { + VM vm; @property - abstract Value value(VM vm); + abstract Value value(); @property void value(Value value) { @@ -18,7 +19,7 @@ import std.conv; class Date : SystemVariable { @property - override Value value(VM vm) + override Value value() { auto currentTime = Clock.currTime(); wstring timeString = format("%04d/%02d/%02d", currentTime.year, currentTime.month, currentTime.day).to!wstring; @@ -28,7 +29,7 @@ class Date : SystemVariable class Time : SystemVariable { @property - override Value value(VM vm) + override Value value() { auto currentTime = Clock.currTime(); wstring timeString = format("%02d:%02d:%02d", currentTime.hour, currentTime.minute, currentTime.second).to!wstring; @@ -38,7 +39,7 @@ class Time : SystemVariable class Maincnt : SystemVariable { @property - override Value value(VM vm) + override Value value() { return Value(vm.petitcomputer.maincnt); } @@ -46,7 +47,7 @@ class Maincnt : SystemVariable class CSRX : SystemVariable { @property - override Value value(VM vm) + override Value value() { return Value(vm.petitcomputer.CSRX); } @@ -54,7 +55,7 @@ class CSRX : SystemVariable class CSRY : SystemVariable { @property - override Value value(VM vm) + override Value value() { return Value(vm.petitcomputer.CSRY); } @@ -62,15 +63,37 @@ class CSRY : SystemVariable class CSRZ : SystemVariable { @property - override Value value(VM vm) + override Value value() { return Value(vm.petitcomputer.CSRZ); } } +class TabStep : SystemVariable +{ + @property + override Value value() + { + return Value(vm.petitcomputer.TABSTEP); + } + @property + override void value(Value value) + { + if(!value.isNumber) + { + throw new TypeMismatch(); + } + int i = value.castInteger; + if(i < 0 || i > 16) + { + throw new OutOfRange(); + } + vm.petitcomputer.TABSTEP = i; + } +} class Version : SystemVariable { @property - override Value value(VM vm) + override Value value() { return Value(0x3010000); } @@ -78,7 +101,7 @@ class Version : SystemVariable class FreeMem : SystemVariable { @property - override Value value(VM vm) + override Value value() { return Value(8327164); }