Jupiter Ace Forth: Utilidades

Elurdio
Mensajes: 404
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 87 veces
Agradecimiento recibido: 83 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 05 Mar 2022 23:29

Último mensaje de la página anterior:

Template for TAP files

Hoy me he estado peleando con el TASM 2.9 mientras intentaba compilar el ejemplo que viene como template para hacer ficheros .tap para el JA del Jupiter Ace Archive

No sé muy bien por qué, pero he tenido que desactivar la directiva #ifndef ACE_INC que viene en los dos "include files" necesarios. Si no siempre me daba error de "imbalanced conditional".

Luego de compilar finalmente sin errores el "example.asm" me genera un fichero "example.tap" que si lo cargo en el JA (emulador) vacío funciona la mar de bien pero no así si ya hay un diccionario antes de cargar "example.tap". Entonces a la que hagas algo (un simple VLIST basta), se cuelga.

Tras examinar detenidamente el fuente, veo que hay un bug:
imag1.jpg
imag1.jpg (28.42 KiB) Visto 1398 veces

Falta restar 3 al cáculo del Word Length Field (lo he añadido marcado en rojo). Pues tal como lo han hecho están incluyendo el tamaño del nombre de la siguiente palabra (HEX) en el tamaño de ésta (BELL). El Word Length Field es el tamaño de la palabra sin incluir el tamaño del nombre. Aquí no solo lo incluyen, sino que encima es el de la palabra que le sigue...

Tras recompilar con la modificación indicada, ya se puede cargar sobre un diccionario preexistente sin problemas.
EDIT: (9&13-3-2022) Solución genérica: Cambiar solo la línea del Word Length Field por la que pongo aquí. De hecho es como lo hace con la siguiente palabra del ejemplo (HEX).

Código: Seleccionar todo

; DING -----------------------
; FORTH dictionary word header
BELLNAME: .BYTE  "BEL",'L' | INVERSE  ; Word Name (last letter inverse)   
          .WORD  BELLEND - $          ; Word Lenght Field
          .WORD  $3C49                ; Link Field
BELLLNK:  .BYTE  $ - BELLNAME - 4     ; Name Lenght Field
          .WORD  $ + 2                ; Code Field Address
; --- BELL code ---
   ·
   ·
   ·
          AsmEnd               ; End of word
BELLEND:

Elurdio
Mensajes: 404
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 87 veces
Agradecimiento recibido: 83 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 17 Mar 2022 12:20

He encontrado este Desensamblador. Este es un diccionario, no como el otro que puse que se carga en memoria con BLOAD. Así tenemos dos opciones y podemos escoger la que más nos convenga en cada situación. Ambos son adecuados para usarse con mis "extractores de codigo fuente".

Otra ventaja de éste es que el otro se solapaba con el ensamblador en memoria del mismo autor (se ve que son versiones diferentes y la nueva del ensamblador, que es de suponer no se solaparía, no la encuentro).

Elurdio
Mensajes: 404
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 87 veces
Agradecimiento recibido: 83 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 22 Mar 2022 16:45

Revisando los ficheros que adjuntó @ron en este post encontré éste:

Mathematical & Trigonometrical Functions (1983)(Remsoft)(GB)[tape 21][19K] como snapshot del programa que buscaba desde hace tiempo tiempo sin éxito.

He estado probando la función SIN (a partir de la cual se calculan COS, etc) y en modo FAST es casi dos veces y media más rápido que el SIN que viene descrito en el manual del JA. Y con una precisión muy parecida (ligeramente inferior en promedio).

Elurdio
Mensajes: 404
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 87 veces
Agradecimiento recibido: 83 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 24 Abr 2022 22:09

Elurdio escribió:Revisando los ficheros que adjuntó @ron en este post encontré éste:

Mathematical & Trigonometrical Functions (1983)(Remsoft)(GB)[tape 21][19K] como snapshot del programa que buscaba desde hace tiempo tiempo sin éxito.

He estado probando la función SIN (a partir de la cual se calculan COS, etc) y en modo FAST es casi dos veces y media más rápido que el SIN que viene descrito en el manual del JA. Y con una precisión muy parecida (ligeramente inferior en promedio).


Por fin ya está disponible en Jupiter Ace Archive (tenía su página, pero no había un link para bajarlo). El manual es muy detallado y el programa viene como .TAP.

Elurdio
Mensajes: 404
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 87 veces
Agradecimiento recibido: 83 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 25 Abr 2022 21:41

Buscando libros sobre Forth en español, he encontrado éste gratuito del año 2007. Me ha gustado la descripción de su contenido que reproduzco a continuación.
Este es un libro sobre el lenguaje de programación Forth. Un lenguaje desconocido por la mayoría de los estudiantes y profesionales a pesar de que su historia arranca a finales de los años 60. Un lenguaje de nicho, limitado en la práctica a programación de microcontroladores, pero a la vez el precursor de la programación estructurada, de la programación orientada a objetos, de las implementaciones de máquina virtual. Un lenguaje que encarna una filosofía radicalmente distinta, que se aparta de los caminos trillados, de las tendencias actuales que conducen a muchos lenguajes a ser meros bastidores en los que apoyar librerías pesadas y complejas.

Pero no nos engañemos, Forth tuvo su oportunidad, su momento dulce alrededor de 1980, y no prosperó. Esa es la realidad. Entonces, ¿por qué Forth? La respuesta es bien sencilla: porque es divertido, gratificante; porque enseña cosas que los demás no hacen. Quien menosprecie sus lecciones sólo porque el azar ha llevado a Forth a ejecutarse en sistemas empotrados en lugar de en computadores personales comete un error y se priva a sí mismo de muchas horas gratificantes, y de lecciones sobre programación que pueden aplicarse a cualquier otro lenguaje.

Elurdio
Mensajes: 404
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 87 veces
Agradecimiento recibido: 83 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 26 May 2022 00:58

Volviendo al tema de las pulsaciones de teclas.

En el Ace Forth disponemos de la palabra INKEY que nos devuelve el código ASCII de la tecla pulsada.

Si pulsamos más de una a la vez, nos devuelve cero.

Eso hace que con INKEY no podamos detectar dos o más teclas pulsadas a la vez.

Así, a modo de ejemplo, el juego de Nuclear Invaders (aka NuI), de nuestro compañero @dancresp utiliza INKEY y esto hace que si nos estamos moviendo no podemos disparar. Es más, en cuanto disparamos moviéndonos, se para nuestra nave. Para disparar hay que dejar de moverse y para moverse hay que dejar de disparar. Es una limitación inherente a la palabra INKEY

Ya comenté un artículo que trataba el tema de las pulsaciones múltiples. Pero cuando se trata de pocas teclas, como el caso de la mayoría de juegos, NuI incluido, vale la pena hacerse unas palabras alternativas a INKEY y específicas para cada caso.

Siguiendo con NuI, durante el juego en sí solo se usan tres teclas: Z, X y ENTER para moverse a la izquierda, derecha y disparar respectivamente.

Queremos detectar:

  • La pulsación de ENTER aunque haya otras teclas pulsadas
  • La pulsación de X aunque haya otras teclas pulsadas, excepto si se pulsa Z también
  • La pulsación de Z aunque haya otras teclas pulsadas, excepto si se pulsa X también

Para ello haremos lecturas directas de las teclas pulsadas con la palabra IN del Ace Forth.

En la página 154 del manual del JA se nos proporciona muy sucintamente la información necesaria para hacerlo. Podemos encontrar la misma información mucho más detallada aquí.

El gráfico ahí mostrado:

Imagen

nos facilita las direcciones que hay que leer con el IN para cada bloque de teclas. En nuestro caso tenemos la dirección 49150 para el ENTER y las dirección 65278 para la Z y la X.

Así, para ENTER podríamos definir, por ejemplo:

Código: Seleccionar todo

 : ENTER?
  49150 IN 1 AND
 ;


Puesto que el bit correspondiente al ENTER es el bit 0 (el de los unos). Dado que el bit correspondiente está a cero cuando se pulsa la tecla, la palabra ENTER? así definida nos devolverá 0 cuando se pulsa ENTER y 1 cuando NO está pulsada.

En el caso de NuI basta con cambiar en la palabra DISPARO

INKEY 13 =

por

ENTER? 0=

Para Z y X definiríamos esta palabra:

Código: Seleccionar todo

 : ZX?
  65278 IN 12 AND
 ;


Considerando que Z corresponde al bit 2 (el de los 4) y X al bit 3 (el de los 8) y que estos bits valen 0 cuando se pulsa la tecla correspondiente, tenemos que ZX? nos devuelve:

  • 8 cuando se pulsa Z y NO está X pulsada
  • 4 cuando se pulsa X y NO está Z pulsada
  • 0 cuando se pulsan X y Z a la vez
  • 12 cuando no se pulsan ni X ni Z

En los cuatro casos, puede haber otras teclas pulsadas y ZX? seguirá dando el mismo resultado.

En nuestro ejemplo del NuI cambiaríamos en la palabra MOVER

INKEY 120 =

por

ZX? 4 =

y

INEKY 122 =

por

ZX? 8 =

Ahora podemos movernos y disparar a la vez sin problemas.

NOTA: En este ejemplo, así modificado, tras jugar un rato, veo que acabo manteniendo el ENTER siempre pulsado (disparando siempre) y me limito a irme moviendo/parando con Z y X. Para este viaje no hacían falta estas alforjas, pues si juego siempre así, basta con modificar DISPARO para que dispare siempre (sin detectar si se pulsa ENTER) y solucionado el tema.... siendo entonces ZX? y ENTER? ambas innecesarias.

jltursan
Mensajes: 4615
Registrado: 20 Sep 2011 13:59
Ubicación: Madrid
Agradecido : 666 veces
Agradecimiento recibido: 1501 veces
Contactar:

Re: Jupiter Ace Forth: Utilidades

Mensajepor jltursan » 26 May 2022 10:19

Aparte de saber un poco más acerca de los puertos empleados para lectura del teclado en el JA, este último apartado dedicado al "Nuclear Invaders" merecería ser separado en un hilo específico con posibles mejoras al juego ya que sería muy ilustrativo.

Concretamente, el disparo continuo creo que arruinaría un poco la experiencia del juego y me da que no sería apropiado. Tampoco sé si el que tengas que dejar de moverte para poder disparar (aprovechando la limitación del INKEY) se ha convertido en una "feature" del juego; pero es cierto que eso a mí me resulta molesto en un juego.
Yo lo que suelo hacer en estos casos es, por supuesto, permitir la pulsación simultánea; pero el disparo siempre va acompañado de un temporizador que se activa en el momento en el que se dispara y que hasta que no se decrementa de vuelta a 0, no permite volver a disparar. De esa manera evitamos el "truco" de mantener pulsado el disparo todo el rato y además, conseguimos que regulando el temporizador, podamos hacer el juego más difícil o fácil a voluntad o quizás, pasando niveles (menos disparos = más dificultad).

Ahora, para gustos, colores...:-)

Elurdio
Mensajes: 404
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 87 veces
Agradecimiento recibido: 83 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 26 May 2022 10:59

jltursan escribió:Aparte de saber un poco más acerca de los puertos empleados para lectura del teclado en el JA, este último apartado dedicado al "Nuclear Invaders" merecería ser separado en un hilo específico con posibles mejoras al juego ya que sería muy ilustrativo.

Concretamente, el disparo continuo creo que arruinaría un poco la experiencia del juego y me da que no sería apropiado. Tampoco sé si el que tengas que dejar de moverte para poder disparar (aprovechando la limitación del INKEY) se ha convertido en una "feature" del juego; pero es cierto que eso a mí me resulta molesto en un juego.
Yo lo que suelo hacer en estos casos es, por supuesto, permitir la pulsación simultánea; pero el disparo siempre va acompañado de un temporizador que se activa en el momento en el que se dispara y que hasta que no se decrementa de vuelta a 0, no permite volver a disparar. De esa manera evitamos el "truco" de mantener pulsado el disparo todo el rato y además, conseguimos que regulando el temporizador, podamos hacer el juego más difícil o fácil a voluntad o quizás, pasando niveles (menos disparos = más dificultad).

