Dudas sobre el codigo fuente

Moderadores: Kravenbcn, largeroliker, fidelcastro, cerealkiller, pspCaracas, dark_sasuke, m0skit0, LnD, ka69, zacky06

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: Dudas sobre el codigo fuente

Mensaje por m0skit0 »

yosoy_bostero escribió:antes que nada le pido a los que estan codificando que utilicen por favor mas comentarios y/o explicaciones.

Cierto, pero es que estamos ansiosos por hacer que funcione algo :lol: No es una excusa, igualmente esta tarde pondré las reglas para los comentarios para poder generar documentación posteriormente con Doxygen.

yosoy_bostero escribió:Primero que nada si me pueden explicar por arriba el funcionamiento que estan queriendo implementar con la memoria ram y todas esas clases, controladores y demas. (es decir, cual es la idea basica)

La CPU manda las órdenes de acceso (lectura/escritura de datos) al controlador de memoria, que es el que se encarga de mandar la orden al dispositivo que corresponda, ya que dependiendo de la dirección de memoria a la que se pretende acceder se tiene que mandar la orden a un dispositivo u a otro diferente.

yosoy_bostero escribió:A que se refieren con Mapear? se lo que es una memoria, pero que quieren implementar al "mapear" ?

Mapear significa cambiar de dirección. Ten en cuenta que la CPU intentará acceder a direcciones específicas de la PSP, que no tienen sentido para un PC y un emulador. Por tanto estas direcciones hay que traducirlas a direcciones que nuestro emulador entienda y pueda manejar. Es decir, mapear es asignar direcciones de memoria de PC para las direcciones de memoria de PSP.

