Jupiter Ace Forth: Utilidades

Elurdio
Mensajes: 410
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 90 veces
Agradecimiento recibido: 84 veces

Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 05 Ene 2022 13:00

Hola,

Aunque ya sé que es como escribir en saco roto, pues esto del Ace Forth está bastante muerto :( (y digo "bastante" por ser optimista...) , voy a ir publicando aquí, en este tema, diversas palabras (o grupos de palabras) que voy haciendo y también copiando de otras fuentes. De éstas últimas intentaré en la medida de lo posible dar crédito de su autoría. Bienvenida será cualquier contribución.

Avatar de Usuario
minter
Mensajes: 4087
Registrado: 22 Jul 2014 18:51
Agradecido : 5476 veces
Agradecimiento recibido: 2078 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor minter » 05 Ene 2022 15:17

Bueno, tu intentalo.
Que te hagamos caso, eso ya es otra historia.

Si piensas que hay poca gente que emplea el Forth... consuelate viendo cuanta gente tiene un Oric. -11

QUe es un Oric? -507

Avatar de Usuario
Luis
Mensajes: 1746
Registrado: 03 Nov 2010 19:00
Agradecido : 1055 veces
Agradecimiento recibido: 502 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Luis » 05 Ene 2022 15:31

La verdad es que pocos usamos el Forth o el Jupiter ACE por aquí, pero tengo que decir que tus posts son una joya. Me están dando ganas de darle vidilla a un viejo kit que compré hace años, llamado FIGnition, que es un ordenador en una pequeña plaquita que precisamente usa el Forth del Jupiter ACE, o muy similar.
AHA! YOU GOT THE WUMPUS!
HEE HEE HEE - THE WUMPUS'LL GET YOU NEXT TIME!!

Elurdio
Mensajes: 410
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 90 veces
Agradecimiento recibido: 84 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 05 Ene 2022 15:58

minter escribió:Bueno, tu intentalo.
Que te hagamos caso, eso ya es otra historia.

Si piensas que hay poca gente que emplea el Forth... consuelate viendo cuanta gente tiene un Oric. -11

QUe es un Oric? -507


Hace muuucho tiempo ayudé a mi vecino (que estudiaba empresariales) con el Oric-1 de su hermano (que estudiaba Caminos) a hacer un programa para multiplicar matrices... Es la úniva vez que he usado uno. Era una buena máquina en aquellos tiempos.

Elurdio
Mensajes: 410
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 90 veces
Agradecimiento recibido: 84 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 05 Ene 2022 15:59

Luis escribió:La verdad es que pocos usamos el Forth o el Jupiter ACE por aquí, pero tengo que decir que tus posts son una joya. Me están dando ganas de darle vidilla a un viejo kit que compré hace años, llamado FIGnition, que es un ordenador en una pequeña plaquita que precisamente usa el Forth del Jupiter ACE, o muy similar.


Has despertado mi curiosidad con el FIGnition... cuéntame más.

Yo estuve a punto de comprarme el Minstrel4th pero he preferido seguir con los emuladores.

Elurdio
Mensajes: 410
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 90 veces
Agradecimiento recibido: 84 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 05 Ene 2022 16:06

Palabras para cálculos en Coma Flotante:

Conjunto de palabras sacadas del manual del Jupiter Ace y de Jupiter Ace Archive.

Código: Seleccionar todo


: 2!
 ROT OVER ! 2+ !
;
 
: 2@
 DUP @ SWAP 2+ @
;
 
DEFINER 2VARIABLE
 SWAP , ,
DOES>
;
 
DEFINER 2CONSTANT
 SWAP , ,
DOES>
 2@
;
 
: 2DROP
 DROP DROP
;
 
: 2DUP
 OVER OVER
;
 
: 2SWAP
 4 ROLL 4 ROLL
;
 
: 2OVER
 4 PICK 4 PICK
;
 
: 2ROLL
 DUP + DUP ROLL SWAP
 ROLL SWAP
;
 
: 2ROT
 6 ROLL 6 ROLL
;
 
: 2PICK
 DUP + DUP 1+ PICK
 SWAP PICK
;
 
: 2?DUP
 2DUP OR
 IF
  2DUP
 THEN
;
 
: FLOAT
 DUP 0< SWAP ABS UFLOAT
 ROT
 IF
  FNEGATE
 THEN
;
 
: F0<
 SWAP DROP 0<
;
 
: SQRT
 1. 10 0
 DO
  2OVER 2OVER F/ F+ .5
  F*
 LOOP
 2SWAP 2DROP
;
 
: SIN
 2DUP 2DUP 2DUP F* FNEGATE
 2ROT 2ROT 27 2
 DO
  6 PICK 6 PICK F*
  I I 1+ * UFLOAT
  F/ 2DUP 2ROT F+ 2SWAP
  2
 +LOOP
 2DROP 2SWAP 2DROP
;
 
: COS
 1.5708 2SWAP F- SIN
;
 
: TAN
 2DUP SIN 2SWAP COS F/
;

: LN
 DUP 256 / UFLOAT 65.
 F- 2.30528 F* 2SWAP 255
 AND 16640 + 2DUP 1.
 F- 2SWAP 1. F+ F/
 2DUP 2DUP F* 2OVER 31
 3
 DO
  2OVER F* 2ROT 2OVER I
  UFLOAT F/ F+ 2ROT 2ROT
  2
 +LOOP
 2DROP 2DROP 2. F* F+
;
 
: LOG
 LN 2.30258 F/
;
 
: EXP
 1. 2SWAP 1. 31 1
 DO
  2OVER I UFLOAT F/ F*
  2ROT 2OVER F+ 2ROT 2ROT
 LOOP
 2DROP 2DROP
;
 
: F^
 2SWAP LN F* EXP
;



EDIT: (23-01-2022) He visto que aquí está disponible COMPLETO (Floating Point Dictionary)

Avatar de Usuario
Luis
Mensajes: 1746
Registrado: 03 Nov 2010 19:00
Agradecido : 1055 veces
Agradecimiento recibido: 502 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Luis » 05 Ene 2022 18:21

Elurdio escribió:Has despertado mi curiosidad con el FIGnition... cuéntame más.

Yo estuve a punto de comprarme el Minstrel4th pero he preferido seguir con los emuladores.


Es algo viejuno ya, de 2011 o por ahí. He visto que en esta página todavía venden el kit:

https://es.rs-online.com/web/p/ordenado ... ca/7755003

Es un ordenador diminuto, y con un teclado de 8 teclas, el cual se usaba combinando esas teclas unas con otra y con una tabla podías conseguir cualquier carácter. Con práctica se conseguía hasta buena velocidad.

Los clones Minstrel están chulos... pero menudos precios!!
AHA! YOU GOT THE WUMPUS!
HEE HEE HEE - THE WUMPUS'LL GET YOU NEXT TIME!!

jltursan
Mensajes: 4622
Registrado: 20 Sep 2011 13:59
Ubicación: Madrid
Agradecido : 667 veces
Agradecimiento recibido: 1506 veces
Contactar:

Re: Jupiter Ace Forth: Utilidades

Mensajepor jltursan » 05 Ene 2022 18:52

Mmmm, ¿y no hay un entorno baremetal para la Pi con el Forth como lenguaje base? -grin

Reconozco que si tengo un Hector HRX es por culpa de ser otro de los ordenadores que tienen Forth como lenguaje :-).

