stdlib/register API change, use different RRET/RRET_X and P0/P1

This commit is contained in:
DataHoarder 2021-08-03 16:10:51 +02:00
parent 6f8d12ee32
commit f7b4fa92db
4 changed files with 53 additions and 26 deletions

View file

@ -1,12 +1,16 @@
;; Standard Library
;; These registers are used when passing the first two parameters to a function via FastCall
.constant std_PARAMETER_0 MGMT_SCRATCH_0
.constant std_PARAMETER_1 MGMT_SCRATCH_1
;; These registers are used within virtual functions as temporary holders
.constant std_SCRATCH_0 MGMT_SCRATCH_0
.constant std_SCRATCH_1 MGMT_SCRATCH_1
;; Also used as single return value
.constant std_RETURN_VALUE MGMT_SCRATCH_0
.constant std_RETURN_VALUE_EXTRA MGMT_SCRATCH_1
.reserve std_RETURN_VALUE 0x1E0
.reserve std_RETURN_VALUE_EXTRA 0x1E1
.reserve std_PARAMETER_0 0x1E2
.reserve std_PARAMETER_1 0x1E3
.constant RRET std_RETURN_VALUE ;;Alias
.constant RRET_X std_RETURN_VALUE_EXTRA ;;Alias
.constant P0 std_PARAMETER_0
@ -48,22 +52,22 @@
;; Ephemeral registers to be used within functions. These values may not be kept when calling other functions. They can be used when returning values if necessary.
;; Some std functions might restore these values.
.constant std_EPHEMERAL_REGISTER_0 BSM_SCRATCH_START +0x1F0
.constant std_EPHEMERAL_REGISTER_1 std_EPHEMERAL_REGISTER_0 +0x1
.constant std_EPHEMERAL_REGISTER_2 std_EPHEMERAL_REGISTER_0 +0x2
.constant std_EPHEMERAL_REGISTER_3 std_EPHEMERAL_REGISTER_0 +0x3
.constant std_EPHEMERAL_REGISTER_4 std_EPHEMERAL_REGISTER_0 +0x4
.constant std_EPHEMERAL_REGISTER_5 std_EPHEMERAL_REGISTER_0 +0x5
.constant std_EPHEMERAL_REGISTER_6 std_EPHEMERAL_REGISTER_0 +0x6
.constant std_EPHEMERAL_REGISTER_7 std_EPHEMERAL_REGISTER_0 +0x7
.constant std_EPHEMERAL_REGISTER_8 std_EPHEMERAL_REGISTER_0 +0x8
.constant std_EPHEMERAL_REGISTER_9 std_EPHEMERAL_REGISTER_0 +0x9
.constant std_EPHEMERAL_REGISTER_10 std_EPHEMERAL_REGISTER_0 +0xa
.constant std_EPHEMERAL_REGISTER_11 std_EPHEMERAL_REGISTER_0 +0xb
.constant std_EPHEMERAL_REGISTER_12 std_EPHEMERAL_REGISTER_0 +0xc
.constant std_EPHEMERAL_REGISTER_13 std_EPHEMERAL_REGISTER_0 +0xd
.constant std_EPHEMERAL_REGISTER_14 std_EPHEMERAL_REGISTER_0 +0xe
.constant std_EPHEMERAL_REGISTER_15 std_EPHEMERAL_REGISTER_0 +0xf
.reserve std_EPHEMERAL_REGISTER_0 0x1F0
.constant std_EPHEMERAL_REGISTER_1 0x1F1
.reserve std_EPHEMERAL_REGISTER_2 0x1F2
.reserve std_EPHEMERAL_REGISTER_3 0x1F3
.reserve std_EPHEMERAL_REGISTER_4 0x1F4
.reserve std_EPHEMERAL_REGISTER_5 0x1F5
.reserve std_EPHEMERAL_REGISTER_6 0x1F6
.reserve std_EPHEMERAL_REGISTER_7 0x1F7
.reserve std_EPHEMERAL_REGISTER_8 0x1F8
.reserve std_EPHEMERAL_REGISTER_9 0x1F9
.reserve std_EPHEMERAL_REGISTER_10 0x1FA
.reserve std_EPHEMERAL_REGISTER_11 0x1FB
.reserve std_EPHEMERAL_REGISTER_12 0x1FC
.reserve std_EPHEMERAL_REGISTER_13 0x1FD
.reserve std_EPHEMERAL_REGISTER_14 0x1FE
.reserve std_EPHEMERAL_REGISTER_15 0x1FF
;; Abbreviations
.constant R0 std_EPHEMERAL_REGISTER_0
.constant R1 std_EPHEMERAL_REGISTER_1

View file