yosoy_bostero escribió:Una consulta mas de C, que funcion cumplen los 2 puntos (:)
struct {
unsigned : 6;
unsigned rS : 5;
unsigned rT : 5;
unsigned rD : 5;
unsigned sa : 5;
unsigned func: 6;

En codigo como este?

Mírate la estructura union en cualquier manual de C.

yosoy_bostero escribió:Me podran explicar esta linea? " static tError (cAllegrex::* InstruccionesOpcode[64])();"

Vector estático de punteros a métodos (C/C++ acepta punteros a funciones/métodos). Esto hace que usando el opcode de la instrucción como índice se llame directamente al método que lo decodifica, en vez de tener que hacer un switch y luego llamar al método.

yosoy_bostero escribió:Que vendria a ser InstruccionesOpcode?

Código: Seleccionar todo

static tError (cAllegrex::* InstruccionesOpcode[64])();

Un vector estático de punteros a métodos. No entiendo por qué preguntas 2 veces lo mismo :lol:

yosoy_bostero escribió:a veces para uno (inexperto) interpretar a partir del codigo puro es medio complicado

En realidad lo que te falla es más conocimiento sobre arquitectura de PSP y procesadores MIPS. Revisa la documentación sobre este tema, sobre todo los manuales del procesador (que es lo que más estamos tocando ahora mismo).

Un saludo y animo a todos que pregunten lo que no entiendan.
Imagen

yosoy_bostero
Enteradillo
Enteradillo
Mensajes: 43
Registrado: 12 Ene 2011, 16:55

Re: Dudas sobre el codigo fuente

Mensaje por yosoy_bostero »

m0skit0 escribió:
La CPU manda las órdenes de acceso (lectura/escritura de datos) al controlador de memoria, que es el que se encarga de mandar la orden al dispositivo que corresponda, ya que dependiendo de la dirección de memoria a la que se pretende acceder se tiene que mandar la orden a un dispositivo u a otro diferente.


al dispositivo que corresponda? no actua sobre la ram, digamos en diferentes direcciones pero al fin y al cabo no es la ram pura? no me queda claro ese funcionamiento




yosoy_bostero escribió:Una consulta mas de C, que funcion cumplen los 2 puntos (:)
struct {
unsigned : 6;
unsigned rS : 5;
unsigned rT : 5;
unsigned rD : 5;
unsigned sa : 5;
unsigned func: 6;

En codigo como este?


revise lo de union, mas que nada lo de campos de bits, solo 2 consultas, lo que hace eso entonces es limitar la cantidad de bits que se utilizan para una variable en particular verdad? unsigned a secas es 1 byte? (no encuentro en ningun lado el unsigned a secas) ahh casi me olvido donde no asignaste variable "unsigned : 6 ; " que pasa ahi? entiendo que sera un espacio de 6bits que no se utilizara pero.. como es que funciona esa asignacion?

yosoy_bostero escribió:Me podran explicar esta linea? " static tError (cAllegrex::* InstruccionesOpcode[64])();"



yosoy_bostero escribió:Que vendria a ser InstruccionesOpcode?

Código: Seleccionar todo

static tError (cAllegrex::* InstruccionesOpcode[64])();


no veia donde estaba declarado "instruccionesOpcode" o se puede asignar directamente sin declarar?

lo del indexado estamos de acuerdo, ahora alguien me puede explicar la linea ?:

Código: Seleccionar todo

static tError (cAllegrex::* InstruccionesOpcode[64])();


no la logro comprender con esos () al final


muchas gracias.. seguire intentando leer todo

EDITO: segui leyendo puede ser que eso devuelva el metodo de la instruccion nro63 ? ya que deuvelve el contendio de la posicion 64 del vector de metodos de instrucciones. algo asi? o me equivoco?

davidgf
Desarrollador
Desarrollador
Mensajes: 65
Registrado: 26 Feb 2010, 23:53

Re: Dudas sobre el codigo fuente

Mensaje por davidgf »

Lo de los punteros a función es un poco más complicado que en C99, ya que en este caso es función miembro de una clase. Eso en que nos atañe? Pues en que una función mimbro se llama de la forma objeto.metodo(). Eso en C99 no se puede hacer (no hay clases) pero dado que C y C++ son en realidad lo mismo el compilador hace una trampa y es que elk objeto pasa a ser un parametro realmente. Por ejemplo:

Código: Seleccionar todo

class Obj1;
class Obj2;

Obj1 o1;
Obj2 o2;

o1.metodoA(bla);
o2.metodoB(bla);


Su equivalente en C seria:

Código: Seleccionar todo

metodoA_Obj1(o1,bla);
metodoB_Obj2(o2,bla);

Es por ello que en Ingeniería de Soft. se le llama parámetro implícito (o algo así, no atiendo mucho en clase xD).
Así que ya sabes, los punteros a funcion miembro no son punteros a funciones (no ocupan 4 bytes!) son algo más.

Mira: http://www.parashift.com/c++-faq-lite/pointers-to-members.html
En especial:

In C++, member functions have an implicit parameter which points to the object (the this pointer inside the member function). Normal C functions can be thought of as having a different calling convention from member functions, so the types of their pointers (pointer-to-member-function vs. pointer-to-function) are different and incompatible. C++ introduces a new type of pointer, called a pointer-to-member, which can be invoked only by providing an object.


Pero eso es lo de menos, yo me preocuparía más por las decisiones del emulador en si y no del lenguaje!

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: Dudas sobre el codigo fuente

Mensaje por m0skit0 »

yosoy_bostero escribió:al dispositivo que corresponda? no actua sobre la ram, digamos en diferentes direcciones pero al fin y al cabo no es la ram pura? no me queda claro ese funcionamiento

Repito :tongue: es E/S mapeada en memoria: http://en.wikipedia.org/wiki/Memory_mapped_IO

yosoy_bostero escribió:revise lo de union, mas que nada lo de campos de bits, solo 2 consultas, lo que hace eso entonces es limitar la cantidad de bits que se utilizan para una variable en particular verdad? unsigned a secas es 1 byte? (no encuentro en ningun lado el unsigned a secas) ahh casi me olvido donde no asignaste variable "unsigned : 6 ; " que pasa ahi? entiendo que sera un espacio de 6bits que no se utilizara pero.. como es que funciona esa asignacion?

Se ignoran. Igualmente ya han sido asignados al opcode (unsigned opcode: 6)

yosoy_bostero escribió:no veia donde estaba declarado "instruccionesOpcode" o se puede asignar directamente sin declarar?

Ésa es la declaración :lol:

yosoy_bostero escribió:segui leyendo puede ser que eso devuelva el metodo de la instruccion nro63 ? ya que deuvelve el contendio de la posicion 64 del vector de metodos de instrucciones. algo asi? o me equivoco?

No hombre, es un vector de 64 punteros a función. Ahí se almacena el puntero al método que descodifica la instrucción cuyo opcode corresponde con el índice del vector:

Código: Seleccionar todo

cAllegrex::cAllegrex()
{
   controlador_memoria = NULL;

   InstruccionesOpcode = {
   &cAllegrex::decodificarInstTipoR,      // 0x00
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstTipoJ,
   &cAllegrex::decodificarInstTipoJAL,
   &cAllegrex::decodificarInstTipoBEQ,
   &cAllegrex::decodificarInstTipoBNE,
   &cAllegrex::decodificarInstTipoBLEZ,
   &cAllegrex::decodificarInstTipoBGTZ,
   &cAllegrex::decodificarInstTipoAddI,
   &cAllegrex::decodificarInstTipoAddIU,
   &cAllegrex::decodificarInstTipoSLTI,
   &cAllegrex::decodificarInstTipoSLTIU,
   &cAllegrex::decodificarInstTipoAndI,
   &cAllegrex::decodificarInstTipoOrI,
   &cAllegrex::decodificarInstTipoXorI,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstTipoCP,    // 0x10
   &cAllegrex::decodificarInstTipoCP,
   &cAllegrex::decodificarInstTipoCP,
   &cAllegrex::decodificarInstTipoCP,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstTipoLB,     // 0x20
   &cAllegrex::decodificarInstTipoLH,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstTipoLW,
   &cAllegrex::decodificarInstTipoLBU,
   &cAllegrex::decodificarInstTipoLHU,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstTipoSB,
   &cAllegrex::decodificarInstTipoSH,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstTipoSW,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,   // 0x30
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida,
   &cAllegrex::decodificarInstNoValida
   };
}

Aquí se rellena el vector con los punteros a función correspondientes (o a método para ser más correctos). En posicion 0 se rellena el método correspondiente al opcode 0x00, en el 1 el del opcode 0x01, etc...

Código: Seleccionar todo

tError cAllegrex::decodificar(void)
{
   tError ret = ERR_OK;

   ret = (this->*InstruccionesOpcode[regRi[0].opcode])();

   return ret;
}

Aquí se llama al método que corresponde al opcode.
Imagen

yosoy_bostero
Enteradillo
Enteradillo
Mensajes: 43
Registrado: 12 Ene 2011, 16:55

Re: Dudas sobre el codigo fuente

Mensaje por yosoy_bostero »

siguiendo con mis preguntas.. lei lo de las uniones, ahora el unsigned : 6; hace algo? es decir "reserva" esos 6 bits? porque segun lei en las uniones los tipos diferentes de datos no conviven al mismo tiempo, lo que se me ocurre que esta sucediendo es que ese unsigned : 6; reserva los primeros 6 bits para que luego los demas registros usen los siguientes (hasta llegar al 31), y que al estar el opcode : 6 arriba esos 6 bits persistan pese a cambiar el tipo de estructura (tipo de instruccion en este caso) voy bien? es asi?

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: Dudas sobre el codigo fuente

Mensaje por m0skit0 »

Dado que el union debe especificar todos los bits, y esos 6 no nos interesan puesto que ya están mapeados al opcode, se ponen para que se ignoren.

Ej: 0x12345678 -> 0001 0010 0011 0100 0101 0110 0111 1000 -> ignoramos los 6 bits más altos: 10 0011 0100 0101 0110 0111 1000 -> los restantes miembros del union actúan sobre estos bits.

Espero que esto te lo haya aclarado, porque sino la verdad ya no sé cómo explicarlo :tongue:

De todas formas ese struct anidado no es muy estándar que digamos.
Imagen

yosoy_bostero
Enteradillo
Enteradillo
Mensajes: 43
Registrado: 12 Ene 2011, 16:55

Re: Dudas sobre el codigo fuente

Mensaje por yosoy_bostero »

exacto! era lo que pensaba se ponen para ignorar la parte del opcode ya que sino pisaria los primeros bits del struct, genial lo entendi ahora!

respecto a static tError (cAllegrex::* InstruccionesOpcode[64])();

lo voy agarrando, para el que le interese : http://www.zator.com/Cpp/E4_2_1g.htm

es un vector de 64 posiciones de punteros a miembros (metodos en este caso) de la clase cAllegrex que no reciben parametros pero devuelven un tError,

si me explicas por que lo de static la completamos ;)

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: Dudas sobre el codigo fuente

Mensaje por m0skit0 »

static indica que sólo puede haber una instancia de dicho miembro para todos los objetos de dicha clase. La verdad no le veo mucho sentido aquí, pero weno, es código de davidgf, a ver si nos lo aclara él :)
Imagen

