From a04536335b92dd1cf61e4c79908893661603f96b Mon Sep 17 00:00:00 2001 From: otya128 Date: Fri, 9 Dec 2016 18:45:34 +0900 Subject: [PATCH] Fix XON/XOFF --- SMILEBASIC/VM.d | 5 +++- SMILEBASIC/parser.d | 2 +- SMILEBASIC/petitcomputer.d | 55 ++++++++++++++++++++++++++++++-------- 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/SMILEBASIC/VM.d b/SMILEBASIC/VM.d index cba3201..3b71a19 100644 --- a/SMILEBASIC/VM.d +++ b/SMILEBASIC/VM.d @@ -2023,6 +2023,9 @@ class SetX : Code } override void execute(VM vm) { - vm.petitcomputer.setX(func, value); + if (value) + vm.petitcomputer.xon(func); + else + vm.petitcomputer.xoff(func); } } diff --git a/SMILEBASIC/parser.d b/SMILEBASIC/parser.d index 3e1eb35..cb20e88 100644 --- a/SMILEBASIC/parser.d +++ b/SMILEBASIC/parser.d @@ -893,7 +893,7 @@ class Parser return null; } auto arg = std.uni.toUpper(token.value.stringValue); - if (arg != "MOTION" && arg != "EXPAD" && arg != "MIC" && arg != "WIIU") + if (arg != "MOTION" && arg != "EXPAD" && arg != "MIC" && (uname == "XOFF" || (arg != "WIIU" && arg != "3DS" && arg != "COMPAT"))) { syntaxError(); return null; diff --git a/SMILEBASIC/petitcomputer.d b/SMILEBASIC/petitcomputer.d index e3c3aee..c1f2543 100644 --- a/SMILEBASIC/petitcomputer.d +++ b/SMILEBASIC/petitcomputer.d @@ -1236,35 +1236,68 @@ class PetitComputer { return page >= 0 && page < 6; } + enum XMode + { + _3DS, + COMPAT, + WIIU, + } struct X { bool motion; bool expad; bool mic; - bool wiiU; + XMode mode; } X x; - public void setX(wstring func, bool value) + public void xoff(wstring func) { - if (func == "WIIU") + if (func == "MIC") { - x.wiiU = value; - } - else if (func == "MIC") - { - x.mic = value; + x.mic = false; } else if (func == "EXPAD") { - x.expad = value; + x.expad = false; } else if (func == "MOTION") { - x.motion = value; + x.motion = false; } else { - std.stdio.stderr.writefln("Unknown %s %s", value ? "XON" : "XOFF", func); + std.stdio.stderr.writefln("Unknown XOFF %s", func); + } + } + public void xon(wstring func) + { + if (func == "WIIU") + { + x.mode = XMode.WIIU; + } + else if (func == "3DS") + { + x.mode = XMode._3DS; + } + else if (func == "COMPAT") + { + x.mode = XMode.COMPAT; + } + else if (func == "MIC") + { + x.mic = true; + } + else if (func == "EXPAD") + { + x.expad = true; + } + else if (func == "MOTION") + { + x.motion = true; + } + else + { + std.stdio.stderr.writefln("Unknown XON %s", func); } } //プチコン内部表現はRGB5_A1