@ -29,7 +29,7 @@
enum class MgmtRegisters {
MGMT_SCRATCH_0 = 0x8, //RRET
MGMT_SCRATCH_0 = 0x8,
MGMT_SCRATCH_1 = 0x9,
SRAM_ERR_IM_0 = 0x448,
@ -49,4 +49,27 @@ enum class MgmtRegisters {
INTERNAL_REGISTER_ALWAYS_00000000 = BSM_ADDR_OFFSET_0, //Read only, set at 0
INTERNAL_REGISTER_ALWAYS_FFFFFFFF = SRAM_ERR_IM_0, //SRAM_ERR_IM_0 is default two x with 48 1b bits. RW but it's not changed by default. Alternatively SW_IM is also set to 0xFFFFFFFF
std_RETURN_VALUE = BSM_SCRATCH_START + 0x1E0,
std_RETURN_VALUE_EXTRA = BSM_SCRATCH_START + 0x1E1,
std_PARAMETER_0 = BSM_SCRATCH_START + 0x1E2,
std_PARAMETER_1 = BSM_SCRATCH_START + 0x1E3,
std_EPHEMERAL_REGISTER_0 = BSM_SCRATCH_START + 0x1F0,
std_EPHEMERAL_REGISTER_1 = std_EPHEMERAL_REGISTER_0 + 0x1,
std_EPHEMERAL_REGISTER_2 = std_EPHEMERAL_REGISTER_0 + 0x2,
std_EPHEMERAL_REGISTER_3 = std_EPHEMERAL_REGISTER_0 + 0x3,
std_EPHEMERAL_REGISTER_4 = std_EPHEMERAL_REGISTER_0 + 0x4,
std_EPHEMERAL_REGISTER_5 = std_EPHEMERAL_REGISTER_0 + 0x5,
std_EPHEMERAL_REGISTER_6 = std_EPHEMERAL_REGISTER_0 + 0x6,
std_EPHEMERAL_REGISTER_7 = std_EPHEMERAL_REGISTER_0 + 0x7,
std_EPHEMERAL_REGISTER_8 = std_EPHEMERAL_REGISTER_0 + 0x8,
std_EPHEMERAL_REGISTER_9 = std_EPHEMERAL_REGISTER_0 + 0x9,
std_EPHEMERAL_REGISTER_10 = std_EPHEMERAL_REGISTER_0 + 0xa,
std_EPHEMERAL_REGISTER_11 = std_EPHEMERAL_REGISTER_0 + 0xb,
std_EPHEMERAL_REGISTER_12 = std_EPHEMERAL_REGISTER_0 + 0xc,
std_EPHEMERAL_REGISTER_13 = std_EPHEMERAL_REGISTER_0 + 0xd,
std_EPHEMERAL_REGISTER_14 = std_EPHEMERAL_REGISTER_0 + 0xe,
std_EPHEMERAL_REGISTER_15 = std_EPHEMERAL_REGISTER_0 + 0xf,
};

View file

@ -92,13 +92,13 @@ namespace Instruction {
}
Ret::Ret(const AddressWithOffset &address) {
instructions.push_back(std::make_unique<Copy>(AddressWithOffset{(uint32_t)MgmtRegisters::MGMT_SCRATCH_0, 0}, address, 1));
instructions.push_back(std::make_unique<Copy>(AddressWithOffset{(uint32_t)MgmtRegisters::std_RETURN_VALUE, 0}, address, 1));
instructions.push_back(std::make_unique<Stack::PopImm>(1));
instructions.push_back(std::make_unique<Return>(AddressWithOffset{0, Stack::stackOffsetRegister}));
}
Ret::Ret(uint32_t value) {
instructions.push_back(std::make_unique<Write>(AddressWithOffset{(uint32_t)MgmtRegisters::MGMT_SCRATCH_0, 0}, std::vector<uint32_t>({value})));
instructions.push_back(std::make_unique<Write>(AddressWithOffset{(uint32_t)MgmtRegisters::std_RETURN_VALUE, 0}, std::vector<uint32_t>({value})));
instructions.push_back(std::make_unique<Stack::PopImm>(1));
instructions.push_back(std::make_unique<Return>(AddressWithOffset{0, Stack::stackOffsetRegister}));
}

View file

@ -75,9 +75,9 @@ namespace Instruction{
break;
}else{
if(t.getType() == Token::Type::RegisterLocation){
instructions.push_back(std::make_unique<Copy>(AddressWithOffset{(uint32_t)MgmtRegisters::MGMT_SCRATCH_0 + offset, 0}, AddressWithOffset{t.getNumericValue(), 0}, 1)); //TODO: allow offsets
instructions.push_back(std::make_unique<Copy>(AddressWithOffset{(uint32_t)MgmtRegisters::std_PARAMETER_0 + offset, 0}, AddressWithOffset{t.getNumericValue(), 0}, 1)); //TODO: allow offsets
}else{
instructions.push_back(std::make_unique<Write>(AddressWithOffset{(uint32_t)MgmtRegisters::MGMT_SCRATCH_0 + offset, 0}, std::vector<uint32_t>{t.getNumericValue()}));
instructions.push_back(std::make_unique<Write>(AddressWithOffset{(uint32_t)MgmtRegisters::std_PARAMETER_1 + offset, 0}, std::vector<uint32_t>{t.getNumericValue()}));
}
}
++offset;