From e4deae3b69bea0d0afd710081a536683b2ad0636 Mon Sep 17 00:00:00 2001 From: otya128 Date: Sat, 31 Dec 2016 13:50:44 +0900 Subject: [PATCH] Implement BG callback --- SMILEBASIC/VM.d | 15 +++++++++++++-- SMILEBASIC/bg.d | 2 ++ SMILEBASIC/builtinfunctions.d | 11 +++++++++++ SMILEBASIC/petitcomputer.d | 10 ++++++++++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/SMILEBASIC/VM.d b/SMILEBASIC/VM.d index 4c03b81..c484555 100644 --- a/SMILEBASIC/VM.d +++ b/SMILEBASIC/VM.d @@ -2735,11 +2735,22 @@ class CallBG : Code { override void execute(VM vm) { + vm.petitcomputer.callidx++; if (!vm.petitcomputer.callback) { - vm.petitcomputer.callidx++; return; } - vm.petitcomputer.callidx++; + if (!vm.petitcomputer.isValidLayer(vm.petitcomputer.callidx)) + { + vm.petitcomputer.callback = false; + return; + } + auto callback = vm.petitcomputer.getBG(vm.petitcomputer.callidx).callback; + vm.pc--; + if (!callback.isCallable) + { + return; + } + callback(vm); } } diff --git a/SMILEBASIC/bg.d b/SMILEBASIC/bg.d index 6c655ef..be4c56e 100644 --- a/SMILEBASIC/bg.d +++ b/SMILEBASIC/bg.d @@ -249,4 +249,6 @@ class BG } } } + import otya.smilebasic.vm; + Callback callback; } diff --git a/SMILEBASIC/builtinfunctions.d b/SMILEBASIC/builtinfunctions.d index d000632..28eba6f 100644 --- a/SMILEBASIC/builtinfunctions.d +++ b/SMILEBASIC/builtinfunctions.d @@ -2223,6 +2223,17 @@ class BuiltinFunction } BGLOAD(p, layer, 0, 0, p.getBG(layer).width, p.getBG(layer).height, ary, 0); } + static void BGFUNC(PetitComputer p, int layer, wstring func) + { + if (!p.isValidLayer(layer)) + { + throw new OutOfRange("BGFUNC", 1); + } + auto callback = p.vm.createCallback(func); + if (callback.type == CallbackType.none) + throw new IllegalFunctionCall("BGUNC"/*, 2*/); + p.getBG(layer).callback = callback; + } static void EFCON() { } diff --git a/SMILEBASIC/petitcomputer.d b/SMILEBASIC/petitcomputer.d index 616e157..9f7b3cb 100644 --- a/SMILEBASIC/petitcomputer.d +++ b/SMILEBASIC/petitcomputer.d @@ -526,6 +526,16 @@ class PetitComputer SDL_SetWindowSize(window, cast(int)(currentDisplay.windowSize.width * scaleX), cast(int)(currentDisplay.windowSize.height * scaleY)); } + bool isValidLayer(int layer) + { + if (layer < 0) + return false; + if(displaynum) + { + return layer < bg.length - bgmax; + } + return layer < bgmax; + } BG getBG(int layer) { if(displaynum)