Este artículo explora la fascinante historia de la emulación de la Unidad de Punto Flotante (FPU) Intel 8087 en sistemas 8086/8088. En la década de 1980, la FPU 8087 era un componente costoso y no siempre disponible en los sistemas, pero crucial para aplicaciones como hojas de cálculo. Para permitir que el software utilizara la FPU cuando estaba presente, pero aún funcionara en máquinas sin ella, Intel desarrolló el paquete de emulación de software E8087.
El proceso de emulación era complejo y requería la colaboración de ensambladores, compiladores, enlazadores y bibliotecas en tiempo de ejecución. Los compiladores generaban código “emulable” que incluía “fix-ups” especiales para las instrucciones ESC de la FPU. Durante el enlazado, se decidía si se debía usar la emulación o no, con la opción de enlazar con una biblioteca de emulación o una biblioteca sin emulación. Cuando se usaba la emulación, el enlazador reemplazaba ciertas secuencias de código (NOP/ESC o WAIT/ESC) con llamadas a interrupciones de software (INT). Intel inicialmente usó las interrupciones 18h-1Fh, mientras que Microsoft, en su implementación para DOS, las cambió a 34h-3Dh, requiriendo 10 vectores en lugar de 8.
Una mejora significativa de Microsoft fue la capacidad de detectar la presencia de una FPU real durante el inicio del programa. Si se detectaba una FPU, el emulador reemplazaba dinámicamente las instrucciones de software INT con las instrucciones NOP o WAIT originales más el código ESC correspondiente, permitiendo que el programa se ejecutara a velocidad nativa. Esto permitía distribuir software que se beneficiaba de la FPU si estaba presente, pero que aún funcionaba en sistemas sin ella.
El artículo también examina la implementación de Microsoft en el ensamblador MASM, mostrando cómo se generaba el código emulable y los “fix-ups” que se añadían. Se destaca que las versiones más antiguas de MASM tenían limitaciones en el manejo de ciertas instrucciones de punto flotante, lo que subraya la complejidad de la emulación de hardware en sistemas de la época. En resumen, la emulación de la FPU 8087 fue una solución ingeniosa para permitir la compatibilidad con hardware variable y facilitar el desarrollo de software de punto flotante en una época de recursos limitados.
