bindings: Hack which allows returning multiple values

This really needs to be done better.
This commit is contained in:
Ry 2023-02-07 18:17:07 -08:00
parent 6a790fc1e4
commit 259f524fd1
2 changed files with 46 additions and 11 deletions

View File

@ -3,12 +3,25 @@
#include "call.h" #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 // fox32rom definitions
// system jump table // system jump table
static inline void get_rom_version(void) { static inline struct return3 get_rom_version(void) {
struct return3 result_0;
call(0xF0040000); 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) { static inline void system_vsync_handler(void) {

View File

@ -13,7 +13,7 @@ val IHalf = Type("short")
val Word = Type("unsigned int") val Word = Type("unsigned int")
val IWord = Type("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 Function(val address: UInt, val name: String) {
class Register(val index: Int, val variable: Variable) 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) parameter(parameters.indexOfFirst { it == null }, type, name)
} }
fun parameter(index: Int, type: Type, name: String) { fun parameter(index: Int, type: Type, name: String) {
parameters[index] = Variable(type, name) parameters[index] = Variable(type, name, false)
} }
fun returns(type: Type) { fun returns(type: Type) {
returns(returns.indexOfFirst { it == null }, type) returns(returns.indexOfFirst { it == null }, type)
} }
fun returns(index: Int, type: 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 { override fun toString(): String {
@ -65,12 +68,20 @@ class Function(val address: UInt, val name: String) {
text.append(") {\n") text.append(") {\n")
} }
outputs.forEach { for ((i, v) in outputs.withIndex()) {
if (!v.variable.is_struct) {
text.append(" ") text.append(" ")
text.append(it.variable.type) text.append(v.variable.type)
text.append(" ") text.append(" ")
text.append(it.variable.name) text.append(v.variable.name.split(".")[0])
text.append(";\n") 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 { inputs.forEach {
@ -99,7 +110,7 @@ class Function(val address: UInt, val name: String) {
if (returns != null) { if (returns != null) {
text.append(" ") text.append(" ")
text.append("return ") text.append("return ")
text.append(returns.variable.name) text.append(returns.variable.name.split(".")[0])
text.append(";\n") text.append(";\n")
} }
@ -116,6 +127,14 @@ source.append("#pragma once\n")
source.append("\n") source.append("\n")
source.append("#include \"call.h\"\n") source.append("#include \"call.h\"\n")
source.append("\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) { fun comment(text: String) {
source.append("// ") source.append("// ")
@ -147,6 +166,9 @@ comment("fox32rom definitions")
comment("system jump table") comment("system jump table")
define(0xF0040000U, "get_rom_version") { 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") { define(0xF0040004U, "system_vsync_handler") {
} }