mirror of
https://github.com/N64Recomp/N64Recomp.git
synced 2025-05-28 22:33:15 +00:00
Integrated RT64 (not included in repo), sign extended addresses
This commit is contained in:
parent
39b67c8468
commit
d0c3eb73ec
17 changed files with 185 additions and 92 deletions
|
@ -1,17 +1,20 @@
|
|||
#include "recomp.h"
|
||||
|
||||
extern "C" void osAiSetFrequency_recomp(uint8_t* restrict rdram, recomp_context* restrict ctx) {
|
||||
;
|
||||
ctx->r2 = ctx->r4;
|
||||
}
|
||||
|
||||
static uint32_t ai_length = 0;
|
||||
|
||||
extern "C" void osAiSetNextBuffer_recomp(uint8_t* restrict rdram, recomp_context* restrict ctx) {
|
||||
;
|
||||
ai_length = (uint32_t)ctx->r5;
|
||||
ctx->r2 = 0;
|
||||
}
|
||||
|
||||
extern "C" void osAiGetLength_recomp(uint8_t* restrict rdram, recomp_context* restrict ctx) {
|
||||
;
|
||||
ctx->r2 = ai_length;
|
||||
}
|
||||
|
||||
extern "C" void osAiGetStatus_recomp(uint8_t* restrict rdram, recomp_context* restrict ctx) {
|
||||
;
|
||||
}
|
||||
ctx->r2 = 0x80000000;
|
||||
}
|
||||
|
|
|
@ -9,8 +9,24 @@ extern "C" void osContStartReadData_recomp(uint8_t* restrict rdram, recomp_conte
|
|||
Multilibultra::send_si_message();
|
||||
}
|
||||
|
||||
struct OSContPad {
|
||||
u16 button;
|
||||
s8 stick_x; /* -80 <= stick_x <= 80 */
|
||||
s8 stick_y; /* -80 <= stick_y <= 80 */
|
||||
u8 errno_;
|
||||
};
|
||||
|
||||
extern "C" void osContGetReadData_recomp(uint8_t* restrict rdram, recomp_context* restrict ctx) {
|
||||
;
|
||||
int32_t pad = (uint32_t)ctx->r4;
|
||||
|
||||
// button
|
||||
MEM_H(0, pad) = 0;
|
||||
// stick_x
|
||||
MEM_B(2, pad) = 0;
|
||||
// stick_y
|
||||
MEM_B(3, pad) = 0;
|
||||
// errno
|
||||
MEM_B(4, pad) = 0;
|
||||
}
|
||||
|
||||
extern "C" void osMotorInit_recomp(uint8_t* restrict rdram, recomp_context* restrict ctx) {
|
||||
|
|
|
@ -16,7 +16,7 @@ extern "C" void osCreatePiManager_recomp(uint8_t* restrict rdram, recomp_context
|
|||
|
||||
constexpr uint32_t rom_base = 0xB0000000;
|
||||
|
||||
void do_rom_read(uint8_t* rdram, uint32_t ram_address, uint32_t dev_address, size_t num_bytes) {
|
||||
void do_rom_read(uint8_t* rdram, int32_t ram_address, uint32_t dev_address, size_t num_bytes) {
|
||||
// TODO use word copies when possible
|
||||
uint8_t* rom_addr = rom.get() + (dev_address | rom_base) - rom_base;
|
||||
for (size_t i = 0; i < num_bytes; i++) {
|
||||
|
@ -30,7 +30,7 @@ extern "C" void osPiStartDma_recomp(uint8_t* restrict rdram, recomp_context* res
|
|||
uint32_t pri = ctx->r5;
|
||||
uint32_t direction = ctx->r6;
|
||||
uint32_t devAddr = ctx->r7;
|
||||
uint32_t dramAddr = MEM_W(0x10, ctx->r29);
|
||||
int32_t dramAddr = MEM_W(0x10, ctx->r29);
|
||||
uint32_t size = MEM_W(0x14, ctx->r29);
|
||||
uint32_t mq_ = MEM_W(0x18, ctx->r29);
|
||||
OSMesgQueue* mq = TO_PTR(OSMesgQueue, mq_);
|
||||
|
|
|
@ -35,8 +35,8 @@ extern "C" recomp_func_t* get_function(uint32_t addr) {
|
|||
}
|
||||
|
||||
extern "C" void bzero(uint8_t* restrict rdram, recomp_context* restrict ctx) {
|
||||
uint32_t start_addr = ctx->r4;
|
||||
uint32_t size = ctx->r5;
|
||||
gpr start_addr = ctx->r4;
|
||||
gpr size = ctx->r5;
|
||||
|
||||
for (uint32_t i = 0; i < size; i++) {
|
||||
MEM_B(start_addr, i) = 0;
|
||||
|
@ -53,7 +53,7 @@ extern "C" void do_break(uint32_t vram) {
|
|||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
void run_thread_function(uint8_t* rdram, uint32_t addr, uint32_t sp, uint32_t arg) {
|
||||
void run_thread_function(uint8_t* rdram, uint64_t addr, uint64_t sp, uint64_t arg) {
|
||||
recomp_context ctx{};
|
||||
ctx.r29 = sp;
|
||||
ctx.r4 = arg;
|
||||
|
@ -62,7 +62,7 @@ void run_thread_function(uint8_t* rdram, uint32_t addr, uint32_t sp, uint32_t ar
|
|||
}
|
||||
|
||||
extern "C" void game_init(uint8_t* restrict rdram, recomp_context* restrict ctx);
|
||||
void do_rom_read(uint8_t* rdram, uint32_t ram_address, uint32_t dev_address, size_t num_bytes);
|
||||
void do_rom_read(uint8_t* rdram, int32_t ram_address, uint32_t dev_address, size_t num_bytes);
|
||||
|
||||
std::unique_ptr<uint8_t[]> rom;
|
||||
size_t rom_size;
|
||||
|
@ -105,7 +105,7 @@ int main(int argc, char **argv) {
|
|||
|
||||
// Get entrypoint from ROM
|
||||
// TODO fix this for other IPL3 versions
|
||||
uint32_t entrypoint = byteswap(*reinterpret_cast<uint32_t*>(rom.get() + 0x8));
|
||||
int32_t entrypoint = byteswap(*reinterpret_cast<uint32_t*>(rom.get() + 0x8));
|
||||
|
||||
// Allocate rdram_buffer
|
||||
std::unique_ptr<uint8_t[]> rdram_buffer = std::make_unique<uint8_t[]>(8 * 1024 * 1024);
|
||||
|
@ -134,17 +134,17 @@ int main(int argc, char **argv) {
|
|||
#endif
|
||||
|
||||
// Set up stack pointer
|
||||
context.r29 = 0x803FFFF0u;
|
||||
context.r29 = 0xFFFFFFFF803FFFF0u;
|
||||
|
||||
// Initialize variables normally set by IPL3
|
||||
constexpr uint32_t osTvType = 0x80000300;
|
||||
constexpr uint32_t osRomType = 0x80000304;
|
||||
constexpr uint32_t osRomBase = 0x80000308;
|
||||
constexpr uint32_t osResetType = 0x8000030c;
|
||||
constexpr uint32_t osCicId = 0x80000310;
|
||||
constexpr uint32_t osVersion = 0x80000314;
|
||||
constexpr uint32_t osMemSize = 0x80000318;
|
||||
constexpr uint32_t osAppNMIBuffer = 0x8000031c;
|
||||
constexpr int32_t osTvType = 0x80000300;
|
||||
constexpr int32_t osRomType = 0x80000304;
|
||||
constexpr int32_t osRomBase = 0x80000308;
|
||||
constexpr int32_t osResetType = 0x8000030c;
|
||||
constexpr int32_t osCicId = 0x80000310;
|
||||
constexpr int32_t osVersion = 0x80000314;
|
||||
constexpr int32_t osMemSize = 0x80000318;
|
||||
constexpr int32_t osAppNMIBuffer = 0x8000031c;
|
||||
uint8_t *rdram = rdram_buffer.get();
|
||||
MEM_W(osTvType, 0) = 1; // NTSC
|
||||
MEM_W(osRomBase, 0) = 0xB0000000u; // standard rom base
|
||||
|
@ -157,7 +157,7 @@ int main(int argc, char **argv) {
|
|||
|
||||
debug_printf("[Recomp] Starting\n");
|
||||
|
||||
Multilibultra::preinit(rdram_buffer.get());
|
||||
Multilibultra::preinit(rdram_buffer.get(), rom.get());
|
||||
|
||||
game_init(rdram_buffer.get(), &context);
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ extern "C" void osSpTaskStartGo_recomp(uint8_t* restrict rdram, recomp_context*
|
|||
//printf("[sp] osSpTaskStartGo(0x%08X)\n", (uint32_t)ctx->r4);
|
||||
OSTask* task = TO_PTR(OSTask, ctx->r4);
|
||||
if (task->t.type == M_GFXTASK) {
|
||||
printf("[sp] Gfx task: %08X\n", (uint32_t)ctx->r4);
|
||||
//printf("[sp] Gfx task: %08X\n", (uint32_t)ctx->r4);
|
||||
} else if (task->t.type == M_AUDTASK) {
|
||||
printf("[sp] Audio task: %08X\n", (uint32_t)ctx->r4);
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
#include "../portultra/multilibultra.hpp"
|
||||
#include "recomp.h"
|
||||
|
||||
extern "C" void osCreateViManager_recomp(uint8_t* restrict rdram, recomp_context* restrict ctx) {
|
||||
|
@ -21,7 +22,7 @@ extern "C" void osViGetNextFramebuffer_recomp(uint8_t* restrict rdram, recomp_co
|
|||
}
|
||||
|
||||
extern "C" void osViSwapBuffer_recomp(uint8_t* restrict rdram, recomp_context* restrict ctx) {
|
||||
;
|
||||
osViSwapBuffer(rdram, ctx->r4);
|
||||
}
|
||||
|
||||
extern "C" void osViSetMode_recomp(uint8_t* restrict rdram, recomp_context* restrict ctx) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue