Autor Tema: Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64  (Leído 14564 veces)

SingletonJohn

  • Commodore Master
  • *****
  • Mensajes: 321
  • Poke 35136,0
    • Ver Perfil
Hola a todos

Con el trajín que tengo últimamente de testear todos los SO/IDE´s/Compiladores de diferentes lenguajes nativos de C64, he topado con el FORTH.

El FORTH ya es un lenguaje clásico y algo lo conocía porque tengo una calculadora HP que se programa en RPN (Notación Polaca Invertida....MUY CÓMODA cuando te acostumbras). EL RPN es la BASE del FORTH.

El caso es que aunque el lenguaje no es nuevo, actualmente hay un proyecto OPEN SOURCE en el que
está desarrollado un disco y un cartucho de un sistema operativo en este lenguaje + librerías (última actualización de Noviembre de 2024)

Voy as cacharrearlo a ver si mola.....acepta, por cierto, ensamblador embebido....Si lo conocéis, contadme experiencias.

Os dejo el link al proyecto

https://github.com/jkotlinski/durexforth
« última modificación: Marzo 26, 2026, 18:14:40 por SingletonJohn »
"Ya al final de mi vida de pecador, mientras espero el momento de perderme en el abismo..." pues me lío y me pongo a hacer lo que no pude de pequeño! ;)

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 15029
  • Commodoreador web
    • Ver Perfil
    • Mi blog
¿Este no es el de Zezito? @Iapetus
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

SingletonJohn

  • Commodore Master
  • *****
  • Mensajes: 321
  • Poke 35136,0
    • Ver Perfil
¿Este no es el de Zezito? @Iapetus

Te refieres a que lo ha hecho él o a que lo usa??
"Ya al final de mi vida de pecador, mientras espero el momento de perderme en el abismo..." pues me lío y me pongo a hacer lo que no pude de pequeño! ;)

Iapetus

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 246
    • Ver Perfil
¿Este no es el de Zezito? @Iapetus
Sí, Zezito in the Glittering Caves para C64 ha sido programado usando Durex Forth.
« última modificación: Marzo 27, 2026, 11:30:48 por Iapetus »

Iapetus

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 246
    • Ver Perfil
Forth me ha gustado muchísimo, y fue fantástico programar Zezito in the Glittering Caves usando el lenguaje. Es bastante rápido; usé algunas palabras (rutinas en Forth) en código máquina, pero muy pocas y muy pequeñas, solo para interrupciones, música y algo relacionado con la puntuación. Empecé esto como un proyecto para probar lo que se podía lograr con Durex Forth y terminó siendo un juego completo.
Me gustaría programar algún otro juego más, porque ese juego al final fue solo una prueba, y se puede mejorar mucho añadiendo más palabras en código máquina. Por ejemplo, mis otros dos juegos, para los cuales usé C+ASM, van bastante bien, pero todas las rutinas críticas están en código máquina; prácticamente solo la gestión del juego y la lógica están en C.
« última modificación: Marzo 27, 2026, 11:30:20 por Iapetus »

SingletonJohn

  • Commodore Master
  • *****
  • Mensajes: 321
  • Poke 35136,0
    • Ver Perfil
... Empecé esto como un proyecto para probar lo que se podía lograr con Durex Forth y terminó siendo un juego completo.

A mi también me está gustando mucho. Es un sistema pequeño y ligero, muy cerca de la máquina....para mi tiene un nivel perfecto....un poco más bajo que el de C.

Y el hecho de poder compilar cosas en ASSEMBLER sin salir del SO de Forth está muy bien

Y el poder configurar entornos de ejecución distintos al estándar....es un rollo muy moderno....me está sorprendiendo mucho este FORTH.
"Ya al final de mi vida de pecador, mientras espero el momento de perderme en el abismo..." pues me lío y me pongo a hacer lo que no pude de pequeño! ;)

Iapetus

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 246
    • Ver Perfil
Me gusta mucho que no use el sistema de SCREENS que otros forth más antiguos usaban.

SingletonJohn

  • Commodore Master
  • *****
  • Mensajes: 321
  • Poke 35136,0
    • Ver Perfil
@Iapetus , tú que lo has usado, recuerdas si hay una alternativa a i´ (es decir, copiar el segundo elemento de la return stack) o hay que hacérselo uno mismo?? Yo sólo he visto i (elemento  de la return stack) y j (elemento 3 de la return stack), pero nada más
"Ya al final de mi vida de pecador, mientras espero el momento de perderme en el abismo..." pues me lío y me pongo a hacer lo que no pude de pequeño! ;)

Iapetus

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 246
    • Ver Perfil
@Iapetus , tú que lo has usado, recuerdas si hay una alternativa a i´ (es decir, copiar el segundo elemento de la return stack) o hay que hacérselo uno mismo?? Yo sólo he visto i (elemento  de la return stack) y j (elemento 3 de la return stack), pero nada más
I y J son los índices de los bucles DO…LOOP: I devuelve el índice del bucle interno y J el del siguiente bucle externo. No son accesos genéricos a la return stack. Si quieres manipular la return stack directamente, existen R@, >R y R>, pero no hay palabras estándar para acceder a elementos más profundos.

SingletonJohn

  • Commodore Master
  • *****
  • Mensajes: 321
  • Poke 35136,0
    • Ver Perfil
I y J son los índices de los bucles DO…LOOP: I devuelve el índice del bucle interno y J el del siguiente bucle externo. No son accesos genéricos a la return stack. Si quieres manipular la return stack directamente, existen R@, >R y R>, pero no hay palabras estándar para acceder a elementos más profundos.

En realidad, I copia el primer elemento de la return stack en el stack  y J el tercero. El lenguaje FORTH además implementa I` (que es el segundo elemento de la pila, que no lo implemeta durex FORTH del C64). Estas variables se corresponden con el índice del loop interior, el límite del loop interiory el índice del loop exterior cuando hay un doble bucle doo..loop. Pero también son MUY útiles para cuando metes cosas en la return Stack o para obtener ciertos punteros...

De todas maneras, I`no resulta difícil de implementar
« última modificación: Marzo 28, 2026, 23:54:52 por SingletonJohn »
"Ya al final de mi vida de pecador, mientras espero el momento de perderme en el abismo..." pues me lío y me pongo a hacer lo que no pude de pequeño! ;)

Iapetus

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 246
    • Ver Perfil
Yo simplemente te respondí desde el punto de vista de Durex Forth, que está basado en el estándar Forth 2012, en el cual no existen las palabras I' (ni J' ni K), aunque pueden aparecer en algunas versiones antiguas de Forth y en Gforth que es actual pero tiene algunas de esas palabras.

Y como has dicho, no es difícil implementar I' si la necesitas. Forth es fácilmente ampliable.

¿Puedes dar un ejemplo donde te sería útil I'?

Veo que usas Starting Forth de Leo Brodie. Yo también lo estudié al principio cuando me interesé por Forth. Es un libro muy bueno y me gusta mucho, pero hay que tener en cuenta que cuando fue publicado, Forth no era lo que es hoy. En la versión online veo el texto sobre nested loops, pero no aparece esa imagen con I' pero sí aparece en el PDF que tengo.
« última modificación: Marzo 29, 2026, 11:37:28 por Iapetus »

SingletonJohn

  • Commodore Master
  • *****
  • Mensajes: 321
  • Poke 35136,0
    • Ver Perfil
Pues tiene utilidad por ejemplo, para acceder al límite dentro de los bucles do..loop.o Para poder meter un dato en la return antes del loop y poder acceder a ese dato en comparaciones dentro del bucle.

O en ciertas operaciones o fórmulas, que tienen varios factores por ejemplo.Los metes en la return y accedes a ellos con I,I' y J sin sacarlos de la return......estos son los usos más directos.

Pero si usas punteros conI' accedes a la dirección de retorno, o datos dentro de la word, etc
"Ya al final de mi vida de pecador, mientras espero el momento de perderme en el abismo..." pues me lío y me pongo a hacer lo que no pude de pequeño! ;)

Iapetus

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 246
    • Ver Perfil
Sería interesante ver alguna palabra de test donde hagas algunas de esas cosas.

SingletonJohn

  • Commodore Master
  • *****
  • Mensajes: 321
  • Poke 35136,0
    • Ver Perfil
Ahí van dos ejemplos sencillos! ;P

El primero es para resolver ecuaciones cuadráticas
El segundo es para calcular cómo crece un dinero con un interés compuesto, poniendo límite a los 20 años o bien cuando la cantidad de dinero se haya duplicado. Para calcular si la cantidad duplica, lo mejor es guardar en la return stack la cantidad de dinero inicial. Como luego hacemos un do..loop, el indice y el límite empujan a la cantidad de dinero inicial al tercer nivel de la return ( variable J)
Después del loop y para no contaminar la return stack (que es la pila que se usa en ensamblador de toda la vida ($100-$1ff) ) hay que hacer limpieza de lo que hemos metido....esto igual que en ensamblador. Si no, el retorno de nuestra palabra va a ser a "cualquier sitio"....


* cuadraticas_FORTH.jpg (153.49 kB . 974x921 - visto 232 veces)
* Interes_codigo_FORTH.jpg (81.69 kB . 1069x250 - visto 209 veces)
* Interes_ejec_FORTH.jpg (104.79 kB . 1167x488 - visto 206 veces)
« última modificación: Marzo 29, 2026, 21:36:18 por josepzin »
"Ya al final de mi vida de pecador, mientras espero el momento de perderme en el abismo..." pues me lío y me pongo a hacer lo que no pude de pequeño! ;)

SingletonJohn

  • Commodore Master
  • *****
  • Mensajes: 321
  • Poke 35136,0
    • Ver Perfil
Por cierto...una pregunta....cómo hacéis para que las imágenes enlazadas en un mensaje se vean más grandes???
"Ya al final de mi vida de pecador, mientras espero el momento de perderme en el abismo..." pues me lío y me pongo a hacer lo que no pude de pequeño! ;)