{"id":100,"date":"2020-11-24T09:55:44","date_gmt":"2020-11-24T09:55:44","guid":{"rendered":"https:\/\/specnext.dev\/es\/?p=100"},"modified":"2020-11-24T09:55:44","modified_gmt":"2020-11-24T09:55:44","slug":"uso-de-codigo-en-bancos-de-memoria-en-nextbasic","status":"publish","type":"post","link":"https:\/\/specnext.dev\/es\/2020\/11\/24\/uso-de-codigo-en-bancos-de-memoria-en-nextbasic\/","title":{"rendered":"Uso de c\u00f3digo en bancos de memoria en NEXTBasic"},"content":{"rendered":"\r\n<p>En este peque\u00f1o art\u00edculo comentaremos c\u00f3mo usar los bancos de memoria disponibles en el ZX Spectrum Next para almacenar en ellos c\u00f3digo NEXTBasic ejecutable desde el programa.<br \/>Adem\u00e1s de c\u00f3digo, en lo bancos de memoria, pueden ubicarse drivers, definici\u00f3n de sprites y tile, archivos de sonido y otros recursos, si bien en estos momentos, nos centraremos en el c\u00f3digo.<\/p>\r\n<p>ZX Spectrum Next tiene versiones de 1 y 2 megabytes, lo que significa un aumento significativo respecto a la cantidad de memoria de los spectrums originales de 16k, 48k y 128k.\u00a0<\/p>\r\n<p>Por cuestiones de dise\u00f1o y capacidad de direccionamiento del procesador, \u00e9ste no es capaz de acceder de forma lineal a la cantidad total de memoria teniendo que fragmentarla en bloques de 16k, llamados bancos. En estos bancos podemos almacenar las distintas partes de nuestro programa y llamarlos para ejecutar el c\u00f3digo que se encuentre en ellos. <br \/>El uso de bancos permite hacer programas m\u00e1s largos y, combinados con otras t\u00e9cnicas como el uso de procedimientos o subrutinas, m\u00e1s modulares pudiendo incluso hacer c\u00f3digo reutilizable en otros proyectos si se dise\u00f1a de forma correcta.<br \/>La memoria se compone de un total de 48 bancos (numerados de 0 a 47) en los NEXTs de 1 mega o 112 bancos (de 0 a 111) en los modelos de 2 megas. Algunos de ellos son de uso interno del propio ordenador, por lo que se recomienda el uso a partir del banco 12. Del 12 al 47 \u00f3 111, dependiendo de la cantidad de memoria.<br \/><br \/>Los bancos tienen un tama\u00f1o de 16k, no pudiendo superarse este tam\u00f1ano. Desde un banco puede ejecutarse c\u00f3digo de cualquier otro banco (por ejemplo usando bank numero proc nombre_funci\u00f3n()) o bien del programa principal usando el n\u00famero de banco 255 (bank 255 proc nombre_funci\u00f3n()).<\/p>\r\n<p>\u00a0<\/p>\r\n<h2>Edici\u00f3n de programas usando bancos<\/h2>\r\n<p>Una vez hecha una peque\u00f1a introducci\u00f3n a los bancos, explicaremos c\u00f3mo usarlos a nivel de edici\u00f3n de programas editando directamente en NEXTBasic, utilizando un editor externo en PC y luego import\u00e1ndolo con el comando dor .txt2bas y, por \u00faltimo, usando Visual Studio Code y la extensi\u00f3n creada por Remy Sharp.<\/p>\r\n<p>\u00a0<\/p>\r\n<h2><strong>1. Edici\u00f3n desde NEXTBasic<\/strong><\/h2>\r\n<p>Para trabajar con bancos desde el editor de NEXTBasic, debemos escribir el c\u00f3digo normalmente en el m\u00f3dulo principal y, una vez escrito, mover estas l\u00edneas al banco deseado.<br \/>Para mover las l\u00edneas al banco usaremos:<br \/><br \/><code>BANK n LINE inicio,fin<\/code><br \/><br \/>que copiar\u00e1 las l\u00edneas desde inicio a fin, incluidas, en el banco n.<\/p>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-118\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2020\/11\/NextBasic_BancosMemoria2-300x107.jpg\" alt=\"\" width=\"300\" height=\"107\" srcset=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2020\/11\/NextBasic_BancosMemoria2-300x107.jpg 300w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2020\/11\/NextBasic_BancosMemoria2.jpg 436w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-120\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2020\/11\/NextBasic_BancosMemoria4-300x55.jpg\" alt=\"\" width=\"300\" height=\"55\" srcset=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2020\/11\/NextBasic_BancosMemoria4-300x55.jpg 300w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2020\/11\/NextBasic_BancosMemoria4.jpg 340w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-119\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2020\/11\/NextBasic_BancosMemoria3-300x60.jpg\" alt=\"\" width=\"300\" height=\"60\" srcset=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2020\/11\/NextBasic_BancosMemoria3-300x60.jpg 300w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2020\/11\/NextBasic_BancosMemoria3.jpg 413w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\r\n<p><br \/>Debemos salvar a la tarjeta SD el contenido del banco con SAVE \u00abbancon.bnk\u00bb BANK n<br \/><br \/>Si, una vez movido el c\u00f3digo a un banco, deseamos modificarlo deberemos cargarlo en memoria si no est\u00e1 cargado (con LOAD \u00abbancon.bnk\u00bb BANK n) y ponerlo en el banco por defecto con BANK n MERGE.<br \/>Esto colocar\u00e1 el c\u00f3digo del banco en el c\u00f3digo principal y se podr\u00e1 modificar. Una vez modificado, se debe copiar de nuevo al banco, con BANK n LINE inicio,fin y volver a grabarlo con SAVE \u00abbancon.bnk\u00bb BANK n.<br \/><br \/>En mi opini\u00f3n, es el m\u00e9todo m\u00e1s laborioso y propenso a fallos de los que se van a comentar, aunque tiene la parte \u00abrom\u00e1ntica\u00bb de poder usar directamente el editor y la m\u00e1quina real, lo que para algunos ser\u00e1 un punto a favor.<\/p>\r\n<p>\u00a0<\/p>\r\n<h2><strong>2. Edici\u00f3n externa e importaci\u00f3n con .TXT2BAS<\/strong><\/h2>\r\n<p>Se trata de una opci\u00f3n mixta en la que se usar\u00e1 un editor externo en un PC para crear el programa.<br \/>En el c\u00f3digo se incluir\u00e1n directivas #bankfile nombrefichero.bnk para indicar el principio del c\u00f3digo de un banco.<br \/>Una vez terminado el c\u00f3digo, se debe copiar al Next y, mediante el comando .txt2bas se convertir\u00e1 a BASIC tokenizado con el comando .txt2bas.<\/p>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-116\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2020\/11\/NextBasic_BancosMemoria5-300x58.jpg\" alt=\"\" width=\"300\" height=\"58\" srcset=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2020\/11\/NextBasic_BancosMemoria5-300x58.jpg 300w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2020\/11\/NextBasic_BancosMemoria5.jpg 536w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\r\n<p>Es importante indicar que, el fichero en el que escribamos el programa debe tener extensi\u00f3n .txt y no .bas, ya que al ejecutar el txt2bas \u00e9ste crear\u00e1 el fichero .bas con el mismo nombre.<br \/>Por ejemplo, .txt2bas nombrefichero.txt crear\u00e1 el fichero nombrefichero.bas con el resultado de convertir nuestro programa a BASIC tokenizado.<br \/><br \/>El programa .txt2bas generar\u00e1 el programa principal y tantos ficheros como directivas #bankfile encuentre con el c\u00f3digo indicado entre ellas.<br \/>Por ejemplo, el programa:<br \/><br \/><code>01 load \"bnk30.bnk\" bank 30 : load \"bnk31.bnk\" bank 31<br \/>10 PRINT \"im in default bank\"<br \/>20 bank 30 PROC text()<br \/>25 bank 31 PROC text2()<br \/>30 PAUSE 0<br \/>40 STOP<\/code> <br \/><br \/>#bankfile bnk30.bnk<br \/><br \/><code>9000 DEFPROC text()<br \/>9010 print \"im in bank 30\"<br \/>9500 endproc<\/code> <br \/><br \/>#bankfile bnk31.bnk<br \/><br \/><code>9600 DEFPROC text2()<br \/>9610 print \"im in bank 31\"<br \/>9700 endproc<\/code> <br \/><br \/>crear\u00e1 un programa .bas con el contenido:<br \/><br \/><code>01 load \"bnk30.bnk\" bank 30 : load \"bnk31.bnk\" bank 31<br \/>10 PRINT \"im in default bank\"<br \/>20 bank 30 PROC text()<br \/>25 bank 31 PROC text2()<br \/>30 PAUSE 0<br \/>40 STOP<\/code> <br \/><br \/>un fichero bnk30.bnk con el contenido:<br \/><br \/><code>9000 DEFPROC text()<br \/>9010 print \"im in bank 30\"<br \/>9500 endproc<\/code> <br \/><br \/>y un fichero bnk31.bnk con el contenido:<br \/><br \/><code>9600 DEFPROC text2()<br \/>9610 print \"im in bank 31\"<br \/>9700 endproc<\/code><\/p>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-117\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2020\/11\/NextBasic_BancosMemoria1-300x86.jpg\" alt=\"\" width=\"300\" height=\"86\" srcset=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2020\/11\/NextBasic_BancosMemoria1-300x86.jpg 300w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2020\/11\/NextBasic_BancosMemoria1.jpg 498w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\r\n<p>Recalcar que, para usar el c\u00f3digo de los bancos, \u00e9stos deben cargarse en memoria previamente.<br \/>En el ejemplo indicado, se hace con la l\u00ednea:<br \/><br \/><code>01 load \"bnk30.bnk\" bank 30 : load \"bnk31.bnk\" bank 31<\/code><\/p>\r\n<p>\u00a0<\/p>\r\n<h2><strong>3. Visual Studio Code y extensi\u00f3n de Remy Sharp<\/strong><\/h2>\r\n<p>Esta \u00faltima forma de edici\u00f3n, en mi opini\u00f3n, es la m\u00e1s c\u00f3moda y productiva se usen bancos o no.<br \/>Crearemos un fichero donde pondremos el c\u00f3digo que queremos almacenar en un banco, por ejemplo:<br \/><br \/><code>9000 DEFPROC text()<br \/>9010 PRINT \"Estoy en el banco 30\"<br \/>9500 endproc<\/code><\/p>\r\n<p>Para crear el fichero con el c\u00f3digo del banco, pulsaremos F1 y, en la lista de acciones, buscaremos:<br \/>NEXTBasic: export to BAS y le asignaremos un nombre al fichero generado, por ejemplo banco30.bas<br \/>Posteriormente, desde el programa principal, procederemos como es habitual cargando en memoria el banco que acabamos de generar para poder usarlo con: 05 load \u00abbanco30.bas\u00bb bank 30<br \/><br \/><code>05 load \"banco30.bas\" bank 30<br \/>10 PRINT \"Estoy en el banco principal\"<br \/>20 bank 30 PROC text()<br \/>30 PAUSE 0<br \/>40 STOP<\/code>\u00a0<\/p>\r\n<p><br \/>Es posible que, adem\u00e1s de las indicadas, haya numerosas formas m\u00e1s de editar programas en NEXTBasic. Si conoc\u00e9is alguna m\u00e1s os agradecer\u00eda que la coment\u00e1seis para dar cuantas m\u00e1s opciones mejor a los que se deciden a escribir programas en NEXTBasic.<br \/>Igualmente, se agradece cualquier correcci\u00f3n a lo expuesto en caso de encontrar alg\u00fan error en el texto o en alg\u00fan concepto.<br \/><br \/>Muchas gracias!<\/p>\r\n<p>\u00a0<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>En este peque\u00f1o art\u00edculo comentaremos c\u00f3mo usar los bancos de memoria disponibles en el ZX Spectrum Next para almacenar en ellos c\u00f3digo NEXTBasic ejecutable desde el programa.Adem\u00e1s de c\u00f3digo, en lo bancos de memoria, pueden ubicarse drivers, definici\u00f3n de sprites y tile, archivos de sonido y otros recursos, si bien en estos momentos, nos centraremos [&hellip;]<\/p>\n","protected":false},"author":17,"featured_media":115,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3,4],"tags":[18,6],"class_list":["post-100","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desarrollo","category-nextbasic","tag-memoria","tag-nextbasic"],"jetpack_featured_media_url":"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2020\/11\/NextBasic_BancosMemoria0.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/posts\/100","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\/17"}],"replies":[{"embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/comments?post=100"}],"version-history":[{"count":15,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/posts\/100\/revisions"}],"predecessor-version":[{"id":125,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/posts\/100\/revisions\/125"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/media\/115"}],"wp:attachment":[{"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/media?parent=100"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/categories?post=100"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/tags?post=100"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}