libdragon
n64sys.h
Go to the documentation of this file.
1
6#ifndef __LIBDRAGON_N64SYS_H
7#define __LIBDRAGON_N64SYS_H
8
9#include <stdbool.h>
10#include <stddef.h>
11#include <assert.h>
12#include "cop0.h"
13#include "cop1.h"
14
23extern int __bbplayer;
24
28#define RCP_FREQUENCY (__bbplayer ? 96000000 : 62500000)
29
33#define CPU_FREQUENCY (__bbplayer ? 144000000 : 93750000)
34
38#define KSEG0_START_ADDR ((void*)0x80000000)
39
48#define UncachedAddr(_addr) ((void *)(((unsigned long)(_addr))|0x20000000))
49
58#define UncachedShortAddr(_addr) ((short *)(((unsigned long)(_addr))|0x20000000))
59
68#define UncachedUShortAddr(_addr) ((unsigned short *)(((unsigned long)(_addr))|0x20000000))
69
78#define UncachedLongAddr(_addr) ((long *)(((unsigned long)(_addr))|0x20000000))
79
88#define UncachedULongAddr(_addr) ((unsigned long *)(((unsigned long)(_addr))|0x20000000))
89
98#define CachedAddr(_addr) ((void *)(((unsigned long)(_addr))&~0x20000000))
99
108#define PhysicalAddr(_addr) ({ \
109 const volatile void *_addrp = (_addr); \
110 (((unsigned long)(_addrp))&~0xE0000000); \
111})
112
114extern char __libdragon_text_start[];
115
117extern char __rom_end[];
118
120extern char __bss_end[];
121
125#define HEAP_START_ADDR ((void*)__bss_end)
126
134#define MEMORY_BARRIER() asm volatile ("" : : : "memory")
135
155#define TICKS_READ() C0_COUNT()
156
162#define TICKS_PER_SECOND (CPU_FREQUENCY/2)
163
170#define TICKS_DISTANCE(from, to) ((int32_t)((uint32_t)(to) - (uint32_t)(from)))
171
173#define TICKS_SINCE(t0) TICKS_DISTANCE(t0, TICKS_READ())
174
187#define TICKS_BEFORE(t1, t2) ({ TICKS_DISTANCE(t1, t2) > 0; })
188
192#define TICKS_FROM_MS(val) (((val) * (TICKS_PER_SECOND / 1000)))
193
197#define TICKS_FROM_US(val) (((val) * (8 * TICKS_PER_SECOND / 1000000) / 8))
198
202#define TICKS_TO_US(val) (((val) * 8 / (8 * TICKS_PER_SECOND / 1000000)))
203
207#define TICKS_TO_MS(val) (((val) / (TICKS_PER_SECOND / 1000)))
208
209
210#ifdef __cplusplus
211extern "C" {
212#endif
213
214bool sys_bbplayer(void);
215
216int sys_get_boot_cic();
217void sys_set_boot_cic(int bc);
226uint64_t get_ticks(void);
227
236uint64_t get_ticks_us(void);
237
246uint64_t get_ticks_ms(void);
247
255void wait_ticks( unsigned long wait );
256
264void wait_ms( unsigned long wait_ms );
265
291#define data_cache_hit_invalidate(addr_, sz_) ({ \
292 void *addr = (addr_); unsigned long sz = (sz_); \
293 assert(((uint32_t)addr % 16) == 0 && (sz % 16) == 0); \
294 __data_cache_hit_invalidate(addr, sz); \
295})
296
297void __data_cache_hit_invalidate(volatile void * addr, unsigned long length);
298void data_cache_hit_writeback(volatile const void *, unsigned long);
299void data_cache_hit_writeback_invalidate(volatile void *, unsigned long);
300void data_cache_index_writeback_invalidate(volatile void *, unsigned long);
302void inst_cache_hit_writeback(volatile const void *, unsigned long);
303void inst_cache_hit_invalidate(volatile void *, unsigned long);
304void inst_cache_index_invalidate(volatile void *, unsigned long);
306
307int get_memory_size();
308bool is_memory_expanded();
309void *malloc_uncached(size_t size);
310void *malloc_uncached_aligned(int align, size_t size);
311void free_uncached(void *buf);
312
314typedef enum {
315 TV_PAL = 0,
317 TV_MPAL = 2
319
321
322
324/* Deprecated version of get_ticks */
325__attribute__((deprecated("use get_ticks instead")))
326static inline volatile unsigned long read_count(void) {
327 return get_ticks();
328}
331#ifdef __cplusplus
332}
333#endif
334
337#endif
N64 COP0 Interface.
N64 COP1 Interface.
uint64_t get_ticks_us(void)
Read the number of microseconds since system startup.
Definition: n64sys.c:345
bool is_memory_expanded()
Is expansion pak in use.
Definition: n64sys.c:316
void wait_ms(unsigned long wait_ms)
Spin wait until the number of milliseconds have elapsed.
Definition: n64sys.c:361
uint64_t get_ticks(void)
Read the number of ticks since system startup.
Definition: n64sys.c:336
void inst_cache_invalidate_all(void)
Force an instruction cache invalidate over whole memory.
Definition: n64sys.c:206
int get_memory_size()
Get amount of available memory.
Definition: n64sys.c:290
void data_cache_hit_writeback_invalidate(volatile void *addr, unsigned long length)
Force a data cache writeback invalidate over a memory region.
Definition: n64sys.c:127
tv_type_t get_tv_type()
Is system NTSC/PAL/MPAL.
Definition: n64sys.c:331
char __rom_end[]
Symbol at the end of code, data, and sdata (set by the linker)
bool sys_bbplayer(void)
Return true if we are running on a iQue player.
Definition: n64sys.c:43
void data_cache_index_writeback_invalidate(volatile void *addr, unsigned long length)
Force a data cache index writeback invalidate over a memory region.
Definition: n64sys.c:140
void inst_cache_hit_invalidate(volatile void *addr, unsigned long length)
Force an instruction cache invalidate over a memory region.
Definition: n64sys.c:182
void __data_cache_hit_invalidate(volatile void *addr, unsigned long length)
Underlying implementation of data_cache_hit_invalidate.
Definition: n64sys.c:111
tv_type_t
Type of TV video output.
Definition: n64sys.h:314
void * malloc_uncached_aligned(int align, size_t size)
Allocate a buffer that will be accessed as uncached memory, specifying alignment.
Definition: n64sys.c:249
void sys_set_boot_cic(int bc)
Set the boot CIC.
Definition: n64sys.c:73
void data_cache_writeback_invalidate_all(void)
Force a data cache writeback invalidate over whole memory.
Definition: n64sys.c:151
void inst_cache_hit_writeback(volatile const void *addr, unsigned long length)
Force an instruction cache writeback over a memory region.
Definition: n64sys.c:167
void data_cache_hit_writeback(volatile const void *addr, unsigned long length)
Force a data cache writeback over a memory region.
Definition: n64sys.c:105
int __bbplayer
Indicates whether we are running on a vanilla N64 or a iQue player.
Definition: n64sys.c:34
char __bss_end[]
Symbol at the end of code, data, sdata, and bss (set by the linker)
void free_uncached(void *buf)
Free an uncached memory buffer.
Definition: n64sys.c:280
int sys_get_boot_cic()
Return the boot CIC.
Definition: n64sys.c:59
void inst_cache_index_invalidate(volatile void *addr, unsigned long length)
Force an instruction cache index invalidate over a memory region.
Definition: n64sys.c:195
char __libdragon_text_start[]
Symbol at the start of code (start of ROM contents after header)
uint64_t get_ticks_ms(void)
Read the number of millisecounds since system startup.
Definition: n64sys.c:350
void wait_ticks(unsigned long wait)
Spin wait until the number of ticks have elapsed.
Definition: n64sys.c:355
void * malloc_uncached(size_t size)
Allocate a buffer that will be accessed as uncached memory.
Definition: n64sys.c:230
@ TV_MPAL
Video output is M-PAL.
Definition: n64sys.h:317
@ TV_PAL
Video output is PAL.
Definition: n64sys.h:315
@ TV_NTSC
Video output is NTSC.
Definition: n64sys.h:316
int wait(int *status)
Wait for a child process.
Definition: system.c:1202