📄 obsolete.cc
字号:
/* * Memory location handled specially by a hw element *//*cl_memloc::cl_memloc(t_addr addr): cl_base(){ address= addr; hws= new cl_list(2, 2); hws->init();}*//*cl_memloc::~cl_memloc(void){ hws->disconn_all(); delete hws;}*//*ulongcl_memloc::read(class cl_mem *mem){ uchar ret= 0; class cl_hw *hw; if (!hws || hws->count == 0) return(ret); if ((hw= (class cl_hw *)(hws->at(0)))) ret= hw->read(mem, address); return(ret);}*//*voidcl_memloc::write(class cl_mem *mem, t_addr addr, t_mem *val){ class cl_hw *hw; int i; if (!hws) return; for (i= 0; i < hws->count; i++) { hw= (class cl_hw *)hws->at(0); hw->write(mem, addr, val); }}*//* Sorted collection of memory locations *//*cl_memloc_coll::cl_memloc_coll(void): cl_sorted_list(2, 2){ Duplicates= DD_FALSE;}*//*void *cl_memloc_coll::key_of(void *item){ return(&(((class cl_memloc *)item)->address));}*//*intcl_memloc_coll::compare(void *key1, void *key2){ if (*(long*)key1 > *(long*)key2) return(1); else if (*(long*)key1 < *(long*)key2) return(-1); else return(0);}*//*class cl_memloc *cl_memloc_coll::get_loc(t_addr address){ t_index i; if (search(&address, i)) return((class cl_memloc*)(at(i))); return(0);}*//* * Memory ****************************************************************************** *//* * Bitmap *//*cl_bitmap::cl_bitmap(t_addr asize): cl_base(){ map= (uchar*)malloc(size= asize/(8*SIZEOF_CHAR)); memset(map, 0, size);}cl_bitmap::~cl_bitmap(void){ free(map);}voidcl_bitmap::set(t_addr pos){ int i; if ((i= pos/(8*SIZEOF_CHAR)) < size) map[i]|= (1 << (pos & ((8*SIZEOF_CHAR)-1)));}voidcl_bitmap::clear(t_addr pos){ int i; if ((i= pos/(8*SIZEOF_CHAR)) < size) map[i]&= ~(1 << (pos & ((8*SIZEOF_CHAR)-1)));}boolcl_bitmap::get(t_addr pos){ return(map[pos/(8*SIZEOF_CHAR)] & (1 << (pos & ((8*SIZEOF_CHAR)-1))));}boolcl_bitmap::empty(void){ int i; for (i= 0; i < size && map[i] == 0; i++) ; return(i == size);}*//* * Special memory for code (ROM) *//*cl_rom::cl_rom(t_addr asize, int awidth, class cl_uc *auc): cl_mem(MEM_ROM, get_id_string(mem_classes, MEM_ROM), asize, awidth, auc){ bp_map= new cl_bitmap(asize); inst_map= new cl_bitmap(asize);}cl_rom::~cl_rom(void){ delete bp_map; delete inst_map;}*/cl_mem::cl_mem(enum mem_class atype, char *aclass_name, t_addr asize, int awidth, class cl_uc *auc): cl_guiobj(){ int i; uc= auc; type= atype; class_name= aclass_name; width= awidth; size= asize; mem= 0; for (i= width, mask= 0; i; i--) mask= (mask<<1) | 1; if (width == 0 || size == 0) mem= 0; else if (width <= 8) mem= (TYPE_UBYTE *)malloc(size); else if (width <= 16) mem= (TYPE_UWORD *)malloc(size*sizeof(TYPE_WORD)); else mem= (TYPE_UDWORD *)malloc(size*sizeof(TYPE_DWORD)); //read_locs= new cl_memloc_coll(); //write_locs= new cl_memloc_coll(); dump_finished= 0; addr_format= data_format= 0;}cl_mem::~cl_mem(void){ if (mem) free(mem); if (addr_format) free(addr_format); if (data_format) free(data_format); //delete read_locs; //delete write_locs;}intcl_mem::init(void){ t_addr i; addr_format= (char *)malloc(10); sprintf(addr_format, "0x%%0%dx", size-1<=0xf?1: (size-1<=0xff?2: (size-1<=0xfff?3: (size-1<=0xffff?4: (size-1<=0xfffff?5: (size-1<=0xffffff?6:12)))))); data_format= (char *)malloc(10); sprintf(data_format, "%%0%dx", width/4+((width%4)?1:0)); for (i= 0; i < size; i++) set(i, (type==MEM_ROM)?(-1):0); return(0);}char *cl_mem::id_string(void){ char *s= get_id_string(mem_ids, type); return(s?s:(char*)"NONE");}t_memcl_mem::read(t_addr addr){ //class cl_memloc *loc; if (addr >= size) { //FIXME fprintf(stderr, "Address 0x%06"_A_"x is over 0x%06"_A_"x\n", addr, size); return(0); } /*if ((loc= read_locs->get_loc(addr))) return(loc->read(this));*/ if (width <= 8) return((((TYPE_UBYTE*)mem)[addr])&mask); else if (width <= 16) return((((TYPE_UWORD*)mem)[addr])&mask); else return((((TYPE_UDWORD*)mem)[addr])&mask);}t_memcl_mem::get(t_addr addr){ if (addr >= size) return(0); if (width <= 8) return((((TYPE_UBYTE*)mem)[addr])&mask); else if (width <= 16) return((((TYPE_UWORD*)mem)[addr])&mask); else return((((TYPE_UDWORD*)mem)[addr])&mask);}/* * Modify memory location *//* Write calls callbacks of HW elements */t_memcl_mem::write(t_addr addr, t_mem val){ /* class cl_memloc *loc; if (addr >= size) return; if ((loc= write_locs->get_loc(addr))) loc->write(this, addr, val); if (width <= 8) ((TYPE_UBYTE*)mem)[addr]= (*val)&mask; else if (width <= 16) ((TYPE_UWORD*)mem)[addr]= (*val)&mask; else ((TYPE_UDWORD*)mem)[addr]= (*val)&mask;*/ fprintf(stderr, "FIXME cl_mem::write(0x%06"_A_"x, 0x%04"_M_"x)\n", addr, val); return(0);}/* Set doesn't call callbacks */voidcl_mem::set(t_addr addr, t_mem val){ if (addr >= size) return; if (width <= 8) ((TYPE_UBYTE*)mem)[addr]= val&mask; else if (width <= 16) ((TYPE_UWORD*)mem)[addr]= val&mask; else ((TYPE_UDWORD*)mem)[addr]= val&mask;}t_memcl_mem::add(t_addr addr, long what){ if (addr >= size) return(0); if (width <= 8) { ((TYPE_UBYTE*)mem)[addr]= ((TYPE_UBYTE*)mem)[addr] + what; return(((TYPE_UBYTE*)mem)[addr]); } else if (width <= 16) { ((TYPE_UWORD*)mem)[addr]= ((TYPE_UWORD*)mem)[addr] + what; return(((TYPE_UWORD*)mem)[addr]); } else { ((TYPE_UDWORD*)mem)[addr]= ((TYPE_UDWORD*)mem)[addr] + what; return(((TYPE_UDWORD*)mem)[addr]); }}t_addrcl_mem::dump(t_addr start, t_addr stop, int bpl, class cl_console *con){ int i; while ((start <= stop) && (start < size)) { con->dd_printf(addr_format, start); con->dd_printf(" "); for (i= 0; (i < bpl) && (start+i < size) && (start+i <= stop); i++) { con->dd_printf(data_format, /*read*/get(start+i)); con->dd_printf(" "); } while (i < bpl) { int j; j= width/4 + ((width%4)?1:0) + 1; while (j) { con->dd_printf(" "); j--; } i++; } for (i= 0; (i < bpl) && (start+i < size) && (start+i <= stop); i++) { long c= get(start+i); con->dd_printf("%c", isprint(255&c)?(255&c):'.'); if (width > 8) con->dd_printf("%c", isprint(255&(c>>8))?(255&(c>>8)):'.'); if (width > 16) con->dd_printf("%c", isprint(255&(c>>16))?(255&(c>>16)):'.'); if (width > 24) con->dd_printf("%c", isprint(255&(c>>24))?(255&(c>>24)):'.'); } con->dd_printf("\n"); dump_finished= start+i; start+= bpl; } return(dump_finished);}t_addrcl_mem::dump(class cl_console *con){ return(dump(dump_finished, dump_finished+10*8-1, 8, con));}/* *//*cl_mapped_cell::cl_mapped_cell(class cl_cell *realcell){ real_cell= realcell;}cl_mapped_cell::~cl_mapped_cell(void){}t_memcl_mapped_cell::read(void){ return(real_cell->read());}t_memcl_mapped_cell::read(enum hw_cath skip){ return(real_cell->read(skip));}t_memcl_mapped_cell::get(void){ return(real_cell->get());}t_memcl_mapped_cell::write(t_mem val){ return(real_cell->write(val));}t_memcl_mapped_cell::set(t_mem val){ return(real_cell->set(val));}t_memcl_mapped_cell::add(long what){ return(real_cell->add(what));}t_memcl_mapped_cell::wadd(long what){ return(real_cell->wadd(what));}voidcl_mapped_cell::set_bit1(t_mem bits){ return(real_cell->set_bit1(bits));}voidcl_mapped_cell::set_bit0(t_mem bits){ return(real_cell->set_bit0(bits));}class cl_cell *cl_mapped_cell::add_hw(class cl_hw *hw, int *ith){ return(real_cell->add_hw(hw, ith));}class cl_hw *cl_mapped_cell::get_hw(int ith){ return(real_cell->get_hw(ith));}class cl_event_handler *cl_mapped_cell::get_event_handler(void){ return(real_cell->get_event_handler());}*//* */cl_m::cl_m(enum mem_class atype, char *aclass_name, t_addr asize, int awidth, class cl_uc *auc): cl_memory(aclass_name, asize, awidth) //cl_mem(atype, aclass_name, 0, awidth, auc){ t_addr a; //size= asize; width= awidth; set_name(aclass_name); uc= auc; type= atype; array= (class cl_cell **)calloc(size, sizeof(class cl_cell *)); for (a= 0; a < size; a++) array[a]= new cl_normal_cell(width); bus_mask= 0; t_addr i; for (i= 1; i < size; i<<=1) bus_mask= (bus_mask<<1)|1; dummy= new cl_normal_cell(width); //mk_cell(size, 0);}cl_m::~cl_m(void){ t_addr a; for (a= 0; a < size; a++) delete array[a]; free(array); delete dummy;}intcl_m::init(void){ t_addr i; cl_memory::init(); for (i= 0; i < size; i++) set(i, (type==MEM_ROM)?(-1):0); return(0);}char *cl_m::id_string(void){ char *s= get_id_string(mem_ids, type); return(s?s:(char*)"NONE");}/*voidcl_m::mk_cell(t_addr addr, class cl_cell *cell){ if (!cell) cell= new cl_cell(width); class cl_cell *p; if (addr >= size) p= dummy; else p= array[addr]; if (p == 0) { p= (class cl_cell *)calloc(1, sizeof(*cell)); } else { p->destroy(); p= (class cl_cell *)realloc(p, sizeof(cell)); } memcpy(p, cell, sizeof(*cell)); cell->destroy(); delete cell;}*/t_memcl_m::read(t_addr addr){ //addr&= bus_mask; if (addr >= size) { err_inv_addr(addr); return(dummy->read()); } return(array[addr]->read());}t_memcl_m::read(t_addr addr, enum hw_cath skip){ //addr&= bus_mask; if (addr >= size) { err_inv_addr(addr); return(dummy->read(skip)); } return(array[addr]->read(skip));}t_memcl_m::get(t_addr addr){ addr&= bus_mask; if (addr >= size) { err_inv_addr(addr); return(dummy->get()); } return(array[addr]->get());}t_memcl_m::write(t_addr addr, t_mem val){ //addr&= bus_mask; if (addr >= size) { err_inv_addr(addr); return(dummy->write(val)); } return(array[addr]->write(val));}voidcl_m::set(t_addr addr, t_mem val){ if (addr >= size) { err_inv_addr(addr); //addr&= bus_mask; dummy->set(val); return; } //addr&= bus_mask; array[addr]->set(val);}class cl_cell *cl_m::get_cell(t_addr addr){ //addr&= bus_mask; if (addr >= size) { err_inv_addr(addr); return(dummy); } return(array[addr]);}/* Set or clear bits, without callbacks */voidcl_m::set_bit1(t_addr addr, t_mem bits){ class cl_cell *cell; addr&= bus_mask; if (addr >= size) { err_inv_addr(addr); cell= dummy; } else cell= array[addr]; bits&= cell->get_mask(); cell->set(cell->get() | bits);}voidcl_m::write_bit1(t_addr addr, t_mem bits){ class cl_cell *cell; addr&= bus_mask; if (addr >= size) { err_inv_addr(addr); cell= dummy; } else cell= array[addr]; bits&= cell->get_mask(); cell->write(cell->get() | bits);}voidcl_m::set_bit0(t_addr addr, t_mem bits){ class cl_cell *cell; addr&= bus_mask; if (addr >= size) { err_inv_addr(addr); cell= dummy; } else cell= array[addr]; bits&= cell->get_mask(); cell->set(cell->get() & ~bits);}voidcl_m::write_bit0(t_addr addr, t_mem bits){ class cl_cell *cell;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -