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

Iapetus

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 244
    • Ver Perfil
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
;


SingletonJohn

  • Commodore Master
  • *****
  • Mensajes: 298
  • Poke 35136,0
    • Ver Perfil
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)
« última modificación: Marzo 29, 2026, 14:37:28 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: 244
    • Ver Perfil
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

SingletonJohn

  • Commodore Master
  • *****
  • Mensajes: 298
  • Poke 35136,0
    • Ver Perfil
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'
« última modificación: Marzo 29, 2026, 17:14:35 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: 14950
  • Commodoreador web
    • Ver Perfil
    • Mi blog
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.
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

SingletonJohn

  • Commodore Master
  • *****
  • Mensajes: 298
  • Poke 35136,0
    • Ver Perfil
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!
"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! ;)