Ahora, para gustos, colores...:-)


Como bien dices, el disparo continuo se puede impedir. Otro modo habitual es activar un flag cuando se pulsa por primera vez la tecla (flag que si está activo en la próxima comprobación, no permite la acción de la tecla en cuestión) y solo se desactiva cuando se deja de pulsar la tecla. Esto permite el disparar rápido "manualmente" a base de pulsar repetidamente la tecla.

En cuanto a lo del hilo de posibles mejoras, solo he usado el NuI como ejemplo de las limitaciones de INKEY. Podía haber usado otro juego/programa. De hecho, tal como digo en la nota y tú mismo comentas ("feature"), más bien lo he estropeado.... -banghead

EDIT: Por si no me he explicado bien: Cuando digo "disparo continuo" me refiero a que dispara manteniendo pulsada la tecla ENTER. No tienes que soltar la tecla y volver a pulsar a cada disparo. Esto ya era así sin la modificación. Solo que ahora puedes hacerlo incluso moviéndote. NuI tiene una frecuencia de disparos determinada y es la misma con o sin esta modificación.

jltursan
Mensajes: 4615
Registrado: 20 Sep 2011 13:59
Ubicación: Madrid
Agradecido : 666 veces
Agradecimiento recibido: 1501 veces
Contactar:

Re: Jupiter Ace Forth: Utilidades

Mensajepor jltursan » 26 May 2022 13:49

Sí, ya suponía que había disparo continuo (si no te movías, claro). A mí es que me gusta mucho más el modelo con el temporizador dado que se puede ajustar; pero claro, eso ya entra dentro de la categoría de "mejoras" al juego...o simplemente modificaciones, que igual no pueden considerarse mejoras ;-)

Coincido en que desde luego, si al menos ya se puede mover uno a la vez queda todo más fluido; peeero...seguro que eso reduce la dificultad :roll:

Elurdio
Mensajes: 404
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 87 veces
Agradecimiento recibido: 83 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 23 Jun 2022 22:21

Elurdio escribió:
Elurdio escribió:Revisando los ficheros que adjuntó @ron en este post encontré éste:

Mathematical & Trigonometrical Functions (1983)(Remsoft)(GB)[tape 21][19K] como snapshot del programa que buscaba desde hace tiempo tiempo sin éxito.

He estado probando la función SIN (a partir de la cual se calculan COS, etc) y en modo FAST es casi dos veces y media más rápido que el SIN que viene descrito en el manual del JA. Y con una precisión muy parecida (ligeramente inferior en promedio).


Por fin ya está disponible en Jupiter Ace Archive (tenía su página, pero no había un link para bajarlo). El manual es muy detallado y el programa viene como .TAP.


Me he dado cuenta que el fichero .TAP del Jupiter Ace Archive está corrompido. Cuando lo bajé me leí el PDF que le acompaña pero seguí utilizando el .TAP que me grabé a partir del Snapshot del listado de programas de Ron, por lo que no me di cuenta.

Hoy, al buscarlo para modificar algún aspecto del mismo, como no encontraba el que uso normalmente, me lo bajé del "Archive" y así me he percatado del fallo.

Elurdio
Mensajes: 404
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 87 veces
Agradecimiento recibido: 83 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 04 Jul 2022 10:54

Elurdio escribió:
Elurdio escribió:
Elurdio escribió:Revisando los ficheros que adjuntó @ron en este post encontré éste:

Mathematical & Trigonometrical Functions (1983)(Remsoft)(GB)[tape 21][19K] como snapshot del programa que buscaba desde hace tiempo tiempo sin éxito.

He estado probando la función SIN (a partir de la cual se calculan COS, etc) y en modo FAST es casi dos veces y media más rápido que el SIN que viene descrito en el manual del JA. Y con una precisión muy parecida (ligeramente inferior en promedio).


Por fin ya está disponible en Jupiter Ace Archive (tenía su página, pero no había un link para bajarlo). El manual es muy detallado y el programa viene como .TAP.


Me he dado cuenta que el fichero .TAP del Jupiter Ace Archive está corrompido. Cuando lo bajé me leí el PDF que le acompaña pero seguí utilizando el .TAP que me grabé a partir del Snapshot del listado de programas de Ron, por lo que no me di cuenta.

Hoy, al buscarlo para modificar algún aspecto del mismo, como no encontraba el que uso normalmente, me lo bajé del "Archive" y así me he percatado del fallo.


He visto que ya lo corrigieron y han puesto el que les mandé corregido que no es más que el snapshot que puso @ron grabado como .tap

Elurdio
Mensajes: 404
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 87 veces
Agradecimiento recibido: 83 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 11 Jul 2022 12:56

Una palabra compilante de usuario podría ser un GOTO parecido al del BASIC.

Aunque Forth no la necesita, y de hecho, no es aconsejable disponer de ella desde el punto de vista de la programación estructurada, puede ser un buen ejercicio de creación de palabras compilantes de usuario.

Voy a pensarlo y proponer mi enfoque. A priori se presenta bastante más complicado que el NEXT.

jltursan
Mensajes: 4615
Registrado: 20 Sep 2011 13:59
Ubicación: Madrid
Agradecido : 666 veces
Agradecimiento recibido: 1501 veces
Contactar:

Re: Jupiter Ace Forth: Utilidades

Mensajepor jltursan » 11 Jul 2022 15:43

Así en frío no acabo de ver cual podría ser ese enfoque, a ver cual es tu propuesta... -grin

Elurdio
Mensajes: 404
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 87 veces
Agradecimiento recibido: 83 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 11 Jul 2022 22:02

Un GOTO no deja de ser un salto. Puede ser adelante o hacia atrás. El GOTO lleva pareja su etiqueta o LABEL.

Así un GOTO hacia atrás sería del tipo de un DO/LOOP dónde DO hace de LABEL y LOOP de GOTO, pero más sencillo pues es incondicional. O del tipo BEGIN/UNTIL con BEGIN de LABEL y UNTIL de GOTO también incondicional.

Un GOTO hacia adelante tenemos símiles en IF/THEN cuando la condición es falsa o ELSE/THEN donde ELSE es el GOTO y THEN el LABEL. También el NEXT es un salto hacia adelante (el LABEL es el ULOOP). Etc.

Lo que hay que pensarse es la manera de hacerlo, los detalles:

  • Si tienen que ir emparejados, o sea, cada GOTO con su LABEL o si permitimos que diferentes GOTOs puedan apuntar al mismo LABEL.
  • Si consideramos cada tipo de GOTO por separado. Así habría un GOTOF (de goto forward) y un GOTOB (de goto backward) o un solo GOTO para ambos casos.
  • Etc.

Digamos que podemos ir a un esquema sencillo de programar pero incómodo de usar o a un esquema más complejo de programar pero más amigable desde el punto de vista de Forth.... y que sea posible.

Además hay que ver como nos manejamos con los GOTO que mandan fuera de un bucle (o varios anidados). Hay que hacer una palabra que se utilice antes del GOTO para tales casos (algo así como KILL_LOOP). Etc.

Vamos, todo un entretenimiento.

Elurdio
Mensajes: 404
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 87 veces
Agradecimiento recibido: 83 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 12 Jul 2022 12:42

Voy a intentar un primer enfoque que sea "fácil" de programar. Luego ya miraré de irlo complicando para que sea más Forth-Friendly.

En esta primera versión preliminar:

  1. Cada etiqueta irá asociada a un GOTO. Si varios GOTOs apuntan a un mismo sitio, pues allí habrá tantas etiquetas como GOTOs.
  2. Habrá dos tipos de GOTO con sus dos tipos de LABEL.
    • GOTOF/LABELF para el Salto Adelande = Forward Jump
    • LABELB/GOTOB para el Salto Atrás = Backward Jump
  3. Habrá una palabra a ejecutar antes del GOTO si manda fuera de un bucle DO/LOOP (o varios anidados).
  4. Un GOTO no puede mandar, desde fuera de un bucle DO/LOOP, a una etiqueta que esté dentro del mismo.
  5. Las etiquetas serán numéricas.
  6. Hay vigilar que el GOTO o el LABEL no estén dentro de un par >R/R>. Y si es así, saber muy bien lo que se está haciendo.

