Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: Jos'b en 09 de Septiembre de 2013, 09:13:44 pm



Título: Como Hacer un megarom en C (esto no es una pregunta)
Publicado por: Jos'b en 09 de Septiembre de 2013, 09:13:44 pm
Con el beneplácito de la  afición me permito dar unas breves indicaciones para que el quiera y le apetezca pueda hacer una megarom con el SDCC.

El motivo de abrir este hilo es que yo no he encontrado informacion al respecto más allá del mini tutorial que en su día hizo Nerlaska para hacer ROMs de 32 kb, y como complemento al mismo (siempre que tenga su permiso, of course), me permito compartir lo poco que he podido descubrir por mis propios haberes y saberes.

En primer lugar he creado un fichero .sh (el equivalente a los .bat del DOS pero en Linux) con el siguiente contenido

Código:
#!/bin/sh -e

#
# ...compiler at last (take note about '--data-loc' must be changed for each subpage)
#
echo "--------------------------------------------------------------"
echo "Compiling C file"
echo "--------------------------------------------------------------"
sdcc -mz80 --no-std-crt0 --code-loc 0x4010 --data-loc 0xC000 main.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage03.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage04.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage05.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage06.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage07.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage08.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage09.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage10.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage11.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage12.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage13.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage14.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage15.c

echo " "
echo "* Building MEGAROM 128K"
echo "-------------------------------------------------------------"
echo "** running hex2bin"
./Hex2bin.exe -e bin main.ihx
./Hex2bin.exe -e bin subpage03.ihx
./Hex2bin.exe -e bin subpage04.ihx
./Hex2bin.exe -e bin subpage05.ihx
./Hex2bin.exe -e bin subpage06.ihx
./Hex2bin.exe -e bin subpage07.ihx
./Hex2bin.exe -e bin subpage08.ihx
./Hex2bin.exe -e bin subpage09.ihx
./Hex2bin.exe -e bin subpage10.ihx
./Hex2bin.exe -e bin subpage11.ihx
./Hex2bin.exe -e bin subpage12.ihx
./Hex2bin.exe -e bin subpage13.ihx
./Hex2bin.exe -e bin subpage14.ihx
./Hex2bin.exe -e bin subpage15.ihx

echo "-------------------------------------------------------------"
echo "** adding header..."
echo "-------------------------------------------------------------"
cat rom_header.b > megarom.rom
cat main.bin >> megarom.rom
echo "-------------------------------------------------------------"
echo "** running fillfile with main module"
echo "-------------------------------------------------------------"
./FillFile.exe megarom.rom 24576

echo "-------------------------------------------------------------"
echo "** running fillfile with subpages"
echo "-------------------------------------------------------------"
./FillFile.exe subpage03.bin 8192
./FillFile.exe subpage04.bin 8192
./FillFile.exe subpage05.bin 8192
./FillFile.exe subpage06.bin 8192
./FillFile.exe subpage07.bin 8192
./FillFile.exe subpage08.bin 8192
./FillFile.exe subpage09.bin 8192
./FillFile.exe subpage10.bin 8192
./FillFile.exe subpage11.bin 8192
./FillFile.exe subpage12.bin 8192
./FillFile.exe subpage13.bin 8192
./FillFile.exe subpage14.bin 8192
./FillFile.exe subpage15.bin 8192

echo "-------------------------------------------------------------"
echo "** creating ASCII8 MEGAROM at last"
echo "-------------------------------------------------------------"
cat subpage03.bin >> megarom.rom
cat subpage04.bin >> megarom.rom
cat subpage05.bin >> megarom.rom
cat subpage06.bin >> megarom.rom
cat subpage07.bin >> megarom.rom
cat subpage08.bin >> megarom.rom
cat subpage09.bin >> megarom.rom
cat subpage10.bin >> megarom.rom
cat subpage11.bin >> megarom.rom
cat subpage12.bin >> megarom.rom
cat subpage13.bin >> megarom.rom
cat subpage14.bin >> megarom.rom
cat subpage15.bin >> megarom.rom
echo " "
echo "... Job was finished"
echo " "

