fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
1/*****************************************************************************
2 * pce *
3 *****************************************************************************/
4
5/*****************************************************************************
6 * File name: src/devices/memory.h *
7 * Created: 2000-04-23 by Hampa Hug <hampa@hampa.ch> *
8 * Copyright: (C) 2000-2013 Hampa Hug <hampa@hampa.ch> *
9 *****************************************************************************/
10
11/*****************************************************************************
12 * This program is free software. You can redistribute it and / or modify it *
13 * under the terms of the GNU General Public License version 2 as published *
14 * by the Free Software Foundation. *
15 * *
16 * This program is distributed in the hope that it will be useful, but *
17 * WITHOUT ANY WARRANTY, without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General *
19 * Public License for more details. *
20 *****************************************************************************/
21
22
23#ifndef PCE_MEMORY_H
24#define PCE_MEMORY_H 1
25
26
27#include <stdio.h>
28
29
30#define MEM_LAST_CNT 4
31
32
33typedef unsigned char (*mem_get_uint8_f) (void *blk, unsigned long addr);
34typedef unsigned short (*mem_get_uint16_f) (void *blk, unsigned long addr);
35typedef unsigned long (*mem_get_uint32_f) (void *blk, unsigned long addr);
36
37typedef void (*mem_set_uint8_f) (void *blk, unsigned long addr, unsigned char val);
38typedef void (*mem_set_uint16_f) (void *blk, unsigned long addr, unsigned short val);
39typedef void (*mem_set_uint32_f) (void *blk, unsigned long addr, unsigned long val);
40
41
42/*!***************************************************************************
43 * @short The memory block structure
44 *****************************************************************************/
45typedef struct {
46 /* These access functions are used if data is NULL. */
47 mem_get_uint8_f get_uint8;
48 mem_get_uint16_f get_uint16;
49 mem_get_uint32_f get_uint32;
50
51 mem_set_uint8_f set_uint8;
52 mem_set_uint16_f set_uint16;
53 mem_set_uint32_f set_uint32;
54
55 /* The transparant parameter for get_*() and set_*(). */
56 void *ext;
57
58 unsigned char active;
59 unsigned char readonly;
60
61 /* Delete data when the memory block is deleted */
62 unsigned char data_del;
63
64 /* Memory block base address */
65 unsigned long addr1;
66
67 /* The last address inside the memory block. addr2 == addr1 + size - 1 */
68 unsigned long addr2;
69
70 /* The memory block size */
71 unsigned long size;
72
73 /* The actual memory or NULL if get_* and set_* are used */
74 unsigned char *data;
75} mem_blk_t;
76
77
78typedef struct {
79 mem_blk_t *blk;
80 int del;
81} mem_lst_t;
82
83
84typedef struct {
85 unsigned cnt;
86 mem_lst_t *lst;
87
88 mem_lst_t *last[MEM_LAST_CNT];
89
90 /* these functions are used if no block is found */
91 void *ext;
92 mem_get_uint8_f get_uint8;
93 mem_get_uint16_f get_uint16;
94 mem_get_uint32_f get_uint32;
95 mem_set_uint8_f set_uint8;
96 mem_set_uint16_f set_uint16;
97 mem_set_uint32_f set_uint32;
98
99 unsigned long defval;
100} memory_t;
101
102
103
104/*!***************************************************************************
105 * @short Initialize a static memory block structure
106 * @param base The linear base address
107 * @param size The block size in bytes
108 * @param alloc If true then backing store is allocated
109 * @return Zero if successful, nonzero otherwise
110 *****************************************************************************/
111int mem_blk_init (mem_blk_t *blk, unsigned long base, unsigned long size, int alloc);
112
113/*!***************************************************************************
114 * @short Create a new memory block
115 * @param base The linear base address
116 * @param size The block size in bytes
117 * @param alloc If true then backing store is allocated
118 * @return The memory block or NULL on error
119 *****************************************************************************/
120mem_blk_t *mem_blk_new (unsigned long base, unsigned long size, int alloc);
121
122/*!***************************************************************************
123 * @short Free the resources used by a static memory block structure
124 * @param blk The memory block
125 *****************************************************************************/
126void mem_blk_free (mem_blk_t *blk);
127
128/*!***************************************************************************
129 * @short Delete a memory block
130 * @param blk The memory block
131 *
132 * Backing store is freed if it was allocated in mem_blk_new().
133 *****************************************************************************/
134void mem_blk_del (mem_blk_t *blk);
135
136mem_blk_t *mem_blk_clone (const mem_blk_t *blk);
137
138void mem_blk_fix_fct (mem_blk_t *blk);
139
140void mem_blk_set_fget (mem_blk_t *blk, void *ext, void *g8, void *g16, void *g32);
141void mem_blk_set_fset (mem_blk_t *blk, void *ext, void *s8, void *s16, void *s32);
142void mem_blk_set_fct (mem_blk_t *blk, void *ext,
143 void *g8, void *g16, void *g32, void *s8, void *s16, void *s32
144);
145void mem_blk_set_ext (mem_blk_t *blk, void *ext);
146
147/*!***************************************************************************
148 * @short Clear a memory block
149 * @param blk The memory block
150 * @param val The byte value with which the block is initialized
151 *****************************************************************************/
152void mem_blk_clear (mem_blk_t *blk, unsigned char val);
153
154unsigned char *mem_blk_get_data (mem_blk_t *blk);
155
156void mem_blk_set_data (mem_blk_t *blk, void *data, int del);
157
158int mem_blk_get_active (mem_blk_t *blk);
159
160void mem_blk_set_active (mem_blk_t *blk, int val);
161
162/*!***************************************************************************
163 * @short Get the read-only flag
164 * @param blk The memory block
165 * @return True if the block is read-only
166 *****************************************************************************/
167int mem_blk_get_readonly (mem_blk_t *blk);
168
169/*!***************************************************************************
170 * @short Set the read-only flag
171 * @param blk The memory block
172 * @param ro Make block-read only if true, read-write otherwise
173 *****************************************************************************/
174void mem_blk_set_readonly (mem_blk_t *blk, int val);
175
176/*!***************************************************************************
177 * @short Get the base address
178 * @param blk The memory block
179 * @return The memory block's base address
180 *****************************************************************************/
181unsigned long mem_blk_get_addr (const mem_blk_t *blk);
182
183/*!***************************************************************************
184 * @short Set the base address
185 * @param blk The memory block
186 * @param addr The memory block's new base address
187 *****************************************************************************/
188void mem_blk_set_addr (mem_blk_t *blk, unsigned long addr);
189
190/*!***************************************************************************
191 * @short Get the memory block size in bytes
192 * @param blk The memory block
193 * @return The memory block size in bytes
194 *****************************************************************************/
195unsigned long mem_blk_get_size (const mem_blk_t *blk);
196
197void mem_blk_set_size (mem_blk_t *blk, unsigned long size);
198
199
200void buf_set_uint8 (void *buf, unsigned long addr, unsigned char val);
201void buf_set_uint16_be (void *buf, unsigned long addr, unsigned short val);
202void buf_set_uint16_le (void *buf, unsigned long addr, unsigned short val);
203void buf_set_uint32_be (void *buf, unsigned long addr, unsigned long val);
204void buf_set_uint32_le (void *buf, unsigned long addr, unsigned long val);
205
206unsigned char buf_get_uint8 (const void *buf, unsigned long addr);
207unsigned short buf_get_uint16_be (const void *buf, unsigned long addr);
208unsigned short buf_get_uint16_le (const void *buf, unsigned long addr);
209unsigned long buf_get_uint32_be (const void *buf, unsigned long addr);
210unsigned long buf_get_uint32_le (const void *buf, unsigned long addr);
211
212
213void mem_blk_set_uint8 (mem_blk_t *blk, unsigned long addr, unsigned char val);
214void mem_blk_set_uint8_null (void *ext, unsigned long addr, unsigned char val);
215void mem_blk_set_uint16_be (mem_blk_t *blk, unsigned long addr, unsigned short val);
216void mem_blk_set_uint16_le (mem_blk_t *blk, unsigned long addr, unsigned short val);
217void mem_blk_set_uint16_null (void *ext, unsigned long addr, unsigned short val);
218void mem_blk_set_uint32_be (mem_blk_t *blk, unsigned long addr, unsigned long val);
219void mem_blk_set_uint32_le (mem_blk_t *blk, unsigned long addr, unsigned long val);
220void mem_blk_set_uint32_null (void *ext, unsigned long addr, unsigned long val);
221
222unsigned char mem_blk_get_uint8 (const mem_blk_t *blk, unsigned long addr);
223unsigned char mem_blk_get_uint8_null (const void *ext, unsigned long addr);
224unsigned short mem_blk_get_uint16_be (const mem_blk_t *blk, unsigned long addr);
225unsigned short mem_blk_get_uint16_le (const mem_blk_t *blk, unsigned long addr);
226unsigned short mem_blk_get_uint16_null (const void *ext, unsigned long addr);
227unsigned long mem_blk_get_uint32_be (const mem_blk_t *blk, unsigned long addr);
228unsigned long mem_blk_get_uint32_le (const mem_blk_t *blk, unsigned long addr);
229unsigned long mem_blk_get_uint32_null (const void *ext, unsigned long addr);
230
231
232/*!***************************************************************************
233 * @short Initialize a static memory structure
234 * @param mem The memory structure
235 *****************************************************************************/
236void mem_init (memory_t *mem);
237
238/*!***************************************************************************
239 * @short Create a new memory structure
240 * @return The new memory structure or NULL on error
241 *****************************************************************************/
242memory_t *mem_new (void);
243
244/*!***************************************************************************
245 * @short Free the resources used by a static memory structure
246 *****************************************************************************/
247void mem_free (memory_t *mem);
248
249/*!***************************************************************************
250 * @short Delete a memory structure
251 *****************************************************************************/
252void mem_del (memory_t *mem);
253
254/*!***************************************************************************
255 * @short Set the default access functions
256 *****************************************************************************/
257void mem_set_fct (memory_t *mem, void *ext,
258 void *g8, void *g16, void *g32, void *s8, void *s16, void *s32
259);
260
261/*!***************************************************************************
262 * @short Set the default value
263 * @param mem The memory structure
264 * @param val The default value
265 *****************************************************************************/
266void mem_set_default (memory_t *mem, unsigned char val);
267
268/*!***************************************************************************
269 * @short Print memory state information
270 *****************************************************************************/
271void mem_prt_state (memory_t *mem, FILE *fp);
272
273/*!***************************************************************************
274 * @short Add a memory block to a memory structure
275 * @param mem The memory structure
276 * @param blk The memory block
277 * @param del If true then the block will be deleted when the memory
278 * structure is deleted.
279 *****************************************************************************/
280void mem_add_blk (memory_t *mem, mem_blk_t *blk, int del);
281
282/*!***************************************************************************
283 * @short Remove a memory block without deleting it
284 * @param mem The memory structure
285 * @param blk The memory block
286 *****************************************************************************/
287void mem_rmv_blk (memory_t *mem, const mem_blk_t *blk);
288
289/*!***************************************************************************
290 * @short Remove all memory blocks and delete marked blocks
291 * @param mem The memory structure
292 *****************************************************************************/
293void mem_rmv_all (memory_t *mem);
294
295/*!***************************************************************************
296 * @short Move a memory block to the front of the list
297 * @param mem The memory structure
298 * @param addr The memory block containing this address is moved
299 *****************************************************************************/
300void mem_move_to_front (memory_t *mem, unsigned long addr);
301
302/*!***************************************************************************
303 * @short Get a memory block containing an address
304 * @param mem The memory structure
305 * @return blk The memory block or NULL
306 *****************************************************************************/
307mem_blk_t *mem_get_blk (memory_t *mem, unsigned long addr);
308
309/*!***************************************************************************
310 * @short Get a pointer to memory
311 * @param mem The memory structure
312 * @param addr The pointer address
313 * @param size The requested block size
314 * @return A pointer to a block of memory at address addr and of size size
315 *****************************************************************************/
316void *mem_get_ptr (memory_t *mem, unsigned long addr, unsigned long size);
317
318unsigned char mem_get_uint8 (memory_t *mem, unsigned long addr);
319unsigned short mem_get_uint16_be (memory_t *mem, unsigned long addr);
320unsigned short mem_get_uint16_le (memory_t *mem, unsigned long addr);
321unsigned long mem_get_uint32_be (memory_t *mem, unsigned long addr);
322unsigned long mem_get_uint32_le (memory_t *mem, unsigned long addr);
323
324void mem_set_uint8_rw (memory_t *mem, unsigned long addr, unsigned char val);
325void mem_set_uint8 (memory_t *mem, unsigned long addr, unsigned char val);
326void mem_set_uint16_be (memory_t *mem, unsigned long addr, unsigned short val);
327void mem_set_uint16_le (memory_t *mem, unsigned long addr, unsigned short val);
328void mem_set_uint32_be (memory_t *mem, unsigned long addr, unsigned long val);
329void mem_set_uint32_le (memory_t *mem, unsigned long addr, unsigned long val);
330
331
332#endif