Search
lxdream.org :: lxdream/src/mem.h
lxdream 0.9.1
released Jun 29
Download Now
filename src/mem.h
changeset 934:3acd3b3ee6d1
prev931:430048ea8b71
next939:6f2302afeb89
author nkeynes
date Sat Dec 27 02:59:35 2008 +0000 (15 years ago)
branchlxdream-mem
permissions -rw-r--r--
last change Replace fpscr_mask/fpscr flags in xlat_cache_block with a single xlat_sh4_mode,
which tracks the field of the same name in sh4r - actually a little faster this way.
Now depends on SR.MD, FPSCR.PR and FPSCR.SZ (although it doesn't benefit from the SR
flag yet).

Also fixed the failure to check the flags in the common case (code address returned
by previous block) which took away the performance benefits, but oh well.
file annotate diff log raw
nkeynes@31
     1
/**
nkeynes@586
     2
 * $Id$
nkeynes@31
     3
 *
nkeynes@31
     4
 * mem is responsible for creating and maintaining the overall system memory
nkeynes@31
     5
 * map, as visible from the SH4 processor. (Note the ARM has a different map)
nkeynes@31
     6
 *
nkeynes@31
     7
 * Copyright (c) 2005 Nathan Keynes.
nkeynes@31
     8
 *
nkeynes@31
     9
 * This program is free software; you can redistribute it and/or modify
nkeynes@31
    10
 * it under the terms of the GNU General Public License as published by
nkeynes@31
    11
 * the Free Software Foundation; either version 2 of the License, or
nkeynes@31
    12
 * (at your option) any later version.
nkeynes@31
    13
 *
nkeynes@31
    14
 * This program is distributed in the hope that it will be useful,
nkeynes@31
    15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nkeynes@31
    16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
nkeynes@31
    17
 * GNU General Public License for more details.
nkeynes@31
    18
 */
nkeynes@31
    19
nkeynes@736
    20
#ifndef lxdream_mem_H
nkeynes@736
    21
#define lxdream_mem_H 1
nkeynes@10
    22
nkeynes@10
    23
#include <stdint.h>
nkeynes@477
    24
#include "lxdream.h"
nkeynes@931
    25
#include "hook.h"
nkeynes@10
    26
nkeynes@10
    27
#ifdef __cplusplus
nkeynes@10
    28
