{"id":186,"date":"2022-07-14T11:01:08","date_gmt":"2022-07-14T10:01:08","guid":{"rendered":"https:\/\/specnext.dev\/es\/?p=186"},"modified":"2022-07-19T13:41:49","modified_gmt":"2022-07-19T12:41:49","slug":"nextreg","status":"publish","type":"post","link":"https:\/\/specnext.dev\/es\/2022\/07\/14\/nextreg\/","title":{"rendered":"NextReg"},"content":{"rendered":"<p>En este art\u00edculo explicaremos como usar los registros de configuraci\u00f3n del Next, con los que podemos gestionar diferentes aspectos del funcionamiento de nuestro equipo, y que se conocen como NextReg.<\/p>\n<p>El Next dispone de una serie de puertos IN\/OUT espec\u00edficos dedicados a controlar el funcionamiento interno del equipo. Entre ellos destacamos el modo de v\u00eddeo 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\u00edtulo 23 del manual oficial del Spectrum Next y en la Wiki del Spectrum Next en <a href=\"https:\/\/wiki.specnext.dev\/Board_feature_control\">https:\/\/wiki.specnext.dev\/Board_feature_control<\/a><\/p>\n<p>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\u00fan 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\u00e1s de 8 bits, aspecto que se soluciona, normalmente, realizando lecturas o escrituras consecutivas al mismo NextReg, pero esto depende de cada caso en particular.<\/p>\n<p>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:<\/p>\n<ul>\n<li>NEXTREG n,n&#8217;<\/li>\n<li>NEXTREG n,A<\/li>\n<\/ul>\n<p>El primero permite escribir un valor de 8 bits en cualquier registro de 8 bits indicando dos par\u00e1metros num\u00e9ricos fijos. Mientras el segundo nos permite escribir en un registro num\u00e9rico 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.<\/p>\n<p>En este art\u00edculo nos vamos a centras en c\u00f3mo gestionar estos registros desde Boriel ZX Basic, as\u00ed que la cosa se simplifica un poco.<\/p>\n<p>&nbsp;<\/p>\n<h2>Boriel ZX Basic<\/h2>\n<p>Si utilizamos la librer\u00eda NextLib, incluida en NextBuild (<a href=\"https:\/\/github.com\/em00k\/NextBuild\">https:\/\/github.com\/em00k\/NextBuild<\/a>), podemos usar los comandos \u201cNextReg\u201d, \u201cNextRegA\u201d y \u201cGetReg\u201d.<\/p>\n<p>Y si us\u00e1is NextBuild sobre VSCode, que es altamente recomendable, el sistema de autocompletado incluye una relaci\u00f3n completa de todos los puertos y el significado y uso de todos sus bits.<\/p>\n<div id=\"attachment_199\" style=\"width: 810px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-199\" class=\"wp-image-199 size-large\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/NextBuild-autocomplete-1024x640.png\" alt=\"NextBuild &amp; NextLib\" width=\"800\" height=\"500\" srcset=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/NextBuild-autocomplete-1024x640.png 1024w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/NextBuild-autocomplete-300x188.png 300w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/NextBuild-autocomplete-768x480.png 768w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/NextBuild-autocomplete.png 1440w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><p id=\"caption-attachment-199\" class=\"wp-caption-text\">NextBuild y NextLib con VSCode<\/p><\/div>\n<p>&nbsp;<\/p>\n<h3>NextReg(reg,val)<\/h3>\n<p>Escribe un valor fijo en el registro indicado. En este caso, tanto \u201creg\u201d como \u201cval\u201d deben ser valores num\u00e9ricos constantes, es decir, no pueden ser variables.<br \/>\nEn el siguiente ejemplo vemos como fijar la velocidad del procesador a 28MHz:<\/p>\n<p><code>NextReg($07,3)\u00a0 \u00a0<span style=\"color: #008000\">' 0=3.5MHz, 1=7MHz, 2=14MHz, 3=28MHz<\/span><\/code><\/p>\n<p>&nbsp;<\/p>\n<h3>NextRegA(reg,val)<\/h3>\n<p>Es similar a NextReg, pero en este caso, tanto el registro como el valor pueden ser constantes o variables.<\/p>\n<p>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\u00famero del banco en la direcci\u00f3n 0 del banco, es decir, en $E000:<\/p>\n<p style=\"padding-left: 40px\"><code>dim banco as ubyte<br \/>\ndim n as ubyte<br \/>\nfor n=30 to 40\u00a0 \u00a0 \u00a0<span style=\"color: #008000\">' Contamos de 30 a 40<\/span><br \/>\nNextRegA($57,n)\u00a0\u00a0\u00a0 <span style=\"color: #008000\">' Conmutados el slot 7 para que apunte al banco \"n\"<\/span><br \/>\nPoke($E000,n)\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: #008000\">' Escribimos el valor \"n\" en el byte 0 del banco, es decir en $E000<\/span><br \/>\nnext n<br \/>\n<\/code><\/p>\n<p>&nbsp;<\/p>\n<h3>GetReg(reg)<\/h3>\n<p>Devuelve el valor actual del registro NextReg indicado.<\/p>\n<p>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):<\/p>\n<p style=\"padding-left: 40px\"><code>dim banco7 as ubyte<br \/>\ndim valor as ubyte<br \/>\nbanco7 = GetReg($57)\u00a0 \u00a0 <span style=\"color: #008000\">' Obtenemos el banco que est\u00e1 ahora en el slot 7<\/span><br \/>\nNextReg($57,43)\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span style=\"color: #008000\">' Ponemos el banco 43 en el slot 7<\/span><br \/>\nvalor = Peek($E000)\u00a0 \u00a0 \u00a0<span style=\"color: #008000\">' Leemos el valor del byte 0 del banco 43, es decir $E000<\/span><br \/>\nNextRegA($57,banco7)\u00a0 \u00a0 <span style=\"color: #008000\">' Volvemos a colocar el slot 7 como estaba antes de empezar<\/span><\/code><\/p>\n<p>&nbsp;<\/p>\n<p>En el siguiente ejemplo configuramos el Joystick 1 para que funcione con el protocolo KEMPSTON. El control del Joystick se realiza a trav\u00e9s del NextReg $05, que gestiona el \u201cScanDoubler\u201d, la frecuencia vertical de v\u00eddeo y el protocolo del joystick 1 y 2. No es conveniente \u201cjugar\u201d con el \u201cScanDoubler\u201d ni la frecuencia de v\u00eddeo, as\u00ed que lo que tenemos que hacer es leer el valor del NextReg $05, cambiar solo la configuraci\u00f3n del Joystick 1, y escribir el valor en el NextReg $05:<\/p>\n<p style=\"padding-left: 40px\"><code>dim jConf as ubyte<br \/>\njConf = GetReg($05)<br \/>\njConf = jConf bAND %00110111\u00a0 <span style=\"color: #008000\">' Ponemos los bits 7,6 y 3 a cero sin tocar el resto<\/span><br \/>\njConf = jConf bOR %01000000\u00a0 \u00a0<span style=\"color: #008000\">' Ajustamos los bits 7,6 y 3 al valor 010 (KEMPSTON 1)<\/span><br \/>\nNextRegA($05,jConf)<br \/>\n<\/code><\/p>\n<p>&nbsp;<\/p>\n<h2>Registros destacados<\/h2>\n<p>Dentro de los registros del Next (<a href=\"https:\/\/wiki.specnext.dev\/Board_feature_control\">https:\/\/wiki.specnext.dev\/Board_feature_control<\/a>), 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\u00ed solo destacamos algunos a nivel de introducci\u00f3n:<\/p>\n<ul>\n<li><strong>PERIPHERAL 1 REGISTER ($05):<\/strong> Permite configurar el protocolo de los Joysticks conectados. <a href=\"https:\/\/wiki.specnext.dev\/Peripheral_1_Register\">https:\/\/wiki.specnext.dev\/Peripheral_1_Register<\/a><\/li>\n<li><strong>CPU Speed ($07):<\/strong> Controla la velocidad de la CPU, que puede ser de 3.5, 7, 14 o 28MHz. <a href=\"https:\/\/wiki.specnext.dev\/CPU_Speed_Register\">https:\/\/wiki.specnext.dev\/CPU_Speed_Register<\/a><\/li>\n<li><strong>Sprite and Layer 2 System Setup ($15):<\/strong> Gestiona el modo de v\u00eddeo y los Sprites. <a href=\"https:\/\/wiki.specnext.dev\/Sprite_and_Layers_System_Register\">https:\/\/wiki.specnext.dev\/Sprite_and_Layers_System_Register<\/a><\/li>\n<li><strong>Display Control 1 ($69):<\/strong> Controla la visibilidad de la capa Layer 2. <a href=\"https:\/\/wiki.specnext.dev\/Display_Control_1_Register\">https:\/\/wiki.specnext.dev\/Display_Control_1_Register<\/a><\/li>\n<li><strong>Layer 2 \u201cd\u201d Offset Register ($16 y $17):<\/strong> Controla el scroll horizontal ($16) o vertical ($17) por hardware (se pueden combinar ambos). <a href=\"https:\/\/wiki.specnext.dev\/Layer_2_X_Offset_Register\">https:\/\/wiki.specnext.dev\/Layer_2_X_Offset_Register<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2>Hardware real vs Emuladores<\/h2>\n<p>Es importante tener en cuenta que existen algunas diferencias \u201csutiles\u201d entre la implementaci\u00f3n del hardware real y la de los emuladores. Esto no quiere decir que los emuladores est\u00e9n mal implementados. En alg\u00fan caso es el hardware real el que actual de forma \u201cligeramente\u201d diferente a como est\u00e1 documentado, por lo que es imprescindible comprobar el funcionamiento en el hardware real, lo que no quita que desarrollemos con emuladores por comodidad.<\/p>\n<p>&nbsp;<\/p>\n<p>Como ya hemos mencionado, existen m\u00faltiples registros que nos permiten aprovechar las mejoras que implementa el Next. El n\u00famero de registros NextReg es extenso y las funcionalidades pueden llegar a ser muy complejas, as\u00ed que mi consejo es tom\u00e1rselo con calma, documentarse y pedir ayuda en el canal de \u201cBoriel ZX Basic\u201d, \u201cN-GO\u201d o \u201cSpectrum Next ES\u201d de Telegram o en el grupo de Next en Discord.<\/p>\n<p>&nbsp;<\/p>\n<h4>Atribuciones<\/h4>\n<p><a href=\"https:\/\/www.freepik.es\/fotos\/viajes\">Imagen principal del articulo creado por DCStudio &#8211; www.freepik.es<\/a><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este art\u00edculo explicaremos como usar los registros de configuraci\u00f3n 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\u00edficos dedicados a controlar el funcionamiento interno del equipo. Entre ellos destacamos el modo de v\u00eddeo [&hellip;]<\/p>\n","protected":false},"author":16,"featured_media":195,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[13,3,21],"tags":[7,22,8,23,20],"class_list":["post-186","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-boriel-zx-basic","category-desarrollo","category-hardware","tag-boriel-zx-basic","tag-hardware","tag-nextlib","tag-nextreg","tag-paginacion"],"jetpack_featured_media_url":"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Avion.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/posts\/186","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/comments?post=186"}],"version-history":[{"count":12,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/posts\/186\/revisions"}],"predecessor-version":[{"id":200,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/posts\/186\/revisions\/200"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/media\/195"}],"wp:attachment":[{"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/media?parent=186"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/categories?post=186"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/tags?post=186"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}