Me he decidido a portar el código de 500 FPS en un PC, a 16 bits. El código inicial ha requerido un par de ajustes uso de int86 en vez de int386, y el menos evidente el cast a long en el printf que calcula los FPS, para evitar pérdida de rango.

Luego ha habido que transformar el build.bat, para pasar los parámetros necesarios al compilador de 16 bits… Al final ha quedado así:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <conio.h>
#ifdef __WATCOMC__
#include <i86.h>
#else
#include <dos.h>
#endif

static unsigned char gacPerin[]={...};

int main (void)
{
register unsigned int iX;
clock_t clkStart, clkEnd;
union REGS udtRegs;

udtRegs.w.ax=0x13;
int86(0x10, &udtRegs, &udtRegs);

for (iX=0; iX<256; iX++)
{
outp(0x3C8, iX);
outp(0x3C9, (gacPerin[(iX*3)+64000])>>2);
outp(0x3C9, (gacPerin[(iX*3)+64001])>>2);
outp(0x3C9, (gacPerin[(iX*3)+64002])>>2);
}

iX=0;
clkStart=clock();
while (!kbhit())
{
memcpy((unsigned char *) MK_FP(0xA000, 0),
gacPerin, sizeof(gacPerin)-768);
iX++;
}
clkEnd=clock();
getch();

udtRegs.w.ax=0x3;
int86(0x10, &udtRegs, &udtRegs);

printf("Frames: %d; FPS: %d\n",
iX, ((long) iX*CLOCKS_PER_SEC)/(clkEnd-clkStart));

return(0);
}

Bajo DOSBox 0.72, he alcanzado 105 FPS, que comparado con los 518 FPS que obtenía la versión de 32 bits, lo hace más de 5 veces más lento. Eso si, la versión de ahora es capaz de funcionar en un procesador 8088 con menos de 128 Kb de memoria libre.

Como curiosidad, lo he compilado también con Borland C++ 5.02, dónde solo ha sido posible hacerlo con el modo de memoria huge. Con compact o large, se generaba un error de 64 Kb excedidos. El ejecutable resultante era de 123.264 bytes (50 Kb mayor), y la velocidad de 91 FPS (12% más lento). Usando Digital Mars C++ 8.42, tampoco he conseguido generar el ejecutable debido a fixups de enlazado en todos los modelos de memoria. La versión original 11.0c de Watcom, el ejecutable era de 88.600 bytes (10 Kb mayor), y la velocidad de 104 FPS (1% más lento).

El binario, y el fuente aquí (69 Kb en formato ZIP).