Mirándome el desensamblado de la ROM del Jupiter Ace he visto varias cosas interesantes.
1- Hay una subrutina en $084E que te pone en el par de registros BC el entero que hay en el top de la pila. Esto ya hace tiempo que lo sé, pero creo que no lo he comentado nunca.
2- Hay muchas Palabras de uso interno. Supongo que para ahorrar espacio las han hecho "Headerless" (sin cabecera). No es que no tengan cabecera, sino que tienen una cabecera con solo del Code Field, nada más.
El punto 1 puede ser de utilidad en assembler.
El punto 2 es interesante porque algunas de esas palabras "Headerless" pueden ser útiles.
A modo de ejemplo, voy a comentar una en concreto:
La que tiene su CFA en $0688. En el desemsamblado la han llamado "stk-zero". Simplemente coloca un cero en la pila. Además, es una primitiva, pues el contenido de su CFA apunta al inicio de su PF.
; ----------------------------
; The 'stk-zero' Internal Word
; ----------------------------
; ( -- 0 )
L0688: DEFW L068A ; headerless 'code field'
; ---
L068A: LD DE,$0000 ; load DE with the value zero.
RST 10H ; stack Data Word DE
JP (IY) ; to 'next'.
Lo que se me ha ocurrido es crear palabras que nos permitan usar estas "palabras internas" como una palabra más del Ace Forth. Lo que hago es crear un nuevo tipo de palabra. Las llamaré tipo "Internas".
Vienen a ser un tercer caso de primitivas: Las normales en las que (CFA) = PFA. Las "raras" de BoldField en las que (CFA) apunta dentro del PF pero no precisamente al inicio y ésta en las que (CFA) apunta a la ROM y no tienen PF.
En el caso del
stk-zero voy a crear la palabra
CERO así:
CREATE CERO
Ahora solo hemos de colocar en su
CF el contenido del
CF de
stk-zero que vale
$068A (1674)1674 CERO 2- !
Y ya tenemos nuestra palabra
CERO de tipo "Interno" y sin PF (Parameter Field).
CERO no es ni listable ni editable.
Vamos a ver que tal se porta:
: TEST1 0 ;
: TEST2 CERO ;
Mido los tiempos de ejecución en segundos para 10.000 veces.
Slow Fast
TEST1 1.7 0.9
TEST2 1.5 0.6
Vemos que en modo FAST la palabra CERO es un 50% más rápida que poner en la pila un cero compilado.
Hasta ahora he encontrado seis casos de palabras Headerless que pueden ser útiles:
- stk_zero $068A Coloca un cerro en la pila
- stk_digit $07BA Toma un número de la pila y si es el ascii de un carácter válido en la base actual devuelve el dígito correspondiente. En el top de la pila pone un flag: 1 si correcto 0 si inválido
- stk-char $0A09 Parece la inversa de la anterior, pero solo lo he mirado por encima.
- branch $1278 Unconditional branch.
- ?branch $128F Conditional branch
- check-for $12DA Check internal marker for control structure.
La que me interesan sobremaner son las tres últimas. Pues serían útiles en la creación de estructuras de control de usuario. Pero me temo que van a dar problemas. Ya lo estudiaré más adelante.
La pega está en que algunos de mis programas, como por ejemplo
WLIST y el Extractor de Fuentes Semiautomático
EXTRACTSOU fallarán si se encuentran con este tipo de palabras "Internas" al estilo
CERO.
De momento, dado que, por un lado, no me he encontrado nunca con este tipo de palabras, y por otro lado no veo que valgan la pena por los tres primeros casos, no modificaré nada.
En cambio, si los tres últimos, sobre todo el branch y el ?branch se pudieran aprovechar, sí me veo entonces dispuesto a crear las seis (y cualquier otra que vea) y modificar mis programas para este nuevo tipo de palabra "Interna".