El código compila cada bloque por separado, el primero de todos es de 24 kb (8 kb x 3), y el resto son de 8 kb que se ensamblan en la dirección A000h, pero que nada impide hacerlo en otra, y donde la idea es incluir datos (no código), aunque al igual que antes tampoco hay impedimento para usar código siempre que se sepa a que dirección hay que llamar. Luego pasa del formato .ihx al binario y se termina de rellenar con basura hasta los 8kb para finalmente concatenar todos los archivos que generan la megarom final

lo siguiente que he hecho es cambiar la línea que Nerlaska añadió para detectar los 32 kb

g_slotPort = (g_slotPort & 0xCF) | ((g_slotPort & 0x0C) << 2);   

por una llamada a la siguiente función, que fue PLAGIADA directamente del ASMSX, el motivo principal es que no pierdo el contacto con la máquina, pasando además de las opciones del compilador

Código:
void search(void)
{
    /* ensambla pagina 2 para ROM y MEGAROM que arrancan en la página 1 */
    /* solo hay que llamarla una vez */
    /* PLAGIADO del asmsx */

    _asm
        call 0x0138 ;RSLREG
        rrca
        rrca
        and #0x03
        ; Secondary Slot
        ld c,a
        ld hl,#0x0FCC1
        add a,l
        ld l,a
        ld a,(hl)
        and #0x80
        or c
        ld c,a
        inc l
        inc l
        inc l
        inc l
        ld a,(hl)
        ; Define slot ID
        and #0x0C
        or c
        ld h,#0x80
        ; Enable
        call 0x0024 ;ENASLT
    _endasm;
}

y por último me hice con una funcion para la seleccion de los bancos, tal como la que sigue, donde subpage indica la subpagina de la megarom (que como todos ya sabeis va de la 0 a la 15 en Megaroms de 128 kb)

Código:
void select(unsigned char subpage, int adress)

{

    /*

        Es importante saber que las MEGAROM usan solo las 32 kb intermedias, por tanto en el formato ASCII8

        el banco 0 = 0x4000 (8kb)

        el banco 1 = 0x6000 (8kb)

        el banco 2 = 0x8000    (8kb)

        el banco 3 = 0xA000    (8kb)

    */



    subpage=subpage;

   

    if (adress==0xA000) {       

        _asm

        ld a,4(ix)

        ld (0x7800),a

        _endasm;

    } else if (adress==0x8000) {

        _asm

        ld a, 4(ix)

        ld (0x7000),a

        _endasm;

    } else if (adress==0x6000) {

        _asm

        ld a, 4(ix)

        ld (0x6800),a

        _endasm;

    } else if (adress==0x4000) {

        _asm

        ld a, 4(ix)

        ld (0x6000),a

        _endasm;

    }

}


voila!!,

tenemos una megarom de 128 kb en formato ASCII8kb

Por supuesto admito críticas y mejoras, (hasta aclaraciones)

La idea es simplemente mostrar que es muy sencillo hacer una megarom en C, a pesar de que con el AsMSX es incluso mas sencillo, pero siempre es bonito que haya variedad.


Título: Re: Como Hacer un megarom en C (esto no es una pregunta)
Publicado por: aorante en 15 de Septiembre de 2013, 07:29:01 pm
Que bien!  :o

Muchas gracias, Jos'b!!! :D

Es un tema que tenia pendiente y que me interesaba bastante.

Por mi parte , quiero publicar esta semana un pequeño tutorial para compilar ROMs (de 16, 32k) sin la necesidad de aplicaciones externas al SDCC y al hex2bin. He tenido que hacer unas startups (CRTs) ya que la que conseguí a través de la WEB de Avelino Herrera (http://msx.atlantes.org/index_es.html) no acaba de funcionar bien...

Saludos!


Título: Re: Como Hacer un megarom en C (esto no es una pregunta)
Publicado por: aorante en 16 de Septiembre de 2013, 11:21:01 am
He mirado con más detalle tu tutorial y he visto un punto de mejora:

En el script utilizas el comando Fillfile para rellenar los ficheros, pero ahora lo puedes hacer directamente desde la versión 1.0.10 del hex2bin (http://hex2bin.sourceforge.net/) con el comando -l, con lo que te ahorras eso.

Un ejemplo:
./Hex2bin.exe -e bin -l 2000 subpage13.ihx

No hagas caso de esto. Estoy teniendo problemas en algunos casos.  :P

Saludos!


Título: Re: Como Hacer un megarom en C (esto no es una pregunta)
Publicado por: Jos'b en 16 de Septiembre de 2013, 08:53:03 pm
Un ejemplo:
./Hex2bin.exe -e bin -l 2000 subpage13.ihx

No hagas caso de esto. Estoy teniendo problemas en algunos casos.  :P
no suelo estar muy al día (por eso soy usuario de MSX  :P), y como funcionaba bien nunca me he molestado en saber si había otras versiones.

Por mi parte , quiero publicar esta semana un pequeño tutorial para compilar ROMs (de 16, 32k) sin la necesidad de aplicaciones externas al SDCC y al hex2bin. He tenido que hacer unas startups (CRTs) ya que la que conseguí a través de la WEB de Avelino Herrera (http://msx.atlantes.org/index_es.html) no acaba de funcionar bien...
Pues sería un detalle ya que yo no he encontrado mucha información (o no la he sabido buscar), y la que he encontrado estaba muy dispersa.

Creo que el tema C para MSX está muy verde (ni siquiera existe una minilibrería para imprimir un sprite en pantalla) tal vez por la tendencia de programar en ASM como herramienta más optima, pero aún así, el C puede dar mucho de sí y se pueden hacer cosas muy dignas.




Título: Re:Como Hacer un megarom en C (esto no es una pregunta)
Publicado por: AxelStone en 26 de Enero de 2016, 01:00:05 pm
Ostras pues me parece un tema tela de interesante. Yo mismo soy uno de esos locos que está con el MSX-C, también le veo grandes posibilidades, creo por ejemplo que un motor Scumm es mucho más viable en MSX-C que en ASM.

El caso es que yo estoy desarrollando en el MSX-C nativo, gracias al soporte de las librerías MSX-C library de ASCII que son muy completas. En el SDCC se hecha de menos este conjunto de librerías, de ahí que no lo use, por eso pregunto: ¿este tutorial cómo puede extenderse para usarse en MSX-C?

Gracias!


Título: Re:Como Hacer un megarom en C (esto no es una pregunta)
Publicado por: Jos'b en 26 de Enero de 2016, 04:45:46 pm
Hola Alextone,

hace tiempo que no hago nada en C para el MSX, y la última actualización que hice del SDCC no me gustó nada la forma de incluir código en asm. Asi que me he vuelto a pasar al ensamblador :D, a ver si me animo y me da por programar algo. De momento solo estoy recopilando info y recursos para tener un entorno de trabajo cómodo.

En mi opinión el C ofrece tiempos de desarrollo mucho más cortos (a costa de perder eficiencia, obviamente) y además ofrece la posibilidad de generar lógica más compleja sin volverte loco buscando errores. Hacer lo mismo en asm requiere mucha experiencia y talento:).

Y respecto a si las indicaciones que su día hice (hace casi tres años, uff como pasa el tiempo), supongo que es extensible a cualquier compilador, pues básicamente tienes que compilar las diferentes paginas en la misma dirección, juntarlas en un mismo archivo y la selección de subpaginas se hace desde código. Para esto, curiosamente, pienso que es más util trabajar en ensamblador.

De todas formas tampoco he trabajado en MSX-C, me he limitado a usar SDCC y BDS-C (mi compilador favorito para MSX que pese a lo que digan por ahí es el mejor que existe XD)


Título: Re:Como Hacer un megarom en C (esto no es una pregunta)
Publicado por: pitpan en 28 de Enero de 2016, 08:29:26 pm
Así me gusta, Jos'b, volviendo al buen camino: ensamblador, ensamblador y ensamblador.

Bromas y proselitismos aparte, me encanta el C aunque reconozco que no lo he usado nunca para desarrollar código para MSX. Por otra parte, algo de C sí que sé, ya que el asMSX, las distintas versiones del WAVeR, PCX2MSX y un buen montón de otras herramientas de apoyo las he programado en C.

Mi impresión es que, por ejemplo, para hacer algo para MSX-DOS que tenga que ver con consola, manejo de ficheros, etc. es inigualable. Hacer algo así en ensamblador es un infierno: abrir un fichero, escribir, etc. se vuelven tarear complejas y tediosas. Para manejar estructuras de datos complejas, está claro que el C es muchísimo más práctico.

Por otra parte, sin embargo, el acceso al hardware se complica un poco. Recordad siempre que el principal cuello de botella del MSX es el acceso a la VRAM mediante puertos. Programas intensivos en actualización gráfica requieren de mucha optimización y algoritmos pensados para ello. Esta parte es la que me parece que en C tiene que ser más difícil de resolver. En cualquier caso, seguro que el compilador de C lo hace mejor que un novato total en ensamblador, si bien es verdad que también estoy convencido de que un buen programador en ensamblador se merienda al C en casi cualquier nivel, aunque es verdad que los tiempos de desarrollo ni se parecen.

En cualquier caso, me alegra saber que hay gente entrando en el desarrollo "serio". E insisto aquí en que tanto el C, como el ensamblador como incluso el Pascal me parecen lenguajes "serios" de desarrollo para MSX. Por otra parte, reconozco que el BASIC me parece algo más pensado para la didáctica que para la producción, y tengo mis reservas hacia los BASICs compilados, aunque hay quien ha hecho maravillas con ellos.


Título: Re:Como Hacer un megarom en C (esto no es una pregunta)
Publicado por: Jos'b en 29 de Enero de 2016, 04:14:15 pm
Así me gusta, Jos'b, volviendo al buen camino: ensamblador, ensamblador y ensamblador.
No solo he vuelto al ensamblador, sino he vuelto al asMSX. Soy un clásico  :magicalstones: 


Título: Re:Como Hacer un megarom en C (esto no es una pregunta)
Publicado por: pitpan en 31 de Enero de 2016, 04:39:15 pm
Jajajaja! A tope!


Título: Re:Como Hacer un megarom en C (esto no es una pregunta)
Publicado por: AxelStone en 19 de Febrero de 2016, 08:37:07 am
Mi impresión es que, por ejemplo, para hacer algo para MSX-DOS que tenga que ver con consola, manejo de ficheros, etc. es inigualable. Hacer algo así en ensamblador es un infierno: abrir un fichero, escribir, etc. se vuelven tarear complejas y tediosas. Para manejar estructuras de datos complejas, está claro que el C es muchísimo más práctico.

En cualquier caso, me alegra saber que hay gente entrando en el desarrollo "serio". E insisto aquí en que tanto el C, como el ensamblador como incluso el Pascal me parecen lenguajes "serios" de desarrollo para MSX. Por otra parte, reconozco que el BASIC me parece algo más pensado para la didáctica que para la producción, y tengo mis reservas hacia los BASICs compilados, aunque hay quien ha hecho maravillas con ellos.

Como digo yo veo un ScummMSX realizable en MSX-C, pero no en ensamblador, así que supongo que depende el juego que quieras hacer es mejor un lenguaje u otro  :).

Sobre Basic es como todo, si estás cómodo con él mejor usarlo que perderte en rutinas ASM. Yo personalmente lo abandoné en mi intento de convertir G&G para MSX2, la memoria me mataba, por el resto no tuve demasiadas quejas (funciona bien y es rápido).

Gracias por la aclaración JosB.