-Estructura de la memoria
-------------------------
.En el a�o 1980, dotaron a los primeros sistemas de una memoria de 16 KB y planificaron una necesidad m�xima de 640 Kb, adem�s, como el procesador que iba a gobernar esa arquitectura, el 8086 y 8088 de Intel, ten�a un espacio de direcciones de 1MB, a�adieron a esa memoria principal un �rea RAM para video, otra para la ROM-BIOS, etc. Y es hasta hoy d�a que estamos sufriendo esa falta de visi�n.
Toda esta memoria se administra en base a segmentos de 64 Kb, esto es debido a que el tipo de direccionamiento que escogieron para poder referenciar todas las posiciones de memoria fue el direccionamiento segmentado. Pero para �sto s� existe una explicaci�n m�s l�gica.
La tecnolog�a de aquella �poca solo permit�a construir registros de 16 bits, (hoy en d�a vamos por 64 bits). Como la cantidad de memoria que puede ser direccionada depende directamente de la longitud de un registro, llamado registro de direcciones, con 16 bits se puede acceder a 2 a la 16=64 Kb. Para gobernar 1 Mb se necesitaba un registro de 20 bits, imposible para aquella �poca, de este modo, se opt� por utilizar dos registros de 16 bits, a uno de ellos (registro de segmento) lo desplazamos cuatro posiciones a la izquierda (o se multiplica por 16) y le sumamos el otro registro (registro de desplazamiento) tal y como est�, consiguiendo as� nuestra direcci�n de 20 posiciones.
Como veis este tipo de direccionamiento es un poco lioso, y mucho m�s si lo comparamos con el direccionamiento lineal, donde se trata a la memoria como una 'l�nea' de direcciones todas consecutivas. Esta t�cnica se utiliza en otras arquitecturas, como la basada en los procesadores de la familia del 68000 de Motorola, (yo he trabajado con estos procesadores y creedme no hay ni punto de comparaci�n en ese aspecto y en muchos otros), esos procesadores son los que se utilizan para programar los videojuegos de verdad, (s�, s�, los de las m�quinas recreativas) y no me extra�a nada. :)
Si tan mala es esa organizaci�n de la memoria, por qu� seguimos utiliz�ndola, si hoy en d�a disponemos de microprocesadores que direccionan hasta 4 Gb y registros de 64 bits, pues echarle la culpa a esas 4000 l�neas de c�digo que en su d�a fue el MS-DOS 1.0, el por qu� del auge que tuvo este sistema operativo es un tema que supongo todos conocer�is, por lo que no voy a seguir con la clase de historia..... :)
Os muestro, para terminar con el apartado de la memoria, la organizaci�n en bloques de 64 Kb de la memoria del PC:
Funci�n Direcci�n Bloques de 64 KB
------- --------- ----------------
Memoria principal 0000:0000 - 9000:FFFF 10
RAM video (EGA/VGA) A000:0000 - A000:FFFF 1
RAM de video B000:0000 - B000:FFFF 1
BIOS-ROM adic. C000:0000 - C000:FFFF 1
Cartuchos-ROM D000:0000 - D000:FFFF 1
Cartuchos-ROM E000:0000 - E000:FFFF 1
BIOS-ROM F000:0000 - F000:FFFF 1
char far *video ; // puntero lejano
video = (char far*) 0xB8000000 ; // direcci�n de memoria de video color
for (int i='A'; i<='Z'; i++)
*(video+(i-'A')*2) = i ; //dibujo las letras de la A a la Z en pantalla
La direcci�n de video la debo multiplicar por dos ya que la primer posici�n corresponde a las letras y la segunda corresponde al color de las mismas.
Entonces si queremos dibujar la letra A en la columna 5 de color azul (1) debemos escribir en la direccion * video + 10 = 65 (A) y a continuaci�n *video +11= 1 (azul).
La memoria se divide como sigue:
0 2 4 6 8 10
LCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLC
LCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLC
Las posiciones de memoria pares 0 2 4 etc. corresponden a una letra, el byte siguiente corresponde al color de dicha letra.
Para una mayor aclaraci�n estudiar el ejemplo memoria.c y el juego gusanos.c.