fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
at master 332 lines 15 kB view raw
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