// Project64 - A Nintendo 64 emulator // https://www.pj64-emu.com/ // Copyright(C) 2001-2021 Project64 // Copyright(C) 2014 Bobby Smiles // GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html #pragma once #include "hle.h" #include #define S 1 #define S16 2 #define S8 3 enum { TASK_TYPE = 0xfc0, TASK_FLAGS = 0xfc4, TASK_UCODE_BOOT = 0xfc8, TASK_UCODE_BOOT_SIZE = 0xfcc, TASK_UCODE = 0xfd0, TASK_UCODE_SIZE = 0xfd4, TASK_UCODE_DATA = 0xfd8, TASK_UCODE_DATA_SIZE = 0xfdc, TASK_DRAM_STACK = 0xfe0, TASK_DRAM_STACK_SIZE = 0xfe4, TASK_OUTPUT_BUFF = 0xfe8, TASK_OUTPUT_BUFF_SIZE = 0xfec, TASK_DATA_PTR = 0xff0, TASK_DATA_SIZE = 0xff4, TASK_YIELD_DATA_PTR = 0xff8, TASK_YIELD_DATA_SIZE = 0xffc }; static inline unsigned int align(unsigned int x, unsigned amount) { --amount; return (x + amount) & ~amount; } static inline uint8_t * u8(const unsigned char * buffer, unsigned address) { return (uint8_t *)(buffer + (address ^ S8)); } static inline uint16_t * u16(const unsigned char * buffer, unsigned address) { assert((address & 1) == 0); return (uint16_t *)(buffer + (address ^ S16)); } static inline uint32_t * u32(const unsigned char * buffer, unsigned address) { assert((address & 3) == 0); return (uint32_t *)(buffer + address); } void load_u8(uint8_t * dst, const unsigned char * buffer, unsigned address, size_t count); void load_u16(uint16_t * dst, const unsigned char * buffer, unsigned address, size_t count); void load_u32(uint32_t * dst, const unsigned char * buffer, unsigned address, size_t count); void store_u16(unsigned char * buffer, unsigned address, const uint16_t * src, size_t count); void store_u32(unsigned char * buffer, unsigned address, const uint32_t * src, size_t count); static inline uint32_t * dmem_u32(CHle * hle, uint16_t address) { return u32(hle->dmem(), address & 0xfff); } static inline void dmem_store_u32(CHle * hle, const uint32_t * src, uint16_t address, size_t count) { store_u32(hle->dmem(), address & 0xfff, src, count); } // Convenient functions DRAM access static inline uint8_t * dram_u8(CHle * hle, uint32_t address) { return u8(hle->dram(), address & 0xffffff); } static inline uint16_t * dram_u16(CHle * hle, uint32_t address) { return u16(hle->dram(), address & 0xffffff); } static inline uint32_t * dram_u32(CHle * hle, uint32_t address) { return u32(hle->dram(), address & 0xffffff); } static inline void dram_load_u8(CHle * hle, uint8_t * dst, uint32_t address, size_t count) { load_u8(dst, hle->dram(), address & 0xffffff, count); } static inline void dram_load_u16(CHle * hle, uint16_t * dst, uint32_t address, size_t count) { load_u16(dst, hle->dram(), address & 0xffffff, count); } static inline void dram_load_u32(CHle * hle, uint32_t * dst, uint32_t address, size_t count) { load_u32(dst, hle->dram(), address & 0xffffff, count); } static inline void dram_store_u16(CHle * hle, const uint16_t * src, uint32_t address, size_t count) { store_u16(hle->dram(), address & 0xffffff, src, count); } static inline void dram_store_u32(CHle * hle, const uint32_t * src, uint32_t address, size_t count) { store_u32(hle->dram(), address & 0xffffff, src, count); }