Porting low-level DOS code for TP/BP to GO32v2 with FPC/es

From Lazarus wiki

English (en) español (es) Bahasa Indonesia (id)

"Código DOS de bajo nivel" se refiere a las rutinas de ensamblador, el uso de las funciones de DOS y BIOS, etc. Esta página intenta proporcionar sugerencias sobre áreas generales de interés al migrar dicho código escrito originalmente para TP/BP a go32v2 con FPC (o potencialmente otros destinos similares como WDOSX). No esperes ningún tutorial detallado: meterse con código de bajo nivel siempre requiere mucho conocimiento y experiencia, y migrar código antiguo de 16 bits escrito para el modo real, al modo protegido de 32 bits hace que sea aún más exigente.

  1. Lea lo que nuestro manual, wiki y contribuciones de listas de correo indican en las convenciones de llamadas de FPC (es decir, cómo se pasan los parámetros a las funciones/procedimientos y cómo se ve la organización de la pila y el procesamiento) - esto es ciertamente diferente de TP/BP. Entre otros, esto implica cambios de código usando [bp].
  2. En general, debe usar registros de 32 bits en lugar de registros de 16 bits (creo que incluso hay alguna penalización de velocidad en algunas CPU cuando se utilizan registros de 16 bits, pero lo que es más importante, las funciones sobrecargadas (según lo proporcionado por el host DPMI) pueden incluso requerir proporcionar parámetros en registros de 32 bits en lugar de, por ejemplo, funciones DOS estándar, es decir, eax en lugar de ax, etc.
  3. Si necesita intercambiar datos con el código subyacente de 16 bits, como las funciones del BIOS (sí, esto incluye las funciones sectoriales de lectura y escritura), el búfer de memoria utilizado debe colocarse en un área de memoria donde el código de 16 bits pueda acceder a él (dentro del primer MB de RAM), si es su código el que asigna el buffer, necesita asegurarse de que también pueda acceder a él. Esto se consigue usando las funciones DPMI (lea la especificación DPMI para obtener más información, o al menos eche un vistazo a algún código RTL de FPC usando estas funciones int 31h).
  4. En general, no se toca ningún segmento de registro-todos los datos están disponibles en el modelo de memoria plana, donde todo está disponible con direccionamiento de 32 bits y ds=es=ss (es decir, sin instrucciones como lds/les necesitados, sin Moves: [xx], yy, etc.). Hay una excepción directamente relacionada con el punto anterior relacionada con compartir datos con código de 16 bits - si pasa parámetros a/recibir resultados de código/funciones de 16 bits, necesita traducir las direcciones de 16:16 de 16 bits a 0: 32 direcciones usadas en código de 32 bits y viceversa (como se describió anteriormente) y entonces obviamente puede que necesite cambiar algún segmento también inmediatamente antes o después de la llamada a la función de 16 bits (sin embargo, estos casos se resuelven normalmente usando funciones auxiliares como la función DPMI para llamar interrupciones de 16 bits, por ejemplo: su código no sería directamente jugar con los registros de segmento de todos modos).
  5. La implementación de rutinas de servicio de interrupción o devoluciones de llamada activadas desde el modo real requiere el uso de características especiales como el bloqueo de memoria, etc. - leer la especificación DPMI y potencialmente echar un vistazo a la implementación de la unidad Mouse para GO32v2.