sm64

A Super Mario 64 decompilation
Log | Files | Refs | README | LICENSE

memory.h (2492B)


      1 #ifndef MEMORY_H
      2 #define MEMORY_H
      3 
      4 #include <PR/ultratypes.h>
      5 
      6 #include "types.h"
      7 
      8 #define MEMORY_POOL_LEFT  0
      9 #define MEMORY_POOL_RIGHT 1
     10 
     11 struct AllocOnlyPool {
     12     s32 totalSpace;
     13     s32 usedSpace;
     14     u8 *startPtr;
     15     u8 *freePtr;
     16 };
     17 
     18 struct MemoryPool;
     19 
     20 struct OffsetSizePair {
     21     u32 offset;
     22     u32 size;
     23 };
     24 
     25 struct DmaTable {
     26     u32 count;
     27     u8 *srcAddr;
     28     struct OffsetSizePair anim[1]; // dynamic size
     29 };
     30 
     31 struct DmaHandlerList {
     32     struct DmaTable *dmaTable;
     33     void *currentAddr;
     34     void *bufTarget;
     35 };
     36 
     37 #ifndef INCLUDED_FROM_MEMORY_C
     38 // Declaring this variable extern puts it in the wrong place in the bss order
     39 // when this file is included from memory.c (first instead of last). Hence,
     40 // ifdef hack. It was very likely subject to bss reordering originally.
     41 extern struct MemoryPool *gEffectsMemoryPool;
     42 #endif
     43 
     44 uintptr_t set_segment_base_addr(s32 segment, void *addr);
     45 void *get_segment_base_addr(s32 segment);
     46 void *segmented_to_virtual(const void *addr);
     47 void *virtual_to_segmented(u32 segment, const void *addr);
     48 void move_segment_table_to_dmem(void);
     49 
     50 void main_pool_init(void *start, void *end);
     51 void *main_pool_alloc(u32 size, u32 side);
     52 u32 main_pool_free(void *addr);
     53 void *main_pool_realloc(void *addr, u32 size);
     54 u32 main_pool_available(void);
     55 u32 main_pool_push_state(void);
     56 u32 main_pool_pop_state(void);
     57 
     58 #ifndef NO_SEGMENTED_MEMORY
     59 void *load_segment(s32 segment, u8 *srcStart, u8 *srcEnd, u32 side);
     60 void *load_to_fixed_pool_addr(u8 *destAddr, u8 *srcStart, u8 *srcEnd);
     61 void *load_segment_decompress(s32 segment, u8 *srcStart, u8 *srcEnd);
     62 void *load_segment_decompress_heap(u32 segment, u8 *srcStart, u8 *srcEnd);
     63 void load_engine_code_segment(void);
     64 #else
     65 #define load_segment(...)
     66 #define load_to_fixed_pool_addr(...)
     67 #define load_segment_decompress(...)
     68 #define load_segment_decompress_heap(...)
     69 #define load_engine_code_segment(...)
     70 #endif
     71 
     72 struct AllocOnlyPool *alloc_only_pool_init(u32 size, u32 side);
     73 void *alloc_only_pool_alloc(struct AllocOnlyPool *pool, s32 size);
     74 struct AllocOnlyPool *alloc_only_pool_resize(struct AllocOnlyPool *pool, u32 size);
     75 
     76 struct MemoryPool *mem_pool_init(u32 size, u32 side);
     77 void *mem_pool_alloc(struct MemoryPool *pool, u32 size);
     78 BAD_RETURN(s32) mem_pool_free(struct MemoryPool *pool, void *addr);
     79 
     80 void *alloc_display_list(u32 size);
     81 void setup_dma_table_list(struct DmaHandlerList *list, void *srcAddr, void *buffer);
     82 s32 load_patchable_table(struct DmaHandlerList *list, s32 index);
     83 
     84 #endif // MEMORY_H