A ver que me aclare, porque estoy un poco espeso... Lo que me ha parecido entender es que la pila empieza en una dirección, llamemosle X, y crece hacia direcciones superiores a X. Por encima de ese X hay variables del sistema y demás, por lo que si la pila crece demasiado, las machaca y el invento se va a tomar por saco. ¿Correcto?
Jeje,.....no.....la pila crece hacia "abajo", es decir, hacia direcciones inferiores. Si defines SP como $F380, la primera posición ocupada de la pila será $F37E/$F37F, la siguiente $F37C/$F37D y así sucesivamente. Haciendo CLEAR ,&F380 impides que la pila de BASIC sobrepase esa dirección, eso te permite tener datos a partir de ahí y tener la garantía de que el intéprete no se los va a cargar, algo pareceido vendría a ser un LD SP,$F380.
Por otro lado, he entendido que la pila marca el inicio de la zona de trabajo. Es decir, que la RAM con direcciones inferiores a X puedo usarla sin temor ¿Correcto?
Tampoco, tampoco
. La pila puede estar situada donde se quiera dentro de lo que se considere zona de trabajo (usualmente la página 3); pero lo suficientemente separada de la zona de código y la zona de datos de tu programa como para que no los machaque. Por supuesto tampoco sería bueno ni definirla dentro del area de variables de sistema (si usas la BIOS) o en una página distinta a la 3 si vas a hacer conmutación de páginas.
Me apropio de un gráfico del MSX THB y lo corrijo un poco :
0000 --------------------
| |
| BIOS |
| |
4000 --------------------
| BASIC |
| Interpreter |
| |
8000 -------------------- <-- (BOTTOM) --+
| | |
| User area | --+ |
-------------------- <-- (HIMEM) | |32K
| Disk work area | --+ |16K |
F380 -------------------- | 8K | |
| System work area | | | |
FFFF -------------------- --+ --+ --+
Ese sería el mapa visible desde el BASIC. Como desde un cartucho el interprete de BASIC desaparece y lo normal es que no activemos la unidad de disco tenemos (para una ROM de 16Kb):
0000 --------------------
| |
| BIOS |
| |
4000 --------------------
| |
| Tu programa |
| |
8000 --------------------
| |
| ROM page 2 |
| |
C000 --------------------
| |
| RAM page 3 |
F380 -------------------- <-- (HIMEM)
| System work area |
FFFF --------------------
Esa zona de RAM comprendida entre la dirección $C000 y $F380 estaría disponible para todo, variables, tablas, bufferes.....y la pila. Como crece hacia arriba (geométricamente hablando
), es necesario ubicarla lo más baja posible (sigo hablando geométricamente
) y calcular un margen de seguridad entre el final de tus datos y el tamaño teórico que alcanzará la misma, que será pequeño si no se hacen guarreridas españolas como las que hacen los señores Robsy y Nerlaska
Finalmente está el tema de modificar la dirección de inicio de la pila. Para modificarla ¿es suficiente con meter elvalor que quiera en el stack pointer al inicio de mi programa?
Nada más ni nada menos...
Gracias por la ayuda. La verdad es que, inocente de mi, había hecho mis cálculos suponiendo 16KB de RAM y, claro, ahora voy un poco justito. Me alegré ayer al comprobar que podía meter unas quince pantallas más o menos complejas en unos 800 bytes, pero aún así, entre replayer de PT3, músicas y buffers varios se me queda corta.
¿Y ya has probado a comprimir con el bitbuster o con el pletter?