From aedb1ffd4ecbf20577cbbfc8cd1cffadbd644260 Mon Sep 17 00:00:00 2001 From: otya128 Date: Fri, 16 Dec 2016 20:18:47 +0900 Subject: [PATCH] Fix WAIT --- SMILEBASIC/builtinfunctions.d | 2 +- SMILEBASIC/petitcomputer.d | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/SMILEBASIC/builtinfunctions.d b/SMILEBASIC/builtinfunctions.d index 1bfc331..c4e4441 100644 --- a/SMILEBASIC/builtinfunctions.d +++ b/SMILEBASIC/builtinfunctions.d @@ -283,7 +283,7 @@ class BuiltinFunction static void WAIT(PetitComputer p, DefaultValue!int time) { time.setDefaultValue(1); - p.vsync(cast(int)time); + p.wait(cast(int)time); } //TODO:プチコンのCLSには引数の個数制限がない static void CLS(PetitComputer p/*vaarg*/) diff --git a/SMILEBASIC/petitcomputer.d b/SMILEBASIC/petitcomputer.d index 6492588..534e45c 100644 --- a/SMILEBASIC/petitcomputer.d +++ b/SMILEBASIC/petitcomputer.d @@ -321,11 +321,21 @@ class PetitComputer SDL_Renderer* renderer; int vsyncFrame; int vsyncCount; + bool isVSync; + bool waitFlag; void vsync(int f) { + waitFlag = true; + isVSync = true; vsyncCount = 0; vsyncFrame = f; } + void wait(int f) + { + waitFlag = true; + isVSync = false; + vsyncFrame = f; + } Graphic graphic; Mutex keybuffermutex; int keybufferpos; @@ -1080,7 +1090,7 @@ class PetitComputer { try { - for(int i = 0; !quit && maincntRender == oldmaincnt && !vsyncFrame && running; i++) + for(int i = 0; !quit && maincntRender == oldmaincnt && !waitFlag && running; i++) { //writefln("%04X:%s", vm.pc, vm.getCurrent); running = vm.runStep(); @@ -1142,23 +1152,26 @@ class PetitComputer { maincnt++; } - if(vsyncFrame) + if(waitFlag) { //FIXME:VSYNC IS NOT WAIT //A=MAINCNT:WAIT 50:A=MAINCNT-A->A=50 //A=MAINCNT:VSYNC 50:A=MAINCNT-A->A=0~50 graphic.updateVM(); auto endmaincnt = maincnt + vsyncFrame; + oldmaincnt = maincntRender; while (maincnt < endmaincnt && !quit) { - oldmaincnt = maincntRender; SDL_Delay(1); if (maincntRender != oldmaincnt) { maincnt++; + oldmaincnt = maincntRender; } } vsyncFrame = 0; + waitFlag = false; + isVSync = false; } //maincnt = cast(int)((SDL_GetTicks() - startcnt) / frame); graphic.updateVM();