yosoy_bostero
Enteradillo
Enteradillo
Mensajes: 43
Registrado: 12 Ene 2011, 16:55

Re: Dudas sobre el codigo fuente

Mensaje por yosoy_bostero »

bueno la parte del micro y las instrucciones mas o menos va queriendo, ahora voy por intentar entender bien el funcionamiento de la memoria, seguire molestando, eso si por favor cuantos mas comentarios y "por que's" agreguen sera genial.

-- Doble Post --

bueno perdon por el doble post,

estoy leyendo la parte de la memoria pero no logro comprenderla del todo, (sigo el diagrama de m0skit0 en la pagina 6 de diseño)
me podran tirar quienes la codificaron la funcion (idea) principal de cada clase como para poder entender mejor y a fondo

# cBloque
# cControladorMemoria
# cMapeoDireccion
# cMapeoDireccionamiento
# cMemOrden
# cMemoria

soulless
Desarrollador
Desarrollador
Mensajes: 64
Registrado: 23 Oct 2009, 07:56

Re: Dudas sobre el codigo fuente

Mensaje por soulless »

Intento compilar y me tira error en la linea 19 de cAllegrex.cpp (esa es la linea donde se asignan los valores al vector InstruccionesOpcode), a lo que viene mi pregunta, es esa forma de asignar valores, a un vector, estandar??? siempre he creido/visto que solo puedes asignar los valores a un vector con = { ...} solo en la declaracion.

PD: Pregunto lo de si esa asignacion es estandar porque no tengo a mano ningun linux en este instante y estoy compilando en mac os x (segun tiene GCC 4.2 pero no se como anden los de apple con asuntos de estandares).
"Quiero irme cuando quiero. Es de mal gusto prolongar artificialmente la vida. He hecho mi parte, es hora de irse. Yo lo haré con elegancia." -Albert Einstein.-

Responder