Elurdio
Mensajes: 410
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 90 veces
Agradecimiento recibido: 84 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 05 Ene 2022 22:21

Luis escribió:Es algo viejuno ya, de 2011 o por ahí. He visto que en esta página todavía venden el kit:

https://es.rs-online.com/web/p/ordenado ... ca/7755003

Es un ordenador diminuto, y con un teclado de 8 teclas, el cual se usaba combinando esas teclas unas con otra y con una tabla podías conseguir cualquier carácter. Con práctica se conseguía hasta buena velocidad.

Los clones Minstrel están chulos... pero menudos precios!!


Sí que es pequeño. Pero esos son para robótica y tal, ¿o no?.

Algunas cosas que he hablado en otros hilos solo se aplican al Jupiter Ace. El minstrel4th es un clon del JA. Hecho casi con los mismos circuitos que el original. Contacté con la casa que lo vende y me dijeron que sólo les quedan de los que van en kit, ya no tienen de los ya montados. Eso me paró. Había mirado el accesorio para ponerle un SD en lugar de usar cintas Jester ACE que tampoco les quedan ya montados. En fin, mejor, pues ahora prefiero usar el emulador, menos complicaciones.

Elurdio
Mensajes: 410
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 90 veces
Agradecimiento recibido: 84 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 05 Ene 2022 22:23

