From 28a0d8b7e2480e5f3b0a03b81281ff417c29cfbb Mon Sep 17 00:00:00 2001 From: otya128 Date: Fri, 23 Dec 2016 20:01:38 +0900 Subject: [PATCH] Implement SPSET (5),(6) --- SMILEBASIC/builtinfunctions.d | 34 ++++++++++++++++++++++++++++++++++ SMILEBASIC/sprite.d | 25 +++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/SMILEBASIC/builtinfunctions.d b/SMILEBASIC/builtinfunctions.d index 06b694e..ef2d117 100644 --- a/SMILEBASIC/builtinfunctions.d +++ b/SMILEBASIC/builtinfunctions.d @@ -1319,6 +1319,40 @@ class BuiltinFunction } p.sprite.spset(id, defno); } + static void SPSET(PetitComputer p, int lower, int upper, int defno, out int ix) + { + if (!p.sprite.isValidSpriteId(upper)) + throw new OutOfRange("SPSET", 1); + if (!p.sprite.isValidSpriteId(lower)) + throw new OutOfRange("SPSET", 2); + if (upper < lower) + throw new IllegalFunctionCall("SPSET", 2); + ix = p.sprite.allocSprite(lower, upper); + if (ix == -1) + return; + p.sprite.spset(ix, defno); + } + static void SPSET(PetitComputer p, int upper, int lower, int u, int v, out int ix) + { + SPSET(p, upper, lower, u, v, 16, 16, 0x01, ix); + } + static void SPSET(PetitComputer p, int upper, int lower, int u, int v, int w, int h, out int ix) + { + SPSET(p, upper, lower, u, v, w, h, 0x01, ix); + } + static void SPSET(PetitComputer p, int lower, int upper, int u, int v, int w, int h, int attr, out int ix) + { + if (!p.sprite.isValidSpriteId(upper)) + throw new OutOfRange("SPSET", 1); + if (!p.sprite.isValidSpriteId(lower)) + throw new OutOfRange("SPSET", 2); + if (upper < lower) + throw new IllegalFunctionCall("SPSET", 2); + ix = p.sprite.allocSprite(lower, upper); + if (ix == -1) + return; + p.sprite.spset(ix, u, v, w, h, cast(SpriteAttr)attr); + } static void SPCHR(PetitComputer p, int id, int defno, DefaultValue!(int, false) V, DefaultValue!(int, false) W, DefaultValue!(int, false) H, DefaultValue!(int, false) ATTR) { if(!V.isDefault && !W.isDefault) diff --git a/SMILEBASIC/sprite.d b/SMILEBASIC/sprite.d index 10f141d..649d021 100644 --- a/SMILEBASIC/sprite.d +++ b/SMILEBASIC/sprite.d @@ -870,6 +870,16 @@ class Sprite synchronized (this) sprites[id] = SpriteData(id, spdef, 0/*要調査*/); } + int allocSprite(int lower, int upper) + { + for (int i = lower; i <= upper; i++) + { + int id = spid(i); + if (!sprites[id].define) + return i; + } + return -1; + } int spchk(int id) { id = spid(id); @@ -1179,4 +1189,19 @@ class Sprite } clipRect[petitcom.displaynum] = SDL_Rect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); } + bool isValidSpriteId(int id) + { + if (id < 0) + { + return false; + } + if (petitcom.displaynum == 0) + { + return spmax > id; + } + else + { + return sprites.length > id + spmax; + } + } }