RYG: ampliar la RAM disponible #Programación retro del Commodore 64

El juego ya esté esencialmente completo: permite que el humano y el C64 jueguen de forma continuada, alternando turnos, y detecta las condiciones de fin de partida.

Ahora bien, si probamos a jugar con la versión 15 del proyecto, da igual que sea con una profundidad de análisis de 1, 2 o 3 niveles, se verá que es relativamente fácil ganar al C64. Por tanto, tenemos que conseguir que el C64 juegue mejor.

Básicamente hay dos formas de conseguir que le C64 juegue mejor:

  • O aumentando la profundidad de análisis.
  • O mejorando la función de evaluación.

Ya hemos comentado varias veces que la profundidad del árbol de juego y la función de evaluación conforman una especie de compromiso. Si el árbol de juego pudiera generarse completo, bastaría con una función de evaluación muy tonta. Pero como el árbol no puede ser completo, porque la memoria es limitada, la función de evaluación tiene que ser más lista, tiene que permitir identificar aquellas ramas del juego que son más prometedoras.

Aumentar la profundidad de análisis:

Para aumentar la profundidad de análisis:

  • O aumentamos la memoria disponible.
  • O compactamos las estructuras de datos.
  • O ambas cosas.

De todo esto ya hablamos largo y tendido en la entrada "RYG: árbol de juego – memoria revisitada", y ya decidimos entonces no compactar las estructuras de datos (complicaba mucho la programación) pero sí ampliar la RAM disponible. De hecho, quedó pospuesto hasta esta entrada.

Para ampliar la RAM disponible nos aprovechamos de las funciones de configuración del mapa de memoria del C64. Concretamente, actuando sobre el registro R6510 = $0001 podemos activar y desactivar diferentes partes de la memoria del C64:

Bit Nombre bit Si vale 0 Si vale 1
0 LORAM Las direcciones $a000 – $bfff direccionan RAM Las direcciones $a000 – $bfff direccionan la ROM con el intérprete de BASIC
1 HIRAM Las direcciones $e000 – $ffff direccionan RAM Las direcciones $e000 – $ffff direccionan la ROM con el Kernal
2 CHAREN Las direcciones $d000 – $dfff direccionan la ROM con el mapa de caracteres Las direcciones $d000 – $dfff direccionan los chips especiales y la RAM de color

Podemos desactivar el intérprete de BASIC, porque no lo utilizamos. Sin embargo, no podemos desactivar el Kernal, porque sí utilizamos rutinas como "chrout".

Todo esto lo hacemos con la nueva rutina "ampliaRam", que llamamos al arrancar el programa, y que básicamente pone a 0 el bit 0 (LORAM) del registro R6510 = $0001:

Rutina ampliaRam

De este modo, ganamos como RAM disponible el rango de direcciones del intérprete de BASIC ($a000 – $bfff = 8 KB), así como el rango $c000 – $cfff = 4 KB que, si bien siempre es RAM, al no estar contiguo hasta ahora con el espacio de trabajo del programa ($0801 – $9fff), no podíamos aprovecharlo fácilmente.

En total, ganamos estos 12 KB:

Memoria - ampliada

Sin embargo, incluso así es insuficiente para ganar otro nivel de análisis (pasar de tres a cuatro niveles) porque, como ya calculamos en su momento, para tres niveles hacían falta 22 KB y para cuatro 90 KB.

Total, nuestra principal esperanza es mejorar la función de evaluación, cosa que haremos en las entradas que siguen.


Código del proyecto: RYG16


Editar

Josepzin

No hay comentarios:

Publicar un comentario