⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ram.c

📁 SkyEye是一个可以运行嵌入式操作系统的硬件仿真工具
💻 C
字号:
/**********************************//*                                *//*  Copyright 2002, David Grant   *//*                                *//*  see LICENSE for more details  *//*                                *//**********************************//* RAM and ROM memory modules */#include <stdio.h>#include <stdlib.h>#include <string.h>/*#define SKYEYE_DBGR_OFF*/#include "coldfire.h"SKYEYE_DBGR_DEFAULT_CHANNEL(ram);void ram_init(void);static void ram_setup(struct _memory_segment *s);static void rom_setup(struct _memory_segment *s);static void ram_fini(struct _memory_segment *s);static char ram_read(struct _memory_segment *s, unsigned int *result, short size, unsigned int offset);static char ram_write(struct _memory_segment *s, short size, unsigned int offset, unsigned int value);static char rom_write(struct _memory_segment *s, short size, unsigned int offset, unsigned int value);static void rom_reset(struct _memory_segment *s);struct _mem_data {	char *begin;	char *end;	int len;};	void ram_init(void){	memory_module_register("ram", &ram_setup);	memory_module_register("rom", &rom_setup);}static void ram_setup(struct _memory_segment *s){	int len;	struct _mem_data *mem;	mem = malloc(sizeof(struct _mem_data));		/* Get the length, which is actually the mask + 1 */	len = (~s->mask) + 1;		SKYEYE_DBG("len=%x\n", len);	/* +3 for those long reads at EOM */	mem->begin=malloc((size_t)(len+3)); 	mem->end = mem->begin + len /* +3 -3 */;	SKYEYE_DBG("end=%x\n", mem->end);	mem->len = len;	s->data = mem;	/* Now set the functions to use */	s->fini = &ram_fini;	s->read = &ram_read;	s->write = &ram_write;	s->reset = NULL;	s->update = NULL;}static void rom_setup(struct _memory_segment *s){	ram_setup(s);	s->write = &rom_write;	s->reset = &rom_reset;}static void ram_fini(struct _memory_segment *s){	struct _mem_data *mem = (struct _mem_data *)s->data;	free(mem->begin);	free(s->name);	free(s->data);}static void rom_reset(struct _memory_segment *s){	struct _mem_data *mem = (struct _mem_data *)s->data;	int x;	/* Map out the rom in bigendian */	SKYEYE_DBG("ROM setup with code_length=%d\n", s->code_len);	for(x=0;x<s->code_len;x++) {		SKYEYE_DBG(" code[%d] = 0x%02x\n", x, s->code[x]);	}#ifdef UNALIGNED_ACCESS	#ifndef WORDS_BIGENDIAN		/* Put them in backards, starting at ram->end+3 */		for(x=0;x<s->code_len; x++) mem->end[3 - x] = s->code[x];	#else		memcpy(mem->begin, s->code, s->code_len);	#endif#else	/* Endianness doesn't matter if we can't do unaligned 	 *  reads/writes.  We just convert everything to big endian */	memcpy(mem->begin, s->code, s->code_len);#endif		}static char ram_read(struct _memory_segment *s, unsigned int *result, 					short size, unsigned int offset){	struct _mem_data *mem = (struct _mem_data *)s->data;#ifdef UNALIGNED_ACCESS	unsigned int *ptr;	SKYEYE_DBG("size=%d, offset=0x%08lx\n", size, offset);	#ifndef WORDS_BIGENDIAN		ptr = (unsigned int *)(mem->end - offset);	#else		ptr = (unsigned int *)(mem->begin + offset);	#endif	*result = (*ptr) >> (32 - size);#else	unsigned char *ptr = (unsigned char *)(mem->begin + offset);	SKYEYE_DBG("mem->begin=0x%08lx size=%d, offset=0x%08lx, ptr=%p\n", 			mem->begin, size, offset, ptr);	if(size == 32)		*result = (*ptr<<24) | (*(ptr+1)<<16) | (*(ptr+2)<<8) | *(ptr+3);	else if (size == 16)		*result = (*ptr<< 8) | *(ptr+1);	else		*result = *ptr;#endif	SKYEYE_DBG("result=0x%08lx\n", *result);	return 1;}static char ram_write(struct _memory_segment *s, short size, 			unsigned int offset, unsigned int value){#ifdef UNALIGNED_ACCESS	void *ptr;	unsigned int templ;#else	unsigned char *ptr;#endif	struct _mem_data *mem = (struct _mem_data *)s->data;	SKYEYE_DBG("s=%p\n", s);	SKYEYE_DBG("size=%d, offset=0x%08lx, value=0x%08lx\n", size, offset, value);	/* Normal memory access */#ifdef UNALIGNED_ACCESS	#ifndef WORDS_BIGENDIAN		ptr = (void *)(mem->end - offset);	#else		ptr = (void *)(mem->begin + offset);	#endif	SKYEYE_DBG("s=%p\n", s);	SKYEYE_DBG("ptr=%p\n", ptr);	SKYEYE_DBG("mem->end=%p\n", mem->end);	if(size == 32) {		*(unsigned int *)ptr = value;		return 1;		} else if (size == 0x0010) {/*			*(unsigned short *)ptr = (unsigned short)(value & 0x0000FFFF);*/		memcpy(&templ, ptr, 4);		templ &= 0x0000FFFF;		templ |= (value << 16);		memcpy(ptr, &templ, 4);		return 1;		} /* Else, 8 bits */ else {/*		*(unsigned char *)ptr = (unsigned char)(value & 0x000000FF);*/		memcpy(&templ, ptr, 4);		templ &= 0x00FFFFFF;		templ |= (value << 24);		memcpy(ptr, &templ, 4);		return 1;		}#else	ptr = (unsigned char *)(mem->begin + offset);	SKYEYE_DBG("s=%p\n", s);	SKYEYE_DBG("ptr=%p\n", ptr);	SKYEYE_DBG("mem->end=%p\n", mem->end);	if(size == 32) {		*ptr 	= (value >> 24) & 0xFF;		*(ptr+1)= (value >> 16) & 0xFF; 		*(ptr+2)= (value >>  8) & 0xFF; 		*(ptr+3)= (value      ) & 0xFF;		return 1;	} else if (size == 16) {		*ptr 	= (value >>  8) & 0xFF;		*(ptr+1)= (value      ) & 0xFF; 		return 1;	} else {		*ptr 	= (value      ) & 0xFF;		return 1;	}#endif/*	memcpy(ptr, &templ, 4);*/	return 0;}static char rom_write(struct _memory_segment *s, short size, 				unsigned int offset, unsigned int value){	SKYEYE_ERR("size=%d, offset=0x%08lx, value=0x%08lx\n", size, offset, value);	SKYEYE_ERR("Cannot write to ROM, go away.\n");	return 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -