1
0

プログラム実行とスクロールの実装.

This commit is contained in:
otya128
2015-07-09 21:28:15 +09:00
parent f73a192aa0
commit 6c7be9b92e
2 changed files with 85 additions and 3 deletions

View File

@@ -3,6 +3,7 @@ import otya.smilebasic.type;
import otya.smilebasic.token; import otya.smilebasic.token;
import otya.smilebasic.error; import otya.smilebasic.error;
import otya.smilebasic.compiler; import otya.smilebasic.compiler;
import otya.smilebasic.petitcomputer;
import std.uni; import std.uni;
import std.utf; import std.utf;
import std.conv; import std.conv;
@@ -27,6 +28,7 @@ class VM
VMVariable[wstring] globalTable; VMVariable[wstring] globalTable;
Function[wstring] functions; Function[wstring] functions;
int bp; int bp;
PetitComputer petitcomputer;
this(Code[] code, int len, VMVariable[wstring] globalTable, Function[wstring] functions) this(Code[] code, int len, VMVariable[wstring] globalTable, Function[wstring] functions)
{ {
this.code = code; this.code = code;
@@ -41,7 +43,7 @@ class VM
} }
void run() void run()
{ {
bp = 0;//globalを実行なのでbaseは0(グローバル変数をスタックに取るようにしない限り) bp = 0;//globalを実行なのでbaseは0(グローバル変数をスタックに取るようにしない限り)(挙動的にスタックに確保していなさそう)
for(pc = 0; pc < this.code.length; pc++) for(pc = 0; pc < this.code.length; pc++)
{ {
code[pc].execute(this); code[pc].execute(this);
@@ -51,6 +53,21 @@ class VM
stderr.writeln("CompilerBug?:stack"); stderr.writeln("CompilerBug?:stack");
} }
} }
void init(PetitComputer petitcomputer)
{
this.petitcomputer = petitcomputer;
bp = 0;//globalを実行なのでbaseは0(グローバル変数をスタックに取るようにしない限り)(挙動的にスタックに確保していなさそう)
}
bool runStep()
{
if(pc < this.code.length)
{
code[pc].execute(this);
pc++;
return true;
}
return false;
}
void push(ref Value value) void push(ref Value value)
{ {
stack[stacki++] = value; stack[stacki++] = value;
@@ -122,12 +139,18 @@ class PrintCode : Code
{ {
case ValueType.Integer: case ValueType.Integer:
write(arg.integerValue); write(arg.integerValue);
if(vm.petitcomputer)
vm.petitcomputer.printConsole(arg.integerValue);
break; break;
case ValueType.Double: case ValueType.Double:
write(arg.doubleValue); write(arg.doubleValue);
if(vm.petitcomputer)
vm.petitcomputer.printConsole(arg.doubleValue);
break; break;
case ValueType.String: case ValueType.String:
write(arg.stringValue); write(arg.stringValue);
if(vm.petitcomputer)
vm.petitcomputer.printConsole(arg.stringValue);
break; break;
default: default:
//type mismatch //type mismatch

View File

@@ -7,6 +7,7 @@ import std.stdio;
import std.conv; import std.conv;
import std.string; import std.string;
import std.c.stdio; import std.c.stdio;
import otya.smilebasic.parser;
class GraphicPage class GraphicPage
{ {
SDL_Surface* surface; SDL_Surface* surface;
@@ -175,9 +176,43 @@ class PetitComputer
SDL_WINDOW_SHOWN); SDL_WINDOW_SHOWN);
renderer = SDL_CreateRenderer(window, -1, 0); renderer = SDL_CreateRenderer(window, -1, 0);
GRPF.createTexture(renderer); GRPF.createTexture(renderer);
printConsole("Hello, World!!v('ω')v"); //とりあえず
auto parser = new Parser(readText("FIZZBUZZ.TXT").to!wstring);
auto vm = parser.compile();
bool running = true;
vm.init(this);
while (true) while (true)
{ {
auto startTicks = SDL_GetTicks();
uint elapse;
do
{
try
{
if(running) running = vm.runStep();
}
catch(SmileBasicError sbe)
{
try
{
printConsole(sbe.to!string);
}
catch
{
}
}
catch(Throwable t)
{
try
{
printConsole(t.to!string);
}
catch
{
}
}
elapse = SDL_GetTicks() - startTicks;
} while(elapse <= 1000 / 60);
SDL_Event event; SDL_Event event;
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer); SDL_RenderClear(renderer);
@@ -212,10 +247,21 @@ class PetitComputer
SDL_RenderCopy(renderer, GRPF.texture, &fontTable[console[y][x]], &rect); SDL_RenderCopy(renderer, GRPF.texture, &fontTable[console[y][x]], &rect);
} }
} }
void printConsole(wstring text) void printConsole(T...)(T args)
{
foreach(i; args)
{
printConsoleString(i.to!wstring);
}
}
void printConsoleString(wstring text)
{ {
foreach(wchar c; text) foreach(wchar c; text)
{ {
if(CSRY >= consoleHeight)
{
CSRY = consoleHeight - 1;
}
if(c != '\r' && c != '\n') if(c != '\r' && c != '\n')
{ {
console[CSRY][CSRX] = c; console[CSRY][CSRX] = c;
@@ -226,6 +272,19 @@ class PetitComputer
CSRX = 0; CSRX = 0;
CSRY++; CSRY++;
} }
if(CSRY >= consoleHeight)
{
auto tmp = console[0];
for(int i = 0; i < consoleHeight - 1; i++)
{
console[i] = console[i + 1];
}
console[consoleHeight - 1] = tmp;
for(int j = 0; j < tmp.length; j++)
tmp[j] = '\0';
assert(console[0] != console[2]);
CSRY = consoleHeight - 1;
}
} }
} }
} }