Efectivamente, socio. asMSX utiliza aritmética de punto flotante de doble precisión para sus cálculos internos y después se puede convertir todo número a formato de punto fijo con fix(). La idea es la misma que para enteros: el bit más significativo vale 2^7, mientras que el menos significativo dentro de la palabra de 16 bits, vale 2^-8. Por lo tanto, en valor absoluto, el mayor valor representable sin signo sería 255,996 aproximadamente y el más pequeño 0,00390625, que coincide con la precisión de este formato.
La ventaja es que se pueden sumar directamente como enteros de 1 bits y el resultado es correcto. Podría hacerse lo siguiente:
ld hl,fix(2.50)
ld de,fix(1.75)
add hl,de
ld bc,fix(0.33)
add hl,bc
El valor contenido en los distintos registros al final de la ejecución sería el siguiente:
BC = 00 55 h
DE = 01 C0 h
HL = 04 94 h
Además, se pueden hacer restas del mismo modo, entendiendo entonces que los números tienen signo y están representados en complemento a dos.
Para hacerlo más fácil de entender, el asMSX además incluye la pseudoinstrucción PRINTFIX, que permite ver el valor en formato de punto fijo. Y se puede comparar entonces con PRINTHEX y lo que indica.
Supongo que se podría dar alguna explicación un poco más detallada, pero no dispongo de tiempo ahora para hacer un artículo al respecto.
Para hacer una tabla de senos para los ángulos comprendidos entre 0 y 90, bastaría con hacer lo siguiente:
SIN_TABLE:
angulo=0
rept 91
dw fix(sin(angulo*pi/180.0))
angulo=angulo+1
endr
Así tendríamos una maravillosa tabla de 91 x 2 = 182 bytes recogiendo el valor del seno para cada ángulo entre 0 y 90 grados, o lo que es lo mismo, entre 0 y pi/2 radianes. Por cierto, que el valor PI está definido por defecto en asMSX.