stdlib/register API change, use different RRET/RRET_X and P0/P1
This commit is contained in:
parent
6f8d12ee32
commit
f7b4fa92db
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
};
|
|
@ -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}));
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue