Problemillas con el modo supervisor y el acceso al puerto paralelo

Avatar de Usuario
Solderboy
Mensajes: 43
Registrado: 28 Feb 2018 19:45
Ubicación: En la tierra de los olivos
Agradecido : 10 veces
Agradecimiento recibido: 18 veces

Problemillas con el modo supervisor y el acceso al puerto paralelo

Mensajepor Solderboy » 07 Abr 2018 21:37

Hola.

En los ratillos que saca uno entre el resto de tareas de la vida cotidiana, estoy empezando a trastear con el puerto paralello del Atari ST. El objetivo es ver si este puerto es un buen candidato para comunicación con el exterior a una velocidad decente o si me tengo que decantar por el del cartucho.

He hecho las primeras pruebas (tanto en GFA basic como en C) usando llamadas a la XBIOS, pero solo consigo conmutar la salida a unos míseros 3 Khz, así que me he puesto a trastear con el hardware en modo supervisor (menudo tratamiento de choque me estoy dando ...)

Como podéis imaginar, dado el título del post, el código no funciona y el Atari (tanto en emulador como en real) dibuja dos bonitas bombas, (a pesar de que el código compila limpiamente). Os agradeceré cualquier comentario o sugerencia, ya todo apunta a que el programa no entra en modo supervisor

PS: soy novato en C, así que no tengáis problema en criticar cualquier barbaridad que veáis en el código.



Código: Seleccionar todo

/* parport 2.c */
/* direct access to parallel port in supervisor mode */
/* compiler AHCC ST v5.6 */
#include <stdio.h>
#include <tos.h>

void  *config_and_send(void);
void main (void)
{
long temp;
printf ("\nParallel port testing direct access");
printf ("\nLaunching pulses by strobe pin");
printf ("\nAnd managing io port");

temp=Supexec(config_and_send());

getchar();
}

void *config_and_send(void)
{
   volatile unsigned char  *const register1=(unsigned char *)0xff8800;/*PSG register select*/
   volatile unsigned char  *const register2=(unsigned char *)0xff8802;/*PSG register read write */

 /* configure PSG */

 *register1=7;     /*select register 7, IO enable*/
 *register2|=128;  /*activate bit 7: port b is output */
 *register1=15;    /*select register 15, portb direction  enable*/
 *register2=255;        /* all outputs high */
   while (1>0)
  {
  *register2=~*register2; /*invert outputs */
  return (0);
  }
}

Avatar de Usuario
explorer
Mensajes: 179
Registrado: 10 Ene 2016 18:43
Ubicación: Valladolid, España
Agradecido : 3 veces
Agradecimiento recibido: 158 veces
Contactar:

Re: Problemillas con el modo supervisor y el acceso al puerto paralelo

Mensajepor explorer » 08 Abr 2018 00:13

Sí, el primer error que veo está aquí:

temp = Supexec(config_and_send());

Lo que esa línea intenta hacer es: ejecutar config_and_send(), y su resultado pasarlo como argumento a Supexec().

Y claro, como dentro de config_and_send() hay acceso al hardware, pues salen dos bombas (el usuario no tiene privilegios para acceder al hardware).

Lo que hay que pasarle a Supexec() es la dirección de la función config_and_send(). Sería algo así:

temp = Supexec(config_and_send);

En lenguaje C, el nombre de una función ya es un puntero a la propia función.

Supexec la ejecutará en modo supervisor.

¡Ojo! Cuidado con el compilador, que a veces hace cosas añadidas al principio y final de las funciones. Revisa la documentación del compilador por si tienes que colocar algún decorador especial a esa función para indicar que quieres que no haga nada "raro". Simplemente, quieres que la función termine con un RTS (Return from Subrutine), y nada más.

Otro detalle que veo es que tienes puesto el return() dentro del bucle while infinito. Entonces solo estás cambiando una vez. Supongo que lo habrás hecho así mientras haces pruebas.

El PSG está funcionando a 2 Mhz, pero internamente se reduce a la mitad. Además, recuerda que el MFP es el que se encarga de la gestión del puerto paralelo, y que el YM2149 se encarga de sacar sonido, así que si quieres hacer algo permanente en el tiempo y que no te afecten estas dos tareas, tendrás que trampearlas.

¡Suerte!
JF^D Perl Programming Language - -j4tar1 Falcon030 4/80 MB UK, Jaguar
Calendario de Retroinformática - Canal Telegram ATARI y Retro

Avatar de Usuario
Solderboy
Mensajes: 43
Registrado: 28 Feb 2018 19:45
Ubicación: En la tierra de los olivos
Agradecido : 10 veces
Agradecimiento recibido: 18 veces

Re: Problemillas con el modo supervisor y el acceso al puerto paralelo

Mensajepor Solderboy » 08 Abr 2018 11:05

Muchas gracias por las aclaraciones; no me había dado cuenta de matiz que suponen los dos paréntesis dentro del supexec.

Con respecto al tema del sonido, está claro que si consigo manipular el puerto, lo siguiente es desactivar el sonido para acelerar la comunicación.

Lo bueno de todo esto es que estoy aprendiendo más programacion en C en el último mes que durante los últimos 3 años, y todo gracias a un sistema retro.

Crivi
Mensajes: 9
Registrado: 21 Ago 2017 20:14
Agradecimiento recibido: 1 vez

Re: Problemillas con el modo supervisor y el acceso al puerto paralelo

Mensajepor Crivi » 08 Abr 2018 13:04

Buenas, tal como te ha dicho explorer, necesitas pasarle el offset de la función, con "&funcion" a Supexec

Avatar de Usuario
ron
Mensajes: 18104
Registrado: 28 Oct 2010 14:20
Ubicación: retrocrypta
Agradecido : 1000 veces
Agradecimiento recibido: 1068 veces

Re: Problemillas con el modo supervisor y el acceso al puerto paralelo

Mensajepor ron » 09 Abr 2018 11:49

Buenas, pues yo estoy en una tesitura parecida. Intentando recompilar el CP/M68K [ versiones 1.1 y 1.3 sin éxito pero la 1.2 si que funciona ] para que se ejecute en un ST y con la XBIOS me he topado. Pese a que el Alcyon está bastante bien documentado y aunque tengo todo compilado no hay forma de hacerle arrancar ya que me he dado de frente con las rutinas que hay en ROM, Random() y Giaccess() ; que al final parece que los tiros van por donde indicas, indirectamente parece que me has dado un par de ideas.

Échale un ojo a esto a ver si te da alguna idea: ftp://ftp.pigwa.net/stuff/collections/a ... sound.html

Bufff, solo faltaba una excusa y un hilo con algo parecido para que me llamara la atención, perdona solderboy por que tengo un ladrillaco por aquí e igual sacarlo nos abre muchas puertas y nos da ideas a todos, todo esto es parte de la inicialización del ST, en donde todo se ve todo.

Aquí está el source original de DRI: CP/M-68K
CP/M-68K SOURCE : 518K C source for CP/M-68K version 1.2.
http://www.retroarchive.org/cpm/archive ... cpm68k.zip

Si alguien tiene el diskette o las imágenes de disco con el CP/M68K para ST me haría un gran favor, ya os digo que si las hay y rulaban por ahí, pero les perdí la pista. Es posible que viendo otros OS pueda terminar de entender porque no me termina de funcionar.

Aunque está todo bastante documentado, ya me gustaría a mi saber lo que conocen los colegas de la casa, creo que el problema que estoy teniendo es que la TOS intenta cargar.

cpm68sim_st.png
cpm68sim_st.png (49.43 KiB) Visto 281 veces


Así que sobre el papel, cuando generas el sistema parece que todo debería de ir bien, pero a la hora de llevarlo al ST, como que voy más perdido que una monja en un concierto de heavy y no doy con la tecla.

El TOS de Atari ST es en muchos aspectos funcionalmente igual que el CP/M68K, con extensiones para manejar ratón, sonido, interfaz MIDI, un teclado inteligente y los puertos para joysticks. El administrador de entorno de gráficos ( GEM ) proporciona soporte adicional monousuario de ventanas y comunicaciones a través de extensiones VDI y AES, que manejan los gráficos y un entorno de aplicaciones.

La capacidad de transporte del programa se mantiene dividiendo los sistemas operativos en máquinas independientes ( BDOS, VDI y AES ) y utilidades básicas de entrada / salida dependientes de la máquina ( BIOS y rutinas de línea A ).

La BIOS consta de todas las rutinas de I/O dependientes de la máquina y además proporciona acceso a las rutinas de línea A para gráficos rápidos.

http://www.bighole.nl/pub/mirror/homepa ... uide_2.htm

Aquí he ido descubriendo muchas cosas que necesitaba. Parece ser que para que el ST pueda transferir el arranque desde el disco antes de invocar el GEM debe estar con el sector de boot en formato IBM PC...!

Así que durante el arranque, el sector de boot se carga en un buffer y se comprueba si el boot sector tiene un word con checksum de #$1234. Si es satisfactorio, se realiza un salto de subrutina al principio del código independiente de su posición en el búfer. Debería de producirse una llamada a get BIOS parameter block, que hace que se lea el boot sector, devolviendo un error en caso que algún campo de los parámetros críticos están a cero. Además de un número de serie de 24 bit, el cual se escribe mientras el proceso de formateo, se usa para determinar cuando un disco ha sido cambiado. Finalmente protobt, que es una llamada de la extended BIOS (18), se usa para crear el sector de arranque, el cual debería ser track 0, cara 0, sector 1.

boot_loader_st.gif
boot_loader_st.gif (62.2 KiB) Visto 281 veces


Imagen
boot_rom_st.gif
boot_rom_st.gif (60.96 KiB) Visto 150 veces



¿ alguna idea ?

Avatar de Usuario
ron
Mensajes: 18104
Registrado: 28 Oct 2010 14:20
Ubicación: retrocrypta
Agradecido : 1000 veces
Agradecimiento recibido: 1068 veces

Re: Problemillas con el modo supervisor y el acceso al puerto paralelo

Mensajepor ron » 09 Abr 2018 12:11

Ah, se me olvidaba decir que con el método FERIX también lo arranco sin problemas.

Imagen
metodoferix.png
metodoferix.png (75.91 KiB) Visto 150 veces

Avatar de Usuario
Solderboy
Mensajes: 43
Registrado: 28 Feb 2018 19:45
Ubicación: En la tierra de los olivos
Agradecido : 10 veces
Agradecimiento recibido: 18 veces

Re: Problemillas con el modo supervisor y el acceso al puerto paralelo

Mensajepor Solderboy » 09 Abr 2018 20:10

Hola.
No hay porqué pedir disculpas...esto es un foro vivo.

Volviendo al tema, he conseguido ejecutar el programa en modo supervisor y que no salgan las bombitas de marras. Tan pronto como pruebe sobre hardware real, haré un post aparte en el que publicaréis distintos resultados obtenidos, y dejamos este para estos menesteres.
Por cierto, las primeras pruebas las hice manipulando el puerto paralelo mediante llamadas a la Xbios (entre ellas la Giacess) sin problema alguno, incluso para un novato en C como yo.
Si sirve de algo, aquí está la lista de todas las llamadas a la Xbios

http://toshyp.atari.org/en/004.html

Avatar de Usuario
ron
Mensajes: 18104
Registrado: 28 Oct 2010 14:20
Ubicación: retrocrypta
Agradecido : 1000 veces
Agradecimiento recibido: 1068 veces

Re: Problemillas con el modo supervisor y el acceso al puerto paralelo

Mensajepor ron » 09 Abr 2018 23:57

Genial, esta tarde las vi rebuscando y ahora estoy dándole vueltas y tengo algunas conclusiones, pero quizá sea por cabezoneria sabiendo que desde floppy puedo hacer que arranque en la dirección que me de la gana. La cuestión es que no tengo una BIOS como tal y lo que estoy viendo en el ST necesita curro, ya que carece de una BIOS cp/m68k a no ser que en los discos del Alcyon encuentre algo que me sirva, da igual que compile lo que quiera si no soy capaz de hacerle boot en un ST.... seguiremos aprendiendo, a ver si sale algo.


Volver a “Software ST”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados