Skip to content

Estructura de DIV

Aitor edited this page Mar 13, 2022 · 1 revision

Intérprete

El intérprete de DIV se basa en una máquina de pila en la que cada proceso posee su propia pila, con su propio stack pointer y su propio program counter.

El código del intérprete se encuentra en la carpeta src/div32run y la estructura de archivos es:

  • i.cpp: Código del intérprete. Este archivo contiene el main que se encarga de cargar el código de los procesos y ejecutarlo (la ejecución del código está en kernel.cpp, que se carga desde este archivo usando un #include "kernel.cpp" en la funcion nucleo_exec).
  • c.cpp: Código de la detección y gestión de colisiones.
  • d.cpp: Código del debugger de DIV.
  • ia.cpp: Código de la búsqueda de caminos.
  • f.cpp: Aquí se encuentra el código de las funciones de DIV: put_pixel, get_pixel, key, save, load, set_mode, etc.
  • s.cpp: Funciones de textos, scroll y sprites.
  • v.cpp: Funciones de vídeo.

Nada más arrancar el intérprete (DIV32RUN.DLL, que en realidad es un .EXE) éste busca dentro del archivo ejecutable que lo ha invocado (argv[1]) los siguientes valores:

fseek(f,0,SEEK_END); // Vamos al final del archivo
len=ftell(f)-602-4*10; // Obtenemos el tamaño del archivo y le restamos 642 bytes
fseek(f,0,SEEK_SET); // Volvemos al principio del archivo

fseek(f,602,SEEK_SET); // Nos saltamos 602 bytes desde el principio del archivo
fread(mimem,4,10,f); // Leemos 40 bytes en mimem.

Estos 40 bytes son interpretados como 10 enteros (int) donde:

índice descripción
0 flags del programa (trace_program, ignore_errors y otras compiler_options van aquí)
1 TODO: ¿?
2 TODO: // Inicio de la imagen de las variables locales Ver línea 177 de i.cpp
3 TODO: ¿Máximo de memoria? Ver línea 1317 de i.cpp
4 TODO: ¿?
5 TODO: ¿Tamaño de la memoria para las variables privadas?
6 Tamaño de la memoria para las variables públicas.
7 TODO: ¿?
8 TODO: // Final de c¢digo, locales y textos (longitud del cmp) Ver línea 181 de i.cpp
9 Tamaño del byte code descomprimido. Todos los ejecutables de DIV son descomprimidos usando uncompress de zlib. NOTA: He probado a descomprimir el byte code con una versión moderna de zlib y me ha dado problemas.

Una vez que tenemos descomprimido el código, el intérprete crea dos procesos, el proceso _init, que es un proceso interno del intérprete al que no tenemos acceso y el proceso _main que es el program de nuestro programa.

Clone this wiki locally