En/Je/On 2015-12-03 23:21, Miguel Angel Rodriguez Jodar
[email protected] [forth-es] escribió / skribis / wrote :

> Mira: el programa que puse en el correo anterior...
> 
> > : BOLD
> > 12288 11264 DO
> > I C@ DUP 2 * OR I C!
> > LOOP
> > ;
> 
> En C se haría así:
> 
> main()
> {
>    char *p = 11264;
> 
>    while (p!=12288)
>      *p++ = ((*p)<<1)|(*p);
> }
> 
> Como lo anterior puede no quedar muy claro para un neófito de C, el programa 
> se 
> puede reescribir para que quede un poco más claro:
> 
> main()
> {
>    char *p = 11264;
>    int i;
> 
>    for (i=0;i<1024;i++)
>      p[i] = (p[i]<<1) | p[i];
> }

Está claro. Gracias por los dos ejemplos.

En el modestísmo ACE Forth (que ni siquiera sigue un estándar de su
época, ni fig-Forth ni Forth-79), a falta de un operador para rotar
bitios,  se podría definir una palabra en Z80 que, dada una dirección,
haga toda la operación en el octeto que la dirección contiene,
llamémosla `BOLDER`.  Pero como ACE Forth no tiene una palabra para
definir palabras en ensamblador, que normalmente se llama `CODE`, hay
que definirla antes.

Y para que todo resulte tan engordado como clarito, lo llenamos de
comentarios :)

----
DEFINER CODE  ( "name" -- )  DOES>  ( a -- ) CALL  ;
  ( create a defining word "code" )

CODE BOLDER  ( c-addr -- )
  225 C,        ( pop hl )
  126 C,        ( ld a,[hl] )
  203 C, 39 C,  ( sla a )
  182 C,        ( or [hl] )
  119 C,        ( ld [hl],a )
  253 C, 233 C, ( jp [iy] )
  ( convert the scan in _c-addr_ to bold )

: BOLD  ( -- )  12288 11264 DO  I BOLDER  LOOP  ;
  ( convert the whole charset to bold )
----

También es posible prescindir de `code` y usar `call` en el bucle
para llamar directamente a la dirección de la rutina::

----
CREATE BOLDER   ( -- c-addr )

  ( c-addr -- )
  225 C,        ( pop hl )
  126 C,        ( ld a,[hl] )
  203 C, 39 C,  ( sla a )
  182 C,        ( or [hl] )
  119 C,        ( ld [hl],a )
  253 C, 233 C, ( jp [iy] )
  ( convert the scan in _c-addr_ to bold )

: BOLD  ( -- )  12288 11264 DO  I BOLDER CALL  LOOP  ;
  ( convert the whole charset to bold )
----

(Estos ejemplos no están probados porque ahora no tengo un emulador de
Jupiter ACE compilado en la Raspberry; de todas formas el juego de
caracteres no cambiaría en la máquina emulada).

En cualquier caso la mayor velocidad no justificaría crear una rutina en
Z80 solo para esto, pues modificar el juego de caracteres es una
operación que solo se haría una vez.

Lo que me parece interesante de este ejemplo es comprobar cómo las
limitaciones de una implementación tan modesta como ACE Forth no son un
problema.  Ampliar el propio lenguaje es la esencia de la programación
en Forth, eligiendo entre espacio o velocidad en cada punto crítico.

Esto es extrapolable a Forth en general, aunque por supuesto con una
implementación moderna de Forth estándar para una plataforma moderna la
cosa es diferente.  Equiparar Forth en general con ACE Forth en
particular no es posible.  Igualmente, comparar un Forth actual como
Gforth con ACE Forth sería como intentar comparar FreeBASIC con el BASIC
del ZX81...

Y por cierto, en opinión de muchos, entre los que me incluyo, el manual
de Jupiter ACE, de Steven Vickers (autor también del manual de ZX
Spectrum), es uno de los mejores manuales que se han escrito no solo de
Forth, sino de computadora y de programación en general.

Quien sienta curiosidad sobre Jupiter ACE y ACE Forth, puede visitar el
Jupiter ACE Archive:

  http://jupiter-ace.co.uk/

-- 
Marcos Cruz
http://programandala.net

Responder a