From 259f524fd1b1d74dd84e778f47dd136cc7836200 Mon Sep 17 00:00:00 2001 From: Ry Date: Tue, 7 Feb 2023 18:17:07 -0800 Subject: [PATCH] bindings: Hack which allows returning multiple values This really needs to be done better. --- gcc/bindings.c | 15 ++++++++++++++- gcc/bindings.kts | 42 ++++++++++++++++++++++++++++++++---------- 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/gcc/bindings.c b/gcc/bindings.c index 0a4b200..440ec67 100644 --- a/gcc/bindings.c +++ b/gcc/bindings.c @@ -3,12 +3,25 @@ #include "call.h" +struct return2 { unsigned int return0; unsigned int return1; }; +struct return3 { unsigned int return0; unsigned int return1; unsigned int return2; }; +struct return4 { unsigned int return0; unsigned int return1; unsigned int return2; unsigned int return3; }; +struct return5 { unsigned int return0; unsigned int return1; unsigned int return2; unsigned int return3; unsigned int return4; }; +struct return6 { unsigned int return0; unsigned int return1; unsigned int return2; unsigned int return3; unsigned int return4; unsigned int return5; }; +struct return7 { unsigned int return0; unsigned int return1; unsigned int return2; unsigned int return3; unsigned int return4; unsigned int return5; unsigned int return6; }; +struct return8 { unsigned int return0; unsigned int return1; unsigned int return2; unsigned int return3; unsigned int return4; unsigned int return5; unsigned int return6; unsigned int return7; }; + // fox32rom definitions // system jump table -static inline void get_rom_version(void) { +static inline struct return3 get_rom_version(void) { + struct return3 result_0; call(0xF0040000); + ret(0, result_0.return0); + ret(1, result_0.return1); + ret(2, result_0.return2); + return result_0; } static inline void system_vsync_handler(void) { diff --git a/gcc/bindings.kts b/gcc/bindings.kts index 93bcd54..383119c 100755 --- a/gcc/bindings.kts +++ b/gcc/bindings.kts @@ -13,7 +13,7 @@ val IHalf = Type("short") val Word = Type("unsigned int") val IWord = Type("int") -class Variable(val type: Type, val name: String) +class Variable(val type: Type, val name: String, val is_struct: Boolean) class Function(val address: UInt, val name: String) { class Register(val index: Int, val variable: Variable) @@ -25,14 +25,17 @@ class Function(val address: UInt, val name: String) { parameter(parameters.indexOfFirst { it == null }, type, name) } fun parameter(index: Int, type: Type, name: String) { - parameters[index] = Variable(type, name) + parameters[index] = Variable(type, name, false) } fun returns(type: Type) { returns(returns.indexOfFirst { it == null }, type) } fun returns(index: Int, type: Type) { - returns[index] = Variable(type, "result_${index}") + returns[index] = Variable(type, "result_${index}", false) + } + fun returnstruct(index: Int, suffix: String, type: Type) { + returns[index] = Variable(type, "result_0.${suffix}", true) } override fun toString(): String { @@ -65,12 +68,20 @@ class Function(val address: UInt, val name: String) { text.append(") {\n") } - outputs.forEach { - text.append(" ") - text.append(it.variable.type) - text.append(" ") - text.append(it.variable.name) - text.append(";\n") + for ((i, v) in outputs.withIndex()) { + if (!v.variable.is_struct) { + text.append(" ") + text.append(v.variable.type) + text.append(" ") + text.append(v.variable.name.split(".")[0]) + text.append(";\n") + } else if (i == 0) { + text.append(" ") + text.append(outputs.first().variable.type) + text.append(" ") + text.append(outputs.first().variable.name.split(".")[0]) + text.append(";\n") + } } inputs.forEach { @@ -99,7 +110,7 @@ class Function(val address: UInt, val name: String) { if (returns != null) { text.append(" ") text.append("return ") - text.append(returns.variable.name) + text.append(returns.variable.name.split(".")[0]) text.append(";\n") } @@ -116,6 +127,14 @@ source.append("#pragma once\n") source.append("\n") source.append("#include \"call.h\"\n") source.append("\n") +source.append("struct return2 { unsigned int return0; unsigned int return1; };\n") +source.append("struct return3 { unsigned int return0; unsigned int return1; unsigned int return2; };\n") +source.append("struct return4 { unsigned int return0; unsigned int return1; unsigned int return2; unsigned int return3; };\n") +source.append("struct return5 { unsigned int return0; unsigned int return1; unsigned int return2; unsigned int return3; unsigned int return4; };\n") +source.append("struct return6 { unsigned int return0; unsigned int return1; unsigned int return2; unsigned int return3; unsigned int return4; unsigned int return5; };\n") +source.append("struct return7 { unsigned int return0; unsigned int return1; unsigned int return2; unsigned int return3; unsigned int return4; unsigned int return5; unsigned int return6; };\n") +source.append("struct return8 { unsigned int return0; unsigned int return1; unsigned int return2; unsigned int return3; unsigned int return4; unsigned int return5; unsigned int return6; unsigned int return7; };\n") +source.append("\n") fun comment(text: String) { source.append("// ") @@ -147,6 +166,9 @@ comment("fox32rom definitions") comment("system jump table") define(0xF0040000U, "get_rom_version") { + returnstruct(0, "return0", Type("struct return3")) + returnstruct(1, "return1", Type("struct return3")) + returnstruct(2, "return2", Type("struct return3")) } define(0xF0040004U, "system_vsync_handler") { }