1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2 * Mupen64plus-rsp-hle - memory.h *
3 * Mupen64Plus homepage: http://code.google.com/p/mupen64plus/ *
4 * Copyright (C) 2014 Bobby Smiles *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the *
18 * Free Software Foundation, Inc., *
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
20 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
21
22 #ifndef MEMORY_H
23 #define MEMORY_H
24
25 #include <assert.h>
26 #include <stddef.h>
27 #include <stdint.h>
28 #include <string.h>
29
30 #include <retro_inline.h>
31
32 #include "hle_internal.h"
33
34 #ifdef MSB_FIRST
35 #define S 0
36 #define S16 0
37 #define S8 0
38 #else
39 #define S 1
40 #define S16 2
41 #define S8 3
42 #endif
43
44 enum {
45 TASK_TYPE = 0xfc0,
46 TASK_FLAGS = 0xfc4,
47 TASK_UCODE_BOOT = 0xfc8,
48 TASK_UCODE_BOOT_SIZE = 0xfcc,
49 TASK_UCODE = 0xfd0,
50 TASK_UCODE_SIZE = 0xfd4,
51 TASK_UCODE_DATA = 0xfd8,
52 TASK_UCODE_DATA_SIZE = 0xfdc,
53 TASK_DRAM_STACK = 0xfe0,
54 TASK_DRAM_STACK_SIZE = 0xfe4,
55 TASK_OUTPUT_BUFF = 0xfe8,
56 TASK_OUTPUT_BUFF_SIZE = 0xfec,
57 TASK_DATA_PTR = 0xff0,
58 TASK_DATA_SIZE = 0xff4,
59 TASK_YIELD_DATA_PTR = 0xff8,
60 TASK_YIELD_DATA_SIZE = 0xffc
61 };
62
align(unsigned int x,unsigned amount)63 static INLINE unsigned int align(unsigned int x, unsigned amount)
64 {
65 --amount;
66 return (x + amount) & ~amount;
67 }
68
69 #define u8(buffer, address) ((uint8_t*)((buffer) + ((address) ^ S8)))
70 #define u16(buffer, address) ((uint16_t*)((buffer) + ((address) ^ S16)))
71 #define u32(buffer, address) ((uint32_t*)((buffer) + (address)))
72
73 void load_u8 (uint8_t* dst, const unsigned char* buffer, unsigned address, size_t count);
74 void load_u16(uint16_t* dst, const unsigned char* buffer, unsigned address, size_t count);
75
76 #define load_u32(dst, buffer, address, count) memcpy((dst), u32((buffer), (address)), (count) * sizeof(uint32_t))
77
78 void store_u16(unsigned char* buffer, unsigned address, const uint16_t* src, size_t count);
79 void store_u32(unsigned char* buffer, unsigned address, const uint32_t* src, size_t count);
80
81 #define store_u32(buffer, address, src, count) memcpy(u32((buffer), (address)), (src), (count) * sizeof(uint32_t))
82
83 /* convenient functions for DMEM access */
84 #define dmem_u8(hle, address) (u8((hle)->dmem, (address) & 0xFFF)
85 #define dmem_u16(hle, address) (u16((hle)->dmem, (address) & 0xfff);
86 #define dmem_u32(hle, address) (u32((hle)->dmem, (address) & 0xfff))
87 #define dmem_load_u8(hle, dst, address, count) load_u8((dst), (hle)->dmem, (address) & 0xfff, (count))
88 #define dmem_load_u16(hle, dst, address, count) load_u16((dst), (hle)->dmem, (address) & 0xfff, (count))
89 #define dmem_load_u32(hle, dst, address, count) load_u32((dst), (hle)->dmem, (address) & 0xfff, (count))
90 #define dmem_store_u16(hle, src, address, count) store_u16((hle)->dmem, (address) & 0xfff, (src), (count))
91 #define dmem_store_u32(hle, src, address, count) store_u32((hle)->dmem, (address) & 0xfff, (src), (count))
92
93 /* convenient functions DRAM access */
94 #define dram_u8(hle, address) (u8((hle)->dram, (address) & 0xffffff))
95 #define dram_u16(hle, address) (u16((hle)->dram, (address) & 0xffffff))
96 #define dram_u32(hle, address) (u32((hle)->dram, (address) & 0xffffff))
97
98 #define dram_load_u8(hle, dst, address, count) load_u8((dst), (hle)->dram, (address) & 0xffffff, (count))
99 #define dram_load_u16(hle, dst, address, count) load_u16((dst), (hle)->dram, (address) & 0xffffff, (count))
100 #define dram_load_u32(hle, dst, address, count) load_u32((dst), (hle)->dram, (address) & 0xffffff, (count))
101 #define dram_store_u8(hle, src, address, count) store_u8((hle)->dram, (address) & 0xffffff, (src), (count))
102 #define dram_store_u16(hle, src, address, count) store_u16((hle)->dram, (address) & 0xffffff, (src), (count))
103 #define dram_store_u32(hle, src, address, count) store_u32((hle)->dram, (address) & 0xffffff, (src), (count))
104
105 #endif
106
107