Foto de Viajes creado por DCStudio - www.freepik.es

NextReg

En este artículo explicaremos como usar los registros de configuración del Next, con los que podemos gestionar diferentes aspectos del funcionamiento de nuestro equipo, y que se conocen como NextReg.

El Next dispone de una serie de puertos IN/OUT específicos dedicados a controlar el funcionamiento interno del equipo. Entre ellos destacamos el modo de vídeo Layer 2 ($123B), el control de Sprites ($303B, $57 y $5B) y NextReg ($243B y $253B). Una lista completa de estos puertos los encontramos en el capítulo 23 del manual oficial del Spectrum Next y en la Wiki del Spectrum Next en https://wiki.specnext.dev/Board_feature_control

Para acceder a un registro NextReg hay que hacer una escritura (OUT) en el puerto de control $243B y una lectura (IN) o escritura (OUT), según deseemos, en el puerto de datos ($253B). Cabe destacar que los registros NextReg son de 8 bits, tanto a nivel de registro como a nivel de datos. Hay algunos registros que almacenan más de 8 bits, aspecto que se soluciona, normalmente, realizando lecturas o escrituras consecutivas al mismo NextReg, pero esto depende de cada caso en particular.

Para simplificar este proceso, en las extensiones que incorpora el procesador Z80N se han incluido dos comandos que nos permiten realizar las escrituras de forma sencilla:

  • NEXTREG n,n’
  • NEXTREG n,A

El primero permite escribir un valor de 8 bits en cualquier registro de 8 bits indicando dos parámetros numéricos fijos. Mientras el segundo nos permite escribir en un registro numérico fijo, el valor del registro A. Si queremos realizar una lectura de un registro, deberemos acceder a nivel de puerto con los comandos IN y OUT.

En este artículo nos vamos a centras en cómo gestionar estos registros desde Boriel ZX Basic, así que la cosa se simplifica un poco.

 

Boriel ZX Basic

Si utilizamos la librería NextLib, incluida en NextBuild (https://github.com/em00k/NextBuild), podemos usar los comandos “NextReg”, “NextRegA” y “GetReg”.

Y si usáis NextBuild sobre VSCode, que es altamente recomendable, el sistema de autocompletado incluye una relación completa de todos los puertos y el significado y uso de todos sus bits.

NextBuild & NextLib

NextBuild y NextLib con VSCode

 

NextReg(reg,val)

Escribe un valor fijo en el registro indicado. En este caso, tanto “reg” como “val” deben ser valores numéricos constantes, es decir, no pueden ser variables.
En el siguiente ejemplo vemos como fijar la velocidad del procesador a 28MHz:

NextReg($07,3)   ' 0=3.5MHz, 1=7MHz, 2=14MHz, 3=28MHz

 

NextRegA(reg,val)

Es similar a NextReg, pero en este caso, tanto el registro como el valor pueden ser constantes o variables.

En el siguiente ejemplo asignamos diferentes banco de memoria (del 30 al 40) al slot 7 (que va desde $E000 a $FFF) y escribimos el número del banco en la dirección 0 del banco, es decir, en $E000:

dim banco as ubyte
dim n as ubyte
for n=30 to 40     ' Contamos de 30 a 40
NextRegA($57,n)    ' Conmutados el slot 7 para que apunte al banco "n"
Poke($E000,n)      ' Escribimos el valor "n" en el byte 0 del banco, es decir en $E000
next n

 

GetReg(reg)

Devuelve el valor actual del registro NextReg indicado.

En el siguiente ejemplo, leeremos el primer byte del banco de memoria 43, para ello, conmutaremos el banco 43 al slot de memoria 7. Para no dejar el sistema inestable, leeremos el banco actual en el slot 7 y lo dejaremos tal como estaba antes de empezar (en este ejemplo asumimos que no estamos utilizando las direcciones de memoria de $E000 a $FFFF, que son las utilizadas por el slot 7):

dim banco7 as ubyte
dim valor as ubyte
banco7 = GetReg($57)    ' Obtenemos el banco que está ahora en el slot 7
NextReg($57,43)         ' Ponemos el banco 43 en el slot 7
valor = Peek($E000)     ' Leemos el valor del byte 0 del banco 43, es decir $E000
NextRegA($57,banco7)    ' Volvemos a colocar el slot 7 como estaba antes de empezar

 

En el siguiente ejemplo configuramos el Joystick 1 para que funcione con el protocolo KEMPSTON. El control del Joystick se realiza a través del NextReg $05, que gestiona el “ScanDoubler”, la frecuencia vertical de vídeo y el protocolo del joystick 1 y 2. No es conveniente “jugar” con el “ScanDoubler” ni la frecuencia de vídeo, así que lo que tenemos que hacer es leer el valor del NextReg $05, cambiar solo la configuración del Joystick 1, y escribir el valor en el NextReg $05:

dim jConf as ubyte
jConf = GetReg($05)
jConf = jConf bAND %00110111  ' Ponemos los bits 7,6 y 3 a cero sin tocar el resto
jConf = jConf bOR %01000000   ' Ajustamos los bits 7,6 y 3 al valor 010 (KEMPSTON 1)
NextRegA($05,jConf)

 

Registros destacados

Dentro de los registros del Next (https://wiki.specnext.dev/Board_feature_control), vamos a destacar algunos de ellos. Hay que tener en cuenta que existen muchos registros, y que bastantes de ellos son accesibles con comandos implementados en NextLib, y que aquí solo destacamos algunos a nivel de introducción:

 

Hardware real vs Emuladores

Es importante tener en cuenta que existen algunas diferencias “sutiles” entre la implementación del hardware real y la de los emuladores. Esto no quiere decir que los emuladores estén mal implementados. En algún caso es el hardware real el que actual de forma “ligeramente” diferente a como está documentado, por lo que es imprescindible comprobar el funcionamiento en el hardware real, lo que no quita que desarrollemos con emuladores por comodidad.

 

Como ya hemos mencionado, existen múltiples registros que nos permiten aprovechar las mejoras que implementa el Next. El número de registros NextReg es extenso y las funcionalidades pueden llegar a ser muy complejas, así que mi consejo es tomárselo con calma, documentarse y pedir ayuda en el canal de “Boriel ZX Basic”, “N-GO” o “Spectrum Next ES” de Telegram o en el grupo de Next en Discord.

 

Atribuciones

Imagen principal del articulo creado por DCStudio – www.freepik.es

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *