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