El punto 1: En el caso de un GOTO hacia adelante no veo problema alguno en usar una sola etiqueta con varios GOTOs. De hecho es el caso de NEXT (GOTO), todos apuntan al mismo ULOOP (LABEL). Más complicado veo el caso inverso, hacia atrás. De ahí que, de momento, voy a lo "fácil" y cada oveja con su pareja.

El punto 2: Esto lo intentaré simplificar en enfoques posteriores. Lo ideal, un solo GOTO y un solo LABEL tanto si el salto es hacia atrás como hacia adelante.

El punto 3: La llamaré KILLOOP y esperará en la pila el número de LOOPs de los que va a salir.

El punto 4: Esto es inherente al modo en que Forth opera con los LOOPs. Es el DO el que carga los límites. Si un GOTO que está fuera del bucle DO/LOOP, manda a un LABEL dentro del bucle DO/LOOP, el DO no habrá cargado los límites y cuando se ejecute el LOOP... desastre al canto.

El punto 5: Se podrían usar etiquetas alfabéticas de un solo carácter de un modo indirecto. Así, las etiquetas numéricas esperan su número en la pila:

66 LABEL

y esto es lo que aparece al listar la palabra que la contiene. Pero se podría hacer así:

ASCII B LABEL

que es lo mismo, pero al listar vemos una etiqueta alfabética de un solo carácter precedida de ASCII.

Elurdio
Mensajes: 404
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 87 veces
Agradecimiento recibido: 83 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 15 Jul 2022 09:09

<Off-Topic> Curiosidades de la vida, al igual que me sucedió cuando el NEXT, con el GOTO se ha dado la misma circunstancia: Fue proponerlo y "engancharme" con un video juego que se está quedando con casi todo mi tiempo libre... y los dos de van zombies.

Elurdio
Mensajes: 404
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 87 veces
Agradecimiento recibido: 83 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 15 Jul 2022 11:21

Hace unos días hice la versión código máquina de la parte RUNS> de NEXT. En principio el NEXT debería ser la excepción, con lo que en un bucle se ejecutaría pocas veces. Pero puede darse el caso que el NEXT sea el mayoritario, así que decidí "acelerarlo" haciendo su runtime en código máquina.

El ciclo DO/NEXT/ULOOP va el doble de rápido que el de la versión solo Forth. A este Runtime de NEXT lo he llamado MCNEXT (debería haberlo llamado NEXTMC, al estilo de ULOOPMC, pero lo hice al revés... -banghead y así se ha quedado).

MCNEXT

Código: Seleccionar todo

        .LIST
   
        RST     18H         ; DE = Data Stack top number. DE points to NEXT's OFA
       
        LD      H,D         ; BC = NEXT's OF = (OFA)
        LD      L,E
        LD      C,(HL)
        INC     HL
        LD      B,(HL) 
       
        EX      DE,HL       ; HL = Address ULOOP's compiled CFA
        ADD     HL,BC   
       
        POP     DE          ; Replace in Return Stack tha address of the next compiled CFA (the one just after NEXT)
        POP     BC          ; with ULOOP's compiled CFA, so it will be the next executed one.
        PUSH    HL
        PUSH    DE     
       
        JP      (IY)        ; Back to Forth.
       
        .END


Hay que modificar NEXT, dejando en la parte RUNS> solo MCNEXT tal como muestro a continuación y redefinir NEXT

NEXT

Código: Seleccionar todo

2 COMPILER NEXT
 3 SEARCH>10 DUP 0=
 IF
  5 ERROR
 THEN
 1+ DUP >R 5 SWAP
 ENCRUST HERE R> 1+ ENCRUST
 0 ,
RUNS>
 MCNEXT
;


mcnext.TZX
(114 Bytes) Descargado 2 veces


Volver a “Jupiter Ace”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado