Commodore manía

Commodore 64 => Desarrollo => Mensaje iniciado por: SingletonJohn en Marzo 26, 2026, 15:24:40

Título: Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: SingletonJohn en Marzo 26, 2026, 15:24:40
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
Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: josepzin en Marzo 27, 2026, 03:40:43
¿Este no es el de Zezito? @Iapetus
Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: SingletonJohn en Marzo 27, 2026, 08:25:11
¿Este no es el de Zezito? @Iapetus

Te refieres a que lo ha hecho él o a que lo usa??
Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: Iapetus en Marzo 27, 2026, 10:58:38
¿Este no es el de Zezito? @Iapetus
Sí, Zezito in the Glittering Caves para C64 ha sido programado usando Durex Forth.
Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: Iapetus en Marzo 27, 2026, 10:59:19
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.
Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: SingletonJohn en Marzo 27, 2026, 12:34:04
... 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.
Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: Iapetus en Marzo 27, 2026, 13:08:20
Me gusta mucho que no use el sistema de SCREENS que otros forth más antiguos usaban.
Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: SingletonJohn en Marzo 28, 2026, 13:24:41
@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
Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: Iapetus en Marzo 28, 2026, 15:51:03
@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.
Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: SingletonJohn en Marzo 28, 2026, 23:31:21
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
Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: Iapetus en Marzo 29, 2026, 11:34:30
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.
Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: SingletonJohn en Marzo 29, 2026, 12:12:39
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
Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: Iapetus en Marzo 29, 2026, 12:15:40
Sería interesante ver alguna palabra de test donde hagas algunas de esas cosas.
Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: SingletonJohn en Marzo 29, 2026, 13:53:35
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)
Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: SingletonJohn en Marzo 29, 2026, 13:57:08
Por cierto...una pregunta....cómo hacéis para que las imágenes enlazadas en un mensaje se vean más grandes???
Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: Iapetus en Marzo 29, 2026, 14:15:00
Te preguntaba por ejemplos de uso de i' , j', k etc, not de i, j >R, R>, R@ que son lo que ya tenemos normalmente en durex forth.

Dos ejemplos de mi código donde hago uso de  >R, R> , R@ , i y j .
Código: [Seleccionar]
: pntattr ( tile x y - )
   1+
   @[]cram + >r
   []tiles dup c@
   []attribs @   
   r@ !         
   2+ c@     
   []attribs @
   r> 40 + !
;

: pntnivel
   0 cls
   BUFFNIV
   22 0 do
      40 0 do
         dup c@ dup
         i j pnttile
         i j pntattr
         1+
      2 +loop
   2 +loop
   drop
;

Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: SingletonJohn en Marzo 29, 2026, 14:24:00
El uso de I' y J' es el mismo que el de I y J...sólo cambia el índice de la pila al que acceden.
Cuando tienes un loop I' y J' son los límites del loop exterior e interior. Por lo que en un loop que sea necesario saber el límite (el clásico problema de imprimir un diamante con asteriscos, p.ej.), el acceso es muy sencillo y no destructivo

Si tienes una palabra en la que jugueteas con la return stack, I, I`, J y J`te permiten el acceso a las 4 primeras CELLS de la return stack (puedes meter hasta 4 datos en ella), con las ventajas que esto te ofrece (acceso no destructivo a estos 4 datos)

Eso si: es muy importante el momento en el que hacer el >r. Si lo haces antes de una word, sabes que como mínimo, en la return stack se guarda en el nivel 1 una cell con la dirección de memoria a la que volver tras esa word, por lo que nuestro dato queda empujado un nivel hacia abajo (para usar ese dato dentro de dicha word). Si lo usamos dentro de una palabra, pues hay que ser conscientes de limpiar ese dato/s de la return para no crashear el sistema (como en ensamblador)
Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: Iapetus en Marzo 29, 2026, 14:36:12
El uso de I' y J' es el mismo que el de I y J...sólo cambia el índice de la pila al que acceden.
Cuando tienes un loop I' y J' son los límites del loop exterior e interior. Por lo que en un loop que sea necesario saber el límite (el cásico problema de imprimir un diamante con asteriscos, p.ej.), el acceso es muy sencillo y no destructivo

Si tienes una palabra en la que jugueteas con la return stack, I, I`, J y J`te permiten el acceso a las 4 primeras CELLS de la return stack (puedes meter hasta 4 datos en ella), con las ventajas que esto te ofrece (acceso no destructivo a estos 4 datos)
Sí, ya sabía que i' y j' se usan en algunas versiones de Forth para obtener los límites de los bucles, y que también pueden servir para extraer datos de la pila de retorno en esos índices. Solo tenía curiosidad por saber cómo las usarías tú en algún caso especial que realmente necesitara esas palabras.
En mi juego no he tenido que implementar nada de ese tipo. No están en el estándar 2012 porque exponen detalles de implementación que el estándar prefiere no fijar. Supongo que son herramientas pensadas para situaciones muy específicas
Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: SingletonJohn en Marzo 29, 2026, 17:11:32
Otro ejemplo de las bondades del uso de la return stack

Una simple función de potencia. Tiene de "dificultad" que ha de funcionar para exponentes positivos (no cero ni negativos).  Probablemente sea más eficiente la que usa la return stack (a no ser que >r y r> estén hechas de culo)

Si en vez de un bucle do..loop tuviera un begin..until o un begin..while..repeat, pues me haría falta el acceso sobre todo a i', j y j'
Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: josepzin en Marzo 29, 2026, 21:37:15
Por cierto...una pregunta....cómo hacéis para que las imágenes enlazadas en un mensaje se vean más grandes???
Mira, edité y las agregué a tu comentario.

Tienes que abrir abajo donde están las imágenes adjuntadas y poner "(Insert Attachment ...)", entonces te genera el código en donde esté el cursor.
Título: Re:Durex Forth. Un lenguaje clásico con nuevo desarollo Open Source para C64
Publicado por: SingletonJohn en Marzo 29, 2026, 22:00:07
Mira, edité y las agregué a tu comentario.

Tienes que abrir abajo donde están las imágenes adjuntadas y poner "(Insert Attachment ...)", entonces te genera el código en donde esté el cursor.

Gracias!