diff --git a/SMILEBASIC/SMILEBASIC.visualdproj b/SMILEBASIC/SMILEBASIC.visualdproj index 1a001c4..3263d9c 100644 --- a/SMILEBASIC/SMILEBASIC.visualdproj +++ b/SMILEBASIC/SMILEBASIC.visualdproj @@ -205,6 +205,7 @@ *.obj;*.cmd;*.build;*.json;*.dep + diff --git a/SMILEBASIC/builtinfunctions.d b/SMILEBASIC/builtinfunctions.d index 66e21b2..5a73266 100644 --- a/SMILEBASIC/builtinfunctions.d +++ b/SMILEBASIC/builtinfunctions.d @@ -588,6 +588,44 @@ class BuiltinFunction static void TALK(wstring a1) { } + static void BGCLR(PetitComputer p, DefaultValue!(int, false) layer) + { + if(layer.isDefault) + { + foreach(bg; p.bg) + { + bg.clear; + } + return; + } + p.bg[cast(int)layer].clear; + } + static void BGSCREEN(PetitComputer p, int layer, int w, int h) + { + p.bg[layer].screen(w, h); + } + static void BGOFS(PetitComputer p, int layer, int x, int y, DefaultValue!(int, false) z) + { + z.setDefaultValue(p.bg[layer].offsetz); + p.bg[layer].ofs(x, y, cast(int)z); + } + static void BGCLIP(PetitComputer p, int layer, DefaultValue!(int, false) x, DefaultValue!(int, false) y, + DefaultValue!(int, false) x2, DefaultValue!(int, false) y2) + { + if(x.isDefault && y.isDefault && x2.isDefault && y2.isDefault) + { + p.bg[layer].clip(); + } + if(x.isDefault || y.isDefault || x2.isDefault || y2.isDefault) + { + throw new IllegalFunctionCall("BGCLIP"); + } + p.bg[layer].clip(cast(int)x, cast(int)y, cast(int)x2, cast(int)y2); + } + static void BGPUT(PetitComputer p, int layer, int x, int y, int screendata) + { + p.bg[layer].put(x, y, screendata); + } //alias void function(PetitComputer, Value[], Value[]) BuiltinFunc; static BuiltinFunction[wstring] builtinFunctions; static this() diff --git a/SMILEBASIC/compiler.d b/SMILEBASIC/compiler.d index 3639bea..c354756 100644 --- a/SMILEBASIC/compiler.d +++ b/SMILEBASIC/compiler.d @@ -895,13 +895,21 @@ class Compiler int[] addresses = new int[label.labels.length]; foreach(int index, wstring l; label.labels) { - if(label.sc.func) + try { - addresses[index] =label.sc.func.label[l]; + if(label.sc.func) + { + addresses[index] =label.sc.func.label[l]; + } + else + { + addresses[index] = globalLabel[l]; + } } - else + catch(Error re) { - addresses[index] = globalLabel[l]; + //undefined labelは実行時に出る(TECDEMOが動かない) + addresses[index] = int.min; } } if(label.isGosub) diff --git a/SMILEBASIC/main.d b/SMILEBASIC/main.d index fe7c265..5116bbf 100644 --- a/SMILEBASIC/main.d +++ b/SMILEBASIC/main.d @@ -122,15 +122,15 @@ END writeln(t); } } - try + //try { auto pc = new PetitComputer(); pc.run(); } - catch(Throwable t) + /*(Throwable t) { writeln(std.windows.charset.toMBSz(t.to!string).to!string); readln(); - } + }*/ return 0; } diff --git a/SMILEBASIC/petitcomputer.d b/SMILEBASIC/petitcomputer.d index 858e31f..83159a1 100644 --- a/SMILEBASIC/petitcomputer.d +++ b/SMILEBASIC/petitcomputer.d @@ -12,6 +12,7 @@ import core.sync.mutex; import otya.smilebasic.parser; import otya.smilebasic.sprite; import otya.smilebasic.error; +import otya.smilebasic.bg; enum Button { NONE = 0, @@ -155,35 +156,6 @@ class PetitComputer uint gcolor = -1; GraphicPage[] GRP; GraphicPage GRPF; - GraphicPage[] GRPFColor; - GraphicPage[][] GRPFColorFore; - SDL_Surface* s8x8; - SDL_Texture* t8x8; - SDL_Surface* createSurfaceFromFile(string file) - { - SDL_RWops* stream = SDL_RWFromFile(toStringz(file), toStringz("rb")); - auto surfacesrc = IMG_LoadPNG_RW(stream); - SDL_RWclose(stream); - return surfacesrc; - } - //PNG画像から透過色のpixelを指定して透過しGRPを作る - GraphicPage createGraphicPage(string file, int pixel) - { - SDL_RWops* stream = SDL_RWFromFile(toStringz(file), toStringz("rb")); - auto surfacesrc = IMG_LoadPNG_RW(stream); - SDL_Surface* surface = SDL_CreateRGBSurface(0, surfacesrc.w, surfacesrc.h, 32, 0, 0, 0, 0); - SDL_Rect rect; - rect.x = 0; - rect.y = 0; - rect.w = surfacesrc.w; - rect.h = surfacesrc.h; - SDL_SetColorKey(surfacesrc, SDL_TRUE, (cast(uint*)surface.pixels)[pixel]); - int i = SDL_BlitSurface(surfacesrc, &rect, surface, &rect); - auto grp = new GraphicPage(surface); - SDL_FreeSurface(surfacesrc); - SDL_RWclose(stream); - return grp; - } GraphicPage createGRPF(string file) { SDL_RWops* stream = SDL_RWFromFile(toStringz(file), toStringz("rb")); @@ -229,67 +201,6 @@ class PetitComputer SDL_FreeSurface(src); return new GraphicPage(surface); } - GraphicPage createGRPF(int color, SDL_Surface *src) - { - SDL_Surface* surface = SDL_CreateRGBSurface(0, src.w, src.h, 32, 0, 0, 0, 0); - auto srcpixels = (cast(uint*)src.pixels); - auto pixels = (cast(uint*)surface.pixels); - for(int x = 0; x < src.w; x++) - { - for(int y = 0; y < src.h; y++) - { - ubyte r, g, b, a; - SDL_GetRGBA(*srcpixels, src.format, &r, &g, &b, &a); - //if(a == 0) - { - auto back = consoleColor[color]; - r = back >> 16 & 0xFF; - g = back >> 8 & 0xFF; - b = back & 0xFF; - a = back >> 24 & 0xFF; - } - *pixels = SDL_MapRGBA(surface.format, r, g, b, a); - pixels++; - srcpixels++; - } - } - return new GraphicPage(surface); - } - GraphicPage createGRPF(int color, int colorFore, SDL_Surface *src) - { - SDL_Surface* surface = SDL_CreateRGBSurface(0, src.w, src.h, 32, 0, 0, 0, 0); - auto srcpixels = (cast(uint*)src.pixels); - auto pixels = (cast(uint*)surface.pixels); - for(int x = 0; x < src.w; x++) - { - for(int y = 0; y < src.h; y++) - { - ubyte r, g, b, a; - SDL_GetRGBA(*srcpixels, src.format, &r, &g, &b, &a); - if(r == 158 && g == 0 && b == 93 && a == 255) - { - auto back = consoleColor[color]; - r = back >> 16 & 0xFF; - g = back >> 8 & 0xFF; - b = back & 0xFF; - a = back >> 24 & 0xFF; - } - else - { - //雑 - auto fore = consoleColor[colorFore]; - r = fore >> 16 & 0xFF; - g = fore >> 8 & 0xFF; - b = fore & 0xFF; - a = fore >> 24 & 0xFF; - } - *pixels = SDL_MapRGBA(surface.format, r, g, b, a); - pixels++; - srcpixels++; - } - } - return new GraphicPage(surface); - } GraphicPage createEmptyPage() { auto surface = SDL_CreateRGBSurface(0, 512, 512, 32, 0xff000000, 0x00ff0000, 0x0000ff00, 0xff); @@ -555,6 +466,7 @@ class PetitComputer } xscreenmode = mode2; } + BG[4] bg; void render() { buttonTable = new Button[SDL_SCANCODE_SLEEP + 1]; @@ -563,7 +475,7 @@ class PetitComputer buttonTable[SDL_SCANCODE_LEFT] = Button.LEFT; buttonTable[SDL_SCANCODE_RIGHT] = Button.RIGHT; buttonTable[SDL_SCANCODE_SPACE] = Button.A; - bool renderprofile;// = true; + bool renderprofile = true; try { version(Windows) @@ -634,6 +546,11 @@ class PetitComputer glViewport(0, 240, 400, 240); } sprite.render(); + glBindTexture(GL_TEXTURE_2D, GRP[bgpage].glTexture); + for(int i = 0; i < bg.length; i++) + { + bg[i].render(400f, 240f); + } /* if(this.sprite.sprites[0].define) if(this.sprite.sprites[0].u == 0) { @@ -731,6 +648,8 @@ class PetitComputer core.thread.Thread thread = new core.thread.Thread(&render); thread.start(); sprite = new Sprite(this); + for(int i = 0; i < bg.length; i++) + bg[i] = new BG(this); auto startTicks = SDL_GetTicks(); //とりあえず auto parser = new Parser( @@ -738,9 +657,10 @@ class PetitComputer //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/EX1TEXT.TXT").to!wstring //readText("FIZZBUZZ.TXT").to!wstring - readText("TEST.TXT").to!wstring + //readText("TEST.TXT").to!wstring /*"?ABS(-1) LOCATE 0,10 COLOR 5 @@ -783,8 +703,9 @@ class PetitComputer auto vm = parser.compile(); bool running = true; vm.init(this); - vm.dump; + //vm.dump; this.vm = vm; + bg[0].put(0,0,1); //gpset(0, 10, 10, 0xFF00FF00); //gline(0, 0, 0, 399, 239, RGB(0, 255, 0)); //gfill(0, 78, 78, 40, 40, RGB(0, 255, 255));