[OTRAS]PSX cargador

Desde hace tiempo existe la posibilidad de contruir un interface para puerto paralelo que permite leer y escribir tarjetas de memoria de psx via puerto paralelo, y gracias a un programa en DOS, windows y linux.
Me preguntaba, que quizas se podría hacer un cargador de ejecutables en psx (psone) via la tarjeta de memoria.
La tarjeta tenía limitaciones, como que era de bloques, que cada archivo tenía que ser múltiplo de 128 bytes, y que es lenta de narices (10 KB/s). Pero esto nos permitiría programar la psx como método alternativo al cable skywalker hitserial y similares, metiendo datos del pc a la memoria, y luego leyendo la memoria desde la psx.
Se podría hacer un minicargador que leyera bloques fragmentados del exe y los fuera metiendo en memoria, incluso que pudiera leer de varias tarjetas, y las juntara.
La pregunta radica, en como se podría hacer el cargador, bastaría con meter el exe byte por byte en memoria y dar el salto al comienzo de exe?
Gracias nuvalo por la info.
En la docu del psyq existen funciones para lanzar exe's:
struct EXEC {
unsigned long pc0; Execution start address
unsigned long gp0; gp register initial value
unsigned long t_addr; Starting address of initialized text section
unsigned long t_size; Size of text section
unsigned long d_addr; Starting address of initialized data section
unsigned long d_size; Size of initialized data section
unsigned long b_addr; Uninitialized data section start address
unsigned long b_size; Uninitialized data section size
unsigned long s_addr; Stack start address (specified by the user)
unsigned long s_size; Stack size (specified by the user)
unsigned long sp; Register shunt variable
unsigned long fp; Register shunt variable
unsigned long gp; Register shunt variable
unsigned long ret; Register shunt variable
unsigned long base; Register shunt variable
};

long Exec(
struct EXEC *exec, //Pointer to execution file information
long argc, //Number of arguments
char *argv) // Pointer to argument

Segun dice se necesita llamar previamente a Call _96_init()
Los EXE's generalmente empiezan en la zona de memoria 0x80010000, y la RAM empieza en la 0x80000000, asi que tenemos 64 KB para el sistema, que sería peligroso coger. Asi que podriamos cargar el programa al final de la RAM, es decir, cerca de los 2 MB. La rutina del serial hitmen, estaba en la zona 801e0000, lo que dejaba cargar EXE's de 1900544 bytes, y la rutina debia ocupar menos de 64 KB's.
Primero probaré con programillas sencillos y muy pequeños, como por ejemplo que reseteen la consola si pulsas un boton del pad, que a su vez ese EXE está dentro de otro EXE en un array, y lo lanzo. Si tira, podré realizar el proyecto más ambicioso de cargar de la memoria.
No obstante, la memoria de la psone es de 128 KB's. Puede sonar a chiste, pero para una intro vale. [sonrisa]
Pero si cojemos una tarjeta con conmutador de 4 Mb o 16 Mb, nos da para mucho más.
El interface para el puerto paralelo que permite leer y escribir en las tarjetas se puede encontrar aqui:
http://www.picsystems.net/playsaver.htm
nuvalo escribió:¿Tienes el psyq?

Si, el compilador está muy bien, y por lo menos deja hacer de todo. Otra cosa es que yo sepa hacer todo lo que deja el compilador, porque la verdad, me queda grande. [jaja] [jaja]
He creado un programilla en la posición 0x80010000 que muestra un texto de que es el segundo programa. Lo he pasado a hexdecimal y metido en un array llamado main2, y luego he creado otro en la posición 0x8005F800, con el siguiente código:

void CargaPrograma(struct EXEC *exep){
char hbuf[H_SIZE]; // Buffer for EXE head
struct XF_HDR *head;
memcpy (hbuf, main2,H_SIZE);
head = (struct XF_HDR *)hbuf;
memcpy((void *)exep, (void *)&head->exec, sizeof(struct EXEC));
memcpy((void *)exep->t_addr,&main2[H_SIZE],exep->t_size);
}

Y luego llamo así:
CargaPrograma(&exe);
Exec(&exe,1,0);

Y lo único que he conseguido es que se resetee la consola. Asi que por ahora va mal la cosa. [lapota]
nuvalo escribió:PD, gracias por el enlace

No hay de que.

Pues parece que he conseguido que me tire, al menos en el emulador. Asi que ya he conseguido un 70% de la aplicación, ahora queda el 30% restante, o sea, todo. [qmparto]
Después de depurar todo el programilla, para poder ver si apuntaba bien el exe.t_addr, que me daba 0xFFFFFFFF80010000 y el exe.t_size, que da el tamaño del exe menos los 2048 bytes de la cabecera y demás chorradas, me dió por mirar, que no mandé apagar el sistema de video ni pad ni demás cosas de secciones criticas, lo que causaba que se reseteara. Asi que, una vez solucionado, consigo cargar el EXE en la posición de memoria 0x80010000.
Si alguien prueba, que se acuerde de colocar el primer programa fuera del intervalo de memoria del segundo, como hice yo.
Ahora queda la rutina que va cogiendo datos de la memcard y los va metiendo a la zona de memoria de donde se quiera ejecutar el EXE.
Donde perderé un poco de tiempo será en hacer el programa que genere un archivo de tipo MEMCARD troceado con el EXE (haré una tool para PC) para poder grabarlo. Aunque siempre podría hacer un programa (en psone) que coja un EXE de un buffer y lo vaya troceando y metiendo en la tarjeta de memoria. Ese programa lo ejecuto en el emulador y automáticamente me genera la memcard pertinente. Las opciones son múltiples, pero el resultado es el mismo. X-D

Es verdad, en el primer mensaje hablaba de que existía software bajo windows para pasar las tarjetas. Aqui dejo el enlace:
http://sstrans.emuxhaven.net/mccs.php
El circuito se diferencia de los anteriores, en que la alimentación de la tarjeta la saca del puerto paralelo (5V) que le pone un diodo para reducir voltaje.
Al final, voy a hacer un programa en la propia psone que transfiera el exe a las tarjetas de memoria (pedirá que metas una detras de otra) para crearlas en el emulata o en la máquina real. Haré una tool que meta el EXE dentro del EXE principal, como si de un ARRAY se tratara. Va a ser más fácil que crear el archivo directamente.
Ya consigo grabar en tarjeta de memoria, desde programa en psone. Le he puesto un icono provisional animado, que luego cambiaré.
Asi que cada vez estoy mas cerca, ya que sólo queda juntar todo. Tengo que añadir una compresión del EXE, ya que asi entrará más en la tarjeta, y por lo que puedo comprobar, la compresión ZIP ronda entre el 50% y 75%, asi que interesa bastante.
5 respuestas