jltursan escribió:Mmmm, ¿y no hay un entorno baremetal para la Pi con el Forth como lenguaje base? -grin

Reconozco que si tengo un Hector HRX es por culpa de ser otro de los ordenadores que tienen Forth como lenguaje :-).


Me suena mucho el Hector ese, no era uno que funcionaba internamente con Forth, que estaba un poco escondido, que se accedía indirectamente, no? Igual me confundo, no me hagas mucho caso.

NOTA: No, he mirado en internet y no era ese.
NOTA2: Ese se ve mucho más potente que el JA!!

EDIT: (25-01-2022) Hoy por casualidad me he encontrado al que me refería por error, era el CANON CAT
EDIT: (21-02-2022) Resulta que ya se habló de él aquí , en Retrowiki.

Elurdio
Mensajes: 410
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 90 veces
Agradecimiento recibido: 84 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 06 Ene 2022 00:50

Bucle enteros sin signo

Estas palabras, conjuntamente con la estructura BEGIN/UNTIL permiten crear un sencillo bucle con contador de entero sin singo. O sea, que funciona con límites con valores entre 0 y 65535. Lo que viene muy bien si el índice del bucle son posiciones de memoria, pues ese es su rango máximo. Son tres palabras:

UDO
ULOOP
ULEAVE

Como se ve son las equivalentes de DO , LOOP y LEAVE en versión "Unsigned".

Código: Seleccionar todo

: UDO
 R> ROT >R SWAP >R
 >R
;
 
: ULOOP
 R> R> 1+ >R >R
 I' J U< 0= DUP
 IF
  R> R> R> DROP DROP
  >R
 THEN
;
 
: ULEAVE
 R> R> DROP R> DUP
 >R >R >R
;


Ejemplo de uso:

final inicio
UDO
BEGIN
·
·
Cuerpo del bucle
·
·
ULOOP
UNTIL

Donde final e inicio son dos enteros que se toman sin signo.

Funcionan I I' y J tal como se haría en los DO/LOOP normales pudiéndose también anidar.

UDO solo se ejecuta una vez, pero ULOOP se repite dentro del bucle BEGIN/UNTIL. Esto hace que este bucle sea bastante más lento que el DO/LOOP. Si hacemos una versión en código máquina del ULOOP Forth, la cosa mejora mucho. Así, para un bucle vacío de 10.000 vueltas obtengo (velocidad emulador x1):

(modo SLOW)
DO/LOOP 1.2 segundos
UDO/ULOOP 19.8 segundos con ULOOP en Forth
UDO/ULOOP 2.7 segundos con ULOOP en código máquina (en mi chapucero código máquina)

Pero en general, a la que el cuerpo tenga unas cuantas palabras, no se notará tanto este efecto.

Este es mi versión de ULOOP en código máquina (Assembler/Disassembler de BoldField)

Código: Seleccionar todo

code uloop
      \ ld hl,NN    \ 2 ))
      \ add hl,sp   \
      \ inc(hl)     \
      \ jr nz,DIS   \ ~ a
      \ inc hl      \
      \ inc(hl)     \
 ` a  \ pop de      \
      \ pop bc      \
      \ pop hl      \
      \ push hl     \
      \ push bc     \
      \ push de     \
      \ or a        \
      \ sbc hl,bc   \
      \ jr z,DIS    \ ~ b 
      \ jr c,DIS    \ ~ b
      \ ld de,NN    \ 0 ))
      \ jr DIS      \ ~ c
 ` b  \ ld de,NN    \ 1 ))
      \ pop hl      \
      \ pop bc      \
      \ pop bc      \
      \ push hl     \
 ` c  \ rst16       \
      \ jp(iy)      \
endc



NO es lo mejor, pero ya hace muchísimo tiempo que no me las veía con el assembler del Z80 y esto es lo que hay mientras no lo mejore alguien (invitados estáis).

Adjunto diccionario UBUCLE con ULOOP en código máquina (la versión Forth está en el fuente de arriba)

EDIT: (21-2-2022) La palabra ULEAVE es innecesaria. LEAVE funciona también con estos bucles DO/ULOOP

ubucle.TZX
Diccionario UBUCLE
(180 Bytes) Descargado 12 veces

Elurdio
Mensajes: 410
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 90 veces
Agradecimiento recibido: 84 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 06 Ene 2022 10:31

Dispatch Table

Hace un tiempo, buscando info sobre el Jupiter Ace me encontré con esto en Seeking Inspiration from Jupiter Ace Forth:

: mux ( n -- xt ) 2* r> + @ ;
: operations ( n -- xt ) mux + - * / ;
7 3 1 operations execute .

Me quedé boquiabierto. Muy ingenioso el uso de R> sin su correspondiente >R en MUX

Si me hubiera propuesto hacer algo así, lo hubiera programado de un modo mucho más convencional, haciendo uso por ejemplo de COMPILE en combinación con DEFINER o COMPILER. Pero entonces habría que tener mucho cuidado con los REDEFINE/LOAD que podrían, según las circunstancias, volver la palabra inútil.

Elurdio
Mensajes: 410
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 90 veces
Agradecimiento recibido: 84 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 06 Ene 2022 22:59

Volcado Hex

Un volcado de memoria a tres columnas de 16 bytes cada una. Muestra dirección hexadecimal y su contenido en hexadecimal y en ascii.

SHOWV espera en la pila la dirección en la que comenzar el volcado y deja la dirección del siguiente bloque, para poder encadenar listados.

H. H2. y H4. también son útiles por sí solas, pues imprimen un entero de la pila en hexadecimal sin formato, a dos dígitos y a cuatro dígitos respectivamente sin afectar a la base numérica en curso.

Código: Seleccionar todo


DECIMAL

: H.
 BASE DUP C@ SWAP 16
 OVER C! ROT U. C!
;
 
: H2.
 DUP 16 U<
 IF
  ASCII 0 EMIT
 THEN
 H.
;
 
: H4.
 DUP 4096 U<
 IF
  ASCII 0 EMIT DUP 256 U<
  IF
   ASCII 0 EMIT
  THEN
 THEN
 H2.
;
 
: >31EMIT
 DUP 31 >
 IF
  EMIT
 ELSE
  DROP SPACE
 THEN
;
 
: HLINES
 DUP DUP H4. C@ DUP
 H2. >31EMIT
;
 
: SHOWV
 16 0
 DO
  DUP I + CR HLINES
  2 SPACES 16 + HLINES
  2 SPACES 16 + HLINES
  DROP
 LOOP
 48 +
;



showv.TZX
(337 Bytes) Descargado 11 veces

zxpope
Mensajes: 232
Registrado: 02 Ene 2018 02:25
Agradecido : 80 veces
Agradecimiento recibido: 88 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor zxpope » 07 Ene 2022 00:17

minter escribió:Bueno, tu intentalo.
Que te hagamos caso, eso ya es otra historia.

Si piensas que hay poca gente que emplea el Forth... consuelate viendo cuanta gente tiene un Oric. -11

QUe es un Oric? -507


curiosamente conozco una persona que no lee este foro
que tiene un oric y que programa exclusivamente en forth en pic stm32 etc..

como ya esta retirado, no tiene la necesidad de evolucionar

:-)

Elurdio
Mensajes: 410
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 90 veces
Agradecimiento recibido: 84 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 07 Ene 2022 22:10

Otros VLIST

Tengo un par de VLIST alternativos que uso con frecuencia. Eso sí, al menos de momento, están pensados para sesiones sin otros VOCABULARYs que el FORTH por defecto. No sé que harían si los hubiera (hasta hoy no he utilizado vocabularios extras)

ULIST Es como el VLIST pero solo muestra las palabras definidas por el usuario. Equivale a ejecutar VLIST y hacer un BREAK muy preciso justo antes que se visualice la palabra FORTH.

WLIST Es un listado vertical de todas la palabras de usuario indicando detalles de cada una. Ejemplo:
wlist.jpg
wlist.jpg (88.66 KiB) Visto 1175 veces


Cada línea contiene: NOMBRE TIPO TAMAÑO en bytes
Si nombre mayor de 15 caracteres lo trunca con el guion en video inverso.
Si inmediata, I en video inverso.

Así, por ejemplo, vemos que ZMATRIX es la palabra tipo DEFINER con la que se han definido ZM_NULES y ZM_POLES.

Código: Seleccionar todo


DECIMAL

: VNAME
 DUP 2- @ SWAP DUP
 4 - SWAP C@ 63
 AND OVER SWAP -
 DO
  I C@ 127 AND EMIT
 LOOP
 SPACE
;

: ULIST
 CR CURRENT @ @
 BEGIN
  VNAME DUP 15434 U<
 UNTIL
 DROP
;

: D->PAD
 DUP >R DUP 0<
 IF
  DNEGATE
 THEN
 <# #S R> SIGN #>
;
 
: PF_SIZE
 DUP 7 - @ ?DUP
 0=
 IF
  HERE OVER -
 ELSE
  7 -
 THEN
 SWAP DROP
;
 
: D.R.
 >R D->PAD R> OVER -
 SPACES TYPE
;
 
: S->D
 DUP 0<
 IF
  -1
 ELSE
  0
 THEN
;
 
: W_SIZE
 DUP 5 - @ ?DUP
 0=
 IF
  HERE OVER - 5 +
 THEN
 SWAP 1- C@ 63 AND
 +
;
 
: TAB
 15388 @ - 31 AND
 SPACES
;
 
: PARENT
 DUP 2- @ + 2-
 BEGIN
  1+ DUP C@ DUP 127
  AND EMIT 128 AND
 UNTIL
 DROP
;
 
: MC?
 ( CFA - CFA,f)
 DUP @ >R DUP 1+
 OVER 2+ DUP PF_SIZE +
 I > SWAP R> <
 AND
;
 
: VNAME3
 DUP DUP DUP 2- @
 SWAP DUP 4 - SWAP
 C@ 63 AND OVER SWAP
 - 0 ROT ROT
 DO
  1+ DUP 16 =
  IF
   LEAVE ASCII ­ EMIT
  ELSE
   I C@ 127 AND EMIT
  THEN
 LOOP
 DROP 16 TAB SWAP DUP
 C@ 64 >
 IF
  ASCII I 128 + EMIT SPACE
 THEN
 1+ MC?
 IF
  DUP @ 2- =
  IF
   ." Mach. Code"
  ELSE
   ." M.C.ADR"
  THEN
 ELSE
  @ PARENT
 THEN
 SWAP 1+ 27 TAB W_SIZE
 S->D 4 D.R.
;
 
: WLIST
 0 CR CURRENT @ @
 BEGIN
  VNAME3 CR SWAP 1+ DUP
  22 =
  IF
   BEGIN
    INKEY
   UNTIL
   DROP 0
  THEN
  SWAP DUP 15434 U<
 UNTIL
 DROP DROP
;


EDIT (1-3-2022) Añadido Nuevo tipo de Palabra: Primitiva de Usuario Relocalizable con ADR. Se muestra como:
M.C. ADR Son palabras en código máquina (Boldfield) que se han de someter a ADR antes de ejecutar para que adapte el origen a su posición en el diccionario. Si se ejecutara sin someterla antes a ADR casi seguro que se cuelga el JA.
Adjuntos
w&ulist.TZX
(861 Bytes) Descargado 8 veces

Elurdio
Mensajes: 410
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 90 veces
Agradecimiento recibido: 84 veces

Re: Jupiter Ace Forth: Utilidades

Mensajepor Elurdio » 10 Ene 2022 23:00

En 1983 se propusieron estos Forth Benchmarks para comparar las distintas versiones de Forth en distintas máquinas de la época

En él se utiliza la palabra SP! para borrar la pila. Su definición en el JA sería:

: SP!
( n1, n2, ····, n - )
HERE 12 + 15419 !
;

Si se desea una versión más rápida en código máquina (aunque no es necesario para los benchmarks, pues se corrige su efecto en ellos). Esta versión alcanza la velocidad de la tabla del final.

Como siempre, pongo el listado para el Assembler and Dis-assembler de Boldfield

Código: Seleccionar todo

code sp!
     \ ld hl,(NN)    \ H 3C37 ))   
     \ ld bc,NN      \ H C ))
     \ add hl,bc     \
     \ ld(NN),hl     \ H 3C3B ))
     \ jp(iy)        \
endc


Aquí subo una tabla en la que el desarrollador del Toddy-Forth-79 para el ZX81 ((Kelly Abrantes Murta)) incluye también el Jupiter Ace (emulado a 1x). Curiosamente el JA es el más lento de todos.
NOTA: Los valores se han de corregir antes. De todos modos, dan una idea general aproximada.
Adjuntos
Forth Benchmarks.png
Forth Benchmarks.png (60.97 KiB) Visto 2256 veces


Volver a “Jupiter Ace”

¿Quién está conectado?

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