Karoshi MSX Community
05 de Julio de 2021, 07:54:55 pm *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1] 2 3 ... 5
  Imprimir  
Autor Tema: Sobre C en MSX  (Leído 35026 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Jos'b
Karoshi Maniac
****
Mensajes: 262


« : 19 de Abril de 2008, 07:42:01 pm »

Despues de la fantastica adquisición LPE-MMC de Padial, estoy intentando hacerme con un leguanje C para MSX, con el que poder "pegosear" en momentos de ocio.

Actualmente tengo dos, el BDS-C y el ASCII MSX-C.

1/ Respecto al primero. Que se puede encontrar aquí:

http://www.bdsoft.com/resources/bdsc.html

Me funciona "casi" perfectamente. Todo va bien salvo cuando intento acceder a la Bios a traves de sus propias funciones, o cuando intento llamar a pequeñas rutinas en ensamblador.

2/ Visto el tiempo que llevo fracasando con el BDS-C, he decidido por fin hacerme con el ASCII MSX-C, que se puede encontrar en este otro sitio

http://msx.retro8bits.com/msxsw.html

Sin embargo, despues de tener todo preparado (incluido el ensamblador MASM), no consigo que el "generador de código", archivo "cg.com", haga su trabajo. Siempre me lanza el mensaje de error "ilegal .tco file at 0:1".

3/ Por lo que como no soy capaz de conseguir que la cosa funcione como quiero me gustaría saber si me podeis echar una mano con la siguiente información:

3.1 / Primero me gustaría saber si el siguiente programa es válido para llamar a una rutina en ensamblador y que ésta funcione. Me refiero evidentemente, ya que el código se compila bien, a algún detalle que se me pueda estar pasando en la llamada al código objeto, o al propio código objeto en sí.

Código:
/*
CLS.COM -- Código para BDS-C
El objetivo de este programa es saber si se puede incluir codigo
objeto en un array y llamarlo a traves de call pasando como valor
el puntero del primer valor de la tabla.
*/

#include <bdscio.h>

char *cls; /* Tambien se puede hacer "char cls[5];" */     


main(argc,argv)
int argc;
char *argv[];
{
init();
call(*cls,0,0,0,0);
printf("Pantalla borrada :D");
exit(0);
}

init() /* Inicia valores objeto */
{
cls[0]=0xAF; /* Codigo objeto para CLS */
cls[1]=0xCD;
cls[2]=0xC3;
cls[3]=0x00;
cls[4]=0xC9;
}


3.2/ Y segunda petición de ayuda. ¿Alguien sabe dónde encontrar la documentación de ASCII MSX-C?.

A lo más que llego es a averiguar que un tal, FREDDY VULTO, tenía una página con esta documentación, sin embargo no soy capaz de encontrarla.
« Última modificación: 19 de Abril de 2008, 07:48:08 pm por Jos'b » En línea
nerlaska
Karoshi Excellent Member
******
Mensajes: 1102


Programador


WWW Email
« Respuesta #1 : 20 de Abril de 2008, 07:13:07 am »

Lo correcto sería poner char cls[5], no? .. asi reservas 5 bytes.. si pones sólo un puntero .. no estas reservando espacio como para luego escribir en RAM ... de hecho siendo MSXDOS igual esto te da algún problema no? porque el MSXDOS tendrá que ubicar tu código en RAM según el tamaño de tu COM y si no declaras esos 5 bytes? No se muy bien como trabaja el BDS-C ni el ASCI MSX-C .. lo cierto es que me he volcado más al SDCC pero es para PC como ya sabes.
En línea

MSX4EVER2GETHER
www.nerlaska.com
Jos'b
Karoshi Maniac
****
Mensajes: 262


« Respuesta #2 : 20 de Abril de 2008, 08:37:22 am »

La idea del puntero es simplemente por comodidad. Así me ahorro tener que ir contando cuantos bytes tienen las funciones en C.M. Aunque reservando cinco valores para el vector cls  tampoco funciona ¿?. Además cuando asigno valores a la tabla, ya se están reservando en memoria.

El BDS-C, supongo que es similar al SDCC en cuanto colocación de variables y demás. Todas las variables se colocan justo a continuación del código, a no ser que le indiques al compilador lo contrario, y con la reserva de espacio RAM que quieras.

No sé si habrá alguien con experiencia en este C. Yo desde luego estoy un poco perdido. En principio el BDS-C fue creado para CP/M, y no se si esa puede alguna razón para que no funcione a la perfección con el MSX-DOS 2.2. El compilador genera código perfectamente, salvo cuando intentas usar funciones que acceden a la Bios, a las funciones del Dos o llamadas a C.M. Y este es el punto que más me preocupa, puesto que sin poder acceder a rutinas en C.M. solo podré usar el C para tratar cadenas y poco más.

Y respecto al ASCII MSX-C me conformaría con saber dónde conseguir documentación.

En línea
nerlaska
Karoshi Excellent Member
******
Mensajes: 1102


Programador


WWW Email
« Respuesta #3 : 20 de Abril de 2008, 09:20:42 am »

Por cierto Job's ... y estas seguro de que te entra en el main y todo eso, no?
Y de que la gestión de los parámetros de entrada se gestiona bien desde el compilador y lo de arrancar en la 0x100 .. no se .. yo pregunto .. imagino que lo estarás teniendo en cuenta.
En línea

MSX4EVER2GETHER
www.nerlaska.com
Jos'b
Karoshi Maniac
****
Mensajes: 262


« Respuesta #4 : 20 de Abril de 2008, 11:57:25 am »

Los argumentos de main() son obligatorios para que el BDS-C lo compile. Respecto a la dirección de inicio del MSX-DOS, supongo que lo ensambla bien, ya que si quitas las funciones init() y call() te lo compila, ejecuta y además te devuelve el control al DOS perfectamente.

He probado, creo, todas las opciones que se me han ocurrido. Desde alojar el código C.M. con la funcion poke(), haciendo la tabla cls[] como local dentro de main, y asignandole valores en ella, hasta probar con las diferentes opciones del compilador, como por ejemplo la opcion "-m" para indicar la dirección de inicio, o "-e" para alojar datos. Entre otras cosas. No podría decirte todo lo que he probado, porque no lo recuerdo. Pero llevo desde enero con él liado, y no hay forma.

Otra forma de crear funciones en C.M., es crear directamente una libreria con el AsMSX, por ejemplo. En el USER'S GUIDE del BDS-C, explica paso a paso como hacer librerias para el compilador. Sin embargo tengo algunas lagunas en lo que se refiere al tratamiento de la pila y el paso de argumentos.

Además, parece lógico que la función CLS, tal y como la he definido en el código fuente, debería funcionar. Por lo menos borrar la pantalla, que es lo que se pretende. Sin embargo, según como, a veces parece que se salta la función call() y pasa directamente al printf(), imprimiendo el mensaje, pero sin devolver el control al DOS. Muy raro.

En definitiva, despues de tanto tiempo probando, tengo cierto interés en probar el compilador de ASCII, a ver si este da mejor resultado.

« Última modificación: 20 de Abril de 2008, 12:59:44 pm por Jos'b » En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #5 : 20 de Abril de 2008, 12:58:00 pm »

Veo algunos problemas en el código que paso a comentarte:

Citar
char *cls;   /* Tambien se puede hacer "char cls[5];" */     


Como ya te ha dicho Nerlaska, *debes* reservar tantos bytes como sea necesario para albergar tu función. Por supuesto, puedes optar por no hacerlo; pero según organice los datos el BDS, tu código será machacado o no.

Citar
call(*cls,0,0,0,0);

Si pones "*cls" no vas a llamar al código contenido en cls, sino a la dirección contenida en cls, es decir $CDAF. Quita el * y estaría correcto. Por lo demás no conozco la sintaxis del BDS y del call.

Lo normal en estos casos es implementar una función estandar de C con código ensamblador inline, ¿no es posible con el BDS?.

Por último, lo habitual de estos compiladores es trabajar desde MSX-DOS; así que la BIOS no está disponible. Para llamar a funciones de la misma tienes que emplear inter-slot calls, el método lo tienes explicado aquí. Una vez más, no estoy seguro de como trabaja el BDS; pero si se ejecuta desde MSX-DOS ya sabes a que atenerte Smiley

Mi recomendación es que te pongas con el SDCC o con el Z88DK, te resultará más fácil y encontrarás más ayuda. Si de todas formas estás convencido de que quieres usar alguno de estos otros compiladores, yo te puedo pasar todo lo que tengo, en su día acumulé mucha información Wink
En línea

Doom dee doom dee doom
Jos'b
Karoshi Maniac
****
Mensajes: 262


« Respuesta #6 : 20 de Abril de 2008, 01:27:55 pm »

Acabo de probar tu sugerencia, y ciertamente con "cls[5]" y cambiando "*cls" en la llamada call por "cls". Devuelve el control al DOS sin problemas. Posiblemente me haya puesto obtuso, con cls[] y *cls, que era la idea original de ahí el comentario del código, en vez de "cls" que apunta a la tabla.

Citar
Si pones "*cls" no vas a llamar al código contenido en cls, sino a la dirección contenida en cls, es decir $CDAF. Quita el * y estaría correcto. Por lo demás no conozco la sintaxis del BDS y del call.

Cierto. Me remito al comentario de arriba.

Citar
Por último, lo habitual de estos compiladores es trabajar desde MSX-DOS; así que la BIOS no está disponible. Para llamar a funciones de la misma tienes que emplear inter-slot calls, el método lo tienes explicado aquí. Una vez más, no estoy seguro de como trabaja el BDS; pero si se ejecuta desde MSX-DOS ya sabes a que atenerte

Hasta ahí llega mi ignorancia sobre el MSX-DOS. Gracias por el comentario, esta tarde intentaré dedicarle algo más de tiempo a los links.

Citar
Lo normal en estos casos es implementar una función estandar de C con código ensamblador inline, ¿no es posible con el BDS?.

No. Solo tiene algunas funciones que llaman a rutinas de la bios o del dos, tipo bios() o bdos(). Y salvo error u omisión no soy capaz de hacerlas funcionar.

Citar
Mi recomendación es que te pongas con el SDCC o con el Z88DK, te resultará más fácil y encontrarás más ayuda. Si de todas formas estás convencido de que quieres usar alguno de estos otros compiladores, yo te puedo pasar todo lo que tengo, en su día acumulé mucha información

La idea no es usar un C poderoso como el SDCC o el Z88DK, sino disfrutar con el MSX real, haciendo pequeñas cosillas. Además tampoco creo que pudiera sacarle el máximo partido a estos compiladores puesto que no soy un experto en C.

Respecto a la información, mi correo esta abierto a todo el mundo. Y por supuesto si desearia recibirla, me cuesta mucho encontrar información relativa a ambos compiladores. Respecto al BDS-C solo cuento con la que el autor del compilador tiene colgada en su web.

Y creo que por mi parte nada más. Probaré esta tarde las llamadas a la BIOS. Ya contaré los resultados.
En línea
Jos'b
Karoshi Maniac
****
Mensajes: 262


« Respuesta #7 : 20 de Abril de 2008, 05:30:03 pm »

Bueno, como prometí, comento que los resultados han sido positivos. Efectivamente como ha comentado JL, el problema era simplemente el modo de llamar a las rutinas de la BIOS.

El nuevo código es el siguiente
Código:
/*
CLS.COM
El objetivo de este programa es saber si se puede incluir codigo
objeto en un array y llamarlo a traves de call pasando como valor
el puntero del primer valor de la tabla.
*/
#include <bdscio.h>

char cls[13];
main(argc,argv)
int argc;
char *argv[];
{
inicia();
call(cls,0,0,0,0);
printf("Pantalla borrada :D");
exit();
}

inicia()   /* Inicia valores objeto */
{
cls[0]=0xAF; /* Codigo objeto para CLS */
cls[1]=0xFD;
cls[2]=0x2A;
cls[3]=0xC0;
cls[4]=0xFC;
cls[5]=0XDD;
cls[6]=0X21;
cls[7]=0XC3;
cls[8]=0X00;
cls[9]=0xCD;
cls[10]=0x1C;
cls[11]=0x00;
cls[12]=0xC9;
}

El código objeto ha sido obtenido mediante el siguiente código fuente para AsMSX y la herramienta BinDB.
Código:
xor a
.CALLBIOS 00c3h
ret

Bueno, pues gracias por las aclaraciones. Si hago algo útil en C prometo hacerlo saber.
« Última modificación: 20 de Abril de 2008, 05:33:40 pm por Jos'b » En línea
k0ga
Karoshi Fan
**
Mensajes: 85


Email
« Respuesta #8 : 20 de Abril de 2008, 08:39:54 pm »


Citar
La idea no es usar un C poderoso como el SDCC o el Z88DK, sino disfrutar con el MSX real, haciendo pequeñas cosillas. Además tampoco creo que pudiera sacarle el máximo partido a estos compiladores puesto que no soy un experto en C.



Prueba el hitech-c. Desde mi punto de vista es el mejor compilador nativo que hay (hay versiones cruzadas que son mas avanzadas). Puedes encontrar la version de CPM en la web de hitech, y habia por ahi un par de parches y librerias para msx (incluso un make que en su dia yo use para cierto proyecto).
En línea
Jos'b
Karoshi Maniac
****
Mensajes: 262


« Respuesta #9 : 21 de Abril de 2008, 02:54:57 pm »

Prueba el hitech-c. Desde mi punto de vista es el mejor compilador nativo que hay (hay versiones cruzadas que son mas avanzadas). Puedes encontrar la version de CPM en la web de hitech, y habia por ahi un par de parches y librerias para msx (incluso un make que en su dia yo use para cierto proyecto).

Gracias por la información. Aunque en la página oficial, no hay forma de descargarse el compilador para CP/M. Buscare a ver si estuviera colgado por algún otro sitio.

Respecto al BDS-C, va bastante bien, ayer mismo estuve haciendo algunas pruebas con ficheros(acceso a binarios y modo texto) y perfecto. La única pega que le veo, es que no tiene una triste libreria para dibujar un punto en pantalla. Por eso, la idea que me parece más asequible para mí, es crear un arhivo .h, con definiciones de tablas con el código objeto, de funciones tipo imprimir un sprite, borrar pantalla, hacer un locate, etc. y llamarlas con las funciones "call" o "calla".
En línea
k0ga
Karoshi Fan
**
Mensajes: 85


Email
« Respuesta #10 : 22 de Abril de 2008, 08:31:42 am »


Gracias por la información. Aunque en la página oficial, no hay forma de descargarse el compilador para CP/M. Buscare a ver si estuviera colgado por algún otro sitio.

Respecto al BDS-C, va bastante bien, ayer mismo estuve haciendo algunas pruebas con ficheros(acceso a binarios y modo texto) y perfecto. La única pega que le veo, es que no tiene una triste libreria para dibujar un punto en pantalla. Por eso, la idea que me parece más asequible para mí, es crear un arhivo .h, con definiciones de tablas con el código objeto, de funciones tipo imprimir un sprite, borrar pantalla, hacer un locate, etc. y llamarlas con las funciones "call" o "calla".

http://pag-per.servicam.com/migl/amstradpcw/c_compilers.html
http://msxbanzai.tni.nl/dev/software.html


Y creo que Nestor en su dia hizo algo para hitech C, aunque en su pagina ahora no esta (lo buscare en mi disco duro)
En línea
Jos'b
Karoshi Maniac
****
Mensajes: 262


« Respuesta #11 : 22 de Abril de 2008, 06:25:55 pm »

Gracias de nuevo.

Ignorante de mi cuando pensaba que solo existía el BDS-C para MSX.

He probado el Hitech-C en el MSX, con el MSX-DOS 2.2, pero me sale directamente el mensaje de "Incompatible disk" cuando intento compilar algún archivo (con fuente basada en el estandar ANSI)...

... creo que necesitaría un manual para poder usarlo.
En línea
Jos'b
Karoshi Maniac
****
Mensajes: 262


« Respuesta #12 : 22 de Abril de 2008, 08:34:43 pm »

Por fin encontré el manual. Escondido tras un archivo "z80doc.exe". Tendré que dedicarle algo de tiempo. Aunque por ahora, no encuentro en él el error que me sale de "incompatible disk". Supongo que para eso servirán los parches que andan por ahí.
« Última modificación: 22 de Abril de 2008, 08:44:48 pm por Jos'b » En línea
k0ga
Karoshi Fan
**
Mensajes: 85


Email
« Respuesta #13 : 23 de Abril de 2008, 08:33:31 am »

Por fin encontré el manual. Escondido tras un archivo "z80doc.exe". Tendré que dedicarle algo de tiempo. Aunque por ahora, no encuentro en él el error que me sale de "incompatible disk". Supongo que para eso servirán los parches que andan por ahí.


Si sigues teniendo problemas dimelo y te envio directamente la version que tengo yo en el disco duro del msx.
En línea
nerlaska
Karoshi Excellent Member
******
Mensajes: 1102


Programador


WWW Email
« Respuesta #14 : 23 de Abril de 2008, 12:04:21 pm »

Y genera código chulo el Hitech este?
En línea

MSX4EVER2GETHER
www.nerlaska.com
Páginas: [1] 2 3 ... 5
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!