From d9965931bd18709db2238711dd76a61c564bf4d7 Mon Sep 17 00:00:00 2001 From: otya128 Date: Wed, 14 Dec 2016 21:34:43 +0900 Subject: [PATCH] Implement BGLOAD --- SMILEBASIC/bg.d | 18 ++++++++++++++++ SMILEBASIC/builtinfunctions.d | 40 +++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/SMILEBASIC/bg.d b/SMILEBASIC/bg.d index b927f0c..2ac471a 100644 --- a/SMILEBASIC/bg.d +++ b/SMILEBASIC/bg.d @@ -199,4 +199,22 @@ class BG } } } + void load(T)(int x, int y, int w, int h, T[] array, int charoff) + if (is(T == int) || is(T == double)) + { + int srci; + for (int i = x; i < x + w; i++) + { + for (int j = y; j < y + h; j++) + { + srci++; + int index = i + j * width; + if (index < 0) + continue; + auto scr = cast(int)array[srci - 1]; + auto chr = ((scr & 0xFFF) + charoff) & /*mask?*/0xFFF; + chip[index].screenData = (scr & 0xF000) | chr; + } + } + } } diff --git a/SMILEBASIC/builtinfunctions.d b/SMILEBASIC/builtinfunctions.d index a4241b1..c27d664 100644 --- a/SMILEBASIC/builtinfunctions.d +++ b/SMILEBASIC/builtinfunctions.d @@ -1864,6 +1864,46 @@ class BuiltinFunction } BGSAVE(p, layer, 0, 0, p.getBG(layer).width, p.getBG(layer).height, ary); } + static void BGLOAD(PetitComputer p, int layer, int x, int y, int w, int h, Value ary, int bgcharoffset) + { + if (w < 1) + { + throw new OutOfRange("BGLOAD", 4); + } + if (h < 1) + { + throw new OutOfRange("BGLOAD", 4); + } + if (!ary.isNumberArray) + { + throw new TypeMismatch("BGLOAD", 6); + } + if (ary.type == ValueType.IntegerArray) + { + if (w * h > ary.length) + ary.integerArray.length = w * h; + p.getBG(layer).load(x, y, w, h, ary.integerArray.array, bgcharoffset); + } + if (ary.type == ValueType.DoubleArray) + { + if (w * h > ary.length) + ary.doubleArray.length = w * h; + p.getBG(layer).load(x, y, w, h, ary.doubleArray.array, bgcharoffset); + } + + } + static void BGLOAD(PetitComputer p, int layer, int x, int y, int w, int h, Value ary) + { + BGLOAD(p, layer, x, y, w, h, ary, 0); + } + static void BGLOAD(PetitComputer p, int layer, Value ary) + { + if (!ary.isNumberArray) + { + throw new TypeMismatch("BGLOAD", 2); + } + BGLOAD(p, layer, 0, 0, p.getBG(layer).width, p.getBG(layer).height, ary, 0); + } static void EFCON() { }