extern "C" {
nkeynes@10
    29
#endif
nkeynes@10
    30
nkeynes@931
    31
/**
nkeynes@931
    32
 * Basic memory region vtable - read/write at byte, word, long, and burst 
nkeynes@931
    33
 * (32-byte) sizes.
nkeynes@931
    34
 */
nkeynes@929
    35
typedef struct mem_region_fn {
nkeynes@929
    36
    FASTCALL int32_t (*read_long)(sh4addr_t addr);
nkeynes@929
    37
    FASTCALL void (*write_long)(sh4addr_t addr, uint32_t val);
nkeynes@929
    38
    FASTCALL int32_t (*read_word)(sh4addr_t addr);
nkeynes@929
    39
    FASTCALL void (*write_word)(sh4addr_t addr, uint32_t val);
nkeynes@929
    40
    FASTCALL int32_t (*read_byte)(sh4addr_t addr);
nkeynes@929
    41
    FASTCALL void (*write_byte)(sh4addr_t addr, uint32_t val);
nkeynes@929
    42
    FASTCALL void (*read_burst)(unsigned char *dest, sh4addr_t addr);
nkeynes@929
    43
    FASTCALL void (*write_burst)(sh4addr_t addr, unsigned char *src);
nkeynes@929
    44
} *mem_region_fn_t;
nkeynes@931
    45
nkeynes@931
    46
int32_t FASTCALL unmapped_read_long( sh4addr_t addr );
nkeynes@931
    47
void FASTCALL unmapped_write_long( sh4addr_t addr, uint32_t val );
nkeynes@931
    48
void FASTCALL unmapped_read_burst( unsigned char *dest, sh4addr_t addr );
nkeynes@931
    49
void FASTCALL unmapped_write_burst( sh4addr_t addr, unsigned char *src );
nkeynes@931
    50
extern struct mem_region_fn mem_region_unmapped;
nkeynes@931
    51
nkeynes@10
    52
typedef struct mem_region {
nkeynes@10
    53
    uint32_t base;
nkeynes@10
    54
    uint32_t size;
nkeynes@422
    55
    const char *name;
nkeynes@502
    56
    sh4ptr_t mem;
nkeynes@510
    57
    uint32_t flags;
nkeynes@929
    58
    mem_region_fn_t fn;
nkeynes@10
    59
} *mem_region_t;
nkeynes@10
    60
nkeynes@10
    61
#define MAX_IO_REGIONS 24
nkeynes@931
    62
#define MAX_MEM_REGIONS 16
nkeynes@10
    63
nkeynes@180
    64
#define MEM_REGION_BIOS "Bios ROM"
nkeynes@10
    65
#define MEM_REGION_MAIN "System RAM"
nkeynes@10
    66
#define MEM_REGION_VIDEO "Video RAM"
nkeynes@931
    67
#define MEM_REGION_VIDEO64 "Video RAM 64-bit"
nkeynes@10
    68
#define MEM_REGION_AUDIO "Audio RAM"
nkeynes@10
    69
#define MEM_REGION_AUDIO_SCRATCH "Audio Scratch RAM"
nkeynes@146
    70
#define MEM_REGION_FLASH "System Flash"
nkeynes@934
    71
#define MEM_REGION_PVR2TA "PVR2 TA Command"
nkeynes@934
    72
#define MEM_REGION_PVR2YUV "PVR2 YUV Decode"
nkeynes@934
    73
#define MEM_REGION_PVR2VDMA1 "PVR2 VRAM DMA 1"
nkeynes@934
    74
#define MEM_REGION_PVR2VDMA2 "PVR2 VRAM DMA 2"
nkeynes@10
    75
nkeynes@931
    76
typedef gboolean (*mem_page_remapped_hook_t)(sh4addr_t page, mem_region_fn_t newfn, void *user_data);
nkeynes@931
    77
DECLARE_HOOK( mem_page_remapped_hook, mem_page_remapped_hook_t );
nkeynes@931
    78
nkeynes@934
    79
struct mem_region *mem_map_region( void *mem, uint32_t base, uint32_t size,
nkeynes@934
    80
                                   const char *name, mem_region_fn_t fn, int flags, uint32_t repeat_offset,
nkeynes@934
    81
                                   uint32_t repeat_until );
nkeynes@931
    82
nkeynes@543
    83
/**
nkeynes@543
    84
 * Load a ROM image from the specified filename. If the memory region has not
nkeynes@543
    85
 * been allocated, it is created now, otherwise the existing region is reused.
nkeynes@543
    86
 * If the CRC check fails, a warning will be printed.
nkeynes@543
    87
 * @return TRUE if the image was loaded successfully (irrespective of CRC failure).
nkeynes@543
    88
 */
nkeynes@934
    89
gboolean mem_load_rom( void *output, const gchar *filename, uint32_t size, uint32_t crc ); 
nkeynes@19
    90
void *mem_alloc_pages( int n );
nkeynes@502
    91
sh4ptr_t mem_get_region( uint32_t addr );
nkeynes@502
    92
sh4ptr_t mem_get_region_by_name( const char *name );
nkeynes@934
    93
gboolean mem_has_page( uint32_t addr );
nkeynes@146
    94
int mem_load_block( const gchar *filename, uint32_t base, uint32_t size );
nkeynes@146
    95
int mem_save_block( const gchar *filename, uint32_t base, uint32_t size );
nkeynes@586
    96
void mem_set_trace( const gchar *tracelist, int flag );
nkeynes@10
    97
void mem_init( void );
nkeynes@10
    98
void mem_reset( void );
nkeynes@912
    99
void mem_copy_from_sh4( sh4ptr_t dest, sh4addr_t src, size_t count );
nkeynes@912
   100
void mem_copy_to_sh4( sh4addr_t dest, sh4ptr_t src, size_t count );
nkeynes@10
   101
nkeynes@669
   102
/**
nkeynes@669
   103
 * Write a long value directly to SH4-addressable memory.
nkeynes@669
   104
 * @param dest a valid, writable physical memory address, relative to the SH4
nkeynes@669
   105
 * @param value the value to write.
nkeynes@669
   106
 */
nkeynes@669
   107
void mem_write_long( sh4addr_t dest, uint32_t value );
nkeynes@669
   108
nkeynes@43
   109
#define ENABLE_DEBUG_MODE 1
nkeynes@43
   110
nkeynes@586
   111
typedef enum { BREAK_NONE=0, BREAK_ONESHOT=1, BREAK_KEEP=2 } breakpoint_type_t;
nkeynes@586
   112
nkeynes@43
   113
struct breakpoint_struct {
nkeynes@43
   114
    uint32_t address;
nkeynes@586
   115
    breakpoint_type_t type;
nkeynes@43
   116
};
nkeynes@43
   117
nkeynes@43
   118
#define MAX_BREAKPOINTS 32
nkeynes@43
   119
nkeynes@586
   120
nkeynes@586
   121
#define MEM_FLAG_ROM 4 /* Mem region is ROM-based */
nkeynes@586
   122
#define MEM_FLAG_RAM 6 
nkeynes@10
   123
nkeynes@10
   124
#define WATCH_WRITE 1
nkeynes@10
   125
#define WATCH_READ  2
nkeynes@10
   126
#define WATCH_EXEC  3  /* AKA Breakpoint :) */
nkeynes@10
   127
nkeynes@10
   128
typedef struct watch_point *watch_point_t;
nkeynes@10
   129
nkeynes@10
   130
watch_point_t mem_new_watch( uint32_t start, uint32_t end, int flags );
nkeynes@10
   131
void mem_delete_watch( watch_point_t watch );
nkeynes@10
   132
watch_point_t mem_is_watched( uint32_t addr, int size, int op );
nkeynes@10
   133
nkeynes@931
   134
extern mem_region_fn_t *ext_address_space;
nkeynes@931
   135
nkeynes@931
   136
#define SIGNEXT4(n) ((((int32_t)(n))<<28)>>28)
nkeynes@931
   137
#define SIGNEXT8(n) ((int32_t)((int8_t)(n)))
nkeynes@931
   138
#define SIGNEXT12(n) ((((int32_t)(n))<<20)>>20)
nkeynes@931
   139
#define SIGNEXT16(n) ((int32_t)((int16_t)(n)))
nkeynes@931
   140
#define SIGNEXT32(n) ((int64_t)((int32_t)(n)))
nkeynes@931
   141
#define SIGNEXT48(n) ((((int64_t)(n))<<16)>>16)
nkeynes@931
   142
#define ZEROEXT32(n) ((int64_t)((uint64_t)((uint32_t)(n))))
nkeynes@736
   143
nkeynes@10
   144
#ifdef __cplusplus
nkeynes@10
   145
}
nkeynes@10
   146
#endif
nkeynes@736
   147
nkeynes@736
   148
#endif /* !lxdream_mem_H */
.