<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ensamblador Z80 &#8211; Espamática</title>
	<atom:link href="https://espamatica.com/category/ensambladorz80/feed/" rel="self" type="application/rss+xml" />
	<link>https://espamatica.com</link>
	<description>Programación en 8 bits y algo más.</description>
	<lastBuildDate>Mon, 24 Jun 2024 06:20:37 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>

<image>
	<url>https://i0.wp.com/espamatica.com/wp-content/uploads/2023/11/LogoWeb.png?fit=32%2C29&#038;ssl=1</url>
	<title>Ensamblador Z80 &#8211; Espamática</title>
	<link>https://espamatica.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">147753459</site>	<item>
		<title>Ensamblador ZX Spectrum &#8211; Utilidades</title>
		<link>https://espamatica.com/ensamblador-zx-spectrum-utilidades/</link>
					<comments>https://espamatica.com/ensamblador-zx-spectrum-utilidades/#respond</comments>
		
		<dc:creator><![CDATA[Juan Antonio Rubio García]]></dc:creator>
		<pubDate>Sun, 11 Feb 2024 08:00:00 +0000</pubDate>
				<category><![CDATA[ZX Spectrum]]></category>
		<category><![CDATA[Ensamblador Z80]]></category>
		<category><![CDATA[Retro]]></category>
		<category><![CDATA[Ensamblador]]></category>
		<category><![CDATA[Z80]]></category>
		<guid isPermaLink="false">https://espamatica.com/?p=5391</guid>

					<description><![CDATA[Esta es una recopilación de distintas rutinas que pueden ser útiles para tratar determinados aspectos del ZX Spectrum. La entrada]]></description>
										<content:encoded><![CDATA[
<p class="has-medium-font-size wp-block-paragraph">Esta es una recopilación de distintas rutinas que pueden ser útiles para tratar determinados aspectos del ZX Spectrum.</p>



<p class="has-medium-font-size wp-block-paragraph">La entrada irá recibiendo actualizaciones.</p>


<div role="navigation" aria-label="Tabla de contenidos" class="simpletoc wp-block-simpletoc-toc"><h2 class="simpletoc-title">Tabla de contenidos</h2>
<ul class="simpletoc-list">
<li><a href="#modelo-de-zx-spectrum">Modelo de ZX Spectrum</a>
</li>
<li><a href="#pal-o-ntsc">PAL o NTSC</a>

<ul>
<li><a href="#que-diferencia-hay">¿Qué diferencia hay?</a>
</li>
<li><a href="#como-nos-afecta">¿Cómo nos afecta?</a>
</li>
<li><a href="#como-averiguamos-el-sistema">¿Cómo averiguamos el sistema?</a>
</li>
</ul>
</li>
<li><a href="#descargas">Descargas</a>
</li></ul></div>


<h2 id="modelo-de-zx-spectrum" class="wp-block-heading has-x-large-font-size">Modelo de ZX Spectrum</h2>



<p class="has-medium-font-size wp-block-paragraph">En más de una ocasión necesitaremos saber en que modelo de ZX Spectrum se va a ejecutar nuestro programa, 16K, 48K o 128K, y en éste último caso si está en modo 48K o 128K.</p>



<p class="has-medium-font-size wp-block-paragraph">La manera de obtener el modelo de ZX Spectrum que voy a mostrar se basa en lo expuesto por <a href="https://twitter.com/sergio_thepope" target="_blank" rel="noreferrer noopener nofollow">Sergio thEpOpE</a> en el grupo de <a href="https://t.me/CursoBasicZX" target="_blank" rel="noreferrer noopener nofollow">Curso Basic ZX</a> de Telegram.</p>



<p class="has-medium-font-size wp-block-paragraph">Según el valor que encontremos en la posición de memoria 0x4B (75), podemos saber si se trata de un modelo 128K o por el contrario si es un modelo de 16/48K. Si al leer el valor de esta posición de memoria obtenemos 0x6E (110), el programa se está ejecutando en un modelo de 128K, de lo contrario lo hace en un modelo 16/48K.</p>



<p class="has-medium-font-size wp-block-paragraph">Si se está ejecutando en un modelo de ZX Spectrum de 16/48K, es interesante saber en cuál de ellos es, información que encontramos en las posiciones 0x5CB4 (23.732) y 0x5CB5 (23.733). En estas direcciones encontraremos la cantidad total de memoria: 0x7FFF (32.767) en modelos de 16K o 0xFFFF (65.535) en modelos de 48K. Como vemos, el segundo byte (el menos significativo) tiene el mismo valor, cambiando solo el más significativo, que se encuentra en la posición de memoria 0x5CB5 (23.733). Si leemos el valor de esta posición y obtenemos 0x7F (127) estamos ejecutando en un modelo de 16K, si obtenemos 0xFF (255) lo estamos haciendo en uno de 48K.</p>



<p class="has-medium-font-size wp-block-paragraph">En los modelos de 128K el valor es el mismo que en los modelos de 48K.</p>



<p class="has-medium-font-size wp-block-paragraph">Si se está ejecutando en un modelo de ZX Spectrum de 128K, es posible que se esté ejecutando en modo 48K o 128K, lo cual también podemos saber. Primero obtenemos el valor de la posición de memoria 0x5C3B (23.611), hacemos la división entre 16 y el resultado lo dividimos entre 2. Si el resultado de esta operación es igual a hacer la división entera del valor de la posición de memoria entre 16 y al resultado hacerle la división entera entre 2, se estaría ejecutando en modo 48K, de lo contrario en modo 128K.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">Pseudocódigo</span><span role="button" tabindex="0" data-code="SI INT(PEEK(23611)/16)/2 = INT(INT(PEEK(32611)/16/2)
    modo 48K
SI NO
    modo 128K
FIN SI" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">SI INT(PEEK(23611)/16)/2 = INT(INT(PEEK(32611)/16/2)</span></span>
<span class="line"><span style="color: #002339">    modo 48K</span></span>
<span class="line"><span style="color: #002339">SI NO</span></span>
<span class="line"><span style="color: #002339">    modo 128K</span></span>
<span class="line"><span style="color: #002339">FIN SI</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">O lo que es lo mismo, si el resultado de la división entera entre el valor de la posición de memoria 0x5C3B (23.611) y 16 es par está en modo 48K, de lo contrario está en modo 128K.</p>



<p class="has-medium-font-size wp-block-paragraph">En <a href="https://espamatica.com/category/ensambladorz80/">ensamblador</a> para ZX Spectrum se nos permite, con rotaciones hacia la derecha, hacer divisiones entre potencias de 2 (16 = 2^4), por lo que tendríamos que hacer cuatro rotaciones para realizar la división entre 16 y luego comprobar si es resultado es par, el bit 0 está a cero.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld   a, $cc                   ; A = 1100 1100
; Usamos desplazamientos para realizar la división entre 16
sra  a                        ; A = A/2 =  0110 0110
sra  a                        ; A = A/4 =  0011 0011
sra  a                        ; A = A/8 =  0001 1001
sra  a                        ; A = A/16 = 0000 1100
; Comprueba si A es par
bit  $00, a
jr   z, EsPar                 ; Si el bit 0 es 0, es par, salta
EsImpar:
; Código de EsImpar
EsPar:
; Código de EsPar" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld   a, $cc                   </span><span style="color: #357B42; font-style: italic">; A = 1100 1100</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Usamos desplazamientos para realizar la división entre 16</span></span>
<span class="line"><span style="color: #002339">sra  a                        </span><span style="color: #357B42; font-style: italic">; A = A/2 =  0110 0110</span></span>
<span class="line"><span style="color: #002339">sra  a                        </span><span style="color: #357B42; font-style: italic">; A = A/4 =  0011 0011</span></span>
<span class="line"><span style="color: #002339">sra  a                        </span><span style="color: #357B42; font-style: italic">; A = A/8 =  0001 1001</span></span>
<span class="line"><span style="color: #002339">sra  a                        </span><span style="color: #357B42; font-style: italic">; A = A/16 = 0000 1100</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Comprueba si A es par</span></span>
<span class="line"><span style="color: #002339">bit  </span><span style="color: #174781">$00</span><span style="color: #002339">, a</span></span>
<span class="line"><span style="color: #002339">jr   z, EsPar                 </span><span style="color: #357B42; font-style: italic">; Si el bit 0 es 0, es par, salta</span></span>
<span class="line"><span style="color: #7EB233">EsImpar:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Código de EsImpar</span></span>
<span class="line"><span style="color: #7EB233">EsPar:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Código de EsPar</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Si os fijáis, hemos desplazado los bits 4 a 7 hasta los bits 0 a 3 y los 4 a 7 se han puesto a cero, comprobando finalmente si el bit 0, anteriormente bit 4, es 0 en el caso de ser par o 1 en el caso de ser impar. Nos podemos ahorrar desplazamientos y comprobar directamente el bit 4.</p>



<p class="has-medium-font-size wp-block-paragraph">En base a lo que hemos visto, la rutina para averiguar en qué modelo de ZX Spectrum estamos ejecutando un programa podría ser la siguiente:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; ZXModel
;
; Obtiene el modelo de ZX
;
; Entrada: nada
;
; Salida:  BC = modelo de ZX
;              0 = 16K
;              1 = 48K
;              2 = 128K
;              3 = 128K en modo 48K
; Altera el valor de los registros BC y AF.
ZXModel:
ld   bc, $00			; BC se utiliza para devolver el valor a BASIC

ld   a, ($4b)           ; A = dirección modelo
cp   $6e
jr   z, is128           ; $6E, 128, salta

is16or48:
ld   a, ($5cb5)         ; A = cantidad memoria, parte alta
rla                     ; Rota a la derecha para comprobar si es $BF o $FF
ret  nc                 ; NC = 16K, sale ($BF)
inc  c                  ; C+=1
ret                     ; 48K, sale

is128:
ld   c, $02             ; C = 128K
ld   a, ($5c3b)         ; A = dirección de modo
; Sí INT(PEEK 23611/16)/2 = INT(INT(PEEK 23611/16)/2) = 48K.
; Dividir ente 16 es como desplazar 4 veces hacia de derecha,
; el bit 4 pasa al bit 0. 
; Saber si es divisible entre dos es como saber si es par, el bit 0 = 0
; Todo se resume en evaluar el bit 4, si es 0 es modo 48K, si es 1 es modo 128K.
bit  $04, a             ; ¿Bit 4?
ret  nz                 ; !0, modo 128K, sale
inc  c                  ; C+=1
ret                     ; Modo 48K" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; ZXModel</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Obtiene el modelo de ZX</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: nada</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Salida:  BC = modelo de ZX</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;              0 = 16K</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;              1 = 48K</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;              2 = 128K</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;              3 = 128K en modo 48K</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros BC y AF.</span></span>
<span class="line"><span style="color: #7EB233">ZXModel:</span></span>
<span class="line"><span style="color: #002339">ld   bc, </span><span style="color: #174781">$00</span><span style="color: #002339">			</span><span style="color: #357B42; font-style: italic">; BC se utiliza para devolver el valor a BASIC</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld   a, (</span><span style="color: #174781">$4b</span><span style="color: #002339">)           </span><span style="color: #357B42; font-style: italic">; A = dirección modelo</span></span>
<span class="line"><span style="color: #002339">cp   </span><span style="color: #174781">$6e</span></span>
<span class="line"><span style="color: #002339">jr   z, is128           </span><span style="color: #357B42; font-style: italic">; $6E, 128, salta</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">is16or48:</span></span>
<span class="line"><span style="color: #002339">ld   a, (</span><span style="color: #174781">$5cb5</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = cantidad memoria, parte alta</span></span>
<span class="line"><span style="color: #002339">rla                     </span><span style="color: #357B42; font-style: italic">; Rota a la derecha para comprobar si es $BF o $FF</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">  nc                 </span><span style="color: #357B42; font-style: italic">; NC = 16K, sale ($BF)</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">  c                  </span><span style="color: #357B42; font-style: italic">; C+=1</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                     </span><span style="color: #357B42; font-style: italic">; 48K, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">is128:</span></span>
<span class="line"><span style="color: #002339">ld   c, </span><span style="color: #174781">$02</span><span style="color: #002339">             </span><span style="color: #357B42; font-style: italic">; C = 128K</span></span>
<span class="line"><span style="color: #002339">ld   a, (</span><span style="color: #174781">$5c3b</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = dirección de modo</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Sí INT(PEEK 23611/16)/2 = INT(INT(PEEK 23611/16)/2) = 48K.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Dividir ente 16 es como desplazar 4 veces hacia de derecha,</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; el bit 4 pasa al bit 0. </span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Saber si es divisible entre dos es como saber si es par, el bit 0 = 0</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Todo se resume en evaluar el bit 4, si es 0 es modo 48K, si es 1 es modo 128K.</span></span>
<span class="line"><span style="color: #002339">bit  </span><span style="color: #174781">$04</span><span style="color: #002339">, a             </span><span style="color: #357B42; font-style: italic">; ¿Bit 4?</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">  nz                 </span><span style="color: #357B42; font-style: italic">; !0, modo 128K, sale</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">  c                  </span><span style="color: #357B42; font-style: italic">; C+=1</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                     </span><span style="color: #357B42; font-style: italic">; Modo 48K</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Para probar esta rutina, deberéis compilarla y cargarla, por ejemplo, en la dirección de memoria 0x7D00 (32.000), para que corra en cualquier modelo o clon de ZX Spectrum. Una vez cargada la rutina, si tecleáis PRINT USR 32000 saldrá impreso en pantalla el valor correspondiente al modelo de ZX Spectrum en el que se está ejecutando.</p>



<p class="has-medium-font-size wp-block-paragraph">El valor devuelto por un programa ensamblador al BASIC del ZX Spectrum se hace a través del registro BC.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af49316ca991&quot;}" data-wp-interactive="core/image" data-wp-key="6af49316ca991" class="wp-block-image aligncenter size-full wp-lightbox-container"><img data-recalc-dims="1" fetchpriority="high" decoding="async" width="706" height="688" data-attachment-id="5398" data-permalink="https://espamatica.com/ensamblador-zx-spectrum-utilidades/zxmodel/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2024/02/ZXModel.png?fit=706%2C688&amp;ssl=1" data-orig-size="706,688" data-comments-opened="1" data-image-title="ZX Model" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2024/02/ZXModel.png?fit=706%2C688&amp;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2024/02/ZXModel.png?resize=706%2C688&#038;ssl=1" alt="Modelo ZX Spectrum" class="wp-image-5398" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2024/02/ZXModel.png?w=706&amp;ssl=1 706w, https://i0.wp.com/espamatica.com/wp-content/uploads/2024/02/ZXModel.png?resize=300%2C292&amp;ssl=1 300w" sizes="(max-width: 706px) 100vw, 706px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Modelo de ZX Spectrum</figcaption></figure>



<h2 id="pal-o-ntsc" class="wp-block-heading has-x-large-font-size">PAL o NTSC</h2>



<p class="has-medium-font-size wp-block-paragraph">En ocasiones, nos puede interesar saber si el ZX Spectrum en el que se está ejecutando nuestro programa es sistema PAL o NTSC. </p>



<h3 id="que-diferencia-hay" class="wp-block-heading has-large-font-size">¿Qué diferencia hay?</h3>



<p class="has-medium-font-size wp-block-paragraph">En sistema PAL se producen 50 interrupciones por segundo, mientras que en sistema NTSC el número de interrupciones por segundo asciende a 60.</p>



<h3 id="como-nos-afecta" class="wp-block-heading has-large-font-size">¿Cómo nos afecta? </h3>



<p class="has-medium-font-size wp-block-paragraph">Nos puede llegar a afectar y mucho. Si nuestro programa se apoya en las interrupciones para temporizar, por ejemplo ejecutando la rutina de movimiento del enemigo cada cinco interrupciones, en un sistema PAL el enemigo se moverá cinco veces por segundo, mientras que en NTSC se moverá seis veces por segundo, resultando el movimiento del enemigo más rápido en NTSC que en PAL, pudiendo influir en la jugabilidad.</p>



<h3 id="como-averiguamos-el-sistema" class="wp-block-heading has-large-font-size">¿Cómo averiguamos el sistema?</h3>



<p class="has-medium-font-size wp-block-paragraph">En este caso me he apoyado en el emulador Es.pectrum de Habisoft, que podéis descargar desde <a href="https://habisoft.com/espectrum/" target="_blank" rel="noreferrer noopener nofollow">aquí</a>.</p>



<p class="has-medium-font-size wp-block-paragraph">Este maravilloso emulador emula una vasta variedad de modelos de ZX Spectrum y sus clones, por lo que es ideal para probar el programa que he implementado para detectar si es PAL o NTSC, y además es gratuito.</p>



<p class="has-medium-font-size wp-block-paragraph">El programa es sencillo, activa la interrupciones del ZX Spectrum en modo 2 y la primera vez que se ejecuta la rutina de interrupciones pone swCount a uno para indicar que se vaya incrementando la variable counter en el bucle principal. La segunda vez que se ejecuta la rutina de interrupciones pone swCount a dos para indicar que se debe salir el programa. El valor de counter se carga en BC para que se pueda obtener desde Basic.</p>



<p class="has-medium-font-size wp-block-paragraph">En resumen, el programa cuenta las veces que se ejecuta el bucle principal entre dos interrupciones. En base a los resultados arrojados por la pruebas, podríamos decir que NTSC arroja valores inferiores a 100, mientras que PAL los arroja superiores.</p>



<p class="has-medium-font-size wp-block-paragraph">Todo esto hay que tratarlo con mucho cuidado, si observáis los resultados podéis ver valores que están al límite.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(3 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; Programa para averiguar si es NTSC o PAL
; Compilar: pasmo --name PAL_NTSC --tapbas PAL_NTSC.asm PAL_NTSC.tap
; Una vez cargado, ejecutar PRINT USR 32000 para ver el resultado
; No compatible con modelo de 16K

; Resultados de PRINT USR 32000 usando emulador Es.pectrum
;
; https://habisoft.com/espectrum/
;
; Sinclair:
;       48/48+                  216
;       48 NTSC                  64
;       128                     230
;       48 ar                   ¿?
;       48 se                   215
; Timex:
;       TS 2068                  64
;       TC 2068                 216
;       TC 2048                 216
;       Komputer 2086           216
; Investrónica:
;       48+ es                  215
;       128+ es                 230
;       Inves+                  230
; Amstrad:
;       +2                      230
;       +2 es                   230
;       +2 fr                   230
;       +2 ar                   ¿?
;       +2A 4.0                 230
;       +2A 4.1                 230
;       +2A 4.0 es              230
;       +2A 4.1 es              230
;       +2A ar                  ¿?
;       +3 4.0                  230
;       +3 4.1                  230
;       +3 4.0 es               230
;       +3 4.1 es               230
; Pentagon:
;       Pentagon 128            241
;       Pentagon 512            241
;       Pentagon 1024 SL        227
; ZS Rechearch:
;       Leningrad               184
;       Scorpion ZS-256         151
;       Scorpion ZS-256 Turbo+  215
; Microdigital:
;       Tk90x pt-BR              73
;       Tk90x es-AR             233
;       Tk95  pt-BR              72
;       Tk95  es-AR             233
; ATM:
;       ATM-Turbo               215
;       ATM-Turbo 2+            176
; Otros:
;       Orel BK-08               ¿?
;       Dubna 48K                15
;       HC-91                   230
;       BK-001                  105
;       Foton-Ik03               ¿?
;       Alf TV Game (Elf)        ¿?
;       Vesta IK-30             184
; Mods:
;       +3e                     230
;       +3e es                  230
;       +2e                     230
;       +2e es                  230
;       Pentagon es             241
; Virtuales:
;       Spec256 48K             216
;       Spect256 128K           230
org  $8000

; Entrada: prepara las interrupciones
main:
ld   hl, isr            ; HL = dirección rutina interrupciones
ld   ($feff), hl        ; Guarda en $feff la dirección
ld   a, $fe             ; de la rutina isr
ld   i, a               ; I = $fe
im   2                  ; Pasa a modo 2 de interrupciones

; Bucle, espera a que swCount sea 1 para empezar a contar
; Cuando swCount es 2, sale del bucle y fin de programa
loop:
ld   a, (swCount)       ; A = indicador para saber si contar
or   a                  ; ¿A = 0?
jr   z, loop            ; Z = sí, salta
cp   $02                ; ¿A = 2?
jr   z, exit            ; Z = sí, salta

ld   hl, counter        ; HL = dirección contador
inc  (hl)               ; Contador+=1

jr   loop               ; Bucle

; Salida del programa
; Pone las interrupciones en modo 1
; Pone el contador en BC para que pueda ser recuperado
; desde BASIC
exit:
im   1                  ; Pasa a modo 1 de interrupciones
ld   b, $00
ld   a, (counter)
ld   c, a               ; BC = contador, para devolver el resultado
ret                     ; Vuelta al BASIC

; Rutina de interrupciones
; En cada interrupción incrementa swCount
isr:
push hl                 ; Preserva HL

ld   hl, swCount
inc  (hl)               ; Incrementa el indicador para saber si contar

pop  hl                 ; Recupera HL

ei                      ; Habilita interrupciones
ret                     ; Sale

; Variables
swCount:                ; Indicador para saber si contar
db $00
counter:                ; Contador
db $00" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; Programa para averiguar si es NTSC o PAL</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Compilar: pasmo --name PAL_NTSC --tapbas PAL_NTSC.asm PAL_NTSC.tap</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Una vez cargado, ejecutar PRINT USR 32000 para ver el resultado</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; No compatible con modelo de 16K</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Resultados de PRINT USR 32000 usando emulador Es.pectrum</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; https://habisoft.com/espectrum/</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Sinclair:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       48/48+                  216</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       48 NTSC                  64</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       128                     230</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       48 ar                   ¿?</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       48 se                   215</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Timex:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       TS 2068                  64</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       TC 2068                 216</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       TC 2048                 216</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Komputer 2086           216</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Investrónica:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       48+ es                  215</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       128+ es                 230</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Inves+                  230</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Amstrad:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       +2                      230</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       +2 es                   230</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       +2 fr                   230</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       +2 ar                   ¿?</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       +2A 4.0                 230</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       +2A 4.1                 230</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       +2A 4.0 es              230</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       +2A 4.1 es              230</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       +2A ar                  ¿?</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       +3 4.0                  230</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       +3 4.1                  230</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       +3 4.0 es               230</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       +3 4.1 es               230</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Pentagon:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Pentagon 128            241</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Pentagon 512            241</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Pentagon 1024 SL        227</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; ZS Rechearch:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Leningrad               184</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Scorpion ZS-256         151</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Scorpion ZS-256 Turbo+  215</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Microdigital:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Tk90x pt-BR              73</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Tk90x es-AR             233</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Tk95  pt-BR              72</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Tk95  es-AR             233</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; ATM:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       ATM-Turbo               215</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       ATM-Turbo 2+            176</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Otros:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Orel BK-08               ¿?</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Dubna 48K                15</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       HC-91                   230</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       BK-001                  105</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Foton-Ik03               ¿?</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Alf TV Game (Elf)        ¿?</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Vesta IK-30             184</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Mods:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       +3e                     230</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       +3e es                  230</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       +2e                     230</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       +2e es                  230</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Pentagon es             241</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Virtuales:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Spec256 48K             216</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       Spect256 128K           230</span></span>
<span class="line"><span style="color: #002339">org  </span><span style="color: #174781">$8000</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: prepara las interrupciones</span></span>
<span class="line"><span style="color: #7EB233">main:</span></span>
<span class="line"><span style="color: #002339">ld   hl, isr            </span><span style="color: #357B42; font-style: italic">; HL = dirección rutina interrupciones</span></span>
<span class="line"><span style="color: #002339">ld   ($feff), hl        </span><span style="color: #357B42; font-style: italic">; Guarda en $feff la dirección</span></span>
<span class="line"><span style="color: #002339">ld   a, $fe             </span><span style="color: #357B42; font-style: italic">; de la rutina isr</span></span>
<span class="line"><span style="color: #002339">ld   i, a               </span><span style="color: #357B42; font-style: italic">; I = $fe</span></span>
<span class="line"><span style="color: #002339">im   </span><span style="color: #174781">2</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Pasa a modo 2 de interrupciones</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Bucle, espera a que swCount sea 1 para empezar a contar</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Cuando swCount es 2, sale del bucle y fin de programa</span></span>
<span class="line"><span style="color: #7B30D0">loop</span><span style="color: #002339">:</span></span>
<span class="line"><span style="color: #002339">ld   a, (swCount)       </span><span style="color: #357B42; font-style: italic">; A = indicador para saber si contar</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">   a                  </span><span style="color: #357B42; font-style: italic">; ¿A = 0?</span></span>
<span class="line"><span style="color: #002339">jr   z, </span><span style="color: #7B30D0">loop</span><span style="color: #002339">            </span><span style="color: #357B42; font-style: italic">; Z = sí, salta</span></span>
<span class="line"><span style="color: #002339">cp   </span><span style="color: #174781">$02</span><span style="color: #002339">                </span><span style="color: #357B42; font-style: italic">; ¿A = 2?</span></span>
<span class="line"><span style="color: #002339">jr   z, exit            </span><span style="color: #357B42; font-style: italic">; Z = sí, salta</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld   hl, counter        </span><span style="color: #357B42; font-style: italic">; HL = dirección contador</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">  (hl)               </span><span style="color: #357B42; font-style: italic">; Contador+=1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">jr   </span><span style="color: #7B30D0">loop</span><span style="color: #002339">               </span><span style="color: #357B42; font-style: italic">; Bucle</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Salida del programa</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Pone las interrupciones en modo 1</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Pone el contador en BC para que pueda ser recuperado</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; desde BASIC</span></span>
<span class="line"><span style="color: #7EB233">exit:</span></span>
<span class="line"><span style="color: #002339">im   </span><span style="color: #174781">1</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Pasa a modo 1 de interrupciones</span></span>
<span class="line"><span style="color: #002339">ld   b, </span><span style="color: #174781">$00</span></span>
<span class="line"><span style="color: #002339">ld   a, (counter)</span></span>
<span class="line"><span style="color: #002339">ld   c, a               </span><span style="color: #357B42; font-style: italic">; BC = contador, para devolver el resultado</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                     </span><span style="color: #357B42; font-style: italic">; Vuelta al BASIC</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Rutina de interrupciones</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; En cada interrupción incrementa swCount</span></span>
<span class="line"><span style="color: #7EB233">isr:</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339"> hl                 </span><span style="color: #357B42; font-style: italic">; Preserva HL</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld   hl, swCount</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">  (hl)               </span><span style="color: #357B42; font-style: italic">; Incrementa el indicador para saber si contar</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">  hl                 </span><span style="color: #357B42; font-style: italic">; Recupera HL</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ei                      </span><span style="color: #357B42; font-style: italic">; Habilita interrupciones</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                     </span><span style="color: #357B42; font-style: italic">; Sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Variables</span></span>
<span class="line"><span style="color: #7EB233">swCount:</span><span style="color: #002339">                </span><span style="color: #357B42; font-style: italic">; Indicador para saber si contar</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span></span>
<span class="line"><span style="color: #7EB233">counter:</span><span style="color: #002339">                </span><span style="color: #357B42; font-style: italic">; Contador</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span></span></code></pre></div>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af49316cbe0d&quot;}" data-wp-interactive="core/image" data-wp-key="6af49316cbe0d" class="wp-block-image aligncenter size-full wp-lightbox-container"><img data-recalc-dims="1" decoding="async" width="642" height="556" data-attachment-id="5405" data-permalink="https://espamatica.com/ensamblador-zx-spectrum-utilidades/pal_ntsc/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2024/02/PAL_NTSC.png?fit=642%2C556&amp;ssl=1" data-orig-size="642,556" data-comments-opened="1" data-image-title="PAL_NTSC" data-image-description="" data-image-caption="&lt;p&gt;ZX Spectrum &amp;#8211; PAL vs NTSC&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2024/02/PAL_NTSC.png?fit=642%2C556&amp;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2024/02/PAL_NTSC.png?resize=642%2C556&#038;ssl=1" alt="ZX Spectrum - PAL vs NTSC" class="wp-image-5405" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2024/02/PAL_NTSC.png?w=642&amp;ssl=1 642w, https://i0.wp.com/espamatica.com/wp-content/uploads/2024/02/PAL_NTSC.png?resize=300%2C260&amp;ssl=1 300w" sizes="(max-width: 642px) 100vw, 642px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">ZX Spectrum &#8211; PAL o NTSC</figcaption></figure>



<h2 id="descargas" class="wp-block-heading has-x-large-font-size">Descargas</h2>



<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="http://tinyurl.com/22srfwmz" target="_blank" rel="noreferrer noopener nofollow">Modelo ZX Spectrum</a></li>



<li class="has-medium-font-size"><a href="http://tinyurl.com/22qwfmwf" target="_blank" rel="noreferrer noopener sponsored nofollow">PAL o NTSC</a></li>
</ul>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://espamatica.com/ensamblador-zx-spectrum-utilidades/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5391</post-id>	</item>
		<item>
		<title>Ensamblador para ZX Spectrum. ¿Hacemos un juego?</title>
		<link>https://espamatica.com/ensamblador-para-zx-spectrum-hacemos-un-juego/</link>
					<comments>https://espamatica.com/ensamblador-para-zx-spectrum-hacemos-un-juego/#comments</comments>
		
		<dc:creator><![CDATA[Juan Antonio Rubio García]]></dc:creator>
		<pubDate>Sun, 17 Sep 2023 09:11:33 +0000</pubDate>
				<category><![CDATA[Ensamblador Z80]]></category>
		<category><![CDATA[Novedades]]></category>
		<category><![CDATA[Retro]]></category>
		<category><![CDATA[ZX Spectrum]]></category>
		<guid isPermaLink="false">https://espamatica.com/?p=3944</guid>

					<description><![CDATA[Manual para aprender a programar en ensamblador para el procesador Z80 del ZX Spectrum. Toda la teoría explicada con detalle y decenas de ejercicios prácticos para conseguirlo.]]></description>
										<content:encoded><![CDATA[
<p class="has-medium-font-size wp-block-paragraph">Lo que hasta hace poco no era más que una quimera, «Ensamblador para ZX Spectrum. ¿Hacemos un juego?» se ha convertido en realidad y ya está a la venta mi primer libro.</p>



<p class="has-medium-font-size wp-block-paragraph">En este libro recojo los <a href="https://espamatica.com/category/ensambladorz80/">tutoriales</a> que he publicado en este mismo sitio, revisados y unificados en un solo tomo de 472 páginas, disponible en papel con tapa blanda y tapa dura, o en Kindle. Es una autoedición con Amazon, por lo que lo puedes encontrar en cualquiera de sus sitios; te dejo el enlace de <a href="https://www.amazon.es/Ensamblador-para-ZX-Spectrum-%C2%BFHacemos/dp/B0C8QW1G55/" target="_blank" rel="noreferrer noopener nofollow">Amazon.es</a> y la vista previa gratuita.</p>



<figure class="wp-block-embed aligncenter is-type-rich is-provider-amazon wp-block-embed-amazon"><div class="wp-block-embed__wrapper">
<iframe title="Ensamblador para ZX Spectrum: ¿Hacemos un juego?" type="text/html" width="800" height="550" frameborder="0" allowfullscreen style="max-width:100%" src="https://leer.amazon.es/kp/card?preview=inline&#038;linkCode=kpd&#038;ref_=k4w_oembed_TWG6rSN2Zedf8f&#038;asin=B0C91HS5FF&#038;tag=kpembed-20"></iframe>
</div><figcaption class="wp-element-caption">Ensamblador para ZX Spectrum. ¿Hacemos un juego?</figcaption></figure>


<div role="navigation" aria-label="Tabla de contenidos" class="simpletoc wp-block-simpletoc-toc"><h2 class="simpletoc-title">Tabla de contenidos</h2>
<ul class="simpletoc-list">
<li><a href="#objetivo-de-ensamblador-para-zx-spectrum-hacemos-un-juego">Objetivo de Ensamblador para ZX Spectrum. ¿Hacemos un juego?</a>
</li>
<li><a href="#colaboraciones">Colaboraciones</a>
</li>
<li><a href="#por-que-comprar-este-libro">¿Por qué comprar este libro?</a>
</li>
<li><a href="#imagenes-promocionales">Imágenes promocionales</a>
</li></ul></div>


<h2 id="objetivo-de-ensamblador-para-zx-spectrum-hacemos-un-juego" class="wp-block-heading has-large-font-size">Objetivo de Ensamblador para ZX Spectrum. ¿Hacemos un juego?</h2>



<p class="has-medium-font-size wp-block-paragraph">El objetivo del libro es introducirte paso a paso en la programación en ensamblador para ZX Spectrum. Aunque en el inicio se muestra una parte importante de teoría, una vez pasado este mal, pero necesario, trago te meterás de lleno en la programación, viendo resultados según vayas avanzando.</p>



<p class="has-medium-font-size wp-block-paragraph">A lo largo del libro te guiaré para desarrollar el ineludible «Hola Mundo», primer programa que se desarrolla casi siempre al aprender un lenguaje, un clon de Pong con movimiento al píxel, un sencillo mata marcianos con música «in game», y Las Tres en Raya, donde podrás probar tu habilidad contra amigos y conocidos, o contra el propio Spectrum.</p>



<h2 id="colaboraciones" class="wp-block-heading has-large-font-size">Colaboraciones</h2>



<p class="has-medium-font-size wp-block-paragraph">El libro contiene los prólogos de tres grandes amigos: Emilio Serrano García, Javier Serrano García y Javier García Navarro. Los hermanos Serrano llevan haciendo videojuegos desde mediados de los años 80. Suyo es <a href="https://spectrumcomputing.co.uk/entry/14425/ZX-Spectrum/The_Prayer_of_the_Warrior" target="_blank" rel="noreferrer noopener nofollow">The Prayer Of The Warrior</a>, han participado en PC Fútbol, Praetorians o Fable. A Javier García Navarro no hace falta presentarle. Suyo es el código de los juegos de 4MHz, muchas son las joyas que nos ha regalado para Amstrad CPC y muy esperado es el proyecto que están desarrollando para NES, Malasombra.</p>



<p class="has-medium-font-size wp-block-paragraph">La portada, lomo, contraportada e imágenes promocionales son de otro gran amigo, Felipe Monge Corbalán. A los mandos de <a href="https://playonretro.itch.io/" target="_blank" rel="noreferrer noopener nofollow">Play On Retro</a>, Felipe y sus colaboradores siguen haciendo llegar ediciones físicas de nuevos juegos para ZX Spectrum, Amstrad CPC y SEGA Megadrive. Además, Felipe se está haciendo cargo de la traducción para la futura edición inglesa.</p>



<h2 id="por-que-comprar-este-libro" class="wp-block-heading has-large-font-size">¿Por qué comprar este libro?</h2>



<p class="has-medium-font-size wp-block-paragraph">Si quieres adentrarte en la programación en ensamblador para ZX Spectrum, creo sinceramente que este libro te puede ayudar, la curva de aprendizaje es progresiva. Además, podrás encontrar ayuda en el grupo de <a href="https://t.me/EnsambladorZXSpectrum" target="_blank" rel="noreferrer noopener nofollow">Telegram</a> en el que podrás plantear tus dudas y resolverlas.</p>



<p class="has-medium-font-size wp-block-paragraph">Si me preguntas si este libro te va a ayudar a aprender a programar para otra máquina como el Amstrad CPC, el lenguaje ensamblador es el mismo para ZX Spectrum, Amstrad CPC o MSX, ya que todos llevan un microprocesador Z80, pero cada cual tiene una arquitectura diferente, una ROM distinta, etc. Si bien vas a aprender ensamblador, para que los ejemplos funcionen en otras máquinas tendrás que adaptarlos; los ejemplos de este libro están adaptados para que funcionen en ZX Spectrum de 16K, 48K y 128K.</p>



<p class="has-medium-font-size wp-block-paragraph">Si por otro lado, no estás en disposición de gastar dinero, o en tu zona no hay posibilidad de adquirirlo, siempre puedes seguir los tutoriales que hay en este mismo sitio, o directamente descargarlos en formato digital.</p>



<p class="has-medium-font-size wp-block-paragraph">Para acceder a los tutoriales, ve al menú Tutoriales Z80 y luego a Pong, Batalla espacial o Tres en raya (éste es el orden en el que debes seguir los tutoriales). En cualquiera de las entradas puedes descargar el tutorial completo en formato digital.</p>



<p class="has-medium-font-size wp-block-paragraph">En la página principal tienes los enlaces a <a href="https://espamatica.itch.io/" target="_blank" rel="noreferrer noopener nofollow">itch.io</a>; también podrás descargar los tutoriales desde allí.</p>



<h2 id="imagenes-promocionales" class="wp-block-heading has-large-font-size">Imágenes promocionales</h2>



<p class="has-medium-font-size wp-block-paragraph">Ya solo queda mostrar algunas de las imágenes que ha diseñado Felipe para la promoción del libro, y dar las gracias a todos los colaboradores y personas que me han animado a llevar a cabo este proyecto. Está muy visto lo de dar las gracias a la familia, pero la realidad es que han aguantado carros y carretas, así que muchas gracias a mi mujer y mis hijos por el apoyo incondicional.</p>



<figure data-carousel-extra='{&quot;blog_id&quot;:1,&quot;permalink&quot;:&quot;https://espamatica.com/ensamblador-para-zx-spectrum-hacemos-un-juego/&quot;}'  class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="800" height="528" data-attachment-id="3949" data-permalink="https://espamatica.com/libro-2-957/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/libro-2.957.png?fit=1000%2C660&amp;ssl=1" data-orig-size="1000,660" data-comments-opened="1" data-image-title="libro 2.957" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador para ZX Spectrum. ¿Hacemos un juego?&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/libro-2.957.png?fit=800%2C528&amp;ssl=1" data-id="3949" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/libro-2.957.png?resize=800%2C528&#038;ssl=1" alt="Ensamblador para ZX Spectrum. ¿Hacemos un juego?" class="wp-image-3949" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/libro-2.957.png?w=1000&amp;ssl=1 1000w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/libro-2.957.png?resize=300%2C198&amp;ssl=1 300w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/libro-2.957.png?resize=768%2C507&amp;ssl=1 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /><figcaption class="wp-element-caption">Ensamblador para ZX Spectrum. ¿Hacemos un juego?</figcaption></figure>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="800" height="534" data-attachment-id="3948" data-permalink="https://espamatica.com/libro-2-949/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/libro-2.949.png?fit=1000%2C667&amp;ssl=1" data-orig-size="1000,667" data-comments-opened="1" data-image-title="libro 2.949" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador para ZX Spectrum. ¿Hacemos un juego?&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/libro-2.949.png?fit=800%2C534&amp;ssl=1" data-id="3948" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/libro-2.949.png?resize=800%2C534&#038;ssl=1" alt="Ensamblador para ZX Spectrum. ¿Hacemos un juego?" class="wp-image-3948" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/libro-2.949.png?w=1000&amp;ssl=1 1000w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/libro-2.949.png?resize=300%2C200&amp;ssl=1 300w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/libro-2.949.png?resize=768%2C512&amp;ssl=1 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /><figcaption class="wp-element-caption">Ensamblador para ZX Spectrum. ¿Hacemos un juego?</figcaption></figure>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="800" height="534" data-attachment-id="3947" data-permalink="https://espamatica.com/libro-2-936/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/libro-2.936.png?fit=1000%2C667&amp;ssl=1" data-orig-size="1000,667" data-comments-opened="1" data-image-title="libro 2.936" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador para ZX Spectrum. ¿Hacemos un juego?&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/libro-2.936.png?fit=800%2C534&amp;ssl=1" data-id="3947" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/libro-2.936.png?resize=800%2C534&#038;ssl=1" alt="Ensamblador para ZX Spectrum. ¿Hacemos un juego?" class="wp-image-3947" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/libro-2.936.png?w=1000&amp;ssl=1 1000w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/libro-2.936.png?resize=300%2C200&amp;ssl=1 300w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/libro-2.936.png?resize=768%2C512&amp;ssl=1 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /><figcaption class="wp-element-caption">Ensamblador para ZX Spectrum. ¿Hacemos un juego?</figcaption></figure>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="800" height="534" data-attachment-id="3946" data-permalink="https://espamatica.com/asm-01-939/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/ASM-01.939.png?fit=1125%2C750&amp;ssl=1" data-orig-size="1125,750" data-comments-opened="1" data-image-title="ASM 01.939" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador para ZX Spectrum. ¿Hacemos un juego?&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/ASM-01.939.png?fit=800%2C534&amp;ssl=1" data-id="3946" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/ASM-01.939.png?resize=800%2C534&#038;ssl=1" alt="Ensamblador para ZX Spectrum. ¿Hacemos un juego?" class="wp-image-3946" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/ASM-01.939.png?resize=1024%2C683&amp;ssl=1 1024w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/ASM-01.939.png?resize=300%2C200&amp;ssl=1 300w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/ASM-01.939.png?resize=768%2C512&amp;ssl=1 768w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/06/ASM-01.939.png?w=1125&amp;ssl=1 1125w" sizes="auto, (max-width: 800px) 100vw, 800px" /><figcaption class="wp-element-caption">Ensamblador para ZX Spectrum. ¿Hacemos un juego?</figcaption></figure>
</figure>
]]></content:encoded>
					
					<wfw:commentRss>https://espamatica.com/ensamblador-para-zx-spectrum-hacemos-un-juego/feed/</wfw:commentRss>
			<slash:comments>17</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3944</post-id>	</item>
		<item>
		<title>Ensamblador ZX Spectrum &#8211; Fe de erratas</title>
		<link>https://espamatica.com/ensamblador-zx-spectrum-fe-de-erratas/</link>
					<comments>https://espamatica.com/ensamblador-zx-spectrum-fe-de-erratas/#comments</comments>
		
		<dc:creator><![CDATA[Juan Antonio Rubio García]]></dc:creator>
		<pubDate>Tue, 12 Sep 2023 20:21:44 +0000</pubDate>
				<category><![CDATA[ZX Spectrum]]></category>
		<category><![CDATA[Ensamblador Z80]]></category>
		<category><![CDATA[Retro]]></category>
		<category><![CDATA[Ensamblador]]></category>
		<category><![CDATA[Fe de erratas]]></category>
		<category><![CDATA[Z80]]></category>
		<guid isPermaLink="false">https://espamatica.com/?p=4598</guid>

					<description><![CDATA[A continuación, se muestra la fe de erratas del libro «Ensamblador para ZX Spectrum. ¿Hacemos un juego?«, disponible en Amazon]]></description>
										<content:encoded><![CDATA[
<p class="has-medium-font-size wp-block-paragraph">A continuación, se muestra la fe de erratas del libro «<a href="https://espamatica.com/ensamblador-para-zx-spectrum-hacemos-un-juego/">Ensamblador para ZX Spectrum. ¿Hacemos un juego?</a>«, disponible en <a href="https://www.amazon.es/dp/B0C8QW1G55" target="_blank" rel="noreferrer noopener nofollow">Amazon</a> con las referencias:</p>



<ul class="wp-block-list">
<li>B0C91HS5FF</li>



<li>B0C8QW1G55</li>



<li>B0C8RBK7QF</li>
</ul>



<p class="has-medium-font-size wp-block-paragraph">Puedes descargar la <a href="https://tinyurl.com/ykge2ykz" target="_blank" rel="noreferrer noopener nofollow">Fe de erratas</a> en formato PDF para imprimirlas y adjuntarlas al libro.</p>



<p class="has-text-align-center has-black-color has-light-green-cyan-background-color has-text-color has-background has-medium-font-size wp-block-paragraph">Actualizado el libro en Amazon a la segunda edición, con las erratas corregidas.</p>



<h2 id="ensamblador-zx-spectrum-fe-de-erratas" class="wp-block-heading has-large-font-size">Ensamblador ZX Spectrum, fe de erratas</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">25</td><td class="has-text-align-left" data-align="left">25</td></tr><tr><td class="has-text-align-left" data-align="left">Es el microprocesador del que dispone el ZX Spectrum <mark style="background-color:#abb8c3" class="has-inline-color">en sus todos sus modelos</mark>.</td><td class="has-text-align-left" data-align="left">Es el microprocesador del que dispone el ZX Spectrum <font color="red"><mark style="background-color:#abb8c3" class="has-inline-color">en todos sus modelos</mark></font>.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">26</td><td class="has-text-align-left" data-align="left">26</td></tr><tr><td class="has-text-align-left" data-align="left">Otra característica del Z80, que en ocasiones no nos gustará, es que no <mark style="background-color:#abb8c3" class="has-inline-color">es un ortogonal</mark>…</td><td class="has-text-align-left" data-align="left">Otra característica del Z80, que en ocasiones no nos gustará, es que no <font color="red"><mark style="background-color:#abb8c3" class="has-inline-color">es ortogonal</mark></font>…</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">35</td><td class="has-text-align-left" data-align="left">35</td></tr><tr><td class="has-text-align-left" data-align="left">&#8211; <strong>JR NZ, n</strong>: salta a la dirección de memoria que está a <strong>n</strong> bytes si el flag Z está a cero; el resultado de la última operación no es cero.<br>&#8211;<mark style="background-color:#abb8c3" class="has-inline-color"> <strong>JP Z, n</strong></mark>: salta a la dirección de memoria que está a <strong>n</strong> bytes si el flag Z está a uno; el resultado de la última operación es cero.</td><td class="has-text-align-left" data-align="left">&#8211; <strong>JR NZ, n</strong>: salta a la dirección de memoria que está a <strong>n</strong> bytes si el flag Z está a cero; el resultado de la última operación no es cero.<br>&#8211; <strong><font color="red"><mark style="background-color:#abb8c3" class="has-inline-color">JR Z, n</mark></font></strong>: salta a la dirección de memoria que está a <strong>n</strong> bytes si el flag Z está a uno; el resultado de la última operación es cero.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">36</td><td class="has-text-align-left" data-align="left">36</td></tr><tr><td class="has-text-align-left" data-align="left"><font color="red"><mark style="background-color:#abb8c3" class="has-inline-color">Lo valores</mark></font> siempre son registros de 16 bits.</td><td class="has-text-align-left" data-align="left"><font color="red"><mark style="background-color:#abb8c3" class="has-inline-color">Los valores</mark></font> siempre son registros de 16 bits.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">37</td><td class="has-text-align-left" data-align="left">37</td></tr><tr><td class="has-text-align-left" data-align="left"><font color="red"><mark style="background-color:#abb8c3" class="has-inline-color">Editamos a holamundo.asm</mark></font> y llamamos con CALL a rutinas de la ROM; …</td><td class="has-text-align-left" data-align="left"><font color="red"><mark style="background-color:#abb8c3" class="has-inline-color">Editamos holamundo.asm</mark></font> y llamamos con CALL a rutinas de la ROM; …</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">39</td><td class="has-text-align-left" data-align="left">39</td></tr><tr><td class="has-text-align-left" data-align="left">Ya hemos desarrollado nuestro primer programa en ensamblador para ZX Spectrum; comenzamos el <font color="red"><mark style="background-color:#abb8c3" class="has-inline-color">desarrollo ZX-Pong</mark></font>.</td><td class="has-text-align-left" data-align="left">Ya hemos desarrollado nuestro primer programa en ensamblador para ZX Spectrum; comenzamos el <font color="red"><mark style="background-color:#abb8c3" class="has-inline-color">desarrollo de ZX-Pong</mark></font>.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">49</td><td class="has-text-align-left" data-align="left">49</td></tr><tr><td class="has-text-align-left" data-align="left">Vamos a desarrollar una rutina para comprobar si se ha pulsado alguna de las teclas de control, &#8230;</td><td class="has-text-align-left" data-align="left">Vamos a desarrollar <font color="red"><mark style="background-color:#abb8c3" class="has-inline-color">en Controls.asm</mark></font> una rutina para comprobar si se ha pulsado alguna de las teclas de control, &#8230;</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">55</td><td class="has-text-align-left" data-align="left">55</td></tr><tr><td class="has-text-align-left" data-align="left">Cargamos el valor del color rojo en A, <strong>LD A, $02</strong> y escribimos este valor en el puerto $FE (<font color="red"><mark style="background-color:#abb8c3" class="has-inline-color">256</mark></font>), <strong>OUT ($FE), A</strong>.</td><td class="has-text-align-left" data-align="left">Cargamos el valor del color rojo en A, <strong>LD A, $02</strong> y escribimos este valor en el puerto $FE (<font color="red"><mark style="background-color:#abb8c3" class="has-inline-color">254</mark></font>), <strong>OUT ($FE), A</strong>.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">57</td><td class="has-text-align-left" data-align="left">57</td></tr><tr><td class="has-text-align-left" data-align="left">Una vez realizado esto, <font color="red"><mark style="background-color:#abb8c3" class="has-inline-color">incrementa HL y DE</mark></font>. Repite en bucle hasta que BC llegue a cero.</td><td class="has-text-align-left" data-align="left">Una vez realizado esto, <font color="red"><mark style="background-color:#abb8c3" class="has-inline-color">incrementa HL y DE y decrementa BC</mark></font>. Repite en bucle hasta que BC llegue a cero.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">57</td><td class="has-text-align-left" data-align="left">57</td></tr><tr><td class="has-text-align-left" data-align="left">Como se puede <mark style="background-color:#abb8c3" class="has-inline-color has-black-color">aprecia</mark> en la imagen, ya no sale la línea <strong>Bytes: PoromPong;</strong> …</td><td class="has-text-align-left" data-align="left">Como se puede <mark style="background-color:#abb8c3" class="has-inline-color">apreciar</mark> en la imagen, ya no sale la línea <strong>Bytes: PoromPong;</strong> …</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">68</td><td class="has-text-align-left" data-align="left">68</td></tr><tr><td class="has-text-align-left" data-align="left">Por último, <mark style="background-color:#abb8c3" class="has-inline-color">tras de pintar</mark> las palas vamos a sustituir <strong>RET</strong> por <strong>JR loop</strong>, para quedarnos en un bucle infinito.</td><td class="has-text-align-left" data-align="left">Por último, <mark style="background-color:#abb8c3" class="has-inline-color">tras pintar</mark> las palas vamos a sustituir <strong>RET</strong> por <strong>JR loop</strong>, para quedarnos en un bucle infinito.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">113</td><td class="has-text-align-left" data-align="left">113</td></tr><tr><td class="has-text-align-left" data-align="left"><code>getPointSprite_loop:<br>dec  a                   ; Decrementa A<br>ret  z                   ; A = 0, fin de rutina<br>add  hl, bc              ; Suma 4 a dirección sprite<br>jr   getPointSprite_loop ; Bucle hasta que A = 0<br><mark style="background-color:#abb8c3" class="has-inline-color">ret</mark></code></td><td class="has-text-align-left" data-align="left"><code>getPointSprite_loop:<br>dec&nbsp;&nbsp;&nbsp; a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; Decrementa A<br>ret&nbsp;&nbsp;&nbsp; z&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; A = 0, fin de rutina<br>add&nbsp;&nbsp;&nbsp; hl, bc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; Suma 4 a dirección sprite<br>jr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getPointSprite_loop ; Bucle hasta que A = 0</code></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">114</td><td class="has-text-align-left" data-align="left">114</td></tr><tr><td class="has-text-align-left" data-align="left">Cargamos los puntos del jugador uno en A, <strong><font color="red"><mark style="background-color:#abb8c3" class="has-inline-color">LD A, (points)</mark></font></strong>, &#8230;</td><td class="has-text-align-left" data-align="left">Cargamos los puntos del jugador uno en A, <strong><font color="red"><mark style="background-color:#abb8c3" class="has-inline-color">LD A, (p1points)</mark></font></strong>, &#8230;</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">118</td><td class="has-text-align-left" data-align="left">118</td></tr><tr><td class="has-text-align-left" data-align="left"><code><mark style="background-color:#abb8c3" class="has-inline-color">call reprintPoint_print ; Pinta 1er dígito marcador jugador 1</mark><br>&nbsp;<br>pop  hl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; Recupera valor de HL<br>; 2º dígito del jugador 1<br>inc  hl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>inc  hl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; HL = parte baja dirección 2º dígito<br>ld   e, (hl)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; E = (HL)<br>inc  hl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; HL = parte alta dirección 2º dígito<br>ld   d, (hl) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; D = (HL)<br>ld   hl, POINTS_P1 &nbsp;&nbsp;; HL = dirección memoria donde pintar<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;; puntos jugador 1<br>inc  l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; HL = dirección donde pintar 2º dígito<br><mark style="background-color:#abb8c3" class="has-inline-color">call reprintPoint_print ; Pinta 2º dígito marcador jugador 1</mark><br>&nbsp;<br>ld   a, (p2points)&nbsp;&nbsp; ; A = puntos jugador 2<br>call GetPointSprite&nbsp; ; Obtiene sprite a pintar en marcador<br>push hl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Preserva valor de HL<br>; 1er dígito del jugador 2<br>ld   e, (hl)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; HL = parte baja dirección 1er dígito<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; E = (HL)<br>inc  hl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; HL = parte alta dirección 1er dígito<br>ld   d, (hl) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; D = (HL)<br>ld   hl, POINTS_P2&nbsp;&nbsp; ; HL = dirección memoria donde pintar<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; puntos jugador 2<br><mark style="background-color:#abb8c3" class="has-inline-color">call reprintPoint_print ; Pinta 1er dígito marcador jugador 2</mark></code></td><td class="has-text-align-left" data-align="left"><code><strong><mark style="background-color:#abb8c3" class="has-inline-color">call reprintPoint_print ; Pinta 1er dígito marcador jugador 1</mark></strong><br>&nbsp;<br>pop  hl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Recupera valor de HL<br>; 2º dígito del jugador 1<br>inc  hl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>inc  hl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; HL = parte baja dirección 2º dígito<br>ld   e, (hl) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; E = (HL)<br>inc  hl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; HL = parte alta dirección 2º dígito<br>ld   d, (hl)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; D = (HL)<br>ld   hl, POINTS_P1&nbsp;&nbsp; ; HL = dirección memoria donde pintar<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; puntos jugador 1<br>inc  l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; HL = dirección donde pintar 2º dígito<br><strong><mark style="background-color:#abb8c3" class="has-inline-color">call reprintPoint_print ; Pinta 2º dígito marcador jugador 1</mark></strong><br>&nbsp;<br>ld   a, (p2points)&nbsp;&nbsp; ; A = puntos jugador 2<br>call GetPointSprite&nbsp; ; Obtiene sprite a pintar en marcador<br>push hl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Preserva valor de HL<br>; 1er dígito del jugador 2<br>ld   e, (hl)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; HL = parte baja dirección 1er dígito<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; E = (HL)<br>inc  hl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; HL = parte alta dirección 1er dígito<br>ld   d, (hl) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; D = (HL)<br>ld   hl, POINTS_P2&nbsp;&nbsp; ; HL = dirección memoria donde pintar<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; puntos jugador 2<br><strong><mark style="background-color:#abb8c3" class="has-inline-color">call reprintPoint_print ; Pinta 1er dígito marcador jugador 2</mark></strong></code></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">127</td><td class="has-text-align-left" data-align="left">127</td></tr><tr><td class="has-text-align-left" data-align="left"><code><strong>SetBallRight</strong>:<br>ld&nbsp;&nbsp; hl, <strong>$4d7f</strong><br>ld&nbsp;&nbsp; (ballPos), hl<br>ld&nbsp;&nbsp; a, <strong>$ff</strong><br>ld&nbsp;&nbsp; (ballRotation), a<br>ld&nbsp;&nbsp; a, (ballSetting)<br><mark style="background-color:#abb8c3" class="has-inline-color">or&nbsp;&nbsp; $40</mark></code></td><td class="has-text-align-left" data-align="left"><code><strong>SetBallRight</strong>:<br>ld&nbsp;&nbsp; hl, <strong>$4d7f</strong><br>ld&nbsp;&nbsp; (ballPos), hl<br>ld&nbsp;&nbsp; a, <strong>$ff</strong><br>ld&nbsp;&nbsp; (ballRotation), a<br>ld&nbsp;&nbsp; a, (ballSetting)<br><strong><mark style="background-color:#abb8c3" class="has-inline-color">or&nbsp;&nbsp; $40</mark></strong></code></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">130</td><td class="has-text-align-left" data-align="left">130</td></tr><tr><td class="has-text-align-left" data-align="left">La pala <mark style="background-color:#abb8c3" class="has-inline-color">que</mark> se pinta con el sprite que hemos definido.</td><td class="has-text-align-left" data-align="left">La pala <mark style="background-color:#abb8c3" class="has-inline-color">no</mark> se pinta con el sprite que hemos definido.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">131</td><td class="has-text-align-left" data-align="left">131</td></tr><tr><td class="has-text-align-left" data-align="left">En concreto, tenemos al final del archivo Main.asm, dos <mark style="background-color:#abb8c3" class="has-inline-color">JR Main</mark> y un JR Loop.</td><td class="has-text-align-left" data-align="left">En concreto, tenemos al final del archivo Main.asm, dos <mark style="background-color:#abb8c3" class="has-inline-color">JR Z, Main</mark> y un JR Loop.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">135</td><td class="has-text-align-left" data-align="left">135</td></tr><tr><td class="has-text-align-left" data-align="left"><code>; Dependiendo del lugar de colisión, inclinación y velocidad<br>ld&nbsp;&nbsp; a, c&nbsp; ; A = penúltimo scanline de pala<br>sub&nbsp; $15&nbsp;&nbsp; ; A = <mark style="background-color:#abb8c3" class="has-inline-color">primero</mark> scanline<br>ld&nbsp;&nbsp; c, a  ; C = A</code></td><td class="has-text-align-left" data-align="left"><code>; Dependiendo del lugar de colisión, inclinación y velocidad<br>ld&nbsp;&nbsp; a, c&nbsp; ; A = penúltimo scanline de pala<br>sub&nbsp; $15&nbsp;&nbsp; ; A = <mark style="background-color:#abb8c3" class="has-inline-color">primer</mark> scanline<br>ld&nbsp;&nbsp; c, a&nbsp; ; C = A</code></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">147</td><td class="has-text-align-left" data-align="left">147</td></tr><tr><td class="has-text-align-left" data-align="left">Y ahora hay cuatro rutinas que tenemos que cambiar <mark style="background-color:#abb8c3" class="has-inline-color">en G</mark>:</td><td class="has-text-align-left" data-align="left">Y ahora hay cuatro rutinas que tenemos que cambiar:</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">148</td><td class="has-text-align-left" data-align="left">148</td></tr><tr><td class="has-text-align-left" data-align="left"><mark style="background-color:#abb8c3" class="has-inline-color">De</mark> la rutina MoveBallY, y modificamos la segunda línea:</td><td class="has-text-align-left" data-align="left"><mark style="background-color:#abb8c3" class="has-inline-color">Localizamos</mark> la rutina MoveBallY, y modificamos la segunda línea:</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">153</td><td class="has-text-align-left" data-align="left">153</td></tr><tr><td class="has-text-align-left" data-align="left">Según vemos en la definición de los sprites, cada uno está a 4 bytes del otro, por eso hacemos <mark style="background-color:#abb8c3" class="has-inline-color">es</mark> un bucle …</td><td class="has-text-align-left" data-align="left">Según vemos en la definición de los sprites, cada uno está a 4 bytes del otro, por eso hacemos un bucle …</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">158</td><td class="has-text-align-left" data-align="left">158</td></tr><tr><td class="has-text-align-left" data-align="left">Localizamos la etiqueta CheckCrossY en el archivo <mark style="background-color:#abb8c3" class="has-inline-color">Video.asm</mark>, dieciséis líneas más abajo nos encontramos con esto.</td><td class="has-text-align-left" data-align="left">Localizamos la etiqueta CheckCrossY en el archivo <mark style="background-color:#abb8c3" class="has-inline-color">Game.asm</mark>, dieciséis líneas más abajo nos encontramos con esto.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">158</td><td class="has-text-align-left" data-align="left">158</td></tr><tr><td class="has-text-align-left" data-align="left">Si el resultado <mark style="background-color:#abb8c3" class="has-inline-color">en</mark> mayor que cero, salimos con el flag Z desactivado (no hay colisión).</td><td class="has-text-align-left" data-align="left">Si el resultado <mark style="background-color:#abb8c3" class="has-inline-color">es</mark> mayor que cero, salimos con el flag Z desactivado (no hay colisión).</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">169</td><td class="has-text-align-left" data-align="left">169</td></tr><tr><td class="has-text-align-left" data-align="left">Para lograrlo vamos a aplicar el mismo método que aplicamos <mark style="background-color:#abb8c3" class="has-inline-color">en paso</mark> 10 siguiendo los comentarios de Spirax; el camino que marcó.</td><td class="has-text-align-left" data-align="left">Para lograrlo vamos a aplicar el mismo método que aplicamos <mark style="background-color:#abb8c3" class="has-inline-color">en el paso</mark> 10 siguiendo los comentarios de Spirax; el camino que marcó.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">171</td><td class="has-text-align-left" data-align="left">171</td></tr><tr><td class="has-text-align-left" data-align="left"><code>printPoint_2_print:<br>…<br>ld&nbsp;&nbsp; hl, POINTS_P2&nbsp;&nbsp; ; HL = dirección <mark style="background-color:#abb8c3" class="has-inline-color">donde dígito</mark><br>call PrintPoint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Pinta 1er dígito<br>pop&nbsp; hl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Recupera HL</code></td><td class="has-text-align-left" data-align="left"><code>printPoint_2_print:<br>…<br>ld&nbsp;&nbsp; hl, POINTS_P2&nbsp;&nbsp; ; HL = dirección <mark style="background-color:#abb8c3" class="has-inline-color">donde pintar dígito</mark><br>call PrintPoint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Pinta 1er dígito<br>pop&nbsp; hl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Recupera HL</code></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">173</td><td class="has-text-align-left" data-align="left">173</td></tr><tr><td class="has-text-align-left" data-align="left">https://tinyurl.com/<mark style="background-color:#abb8c3" class="has-inline-color">2hl6j3uz</mark></td><td class="has-text-align-left" data-align="left">https://tinyurl.com/<mark style="background-color:#abb8c3" class="has-inline-color">26dfekly</mark></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">174</td><td class="has-text-align-left" data-align="left">174</td></tr><tr><td class="has-text-align-left" data-align="left">… el resto de bloques que se van a cargar,<mark style="background-color:#abb8c3" class="has-inline-color"> y que de esta forma que no borren</mark> parte de la pantalla de carga.</td><td class="has-text-align-left" data-align="left">… el resto de bloques que se van a cargar,<mark style="background-color:#abb8c3" class="has-inline-color"> y que de esta forma no borren</mark> parte de la pantalla de carga.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">191</td><td class="has-text-align-left" data-align="left">191</td></tr><tr><td class="has-text-align-left" data-align="left">Una vez hecho, al pintar con RST $10 cualquier carácter comprendido entre $90 y $A4, se <mark style="background-color:#abb8c3" class="has-inline-color">pintaran</mark> los gráficos que hemos definido.</td><td class="has-text-align-left" data-align="left">Una vez hecho, al pintar con RST $10 cualquier carácter comprendido entre $90 y $A4, se <mark style="background-color:#abb8c3" class="has-inline-color">pintarán</mark> los gráficos que hemos definido.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">191</td><td class="has-text-align-left" data-align="left">191</td></tr><tr><td class="has-text-align-left" data-align="left">Lo primero es indicar la dirección en la que <mark style="background-color:#abb8c3" class="has-inline-color">se</mark> vamos a cargar el programa, <strong>ORG $5DAD</strong>.</td><td class="has-text-align-left" data-align="left">Lo primero es indicar la dirección en la que vamos a cargar el programa, <strong>ORG $5DAD</strong>.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">193</td><td class="has-text-align-left" data-align="left">193</td></tr><tr><td class="has-text-align-left" data-align="left">En el archivo Var.asm, encima de <strong><mark style="background-color:#abb8c3" class="has-inline-color">udgsEnemiesLeve1</mark></strong>,vamos a añadir las siguientes líneas:</td><td class="has-text-align-left" data-align="left">En el archivo Var.asm, encima de <strong><mark style="background-color:#abb8c3" class="has-inline-color">udgsEnemiesLevel1</mark></strong>,vamos a añadir las siguientes líneas:</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">194</td><td class="has-text-align-left" data-align="left">194</td></tr><tr><td class="has-text-align-left" data-align="left">Cargamos la dirección de la <mark style="background-color:#abb8c3" class="has-inline-color">extensión DE</mark>, <strong>LD DE, udgsExtension</strong>, …</td><td class="has-text-align-left" data-align="left">Cargamos la dirección de la <mark style="background-color:#abb8c3" class="has-inline-color">extensión en DE</mark>, <strong>LD DE, udgsExtension</strong>, …</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">209</td><td class="has-text-align-left" data-align="left">209</td></tr><tr><td class="has-text-align-left" data-align="left">Ahora ya tenemos <mark style="background-color:#abb8c3" class="has-inline-color">nuestra área</mark> de juego.</td><td class="has-text-align-left" data-align="left">Ahora ya tenemos <mark style="background-color:#abb8c3" class="has-inline-color">nuestro área</mark> de juego.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">213</td><td class="has-text-align-left" data-align="left">213</td></tr><tr><td class="has-text-align-left" data-align="left">… siendo más rápido y ocupando menos que <mark style="background-color:#abb8c3" class="has-inline-color">si usamos usado</mark> la pila.</td><td class="has-text-align-left" data-align="left">… siendo más rápido y ocupando menos que <mark style="background-color:#abb8c3" class="has-inline-color">usando</mark> la pila.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">214</td><td class="has-text-align-left" data-align="left">214</td></tr><tr><td class="has-text-align-left" data-align="left"><code>printFrame_loop:<br>...<br>inc &nbsp;&nbsp; b &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; B = línea siguiente<br>ld &nbsp;&nbsp;&nbsp; a, b &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; A = B<br>cp &nbsp;&nbsp;&nbsp; $14 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; <mark style="background-color:#abb8c3" class="has-inline-color">¿A = 21?</mark><br>jr &nbsp;&nbsp;&nbsp;&nbsp;nz, printFrame_loop&nbsp;; <mark style="background-color:#abb8c3" class="has-inline-color">A != 21, sigue con el bucle</mark></code></td><td class="has-text-align-left" data-align="left"><code>printFrame_loop:<br>...<br>inc &nbsp;&nbsp; b &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; B = línea siguiente<br>ld &nbsp;&nbsp;&nbsp; a, b &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; A = B<br>cp &nbsp;&nbsp;&nbsp; $14 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; <mark style="background-color:#abb8c3" class="has-inline-color">¿A = 20?</mark><br>jr &nbsp;&nbsp;&nbsp;&nbsp;nz, printFrame_loop&nbsp;; <mark style="background-color:#abb8c3" class="has-inline-color">A != 20, sigue con el bucle</mark></code></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">219</td><td class="has-text-align-left" data-align="left">219</td></tr><tr><td class="has-text-align-left" data-align="left">… (antes de nada <mark style="background-color:#abb8c3" class="has-inline-color">añadimos include</mark> de Game.asm en Main.asm).</td><td class="has-text-align-left" data-align="left">… (antes de nada <mark style="background-color:#abb8c3" class="has-inline-color">añadimos el include</mark> de Game.asm en Main.asm).</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">220</td><td class="has-text-align-left" data-align="left">220</td></tr><tr><td class="has-text-align-left" data-align="left"><code>moveShip_right:<br>...<br>ld &nbsp;&nbsp;&nbsp; (shipPos), bc<br>&nbsp;<br><br><br>&nbsp;<br>ret</code></td><td class="has-text-align-left" data-align="left"><code>moveShip_right:<br>...<br>ld &nbsp;&nbsp;&nbsp; (shipPos), bc<br>&nbsp;<br><mark style="background-color:#abb8c3" class="has-inline-color">moveShip_print:<br>call PrintShip</mark><br>&nbsp;<br>ret</code></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">224</td><td class="has-text-align-left" data-align="left">224</td></tr><tr><td class="has-text-align-left" data-align="left">Deshabilitamos las interrupciones, <strong>DI</strong>, cargamos $28 (40) en el registro A, <strong>LD A, $28</strong>, <mark style="background-color:#abb8c3" class="has-inline-color">y lo cargamos I</mark>, <strong>LD I, A</strong>.</td><td class="has-text-align-left" data-align="left">Deshabilitamos las interrupciones, <strong>DI</strong>, cargamos $28 (40) en el registro A, <strong>LD A, $28</strong>, <mark style="background-color:#abb8c3" class="has-inline-color">y lo cargamos en I</mark>, <strong>LD I, A</strong>.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">229</td><td class="has-text-align-left" data-align="left">229</td></tr><tr><td class="has-text-align-left" data-align="left"><code>MoveFire:<br>…&nbsp;&nbsp;&nbsp;<br>ld&nbsp;&nbsp; bc, (shipPos)<br><mark style="background-color:#abb8c3" class="has-inline-color">inc&nbsp; h</mark><br>jr&nbsp;&nbsp; moveFire_print</code></td><td class="has-text-align-left" data-align="left"><code>MoveFire:<br>…<br>ld&nbsp;&nbsp; bc, (shipPos)<br><mark style="background-color:#abb8c3" class="has-inline-color">inc&nbsp; b</mark><br>jr&nbsp;&nbsp; moveFire_print</code></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">245</td><td class="has-text-align-left" data-align="left">245</td></tr><tr><td class="has-text-align-left" data-align="left"><code>ld&nbsp;&nbsp; a, (countEnemy)<br>inc&nbsp; a<br>ld&nbsp;&nbsp; (countEnemy), a<br><mark style="background-color:#abb8c3" class="has-inline-color">sub&nbsp; $02</mark><br>jr&nbsp;&nbsp; nz, Isr_end<br>ld&nbsp;&nbsp; (countEnemy), a</code><br></td><td class="has-text-align-left" data-align="left"><code>ld&nbsp;&nbsp; a, (countEnemy)<br>inc&nbsp; a<br>ld&nbsp;&nbsp; (countEnemy), a<br><mark style="background-color:#abb8c3" class="has-inline-color">sub&nbsp; $03</mark><br>jr&nbsp;&nbsp; nz, Isr_end<br>ld&nbsp;&nbsp; (countEnemy), a<br><mark style="background-color:#abb8c3" class="has-inline-color">set&nbsp;&nbsp; $02, (hl)</mark></code></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">252</td><td class="has-text-align-left" data-align="left">252</td></tr><tr><td class="has-text-align-left" data-align="left">Cargamos en A el número de enemigos que siguen activos, <strong>LD A, (enemiesCounter)</strong>, comprobamos si hemos llegado a cero,<strong> <mark style="background-color:#abb8c3" class="has-inline-color">CP $00</mark></strong>, y saltamos si es así, <strong>JR Z, Main_restart</strong>.</td><td class="has-text-align-left" data-align="left">Cargamos en A el número de enemigos que siguen activos, <strong>LD A, (enemiesCounter)</strong>, comprobamos si hemos llegado a cero,<strong> <mark style="background-color:#abb8c3" class="has-inline-color">OR A</mark></strong>, y saltamos si es así, <strong>JR Z, Main_restart</strong>.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">263</td><td class="has-text-align-left" data-align="left">263</td></tr><tr><td class="has-text-align-left" data-align="left">Para probar lo implementado abrimos Main.asm, localizamos la rutina Main_restart, <mark style="background-color:#abb8c3" class="has-inline-color">y debajo, antes de CALL ChangeLevel, añadimos las siguientes líneas</mark>:<br><code><br>call FadeScreen<br>call PrintFrame<br>call PrintInfoGame<br>call PrintShip</code></td><td class="has-text-align-left" data-align="left">Para probar lo implementado abrimos Main.asm, localizamos la rutina Main_restart, <mark style="background-color:#abb8c3" class="has-inline-color">y sustituimos la línea CALL ChangeLevel por estas</mark>:<br><br><code>call FadeScreen<br><mark style="background-color:#abb8c3" class="has-inline-color">call ChangeLevel</mark><br>call PrintFrame<br>call PrintInfoGame<br>call PrintShip</code></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">279</td><td class="has-text-align-left" data-align="left">279</td></tr><tr><td class="has-text-align-left" data-align="left">pasmo &#8211;name TestPrint &#8211;tapbas TestPrint.asm <mark style="background-color:#abb8c3" class="has-inline-color">TestPrint.bas</mark></td><td class="has-text-align-left" data-align="left">pasmo &#8211;name TestPrint &#8211;tapbas TestPrint.asm <mark style="background-color:#abb8c3" class="has-inline-color">TestPrint.tap</mark></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">281</td><td class="has-text-align-left" data-align="left">281</td></tr><tr><td class="has-text-align-left" data-align="left">Seguimos en Print.asm, localizamos la etiqueta <strong>PrintFrame</strong> y borramos la <mark style="background-color:#abb8c3" class="has-inline-color">segunda</mark> y añadimos dos después de <strong>CALL PrintString</strong>.</td><td class="has-text-align-left" data-align="left">Seguimos en Print.asm, localizamos la etiqueta <strong>PrintFrame</strong> y borramos la <mark style="background-color:#abb8c3" class="has-inline-color">segunda línea</mark> y añadimos dos después de <strong>CALL PrintString</strong>.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">288</td><td class="has-text-align-left" data-align="left">288</td></tr><tr><td class="has-text-align-left" data-align="left">Buscamos las líneas de carga del vector de interrupciones, desde <strong>DI</strong> hasta <strong>EI</strong>, las cortamos y las pegamos encima de <strong><mark style="background-color:#abb8c3" class="has-inline-color">MainStart</mark></strong>.</td><td class="has-text-align-left" data-align="left">Buscamos las líneas de carga del vector de interrupciones, desde <strong>DI</strong> hasta <strong>EI</strong>, las cortamos y las pegamos encima de <strong><mark style="background-color:#abb8c3" class="has-inline-color">Main_start</mark></strong>.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">288</td><td class="has-text-align-left" data-align="left">288</td></tr><tr><td class="has-text-align-left" data-align="left"><mark style="background-color:#abb8c3" class="has-inline-color">Cargamos en A en las vidas</mark>, <strong>LD A, (livesCounter)</strong>, evaluamos si son cero, <strong>OR A</strong>, y saltamos de ser así, <strong>JR Z, GameOver</strong>.</td><td class="has-text-align-left" data-align="left"><mark style="background-color:#abb8c3" class="has-inline-color">Cargamos en A las vidas</mark>, <strong>LD A, (livesCounter)</strong>, evaluamos si son cero, <strong>OR A</strong>, y saltamos de ser así, <strong>JR Z, GameOver</strong>.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">303</td><td class="has-text-align-left" data-align="left">303</td></tr><tr><td class="has-text-align-left" data-align="left"><code>...<br>ld &nbsp;&nbsp;&nbsp; a, (pointsCounter + 1) &nbsp;&nbsp;&nbsp; <mark style="background-color:#abb8c3" class="has-inline-color">; A centenas y ud millar</mark><br>adc &nbsp;&nbsp; a, $00 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; A = A+1 con acarreo<br>daa &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Ajuste decimal<br>ld &nbsp;&nbsp;&nbsp; (pointsCounter + 1), a &nbsp;&nbsp;&nbsp; ; Actualiza memoria<br>ld &nbsp;&nbsp;&nbsp; hl, (extraCounter) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; HL = contador vida extra<br>ld &nbsp;&nbsp;&nbsp; bc, $0005 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; BC = 5<br>add &nbsp;&nbsp; hl, bc &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; HL = HL+BC<br>ld &nbsp;&nbsp;&nbsp; (extraCounter), hl &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Actualiza memoria<br>ld &nbsp;&nbsp;&nbsp; bc, $01f4 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; BC = 500<br>sbc &nbsp;&nbsp; hl, bc &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; HL = HL-BC<br>jr &nbsp;&nbsp;&nbsp; nz, checkCrashFire_cont &nbsp;&nbsp; <mark style="background-color:#abb8c3" class="has-inline-color">; 0, salta</mark><br>ld &nbsp;&nbsp;&nbsp; (extraCounter), hl &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <mark style="background-color:#abb8c3" class="has-inline-color">; No 0, contador vida extra = 0</mark></code></td><td class="has-text-align-left" data-align="left"><code>...<br>ld &nbsp;&nbsp;&nbsp; a, (pointsCounter + 1) &nbsp;&nbsp;&nbsp; <mark style="background-color:#abb8c3" class="has-inline-color">; A = centenas y ud millar</mark><br>adc &nbsp;&nbsp; a, $00 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; A = A+1 con acarreo<br>daa &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Ajuste decimal<br>ld &nbsp;&nbsp;&nbsp; (pointsCounter + 1), a &nbsp;&nbsp;&nbsp; ; Actualiza memoria<br>ld &nbsp;&nbsp;&nbsp; hl, (extraCounter) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; HL = contador vida extra<br>ld &nbsp;&nbsp;&nbsp; bc, $0005 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; BC = 5<br>add &nbsp;&nbsp; hl, bc &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; HL = HL+BC<br>ld &nbsp;&nbsp;&nbsp; (extraCounter), hl &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Actualiza memoria<br>ld &nbsp;&nbsp;&nbsp; bc, $01f4 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; BC = 500<br>sbc &nbsp;&nbsp; hl, bc &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; HL = HL-BC<br>jr &nbsp;&nbsp;&nbsp; nz, checkCrashFire_cont &nbsp;&nbsp; <mark style="background-color:#abb8c3" class="has-inline-color">; No 0, salta</mark><br>ld &nbsp;&nbsp;&nbsp; (extraCounter), hl &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <mark style="background-color:#abb8c3" class="has-inline-color">; 0, contador vida extra = 0</mark></code></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">309</td><td class="has-text-align-left" data-align="left">309</td></tr><tr><td class="has-text-align-left" data-align="left"><mark style="background-color:#abb8c3" class="has-inline-color">Seguimos Game.asm</mark> y localizamos la etiqueta <strong>MoveEnemies</strong>; su aspecto inicial es el siguiente:</td><td class="has-text-align-left" data-align="left"><mark style="background-color:#abb8c3" class="has-inline-color">Seguimos en Game.asm</mark> y localizamos la etiqueta <strong>MoveEnemies</strong>; su aspecto inicial es el siguiente:</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">312</td><td class="has-text-align-left" data-align="left">312</td></tr><tr><td class="has-text-align-left" data-align="left">&#8230; limpiamos el primero, <mark style="background-color:#abb8c3" class="has-inline-color">LD (HL), $02</mark>, limpiamos el resto, <strong>LDIR</strong>, y salimos, <strong>RET</strong>.</td><td class="has-text-align-left" data-align="left">&#8230; limpiamos el primero, <mark style="background-color:#abb8c3" class="has-inline-color">LD (HL), $00</mark>, limpiamos el resto, <strong>LDIR</strong>, y salimos, <strong>RET</strong>.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">314</td><td class="has-text-align-left" data-align="left">314</td></tr><tr><td class="has-text-align-left" data-align="left"><kbd>; ---------------------------------------------------<br>; Actualiza la configuración de los disparos enemigos<br>;<br>; Altera el valor de los registros <mark style="background-color:#abb8c3" class="has-inline-color">AD</mark>, BC, HL e IX.<br>; ---------------------------------------------------</kbd></td><td class="has-text-align-left" data-align="left"><kbd>; ---------------------------------------------------<br>; Actualiza la configuración de los disparos enemigos<br>;<br>; Altera el valor de los registros <mark style="background-color:#abb8c3" class="has-inline-color">AF</mark>, BC, HL e IX.<br>; ---------------------------------------------------</kbd></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">315</td><td class="has-text-align-left" data-align="left">315</td></tr><tr><td class="has-text-align-left" data-align="left">Si el enemigo está activo, el segundo byte de la configuración lo cargamos en A, <strong>LD A, (HL)</strong>, nos quedamos con la coordenada X, <strong>AND $1F</strong>, comparamos con la coordenada X de la nave, <strong>CP E</strong>, y saltamos si no son la <mark style="background-color:#abb8c3" class="has-inline-color">misa</mark>, <strong>JR NZ, enableEnemiesFire_loopCont</strong>.</td><td class="has-text-align-left" data-align="left">Si el enemigo está activo, el segundo byte de la configuración lo cargamos en A, <strong>LD A, (HL)</strong>, nos quedamos con la coordenada X, <strong>AND $1F</strong>, comparamos con la coordenada X de la nave, <strong>CP E</strong>, y saltamos si no son la <mark style="background-color:#abb8c3" class="has-inline-color">misma</mark>, <strong>JR NZ, enableEnemiesFire_loopCont</strong>.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">319</td><td class="has-text-align-left" data-align="left">319</td></tr><tr><td class="has-text-align-left" data-align="left"><mark style="background-color:#abb8c3" class="has-inline-color">Si está</mark> inactivo se podría salir de la rutina, …</td><td class="has-text-align-left" data-align="left"><mark style="background-color:#abb8c3" class="has-inline-color">Si no está</mark> inactivo se podría salir de la rutina, …</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">323</td><td class="has-text-align-left" data-align="left">323</td></tr><tr><td class="has-text-align-left" data-align="left">Si las coordenadas son iguales, cargamos en A la coordenada X del disparo, <strong>LD A, (HL)</strong>, <mark style="background-color:#abb8c3" class="has-inline-color">la comparamos la de la nave</mark>, <strong>CP E</strong>, …</td><td class="has-text-align-left" data-align="left">Si las coordenadas son iguales, cargamos en A la coordenada X del disparo, <strong>LD A, (HL)</strong>, <mark style="background-color:#abb8c3" class="has-inline-color">la comparamos con la de la nave</mark>, <strong>CP E</strong>, …</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">335</td><td class="has-text-align-left" data-align="left">335</td></tr><tr><td class="has-text-align-left" data-align="left">… y <mark style="background-color:#abb8c3" class="has-inline-color">una contador</mark> del número de interrupciones …</td><td class="has-text-align-left" data-align="left">… y <mark style="background-color:#abb8c3" class="has-inline-color">un contador</mark> del número de interrupciones …</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">336</td><td class="has-text-align-left" data-align="left">336</td></tr><tr><td class="has-text-align-left" data-align="left">Esta es la forma de onda que podemos ver en el emulador.</td><td class="has-text-align-left" data-align="left">Esta es la forma de onda que podemos ver en el emulador <mark style="background-color:#abb8c3" class="has-inline-color">(Menu \ Audio \ Waveform)</mark>.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">338</td><td class="has-text-align-left" data-align="left">338</td></tr><tr><td class="has-text-align-left" data-align="left">Creamos Int3.asm y copiamos dentro todo el código del archivo <mark style="background-color:#abb8c3" class="has-inline-color">Int.asm</mark>.<br>…<br>En los <strong>include</strong> sustituimos Var.asm e <mark style="background-color:#abb8c3" class="has-inline-color">Int.asm</mark> por Var3.asm e Int3.asm, y añadimos una línea de comentario a la etiqueta<strong> music</strong>.<br></td><td class="has-text-align-left" data-align="left">Creamos Int3.asm y copiamos dentro todo el código del archivo <mark style="background-color:#abb8c3" class="has-inline-color">Int2.asm</mark>.<br>…<br>En los <strong>include</strong> sustituimos Var.asm e <mark style="background-color:#abb8c3" class="has-inline-color">Int2.asm</mark> por Var3.asm e Int3.asm, y añadimos una línea de comentario a la etiqueta<strong> music</strong>.<br></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">355</td><td class="has-text-align-left" data-align="left">355</td></tr><tr><td class="has-text-align-left" data-align="left">Si localizamos la etiqueta <strong>checkCrashShip_endLoop</strong>, que está dentro de la rutina <strong><mark style="background-color:#abb8c3" class="has-inline-color">CheckCreashShip</mark></strong>, &#8230;</td><td class="has-text-align-left" data-align="left">Si localizamos la etiqueta <strong>checkCrashShip_endLoop</strong>, que está dentro de la rutina <strong><mark style="background-color:#abb8c3" class="has-inline-color">CheckCrashShip</mark></strong>, &#8230;</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">360</td><td class="has-text-align-left" data-align="left">360</td></tr><tr><td class="has-text-align-left" data-align="left">Desactivamos las interrupciones, <strong>DI</strong>, cambiamos <mark style="background-color:#abb8c3" class="has-inline-color">al modo</mark> a uno…</td><td class="has-text-align-left" data-align="left">Desactivamos las interrupciones, <strong>DI</strong>, cambiamos <mark style="background-color:#abb8c3" class="has-inline-color">el modo</mark> a uno…</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">362</td><td class="has-text-align-left" data-align="left">362</td></tr><tr><td class="has-text-align-left" data-align="left"><code>res&nbsp; $05, (hl) ; <mark style="background-color:#abb8c3" class="has-inline-color">Bit 5 = 5</mark>, necesario para futuras<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; inspecciones</code></td><td class="has-text-align-left" data-align="left"><code>res&nbsp; $05, (hl) ; <mark style="background-color:#abb8c3" class="has-inline-color">Bit 5 = 0</mark>, necesario para futuras<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; inspecciones</code></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">364</td><td class="has-text-align-left" data-align="left">364</td></tr><tr><td class="has-text-align-left" data-align="left">Cargamos la dificultad en A, <strong><mark style="background-color:#abb8c3" class="has-inline-color">LD A, (hardmess)</mark></strong>, comprobamos si es cuatro, <strong>CP $04</strong>, y saltamos si no lo es, <strong>JR NZ, main_restartCont</strong>.</td><td class="has-text-align-left" data-align="left">Cargamos la dificultad en A, <strong><mark style="background-color:#abb8c3" class="has-inline-color">LD A, (hardness)</mark></strong>, comprobamos si es cuatro, <strong>CP $04</strong>, y saltamos si no lo es, <strong>JR NZ, main_restartCont</strong>.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">368</td><td class="has-text-align-left" data-align="left">368</td></tr><tr><td class="has-text-align-left" data-align="left">Ejecutamos make o make.bat, <mark style="background-color:#abb8c3" class="has-inline-color">cargamos emulador</mark> y ya tenemos nuestro juego terminado, a no ser queráis cambiar algo…</td><td class="has-text-align-left" data-align="left">Ejecutamos make o make.bat, <mark style="background-color:#abb8c3" class="has-inline-color">cargamos en el emulador</mark> y ya tenemos nuestro juego terminado, a no ser queráis cambiar algo…</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">372</td><td class="has-text-align-left" data-align="left">372</td></tr><tr><td class="has-text-align-left" data-align="left"><code>; Sprite línea <mark style="background-color:#abb8c3" class="has-inline-color">horizontal</mark><br>Sprite_SLASH:<br>db $18, $18, $18, $18, $18, $18, $18, $18 ; $97<br>&nbsp;<br>; Sprite línea <mark style="background-color:#abb8c3" class="has-inline-color">vertical</mark><br>Sprite_MINUS:<br>db $00, $00, $00, $ff, $ff, $00, $00, $00 ; $98</code></td><td class="has-text-align-left" data-align="left"><code>; Sprite línea <mark style="background-color:#abb8c3" class="has-inline-color">vertical</mark><br>Sprite_SLASH:<br>db $18, $18, $18, $18, $18, $18, $18, $18 ; $97<br>&nbsp;<br>; Sprite línea <mark style="background-color:#abb8c3" class="has-inline-color">horizontal</mark><br>Sprite_MINUS:<br>db $00, $00, $00, $ff, $ff, $00, $00, $00 ; $98</code></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">379</td><td class="has-text-align-left" data-align="left">379</td></tr><tr><td class="has-text-align-left" data-align="left"><code>rst&nbsp; $10 ; <mark style="background-color:#abb8c3" class="has-inline-color">Imprime 2ª</mark> dígito</code></td><td class="has-text-align-left" data-align="left"><code>rst&nbsp; $10 ; <mark style="background-color:#abb8c3" class="has-inline-color">Pinta 2º</mark> dígito</code></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">397</td><td class="has-text-align-left" data-align="left">397</td></tr><tr><td class="has-text-align-left" data-align="left"><code>ret&nbsp;&nbsp; ; <mark style="background-color:#abb8c3" class="has-inline-color">Ultima</mark> condición, siempre sale</code></td><td class="has-text-align-left" data-align="left"><code>ret&nbsp;&nbsp; ; <mark style="background-color:#abb8c3" class="has-inline-color">Última</mark> condición, siempre sale</code></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">417</td><td class="has-text-align-left" data-align="left">417</td></tr><tr><td class="has-text-align-left" data-align="left"><code>ei&nbsp;&nbsp;&nbsp;&nbsp; ; <mark style="background-color:#abb8c3" class="has-inline-color">Actualiza</mark> interrupciones</code></td><td class="has-text-align-left" data-align="left"><code>ei&nbsp;&nbsp;&nbsp;&nbsp; ; <mark style="background-color:#abb8c3" class="has-inline-color">Activa</mark> interrupciones</code></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">418</td><td class="has-text-align-left" data-align="left">418</td></tr><tr><td class="has-text-align-left" data-align="left">En Screen.asm <mark style="background-color:#abb8c3" class="has-inline-color">vamos implementar</mark> la rutina que pinta la cuenta atrás.</td><td class="has-text-align-left" data-align="left">En Screen.asm <mark style="background-color:#abb8c3" class="has-inline-color">vamos a implementar</mark> la rutina que pinta la cuenta atrás.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">434</td><td class="has-text-align-left" data-align="left">434</td></tr><tr><td class="has-text-align-left" data-align="left">Entre esta línea y loop_keyCont <mark style="background-color:#abb8c3" class="has-inline-color">vamos añadir</mark> el movimiento del Spectrum …</td><td class="has-text-align-left" data-align="left">Entre esta línea y loop_keyCont <mark style="background-color:#abb8c3" class="has-inline-color">vamos a añadir</mark> el movimiento del Spectrum …</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">444</td><td class="has-text-align-left" data-align="left">444</td></tr><tr><td class="has-text-align-left" data-align="left"><br>Si tuviéramos problemas de capacidad, que no es así, &#8230;</td><td class="has-text-align-left" data-align="left"><strong><mark style="background-color:#abb8c3" class="has-inline-color">Misma ficha para ambos jugadores</mark></strong><br>Si tuviéramos problemas de capacidad, que no es así, &#8230;</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">446</td><td class="has-text-align-left" data-align="left">446</td></tr><tr><td class="has-text-align-left" data-align="left">Localizamos en <mark style="background-color:#abb8c3" class="has-inline-color">Game.asm</mark> printOXO_X y las líneas en las que se carga el UDG en A.</td><td class="has-text-align-left" data-align="left">Localizamos en <mark style="background-color:#abb8c3" class="has-inline-color">Screen.asm</mark> printOXO_X y las líneas en las que se carga el UDG en A.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">451</td><td class="has-text-align-left" data-align="left">451</td></tr><tr><td class="has-text-align-left" data-align="left"><code>ld&nbsp; hl,MaxTies ; HL = valor <mark style="background-color:#abb8c3" class="has-inline-color">tiempo</mark></code></td><td class="has-text-align-left" data-align="left"><code>ld&nbsp; hl,MaxTies ; HL = valor <mark style="background-color:#abb8c3" class="has-inline-color">tablas</mark></code></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">452</td><td class="has-text-align-left" data-align="left">452</td></tr><tr><td class="has-text-align-left" data-align="left">Por favor, sed benévolos, el arte nunca ha sido lo mío. Veré con buenos ojos que diseñéis vuestra propia pantalla de carga, que seguro que es mejor que <mark style="background-color:#abb8c3" class="has-inline-color">está</mark>; difícil no debe ser.</td><td class="has-text-align-left" data-align="left">Por favor, sed benévolos, el arte nunca ha sido lo mío. Veré con buenos ojos que diseñéis vuestra propia pantalla de carga, que seguro que es mejor que <mark style="background-color:#abb8c3" class="has-inline-color">ésta</mark>; difícil no debe ser.</td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">453</td><td class="has-text-align-left" data-align="left">453</td></tr><tr><td class="has-text-align-left" data-align="left"><code>; ----------------------------------------------------------<br>; LoadScr.asm<br>;<br>; La pantalla de carga se cargará en $5eba, y esta rutina la pasará<br>; a la VideoRAM para que aparezca de golpe y luego limpiará la zona<br>; dónde se había cargado inicialmente.<br>; La limpieza de <mark style="background-color:#abb8c3" class="has-inline-color">esa área</mark> de memoria no es necesaria, pero lo hacemos<br>; por si tenemos que depurar, no encontrar código que en realidad<br>; sean restos de la pantalla de carga.<br>; ----------------------------------------------------------<br>org&nbsp;&nbsp;&nbsp;&nbsp; $5e88&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Dirección de carga<br>&nbsp;<br>ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hl, $5eba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; HL = dirección dónde está la pantalla<br>ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; de, $4000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; DE = dirección VideoRAM<br>ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bc, $1b00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Longitud de la pantalla<br>ldir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; <mark style="background-color:#abb8c3" class="has-inline-color">Vuelva </mark>la pantalla</code></td><td class="has-text-align-left" data-align="left"><code>; ----------------------------------------------------------<br>; LoadScr.asm<br>;<br>; La pantalla de carga se cargará en $5eba, y esta rutina la pasará<br>; a la VideoRAM para que aparezca de golpe y luego limpiará la zona<br>; dónde se había cargado inicialmente.<br>; La limpieza de <mark style="background-color:#abb8c3" class="has-inline-color">ese área</mark> de memoria no es necesaria, pero lo hacemos<br>; por si tenemos que depurar, no encontrar código que en realidad<br>; sean restos de la pantalla de carga.<br>; ----------------------------------------------------------<br>org&nbsp;&nbsp;&nbsp;&nbsp; $5e88&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Dirección de carga<br>&nbsp;<br>ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hl, $5eba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; HL = dirección dónde está la pantalla<br>ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; de, $4000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; DE = dirección VideoRAM<br>ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bc, $1b00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Longitud de la pantalla<br>ldir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; <mark style="background-color:#abb8c3" class="has-inline-color">Vuelca </mark>la pantalla</code></td></tr></tbody></table></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Donde dice</th><th class="has-text-align-left" data-align="left">Debe decir</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Página</strong></td><td class="has-text-align-left" data-align="left"><strong>Página</strong></td></tr><tr><td class="has-text-align-left" data-align="left">467</td><td class="has-text-align-left" data-align="left">467</td></tr><tr><td class="has-text-align-left" data-align="left">Paso a paso por instrucciones (Enter) ejecuta las instrucciones de <mark style="background-color:#abb8c3" class="has-inline-color">una a una</mark> &#8230;</td><td class="has-text-align-left" data-align="left">Paso a paso por instrucciones (Enter) ejecuta las instrucciones de <mark style="background-color:#abb8c3" class="has-inline-color">una en una</mark> &#8230;</td></tr></tbody></table></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://espamatica.com/ensamblador-zx-spectrum-fe-de-erratas/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4598</post-id>	</item>
		<item>
		<title>La pantalla del ZX Spectrum</title>
		<link>https://espamatica.com/posiciones-de-pantalla-zx-spectrum/</link>
					<comments>https://espamatica.com/posiciones-de-pantalla-zx-spectrum/#comments</comments>
		
		<dc:creator><![CDATA[Juan Antonio Rubio García]]></dc:creator>
		<pubDate>Fri, 11 Aug 2023 21:12:18 +0000</pubDate>
				<category><![CDATA[Ensamblador Z80]]></category>
		<category><![CDATA[Retro]]></category>
		<category><![CDATA[ZX Spectrum]]></category>
		<category><![CDATA[Ensamblador]]></category>
		<category><![CDATA[Z80]]></category>
		<guid isPermaLink="false">https://espamatica.com/?p=1067</guid>

					<description><![CDATA[Distribución de la pantalla En este capítulo vamos a hablar sobre la distribución de la pantalla del ZX Spectrum. Área]]></description>
										<content:encoded><![CDATA[
<h1 id="distribucion-de-la-pantalla" class="wp-block-heading has-large-font-size">Distribución de la pantalla</h1>



<p class="has-medium-font-size wp-block-paragraph">En este capítulo vamos a hablar sobre la distribución de la pantalla del ZX Spectrum.</p>


<div role="navigation" aria-label="Tabla de contenidos" class="simpletoc wp-block-simpletoc-toc"><h2 class="simpletoc-title">Tabla de contenidos</h2>
<ul class="simpletoc-list">
<li><a href="#distribucion-de-la-pantalla">Distribución de la pantalla</a>

<ul>
<li><a href="#area-grafica-del-zx-spectrum">Área gráfica del ZX Spectrum</a>
</li>
<li><a href="#area-de-atributos-del-zx-spectrum">Área de atributos del ZX Spectrum</a>
</li>
</ul>
</li>
<li><a href="#rutinas">Rutinas</a>

<ul>
<li><a href="#direccion-de-memoria-desde-coordenada-de-caracter">Dirección de memoria desde coordenada de carácter</a>
</li>
<li><a href="#coordenada-de-caracter-desde-direccion-de-memoria">Coordenada de carácter desde dirección de memoria</a>
</li>
<li><a href="#direccion-de-memoria-de-la-siguiente-linea">Dirección de memoria de la siguiente línea</a>
</li>
<li><a href="#direccion-de-memoria-de-la-linea-anterior">Dirección de memoria de la línea anterior</a>
</li>
<li><a href="#siguiente-scanline">Siguiente scanline</a>
</li>
<li><a href="#scanline-anterior">Scanline anterior</a>
</li>
<li><a href="#direccion-de-atributo-desde-coordenadas-de-caracter">Dirección de atributo desde coordenadas de carácter</a>
</li>
<li><a href="#coordenadas-de-caracter-desde-direccion-de-atributo">Coordenadas de carácter desde dirección de atributo</a>
</li>
<li><a href="#direccion-de-atributo-desde-direccion-de-area-grafica">Dirección de atributo desde dirección de área gráfica</a>
</li>
<li><a href="#direccion-de-area-grafica-desde-direccion-de-atributo">Dirección de área gráfica desde dirección de atributo</a>
</li>
</ul>
</li>
<li><a href="#conclusion">Conclusión</a>
</li></ul></div>


<h2 id="area-grafica-del-zx-spectrum" class="wp-block-heading has-large-font-size">Área gráfica del ZX Spectrum</h2>



<p class="has-medium-font-size wp-block-paragraph">La pantalla del ZX Spectrum tiene una resolución de 256*192 píxeles, o lo que es lo mismo 32 columnas y 192 scanlines. Con cada byte podemos configurar 8 píxeles, los que están a uno tendrán el color de la tinta (INK) y los que están a cero el color del fondo (PAPER); 256 píxeles / 8 píxeles por byte = 32 columnas. El área gráfica ocupa 6.144 bytes ($1800) y comienza en la dirección de memoria 16.384 ($4000).</p>



<p class="has-medium-font-size wp-block-paragraph">Una de las particularidades del ZX Spectrum es la forma en la que se distribuye el área gráfica. Cada carácter se compone de 64 píxeles, o lo que es lo mismo 8&#215;8. A cada una de las líneas del carácter se la denomina scanline. Si pintamos en el primer scanline de un carácter y luego sumamos 32 a la posición de memoria, la lógica nos dice que nos situamos en el siguiente scanline del carácter, pero no es así ya que en realidad nos estamos situando en el primer scanline del carácter situado justo debajo del que estamos.</p>



<p class="has-medium-font-size wp-block-paragraph">Si pintamos la posición $4000, primer byte de la pantalla, y luego queremos pintar en el primer scanline de la línea 8 de la pantalla, la lógica dice que solo habría que sumar 8 veces 32 ($20) a la posición $4000, por lo que el primer scanline del primer carácter de la línea 8 estaría en la posición $4100. Pero esto no es así ya que la posción $4100 corresponde con el segundo scanline del primer carácter de la pantalla.</p>



<p class="has-medium-font-size wp-block-paragraph">Este comportamiento es debido a que la pantalla del ZX Spectrum está dividida en tercios. Cada uno de los tercios tiene 8 líneas y cada una de las líneas 8 scanlines. El primer tercio va desde la posición de memoria $4000 hasta la $47FF, el segundo tercio desde la $4800 hasta la $4FFF y el tercer tercio desde la $5000 hasta la $57FF.</p>



<p class="has-medium-font-size wp-block-paragraph">Aunque en principio esto resulte extraño, cuando se ve la composición que toman los bytes a la hora de conformar una posición de memoria, todo cobra sentido. La composición de los bytes es la siguiente:</p>



<p class="has-text-align-center has-pale-cyan-blue-background-color has-background has-medium-font-size wp-block-paragraph"><strong>010T TSSS LLLC CCCC</strong></p>



<p class="has-medium-font-size wp-block-paragraph">Donde 010 es siempre fijo, TT representa el tercio (de 0 a 2), SSS representa el scanline dentro del carácter (de 0 a 7), LLL representa la línea dentro del tercio (de 0 a 7) y CCCCC representa la columna (de 0 a 31).</p>



<p class="has-medium-font-size wp-block-paragraph">Si nos fijamos en la línea, de 0 a 23, los bits 0, 1 y 3 siempre indican la línea dentro del tercio, y los bits 4 y 5 el tercio, por lo que TTLLL es equivalente a la línea en coordenadas de carácter (de 0 a 23).</p>



<pre class="wp-block-code has-medium-font-size"><code>Línea 0:  0000 0000     Línea 0 del tercio 0
Línea 7:  0000 0111     Línea 7 del tercio 0
Línea 8:  0000 1000     Línea 0 del tercio 1
Línea 15: 0000 1111     Línea 7 del tercio 1
Línea 16: 0001 0000     Línea 0 del tercio 2
Línea 23: 0001 0111     Línea 7 del tercio 2</code></pre>



<p class="has-medium-font-size wp-block-paragraph">Para ver todo lo expuesto, vamos a realizar un sencillo ejemplo que rellena los bytes de la primera columna con un sencillo patrón $AA (1001 1001).</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="org  $8000
ld   hl, $4000    ; HL = dirección de inicio de la VideoRAM
ld   bc, $20      ; BC = valor a sumar para pasar al siguiente carácter
ld   a, $08       ; A = para dibujar el primer scanline del primer tercio
loop:
ld   (hl), $aa    ; Carga en pantalla el patrón 10011001
add  hl, bc       ; Avanza HL a la siguiente línea
dec  a            ; Decrementa A
jr   nz, loop     ; Bucle hasta que A llegue a 0
ret               ; Vuelve al Basic
end  $8000" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">org  </span><span style="color: #174781">$8000</span></span>
<span class="line"><span style="color: #002339">ld   hl, </span><span style="color: #174781">$4000</span><span style="color: #002339">    </span><span style="color: #357B42; font-style: italic">; HL = dirección de inicio de la VideoRAM</span></span>
<span class="line"><span style="color: #002339">ld   bc, </span><span style="color: #174781">$20</span><span style="color: #002339">      </span><span style="color: #357B42; font-style: italic">; BC = valor a sumar para pasar al siguiente carácter</span></span>
<span class="line"><span style="color: #002339">ld   a, </span><span style="color: #174781">$08</span><span style="color: #002339">       </span><span style="color: #357B42; font-style: italic">; A = para dibujar el primer scanline del primer tercio</span></span>
<span class="line"><span style="color: #7B30D0">loop</span><span style="color: #002339">:</span></span>
<span class="line"><span style="color: #002339">ld   (hl), $aa    </span><span style="color: #357B42; font-style: italic">; Carga en pantalla el patrón 10011001</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">  hl, bc       </span><span style="color: #357B42; font-style: italic">; Avanza HL a la siguiente línea</span></span>
<span class="line"><span style="color: #7B30D0">dec</span><span style="color: #002339">  a            </span><span style="color: #357B42; font-style: italic">; Decrementa A</span></span>
<span class="line"><span style="color: #002339">jr   nz, </span><span style="color: #7B30D0">loop</span><span style="color: #002339">     </span><span style="color: #357B42; font-style: italic">; Bucle hasta que A llegue a 0</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">               </span><span style="color: #357B42; font-style: italic">; Vuelve al Basic</span></span>
<span class="line"><span style="color: #002339">end  </span><span style="color: #174781">$8000</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Si ejecutamos el programa, dibuja el patrón $AA (10101010) en el primer scanline de las 8 primeras líneas.</p>



<p class="has-medium-font-size wp-block-paragraph">Para ver la distribución de la pantalla del  ZX Spectrum, solo hay que ir cambiado la línea LD A, $08 e ir cargando múltiplos de $08; $08, $10, $18, $20, $28, $30, $38, $40, $48&#8230;</p>



<p class="has-medium-font-size wp-block-paragraph">Hasta que no lleguemos a $48, no se verá como se pinta el primer scanline de las 8 líneas del segundo tercio.</p>



<h2 id="area-de-atributos-del-zx-spectrum" class="wp-block-heading has-large-font-size">Área de atributos del ZX Spectrum</h2>



<p class="has-medium-font-size wp-block-paragraph">A continuación del área gráfica (píxeles) encontramos el área de atributos, que va desde la dirección 22.528 ($5800) hasta la dirección 23.295 ($5AFF), con una longitud de 768 ($300) bytes.</p>



<p class="has-medium-font-size wp-block-paragraph">Cada byte del área de atributos establece los atributos de un carácter (8&#215;8 píxeles) siendo este el motivo del famoso attribute clash.</p>



<p class="has-medium-font-size wp-block-paragraph">El formato de cada byte del área del atributos es el siguiente:</p>



<p class="has-text-align-center has-pale-cyan-blue-background-color has-background has-medium-font-size wp-block-paragraph"><strong>FBPPPIII</strong></p>



<p class="has-medium-font-size wp-block-paragraph">Donde F es FLASH, B = BRIGHT, P = PAPER e I = INK.</p>



<p class="has-medium-font-size wp-block-paragraph">En el caso del área de atributos la distribución sí es lineal, por lo que si estamos en el byte de los atributos de la columna 0, fila 0 de la pantalla y sumamos 32 nos situamos en los atributos de la columna 0, fila 1.</p>



<p class="has-medium-font-size wp-block-paragraph">La composición de las direcciones de memoria del área de atributos es la siguiente:</p>



<p class="has-text-align-center has-pale-cyan-blue-background-color has-background has-medium-font-size wp-block-paragraph"><strong>0101 10TT LLLC CCCC</strong></p>



<p class="has-medium-font-size wp-block-paragraph">Donde 0101 10 es siempre fijo, TT representa el tercio (de 0 a 2), LLL representa la línea dentro del tercio (de 0 a 7) y CCCCC representa la columna (de 0 a 31). Una vez más TTLLL es equivalente a la línea en coordenadas de carácter (de 0 a 23).</p>



<h1 id="rutinas" class="wp-block-heading has-large-font-size">Rutinas</h1>



<p class="has-medium-font-size wp-block-paragraph">A partir de aquí, vamos a ir viendo rutinas que os pueden ayudar a la hora de trabajar con la pantalla del ZX Spectrum. Tened en cuenta que estas rutinas no controlan si las coordenadas están fuera del área de la pantalla.</p>



<h2 id="direccion-de-memoria-desde-coordenada-de-caracter" class="wp-block-heading has-large-font-size">Dirección de memoria desde coordenada de carácter</h2>



<p class="has-medium-font-size wp-block-paragraph">La rutina <strong>CharCoord2PointerHR</strong>, toma unas coordenadas de carácter y retorna la dirección de memoria correspondiente.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; ----------------------------------------------------------------
; CharCoord2PointerHR: Obtiene la dirección de memoria 
; correspondiente a las coordenadas de carácter especificadas. 
; 
; Entrada: B -&gt; Coordenada Y (0 a 23).
;          C -&gt; Coordenada X (0 a 31).
; 
; Salida:  HL -&gt; Dirección de memoria que corresponde a las
;               coordenadas. 010T TSSS LLLC CCCC. 
;
; Altera el valor de los registros AF y HL.
; ----------------------------------------------------------------- 
CharCoord2PointerHR:
ld	 a, b      ; A = línea. Bits 0, 1 y 2 línea. Bits 3 y 4 tercio.
and  $18       ; Se queda con el tercio 0001 1000. 
               ; Scanline siempre a 0.
or 	 $40       ; Agrega la parte fija 0100 0000.
ld 	 h, a      ; H = A. Parte alta de la dirección calculada.
ld 	 a, b      ; A = línea.
and  $07       ; Se queda con la línea dentro del tercio.
rrca
rrca
rrca           ; Rota tres veces para pasar valor a bits 5, 6 y 7.
or 	 c         ; Agrega la columna.
ld 	 l, a      ; L = A. Parte baja de la dirección calculada.
ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; ----------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; CharCoord2PointerHR: Obtiene la dirección de memoria </span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; correspondiente a las coordenadas de carácter especificadas. </span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; </span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: B -&gt; Coordenada Y (0 a 23).</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;          C -&gt; Coordenada X (0 a 31).</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; </span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Salida:  HL -&gt; Dirección de memoria que corresponde a las</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;               coordenadas. 010T TSSS LLLC CCCC. </span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; ----------------------------------------------------------------- </span></span>
<span class="line"><span style="color: #7EB233">CharCoord2PointerHR:</span></span>
<span class="line"><span style="color: #002339">ld	 a, b      </span><span style="color: #357B42; font-style: italic">; A = línea. Bits 0, 1 y 2 línea. Bits 3 y 4 tercio.</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  </span><span style="color: #174781">$18</span><span style="color: #002339">       </span><span style="color: #357B42; font-style: italic">; Se queda con el tercio 0001 1000. </span></span>
<span class="line"><span style="color: #002339">               </span><span style="color: #357B42; font-style: italic">; Scanline siempre a 0.</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339"> 	 </span><span style="color: #174781">$40</span><span style="color: #002339">       </span><span style="color: #357B42; font-style: italic">; Agrega la parte fija 0100 0000.</span></span>
<span class="line"><span style="color: #002339">ld 	 h, a      </span><span style="color: #357B42; font-style: italic">; H = A. Parte alta de la dirección calculada.</span></span>
<span class="line"><span style="color: #002339">ld 	 a, b      </span><span style="color: #357B42; font-style: italic">; A = línea.</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  </span><span style="color: #174781">$07</span><span style="color: #002339">       </span><span style="color: #357B42; font-style: italic">; Se queda con la línea dentro del tercio.</span></span>
<span class="line"><span style="color: #002339">rrca</span></span>
<span class="line"><span style="color: #002339">rrca</span></span>
<span class="line"><span style="color: #002339">rrca           </span><span style="color: #357B42; font-style: italic">; Rota tres veces para pasar valor a bits 5, 6 y 7.</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339"> 	 c         </span><span style="color: #357B42; font-style: italic">; Agrega la columna.</span></span>
<span class="line"><span style="color: #002339">ld 	 l, a      </span><span style="color: #357B42; font-style: italic">; L = A. Parte baja de la dirección calculada.</span></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Para probar esta rutina podemos ir pasándole posiciones y luego cargando un patrón en la dirección devuelta y así ver donde dibuja.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="org $8000

ld   b, $10                   ; Carga en B la línea.
ld   c, $10                   ; Carga en C la columna.
call CharCoord2PointerHR      ; Calcula la posición de memoria.
ld   (hl), $ff                ; Activa todos los píxeles en la
                              ; posición de memoria.

inc  b                        ; Incrementa la línea.
inc  c                        ; Incrementa la columna.
call CharCoord2PointerHR      ; Calcula la posición de memoria.
ld   (hl), $ff                ; Activa todos los píxeles en la
                              ; posición de memoria.

inc  b                        ; Incrementa la línea.
dec  c                        ; Decrementa la columna.
call CharCoord2PointerHR      ; Calcula la posición de memoria.
ld   (hl), $ff                ; Activa todos los píxeles en la
                              ; posición de memoria.

ret

end	 $8000" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">org </span><span style="color: #174781">$8000</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld   b, </span><span style="color: #174781">$10</span><span style="color: #002339">                   </span><span style="color: #357B42; font-style: italic">; Carga en B la línea.</span></span>
<span class="line"><span style="color: #002339">ld   c, </span><span style="color: #174781">$10</span><span style="color: #002339">                   </span><span style="color: #357B42; font-style: italic">; Carga en C la columna.</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339"> CharCoord2PointerHR      </span><span style="color: #357B42; font-style: italic">; Calcula la posición de memoria.</span></span>
<span class="line"><span style="color: #002339">ld   (hl), $ff                </span><span style="color: #357B42; font-style: italic">; Activa todos los píxeles en la</span></span>
<span class="line"><span style="color: #002339">                              </span><span style="color: #357B42; font-style: italic">; posición de memoria.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">  b                        </span><span style="color: #357B42; font-style: italic">; Incrementa la línea.</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">  c                        </span><span style="color: #357B42; font-style: italic">; Incrementa la columna.</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339"> CharCoord2PointerHR      </span><span style="color: #357B42; font-style: italic">; Calcula la posición de memoria.</span></span>
<span class="line"><span style="color: #002339">ld   (hl), $ff                </span><span style="color: #357B42; font-style: italic">; Activa todos los píxeles en la</span></span>
<span class="line"><span style="color: #002339">                              </span><span style="color: #357B42; font-style: italic">; posición de memoria.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">  b                        </span><span style="color: #357B42; font-style: italic">; Incrementa la línea.</span></span>
<span class="line"><span style="color: #7B30D0">dec</span><span style="color: #002339">  c                        </span><span style="color: #357B42; font-style: italic">; Decrementa la columna.</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339"> CharCoord2PointerHR      </span><span style="color: #357B42; font-style: italic">; Calcula la posición de memoria.</span></span>
<span class="line"><span style="color: #002339">ld   (hl), $ff                </span><span style="color: #357B42; font-style: italic">; Activa todos los píxeles en la</span></span>
<span class="line"><span style="color: #002339">                              </span><span style="color: #357B42; font-style: italic">; posición de memoria.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">end	 </span><span style="color: #174781">$8000</span></span></code></pre></div>



<h2 id="coordenada-de-caracter-desde-direccion-de-memoria" class="wp-block-heading has-large-font-size">Coordenada de carácter desde dirección de memoria</h2>



<p class="has-medium-font-size wp-block-paragraph">La rutina <strong>PointerHR2CharCoord</strong>, toma una dirección de memoria y retorna las coordenadas de carácter correspondientes.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; ---------------------------------------------------------------- 
; PointerHR2CharCoord: Obtiene las coordenadas de carácter
; correspondientes a la dirección de memoria especificada.
;
; Entrada: HL -&gt; Puntero a memoria. 010T TSSS LLLC CCCC.
;
; Salida:  B -&gt; Coordenada Y (0 a 23).
;          C -&gt; Coordenada X (0 a 31).
;
; Altera el valor de los registros AF y BC.  
; ---------------------------------------------------------------- 
PointerHR2CharCoord: 
ld   a, h     ; A = parte alta de la dirección de memoria. 010T TSSS.
and  $18      ; Se queda con el tercio. Bits 4 y 5 de la
              ; coordenada Y. Scanline siempre a 0, son coordenadas
              ; de carácter.
ld   b, a     ; B = A.

ld   a, l     ; A = parte baja de la dirección de memoria. LLLC CCCC.
and  $e0      ; Se queda con la línea dentro del tercio.
rrca
rrca
rrca          ; Rota tres veces para pasar valor a bits 0, 1 y 3.
or   b        ; Agrega los bits 4 y 5.
ld   b, a     ; B = A. Coordenada Y calculada.

ld   a, l     ; A = parte baja de la dirección de memoria. LLLC CCCC.
and  $1f      ; Se queda con la columna.
ld   c, a     ; C = A. Coordenada X calculada.

ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; ---------------------------------------------------------------- </span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; PointerHR2CharCoord: Obtiene las coordenadas de carácter</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; correspondientes a la dirección de memoria especificada.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: HL -&gt; Puntero a memoria. 010T TSSS LLLC CCCC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Salida:  B -&gt; Coordenada Y (0 a 23).</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;          C -&gt; Coordenada X (0 a 31).</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF y BC.  </span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; ---------------------------------------------------------------- </span></span>
<span class="line"><span style="color: #7EB233">PointerHR2CharCoord:</span><span style="color: #002339"> </span></span>
<span class="line"><span style="color: #002339">ld   a, h     </span><span style="color: #357B42; font-style: italic">; A = parte alta de la dirección de memoria. 010T TSSS.</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  </span><span style="color: #174781">$18</span><span style="color: #002339">      </span><span style="color: #357B42; font-style: italic">; Se queda con el tercio. Bits 4 y 5 de la</span></span>
<span class="line"><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; coordenada Y. Scanline siempre a 0, son coordenadas</span></span>
<span class="line"><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; de carácter.</span></span>
<span class="line"><span style="color: #002339">ld   b, a     </span><span style="color: #357B42; font-style: italic">; B = A.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld   a, l     </span><span style="color: #357B42; font-style: italic">; A = parte baja de la dirección de memoria. LLLC CCCC.</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  $e0      </span><span style="color: #357B42; font-style: italic">; Se queda con la línea dentro del tercio.</span></span>
<span class="line"><span style="color: #002339">rrca</span></span>
<span class="line"><span style="color: #002339">rrca</span></span>
<span class="line"><span style="color: #002339">rrca          </span><span style="color: #357B42; font-style: italic">; Rota tres veces para pasar valor a bits 0, 1 y 3.</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">   b        </span><span style="color: #357B42; font-style: italic">; Agrega los bits 4 y 5.</span></span>
<span class="line"><span style="color: #002339">ld   b, a     </span><span style="color: #357B42; font-style: italic">; B = A. Coordenada Y calculada.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld   a, l     </span><span style="color: #357B42; font-style: italic">; A = parte baja de la dirección de memoria. LLLC CCCC.</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  </span><span style="color: #174781">$1f</span><span style="color: #002339">      </span><span style="color: #357B42; font-style: italic">; Se queda con la columna.</span></span>
<span class="line"><span style="color: #002339">ld   c, a     </span><span style="color: #357B42; font-style: italic">; C = A. Coordenada X calculada.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<h2 id="direccion-de-memoria-de-la-siguiente-linea" class="wp-block-heading has-large-font-size">Dirección de memoria de la siguiente línea</h2>



<p class="has-medium-font-size wp-block-paragraph">La rutina <strong>PointerHRNextLine</strong>, toma una dirección de memoria y retorna la dirección de memoria correspondiente a la línea siguiente.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; ----------------------------------------------------------------
; PointerHRNextLine: obtiene la dirección de memoria
; correspondiente a la siguiente línea.
;
; Entrada: HL -&gt; Dirección actual. 010T TSSS LLLC CCCC.
;
; Salida:  HL -&gt; Dirección de la línea siguiente.
;               010T TSSS LLLC CCCC.
;
; Altera el valor de los registros AF y HL.
; ---------------------------------------------------------------- 
PointerHRNextLine:
ld   a, l     ; A = parte baja de la dirección. LLLC CCCC.
add  a, $20   ; Añade una línea (LLLC CCCC + 0010 0000).
ld   l, a     ; L = A.
ret  nc       ; Si no hay acarreo, la línea sigue entre 0 y 7, sale.

; Hay acarreo, hay que cambiar el tercio de la pantalla.
ld   a, h     ; A = parte alta de la dirección. 010T TSSS.
add  a, $08   ; Añade un tercio (010T TSSS + 0000 1000).
ld   h, a     ; H = A.

ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; ----------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; PointerHRNextLine: obtiene la dirección de memoria</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; correspondiente a la siguiente línea.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: HL -&gt; Dirección actual. 010T TSSS LLLC CCCC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Salida:  HL -&gt; Dirección de la línea siguiente.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;               010T TSSS LLLC CCCC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; ---------------------------------------------------------------- </span></span>
<span class="line"><span style="color: #7EB233">PointerHRNextLine:</span></span>
<span class="line"><span style="color: #002339">ld   a, l     </span><span style="color: #357B42; font-style: italic">; A = parte baja de la dirección. LLLC CCCC.</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">  a, </span><span style="color: #174781">$20</span><span style="color: #002339">   </span><span style="color: #357B42; font-style: italic">; Añade una línea (LLLC CCCC + 0010 0000).</span></span>
<span class="line"><span style="color: #002339">ld   l, a     </span><span style="color: #357B42; font-style: italic">; L = A.</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">  nc       </span><span style="color: #357B42; font-style: italic">; Si no hay acarreo, la línea sigue entre 0 y 7, sale.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Hay acarreo, hay que cambiar el tercio de la pantalla.</span></span>
<span class="line"><span style="color: #002339">ld   a, h     </span><span style="color: #357B42; font-style: italic">; A = parte alta de la dirección. 010T TSSS.</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">  a, </span><span style="color: #174781">$08</span><span style="color: #002339">   </span><span style="color: #357B42; font-style: italic">; Añade un tercio (010T TSSS + 0000 1000).</span></span>
<span class="line"><span style="color: #002339">ld   h, a     </span><span style="color: #357B42; font-style: italic">; H = A.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<h2 id="direccion-de-memoria-de-la-linea-anterior" class="wp-block-heading has-large-font-size">Dirección de memoria de la línea anterior</h2>



<p class="has-medium-font-size wp-block-paragraph">La rutina <strong>PointerHRPreviousLine</strong>, toma una dirección de memoria y retorna la dirección de memoria correspondiente a la línea anterior. </p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; ----------------------------------------------------------------
; PointerHRPreviousLine: obtiene la dirección de memoria
; correspondiente a la línea anterior de carácter.
;
; Entrada: HL -&gt; Dirección actual. 010T TSSS LLLC CCCC.
;
; Salida:  HL -&gt; Dirección de la línea anterior.
;                010T TSSS LLLC CCCC.
;
; Altera el valor de los registros AF y HL.
; ---------------------------------------------------------------- 
PointerHRPreviousLine:
ld   a, l     ; A = parte baja de la dirección. LLLC CCCC.
and  $e0      ; Se queda con la parte de la línea (1110 0000).
jr   z, PointerHRPreviousLine_continue   ; Si línea es 0,
                                       ; cambio de tercio.

; No hay cambio de tercio.
ld   a, l     ; A = parte baja de la dirección, LLLC CCCC.
sub  $20      ; Resta una línea (LLLC CCCC - 0010 0000).
ld   l, a     ; L = A. Dirección calculada.

ret

PointerHRPreviousLine_continue:
; Hay que cambiar el tercio.
ld   a, l     ; A = parte baja de la dirección. LLLC CCCC.
or   $e0      ; Pone la línea a 7 (LLLC CCCC or 1110 0000).
ld   l, a     ; L = A. Parte baja de la dirección calculada.

ld   a, h     ; A = parte alta de la dirección. 010T TSSS.
sub  $08      ; Resta uno al tercio (010T TSSS - 0000 1000).
ld   h, a     ; H = A. Parte baja de la dirección calculada.

ret
; ----------------------------------------------------------------
; PointerHRPreviousLine: obtiene la dirección de memoria
; correspondiente a la línea anterior de carácter.
;
; Entrada: HL -&gt; Dirección actual. 010T TSSS LLLC CCCC.
;
; Salida:  HL -&gt; Dirección de la línea anterior.
;                010T TSSS LLLC CCCC.
;
; Altera el valor de los registros AF y HL.
; ---------------------------------------------------------------- 
PointerHRPreviousLine:
ld   a, l     ; A = parte baja de la dirección. LLLC CCCC.
and  $e0      ; Se queda con la parte de la línea (1110 0000).
jr   z, PointerHRPreviousLine_continue ; Si línea es 0,
                                       ; cambio de tercio.

; No hay cambio de tercio.
ld   a, l     ; A = parte baja de la dirección, LLLC CCCC.
sub  $20      ; Resta una línea (LLLC CCCC - 0010 0000).
ld   l, a     ; L = A. Dirección calculada.

ret

PointerHRPreviousLine_continue:
; Hay que cambiar el tercio.
ld   a, l     ; A = parte baja de la dirección. LLLC CCCC.
or   $e0      ; Pone la línea a 7 (LLLC CCCC or 1110 0000).
ld   l, a     ; L = A. Parte baja de la dirección calculada.

ld   a, h     ; A = parte alta de la dirección. 010T TSSS.
sub  $08      ; Resta uno al tercio (010T TSSS - 0000 1000).
ld   h, a     ; H = A. Parte baja de la dirección calculada.

ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; ----------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; PointerHRPreviousLine: obtiene la dirección de memoria</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; correspondiente a la línea anterior de carácter.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: HL -&gt; Dirección actual. 010T TSSS LLLC CCCC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Salida:  HL -&gt; Dirección de la línea anterior.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;                010T TSSS LLLC CCCC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; ---------------------------------------------------------------- </span></span>
<span class="line"><span style="color: #7EB233">PointerHRPreviousLine:</span></span>
<span class="line"><span style="color: #002339">ld   a, l     </span><span style="color: #357B42; font-style: italic">; A = parte baja de la dirección. LLLC CCCC.</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  $e0      </span><span style="color: #357B42; font-style: italic">; Se queda con la parte de la línea (1110 0000).</span></span>
<span class="line"><span style="color: #002339">jr   z, PointerHRPreviousLine_continue   </span><span style="color: #357B42; font-style: italic">; Si línea es 0,</span></span>
<span class="line"><span style="color: #002339">                                       </span><span style="color: #357B42; font-style: italic">; cambio de tercio.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; No hay cambio de tercio.</span></span>
<span class="line"><span style="color: #002339">ld   a, l     </span><span style="color: #357B42; font-style: italic">; A = parte baja de la dirección, LLLC CCCC.</span></span>
<span class="line"><span style="color: #7B30D0">sub</span><span style="color: #002339">  </span><span style="color: #174781">$20</span><span style="color: #002339">      </span><span style="color: #357B42; font-style: italic">; Resta una línea (LLLC CCCC - 0010 0000).</span></span>
<span class="line"><span style="color: #002339">ld   l, a     </span><span style="color: #357B42; font-style: italic">; L = A. Dirección calculada.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">PointerHRPreviousLine_continue:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Hay que cambiar el tercio.</span></span>
<span class="line"><span style="color: #002339">ld   a, l     </span><span style="color: #357B42; font-style: italic">; A = parte baja de la dirección. LLLC CCCC.</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">   $e0      </span><span style="color: #357B42; font-style: italic">; Pone la línea a 7 (LLLC CCCC or 1110 0000).</span></span>
<span class="line"><span style="color: #002339">ld   l, a     </span><span style="color: #357B42; font-style: italic">; L = A. Parte baja de la dirección calculada.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld   a, h     </span><span style="color: #357B42; font-style: italic">; A = parte alta de la dirección. 010T TSSS.</span></span>
<span class="line"><span style="color: #7B30D0">sub</span><span style="color: #002339">  </span><span style="color: #174781">$08</span><span style="color: #002339">      </span><span style="color: #357B42; font-style: italic">; Resta uno al tercio (010T TSSS - 0000 1000).</span></span>
<span class="line"><span style="color: #002339">ld   h, a     </span><span style="color: #357B42; font-style: italic">; H = A. Parte baja de la dirección calculada.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; ----------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; PointerHRPreviousLine: obtiene la dirección de memoria</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; correspondiente a la línea anterior de carácter.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: HL -&gt; Dirección actual. 010T TSSS LLLC CCCC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Salida:  HL -&gt; Dirección de la línea anterior.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;                010T TSSS LLLC CCCC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; ---------------------------------------------------------------- </span></span>
<span class="line"><span style="color: #7EB233">PointerHRPreviousLine:</span></span>
<span class="line"><span style="color: #002339">ld   a, l     </span><span style="color: #357B42; font-style: italic">; A = parte baja de la dirección. LLLC CCCC.</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  $e0      </span><span style="color: #357B42; font-style: italic">; Se queda con la parte de la línea (1110 0000).</span></span>
<span class="line"><span style="color: #002339">jr   z, PointerHRPreviousLine_continue </span><span style="color: #357B42; font-style: italic">; Si línea es 0,</span></span>
<span class="line"><span style="color: #002339">                                       </span><span style="color: #357B42; font-style: italic">; cambio de tercio.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; No hay cambio de tercio.</span></span>
<span class="line"><span style="color: #002339">ld   a, l     </span><span style="color: #357B42; font-style: italic">; A = parte baja de la dirección, LLLC CCCC.</span></span>
<span class="line"><span style="color: #7B30D0">sub</span><span style="color: #002339">  </span><span style="color: #174781">$20</span><span style="color: #002339">      </span><span style="color: #357B42; font-style: italic">; Resta una línea (LLLC CCCC - 0010 0000).</span></span>
<span class="line"><span style="color: #002339">ld   l, a     </span><span style="color: #357B42; font-style: italic">; L = A. Dirección calculada.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">PointerHRPreviousLine_continue:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Hay que cambiar el tercio.</span></span>
<span class="line"><span style="color: #002339">ld   a, l     </span><span style="color: #357B42; font-style: italic">; A = parte baja de la dirección. LLLC CCCC.</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">   $e0      </span><span style="color: #357B42; font-style: italic">; Pone la línea a 7 (LLLC CCCC or 1110 0000).</span></span>
<span class="line"><span style="color: #002339">ld   l, a     </span><span style="color: #357B42; font-style: italic">; L = A. Parte baja de la dirección calculada.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld   a, h     </span><span style="color: #357B42; font-style: italic">; A = parte alta de la dirección. 010T TSSS.</span></span>
<span class="line"><span style="color: #7B30D0">sub</span><span style="color: #002339">  </span><span style="color: #174781">$08</span><span style="color: #002339">      </span><span style="color: #357B42; font-style: italic">; Resta uno al tercio (010T TSSS - 0000 1000).</span></span>
<span class="line"><span style="color: #002339">ld   h, a     </span><span style="color: #357B42; font-style: italic">; H = A. Parte baja de la dirección calculada.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<h2 id="siguiente-scanline" class="wp-block-heading has-large-font-size">Siguiente scanline</h2>



<p class="has-medium-font-size wp-block-paragraph">La rutina <strong>PointerHRNextScanLine</strong>, toma una dirección de memoria y devuelve la del siguiente scanline.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; ----------------------------------------------------------------
; PointerHRNextScanLine: obtiene la dirección de memoria
; correspondiente al siguiente scanline.
;
; Entrada: HL -&gt; dirección actual. 010T TSSS LLLC CCCC.
;
; Salida:  HL -&gt; dirección del siguiente scanline.
;                010T TSSS LLLC CCCC.
;
; Altera el valor de los registros AF y HL.
; ---------------------------------------------------------------- 
PointerHRNextScanLine:
ld   a, h     ; A = parte alta de la dirección. 010T TSSS.
and  $07      ; Se queda con el scanline.
cp   $07      ; Comprueba si el scanline es 7.
jr   z, PointerHRNextScanLine_continue ; Es 7, cambio de línea.

; El scanline no es 7.
inc  h       ; Aumenta en 1 el scanline y sale.

ret

PointerHRNextScanLine_continue:
; Hay que cambiar la línea.
ld   a, l     ; A = parte baja de la dirección. LLLC CCCC.
add  a, $20   ; Añade una línea (LLLC CCCC + 0010 0000).
ld   l, a     ; L = A.
ld   a, h     ; A = parte alta de la dirección. 010T TSSS.
jr   nc, PointerHRNextScanLine_end ; Si no hay acarreo, salta
                                   ; para terminar el cálculo.

; Hay acarreo, hay que cambiar el tercio.
add  a, $08   ; Añade uno al tercio (010T TSSS + 0000 1000).

PointerHRNextScanLine_end:
and  $f8      ; Se queda con la parte fija y el tercio.
              ; Deja el scanline a 0.
ld   h, a     ; H = A. Dirección calculada.

ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; ----------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; PointerHRNextScanLine: obtiene la dirección de memoria</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; correspondiente al siguiente scanline.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: HL -&gt; dirección actual. 010T TSSS LLLC CCCC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Salida:  HL -&gt; dirección del siguiente scanline.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;                010T TSSS LLLC CCCC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; ---------------------------------------------------------------- </span></span>
<span class="line"><span style="color: #7EB233">PointerHRNextScanLine:</span></span>
<span class="line"><span style="color: #002339">ld   a, h     </span><span style="color: #357B42; font-style: italic">; A = parte alta de la dirección. 010T TSSS.</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  </span><span style="color: #174781">$07</span><span style="color: #002339">      </span><span style="color: #357B42; font-style: italic">; Se queda con el scanline.</span></span>
<span class="line"><span style="color: #002339">cp   </span><span style="color: #174781">$07</span><span style="color: #002339">      </span><span style="color: #357B42; font-style: italic">; Comprueba si el scanline es 7.</span></span>
<span class="line"><span style="color: #002339">jr   z, PointerHRNextScanLine_continue </span><span style="color: #357B42; font-style: italic">; Es 7, cambio de línea.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; El scanline no es 7.</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">  h       </span><span style="color: #357B42; font-style: italic">; Aumenta en 1 el scanline y sale.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">PointerHRNextScanLine_continue:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Hay que cambiar la línea.</span></span>
<span class="line"><span style="color: #002339">ld   a, l     </span><span style="color: #357B42; font-style: italic">; A = parte baja de la dirección. LLLC CCCC.</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">  a, </span><span style="color: #174781">$20</span><span style="color: #002339">   </span><span style="color: #357B42; font-style: italic">; Añade una línea (LLLC CCCC + 0010 0000).</span></span>
<span class="line"><span style="color: #002339">ld   l, a     </span><span style="color: #357B42; font-style: italic">; L = A.</span></span>
<span class="line"><span style="color: #002339">ld   a, h     </span><span style="color: #357B42; font-style: italic">; A = parte alta de la dirección. 010T TSSS.</span></span>
<span class="line"><span style="color: #002339">jr   nc, PointerHRNextScanLine_end </span><span style="color: #357B42; font-style: italic">; Si no hay acarreo, salta</span></span>
<span class="line"><span style="color: #002339">                                   </span><span style="color: #357B42; font-style: italic">; para terminar el cálculo.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Hay acarreo, hay que cambiar el tercio.</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">  a, </span><span style="color: #174781">$08</span><span style="color: #002339">   </span><span style="color: #357B42; font-style: italic">; Añade uno al tercio (010T TSSS + 0000 1000).</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">PointerHRNextScanLine_end:</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  $f8      </span><span style="color: #357B42; font-style: italic">; Se queda con la parte fija y el tercio.</span></span>
<span class="line"><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; Deja el scanline a 0.</span></span>
<span class="line"><span style="color: #002339">ld   h, a     </span><span style="color: #357B42; font-style: italic">; H = A. Dirección calculada.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Para probar la rutina, vamos a utilizar un pequeño programa para ver como dibuja. Al contrario de lo que vimos en el primer ejemplo, ahora si se pinta seguido, un scanline seguido del que va justo detrás.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="org  $8000

ld   hl, $4000    ; HL = dirección de inicio de la VideoRAM.
ld   b, $08       ; B = para dibujar 8 scanlines.

loop:
ld   (hl), $aa    ; Carga en pantalla el patrón $AA.
call PointerHRNextScanLine  ; Avanza al siguiente scanline.
djnz loop         ; Bucle hasta que B llegue a 0.

ret

end	 $8000" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">org  </span><span style="color: #174781">$8000</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld   hl, </span><span style="color: #174781">$4000</span><span style="color: #002339">    </span><span style="color: #357B42; font-style: italic">; HL = dirección de inicio de la VideoRAM.</span></span>
<span class="line"><span style="color: #002339">ld   b, </span><span style="color: #174781">$08</span><span style="color: #002339">       </span><span style="color: #357B42; font-style: italic">; B = para dibujar 8 scanlines.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">loop</span><span style="color: #002339">:</span></span>
<span class="line"><span style="color: #002339">ld   (hl), $aa    </span><span style="color: #357B42; font-style: italic">; Carga en pantalla el patrón $AA.</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339"> PointerHRNextScanLine  </span><span style="color: #357B42; font-style: italic">; Avanza al siguiente scanline.</span></span>
<span class="line"><span style="color: #002339">djnz </span><span style="color: #7B30D0">loop</span><span style="color: #002339">         </span><span style="color: #357B42; font-style: italic">; Bucle hasta que B llegue a 0.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">end	 </span><span style="color: #174781">$8000</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Si ejecutamos el programa, dibuja el patrón $AA en el primer carácter. El primer ejemplo lo hacía en el primer scanline de las 8 primeras líneas.</p>



<p class="has-medium-font-size wp-block-paragraph">Al igual que hicimos en el primer ejemplo, podemos ir cargando múltiplos de $08 en B para ver como va dibujando el programa; $08, $10,  $18, $20, $28, $30, $38, $40, $48&#8230; </p>



<h2 id="scanline-anterior" class="wp-block-heading has-large-font-size">Scanline anterior</h2>



<p class="has-medium-font-size wp-block-paragraph">La rutina  <strong>PointerHRPreviousScanLine</strong>, toma una dirección de memoria y retorna la dirección de memoria correspondiente al scanline anterior.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; ----------------------------------------------------------------
; PointerHRPreviousScanLine: obtiene la dirección de memoria
; correspondiente al scanline anterior.
;
; Entrada: HL -&gt; dirección actual. 010T TSSS LLLC CCCC.
;
; Salida:  HL -&gt; Dirección del scanline anterior.
;                010T TSSS LLLC CCCC.
;
; Altera el valor de los registros AF y HL.
; ---------------------------------------------------------------- 
PointerHRPreviousScanLine:
ld   a, h     ; A = parte alta de la dirección. 010T TSSS.
and  $07      ; Se queda con el scanline.
or   a        ; Comprueba si está a 0.
jr   z, PointerHRPreviousScanLine_continue  ; Si es 0, cambiar línea.

; No hay cambio de línea.
dec  h        ; Decrementa el scanline y sale.

ret

PointerHRPreviousScanLine_continue:
ld   a, l     ; A = parte baja de la dirección. LLLC CCCC.
and  $e0      ; Se queda con la parte de la línea.
or   a        ; Comprueba si está a cero.
jr   z, PointerHRPreviousScanLine_change  ; Si es 0, cambiar tercio.

; No hay que cambiar tercio.
ld   a, l     ; A = parte baja de la dirección. LLLC CCCC.
sub  $20      ; Resta un línea, (LLLC CCCC - 0010 0000).
ld   l, a     ; L = A.
jr   PointerHRPreviousScanLine_end  ; Salta a fin de cálculo.

PointerHRPreviousScanLine_change:
; Hay que cambiar de tercio.
ld   a, l     ; A = parte baja de la dirección. LLLC CCCC.
or   $e0      ; Pone la línea en 7.
ld   l, a     ; L = A.

ld   a, h     ; A = parte alta de la dirección. 010T TSSS.
sub  $08      ; Resta uno al tercio.
ld   h, a     ; H = A.

PointerHRPreviousScanLine_end:
ld   a, h     ; A = parte alta de la dirección. 010T TSSS.
and  $F8      ; Se queda con la parte fija y el tercio.
or   $07      ; Pone el scanline a 7.
ld   h, a     ; H = A.

ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; ----------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; PointerHRPreviousScanLine: obtiene la dirección de memoria</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; correspondiente al scanline anterior.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: HL -&gt; dirección actual. 010T TSSS LLLC CCCC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Salida:  HL -&gt; Dirección del scanline anterior.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;                010T TSSS LLLC CCCC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; ---------------------------------------------------------------- </span></span>
<span class="line"><span style="color: #7EB233">PointerHRPreviousScanLine:</span></span>
<span class="line"><span style="color: #002339">ld   a, h     </span><span style="color: #357B42; font-style: italic">; A = parte alta de la dirección. 010T TSSS.</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  </span><span style="color: #174781">$07</span><span style="color: #002339">      </span><span style="color: #357B42; font-style: italic">; Se queda con el scanline.</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">   a        </span><span style="color: #357B42; font-style: italic">; Comprueba si está a 0.</span></span>
<span class="line"><span style="color: #002339">jr   z, PointerHRPreviousScanLine_continue  </span><span style="color: #357B42; font-style: italic">; Si es 0, cambiar línea.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; No hay cambio de línea.</span></span>
<span class="line"><span style="color: #7B30D0">dec</span><span style="color: #002339">  h        </span><span style="color: #357B42; font-style: italic">; Decrementa el scanline y sale.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">PointerHRPreviousScanLine_continue:</span></span>
<span class="line"><span style="color: #002339">ld   a, l     </span><span style="color: #357B42; font-style: italic">; A = parte baja de la dirección. LLLC CCCC.</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  $e0      </span><span style="color: #357B42; font-style: italic">; Se queda con la parte de la línea.</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">   a        </span><span style="color: #357B42; font-style: italic">; Comprueba si está a cero.</span></span>
<span class="line"><span style="color: #002339">jr   z, PointerHRPreviousScanLine_change  </span><span style="color: #357B42; font-style: italic">; Si es 0, cambiar tercio.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; No hay que cambiar tercio.</span></span>
<span class="line"><span style="color: #002339">ld   a, l     </span><span style="color: #357B42; font-style: italic">; A = parte baja de la dirección. LLLC CCCC.</span></span>
<span class="line"><span style="color: #7B30D0">sub</span><span style="color: #002339">  </span><span style="color: #174781">$20</span><span style="color: #002339">      </span><span style="color: #357B42; font-style: italic">; Resta un línea, (LLLC CCCC - 0010 0000).</span></span>
<span class="line"><span style="color: #002339">ld   l, a     </span><span style="color: #357B42; font-style: italic">; L = A.</span></span>
<span class="line"><span style="color: #002339">jr   PointerHRPreviousScanLine_end  </span><span style="color: #357B42; font-style: italic">; Salta a fin de cálculo.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">PointerHRPreviousScanLine_change:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Hay que cambiar de tercio.</span></span>
<span class="line"><span style="color: #002339">ld   a, l     </span><span style="color: #357B42; font-style: italic">; A = parte baja de la dirección. LLLC CCCC.</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">   $e0      </span><span style="color: #357B42; font-style: italic">; Pone la línea en 7.</span></span>
<span class="line"><span style="color: #002339">ld   l, a     </span><span style="color: #357B42; font-style: italic">; L = A.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld   a, h     </span><span style="color: #357B42; font-style: italic">; A = parte alta de la dirección. 010T TSSS.</span></span>
<span class="line"><span style="color: #7B30D0">sub</span><span style="color: #002339">  </span><span style="color: #174781">$08</span><span style="color: #002339">      </span><span style="color: #357B42; font-style: italic">; Resta uno al tercio.</span></span>
<span class="line"><span style="color: #002339">ld   h, a     </span><span style="color: #357B42; font-style: italic">; H = A.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">PointerHRPreviousScanLine_end:</span></span>
<span class="line"><span style="color: #002339">ld   a, h     </span><span style="color: #357B42; font-style: italic">; A = parte alta de la dirección. 010T TSSS.</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  $F8      </span><span style="color: #357B42; font-style: italic">; Se queda con la parte fija y el tercio.</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">   </span><span style="color: #174781">$07</span><span style="color: #002339">      </span><span style="color: #357B42; font-style: italic">; Pone el scanline a 7.</span></span>
<span class="line"><span style="color: #002339">ld   h, a     </span><span style="color: #357B42; font-style: italic">; H = A.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Y para poder probar la rutina, otro sencillo programa.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="org  $8000

ld   hl, $57ff    ; HL = dirección de fin de la VideoRAM.
ld   b, $08       ; B = para dibujar 8 scanlines.

loop:
ld   (hl), $aa    ; Carga en pantalla el patrón $AA.
call PointerHRPreviousScanLine  ; Retrocede al scanline anterior.
djnz loop         ; Bucle hasta que B llegue a 0.

ret

end	 $8000" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">org  </span><span style="color: #174781">$8000</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld   hl, </span><span style="color: #174781">$57ff</span><span style="color: #002339">    </span><span style="color: #357B42; font-style: italic">; HL = dirección de fin de la VideoRAM.</span></span>
<span class="line"><span style="color: #002339">ld   b, </span><span style="color: #174781">$08</span><span style="color: #002339">       </span><span style="color: #357B42; font-style: italic">; B = para dibujar 8 scanlines.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">loop</span><span style="color: #002339">:</span></span>
<span class="line"><span style="color: #002339">ld   (hl), $aa    </span><span style="color: #357B42; font-style: italic">; Carga en pantalla el patrón $AA.</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339"> PointerHRPreviousScanLine  </span><span style="color: #357B42; font-style: italic">; Retrocede al scanline anterior.</span></span>
<span class="line"><span style="color: #002339">djnz </span><span style="color: #7B30D0">loop</span><span style="color: #002339">         </span><span style="color: #357B42; font-style: italic">; Bucle hasta que B llegue a 0.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">end	 </span><span style="color: #174781">$8000</span></span></code></pre></div>



<h2 id="direccion-de-atributo-desde-coordenadas-de-caracter" class="wp-block-heading has-large-font-size">Dirección de atributo desde coordenadas de carácter</h2>



<p class="has-medium-font-size wp-block-paragraph">La rutina <strong>CharCoord2PointerAttr</strong> toma unas coordenadas de carácter y obtiene  la dirección de memoria de atributo correspondiente.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; ----------------------------------------------------------------
; CharCoord2PointerAttr: toma unas coordenadas de carácter y obtiene
; la dirección de memoria del atributo correspondiente.
;
; Entrada: B -&gt; coordenada Y
;          C -&gt; coordenada X
;
; Salida:  HL -&gt; Dirección de memoria del atributo.
;                0101 10TT LLLC CCCC.
;
; Altera el valor de los registros AF y HL.
; ---------------------------------------------------------------- 
CharCoord2PointerAttr:
ld   a, b    ; Carga la línea en A
and  $18     ; Se queda con los bits del tercio
rrca
rrca
rrca         ; Los pasa a los bits 0 y 1
or   $58     ; Añade los bits fijos de la parte alta de la dirección
ld   h, a    ; H = 0101 10TT
ld   a, b    ; Carga la línea en A
and  $07     ; Se queda con los bits de la línea
rrca
rrca
rrca         ; Los pasa a los bits 5, 6, y 7
or   c       ; Añade los bits de la columna
ld   l, a    ; L = LLLC CCCC

ret          ; HL = 0101 10TT LLLC CCCC (dirección del atributo)" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; ----------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; CharCoord2PointerAttr: toma unas coordenadas de carácter y obtiene</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; la dirección de memoria del atributo correspondiente.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: B -&gt; coordenada Y</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;          C -&gt; coordenada X</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Salida:  HL -&gt; Dirección de memoria del atributo.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;                0101 10TT LLLC CCCC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; ---------------------------------------------------------------- </span></span>
<span class="line"><span style="color: #7EB233">CharCoord2PointerAttr:</span></span>
<span class="line"><span style="color: #002339">ld   a, b    </span><span style="color: #357B42; font-style: italic">; Carga la línea en A</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  </span><span style="color: #174781">$18</span><span style="color: #002339">     </span><span style="color: #357B42; font-style: italic">; Se queda con los bits del tercio</span></span>
<span class="line"><span style="color: #002339">rrca</span></span>
<span class="line"><span style="color: #002339">rrca</span></span>
<span class="line"><span style="color: #002339">rrca         </span><span style="color: #357B42; font-style: italic">; Los pasa a los bits 0 y 1</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">   </span><span style="color: #174781">$58</span><span style="color: #002339">     </span><span style="color: #357B42; font-style: italic">; Añade los bits fijos de la parte alta de la dirección</span></span>
<span class="line"><span style="color: #002339">ld   h, a    </span><span style="color: #357B42; font-style: italic">; H = 0101 10TT</span></span>
<span class="line"><span style="color: #002339">ld   a, b    </span><span style="color: #357B42; font-style: italic">; Carga la línea en A</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  </span><span style="color: #174781">$07</span><span style="color: #002339">     </span><span style="color: #357B42; font-style: italic">; Se queda con los bits de la línea</span></span>
<span class="line"><span style="color: #002339">rrca</span></span>
<span class="line"><span style="color: #002339">rrca</span></span>
<span class="line"><span style="color: #002339">rrca         </span><span style="color: #357B42; font-style: italic">; Los pasa a los bits 5, 6, y 7</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">   c       </span><span style="color: #357B42; font-style: italic">; Añade los bits de la columna</span></span>
<span class="line"><span style="color: #002339">ld   l, a    </span><span style="color: #357B42; font-style: italic">; L = LLLC CCCC</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">          </span><span style="color: #357B42; font-style: italic">; HL = 0101 10TT LLLC CCCC (dirección del atributo)</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Las redes sociales pueden ser maravillosas; <a href="https://twitter.com/NathanielSalis" target="_blank" rel="noreferrer noopener nofollow">NathanielSalis</a> me hizo ver que en esta rutina nos podemos ahorrar bytes y ciclos de reloj prescindiendo de tres rotaciones. El código quedaría de la siguiente manera:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; ----------------------------------------------------------------
; CharCoord2PointerAttr: toma unas coordenadas de carácter y obtiene
; la dirección de memoria del atributo correspondiente.
;
; Entrada: B -&gt; coordenada Y
;          C -&gt; coordenada X
;
; Salida:  HL -&gt; Dirección de memoria del atributo.
;                0101 10TT LLLC CCCC.
;
; Altera el valor de los registros AF y HL.
; ---------------------------------------------------------------- 
CharCoord2PointerAttr:
ld   a, b    ; Carga la línea en A
; Antes de quedarnos con los bits del tercio, realizamos las rotaciones
rrca
rrca         ; Pasa los bits del tercio a los bits 0 y 1
rrca         ; y los de la línea a los bits 5, 6 y 7
ld   l, a    ; Carga el resultado en L
and  $03     ; A = bits del tercio
or   $58     ; Añade los bits fijos de la parte alta de la dirección
ld   h, a    ; H = 0101 10TT
ld   a, l    ; A = línea en bits 5, 6 y 7 y tercio en bits 0 y 1
and  $e0     ; Se queda con los bits de la línea
or   c       ; Añade los bits de la columna
ld   l, a    ; L = LLLC CCCC

ret          ; HL = 0101 10TT LLLC CCCC (dirección del atributo)" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; ----------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; CharCoord2PointerAttr: toma unas coordenadas de carácter y obtiene</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; la dirección de memoria del atributo correspondiente.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: B -&gt; coordenada Y</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;          C -&gt; coordenada X</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Salida:  HL -&gt; Dirección de memoria del atributo.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;                0101 10TT LLLC CCCC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; ---------------------------------------------------------------- </span></span>
<span class="line"><span style="color: #7EB233">CharCoord2PointerAttr:</span></span>
<span class="line"><span style="color: #002339">ld   a, b    </span><span style="color: #357B42; font-style: italic">; Carga la línea en A</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Antes de quedarnos con los bits del tercio, realizamos las rotaciones</span></span>
<span class="line"><span style="color: #002339">rrca</span></span>
<span class="line"><span style="color: #002339">rrca         </span><span style="color: #357B42; font-style: italic">; Pasa los bits del tercio a los bits 0 y 1</span></span>
<span class="line"><span style="color: #002339">rrca         </span><span style="color: #357B42; font-style: italic">; y los de la línea a los bits 5, 6 y 7</span></span>
<span class="line"><span style="color: #002339">ld   l, a    </span><span style="color: #357B42; font-style: italic">; Carga el resultado en L</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  </span><span style="color: #174781">$03</span><span style="color: #002339">     </span><span style="color: #357B42; font-style: italic">; A = bits del tercio</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">   </span><span style="color: #174781">$58</span><span style="color: #002339">     </span><span style="color: #357B42; font-style: italic">; Añade los bits fijos de la parte alta de la dirección</span></span>
<span class="line"><span style="color: #002339">ld   h, a    </span><span style="color: #357B42; font-style: italic">; H = 0101 10TT</span></span>
<span class="line"><span style="color: #002339">ld   a, l    </span><span style="color: #357B42; font-style: italic">; A = línea en bits 5, 6 y 7 y tercio en bits 0 y 1</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  $e0     </span><span style="color: #357B42; font-style: italic">; Se queda con los bits de la línea</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">   c       </span><span style="color: #357B42; font-style: italic">; Añade los bits de la columna</span></span>
<span class="line"><span style="color: #002339">ld   l, a    </span><span style="color: #357B42; font-style: italic">; L = LLLC CCCC</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">          </span><span style="color: #357B42; font-style: italic">; HL = 0101 10TT LLLC CCCC (dirección del atributo)</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">La primera versión de la rutina ocupa 18 bytes y tarda 75 ciclos en ejecutarse, mientras que la segunda ocupa 16 bytes y tarda 67 ciclos en ejecutarse, de manera que nos ahorramos dos bytes y 8 ciclos.</p>



<h2 id="coordenadas-de-caracter-desde-direccion-de-atributo" class="wp-block-heading has-large-font-size">Coordenadas de carácter desde dirección de atributo</h2>



<p class="has-medium-font-size wp-block-paragraph">La rutina <strong>PointerAttr2CharCoord</strong> toma una dirección de memoria de un atributo y retorna las coordenadas de carácter correspondientes.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; ----------------------------------------------------------------
; PointerAttr2CharCoord: toma una dirección de memoria de atributo 
; y devuelve las coordenadas de carácter correspondientes.
;
; Entrada:  HL -&gt; Dirección de memoria del atributo.
;                0101 10TT LLLC CCCC.
;
; Salida:   B -&gt; coordenada Y
;           C -&gt; coordenada X
;
; Altera el valor de los registros AF y BC.
; ---------------------------------------------------------------- 
PointerAttr2CharCoord:
ld   a, h    ; Carga la parte alta de la dirección en A
and  $03     ; Se queda con los bits del tercio
rlca
rlca
rlca         ; Los pasa a los bits 3 y 4
ld   b, a    ; B = 000TT000
ld   a, l    ; Carga la parte baja de la dirección en A
and  $e0     ; Se queda con los bits de la línea
rlca
rlca
rlca         ; Los pasa a los bits 0, 1 y 2
or   b       ; Añade el tercio
ld   b, a    ; B = TTLLL (coordenada Y)
ld   a, l    ; Carga la parte baja de la dirección en A
and  $1f     ; Se queda con los bits de la columna
ld   c, a    ; C = 000CCCCC (coordenada X)

ret          ; BC = coordenadas de carácter" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; ----------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; PointerAttr2CharCoord: toma una dirección de memoria de atributo </span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; y devuelve las coordenadas de carácter correspondientes.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada:  HL -&gt; Dirección de memoria del atributo.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;                0101 10TT LLLC CCCC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Salida:   B -&gt; coordenada Y</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;           C -&gt; coordenada X</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF y BC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; ---------------------------------------------------------------- </span></span>
<span class="line"><span style="color: #7EB233">PointerAttr2CharCoord:</span></span>
<span class="line"><span style="color: #002339">ld   a, h    </span><span style="color: #357B42; font-style: italic">; Carga la parte alta de la dirección en A</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  </span><span style="color: #174781">$03</span><span style="color: #002339">     </span><span style="color: #357B42; font-style: italic">; Se queda con los bits del tercio</span></span>
<span class="line"><span style="color: #002339">rlca</span></span>
<span class="line"><span style="color: #002339">rlca</span></span>
<span class="line"><span style="color: #002339">rlca         </span><span style="color: #357B42; font-style: italic">; Los pasa a los bits 3 y 4</span></span>
<span class="line"><span style="color: #002339">ld   b, a    </span><span style="color: #357B42; font-style: italic">; B = 000TT000</span></span>
<span class="line"><span style="color: #002339">ld   a, l    </span><span style="color: #357B42; font-style: italic">; Carga la parte baja de la dirección en A</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  $e0     </span><span style="color: #357B42; font-style: italic">; Se queda con los bits de la línea</span></span>
<span class="line"><span style="color: #002339">rlca</span></span>
<span class="line"><span style="color: #002339">rlca</span></span>
<span class="line"><span style="color: #002339">rlca         </span><span style="color: #357B42; font-style: italic">; Los pasa a los bits 0, 1 y 2</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">   b       </span><span style="color: #357B42; font-style: italic">; Añade el tercio</span></span>
<span class="line"><span style="color: #002339">ld   b, a    </span><span style="color: #357B42; font-style: italic">; B = TTLLL (coordenada Y)</span></span>
<span class="line"><span style="color: #002339">ld   a, l    </span><span style="color: #357B42; font-style: italic">; Carga la parte baja de la dirección en A</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  </span><span style="color: #174781">$1f</span><span style="color: #002339">     </span><span style="color: #357B42; font-style: italic">; Se queda con los bits de la columna</span></span>
<span class="line"><span style="color: #002339">ld   c, a    </span><span style="color: #357B42; font-style: italic">; C = 000CCCCC (coordenada X)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">          </span><span style="color: #357B42; font-style: italic">; BC = coordenadas de carácter</span></span></code></pre></div>



<h2 id="direccion-de-atributo-desde-direccion-de-area-grafica" class="wp-block-heading has-large-font-size">Dirección de atributo desde dirección de área gráfica</h2>



<p class="has-medium-font-size wp-block-paragraph">La rutina <strong>PointerHR2PointerAttr</strong> toma una dirección de memoria del área gráfica y retorna la dirección de memoria de atributo correspondiente.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; ----------------------------------------------------------------
; PointerHR2PointerAttr: toma una dirección de memoria del área gráfica 
; y devuelve la dirección de memoria del atributo correspondiente.
;
; Entrada: HL -&gt; Dirección de memoria del área gráfica.
;                010T TSSS LLLC CCCC.
;
; Salida:  HL -&gt; Dirección de memoria del atributo.
;                0101 10TT LLLC CCCC.
;
; Altera el valor de los registros AF y HL.
; ---------------------------------------------------------------- 
PointerHR2PointerAttr:
ld   a, h    ; Carga en A la parte alta de la dirección
and  $18     ; Se queda con los bits del tercio
rrca
rrca
rrca         ; Los pasa a los bits 0 y 1
or   $58     ; Añade la parte fija
ld   h, a    ; A = 010110TT

ret          ; HL = dirección de memoria del atributo" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; ----------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; PointerHR2PointerAttr: toma una dirección de memoria del área gráfica </span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; y devuelve la dirección de memoria del atributo correspondiente.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: HL -&gt; Dirección de memoria del área gráfica.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;                010T TSSS LLLC CCCC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Salida:  HL -&gt; Dirección de memoria del atributo.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;                0101 10TT LLLC CCCC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; ---------------------------------------------------------------- </span></span>
<span class="line"><span style="color: #7EB233">PointerHR2PointerAttr:</span></span>
<span class="line"><span style="color: #002339">ld   a, h    </span><span style="color: #357B42; font-style: italic">; Carga en A la parte alta de la dirección</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  </span><span style="color: #174781">$18</span><span style="color: #002339">     </span><span style="color: #357B42; font-style: italic">; Se queda con los bits del tercio</span></span>
<span class="line"><span style="color: #002339">rrca</span></span>
<span class="line"><span style="color: #002339">rrca</span></span>
<span class="line"><span style="color: #002339">rrca         </span><span style="color: #357B42; font-style: italic">; Los pasa a los bits 0 y 1</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">   </span><span style="color: #174781">$58</span><span style="color: #002339">     </span><span style="color: #357B42; font-style: italic">; Añade la parte fija</span></span>
<span class="line"><span style="color: #002339">ld   h, a    </span><span style="color: #357B42; font-style: italic">; A = 010110TT</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">          </span><span style="color: #357B42; font-style: italic">; HL = dirección de memoria del atributo</span></span></code></pre></div>



<h2 id="direccion-de-area-grafica-desde-direccion-de-atributo" class="wp-block-heading has-large-font-size">Dirección de área gráfica desde dirección de atributo</h2>



<p class="has-medium-font-size wp-block-paragraph">La rutina <strong>PointerAttr2PointerHR</strong> toma una dirección de memoria de atributo y devuelve la dirección de memoria del área gráfica correspondiente al scanline 0.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; ----------------------------------------------------------------
; PointerAttr2PointerHR: toma una dirección de memoria de atributo
; y devuelve la dirección de memoria del área gráfica correspondiente
; al primer scanline.
;
; Entrada: HL -&gt; Dirección de memoria del atributo.
;                0101 10TT LLLC CCCC.
;
; Salida:  HL -&gt; Dirección de memoria del área gráfica.
;                010T TSSS LLLC CCCC.
;
; Altera el valor de los registros AF y HL.
; ---------------------------------------------------------------- 
PointerAttr2PointerHR:
ld   a, h    ; Carga en A la parte alta de la dirección
and  $03     ; Se queda con los bits del tercio
rlca
rlca
rlca         ; Los pasa a los bits 3 y 4
or   $40     ; Añade la parte fija
ld   h, a    ; A = 010TT000

ret          ; HL = dirección del primer scanline" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; ----------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; PointerAttr2PointerHR: toma una dirección de memoria de atributo</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; y devuelve la dirección de memoria del área gráfica correspondiente</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; al primer scanline.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: HL -&gt; Dirección de memoria del atributo.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;                0101 10TT LLLC CCCC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Salida:  HL -&gt; Dirección de memoria del área gráfica.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;                010T TSSS LLLC CCCC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; ---------------------------------------------------------------- </span></span>
<span class="line"><span style="color: #7EB233">PointerAttr2PointerHR:</span></span>
<span class="line"><span style="color: #002339">ld   a, h    </span><span style="color: #357B42; font-style: italic">; Carga en A la parte alta de la dirección</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">  </span><span style="color: #174781">$03</span><span style="color: #002339">     </span><span style="color: #357B42; font-style: italic">; Se queda con los bits del tercio</span></span>
<span class="line"><span style="color: #002339">rlca</span></span>
<span class="line"><span style="color: #002339">rlca</span></span>
<span class="line"><span style="color: #002339">rlca         </span><span style="color: #357B42; font-style: italic">; Los pasa a los bits 3 y 4</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">   </span><span style="color: #174781">$40</span><span style="color: #002339">     </span><span style="color: #357B42; font-style: italic">; Añade la parte fija</span></span>
<span class="line"><span style="color: #002339">ld   h, a    </span><span style="color: #357B42; font-style: italic">; A = 010TT000</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">          </span><span style="color: #357B42; font-style: italic">; HL = dirección del primer scanline</span></span></code></pre></div>



<h1 id="conclusion" class="wp-block-heading has-large-font-size">Conclusión</h1>



<p class="has-medium-font-size wp-block-paragraph">Todo lo que he puesto aquí, lo he aprendido siguiendo el <a aria-label="curso de ensamblador (abre en una nueva pestaña)" href="https://wiki.speccy.org/cursos/ensamblador/indice" target="_blank" rel="noreferrer noopener nofollow">curso de ensamblador</a> que se encuentra en speccy.org y leyendo el libro Código Máquina del ZX-Spectrum de Jesús Alonso Cano.</p>



<p class="has-medium-font-size wp-block-paragraph">Las rutinas aquí expuestas son los ejercicios que he realizado para practicar lo aprendido.</p>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<p class="has-medium-font-size wp-block-paragraph">También puedes visitar el resto de tutoriales:</p>



<ul class="wp-block-list">
<li class="has-medium-font-size">.Net
<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://espamatica.com/mediatime/">MediaTime</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/nullabledatetimepicker/">NullableDateTimePicker</a></li>
</ul>
</li>



<li class="has-medium-font-size">Z80
<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://espamatica.com/entorno-de-desarrollo-para-ensamblador-z80/">Entorno de desarrollo</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/numeros-bcd-spectrum/">Números BCD</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/posiciones-de-pantalla-zx-spectrum/">Pantalla ZX Spectrum</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/ensamblador-zx-spectrum-pong-introduccion/">Pong</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x00-ensamblador-zx-spectrum-marciano-introduccion/">Batalla Espacial</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x01-ensamblador-zx-spectrum-oxo-tablero-de-juego/">Tres en raya</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/uso-de-beepfx/">Uso de BeepFX</a></li>
</ul>
</li>
</ul>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://espamatica.com/posiciones-de-pantalla-zx-spectrum/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1067</post-id>	</item>
		<item>
		<title>0x06 Ensamblador ZX Spectrum OXO &#8211; ajustes finales</title>
		<link>https://espamatica.com/0x06-ensamblador-zx-spectrum-oxo-ajustes-finales/</link>
					<comments>https://espamatica.com/0x06-ensamblador-zx-spectrum-oxo-ajustes-finales/#respond</comments>
		
		<dc:creator><![CDATA[Juan Antonio Rubio García]]></dc:creator>
		<pubDate>Fri, 02 Jun 2023 07:00:00 +0000</pubDate>
				<category><![CDATA[ZX Spectrum]]></category>
		<category><![CDATA[Ensamblador Z80]]></category>
		<category><![CDATA[Retro]]></category>
		<category><![CDATA[Ensamblador]]></category>
		<category><![CDATA[Tres en raya]]></category>
		<category><![CDATA[Z80]]></category>
		<guid isPermaLink="false">https://espamatica.com/?p=3808</guid>

					<description><![CDATA[Hemos llegado al capítulo final de Ensamblador para ZX Spectrum OXO. Vamos ha realizar unos ajustes que, si bien no]]></description>
										<content:encoded><![CDATA[
<p class="has-medium-font-size wp-block-paragraph">Hemos llegado al capítulo final de Ensamblador para ZX Spectrum OXO. Vamos ha realizar unos ajustes que, si bien no son del todo necesarios, creo que pueden ser de interés.</p>



<p class="has-medium-font-size wp-block-paragraph">Añadiremos una opción en el menú para que puedan seleccionar los jugadores el número máximo de tablas que puede haber.</p>



<p class="has-medium-font-size wp-block-paragraph">Siguiendo con las tablas, actualmente para finalizar el punto es necesario realizar todos los movimientos posibles (ocupar la totalidad de las celdas), aunque en ocasiones ya sabemos que no es posible ganar y son tablas. Implementaremos la detección de tablas para que detecte si ya no es posible ganar y finalizar el punto.</p>



<p class="has-medium-font-size wp-block-paragraph">Propondré unas modificaciones que nos harán ahorrar unos cuantos bytes y ciclos de reloj. Modificaremos los movimientos del Spectrum para que ya no sea tan sencillo ganarle. Por último, vamos a añadir la pantalla de carga.</p>


<div role="navigation" aria-label="Tabla de contenidos" class="simpletoc wp-block-simpletoc-toc"><h2 class="simpletoc-title">Tabla de contenidos</h2>
<ul class="simpletoc-list">
<li><a href="#menu-tablas">Menú tablas</a>
</li>
<li><a href="#deteccion-de-tablas">Detección de tablas</a>
</li>
<li><a href="#ahorramos-bytes-y-ciclos-de-reloj">Ahorramos bytes y ciclos de reloj</a>
</li>
<li><a href="#movimiento-del-spectrum">Movimiento del Spectrum</a>
</li>
<li><a href="#dificultad">Dificultad</a>
</li>
<li><a href="#pantalla-de-carga">Pantalla de carga</a>
</li>
<li><a href="#ensamblador-zx-spectrum-conclusion">Ensamblador ZX Spectrum, conclusión</a>
</li>
<li><a href="#enlaces-de-interes">Enlaces de interés</a>
</li></ul></div>


<h2 id="menu-tablas" class="wp-block-heading has-large-font-size">Menú tablas</h2>



<p class="has-medium-font-size wp-block-paragraph">Actualmente, el número máximo de tablas lo tenemos declarado en la constante MAXTIES en Var.asm; la borramos.</p>



<p class="has-medium-font-size wp-block-paragraph">Localizamos MaxPoints y debajo añadimos la nueva variable para las tablas:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="MaxTies:        db $05                  ; Máximo tablas" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">MaxTies:</span><span style="color: #002339">        </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$05</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Máximo tablas</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Localizamos TitleEspamatica y justo encima añadimos la opción de menú para las tablas:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="TitleOptionTies:    db $10, INK7, $16, $10, $08, &quot;4. &quot;, $10, INK6
                    defm &quot;Tablas&quot;" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">TitleOptionTies:</span><span style="color: #002339">    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK7, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$10</span><span style="color: #002339">, </span><span style="color: #174781">$08</span><span style="color: #002339">, &quot;</span><span style="color: #174781">4.</span><span style="color: #002339"> &quot;, </span><span style="color: #174781">$10</span><span style="color: #002339">, INK6</span></span>
<span class="line"><span style="color: #002339">                    defm &quot;Tablas&quot;</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Para que quede más simétrico, localizamos Title3EnRaya y en la parte final de la línea sustituimos $16, $02, $0A por $16, $04, $0A.</p>



<p class="has-medium-font-size wp-block-paragraph">En Main.asm vamos a añadir el tratamiento de la nueva opción del menú. Localizamos menu_Time y dos líneas más abajo sutituimos JR NZ, menu_op por:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="jr      nz, menu_Ties           ; No, salta" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">jr      nz, menu_Ties           </span><span style="color: #357B42; font-style: italic">; No, salta</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Localizamos menu_TimeDo y tres líneas más abajo, después de JR menu_op, añadimos el tratamiento de la nueva opción de menú:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="menu_Ties:  
cp      KEY4                    ; ¿Pulsado 4?
jr      nz, menu_op             ; No, bucle
ld      a, (MaxTies)            ; A = tablas
add     a, $02                  ; A += 2
cp      $0a                     ; ¿A &lt; 10?
jr      c, menu_TiesDo          ; Sí, salta
ld      a, $03                  ; A = 3
menu_TiesDo:
ld      (MaxTies), a            ; Actualiza tablas
jr      menu_op                 ; Bucle" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">menu_Ties:</span><span style="color: #002339">  </span></span>
<span class="line"><span style="color: #002339">cp      KEY4                    </span><span style="color: #357B42; font-style: italic">; ¿Pulsado 4?</span></span>
<span class="line"><span style="color: #002339">jr      nz, menu_op             </span><span style="color: #357B42; font-style: italic">; No, bucle</span></span>
<span class="line"><span style="color: #002339">ld      a, (MaxTies)            </span><span style="color: #357B42; font-style: italic">; A = tablas</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, </span><span style="color: #174781">$02</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; A += 2</span></span>
<span class="line"><span style="color: #002339">cp      </span><span style="color: #174781">$0a</span><span style="color: #002339">                     </span><span style="color: #357B42; font-style: italic">; ¿A &lt; 10?</span></span>
<span class="line"><span style="color: #002339">jr      c, menu_TiesDo          </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$03</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; A = 3</span></span>
<span class="line"><span style="color: #7EB233">menu_TiesDo:</span></span>
<span class="line"><span style="color: #002339">ld      (MaxTies), a            </span><span style="color: #357B42; font-style: italic">; Actualiza tablas</span></span>
<span class="line"><span style="color: #002339">jr      menu_op                 </span><span style="color: #357B42; font-style: italic">; Bucle</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Si se ha pulsado la tecla cuatro, se añade dos al número máximo de tablas, si es mayor de nueve se pone a tres, y se carga en memoria.</p>



<p class="has-medium-font-size wp-block-paragraph">Tanto este rango de valores, como la diferencia entre uno y otro valor lo podéis modificar a vuestro gusto. También lo podéis cambiar a vuestro gusto en puntos y tiempo.</p>



<p class="has-medium-font-size wp-block-paragraph">Una vez que tenemos el número máximo de tablas guardado en memoria, hay que usarlo. Localizamos la etiqueta loop_reset, la línea LD B, MAXTIES y la sutituímos por las siguientes:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, (MaxTies)            ; A = máximo tablas
ld      b, a                    ; B = A" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, (MaxTies)            </span><span style="color: #357B42; font-style: italic">; A = máximo tablas</span></span>
<span class="line"><span style="color: #002339">ld      b, a                    </span><span style="color: #357B42; font-style: italic">; B = A</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Ya solo nos queda pintar el valor seleccionado. En Screen.asm, localizamos PrintOptions y, justo por encima de JP PrintBCD, añadimos las líneas siguientes:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="call    PrintBCD        ; Lo pinta
ld      b, INI_TOP-$10  ; B = coord Y
call    AT              ; Posiciona cursor
ld      hl, MaxTies     ; HL = valor tiempo" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintBCD        </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #002339">ld      b, INI_TOP-</span><span style="color: #174781">$10</span><span style="color: #002339">  </span><span style="color: #357B42; font-style: italic">; B = coord Y</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT              </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #002339">ld      hl, MaxTies     </span><span style="color: #357B42; font-style: italic">; HL = valor tiempo</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y comprobamos que ya podemos definir el número de tablas, y que al alcanzarse se finaliza la partida.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af493174ba6a&quot;}" data-wp-interactive="core/image" data-wp-key="6af493174ba6a" class="wp-block-image size-full wp-lightbox-container"><img data-recalc-dims="1" loading="lazy" decoding="async" width="705" height="611" data-attachment-id="3813" data-permalink="https://espamatica.com/paso06_01/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso06_01.png?fit=705%2C611&amp;ssl=1" data-orig-size="705,611" data-comments-opened="1" data-image-title="Menú tablas" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador ZX Spectrum &amp;#8211; menú tablas&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso06_01.png?fit=705%2C611&amp;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso06_01.png?resize=705%2C611&#038;ssl=1" alt="Ensamblador ZX Spectrum - menú tablas" class="wp-image-3813" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso06_01.png?w=705&amp;ssl=1 705w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso06_01.png?resize=300%2C260&amp;ssl=1 300w" sizes="auto, (max-width: 705px) 100vw, 705px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Ensamblador ZX Spectrum &#8211; menú tablas</figcaption></figure>



<h2 id="deteccion-de-tablas" class="wp-block-heading">Detección de tablas</h2>



<p class="has-medium-font-size wp-block-paragraph">Actualmente, para que se detecten tablas tienen que estar todas las celdas ocupadas y que no haya tres en raya. En realidad, es posible saber si el punto terminará en tablas antes de que el tablero este lleno.</p>



<p class="has-medium-font-size wp-block-paragraph">Vamos a Game.asm e implementamos la detección de tablas.</p>



<p class="has-medium-font-size wp-block-paragraph">Para saber si hay posibilidad de algún movimiento, sólo hay que saber si queda alguna combinación en la que las celdas estén ocupadas por un solo jugador, o por ninguno.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Comprueba si hay tablas.
; Para poder comprobar si hay tablas.
;
; Salida:   Z   -&gt;  No hay tablas.
;           NZ  -&gt;  Hay tablas.
;
; Altera el valor de los registros AF, BC, DE, HL e IX.
; -------------------------------------------------------------------
CheckTies:
ld      b, $f0              ; B = máscara celdas un jugador
ld      c, $0f              ; B = máscara celdas otro jugador" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Comprueba si hay tablas.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Para poder comprobar si hay tablas.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Salida:   Z   -&gt;  No hay tablas.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;           NZ  -&gt;  Hay tablas.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF, BC, DE, HL e IX.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">CheckTies:</span></span>
<span class="line"><span style="color: #002339">ld      b, $f0              </span><span style="color: #357B42; font-style: italic">; B = máscara celdas un jugador</span></span>
<span class="line"><span style="color: #002339">ld      c, </span><span style="color: #174781">$0f</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; B = máscara celdas otro jugador</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Cargamos en B la máscara para quedarnos con las celdas que ocupa un jugador, y en C la máscara para el jugador dos.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="checkTies_check123:
ld      hl, Grid            ; HL = dirección grid
ld      a, (hl)             ; A = valor celda 1
inc     hl                  ; HL = dirección celda 2
add     a, (hl)             ; A+= valor celda 2
inc     hl                  ; HL = dirección celda 3
add     a, (hl)             ; A+= valor celda 2
ld      d, a                ; Preserva A en D
and     b                   ; A = celdas ocupadas por un jugador
ret     z                   ; Ninguna, sale
ld      a, d                ; Recupera A desde D
and     c                   ; A = celdas ocupadas por otro jugador
ret     z                   ; Ninguna, sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">checkTies_check123:</span></span>
<span class="line"><span style="color: #002339">ld      hl, Grid            </span><span style="color: #357B42; font-style: italic">; HL = dirección grid</span></span>
<span class="line"><span style="color: #002339">ld      a, (hl)             </span><span style="color: #357B42; font-style: italic">; A = valor celda 1</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 2</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 2</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 3</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 2</span></span>
<span class="line"><span style="color: #002339">ld      d, a                </span><span style="color: #357B42; font-style: italic">; Preserva A en D</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     b                   </span><span style="color: #357B42; font-style: italic">; A = celdas ocupadas por un jugador</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Ninguna, sale</span></span>
<span class="line"><span style="color: #002339">ld      a, d                </span><span style="color: #357B42; font-style: italic">; Recupera A desde D</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; A = celdas ocupadas por otro jugador</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Ninguna, sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Apuntando HL a Grid, sumamos en A el valor de las tres celdas, incrementanto HL para pasar de una celda a otra. Comprobamos si hay alguna celda ocupada por un jugador, y de no ser así salimos. Si sí las hay, comprobamos si hay celdas ocupadas por el otro jugador, y si no las hay salimos.</p>



<p class="has-medium-font-size wp-block-paragraph">Las dos comprobaciones siguientes tiene la misma estructura.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="checkTies_check456:
inc     hl                  ; A = dirección celda 4
ld      a, (hl)             ; A = valor celda 4
inc     hl                  ; HL = dirección celda 5
add     a, (hl)             ; A+= valor celda 5
inc     hl                  ; HL = dirección celda 6
add     a, (hl)             ; A+= valor celda 6
ld      d, a                ; Preserva A en D
and     b                   ; A = celdas ocupadas por un jugador
ret     z                   ; Ninguna, sale
ld      a, d                ; Recupera A desde D
and     c                   ; A = celdas ocupadas por otro jugador
ret     z                   ; Ninguna, sale

checkTies_check789:
inc     hl                  ; A = dirección celda 7
ld      a, (hl)             ; A = valor celda 7
inc     hl                  ; HL = dirección celda 8
add     a, (hl)             ; A+= valor celda 8
inc     hl                  ; HL = dirección celda 9
add     a, (hl)             ; A+= valor celda 9
ld      d, a                ; Preserva A en D
and     b                   ; A = celdas ocupadas por un jugador
ret     z                   ; Ninguna, sale
ld      a, d                ; Recupera A desde D
and     c                   ; A = celdas ocupadas por otro jugador
ret     z                   ; Ninguna, sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">checkTies_check456:</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; A = dirección celda 4</span></span>
<span class="line"><span style="color: #002339">ld      a, (hl)             </span><span style="color: #357B42; font-style: italic">; A = valor celda 4</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 5</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 6</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 6</span></span>
<span class="line"><span style="color: #002339">ld      d, a                </span><span style="color: #357B42; font-style: italic">; Preserva A en D</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     b                   </span><span style="color: #357B42; font-style: italic">; A = celdas ocupadas por un jugador</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Ninguna, sale</span></span>
<span class="line"><span style="color: #002339">ld      a, d                </span><span style="color: #357B42; font-style: italic">; Recupera A desde D</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; A = celdas ocupadas por otro jugador</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Ninguna, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">checkTies_check789:</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; A = dirección celda 7</span></span>
<span class="line"><span style="color: #002339">ld      a, (hl)             </span><span style="color: #357B42; font-style: italic">; A = valor celda 7</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 8</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 8</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 9</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 9</span></span>
<span class="line"><span style="color: #002339">ld      d, a                </span><span style="color: #357B42; font-style: italic">; Preserva A en D</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     b                   </span><span style="color: #357B42; font-style: italic">; A = celdas ocupadas por un jugador</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Ninguna, sale</span></span>
<span class="line"><span style="color: #002339">ld      a, d                </span><span style="color: #357B42; font-style: italic">; Recupera A desde D</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; A = celdas ocupadas por otro jugador</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Ninguna, sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Fijaos bien en como vamos recorriendo las celdas con HL, esto nos va ayuda a ahorrar unos bytes en una implementación que hicimos anteriormente.</p>



<p class="has-medium-font-size wp-block-paragraph">Las siguientes comprobaciones no las podemos hacer cambiando de celda con HL, ya que no son numéricamente contiguas; usamos IX.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="checkTies_check147:
ld      ix, Grid-$01        ; IX = dirección  Grid - 1
ld      a, (ix+$01)         ; A = valor celda 1
add     a, (ix+$04)         ; A+= valor celda 4
add     a, (ix+$07)         ; A+= valor celda 7
ld      d, a                ; Preserva A en D
and     b                   ; A = celdas ocupadas por un jugador
ret     z                   ; Ninguna, sale
ld      a, d                ; Recupera A desde D
and     c                   ; A = celdas ocupadas por otro jugador
ret     z                   ; Ninguna, sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">checkTies_check147:</span></span>
<span class="line"><span style="color: #002339">ld      ix, Grid-</span><span style="color: #174781">$01</span><span style="color: #002339">        </span><span style="color: #357B42; font-style: italic">; IX = dirección  Grid - 1</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$01</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 1</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$04</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 4</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$07</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 7</span></span>
<span class="line"><span style="color: #002339">ld      d, a                </span><span style="color: #357B42; font-style: italic">; Preserva A en D</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     b                   </span><span style="color: #357B42; font-style: italic">; A = celdas ocupadas por un jugador</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Ninguna, sale</span></span>
<span class="line"><span style="color: #002339">ld      a, d                </span><span style="color: #357B42; font-style: italic">; Recupera A desde D</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; A = celdas ocupadas por otro jugador</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Ninguna, sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">El resto de comprobaciones tienen la misma estructura. checkTies_check258:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="checkTies_check258:
ld      a, (ix+$02)         ; A = valor celda 2
add     a, (ix+$05)         ; A+= valor celda 5
add     a, (ix+$08)         ; A+= valor celda 8
ld      d, a                ; Preserva A en D
and     b                   ; A = celdas ocupadas por un jugador
ret     z                   ; Ninguna, sale
ld      a, d                ; Recupera A desde D
and     c                   ; A = celdas ocupadas por otro jugador
ret     z                   ; Ninguna, sale

checkTies_check369:
ld      a, (ix+$03)         ; A = valor celda 3
add     a, (ix+$06)         ; A+= valor celda 6
add     a, (ix+$09)         ; A+= valor celda 9
ld      d, a                ; Preserva A en D
and     b                   ; A = celdas ocupadas por un jugador
ret     z                   ; Ninguna, sale
ld      a, d                ; Recupera A desde D
and     c                   ; A = celdas ocupadas por otro jugador
ret     z                   ; Ninguna, sale

checkTies_check159:
ld      a, (ix+$01)         ; A = valor celda 1
add     a, (ix+$05)         ; A+= valor celda 5
add     a, (ix+$09)         ; A+= valor celda 9
ld      d, a                ; Preserva A en D
and     b                   ; A = celdas ocupadas por un jugador
ret     z                   ; Ninguna, sale
ld      a, d                ; Recupera A desde D
and     c                   ; A = celdas ocupadas por otro jugador
ret     z                   ; Ninguna, sale

checkTies_check357:
ld      a, (ix+$03)         ; A = valor celda 3
add     a, (ix+$05)         ; A+= valor celda 5
add     a, (ix+$07)         ; A+= valor celda 7
ld      d, a                ; Preserva A en D
and     b                   ; A = celdas ocupadas por un jugador
ret     z                   ; Ninguna, sale
ld      a, d                ; Recupera A desde D
and     c                   ; A = celdas ocupadas por otro jugador
ret                         ; Sale con Z en estado correcto" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">checkTies_check258:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$02</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 2</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$05</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$08</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 8</span></span>
<span class="line"><span style="color: #002339">ld      d, a                </span><span style="color: #357B42; font-style: italic">; Preserva A en D</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     b                   </span><span style="color: #357B42; font-style: italic">; A = celdas ocupadas por un jugador</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Ninguna, sale</span></span>
<span class="line"><span style="color: #002339">ld      a, d                </span><span style="color: #357B42; font-style: italic">; Recupera A desde D</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; A = celdas ocupadas por otro jugador</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Ninguna, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">checkTies_check369:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$03</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 3</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$06</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 6</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$09</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 9</span></span>
<span class="line"><span style="color: #002339">ld      d, a                </span><span style="color: #357B42; font-style: italic">; Preserva A en D</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     b                   </span><span style="color: #357B42; font-style: italic">; A = celdas ocupadas por un jugador</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Ninguna, sale</span></span>
<span class="line"><span style="color: #002339">ld      a, d                </span><span style="color: #357B42; font-style: italic">; Recupera A desde D</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; A = celdas ocupadas por otro jugador</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Ninguna, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">checkTies_check159:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$01</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 1</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$05</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$09</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 9</span></span>
<span class="line"><span style="color: #002339">ld      d, a                </span><span style="color: #357B42; font-style: italic">; Preserva A en D</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     b                   </span><span style="color: #357B42; font-style: italic">; A = celdas ocupadas por un jugador</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Ninguna, sale</span></span>
<span class="line"><span style="color: #002339">ld      a, d                </span><span style="color: #357B42; font-style: italic">; Recupera A desde D</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; A = celdas ocupadas por otro jugador</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Ninguna, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">checkTies_check357:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$03</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 3</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$05</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$07</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 7</span></span>
<span class="line"><span style="color: #002339">ld      d, a                </span><span style="color: #357B42; font-style: italic">; Preserva A en D</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     b                   </span><span style="color: #357B42; font-style: italic">; A = celdas ocupadas por un jugador</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Ninguna, sale</span></span>
<span class="line"><span style="color: #002339">ld      a, d                </span><span style="color: #357B42; font-style: italic">; Recupera A desde D</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; A = celdas ocupadas por otro jugador</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; Sale con Z en estado correcto</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Con esto ya tenemos la predicción de si va a haber tablas, sólo queda ir a Main.asm y usarla.</p>



<p class="has-medium-font-size wp-block-paragraph">Localizamos loop_tie y tres líneas más abajo sustituimos:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, $09                  ; A = 9
cp      (hl)                    ; ¿Contador = 9?
jr      nz, loop_cont           ; No, salta" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$09</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; A = 9</span></span>
<span class="line"><span style="color: #002339">cp      (hl)                    </span><span style="color: #357B42; font-style: italic">; ¿Contador = 9?</span></span>
<span class="line"><span style="color: #002339">jr      nz, loop_cont           </span><span style="color: #357B42; font-style: italic">; No, salta</span></span></code></pre></div>



<p class="wp-block-paragraph">Por:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="call    CheckTies               ; ¿Algún movimiento posible?
jr      z, loop_cont            ; No, salta" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    CheckTies               </span><span style="color: #357B42; font-style: italic">; ¿Algún movimiento posible?</span></span>
<span class="line"><span style="color: #002339">jr      z, loop_cont            </span><span style="color: #357B42; font-style: italic">; No, salta</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Ya no hace falta esperar a que el tablero esté lleno para saber si hay o no tablas. Llamamos a CheckTies y si no hay tablas seguimos con el punto.</p>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y vemos los resultados.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af493174d437&quot;}" data-wp-interactive="core/image" data-wp-key="6af493174d437" class="wp-block-image size-full wp-lightbox-container"><img data-recalc-dims="1" loading="lazy" decoding="async" width="703" height="609" data-attachment-id="3823" data-permalink="https://espamatica.com/paso06_02/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_02.png?fit=703%2C609&amp;ssl=1" data-orig-size="703,609" data-comments-opened="1" data-image-title="Predicción de tablas" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador ZX Spectrum &amp;#8211; predicción de tablas&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_02.png?fit=703%2C609&amp;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_02.png?resize=703%2C609&#038;ssl=1" alt="Ensamblador ZX Spectrum - predicción de tablas" class="wp-image-3823" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_02.png?w=703&amp;ssl=1 703w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_02.png?resize=300%2C260&amp;ssl=1 300w" sizes="auto, (max-width: 703px) 100vw, 703px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Ensamblador ZX Spectrum &#8211; predicción de tablas</figcaption></figure>



<p class="has-medium-font-size wp-block-paragraph">Quizá veáis un comportamiento que os hace pensar que algo no funciona. Veis la línea uno, dos, tres libre, pero sabes que el Spectrum va a ocupar una celda, luego tú otra y por eso debería marcar tablas.</p>



<p class="has-medium-font-size wp-block-paragraph">El sistema precide pero no adivinia. Imaginaos que en una fila hay dos celdas libres y le toca mover al jugador que no tiene la celda ocupada. Bueno, va a ocupar una de las celdas así que ya sabemos que son tablas, pero imaginad que el jugador se duerme en los laureles y pierde el turno, el otro jugador ocupa otra celda y solo queda una libre, y sigue sin poderse predecir tablas, si el otro jugador se vuelve a dormir, pierde turno otra vez y el primer jugador consigue tres en raya.</p>



<h2 id="ahorramos-bytes-y-ciclos-de-reloj" class="wp-block-heading has-large-font-size">Ahorramos bytes y ciclos de reloj</h2>



<p class="has-medium-font-size wp-block-paragraph">Vamos a implementar varias modificaciones para ahorrar bytes y ciclos de reloj.</p>



<p class="has-medium-font-size wp-block-paragraph">Las primeras de ellas van a ser en Game.asm, sobre el conjunto de rutinas CheckWinner y ZxMove, aplicando la forma en la que hemos implementado CheckTies en las líneas horizontales, las numéricamente contiguas.</p>



<p class="has-medium-font-size wp-block-paragraph">Vamos a la etiqueta, ChechWinner_check, localizamos las líneas siguientes:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, (ix+1)               ; A = celda 1
add     a, (ix+2)               ; A+= celda 2
add     a, (ix+3)               ; A+= celda 3" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">1</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A = celda 1</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">2</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 2</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">3</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 3</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Y las sustituimos por:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      hl, Grid                ; HL = dirección celda 1
ld      a, (hl)                 ; A = valor celda 1
inc     hl                      ; HL = dirección celda 2
add     a, (hl)                 ; A+= valor celda 2
inc     hl                      ; HL = dirección celda 3
add     a, (hl)                 ; A+= valor celda 3" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      hl, Grid                </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 1</span></span>
<span class="line"><span style="color: #002339">ld      a, (hl)                 </span><span style="color: #357B42; font-style: italic">; A = valor celda 1</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                      </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 2</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)                 </span><span style="color: #357B42; font-style: italic">; A+= valor celda 2</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                      </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 3</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)                 </span><span style="color: #357B42; font-style: italic">; A+= valor celda 3</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Localizamos las líneas:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, (ix+4)               ; A = celda 4
add     a, (ix+5)               ; A+= celda 5
add     a, (ix+6)               ; A+= celda 6" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">4</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A = celda 4</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">5</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">6</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 6</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Y las sustituimos por:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="inc     hl                      ; HL = dirección celda 4
ld      a, (hl)                 ; A = valor celda 4
inc     hl                      ; HL = dirección celda 5
add     a, (hl)                 ; A+= valor celda 5
inc     hl                      ; HL = dirección celda 6
add     a, (hl)                 ; A+= valor celda 6" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                      </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 4</span></span>
<span class="line"><span style="color: #002339">ld      a, (hl)                 </span><span style="color: #357B42; font-style: italic">; A = valor celda 4</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                      </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)                 </span><span style="color: #357B42; font-style: italic">; A+= valor celda 5</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                      </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 6</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)                 </span><span style="color: #357B42; font-style: italic">; A+= valor celda 6</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Localizamos las líneas:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, (ix+7)               ; A = celda 7
add     a, (ix+8)               ; A+= celda 8
add     a, (ix+9)               ; A+= celda 9" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">7</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A = celda 7</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">8</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 8</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">9</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 9</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Y las sustituimos por:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="inc     hl                      ; HL = dirección celda 7
ld      a, (hl)                 ; A = valor celda 7
inc     hl                      ; HL = dirección celda 8
add     a, (hl)                 ; A+= valor celda 8
inc     hl                      ; HL = dirección celda 9
add     a, (hl)                 ; A+= valor celda 9" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                      </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 7</span></span>
<span class="line"><span style="color: #002339">ld      a, (hl)                 </span><span style="color: #357B42; font-style: italic">; A = valor celda 7</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                      </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 8</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)                 </span><span style="color: #357B42; font-style: italic">; A+= valor celda 8</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                      </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 9</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)                 </span><span style="color: #357B42; font-style: italic">; A+= valor celda 9</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Esta parte está lista, añadid en los comentarios de la rutina a HL como registro afectado.</p>



<p class="has-medium-font-size wp-block-paragraph">Esta es la comparativa entre ambas versiones:</p>



<figure class="wp-block-table aligncenter"><table><tbody><tr><td>Versión</td><td class="has-text-align-center" data-align="center">Ciclos</td><td class="has-text-align-center" data-align="center">Bytes</td></tr><tr><td>1</td><td class="has-text-align-center" data-align="center">688 / 641</td><td class="has-text-align-center" data-align="center">118</td></tr><tr><td>2</td><td class="has-text-align-center" data-align="center">638 / 591</td><td class="has-text-align-center" data-align="center">111</td></tr></tbody></table></figure>



<p class="has-medium-font-size wp-block-paragraph">Como se observa, estamos ahorrando cincuenta ciclos de reloj y siete bytes. Compilamos, cargamos en el emulador y vemos como todo sigue funcionando.</p>



<p class="has-medium-font-size wp-block-paragraph">Procedemos a modificar ZxMove, en concreto dos partes de este conjunto de rutinas. Localizamos zxMoveToWin_123 y sustituimos:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, (ix+$01)         ; A = valor celda 1
add     a, (ix+$02)         ; A+= valor celda 2
add     a, (ix+$03)         ; A+= valor celda 3" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$01</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 1</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$02</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 2</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$03</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 3</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Por:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      hl, Grid            ; HL = dirección celda 1
ld      a, (hl)             ; A = valor celda 1
inc     hl                  ; HL = dirección celda 2
add     a, (hl)             ; A+= valor celda 2
inc     hl                  ; HL = dirección celda 3
add     a, (hl)             ; A+= valor celda 3" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      hl, Grid            </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 1</span></span>
<span class="line"><span style="color: #002339">ld      a, (hl)             </span><span style="color: #357B42; font-style: italic">; A = valor celda 1</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 2</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 2</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 3</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 3</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Localizamos zxMoveToWin_456 y sustituimos:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, (ix+$04)         ; A = valor celda 4
add     a, (ix+$05)         ; A+= valor celda 5
add     a, (ix+$06)         ; A+= valor celda 6" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$04</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 4</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$05</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$06</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 6</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Por:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      hl, Grid+$03        ; HL = dirección celda 4
ld      a, (hl)             ; A = valor celda 4
inc     hl                  ; HL = dirección celda 5
add     a, (hl)             ; A+= valor celda 5
inc     hl                  ; HL = dirección celda 6
add     a, (hl)             ; A+= valor celda 6" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      hl, Grid+</span><span style="color: #174781">$03</span><span style="color: #002339">        </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 4</span></span>
<span class="line"><span style="color: #002339">ld      a, (hl)             </span><span style="color: #357B42; font-style: italic">; A = valor celda 4</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 5</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 6</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 6</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Localizamos zxMoveToWin_789 y sustituimos:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, (ix+$07)         ; A = valor celda 7
add     a, (ix+$08)         ; A+= valor celda 8
add     a, (ix+$09)         ; A+= valor celda 9" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$07</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 7</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$08</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 8</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$09</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 9</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Por:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      hl, Grid+$06        ; HL = dirección celda 7
ld      a, (hl)             ; A = valor celda 7
inc     hl                  ; HL = dirección celda 8
add     a, (hl)             ; A+= valor celda 8
inc     hl                  ; HL = dirección celda 9
add     a, (hl)             ; A+= valor celda 9" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      hl, Grid+</span><span style="color: #174781">$06</span><span style="color: #002339">        </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 7</span></span>
<span class="line"><span style="color: #002339">ld      a, (hl)             </span><span style="color: #357B42; font-style: italic">; A = valor celda 7</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 8</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 8</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 9</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 9</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Ya hemos terminado con la primera parte. La diferencia principal con CheckTies y CheckWinner es que, aunque son celdas numéricamente contiguas, el paso de la celda tres a la cuatro y de la seis a la siete no es con INC HL, ya que ToMove altera el valor de HL.</p>



<p class="has-medium-font-size wp-block-paragraph">Localizamos zxMoveAttack_123 y sustituimos:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, (ix+$01)         ; A = valor celda 1
add     a, (ix+$02)         ; A+= valor celda 2
add     a, (ix+$03)         ; A+= valor celda 3" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$01</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 1</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$02</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 2</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$03</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 3</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Por:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      hl, Grid            ; HL = dirección celda 1
ld      a, (hl)             ; A = valor celda 1
inc     hl                  ; HL = dirección celda 2
add     a, (hl)             ; A+= valor celda 2
inc     hl                  ; HL = dirección celda 3
add     a, (hl)             ; A+= valor celda 3" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      hl, Grid            </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 1</span></span>
<span class="line"><span style="color: #002339">ld      a, (hl)             </span><span style="color: #357B42; font-style: italic">; A = valor celda 1</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 2</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 2</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 3</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 3</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Localizamos zxMoveAttack_456 y sustituimos:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, (ix+$04)         ; A = valor celda 4
add     a, (ix+$05)         ; A+= valor celda 5
add     a, (ix+$06)         ; A+= valor celda 6" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$04</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 4</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$05</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$06</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 6</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Por:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      hl, Grid+$03        ; HL = dirección celda 4
ld      a, (hl)             ; A = valor celda 4
inc     hl                  ; HL = dirección celda 5
add     a, (hl)             ; A+= valor celda 5
inc     hl                  ; HL = dirección celda 6
add     a, (hl)             ; A+= valor celda 6" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      hl, Grid+</span><span style="color: #174781">$03</span><span style="color: #002339">        </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 4</span></span>
<span class="line"><span style="color: #002339">ld      a, (hl)             </span><span style="color: #357B42; font-style: italic">; A = valor celda 4</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 5</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 6</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 6</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Localizamos zxMoveAttack_789 y sustituimos:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, (ix+$07)         ; A = valor celda 7
add     a, (ix+$08)         ; A+= valor celda 8
add     a, (ix+$09)         ; A+= valor celda 9" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$07</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 7</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$08</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 8</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$09</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 9</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Por:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      hl, Grid+$06        ; HL = dirección celda 7
ld      a, (hl)             ; A = valor celda 7
inc     hl                  ; HL = dirección celda 8
add     a, (hl)             ; A+= valor celda 8
inc     hl                  ; HL = dirección celda 9
add     a, (hl)             ; A+= valor celda 9" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      hl, Grid+</span><span style="color: #174781">$06</span><span style="color: #002339">        </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 7</span></span>
<span class="line"><span style="color: #002339">ld      a, (hl)             </span><span style="color: #357B42; font-style: italic">; A = valor celda 7</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 8</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 8</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 9</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 9</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Hacemos otra modificación, en zxMoveDefence_cornerBlock34 y en zxMoveDefence_cornerBlock67, que nos hace ahorrar ciclos de reloj, pero ningún byte.</p>



<p class="has-medium-font-size wp-block-paragraph">Sustituimos en zxMoveDefence_cornerBlock34:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, (ix+$03)         ; A = valor celda 3
add     a, (ix+$04)         ; A+= valor celda 4" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$03</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 3</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$04</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 4</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Por:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      hl, Grid+$02        ; A = dirección celda 3
ld      a, (hl)             ; A = valor celda 3
inc     hl                  ; HL = dirección celda 4
add     a, (hl)             ; A+= valor celda 4" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      hl, Grid+</span><span style="color: #174781">$02</span><span style="color: #002339">        </span><span style="color: #357B42; font-style: italic">; A = dirección celda 3</span></span>
<span class="line"><span style="color: #002339">ld      a, (hl)             </span><span style="color: #357B42; font-style: italic">; A = valor celda 3</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 4</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 4</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">En zxMoveDefence_cornerBlock67 sustituimos:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, (ix+$06)         ; A = valor celda 6
add     a, (ix+$07)         ; A+= valor celda 7" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$06</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 6</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$07</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 7</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Por:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      hl, Grid+$05        ; A = dirección celda 6
ld      a, (hl)             ; A = valor celda 6
inc     hl                  ; HL = dirección celda 7
add     a, (hl)             ; A+= valor celda 7" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      hl, Grid+</span><span style="color: #174781">$05</span><span style="color: #002339">        </span><span style="color: #357B42; font-style: italic">; A = dirección celda 6</span></span>
<span class="line"><span style="color: #002339">ld      a, (hl)             </span><span style="color: #357B42; font-style: italic">; A = valor celda 6</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección celda 7</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (hl)             </span><span style="color: #357B42; font-style: italic">; A+= valor celda 7</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Las modificaciones en Game.asm ya están. Como ya comenté, añadid en los comentarios de la rutina a HL como registro afectado. Ya se nos olvidó antes, pues el registro HL ya se veía afectado por la rutina zxMoveGeneric.</p>



<p class="has-medium-font-size wp-block-paragraph">Esta es la comparativa entre las dos versiones de ZxMove:</p>



<figure class="wp-block-table aligncenter"><table><tbody><tr><td class="has-text-align-center" data-align="center">Versión</td><td class="has-text-align-center" data-align="center">Ciclos</td><td class="has-text-align-center" data-align="center">Bytes</td></tr><tr><td class="has-text-align-center" data-align="center">1</td><td class="has-text-align-center" data-align="center">4632 / 4079</td><td class="has-text-align-center" data-align="center">808</td></tr><tr><td class="has-text-align-center" data-align="center">2</td><td class="has-text-align-center" data-align="center">4532 / 3979</td><td class="has-text-align-center" data-align="center">802</td></tr></tbody></table></figure>



<p class="has-medium-font-size wp-block-paragraph">La versión dos ocupa seis bytes menos y tarda cien ciclos menos que la uno, lo que parece poco si lo comparamos con el ahorro en bytes de CheckWinner, con menos modificaciones. Recordad que allí el paso de la celda tres a la celda cuatro y de la seis a la siete lo hacemos con&nbsp; INC HL y aquí no podemos.</p>



<p class="has-medium-font-size wp-block-paragraph">La diferencia de INC HL con LD HL, Grid es de cuatro ciclos y dos bytes, y eso nos limita el ahorro.</p>



<p class="has-medium-font-size wp-block-paragraph">Si tuviéramos problemas de capacidad, que no es así, podemos ahorrar otro buen puñado de bytes pintando la misma ficha, con distinto color, para ambos jugadores.</p>



<p class="has-medium-font-size wp-block-paragraph">Vamos a Sprite.asm y comentamos la definición Sprite_P2. Por otro lado, las definiciones de Sprite_CROSS, Sprite_SLASH y Sprite_MINUS las ponemos al inicio del archivo, quedando así:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Fichero: Sprite.asm
;
; Definición de los gráficos.
; -------------------------------------------------------------------
; Sprite de la cruceta
Sprite_CROSS:
db $18, $18, $18, $ff, $ff, $18, $18, $18   ; $90

; Sprite de la línea vertical
Sprite_SLASH:
db $18, $18, $18, $18, $18, $18, $18, $18   ; $91

; Sprite de la línea hortizontal
Sprite_MINUS:
db $00, $00, $00, $ff, $ff, $00, $00, $00   ; $92

; Sprite del jugador 1
Sprite_P1:
db $c0, $e0, $70, $38, $1c, $0e, $07, $03   ; $93
db $03, $07, $0e, $1c, $38, $70, $e0, $c0   ; $94

; ; Sprite del jugador 2
; Sprite_P2:
; db $03, $0f, $1c, $30, $60, $60, $c0, $c0 ; $95 Arriba/Izquierda
; db $c0, $f0, $38, $0c, $06, $06, $03, $03 ; $96 Arriba/Derecha
; db $c0, $c0, $60, $60, $30, $1c, $0f, $03 ; $97 Abajo/Izquierda
; db $03, $03, $06, $06, $0c, $38, $f0, $c0 ; $98 Abajo/Derecha" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Fichero: Sprite.asm</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Definición de los gráficos.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Sprite de la cruceta</span></span>
<span class="line"><span style="color: #7EB233">Sprite_CROSS:</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">, $ff, $ff, </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">   </span><span style="color: #357B42; font-style: italic">; $90</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Sprite de la línea vertical</span></span>
<span class="line"><span style="color: #7EB233">Sprite_SLASH:</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">   </span><span style="color: #357B42; font-style: italic">; $91</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Sprite de la línea hortizontal</span></span>
<span class="line"><span style="color: #7EB233">Sprite_MINUS:</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, $ff, $ff, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">   </span><span style="color: #357B42; font-style: italic">; $92</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Sprite del jugador 1</span></span>
<span class="line"><span style="color: #7EB233">Sprite_P1:</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> $c0, $e0, </span><span style="color: #174781">$70</span><span style="color: #002339">, </span><span style="color: #174781">$38</span><span style="color: #002339">, </span><span style="color: #174781">$1c</span><span style="color: #002339">, </span><span style="color: #174781">$0e</span><span style="color: #002339">, </span><span style="color: #174781">$07</span><span style="color: #002339">, </span><span style="color: #174781">$03</span><span style="color: #002339">   </span><span style="color: #357B42; font-style: italic">; $93</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$03</span><span style="color: #002339">, </span><span style="color: #174781">$07</span><span style="color: #002339">, </span><span style="color: #174781">$0e</span><span style="color: #002339">, </span><span style="color: #174781">$1c</span><span style="color: #002339">, </span><span style="color: #174781">$38</span><span style="color: #002339">, </span><span style="color: #174781">$70</span><span style="color: #002339">, $e0, $c0   </span><span style="color: #357B42; font-style: italic">; $94</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; ; Sprite del jugador 2</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Sprite_P2:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; db $03, $0f, $1c, $30, $60, $60, $c0, $c0 ; $95 Arriba/Izquierda</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; db $c0, $f0, $38, $0c, $06, $06, $03, $03 ; $96 Arriba/Derecha</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; db $c0, $c0, $60, $60, $30, $1c, $0f, $03 ; $97 Abajo/Izquierda</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; db $03, $03, $06, $06, $0c, $38, $f0, $c0 ; $98 Abajo/Derecha</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Comentar el sprite del jugador dos no sólo obliga a modificar la rutina que pinta las fichas, también obliga a modificar la rutina que pinta el tablero, ya que cambian los UDG. Hemos subido a la parte de arriba los sprites del tablero para sólo modificar una vez la rutina que lo pinta, y para que si más adelante decidimos volver a pintar las dos fichas, no se vea afectada.</p>



<p class="has-medium-font-size wp-block-paragraph">Al comentar Sprite_P2 ahorramos treinta y dos bytes. No parece mucho, pero en ciertas situaciones nos puede salvar.</p>



<p class="has-medium-font-size wp-block-paragraph">Vamos a Var.asm y modificamos la definición de Board_1 y _2 y la dejamos así:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; Líneas verticales del tablero.
Board_1:
db $12, $00, $13, $00        
db $20, $20, $20, $20, $91, $20, $20, $20, $20, $91, $20, $20, $20
db $20, $ff

; Líneas horizontales del tablero.
Board_2:        
db $92, $92, $92, $92, $90, $92, $92, $92, $92, $90, $92, $92, $92
db $92, $ff" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; Líneas verticales del tablero.</span></span>
<span class="line"><span style="color: #7EB233">Board_1:</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$12</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">        </span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$91</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$91</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$20</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$20</span><span style="color: #002339">, $ff</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Líneas horizontales del tablero.</span></span>
<span class="line"><span style="color: #7EB233">Board_2:</span><span style="color: #002339">        </span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$92</span><span style="color: #002339">, </span><span style="color: #174781">$92</span><span style="color: #002339">, </span><span style="color: #174781">$92</span><span style="color: #002339">, </span><span style="color: #174781">$92</span><span style="color: #002339">, </span><span style="color: #174781">$90</span><span style="color: #002339">, </span><span style="color: #174781">$92</span><span style="color: #002339">, </span><span style="color: #174781">$92</span><span style="color: #002339">, </span><span style="color: #174781">$92</span><span style="color: #002339">, </span><span style="color: #174781">$92</span><span style="color: #002339">, </span><span style="color: #174781">$90</span><span style="color: #002339">, </span><span style="color: #174781">$92</span><span style="color: #002339">, </span><span style="color: #174781">$92</span><span style="color: #002339">, </span><span style="color: #174781">$92</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$92</span><span style="color: #002339">, $ff</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y vemos los resultados, concretamente el desastre que hemos organizado.</p>



<figure class="wp-block-image size-full is-style-default"><img data-recalc-dims="1" loading="lazy" decoding="async" width="701" height="612" data-attachment-id="3840" data-permalink="https://espamatica.com/0x06-ensamblador-zx-spectrum-oxo-ajustes-finales/paso06_03/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_03.png?fit=701%2C612&amp;ssl=1" data-orig-size="701,612" data-comments-opened="1" data-image-title="El caos" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador ZX Spectrum &amp;#8211; el caos&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_03.png?fit=701%2C612&amp;ssl=1" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_03.png?resize=701%2C612&#038;ssl=1" alt="Ensamblador ZX Spectrum - el caos" class="wp-image-3840" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_03.png?w=701&amp;ssl=1 701w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_03.png?resize=300%2C262&amp;ssl=1 300w" sizes="auto, (max-width: 701px) 100vw, 701px" /><figcaption class="wp-element-caption">Ensamblador ZX Spectrum &#8211; el caos</figcaption></figure>



<p class="has-medium-font-size wp-block-paragraph">Que la ficha del&nbsp; jugador dos se pinte mal lo esperábamos, pero ¿qué pasa con el tablero? Hemos cambiado la posición de la definición de los sprites, pero UDG sigue apuntando a Sprite_P1.</p>



<p class="has-medium-font-size wp-block-paragraph">Vamos a Main.asm, y debajo de la etiqueta Main sustituimos:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      hl, Sprite_P1       ; HL = dirección Sprite_P1" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      hl, Sprite_P1       </span><span style="color: #357B42; font-style: italic">; HL = dirección Sprite_P1</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Por:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      hl, Sprite_CROSS    ; HL = dirección Sprite_CROSS" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      hl, Sprite_CROSS    </span><span style="color: #357B42; font-style: italic">; HL = dirección Sprite_CROSS</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Cambiad también el comentario de la línea de abajo.</p>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y vemos que el tablero se pinta bien, pero las fichas no. Tranquilos, era lo esperado.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af4931750ebd&quot;}" data-wp-interactive="core/image" data-wp-key="6af4931750ebd" class="wp-block-image size-full wp-lightbox-container"><img data-recalc-dims="1" loading="lazy" decoding="async" width="702" height="605" data-attachment-id="3842" data-permalink="https://espamatica.com/paso06_04/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_04.png?fit=702%2C605&amp;ssl=1" data-orig-size="702,605" data-comments-opened="1" data-image-title="Tres en raya malditas" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador ZX Spectrum &amp;#8211; tres en raya malditas&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_04.png?fit=702%2C605&amp;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_04.png?resize=702%2C605&#038;ssl=1" alt="Ensamblador ZX Spectrum - tres en raya malditas" class="wp-image-3842" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_04.png?w=702&amp;ssl=1 702w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_04.png?resize=300%2C259&amp;ssl=1 300w" sizes="auto, (max-width: 702px) 100vw, 702px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Ensamblador ZX Spectrum &#8211; tres en raya malditas</figcaption></figure>



<p class="has-medium-font-size wp-block-paragraph">Vamos a modificar la rutina que pinta las fichas para que lo haga bien, o no, lo podéis dejar así; tres en raya malditas.</p>



<p class="has-medium-font-size wp-block-paragraph">Localizamos printOXO_X y las líneas en las que se carga el UDG en A. Le sumamos tres al valor que carga:</p>



<pre class="wp-block-preformatted has-background has-medium-font-size" style="background-color:#e1e1e1">ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a, $90&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;pasa a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a, $93<br>ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a, $91&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;pasa a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a, $94</pre>



<p class="has-medium-font-size wp-block-paragraph">Localizamos printOXO_Y y las líneas en las que se carga el UDG en A. Le sumamos tres al valor que carga:</p>



<pre class="wp-block-preformatted has-background has-medium-font-size" style="background-color:#e1e1e1">ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a, $92&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pasa a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a, $95<br>ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a, $93&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pasa a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a, $96<br>ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a, $94&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pasa a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a, $97<br>ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a, $95&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pasa a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a, $98</pre>



<p class="has-medium-font-size wp-block-paragraph">Con esto, si decidimos pintar dos fichas distintas, se pintaría el círculo.</p>



<p class="has-medium-font-size wp-block-paragraph">Como ahora estamos en la situación de pintar una sola ficha, comentamos las líneas:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, $95              ; A = 1er sprite
ld      a, $98              ; A = 4º sprite" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$95</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 1er sprite</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$98</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 4º sprite</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Y debajo de las mismas añadimos la línea:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, $93              ; A = 1er sprite" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$93</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 1er sprite</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Comentamos las líneas:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, $96              ; A = 2º sprite
ld      a, $97              ; A = 3er sprite" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$96</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 2º sprite</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$97</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 3er sprite</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Y debajo de las mismas añadimos la línea:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, $94              ; A = 2º sprite" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$94</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 2º sprite</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Un poco de lío, ¿verdad? El aspecto final es este:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="printOXO_X:
ld      a, INKPLAYER1       ; A = tinta jugador 1
call    INK                 ; Cambia tinta
ld      a, $93              ; A = 1er sprite
rst     $10                 ; Lo pinta
ld      a, $94              ; A = 2º sprite
rst     $10                 ; Lo pinta
dec     b                   ; B = línea inferior
call    AT                  ; Posiciona cursor
ld      a, $94              ; A = 2º sprite
rst     $10                 ; Lo pinta
ld      a, $93              ; A = 2º sprite
rst     $10                 ; Lo pinta
ret                         ; Sale

printOXO_Y:
ld      a, INKPLAYER2       ; A = tinta jugador 2
call    INK                 ; Cambia tinta
;ld      a, $95              ; A = 1er sprite
ld      a, $93              ; A = 1er sprite
rst     $10                 ; Lo pinta
;ld      a, $96              ; A = 2º sprite
ld      a, $94              ; A = 2º sprite
rst     $10                 ; Lo pinta
dec     b                   ; B = línea inferior
call    AT                  ; Posiciona cursor
;ld      a, $97              ; A = 3er sprite
ld      a, $94              ; A = 2º sprite
rst     $10                 ; Lo pinta
;ld      a, $98              ; A = 4º sprite
ld      a, $93              ; A = 1er sprite
rst     $10                 ; Lo pinta
ret                         ; Sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">printOXO_X:</span></span>
<span class="line"><span style="color: #002339">ld      a, INKPLAYER1       </span><span style="color: #357B42; font-style: italic">; A = tinta jugador 1</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    INK                 </span><span style="color: #357B42; font-style: italic">; Cambia tinta</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$93</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 1er sprite</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$94</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 2º sprite</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #7B30D0">dec</span><span style="color: #002339">     b                   </span><span style="color: #357B42; font-style: italic">; B = línea inferior</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT                  </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$94</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 2º sprite</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$93</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 2º sprite</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; Sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">printOXO_Y:</span></span>
<span class="line"><span style="color: #002339">ld      a, INKPLAYER2       </span><span style="color: #357B42; font-style: italic">; A = tinta jugador 2</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    INK                 </span><span style="color: #357B42; font-style: italic">; Cambia tinta</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;ld      a, $95              ; A = 1er sprite</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$93</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 1er sprite</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;ld      a, $96              ; A = 2º sprite</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$94</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 2º sprite</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #7B30D0">dec</span><span style="color: #002339">     b                   </span><span style="color: #357B42; font-style: italic">; B = línea inferior</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT                  </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;ld      a, $97              ; A = 3er sprite</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$94</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 2º sprite</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;ld      a, $98              ; A = 4º sprite</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$93</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 1er sprite</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; Sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">De esta manera, si queremos volver a dibujar las dos fichas, en Sprite.asm descomentamos Sprite_P2, y en printOXO_Y alternamos los comentarios en las líneas LD A, ….</p>



<p class="has-medium-font-size wp-block-paragraph">Con esto ya se pintan bien las fichas en el tablero, pero no en la parte de información de la partida.</p>



<p class="has-medium-font-size wp-block-paragraph">Volvemos a Var.asm y modificamos player1_figure que ahora es así:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="player1_figure:     db $16, $04, $00, $90, $91, $0d, $91, $90" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">player1_figure:</span><span style="color: #002339">     </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$04</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$90</span><span style="color: #002339">, </span><span style="color: #174781">$91</span><span style="color: #002339">, </span><span style="color: #174781">$0d</span><span style="color: #002339">, </span><span style="color: #174781">$91</span><span style="color: #002339">, </span><span style="color: #174781">$90</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Y la dejamos así:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="player1_figure:     db $16, $04, $00, $93, $94, $0d, $94, $93" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">player1_figure:</span><span style="color: #002339">     </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$04</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$93</span><span style="color: #002339">, </span><span style="color: #174781">$94</span><span style="color: #002339">, </span><span style="color: #174781">$0d</span><span style="color: #002339">, </span><span style="color: #174781">$94</span><span style="color: #002339">, </span><span style="color: #174781">$93</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Modificamos player2_figure que ahora es así:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="player2_figure:     db $16, $04, $1b, $92, $93
                    db $16, $05, $1b, $94, $95, $ff" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">player2_figure:</span><span style="color: #002339">     </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$04</span><span style="color: #002339">, </span><span style="color: #174781">$1b</span><span style="color: #002339">, </span><span style="color: #174781">$92</span><span style="color: #002339">, </span><span style="color: #174781">$93</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$05</span><span style="color: #002339">, </span><span style="color: #174781">$1b</span><span style="color: #002339">, </span><span style="color: #174781">$94</span><span style="color: #002339">, </span><span style="color: #174781">$95</span><span style="color: #002339">, $ff</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Y la dejamos así:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="player2_figure:     db $16, $04, $1b, $93, $94
                    db $16, $05, $1b, $94, $93, $ff" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">player2_figure:</span><span style="color: #002339">     </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$04</span><span style="color: #002339">, </span><span style="color: #174781">$1b</span><span style="color: #002339">, </span><span style="color: #174781">$93</span><span style="color: #002339">, </span><span style="color: #174781">$94</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$05</span><span style="color: #002339">, </span><span style="color: #174781">$1b</span><span style="color: #002339">, </span><span style="color: #174781">$94</span><span style="color: #002339">, </span><span style="color: #174781">$93</span><span style="color: #002339">, $ff</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Por último, añadimos, comentada, la definición para pintar fichas distintas.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; player2_figure:     db $16, $04, $1b, $95, $96
;                     db $16, $05, $1b, $97, $98, $ff" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; player2_figure:     db $16, $04, $1b, $95, $96</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;                     db $16, $05, $1b, $97, $98, $ff</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y vemos los resultados.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af4931752b96&quot;}" data-wp-interactive="core/image" data-wp-key="6af4931752b96" class="wp-block-image size-full wp-lightbox-container"><img data-recalc-dims="1" loading="lazy" decoding="async" width="704" height="607" data-attachment-id="3846" data-permalink="https://espamatica.com/paso06_05/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_05.png?fit=704%2C607&amp;ssl=1" data-orig-size="704,607" data-comments-opened="1" data-image-title="Una ficha" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador ZX Spectrum &amp;#8211; una ficha&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_05.png?fit=704%2C607&amp;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_05.png?resize=704%2C607&#038;ssl=1" alt="Ensamblador ZX Spectrum - una ficha" class="wp-image-3846" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_05.png?w=704&amp;ssl=1 704w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_05.png?resize=300%2C259&amp;ssl=1 300w" sizes="auto, (max-width: 704px) 100vw, 704px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Ensamblador ZX Spectrum &#8211; una ficha</figcaption></figure>



<p class="has-medium-font-size wp-block-paragraph">Es decisión vuestra pintar la misma ficha en distinto color para los dos jugadores, o pintar distintas para cada jugador. Si utilizáramos una televisión en blanco y negro no habría ninguna duda.</p>



<p class="has-medium-font-size wp-block-paragraph">Si mantenéis todas las modificaciones, hemos ahorrado cuarenta y cinco bytes y ciento cincuenta ciclos de reloj. Si decidís pintar distintas fichas para cada jugador, el ahorro de bytes se queda en trece.</p>



<h2 id="movimiento-del-spectrum" class="wp-block-heading has-large-font-size">Movimiento del Spectrum</h2>



<p class="has-medium-font-size wp-block-paragraph">Si ya habéis jugado varias partidas contra el Spectrum, habréis averiguado la forma de ganarle, siempre, al iniciar vosotros la partida, y es que hay al menos un movimiento que el Spectrum no sabe defender, no se lo hemos programado.</p>



<p class="has-medium-font-size wp-block-paragraph">El movimiento en concreto es ocupar dos celdas de la esquina: la dos y la seis o la seis y la ocho. Si ocupamos la celda dos, el Spectrum ocupa la cinco, movemos a la celda seis y el Spectrum mueve a la siete, movemos a la tres y ya tenemos dos jugadas de tres en raya: celdas uno, dos y tres y celdas tres, seis y nueve.</p>



<p class="has-medium-font-size wp-block-paragraph">En Game.asm, localizamos zxMoveAttack_123 y por encima de ella implementamos las líneas que hacen que ya no se pueda ganar al Spectrum realizando ese movimiento.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Movimiento defensivo de esquina.
; -------------------------------------------------------------------
zxMoveDefence_corner24:
ld      a, (ix+$02)         ; A = valor celda 2
add     a, (ix+$04)         ; A+= valor celda 4
cp      b                   ; ¿A = B?
jr      nz, zxMoveDefence_corner26  ; No, salta
ld      c, KEY1             ; C = tecla 1
call    ToMove              ; Mueve a celda 1
ret     z                   ; Si es correcto, sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Movimiento defensivo de esquina.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">zxMoveDefence_corner24:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$02</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 2</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$04</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 4</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A = B?</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveDefence_corner26  </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY1             </span><span style="color: #357B42; font-style: italic">; C = tecla 1</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 1</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Comprobamos si el jugador uno tiene ocupadas las casillas dos y cuatro, en cuyo caso movemos a la casilla uno si es posible.</p>



<p class="has-medium-font-size wp-block-paragraph">El resto de comprobaciones tienen la misma estructura.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="zxMoveDefence_corner26:
ld      a, (ix+$02)         ; A = valor celda 2
add     a, (ix+$06)         ; A+= valor celda 6
cp      b                   ; ¿A = B?
jr      nz, zxMoveDefence_corner84  ; No, salta
ld      c, KEY3             ; C = tecla 3
call    ToMove              ; Mueve a celda 3
ret     z                   ; Si es correcto, sale
zxMoveDefence_corner84:
ld      a, (ix+$08)         ; A = valor celda 8
add     a, (ix+$04)         ; A+= valor celda 4
cp      b                   ; ¿A = B?
jr      nz, zxMoveDefence_corner86  ; No, salta
ld      c, KEY7             ; C = tecla 7
call    ToMove              ; Mueve a celda 3
ret     z                   ; Si es correcto, sale
zxMoveDefence_corner86:
ld      a, (ix+$08)         ; A = valor celda 8
add     a, (ix+$06)         ; A+= valor celda 6
cp      b                   ; ¿A = B?
jr      nz, zxMoveAttack_123    ; No, salta
ld      c, KEY9             ; C = tecla 9
call    ToMove              ; Mueve a celda nueve
ret     z                   ; Si es correcto, sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">zxMoveDefence_corner26:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$02</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 2</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$06</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 6</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A = B?</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveDefence_corner84  </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY3             </span><span style="color: #357B42; font-style: italic">; C = tecla 3</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 3</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #7EB233">zxMoveDefence_corner84:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$08</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 8</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$04</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 4</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A = B?</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveDefence_corner86  </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY7             </span><span style="color: #357B42; font-style: italic">; C = tecla 7</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 3</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #7EB233">zxMoveDefence_corner86:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$08</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 8</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$06</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 6</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A = B?</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveAttack_123    </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY9             </span><span style="color: #357B42; font-style: italic">; C = tecla 9</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda nueve</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Aunque la jugada se da en dos esquinas, cubrimos las cuatro.</p>



<p class="has-medium-font-size wp-block-paragraph">Justo encima de zxMoveDefence_cornerBlock2938Cont está la línea JR NZ, zxMoveAttack_123, la modificamos y la dejamos así:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="jr      nz, zxMoveDefence_corner24  ; No, no mov cruz, salta" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">jr      nz, zxMoveDefence_corner24  </span><span style="color: #357B42; font-style: italic">; No, no mov cruz, salta</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Si compiláis y jugáis algunas partidas contra el Spectrum veréis que ahora no es posible ganarle con esa jugada, no obstante sigue siendo posible ganarle, sigue habiendo jugadas que no sabe defender.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af4931753fc7&quot;}" data-wp-interactive="core/image" data-wp-key="6af4931753fc7" class="wp-block-image size-full wp-lightbox-container"><img data-recalc-dims="1" loading="lazy" decoding="async" width="702" height="612" data-attachment-id="3853" data-permalink="https://espamatica.com/paso06_06/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_06.png?fit=702%2C612&amp;ssl=1" data-orig-size="702,612" data-comments-opened="1" data-image-title="Más difícil ganar" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador ZX Spectrum &amp;#8211; más difícil ganar&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_06.png?fit=702%2C612&amp;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_06.png?resize=702%2C612&#038;ssl=1" alt="Ensamblador ZX Spectrum - más difícil ganar" class="wp-image-3853" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_06.png?w=702&amp;ssl=1 702w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso06_06.png?resize=300%2C262&amp;ssl=1 300w" sizes="auto, (max-width: 702px) 100vw, 702px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Ensamblador ZX Spectrum &#8211; más difícil ganar</figcaption></figure>



<h2 id="dificultad" class="wp-block-heading has-large-font-size">Dificultad</h2>



<p class="has-medium-font-size wp-block-paragraph">Ahora es más difícil ganar al Spectrum, debemos esperar a que sea él el que empiece la partida y, dependiendo del movimiento que haga, podremos ganarle.</p>



<p class="has-medium-font-size wp-block-paragraph">Vamos a añadir otra opción en el menú para poder seleccionar el nivel de dificultad: uno para que no cubra la jugada en la esquina, y dos para que si lo haga.</p>



<p class="has-medium-font-size wp-block-paragraph">En Var.asm, después de MaxTies, añadimos la variable para el nivel de dificultad:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="Level:          db $02              ; Nivel de dificultad" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">Level:</span><span style="color: #002339">          </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$02</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; Nivel de dificultad</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Al añadir una nueva opción de menú, está última queda pegada a la línea Espamática. Subimos todas las opciones del menú una línea, quedando así:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="TitleOptionStart:   db $10, INK1, $13, $01, $16, $07, $08, &quot;0. &quot;
                    db $10, INK5
                    defm &quot;Empezar&quot;
TitleOptionPlayer:  db $10, INK7, $13, $01, $16, $09, $08, &quot;1. &quot;
                    db $10, INK6
                    defm &quot;Jugadores&quot;
TitleOptionPoint:   db $10, INK7, $16, $0b, $08, &quot;2. &quot;, $10, INK6
                    defm &quot;Puntos&quot;
TitleOptionTime:    db $10, INK7, $16, $0d, $08, &quot;3. &quot;, $10, INK6
                    defm &quot;Tiempo&quot;
TitleOptionTies:    db $10, INK7, $16, $0f, $08, &quot;4. &quot;, $10, INK6
                    defm &quot;Tablas&quot;" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">TitleOptionStart:</span><span style="color: #002339">   </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK1, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$01</span><span style="color: #002339">, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$07</span><span style="color: #002339">, </span><span style="color: #174781">$08</span><span style="color: #002339">, &quot;</span><span style="color: #174781">0.</span><span style="color: #002339"> &quot;</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK5</span></span>
<span class="line"><span style="color: #002339">                    defm &quot;Empezar&quot;</span></span>
<span class="line"><span style="color: #7EB233">TitleOptionPlayer:</span><span style="color: #002339">  </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK7, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$01</span><span style="color: #002339">, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$09</span><span style="color: #002339">, </span><span style="color: #174781">$08</span><span style="color: #002339">, &quot;</span><span style="color: #174781">1.</span><span style="color: #002339"> &quot;</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK6</span></span>
<span class="line"><span style="color: #002339">                    defm &quot;Jugadores&quot;</span></span>
<span class="line"><span style="color: #7EB233">TitleOptionPoint:</span><span style="color: #002339">   </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK7, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$0b</span><span style="color: #002339">, </span><span style="color: #174781">$08</span><span style="color: #002339">, &quot;</span><span style="color: #174781">2.</span><span style="color: #002339"> &quot;, </span><span style="color: #174781">$10</span><span style="color: #002339">, INK6</span></span>
<span class="line"><span style="color: #002339">                    defm &quot;Puntos&quot;</span></span>
<span class="line"><span style="color: #7EB233">TitleOptionTime:</span><span style="color: #002339">    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK7, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$0d</span><span style="color: #002339">, </span><span style="color: #174781">$08</span><span style="color: #002339">, &quot;</span><span style="color: #174781">3.</span><span style="color: #002339"> &quot;, </span><span style="color: #174781">$10</span><span style="color: #002339">, INK6</span></span>
<span class="line"><span style="color: #002339">                    defm &quot;Tiempo&quot;</span></span>
<span class="line"><span style="color: #7EB233">TitleOptionTies:</span><span style="color: #002339">    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK7, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$0f</span><span style="color: #002339">, </span><span style="color: #174781">$08</span><span style="color: #002339">, &quot;</span><span style="color: #174781">4.</span><span style="color: #002339"> &quot;, </span><span style="color: #174781">$10</span><span style="color: #002339">, INK6</span></span>
<span class="line"><span style="color: #002339">                    defm &quot;Tablas&quot;</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Tras la definición de TitleOptionTies añadimos la de la dificultad:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="TitleOptionLevel:   db $10, INK7, $16, $11, $08, &quot;5. &quot;, $10, INK6
                    defm &quot;Dificultad&quot;" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">TitleOptionLevel:</span><span style="color: #002339">   </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK7, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$11</span><span style="color: #002339">, </span><span style="color: #174781">$08</span><span style="color: #002339">, &quot;</span><span style="color: #174781">5.</span><span style="color: #002339"> &quot;, </span><span style="color: #174781">$10</span><span style="color: #002339">, INK6</span></span>
<span class="line"><span style="color: #002339">                    defm &quot;Dificultad&quot;</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">En Screen.Asm localizamos PrintOptions y restamos una a todas las asignaciones de la coordenada Y:</p>



<pre class="wp-block-preformatted has-background has-medium-font-size" style="background-color:#e1e1e1">LD B, INI_TOP-$0A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pasa a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LD B,INI_TOP-$09<br>LD B, INI_TOP-$0C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pasa a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LD B,INI_TOP-$0B<br>LD B, INI_TOP-$0E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pasa a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LD B,INI_TOP-$0D<br>LD B, INI_TOP-$10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pasa a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LD B,INI_TOP-$0F</pre>



<p class="has-medium-font-size wp-block-paragraph">Por encima de JP PrintBCD añadimos las líneas siguientes:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="call    PrintBCD        ; Lo pinta
ld      b, INI_TOP-$11  ; B = coord Y
call    AT              ; Posiciona cursor
ld      hl, Level       ; HL = valor dificultad" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintBCD        </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #002339">ld      b, INI_TOP-</span><span style="color: #174781">$11</span><span style="color: #002339">  </span><span style="color: #357B42; font-style: italic">; B = coord Y</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT              </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #002339">ld      hl, Level       </span><span style="color: #357B42; font-style: italic">; HL = valor dificultad</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Siendo el aspecto final de la rutina el siguiente:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Pinta los valores de las opciones.
;
; Altera el valor de los registros AF, BC y HL.
; -------------------------------------------------------------------
PrintOptions:
ld      a, INK4         ; A = tinta verde
call    INK             ; Cambia tinta
ld      b, INI_TOP-$09  ; B = coord Y
ld      c, INI_LEFT-$15 ; C = coord X
call    AT              ; Posiciona cursor
ld      hl, MaxPlayers  ; HL = valor jugadores
call    PrintBCD        ; Lo pinta
ld      b, INI_TOP-$0b  ; B = coord Y
call    AT              ; Posiciona cursor
ld      hl, MaxPoints   ; HL = valor puntos
call    PrintBCD        ; Lo pinta
ld      b, INI_TOP-$0d  ; B = coord Y
call    AT              ; Posiciona cursor
ld      hl, seconds     ; HL = valor tiempo
call    PrintBCD        ; Lo pinta
ld      b, INI_TOP-$0f  ; B = coord Y
call    AT              ; Posiciona cursor
ld      hl, MaxTies     ; HL = valor tiempo
call    PrintBCD        ; Lo pinta
ld      b, INI_TOP-$11  ; B = coord Y
call    AT              ; Posiciona cursor
ld      hl, Level       ; HL = valor dificultad
jp      PrintBCD        ; Lo pinta y sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Pinta los valores de las opciones.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF, BC y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">PrintOptions:</span></span>
<span class="line"><span style="color: #002339">ld      a, INK4         </span><span style="color: #357B42; font-style: italic">; A = tinta verde</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    INK             </span><span style="color: #357B42; font-style: italic">; Cambia tinta</span></span>
<span class="line"><span style="color: #002339">ld      b, INI_TOP-</span><span style="color: #174781">$09</span><span style="color: #002339">  </span><span style="color: #357B42; font-style: italic">; B = coord Y</span></span>
<span class="line"><span style="color: #002339">ld      c, INI_LEFT-</span><span style="color: #174781">$15</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; C = coord X</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT              </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #002339">ld      hl, MaxPlayers  </span><span style="color: #357B42; font-style: italic">; HL = valor jugadores</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintBCD        </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #002339">ld      b, INI_TOP-</span><span style="color: #174781">$0b</span><span style="color: #002339">  </span><span style="color: #357B42; font-style: italic">; B = coord Y</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT              </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #002339">ld      hl, MaxPoints   </span><span style="color: #357B42; font-style: italic">; HL = valor puntos</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintBCD        </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #002339">ld      b, INI_TOP-</span><span style="color: #174781">$0d</span><span style="color: #002339">  </span><span style="color: #357B42; font-style: italic">; B = coord Y</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT              </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #002339">ld      hl, seconds     </span><span style="color: #357B42; font-style: italic">; HL = valor tiempo</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintBCD        </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #002339">ld      b, INI_TOP-</span><span style="color: #174781">$0f</span><span style="color: #002339">  </span><span style="color: #357B42; font-style: italic">; B = coord Y</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT              </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #002339">ld      hl, MaxTies     </span><span style="color: #357B42; font-style: italic">; HL = valor tiempo</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintBCD        </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #002339">ld      b, INI_TOP-</span><span style="color: #174781">$11</span><span style="color: #002339">  </span><span style="color: #357B42; font-style: italic">; B = coord Y</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT              </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #002339">ld      hl, Level       </span><span style="color: #357B42; font-style: italic">; HL = valor dificultad</span></span>
<span class="line"><span style="color: #7B30D0">jp</span><span style="color: #002339">      PrintBCD        </span><span style="color: #357B42; font-style: italic">; Lo pinta y sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">En Main.asm, localizamos menu_Ties y debajo la línea CP KEY4. Tras esta línea sustituimos JR NZ, menu_op por:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="jr      nz, menu_Level      ; No, bucle" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">jr      nz, menu_Level      </span><span style="color: #357B42; font-style: italic">; No, bucle</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Después de menu_TiesDo, tras la línea JR menu_op, añadimos las líneas de tratamiento de la nueva opción de menú:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="menu_Level:
cp      KEY5                    ; ¿Pulsado 5?
jr      nz, menu_op             ; No, bucle
ld      a, (Level)              ; A = dificultad
xor     $03                     ; Alterna entre 1 y 2
ld      (Level), a              ; Actualiza en memoria
jr      menu_op                 ; Bucle" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">menu_Level:</span></span>
<span class="line"><span style="color: #002339">cp      KEY5                    </span><span style="color: #357B42; font-style: italic">; ¿Pulsado 5?</span></span>
<span class="line"><span style="color: #002339">jr      nz, menu_op             </span><span style="color: #357B42; font-style: italic">; No, bucle</span></span>
<span class="line"><span style="color: #002339">ld      a, (Level)              </span><span style="color: #357B42; font-style: italic">; A = dificultad</span></span>
<span class="line"><span style="color: #7B30D0">xor</span><span style="color: #002339">     </span><span style="color: #174781">$03</span><span style="color: #002339">                     </span><span style="color: #357B42; font-style: italic">; Alterna entre 1 y 2</span></span>
<span class="line"><span style="color: #002339">ld      (Level), a              </span><span style="color: #357B42; font-style: italic">; Actualiza en memoria</span></span>
<span class="line"><span style="color: #002339">jr      menu_op                 </span><span style="color: #357B42; font-style: italic">; Bucle</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Por último, en Game.asm localizamos zxMoveDefence_corner24, y justo debajo de ella añadimos:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, (Level)          ; A = dificultad
cp      $01                 ; ¿Dificultad = 1?
jr      z, zxMoveAttack_123 ; Sí, salta" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, (Level)          </span><span style="color: #357B42; font-style: italic">; A = dificultad</span></span>
<span class="line"><span style="color: #002339">cp      </span><span style="color: #174781">$01</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; ¿Dificultad = 1?</span></span>
<span class="line"><span style="color: #002339">jr      z, zxMoveAttack_123 </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Con estas líneas, si el nivel de dificultad es uno no se comprueba la jugada de esquina, compilad y probad.</p>



<h2 id="pantalla-de-carga" class="wp-block-heading has-large-font-size">Pantalla de carga</h2>



<p class="has-medium-font-size wp-block-paragraph">Por último, vamos a añadir la pantalla de carga. ¿Y que aporta si ya hemos visto como se hace en ZX-Pong y Batalla espacial? Pues esta vez lo vamos a hacer distinto, ya que no vamos a cargar la pantalla en la VideoRAM, la cargaremos en otra dirección de memoria y luego haremos que aparezca de golpe.</p>



<p class="has-medium-font-size wp-block-paragraph">Esta es la pantalla de carga, que podéis descargar desde <a href="https://espamatica.com/wp-content/uploads/2023/04/TresEnRayaScr.zip">aquí</a>.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af49317557a0&quot;}" data-wp-interactive="core/image" data-wp-key="6af49317557a0" class="wp-block-image size-full wp-lightbox-container"><img data-recalc-dims="1" loading="lazy" decoding="async" width="511" height="384" data-attachment-id="3641" data-permalink="https://espamatica.com/tresenraya-3/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/TresEnRaya.png?fit=511%2C384&amp;ssl=1" data-orig-size="511,384" data-comments-opened="1" data-image-title="TresEnRaya" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador ZX Spectrum &amp;#8211; Tres en raya&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/TresEnRaya.png?fit=511%2C384&amp;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/TresEnRaya.png?resize=511%2C384&#038;ssl=1" alt="Ensamblador ZX Spectrum - Tres en raya" class="wp-image-3641" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/TresEnRaya.png?w=511&amp;ssl=1 511w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/TresEnRaya.png?resize=300%2C225&amp;ssl=1 300w" sizes="auto, (max-width: 511px) 100vw, 511px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Ensamblador ZX Spectrum &#8211; Tres en raya</figcaption></figure>



<p class="has-medium-font-size wp-block-paragraph">Por favor, sed benévolos, el arte nunca ha sido lo mío. Veré con buenos ojos que diseñéis vuestra propia pantalla de carga, que seguro que es mejor que ésta; difícil no debe ser.</p>



<p class="has-medium-font-size wp-block-paragraph">Para poder cargar la pantalla de carga en un área de memoria y después volcarla de golpe en la VideoRAM, necesitamos implementar la rutina que lo haga en un archivo aparte, y compilarlo por separado.</p>



<p class="has-medium-font-size wp-block-paragraph">El proceso de carga hará lo siguiente:</p>



<ul class="wp-block-list">
<li class="has-medium-font-size">Carga el cargador.</li>



<li class="has-medium-font-size">Carga la rutina que vuelca la pantalla de carga en la dirección de memoria 24200.</li>



<li class="has-medium-font-size">Carga la pantalla de carga en la dirección 24250.</li>



<li class="has-medium-font-size">Ejecuta la rutina que vuelca la pantalla de carga a la VideoRAM.</li>



<li class="has-medium-font-size">Carga el programa de tres en raya en&nbsp;la dirección 24200.</li>



<li class="has-medium-font-size">Carga la rutina de interrupciones en&nbsp;la dirección 32348.</li>



<li class="has-medium-font-size">Ejecuta el programa de tres en raya.</li>
</ul>



<p class="has-medium-font-size wp-block-paragraph">Lo primero que vamos a ver es el cargador que desarrollamos en Basic para hacer todo lo expuesto arriba.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">VB</span><span role="button" tabindex="0" data-code=" 10 CLEAR 24200
 20 INK 0: PAPER 4: BORDER 4: CLS
 30 POKE 23610,255: POKE 23739,111
 40 LOAD &quot;&quot;CODE 24200
 50 LOAD &quot;&quot;CODE 24250
 60 RANDOMIZE USR 24200
 70 LOAD &quot;&quot;CODE 24200
 80 LOAD &quot;&quot;CODE 32348
 90 CLS
100 RANDOMIZE USR 24200" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339"> </span><span style="color: #174781">10</span><span style="color: #002339"> </span><span style="color: #1AB394">CLEAR</span><span style="color: #002339"> </span><span style="color: #174781">24200</span></span>
<span class="line"><span style="color: #002339"> </span><span style="color: #174781">20</span><span style="color: #002339"> INK </span><span style="color: #174781">0</span><span style="color: #002339">: PAPER </span><span style="color: #174781">4</span><span style="color: #002339">: BORDER </span><span style="color: #174781">4</span><span style="color: #002339">: CLS</span></span>
<span class="line"><span style="color: #002339"> </span><span style="color: #174781">30</span><span style="color: #002339"> POKE </span><span style="color: #174781">23610</span><span style="color: #002339">,</span><span style="color: #174781">255</span><span style="color: #002339">: POKE </span><span style="color: #174781">23739</span><span style="color: #002339">,</span><span style="color: #174781">111</span></span>
<span class="line"><span style="color: #002339"> </span><span style="color: #174781">40</span><span style="color: #002339"> LOAD </span><span style="color: #A44185">&quot;&quot;</span><span style="color: #002339">CODE </span><span style="color: #174781">24200</span></span>
<span class="line"><span style="color: #002339"> </span><span style="color: #174781">50</span><span style="color: #002339"> LOAD </span><span style="color: #A44185">&quot;&quot;</span><span style="color: #002339">CODE </span><span style="color: #174781">24250</span></span>
<span class="line"><span style="color: #002339"> </span><span style="color: #174781">60</span><span style="color: #0991B6"> RANDOMIZE </span><span style="color: #002339">USR </span><span style="color: #174781">24200</span></span>
<span class="line"><span style="color: #002339"> </span><span style="color: #174781">70</span><span style="color: #002339"> LOAD </span><span style="color: #A44185">&quot;&quot;</span><span style="color: #002339">CODE </span><span style="color: #174781">24200</span></span>
<span class="line"><span style="color: #002339"> </span><span style="color: #174781">80</span><span style="color: #002339"> LOAD </span><span style="color: #A44185">&quot;&quot;</span><span style="color: #002339">CODE </span><span style="color: #174781">32348</span></span>
<span class="line"><span style="color: #002339"> </span><span style="color: #174781">90</span><span style="color: #002339"> CLS</span></span>
<span class="line"><span style="color: #174781">100</span><span style="color: #0991B6"> RANDOMIZE </span><span style="color: #002339">USR </span><span style="color: #174781">24200</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">No olvidéis guardarlo con SAVE”TresEnRaya” LINE 10.</p>



<p class="has-medium-font-size wp-block-paragraph">El siguiente paso es implemetar la rutina que vuelca la pantalla de carga a la VideoRAM. Creamos el archivo LoadScr.asm y agregamos las siguientes líneas:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; LoadScr.asm
;
; La pantalla de carga se cargará en $5eba, y esta rutina la pasará
; a la VideoRAM para que aparezca de golpe y luego limpiará la zona
; dónde se había cargado inicialmente.
; La limpieza de ese área de memoria no es necesaria, pero lo hacemos
; por si tenemos que depurar, no encontrar código que en realidad sean
; restos de la pantalla de carga.
; -------------------------------------------------------------------
org     $5e88               ; Dirección de carga

ld      hl, $5eba           ; HL = dirección dónde está la pantalla
ld      de, $4000           ; DE = dirección VideoRAM
ld      bc, $1b00           ; Longitud de la pantalla
ldir                        ; Vuelca la pantalla

ld      hl, $5eba           ; HL = dirección dónde está la pantalla
ld      de, $5ebb           ; Dirección siguiente
ld      bc, $1aff           ; Longitud de la pantalla - 1
ld      (hl), $00           ; Limpia la primera posición
ldir                        ; Limpia el resto

ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; LoadScr.asm</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; La pantalla de carga se cargará en $5eba, y esta rutina la pasará</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; a la VideoRAM para que aparezca de golpe y luego limpiará la zona</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; dónde se había cargado inicialmente.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; La limpieza de ese área de memoria no es necesaria, pero lo hacemos</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; por si tenemos que depurar, no encontrar código que en realidad sean</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; restos de la pantalla de carga.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #002339">org     </span><span style="color: #174781">$5e88</span><span style="color: #002339">               </span><span style="color: #357B42; font-style: italic">; Dirección de carga</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      hl, </span><span style="color: #174781">$5eba</span><span style="color: #002339">           </span><span style="color: #357B42; font-style: italic">; HL = dirección dónde está la pantalla</span></span>
<span class="line"><span style="color: #002339">ld      de, </span><span style="color: #174781">$4000</span><span style="color: #002339">           </span><span style="color: #357B42; font-style: italic">; DE = dirección VideoRAM</span></span>
<span class="line"><span style="color: #002339">ld      bc, </span><span style="color: #174781">$1b00</span><span style="color: #002339">           </span><span style="color: #357B42; font-style: italic">; Longitud de la pantalla</span></span>
<span class="line"><span style="color: #002339">ldir                        </span><span style="color: #357B42; font-style: italic">; Vuelca la pantalla</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      hl, </span><span style="color: #174781">$5eba</span><span style="color: #002339">           </span><span style="color: #357B42; font-style: italic">; HL = dirección dónde está la pantalla</span></span>
<span class="line"><span style="color: #002339">ld      de, </span><span style="color: #174781">$5ebb</span><span style="color: #002339">           </span><span style="color: #357B42; font-style: italic">; Dirección siguiente</span></span>
<span class="line"><span style="color: #002339">ld      bc, </span><span style="color: #174781">$1aff</span><span style="color: #002339">           </span><span style="color: #357B42; font-style: italic">; Longitud de la pantalla - 1</span></span>
<span class="line"><span style="color: #002339">ld      (hl), </span><span style="color: #174781">$00</span><span style="color: #002339">           </span><span style="color: #357B42; font-style: italic">; Limpia la primera posición</span></span>
<span class="line"><span style="color: #002339">ldir                        </span><span style="color: #357B42; font-style: italic">; Limpia el resto</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">La pantalla de carga la cargamos en $5eba. Esta rutina copia a la VideoRAM desde esa dirección $1B00 posiciones (6912 bytes), todo el área de píxeles y atributos.</p>



<p class="has-medium-font-size wp-block-paragraph">Una vez copiado, limpia el área de memoria en la que se cargó la pantalla; no es necesario, pero si tenemos que depurar evitamos que quede código residual que nos pueda confundir.</p>



<p class="has-medium-font-size wp-block-paragraph">Ya solo nos queda modificar el script que tenemos para compilar y generar el .tap final. La versión para Windows queda así:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ShellScript</span><span role="button" tabindex="0" data-code="echo off
cls
echo Compilando oxo
pasmo --name TresEnRaya --tap Main.asm oxo.tap oxo.log
echo Compilando int
pasmo --name Int --tap Int.asm int.tap int.log
echo Compilando loadscr
pasmo --name LoadScr --tap LoadScr.asm loadscr.tap loadscr.log
echo Generando TresEnRaya
copy /b /y cargador.tap+loadscr.tap+TresEnRayaScr.Tap+oxo.tap+int.tap TresEnRaya.tap
echo Proceso finalizado" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">off</span></span>
<span class="line"><span style="color: #7EB233">cls</span></span>
<span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">Compilando</span><span style="color: #002339"> </span><span style="color: #A44185">oxo</span></span>
<span class="line"><span style="color: #7EB233">pasmo</span><span style="color: #002339"> </span><span style="color: #174781">--name</span><span style="color: #002339"> </span><span style="color: #A44185">TresEnRaya</span><span style="color: #002339"> </span><span style="color: #174781">--tap</span><span style="color: #002339"> </span><span style="color: #A44185">Main.asm</span><span style="color: #002339"> </span><span style="color: #A44185">oxo.tap</span><span style="color: #002339"> </span><span style="color: #A44185">oxo.log</span></span>
<span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">Compilando</span><span style="color: #002339"> </span><span style="color: #A44185">int</span></span>
<span class="line"><span style="color: #7EB233">pasmo</span><span style="color: #002339"> </span><span style="color: #174781">--name</span><span style="color: #002339"> </span><span style="color: #A44185">Int</span><span style="color: #002339"> </span><span style="color: #174781">--tap</span><span style="color: #002339"> </span><span style="color: #A44185">Int.asm</span><span style="color: #002339"> </span><span style="color: #A44185">int.tap</span><span style="color: #002339"> </span><span style="color: #A44185">int.log</span></span>
<span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">Compilando</span><span style="color: #002339"> </span><span style="color: #A44185">loadscr</span></span>
<span class="line"><span style="color: #7EB233">pasmo</span><span style="color: #002339"> </span><span style="color: #174781">--name</span><span style="color: #002339"> </span><span style="color: #A44185">LoadScr</span><span style="color: #002339"> </span><span style="color: #174781">--tap</span><span style="color: #002339"> </span><span style="color: #A44185">LoadScr.asm</span><span style="color: #002339"> </span><span style="color: #A44185">loadscr.tap</span><span style="color: #002339"> </span><span style="color: #A44185">loadscr.log</span></span>
<span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">Generando</span><span style="color: #002339"> </span><span style="color: #A44185">TresEnRaya</span></span>
<span class="line"><span style="color: #7EB233">copy</span><span style="color: #002339"> </span><span style="color: #A44185">/b</span><span style="color: #002339"> </span><span style="color: #A44185">/y</span><span style="color: #002339"> </span><span style="color: #A44185">cargador.tap+loadscr.tap+TresEnRayaScr.Tap+oxo.tap+int.tap</span><span style="color: #002339"> </span><span style="color: #A44185">TresEnRaya.tap</span></span>
<span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">Proceso</span><span style="color: #002339"> </span><span style="color: #A44185">finalizado</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">El aspecto de la versión para Linux sería éste:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ShellScript</span><span role="button" tabindex="0" data-code="clear
echo Compilando oxo
pasmo --name TresEnRaya --tap Main.asm oxo.tap oxo.log
echo Compilando int
pasmo --name Int --tap Int.asm int.tap int.log
echo Compilando loadscr
pasmo --name LoadScr --tap LoadScr.asm loadscr.tap loadscr.log
echo Generando TresEnRaya
cat cargador.tap loadscr.tap TresEnRayaScr.Tap oxo.tap int.tap &gt; TresEnRaya.tap
echo Proceso finalizado" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">clear</span></span>
<span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">Compilando</span><span style="color: #002339"> </span><span style="color: #A44185">oxo</span></span>
<span class="line"><span style="color: #7EB233">pasmo</span><span style="color: #002339"> </span><span style="color: #174781">--name</span><span style="color: #002339"> </span><span style="color: #A44185">TresEnRaya</span><span style="color: #002339"> </span><span style="color: #174781">--tap</span><span style="color: #002339"> </span><span style="color: #A44185">Main.asm</span><span style="color: #002339"> </span><span style="color: #A44185">oxo.tap</span><span style="color: #002339"> </span><span style="color: #A44185">oxo.log</span></span>
<span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">Compilando</span><span style="color: #002339"> </span><span style="color: #A44185">int</span></span>
<span class="line"><span style="color: #7EB233">pasmo</span><span style="color: #002339"> </span><span style="color: #174781">--name</span><span style="color: #002339"> </span><span style="color: #A44185">Int</span><span style="color: #002339"> </span><span style="color: #174781">--tap</span><span style="color: #002339"> </span><span style="color: #A44185">Int.asm</span><span style="color: #002339"> </span><span style="color: #A44185">int.tap</span><span style="color: #002339"> </span><span style="color: #A44185">int.log</span></span>
<span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">Compilando</span><span style="color: #002339"> </span><span style="color: #A44185">loadscr</span></span>
<span class="line"><span style="color: #7EB233">pasmo</span><span style="color: #002339"> </span><span style="color: #174781">--name</span><span style="color: #002339"> </span><span style="color: #A44185">LoadScr</span><span style="color: #002339"> </span><span style="color: #174781">--tap</span><span style="color: #002339"> </span><span style="color: #A44185">LoadScr.asm</span><span style="color: #002339"> </span><span style="color: #A44185">loadscr.tap</span><span style="color: #002339"> </span><span style="color: #A44185">loadscr.log</span></span>
<span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">Generando</span><span style="color: #002339"> </span><span style="color: #A44185">TresEnRaya</span></span>
<span class="line"><span style="color: #7EB233">cat</span><span style="color: #002339"> </span><span style="color: #A44185">cargador.tap</span><span style="color: #002339"> </span><span style="color: #A44185">loadscr.tap</span><span style="color: #002339"> </span><span style="color: #A44185">TresEnRayaScr.Tap</span><span style="color: #002339"> </span><span style="color: #A44185">oxo.tap</span><span style="color: #002339"> </span><span style="color: #A44185">int.tap</span><span style="color: #002339"> </span><span style="color: #7B30D0">&gt;</span><span style="color: #002339"> </span><span style="color: #A44185">TresEnRaya.tap</span></span>
<span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">Proceso</span><span style="color: #002339"> </span><span style="color: #A44185">finalizado</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Y con esto hemos terminado. Compilad, cargad en el emulador y a jugar.</p>



<h2 id="ensamblador-zx-spectrum-conclusion" class="wp-block-heading has-large-font-size">Ensamblador ZX Spectrum, conclusión</h2>



<p class="has-medium-font-size wp-block-paragraph">En este capítulo hemos añadido dos opciones al menú de inicio, somos capaces de predecir si va a haber tablas antes de que el tablero esté lleno, hemos ahorrado bytes y ciclos de reloj, modificado los movimientos del Spectrum para que sea más difícil ganarle y añadido un pantalla de carga que no se muestra poco a poco, se muestra de golpe.</p>



<p class="has-medium-font-size wp-block-paragraph">En este tutorial hemos ido mucho más rápido que en los anteriores, ya tenemos los conocimientos suficientes como para que no sea necesario explicar las instrucciones una a una.</p>



<p class="has-medium-font-size wp-block-paragraph">Todo el código que hemos generado lo podéis descargar desde&nbsp;<a href="https://espamatica.com/wp-content/uploads/2023/05/OXO_0x06.zip">aquí</a>.</p>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<h2 class="wp-block-heading has-large-font-size">Enlaces de interés</h2>



<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://notepad-plus-plus.org/" target="_blank" rel="noreferrer noopener nofollow">Notepad++</a></li>



<li class="has-medium-font-size"><a href="https://code.visualstudio.com/" target="_blank" rel="noreferrer noopener nofollow">Visual Studio Code</a></li>



<li class="has-medium-font-size"><a href="https://www.sublimetext.com/" target="_blank" rel="noreferrer noopener nofollow">Sublime Text</a></li>



<li class="has-medium-font-size"><a href="https://github.com/chernandezba/zesarux" target="_blank" rel="noreferrer noopener nofollow">ZEsarUX</a></li>



<li class="has-medium-font-size"><a href="https://pasmo.speccy.org/" target="_blank" rel="noreferrer noopener nofollow">PASMO</a></li>



<li class="has-medium-font-size"><a href="https://git-scm.com/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Instalaci%C3%B3n-de-Git" target="_blank" rel="noreferrer noopener nofollow">Git</a></li>



<li class="has-medium-font-size"><a href="https://wiki.speccy.org/cursos/ensamblador/indice" target="_blank" rel="noreferrer noopener nofollow">Curso de ensamblador Z80 de Compiler Software</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/wp-content/uploads/2021/10/00-Referencia-Z80.zip">Referencia Z80</a></li>



<li class="has-medium-font-size"><a href="https://t.me/EnsambladorZXSpectrum" target="_blank" rel="noreferrer noopener nofollow">Ensamblador Z80 en Telegram</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/wp-content/uploads/2023/05/Espamatica.zip">Archivo .dsk con los juegos de los tutoriales</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x0f-ensamblador-zx-spectrum-marciano-depuracion/">Personalización y depuración con ZEsarUX</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/wp-content/uploads/2023/06/Ensamblador-para-ZX-Spectrum-OXO.zip">Tutorial completo en formato PDF y EPUB</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.itch.io/tres-en-raya" rel="nofollow noopener" target="_blank">El proyecto en itch.io</a></li>
</ul>
</div>



<p class="has-background has-medium-font-size wp-block-paragraph" style="background-color:#cdd6dd">Ensamblador para ZX Spectrum OXO por&nbsp;<a href="https://espamatica.com/">Juan Antonio Rubio García</a>.<br>Esta obra está bajo licencia de&nbsp;<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank" rel="noreferrer noopener nofollow">Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License</a>.</p>



<div align="center">
<a href="http://www.safecreative.org/work/2306054511935" rel="nofollow noopener" target="_blank"><img decoding="async" src="https://resources.safecreative.org:443/work-creativity-declaration/2306054511935/label/declaration-1-human-real-300" style="border:0;" title="null"/></a>
</div>
<br><br>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<p class="has-medium-font-size wp-block-paragraph">También puedes visitar el resto de tutoriales:</p>



<ul class="wp-block-list">
<li class="has-medium-font-size">.Net
<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://espamatica.com/mediatime/">MediaTime</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/nullabledatetimepicker/">NullableDateTimePicker</a></li>
</ul>
</li>



<li class="has-medium-font-size">Z80
<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://espamatica.com/entorno-de-desarrollo-para-ensamblador-z80/">Entorno de desarrollo</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/numeros-bcd-spectrum/">Números BCD</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/posiciones-de-pantalla-zx-spectrum/">Pantalla ZX Spectrum</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/ensamblador-zx-spectrum-pong-introduccion/">Pong</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x00-ensamblador-zx-spectrum-marciano-introduccion/">Batalla Espacial</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x01-ensamblador-zx-spectrum-oxo-tablero-de-juego/">Tres en raya</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/uso-de-beepfx/">Uso de BeepFX</a></li>
</ul>
</li>
</ul>
</div>



<p class="has-medium-font-size wp-block-paragraph">Y recuerda, si lo usas no te limites a copiarlo, intenta entenderlo y adaptarlo a tus necesidades.</p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://espamatica.com/0x06-ensamblador-zx-spectrum-oxo-ajustes-finales/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3808</post-id>	</item>
		<item>
		<title>0x05 Ensamblador ZX Spectrum OXO &#8211; yo contra el Spectrum</title>
		<link>https://espamatica.com/0x05-ensamblador-zx-spectrum-oxo-contra-el-spectrum/</link>
					<comments>https://espamatica.com/0x05-ensamblador-zx-spectrum-oxo-contra-el-spectrum/#respond</comments>
		
		<dc:creator><![CDATA[Juan Antonio Rubio García]]></dc:creator>
		<pubDate>Fri, 26 May 2023 07:00:00 +0000</pubDate>
				<category><![CDATA[ZX Spectrum]]></category>
		<category><![CDATA[Ensamblador Z80]]></category>
		<category><![CDATA[Retro]]></category>
		<category><![CDATA[Ensamblador]]></category>
		<category><![CDATA[Tres en raya]]></category>
		<category><![CDATA[Z80]]></category>
		<guid isPermaLink="false">https://espamatica.com/?p=3781</guid>

					<description><![CDATA[En este capítulo de Ensamblador ZX Spectrum OXO, vamos a implementar la partida a un solo jugador. Una vez que]]></description>
										<content:encoded><![CDATA[
<p class="has-medium-font-size wp-block-paragraph">En este capítulo de Ensamblador ZX Spectrum OXO, vamos a implementar la partida a un solo jugador.</p>



<p class="has-medium-font-size wp-block-paragraph">Una vez que podemos jugar contra amigos y familiares queda la posibilidad de que no tengamos con quién, de ahí la necesidad de que se pueda jugar contra el Spectrum.</p>


<div role="navigation" aria-label="Tabla de contenidos" class="simpletoc wp-block-simpletoc-toc"><h2 class="simpletoc-title">Tabla de contenidos</h2>
<ul class="simpletoc-list">
<li><a href="#yo-contra-el-spectrum">Yo contra el Spectrum</a>
</li>
<li><a href="#ensamblador-zx-spectrum-conclusion">Ensamblador ZX Spectrum, conclusión</a>
</li>
<li><a href="#enlaces-de-interes">Enlaces de interés</a>
</li></ul></div>


<h2 id="yo-contra-el-spectrum" class="wp-block-heading has-large-font-size">Yo contra el Spectrum</h2>



<p class="has-medium-font-size wp-block-paragraph">El grueso de esta implementación lo escribimos en Game.asm, empezando por una rutina que genera números pseudo aleatorios entre uno y nueve, para que cuando el Spectrum empieza la partida, lo haga de distinta manera.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Obtiene un número pseudo aleatorio entre 1 y 9.
;
; Retorno:  A   -&gt;  Número obtenido.
; -------------------------------------------------------------------
GetRandomN:
ld      a, r                ; A = R
and     $0f                 ; Deja bits 0 a 3
inc     a                   ; A+=1
cp      $0a                 ; ¿A &gt; 9?
ret     c                   ; No, sale
rra                         ; A/=2, porque Carry = 0, si no SRL A
ret                         ; Sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Obtiene un número pseudo aleatorio entre 1 y 9.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Retorno:  A   -&gt;  Número obtenido.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">GetRandomN:</span></span>
<span class="line"><span style="color: #002339">ld      a, r                </span><span style="color: #357B42; font-style: italic">; A = R</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$0f</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Deja bits 0 a 3</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     a                   </span><span style="color: #357B42; font-style: italic">; A+=1</span></span>
<span class="line"><span style="color: #002339">cp      </span><span style="color: #174781">$0a</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; ¿A &gt; 9?</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; No, sale</span></span>
<span class="line"><span style="color: #002339">rra                         </span><span style="color: #357B42; font-style: italic">; A/=2, porque Carry = 0, si no SRL A</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; Sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">GetRandomN obtiene un número pseudo aleatorio entre uno y nueve, apoyándose en el registro R. En la línea RRA, tal y como se ve en los comentarios, dividimos A entre dos porque el acarreo está a cero y porque solo lo hacemos una vez, si no fuera así deberíamos hacerlo con SRL A. RRA ocupa un byte y tarda cuatro ciclos de reloj, SRL A es justo el doble. Sólo se divide entre dos si el número obtenido es mayor de 9.</p>



<p class="has-medium-font-size wp-block-paragraph">La parte que realiza los movimientos del Spectrum es muy larga, ya que son diversas las combinaciones que se evalúan, por lo que vamos a verla por bloques. Aún así, y dado que las semejanzas entre distintos bloques es mucha, vamos a explicar sólo los más significativos.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Mueve ZX Spectrum.
;
; Altera el valor de los registros AF, BC e IX.
; -------------------------------------------------------------------
ZxMove:
ld      a, (MoveCounter)    ; A = movimientos
or      a                   ; ¿Movimientos = 0?
jr      nz, zxMove_center   ; No, salta
call    GetRandomN          ; A = número entre 1 y 9
add     a, '0'              ; A = código ascii
ld      c, a                ; C = A
call    ToMove              ; Mueve a celda
ret                         ; Sale
zxMove_center:
cp      $01                 ; ¿Movimientos &gt; 1?
jr      nz, zxMove_cont     ; Sí, salta
ld      c, KEY5             ; C = tecla 5
call    ToMove              ; Mueve a celda 5
ret     z                   ; Si es correcto, sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Mueve ZX Spectrum.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF, BC e IX.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">ZxMove:</span></span>
<span class="line"><span style="color: #002339">ld      a, (MoveCounter)    </span><span style="color: #357B42; font-style: italic">; A = movimientos</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">      a                   </span><span style="color: #357B42; font-style: italic">; ¿Movimientos = 0?</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMove_center   </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    GetRandomN          </span><span style="color: #357B42; font-style: italic">; A = número entre 1 y 9</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, &#39;</span><span style="color: #174781">0</span><span style="color: #002339">&#39;              </span><span style="color: #357B42; font-style: italic">; A = código ascii</span></span>
<span class="line"><span style="color: #002339">ld      c, a                </span><span style="color: #357B42; font-style: italic">; C = A</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; Sale</span></span>
<span class="line"><span style="color: #7EB233">zxMove_center:</span></span>
<span class="line"><span style="color: #002339">cp      </span><span style="color: #174781">$01</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; ¿Movimientos &gt; 1?</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMove_cont     </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY5             </span><span style="color: #357B42; font-style: italic">; C = tecla 5</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 5</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">En esta primera parte evaluamos si es el primer movimiento de la partida, y si es así obtenemos un número aleatorio entre uno y nueve y movemos a esa celda. Si es el segundo movimiento intentamos mover a la celda cinco (centro). Si no se dan estas condiciones, seguimos con las comprobaciones de si el Spectrum puede ganar o peder.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="zxMove_cont:
ld      ix, Grid-$01        ; IX = dir Grid-1
ld      b, $20              ; B = valor Spectrum puede ganar
call    zxMoveToWin_123     ; Movimiento para ganar Spectrum
ret     z                   ; Si es válido, sale
ld      b, $02              ; B = valor jugador 1 puede ganar
call    zxMoveToWin_123     ; Movimiento para evitarlo
ret     z                   ; Si es válido sale
jp      zxMoveDefence_diagonally ; Movimientos defensivos" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">zxMove_cont:</span></span>
<span class="line"><span style="color: #002339">ld      ix, Grid-</span><span style="color: #174781">$01</span><span style="color: #002339">        </span><span style="color: #357B42; font-style: italic">; IX = dir Grid-1</span></span>
<span class="line"><span style="color: #002339">ld      b, </span><span style="color: #174781">$20</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; B = valor Spectrum puede ganar</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    zxMoveToWin_123     </span><span style="color: #357B42; font-style: italic">; Movimiento para ganar Spectrum</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es válido, sale</span></span>
<span class="line"><span style="color: #002339">ld      b, </span><span style="color: #174781">$02</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; B = valor jugador 1 puede ganar</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    zxMoveToWin_123     </span><span style="color: #357B42; font-style: italic">; Movimiento para evitarlo</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es válido sale</span></span>
<span class="line"><span style="color: #7B30D0">jp</span><span style="color: #002339">      zxMoveDefence_diagonally </span><span style="color: #357B42; font-style: italic">; Movimientos defensivos</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Recordad que los movimientos del jugador dos, en este caso el Spectrum, se señalan en el bit cuatro de las celdas, por eso cargamos $20 en B, que sería el valor si hubiera dos celdas ocupadas en una línea por el Spectrum.</p>



<p class="has-medium-font-size wp-block-paragraph">Llamamos a zxMoveToWin_123 para que el Spectrum, si puede ganar, realice el movimiento.</p>



<p class="has-medium-font-size wp-block-paragraph">Si no ha ganado el Spectrum, cargamos dos en B para evaluar si el jugador uno tiene movimiento para ganar. Llamamos por segunda vez a zxMoveToWin_123 para evitar que gane.</p>



<p class="has-medium-font-size wp-block-paragraph">Si no se ha dado ninguno de los casos, pasamos a la defensiva.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Evalúa si el Spectrum tiene movimiento para ganar.
; -------------------------------------------------------------------
zxMoveToWin_123:
ld      a, (ix+$01)         ; A = valor celda 1
add     a, (ix+$02)         ; A+= valor celda 2
add     a, (ix+$03)         ; A+= valor celda 3
cp      b                   ; ¿A = B?
jp      nz, zxMoveToWin_456 ; No, salta
; Spectrum puede ganar
ld      c, KEY1             ; C = tecla 1
call    ToMove              ; Mueve a celda 1
ret     z                   ; Si es correcto, sale
inc     c                   ; C = tecla 2
call    ToMove              ; Mueve a celda 2
ret     z                   ; Si es correcto, sale
inc     c                   ; C = tecla 3
call    ToMove              ; Mueve a celda 3
ret                         ; Sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Evalúa si el Spectrum tiene movimiento para ganar.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">zxMoveToWin_123:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$01</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 1</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$02</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 2</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$03</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 3</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A = B?</span></span>
<span class="line"><span style="color: #7B30D0">jp</span><span style="color: #002339">      nz, zxMoveToWin_456 </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Spectrum puede ganar</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY1             </span><span style="color: #357B42; font-style: italic">; C = tecla 1</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 1</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; C = tecla 2</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 2</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; C = tecla 3</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 3</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; Sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Si el Spectrum ocupa dos casillas, intentamos mover a la casilla uno, si no es correcto a la dos y si no a la tres. Para ir de una casilla a la siguiente incrementamos C, numéricamente son contiguas.</p>



<p class="has-medium-font-size wp-block-paragraph">Las comprobaciones para las combinaciones cuatro, cinco, seis y siete, ocho, nueve, son iguales a la anterior.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="zxMoveToWin_456:
ld      a, (ix+$04)         ; A = valor celda 4
add     a, (ix+$05)         ; A+= valor celda 5
add     a, (ix+$06)         ; A+= valor celda 6
cp      b                   ; ¿A = B?
jr      nz, zxMoveToWin_789 ; No, salta
; Spectrum puede ganar
ld      c, KEY4             ; C = tecla 4
call    ToMove              ; Mueve a celda 4
ret     z                   ; Si es correcto, sale
inc     c                   ; C = tecla 5
call    ToMove              ; Mueve a celda 5
ret     z                   ; Si es correcto, sale
inc     c                   ; C = tecla 6
call    ToMove              ; Mueve a celda 6
ret                         ; Sale

zxMoveToWin_789:
ld      a, (ix+$07)         ; A = valor celda 7
add     a, (ix+$08)         ; A+= valor celda 8
add     a, (ix+$09)         ; A+= valor celda 9
cp      b                   ; ¿A = B?
jr      nz, zxMoveToWin_147 ; No, salta
; Spectrum puede ganar
ld      c, KEY7             ; C = tecla 7
call    ToMove              ; Mueve a celda 7
ret     z                   ; Si es correcto, sale
inc     c                   ; C = tecla 8
call    ToMove              ; Mueve a celda 8
ret     z                   ; Si es correcto, sale
inc     c                   ; C = tecla 9
call    ToMove              ; Mueve a celda 9
ret                         ; Sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">zxMoveToWin_456:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$04</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 4</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$05</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$06</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 6</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A = B?</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveToWin_789 </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Spectrum puede ganar</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY4             </span><span style="color: #357B42; font-style: italic">; C = tecla 4</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 4</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; C = tecla 5</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 5</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; C = tecla 6</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 6</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; Sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveToWin_789:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$07</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 7</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$08</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 8</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$09</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 9</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A = B?</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveToWin_147 </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Spectrum puede ganar</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY7             </span><span style="color: #357B42; font-style: italic">; C = tecla 7</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 7</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; C = tecla 8</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 8</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; C = tecla 9</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 9</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; Sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">El resto de comprobaciones cambian ligeramente.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="zxMoveToWin_147:
ld      a, (ix+$01)         ; A = valor celda 1
add     a, (ix+$04)         ; A+= valor celda 4
add     a, (ix+$07)         ; A+= valor celda 7
cp      b                   ; ¿A=B?
jr      nz, zxMoveToWin_258 ; No, salta
ld      c, KEY1             ; C = tecla 1
call    ToMove              ; Mueve a celda 1
ret     z                   ; Si es correcto, sale
ld      c, KEY4             ; C = tecla 4
call    ToMove              ; Mueve a celda 4
ret     z                   ; Si es correcto, sale
ld      c, KEY7             ; C = tecla 7
call    ToMove              ; Mueve a celda 7
ret                         ; Sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">zxMoveToWin_147:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$01</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 1</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$04</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 4</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$07</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 7</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A=B?</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveToWin_258 </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY1             </span><span style="color: #357B42; font-style: italic">; C = tecla 1</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 1</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY4             </span><span style="color: #357B42; font-style: italic">; C = tecla 4</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 4</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY7             </span><span style="color: #357B42; font-style: italic">; C = tecla 7</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 7</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; Sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Al no estar las casillas contiguas numéricamente, en la parte del final en lugar de incrementar C cargamos cada tecla. Desde aquí, todas las comprobaciones para saber si el Spectrum puede ganar o perder, son iguales.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="zxMoveToWin_258:
ld      a, (ix+$02)         ; A = valor celda 2
add     a, (ix+$05)         ; A+= valor celda 5
add     a, (ix+$08)         ; A+= valor celda 8
cp      b                   ; ¿A=B?
jr      nz, zxMoveToWin_369 ; No, salta
ld      c, KEY2             ; C = tecla 2
call    ToMove              ; Mueve a celda 2
ret     z                   ; Si es correcto, sale
ld      c, KEY5             ; C = tecla 5
call    ToMove              ; Mueve a celda 5
ret     z                   ; Si es correcto, sale
ld      c, KEY8             ; C = tecla 8
call    ToMove              ; Mueve a celda 8
ret                         ; Sale
    
zxMoveToWin_369:
ld      a, (ix+$03)         ; A = valor celda 3
add     a, (ix+$06)         ; A+= valor celda 6
add     a, (ix+$09)         ; A+= valor celda 9
cp      b                   ; ¿A=B?
jr      nz, zxMoveToWin_159 ; No, salta
ld      c, KEY3             ; C = tecla 3
call    ToMove              ; Mueve a celda 3
ret     z                   ; Si es correcto, sale
ld      c, KEY6             ; C = tecla 6
call    ToMove              ; Mueve a celda 6
ret     z                   ; Si es correcto, sale
ld      c, KEY9             ; C = tecla 9
call    ToMove              ; Mueve a celda 9
ret                         ; Sale
    
zxMoveToWin_159:
ld      a, (ix+$01)         ; A = valor celda 1
add     a, (ix+$05)         ; A+= valor celda 5
add     a, (ix+$09)         ; A+= valor celda 9
cp      b                   ; ¿A=B?
jr      nz, zxMoveToWin_357 ; No, salta
ld      c, KEY1             ; C = tecla 1
call    ToMove              ; Mueve a celda 1
ret     z                   ; Si es correcto, sale
ld      c, KEY5             ; C = tecla 5
call    ToMove              ; Mueve a celda 5
ret     z                   ; Si es correcto, sale
ld      c, KEY9             ; C = tecla 9
call    ToMove              ; Mueve a celda 9
ret                         ; Sale

zxMoveToWin_357:
ld      a, (ix+$03)         ; A = valor celda 3
add     a, (ix+$05)         ; A+= valor celda 5
add     a, (ix+$07)         ; A+= valor celda 7
cp      b                   ; ¿A=B?
ret     nz
ld      c, KEY3             ; C = tecla 3
call    ToMove              ; Mueve a celda 3
ret     z                   ; Si es correcto, sale
ld      c, KEY5             ; C = tecla 5
call    ToMove              ; Mueve a celda 5
ret     z                   ; Si es correcto, sale
ld      c, KEY7             ; C = tecla 7
call    ToMove              ; Mueve a celda 7
ret                         ; Sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">zxMoveToWin_258:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$02</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 2</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$05</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$08</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 8</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A=B?</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveToWin_369 </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY2             </span><span style="color: #357B42; font-style: italic">; C = tecla 2</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 2</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY5             </span><span style="color: #357B42; font-style: italic">; C = tecla 5</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 5</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY8             </span><span style="color: #357B42; font-style: italic">; C = tecla 8</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 8</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; Sale</span></span>
<span class="line"><span style="color: #002339">    </span></span>
<span class="line"><span style="color: #7EB233">zxMoveToWin_369:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$03</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 3</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$06</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 6</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$09</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 9</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A=B?</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveToWin_159 </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY3             </span><span style="color: #357B42; font-style: italic">; C = tecla 3</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 3</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY6             </span><span style="color: #357B42; font-style: italic">; C = tecla 6</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 6</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY9             </span><span style="color: #357B42; font-style: italic">; C = tecla 9</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 9</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; Sale</span></span>
<span class="line"><span style="color: #002339">    </span></span>
<span class="line"><span style="color: #7EB233">zxMoveToWin_159:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$01</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 1</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$05</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$09</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 9</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A=B?</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveToWin_357 </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY1             </span><span style="color: #357B42; font-style: italic">; C = tecla 1</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 1</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY5             </span><span style="color: #357B42; font-style: italic">; C = tecla 5</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 5</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY9             </span><span style="color: #357B42; font-style: italic">; C = tecla 9</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 9</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; Sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveToWin_357:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$03</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 3</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$05</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$07</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 7</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A=B?</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     nz</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY3             </span><span style="color: #357B42; font-style: italic">; C = tecla 3</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 3</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY5             </span><span style="color: #357B42; font-style: italic">; C = tecla 5</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 5</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY7             </span><span style="color: #357B42; font-style: italic">; C = tecla 7</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 7</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; Sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">El conjunto de rutinas zxMoveToWin nos sirve tanto para saber si el Spectrum puede ganar y así realizar el movimiento para ello, como para saber si el Spectrum puede perder y mover para evitarlo.</p>



<p class="has-medium-font-size wp-block-paragraph">Si tanto el jugador uno como el Spectrum no tienen posibilidad de ganar, nos intentamos anticipar a la jugada del jugador uno. Primero comprobamos si el jugador hace una jugada diagonal ocupando los dos vértices, y si es así realizamos un bloqueo en cruz.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Movimiento defensivo diagonal.
; -------------------------------------------------------------------
zxMoveDefence_diagonally:
; Comprueba si jugador 1 tiene fichas en diagonal
ld      a, (ix+$01)         ; A = valor celda 1
add     a, (ix+$09)         ; A+= valor celda 9
cp      b                   ; ¿A = B?
jr      z, zxMoveDefence_crossBlock   ; Sí, mov diagonal, salta
ld      a, (ix+$03)         ; A = valor celda 3
add     a, (ix+$07)         ; A+= valor celda 7
cp      b                   ; ¿A = B?
jr      nz, zxMoveDefence_crossBlock1 ; No, salta

zxMoveDefence_crossBlock:
; Bloqueo en cruz
ld      c, KEY4             ; C = tecla 4
call    ToMove              ; Mueve a celda 4
ret     z                   ; Si es correcto, sale
ld      c, KEY6             ; C = tecla 6
call    ToMove              ; Mueve a celda 6
ret     z                   ; Si es correcto, sale
ld      c, KEY2             ; C = tecla 2
call    ToMove              ; Mueve a celda 2
ret     z                   ; Si es correcto, sale
ld      c, KEY8             ; C = tecla 8
call    ToMove              ; Mueve a celda 8
ret     z                   ; Si es correcto, sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Movimiento defensivo diagonal.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">zxMoveDefence_diagonally:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Comprueba si jugador 1 tiene fichas en diagonal</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$01</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 1</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$09</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 9</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A = B?</span></span>
<span class="line"><span style="color: #002339">jr      z, zxMoveDefence_crossBlock   </span><span style="color: #357B42; font-style: italic">; Sí, mov diagonal, salta</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$03</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 3</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$07</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 7</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A = B?</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveDefence_crossBlock1 </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveDefence_crossBlock:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Bloqueo en cruz</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY4             </span><span style="color: #357B42; font-style: italic">; C = tecla 4</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 4</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY6             </span><span style="color: #357B42; font-style: italic">; C = tecla 6</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 6</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY2             </span><span style="color: #357B42; font-style: italic">; C = tecla 2</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 2</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY8             </span><span style="color: #357B42; font-style: italic">; C = tecla 8</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 8</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Luego comprobamos si ha intentado una jugada diagonal con el centro ocupado, y si es así, dependiendo de que vértice tenga ocupado, bloqueamos la vertical.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Movimiento defensivo de diagonal con el centro ocupado.
; -------------------------------------------------------------------
zxMoveDefence_crossBlock1:
ld      a, (ix+$05)         ; A = valor celda 5
and     $0f                 ; A = valor jugador 1
jr      z, zxMoveDefence_cornerBlock16  ; Z = no ocupada, salta
ld      a, (ix+$01)         ; A = valor celda 1
and     $0f                 ; A = valor jugador 1
jr      z, zxMoveDefence_crossBlock3    ; Z = no ocupada, salta
ld      c, KEY7             ; C = tecla 7
call    ToMove              ; Mueve a celda 7
ret     z                   ; Si es correcto, sale

zxMoveDefence_crossBlock3:
ld      a, (ix+$03)         ; A = valor celda 3
and     $0f                 ; A = valor jugador 1
jr      z, zxMoveDefence_crossBlock7    ; Z = no ocupada, salta
ld      c, KEY9             ; C = tecla 9
call    ToMove              ; Mueve a celda 9
ret     z                   ; Si es correcto, sale

zxMoveDefence_crossBlock7:
ld      a, (ix+$07)         ; A = valor celda 7
and     $0f                 ; A = valor jugador 1
jr      z, zxMoveDefence_crossBlock9    ; Z = no ocupada, salta
ld      c, KEY1             ; C = tecla 1
call    ToMove              ; Mueve a celda 1
ret     z                   ; Si es correcto, sale

zxMoveDefence_crossBlock9:
ld      a, (ix+$09)         ; A = valor celda 9
and     $0f                 ; A = valor jugador 1
jr      z, zxMoveDefence_cornerBlock16  ; Z = no ocupada, salta
ld      c, KEY3             ; C = tecla 3
call    ToMove              ; Mueve a celda 3
ret     z                   ; Si es correcto, sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Movimiento defensivo de diagonal con el centro ocupado.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">zxMoveDefence_crossBlock1:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$05</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 5</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$0f</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = valor jugador 1</span></span>
<span class="line"><span style="color: #002339">jr      z, zxMoveDefence_cornerBlock16  </span><span style="color: #357B42; font-style: italic">; Z = no ocupada, salta</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$01</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 1</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$0f</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = valor jugador 1</span></span>
<span class="line"><span style="color: #002339">jr      z, zxMoveDefence_crossBlock3    </span><span style="color: #357B42; font-style: italic">; Z = no ocupada, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY7             </span><span style="color: #357B42; font-style: italic">; C = tecla 7</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 7</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveDefence_crossBlock3:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$03</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 3</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$0f</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = valor jugador 1</span></span>
<span class="line"><span style="color: #002339">jr      z, zxMoveDefence_crossBlock7    </span><span style="color: #357B42; font-style: italic">; Z = no ocupada, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY9             </span><span style="color: #357B42; font-style: italic">; C = tecla 9</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 9</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveDefence_crossBlock7:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$07</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 7</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$0f</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = valor jugador 1</span></span>
<span class="line"><span style="color: #002339">jr      z, zxMoveDefence_crossBlock9    </span><span style="color: #357B42; font-style: italic">; Z = no ocupada, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY1             </span><span style="color: #357B42; font-style: italic">; C = tecla 1</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 1</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveDefence_crossBlock9:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$09</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 9</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$0f</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = valor jugador 1</span></span>
<span class="line"><span style="color: #002339">jr      z, zxMoveDefence_cornerBlock16  </span><span style="color: #357B42; font-style: italic">; Z = no ocupada, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY3             </span><span style="color: #357B42; font-style: italic">; C = tecla 3</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 3</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Si el jugador uno no intentó un movimiento diagonal, vemos si lo intentó en cruz, y procuramos bloquearlo.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Movimiento defensivo en cruz.
; -------------------------------------------------------------------
zxMoveDefence_cornerBlock16:
ld      a, (ix+$01)         ; A = valor celda 1
add     a, (ix+$06)         ; A+= valor celda 6
cp      b                   ; ¿A = B?
jr      nz, zxMoveDefence_cornerBlock34 ; No, no mov cruz, salta
ld      c, KEY3             ; C = tecla 3
call    ToMove              ; Mueve a celda 3
ret     z                   ; Si es correcto, sale

zxMoveDefence_cornerBlock34:
ld      a, (ix+$03)         ; A = valor celda 3
add     a, (ix+$04)         ; A+= valor celda 4
cp      b                   ; ¿A = B?
jr      nz, zxMoveDefence_cornerBlock67 ; No, no mov cruz, salta
ld      c, KEY1             ; C = tecla 1
call    ToMove              ; Mueve a celda 1
ret     z                   ; Si es correcto, sale

zxMoveDefence_cornerBlock67:
ld      a, (ix+$06)         ; A = valor celda 6
add     a, (ix+$07)         ; A+= valor celda 7
cp      b                   ; ¿A = B?
jr      nz, zxMoveDefence_cornerBlock49 ; No, no mov cruz, salta
ld      c, KEY9             ; C = tecla 9
call    ToMove              ; Mueve a celda 9
ret     z                   ; Si es correcto, sale

zxMoveDefence_cornerBlock49:
ld      a, (ix+$04)         ; A = valor celda 4
add     a, (ix+$09)         ; A+= valor celda 9
cp      b                   ; ¿A = B?
jr      nz, zxMoveDefence_cornerBlock1827 ; No, no mov cruz, salta
ld      c, KEY7             ; C = tecla 7
call    ToMove              ; Mueve a celda 7
ret     z                   ; Si es correcto, sale

zxMoveDefence_cornerBlock1827:
ld      a, (ix+$01)         ; A = valor celda 1
add     a, (ix+$08)         ; A+= valor celda 8
cp      b                   ; ¿A = B?
jr      z, zxMoveDefence_cornerBlock1827Cont ; Sí, mov cruz, bloquear
ld      a, (ix+$02)         ; A = valor celda 2
add     a, (ix+$07)         ; A+= Valor celda 7
cp      b                   ; ¿ A= B?
jr      nz, zxMoveDefence_cornerBlock2938 ; No, no mov cruz, salta

zxMoveDefence_cornerBlock1827Cont:
ld      c, KEY4             ; C = tecla 4
call    ToMove              ; Mueve a celda 4
ret     z                   ; Si es correcto, sale

zxMoveDefence_cornerBlock2938:
ld      a, (ix+$02)         ; A = valor celda 2
add     a, (ix+$09)         ; A+= valor celda 9
cp      b                   ; ¿A = B?
jr      z, zxMoveDefence_cornerBlock2938Cont ; Sí, mov cruz, bloquear
ld      a, (ix+$03)         ; A = valor celda 3
add     a, (ix+$08)         ; A+= valor celda 8
cp      b                   ; ¿A = B?
jr      nz, zxMoveAttack_123 ; No, no mov cruz, salta

zxMoveDefence_cornerBlock2938Cont:
ld      c, KEY6             ; C = tecla 6
call    ToMove              ; Mueve a celda 6
ret     z                   ; Si es correcto, sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Movimiento defensivo en cruz.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">zxMoveDefence_cornerBlock16:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$01</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 1</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$06</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 6</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A = B?</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveDefence_cornerBlock34 </span><span style="color: #357B42; font-style: italic">; No, no mov cruz, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY3             </span><span style="color: #357B42; font-style: italic">; C = tecla 3</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 3</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveDefence_cornerBlock34:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$03</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 3</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$04</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 4</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A = B?</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveDefence_cornerBlock67 </span><span style="color: #357B42; font-style: italic">; No, no mov cruz, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY1             </span><span style="color: #357B42; font-style: italic">; C = tecla 1</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 1</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveDefence_cornerBlock67:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$06</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 6</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$07</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 7</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A = B?</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveDefence_cornerBlock49 </span><span style="color: #357B42; font-style: italic">; No, no mov cruz, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY9             </span><span style="color: #357B42; font-style: italic">; C = tecla 9</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 9</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveDefence_cornerBlock49:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$04</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 4</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$09</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 9</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A = B?</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveDefence_cornerBlock1827 </span><span style="color: #357B42; font-style: italic">; No, no mov cruz, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY7             </span><span style="color: #357B42; font-style: italic">; C = tecla 7</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 7</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveDefence_cornerBlock1827:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$01</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 1</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$08</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 8</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A = B?</span></span>
<span class="line"><span style="color: #002339">jr      z, zxMoveDefence_cornerBlock1827Cont </span><span style="color: #357B42; font-style: italic">; Sí, mov cruz, bloquear</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$02</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 2</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$07</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= Valor celda 7</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿ A= B?</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveDefence_cornerBlock2938 </span><span style="color: #357B42; font-style: italic">; No, no mov cruz, salta</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveDefence_cornerBlock1827Cont:</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY4             </span><span style="color: #357B42; font-style: italic">; C = tecla 4</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 4</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveDefence_cornerBlock2938:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$02</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 2</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$09</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 9</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A = B?</span></span>
<span class="line"><span style="color: #002339">jr      z, zxMoveDefence_cornerBlock2938Cont </span><span style="color: #357B42; font-style: italic">; Sí, mov cruz, bloquear</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$03</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 3</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$08</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 8</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿A = B?</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveAttack_123 </span><span style="color: #357B42; font-style: italic">; No, no mov cruz, salta</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveDefence_cornerBlock2938Cont:</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY6             </span><span style="color: #357B42; font-style: italic">; C = tecla 6</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 6</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Si llegamos hasta aquí, hemos comprobado que el Spectrum no tiene movimiento para ganar, que el jugador uno tampoco, que no corre peligro por movimientos de ataque del jugador uno en diagonal o en cruz; es hora de que el Spectrum pase al ataque.</p>



<p class="has-medium-font-size wp-block-paragraph">Esta última parte sólo se ejecutará en los primeros movimientos, según se vaya llenando el tablero estaremos más ocupados en defensa que en ataque.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Movimiento ofensivo horizontal, vertical y diagonal.
; -------------------------------------------------------------------
zxMoveAttack_123:
ld      b, $20              ; B = valor Spectrum con dos casillas
ld      a, (ix+$01)         ; A = valor celda 1
add     a, (ix+$02)         ; A+= valor celda 2
add     a, (ix+$03)         ; A+= valor celda 3
ld      c, a                ; Preserva A en C
and     $03                 ; A = casillas jugador 1
jr      nz, zxMoveAttack_456 ; ¿Alguna? Sí, salta
ld      a, c                ; Recupera A
and     $30                 ; A = casillas Spectrum
cp      b                   ; ¿Dos ocupadas?
jr      z, zxMoveAttack_456 ; Sí, salta
ld      c, KEY1             ; C = tecla 1
call    ToMove              ; Mueve a celda 1
ret     z                   ; Si es correcto, sale
inc     c                   ; C = tecla 2
call    ToMove              ; Mueve a celda 2
ret     z                   ; Si es correcto, sale
inc     c                   ; C = tecla 3
call    ToMove              ; Mueve a celda 3
ret     z                   ; Si es correcto, sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Movimiento ofensivo horizontal, vertical y diagonal.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">zxMoveAttack_123:</span></span>
<span class="line"><span style="color: #002339">ld      b, </span><span style="color: #174781">$20</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; B = valor Spectrum con dos casillas</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$01</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 1</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$02</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 2</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$03</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 3</span></span>
<span class="line"><span style="color: #002339">ld      c, a                </span><span style="color: #357B42; font-style: italic">; Preserva A en C</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$03</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = casillas jugador 1</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveAttack_456 </span><span style="color: #357B42; font-style: italic">; ¿Alguna? Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      a, c                </span><span style="color: #357B42; font-style: italic">; Recupera A</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$30</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = casillas Spectrum</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿Dos ocupadas?</span></span>
<span class="line"><span style="color: #002339">jr      z, zxMoveAttack_456 </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY1             </span><span style="color: #357B42; font-style: italic">; C = tecla 1</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 1</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; C = tecla 2</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 2</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; C = tecla 3</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 3</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Para el ataque buscamos combinaciones en las que el jugador uno no tenga ninguna celda ocupada, y el Spectrum solo una.</p>



<p class="has-medium-font-size wp-block-paragraph">El resto de comprobaciones son muy parecidas a la anterior.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(3 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="zxMoveAttack_456:
ld      a, (ix+$04)         ; A = valor celda 4
add     a, (ix+$05)         ; A+= valor celda 5
add     a, (ix+$06)         ; A+= valor celda 6
ld      c, a                ; Preserva A en C
and     $03                 ; A = casillas jugador 1
jr      nz, zxMoveAttack_789 ; ¿Alguna? Sí, salta
ld      a, c                ; Recupera A
and     $30                 ; A = casillas Spectrum
cp      b                   ; ¿Dos ocupadas?
jr      z, zxMoveAttack_789  ; Sí, salta
ld      c, KEY4             ; C = tecla 4
call    ToMove              ; Mueve a celda 4
ret     z                   ; Si es correcto, sale
inc     c                   ; C = tecla 5
call    ToMove              ; Mueve a celda 5
ret     z                   ; Si es correcto, sale
inc     c                   ; C = tecla 6
call    ToMove              ; Mueve a celda 6
ret     z                   ; Si es correcto, sale

zxMoveAttack_789:
ld      a, (ix+$07)         ; A = valor celda 7
add     a, (ix+$08)         ; A+= valor celda 8
add     a, (ix+$09)         ; A+= valor celda 9
ld      c, a                ; Preserva A en C
and     $03                 ; A = casillas jugador 1
jr      nz, zxMoveAttack_147 ; ¿Alguna? Sí, salta
ld      a, c                ; Recupera A
and     $30                 ; A = casillas Spectrum
cp      b                   ; ¿Dos ocupadas?
jr      z, zxMoveAttack_147  ; Sí, salta
ld      c, KEY7             ; C = tecla 7
call    ToMove              ; Mueve a celda 7
ret     z                   ; Si es correcto, sale
inc     c                   ; C = tecla 8
call    ToMove              ; Mueve a celda 8
ret     z                   ; Si es correcto, sale
inc     c                   ; C = tecla 9
call    ToMove              ; Mueve a celda 9
ret     z                   ; Si es correcto, sale

zxMoveAttack_147:
ld      a, (ix+$01)         ; A = valor celda 1
add     a, (ix+$04)         ; A+= valor celda 4
add     a, (ix+$07)         ; A+= valor celda 7
ld      c, a                ; Preserva A en C
and     $03                 ; A = casillas jugador 1
jr      nz, zxMoveAttack_258 ; ¿Alguna? Sí, salta
ld      a, c                ; Recupera A
and     $30                 ; A = casillas Spectrum
cp      b                   ; ¿Dos ocupadas?
jr      z, zxMoveAttack_258  ; Sí, salta
ld      c, KEY1             ; C = tecla 1
call    ToMove              ; Mueve a celda 1
ret     z                   ; Si es correcto, sale
ld      c, KEY4             ; C = tecla 4
call    ToMove              ; Mueve a celda 4
ret     z                   ; Si es correcto, sale
ld      c, KEY7             ; C = tecla 7
call    ToMove              ; Mueve a celda 7
ret     z                   ; Si es correcto, sale

zxMoveAttack_258:
ld      a, (ix+$02)         ; A = valor celda 2
add     a, (ix+$05)         ; A+= valor celda 5
add     a, (ix+$08)         ; A+= valor celda 8
ld      c, a                ; Preserva A en C
and     $03                 ; A = casillas jugador 1
jr      nz, zxMoveAttack_369 ; ¿Alguna? Sí, salta
ld      a, c                ; Recupera A
and     $30                 ; A = casillas Spectrum
cp      b                   ; ¿Dos ocupadas?
jr      z, zxMoveAttack_369  ; Sí, salta
ld      c, KEY2             ; C = tecla 2
call    ToMove              ; Mueve a celda 2
ret     z                   ; Si es correcto, sale
ld      c, KEY5             ; C = tecla 5
call    ToMove              ; Mueve a celda 5
ret     z                   ; Si es correcto, sale
ld      c, KEY8             ; C = tecla 8
call    ToMove              ; Mueve a celda 8
ret     z                   ; Si es correcto, sale

zxMoveAttack_369:
ld      a, (ix+$03)         ; A = valor celda 3
add     a, (ix+$06)         ; A+= valor celda 6
add     a, (ix+$09)         ; A+= valor celda 9
ld      c, a                ; Preserva A en C
and     $03                 ; A = casillas jugador 1
jr      nz, zxMoveAttack_159 ; ¿Alguna? Sí, salta
ld      a, c                ; Recupera A
and     $30                 ; A = casillas Spectrum
cp      b                   ; ¿Dos ocupadas?
jr      z, zxMoveAttack_159  ; Sí, salta
ld      c, KEY3             ; C = tecla 3
call    ToMove              ; Mueve a celda 3
ret     z                   ; Si es correcto, sale
ld      c, KEY6             ; C = tecla 6
call    ToMove              ; Mueve a celda 6
ret     z                   ; Si es correcto, sale
ld      c, KEY9             ; C = tecla 9
call    ToMove              ; Mueve a celda 9
ret     z                   ; Si es correcto, sale

zxMoveAttack_159:
ld      a, (ix+$01)         ; A = valor celda 1
add     a, (ix+$05)         ; A+= valor celda 5
add     a, (ix+$09)         ; A+= valor celda 9
ld      c, a                ; Preserva A en C
and     $03                 ; A = casillas jugador 1
jr      nz, zxMoveAttack_357 ; ¿Alguna? Sí, salta
ld      a, c                ; Recupera A
and     $30                 ; A = casillas Spectrum
cp      b                   ; ¿Dos ocupadas?
jr      z, zxMoveAttack_357  ; Sí, salta
ld      c, KEY1             ; C = tecla 1
call    ToMove              ; Mueve a celda 1
ret     z                   ; Si es correcto, sale
ld      c, KEY5             ; C = tecla 5
call    ToMove              ; Mueve a celda 5
ret     z                   ; Si es correcto, sale
ld      c, KEY9             ; C = tecla 9
call    ToMove              ; Mueve a celda 9
ret     z                   ; Si es correcto, sale

zxMoveAttack_357:
ld      a, (ix+$03)         ; A = valor celda 3
add     a, (ix+$05)         ; A+= valor celda 5
add     a, (ix+$07)         ; A+= valor celda 7
ld      c, a                ; Preserva A en C
and     $03                 ; A = casillas jugador 1
jr      nz, zxMoveGeneric   ; ¿Alguna? Sí, salta
ld      a, c                ; Recupera A
and     $30                 ; A = casillas Spectrum
cp      b                   ; ¿Dos ocupadas?
jr      z, zxMoveGeneric    ; Sí, salta
ld      c, KEY3             ; C = tecla 3
call    ToMove              ; Mueve a celda 3
ret     z                   ; Si es correcto, sale
ld      c, KEY5             ; C = tecla 5
call    ToMove              ; Mueve a celda 5
ret     z                   ; Si es correcto, sale
ld      c, KEY7             ; C = tecla 7
call    ToMove              ; Mueve a celda 7
ret     z                   ; Si es correcto, sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">zxMoveAttack_456:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$04</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 4</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$05</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$06</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 6</span></span>
<span class="line"><span style="color: #002339">ld      c, a                </span><span style="color: #357B42; font-style: italic">; Preserva A en C</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$03</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = casillas jugador 1</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveAttack_789 </span><span style="color: #357B42; font-style: italic">; ¿Alguna? Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      a, c                </span><span style="color: #357B42; font-style: italic">; Recupera A</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$30</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = casillas Spectrum</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿Dos ocupadas?</span></span>
<span class="line"><span style="color: #002339">jr      z, zxMoveAttack_789  </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY4             </span><span style="color: #357B42; font-style: italic">; C = tecla 4</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 4</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; C = tecla 5</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 5</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; C = tecla 6</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 6</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveAttack_789:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$07</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 7</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$08</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 8</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$09</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 9</span></span>
<span class="line"><span style="color: #002339">ld      c, a                </span><span style="color: #357B42; font-style: italic">; Preserva A en C</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$03</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = casillas jugador 1</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveAttack_147 </span><span style="color: #357B42; font-style: italic">; ¿Alguna? Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      a, c                </span><span style="color: #357B42; font-style: italic">; Recupera A</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$30</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = casillas Spectrum</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿Dos ocupadas?</span></span>
<span class="line"><span style="color: #002339">jr      z, zxMoveAttack_147  </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY7             </span><span style="color: #357B42; font-style: italic">; C = tecla 7</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 7</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; C = tecla 8</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 8</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; C = tecla 9</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 9</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveAttack_147:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$01</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 1</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$04</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 4</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$07</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 7</span></span>
<span class="line"><span style="color: #002339">ld      c, a                </span><span style="color: #357B42; font-style: italic">; Preserva A en C</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$03</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = casillas jugador 1</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveAttack_258 </span><span style="color: #357B42; font-style: italic">; ¿Alguna? Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      a, c                </span><span style="color: #357B42; font-style: italic">; Recupera A</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$30</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = casillas Spectrum</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿Dos ocupadas?</span></span>
<span class="line"><span style="color: #002339">jr      z, zxMoveAttack_258  </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY1             </span><span style="color: #357B42; font-style: italic">; C = tecla 1</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 1</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY4             </span><span style="color: #357B42; font-style: italic">; C = tecla 4</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 4</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY7             </span><span style="color: #357B42; font-style: italic">; C = tecla 7</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 7</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveAttack_258:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$02</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 2</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$05</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$08</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 8</span></span>
<span class="line"><span style="color: #002339">ld      c, a                </span><span style="color: #357B42; font-style: italic">; Preserva A en C</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$03</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = casillas jugador 1</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveAttack_369 </span><span style="color: #357B42; font-style: italic">; ¿Alguna? Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      a, c                </span><span style="color: #357B42; font-style: italic">; Recupera A</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$30</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = casillas Spectrum</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿Dos ocupadas?</span></span>
<span class="line"><span style="color: #002339">jr      z, zxMoveAttack_369  </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY2             </span><span style="color: #357B42; font-style: italic">; C = tecla 2</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 2</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY5             </span><span style="color: #357B42; font-style: italic">; C = tecla 5</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 5</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY8             </span><span style="color: #357B42; font-style: italic">; C = tecla 8</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 8</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveAttack_369:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$03</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 3</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$06</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 6</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$09</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 9</span></span>
<span class="line"><span style="color: #002339">ld      c, a                </span><span style="color: #357B42; font-style: italic">; Preserva A en C</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$03</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = casillas jugador 1</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveAttack_159 </span><span style="color: #357B42; font-style: italic">; ¿Alguna? Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      a, c                </span><span style="color: #357B42; font-style: italic">; Recupera A</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$30</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = casillas Spectrum</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿Dos ocupadas?</span></span>
<span class="line"><span style="color: #002339">jr      z, zxMoveAttack_159  </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY3             </span><span style="color: #357B42; font-style: italic">; C = tecla 3</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 3</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY6             </span><span style="color: #357B42; font-style: italic">; C = tecla 6</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 6</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY9             </span><span style="color: #357B42; font-style: italic">; C = tecla 9</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 9</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveAttack_159:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$01</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 1</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$05</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$09</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 9</span></span>
<span class="line"><span style="color: #002339">ld      c, a                </span><span style="color: #357B42; font-style: italic">; Preserva A en C</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$03</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = casillas jugador 1</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveAttack_357 </span><span style="color: #357B42; font-style: italic">; ¿Alguna? Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      a, c                </span><span style="color: #357B42; font-style: italic">; Recupera A</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$30</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = casillas Spectrum</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿Dos ocupadas?</span></span>
<span class="line"><span style="color: #002339">jr      z, zxMoveAttack_357  </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY1             </span><span style="color: #357B42; font-style: italic">; C = tecla 1</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 1</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY5             </span><span style="color: #357B42; font-style: italic">; C = tecla 5</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 5</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY9             </span><span style="color: #357B42; font-style: italic">; C = tecla 9</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 9</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveAttack_357:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">$03</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A = valor celda 3</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$05</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">$07</span><span style="color: #002339">)         </span><span style="color: #357B42; font-style: italic">; A+= valor celda 7</span></span>
<span class="line"><span style="color: #002339">ld      c, a                </span><span style="color: #357B42; font-style: italic">; Preserva A en C</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$03</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = casillas jugador 1</span></span>
<span class="line"><span style="color: #002339">jr      nz, zxMoveGeneric   </span><span style="color: #357B42; font-style: italic">; ¿Alguna? Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      a, c                </span><span style="color: #357B42; font-style: italic">; Recupera A</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$30</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = casillas Spectrum</span></span>
<span class="line"><span style="color: #002339">cp      b                   </span><span style="color: #357B42; font-style: italic">; ¿Dos ocupadas?</span></span>
<span class="line"><span style="color: #002339">jr      z, zxMoveGeneric    </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY3             </span><span style="color: #357B42; font-style: italic">; C = tecla 3</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 3</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY5             </span><span style="color: #357B42; font-style: italic">; C = tecla 5</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 5</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY7             </span><span style="color: #357B42; font-style: italic">; C = tecla 7</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda 7</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                   </span><span style="color: #357B42; font-style: italic">; Si es correcto, sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Si llegamos aquí, el Spectrum no ha encontrado dónde mover y mueve a la primera celda que esté libre.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Movimiento genérico. 
; Si con todo lo anterior, no ha hecho movimiento
; mueve a la primera celda libre.
; -------------------------------------------------------------------
zxMoveGeneric:
ld      c, '1'              ; C = ascii 1 (celda 1)
ld      b, $09              ; B = celdas totales
ld      a, $00              ; A = celda vacía
ld      hl, Grid            ; HL = dirección 1ª celda

zxMoveGeneric_loop:
cp      (hl)                ; ¿Celda libre?
jr      z, zxMoveGeneric_end; Sí, salta
inc     c                   ; C = ascii siguiente celda
inc     hl                  ; HL = siguiente celda
djnz    zxMoveGeneric_loop  ; Bucle hasta que B = 0

zxMoveGeneric_end:
call    ToMove              ; Mueve a celda libre
ret                         ; Sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Movimiento genérico. </span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Si con todo lo anterior, no ha hecho movimiento</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; mueve a la primera celda libre.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">zxMoveGeneric:</span></span>
<span class="line"><span style="color: #002339">ld      c, &#39;</span><span style="color: #174781">1</span><span style="color: #002339">&#39;              </span><span style="color: #357B42; font-style: italic">; C = ascii 1 (celda 1)</span></span>
<span class="line"><span style="color: #002339">ld      b, </span><span style="color: #174781">$09</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; B = celdas totales</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$00</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = celda vacía</span></span>
<span class="line"><span style="color: #002339">ld      hl, Grid            </span><span style="color: #357B42; font-style: italic">; HL = dirección 1ª celda</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveGeneric_loop:</span></span>
<span class="line"><span style="color: #002339">cp      (hl)                </span><span style="color: #357B42; font-style: italic">; ¿Celda libre?</span></span>
<span class="line"><span style="color: #002339">jr      z, zxMoveGeneric_end</span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     c                   </span><span style="color: #357B42; font-style: italic">; C = ascii siguiente celda</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = siguiente celda</span></span>
<span class="line"><span style="color: #002339">djnz    zxMoveGeneric_loop  </span><span style="color: #357B42; font-style: italic">; Bucle hasta que B = 0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">zxMoveGeneric_end:</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove              </span><span style="color: #357B42; font-style: italic">; Mueve a celda libre</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; Sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Ya hemos implementado la forma en la que se comporta en las partidas a un jugador el Spectrum. No es perfecta, tiene varias lagunas, y en ocasiones el Spectrum realiza algún movimiento errático. Eso está bien, si lo hiciéramos perfecto no podríamos ganar nunca al Spectrum, y eso no gusta a nadie.</p>



<p class="has-medium-font-size wp-block-paragraph">Ahora tenemos que integrar lo que hemos implementado dentro del bucle principal en Main.asm.</p>



<p class="has-medium-font-size wp-block-paragraph">Localizamos la etiqueta loop_lostMov, y cinco líneas por debajo sutituimos JR Z, loop_keyCont por:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="jr      z, loop_players         ; No activo, salta" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">jr      z, loop_players         </span><span style="color: #357B42; font-style: italic">; No activo, salta</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Localizamos la etiqueta loop_keyCont y la línea que tenemos por encima, JR loop_cont, la sustituimos por:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="jp      loop_cont               ; Salta" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7B30D0">jp</span><span style="color: #002339">      loop_cont               </span><span style="color: #357B42; font-style: italic">; Salta</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Entre esta línea y loop_keyCont vamos añadir el movimiento del Spectrum en el caso de partidas a un jugador, esto hace que JR de un error de fuera de rango, por eso lo hemos sustituido por JP.</p>



<p class="has-medium-font-size wp-block-paragraph">Por último, entre esta línea y loop_keyCont añadimos las líneas siguientes:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="loop_players:
ld      a, (PlayerMoves)        ; A = jugador que mueve
or      a                       ; ¿Jugador 1?
jr      z, loop_keyCont         ; Sí, salta
ld      a, (MaxPlayers)         ; A = jugadores
cp      $02                     ; ¿2 jugadores?
jr      z, loop_keyCont         ; Sí, salta
call    ZxMove                  ; Mueve Spectrum
jr      nz, loop_players        ; NZ = incorrecto, bucle
push    bc                      ; Preserva BC
ld      bc, SoundSpectrum       ; BC = dirección sonido
call    PlayMusic               ; Emite sonido
pop     bc                      ; Recupera BC
jr      loop_print              ; Pinta movimiento" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">loop_players:</span></span>
<span class="line"><span style="color: #002339">ld      a, (PlayerMoves)        </span><span style="color: #357B42; font-style: italic">; A = jugador que mueve</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">      a                       </span><span style="color: #357B42; font-style: italic">; ¿Jugador 1?</span></span>
<span class="line"><span style="color: #002339">jr      z, loop_keyCont         </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      a, (MaxPlayers)         </span><span style="color: #357B42; font-style: italic">; A = jugadores</span></span>
<span class="line"><span style="color: #002339">cp      </span><span style="color: #174781">$02</span><span style="color: #002339">                     </span><span style="color: #357B42; font-style: italic">; ¿2 jugadores?</span></span>
<span class="line"><span style="color: #002339">jr      z, loop_keyCont         </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ZxMove                  </span><span style="color: #357B42; font-style: italic">; Mueve Spectrum</span></span>
<span class="line"><span style="color: #002339">jr      nz, loop_players        </span><span style="color: #357B42; font-style: italic">; NZ = incorrecto, bucle</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">    bc                      </span><span style="color: #357B42; font-style: italic">; Preserva BC</span></span>
<span class="line"><span style="color: #002339">ld      bc, SoundSpectrum       </span><span style="color: #357B42; font-style: italic">; BC = dirección sonido</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PlayMusic               </span><span style="color: #357B42; font-style: italic">; Emite sonido</span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">     bc                      </span><span style="color: #357B42; font-style: italic">; Recupera BC</span></span>
<span class="line"><span style="color: #002339">jr      loop_print              </span><span style="color: #357B42; font-style: italic">; Pinta movimiento</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Obtenemos que jugador mueve, si es el dos obtenemos cuántos jugadores son y si es un solo jugador, mueve el Spectrum.</p>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y vemos el resultado. Si todo ha ido bien ya podemos jugar contra el Spectrum. Si os parece que es demasiado fácil, podéis pulir más los movimientos del Spectrum.</p>



<h2 id="ensamblador-zx-spectrum-conclusion" class="wp-block-heading has-large-font-size">Ensamblador ZX Spectrum, conclusión</h2>



<p class="has-medium-font-size wp-block-paragraph">Hemos implementado la posibilidad de jugar contra el Spectrum, por lo que ya no es necesario contar con otro contrincante para poder jugar, incluso podéis entrenaros para ganar a otros contrincantes.</p>



<p class="has-medium-font-size wp-block-paragraph">En el próximo capítulo acabamos con unos ajustes finales.</p>



<p class="has-medium-font-size wp-block-paragraph">Todo el código que hemos generado lo podéis descargar desde&nbsp;<a href="https://espamatica.com/wp-content/uploads/2023/04/OXO_0x05.zip">aquí</a>.</p>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<h2 class="wp-block-heading has-large-font-size">Enlaces de interés</h2>



<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://notepad-plus-plus.org/" target="_blank" rel="noreferrer noopener nofollow">Notepad++</a></li>



<li class="has-medium-font-size"><a href="https://code.visualstudio.com/" target="_blank" rel="noreferrer noopener nofollow">Visual Studio Code</a></li>



<li class="has-medium-font-size"><a href="https://www.sublimetext.com/" target="_blank" rel="noreferrer noopener nofollow">Sublime Text</a></li>



<li class="has-medium-font-size"><a href="https://github.com/chernandezba/zesarux" target="_blank" rel="noreferrer noopener nofollow">ZEsarUX</a></li>



<li class="has-medium-font-size"><a href="https://pasmo.speccy.org/" target="_blank" rel="noreferrer noopener nofollow">PASMO</a></li>



<li class="has-medium-font-size"><a href="https://git-scm.com/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Instalaci%C3%B3n-de-Git" target="_blank" rel="noreferrer noopener nofollow">Git</a></li>



<li class="has-medium-font-size"><a href="https://wiki.speccy.org/cursos/ensamblador/indice" target="_blank" rel="noreferrer noopener nofollow">Curso de ensamblador Z80 de Compiler Software</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/wp-content/uploads/2021/10/00-Referencia-Z80.zip">Referencia Z80</a></li>



<li class="has-medium-font-size"><a href="https://t.me/EnsambladorZXSpectrum" target="_blank" rel="noreferrer noopener nofollow">Ensamblador Z80 en Telegram</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/wp-content/uploads/2023/05/Espamatica.zip">Archivo .dsk con los juegos de los tutoriales</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x0f-ensamblador-zx-spectrum-marciano-depuracion/">Personalización y depuración con ZEsarUX</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/wp-content/uploads/2023/06/Ensamblador-para-ZX-Spectrum-OXO.zip">Tutorial completo en formato PDF y EPUB</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.itch.io/tres-en-raya" rel="nofollow noopener" target="_blank">El proyecto en itch.io</a></li>
</ul>
</div>



<p class="has-background has-medium-font-size wp-block-paragraph" style="background-color:#cdd6dd">Ensamblador para ZX Spectrum OXO por&nbsp;<a href="https://espamatica.com/">Juan Antonio Rubio García</a>.<br>Esta obra está bajo licencia de&nbsp;<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank" rel="noreferrer noopener nofollow">Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License</a>.</p>



<div align="center">
<a href="http://www.safecreative.org/work/2306054511935" rel="nofollow noopener" target="_blank"><img decoding="async" src="https://resources.safecreative.org:443/work-creativity-declaration/2306054511935/label/declaration-1-human-real-300" style="border:0;" title="null"/></a>
</div>
<br><br>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<p class="has-medium-font-size wp-block-paragraph">También puedes visitar el resto de tutoriales:</p>



<ul class="wp-block-list">
<li class="has-medium-font-size">.Net
<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://espamatica.com/mediatime/">MediaTime</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/nullabledatetimepicker/">NullableDateTimePicker</a></li>
</ul>
</li>



<li class="has-medium-font-size">Z80
<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://espamatica.com/entorno-de-desarrollo-para-ensamblador-z80/">Entorno de desarrollo</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/numeros-bcd-spectrum/">Números BCD</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/posiciones-de-pantalla-zx-spectrum/">Pantalla ZX Spectrum</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/ensamblador-zx-spectrum-pong-introduccion/">Pong</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x00-ensamblador-zx-spectrum-marciano-introduccion/">Batalla Espacial</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x01-ensamblador-zx-spectrum-oxo-tablero-de-juego/">Tres en raya</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/uso-de-beepfx/">Uso de BeepFX</a></li>
</ul>
</li>
</ul>
</div>



<p class="has-medium-font-size wp-block-paragraph">Y recuerda, si lo usas no te limites a copiarlo, intenta entenderlo y adaptarlo a tus necesidades.</p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://espamatica.com/0x05-ensamblador-zx-spectrum-oxo-contra-el-spectrum/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3781</post-id>	</item>
		<item>
		<title>0x04 Ensamblador ZX Spectrum OXO &#8211; opciones y fin de partida</title>
		<link>https://espamatica.com/0x04-ensamblador-zx-spectrum-oxo-opciones/</link>
					<comments>https://espamatica.com/0x04-ensamblador-zx-spectrum-oxo-opciones/#respond</comments>
		
		<dc:creator><![CDATA[Juan Antonio Rubio García]]></dc:creator>
		<pubDate>Fri, 19 May 2023 07:00:00 +0000</pubDate>
				<category><![CDATA[ZX Spectrum]]></category>
		<category><![CDATA[Ensamblador Z80]]></category>
		<category><![CDATA[Retro]]></category>
		<category><![CDATA[Ensamblador]]></category>
		<category><![CDATA[Tres en raya]]></category>
		<category><![CDATA[Z80]]></category>
		<guid isPermaLink="false">https://espamatica.com/?p=3730</guid>

					<description><![CDATA[En este capítulo de Ensamblador ZX Spectrum OXO vamos a implementar las distintas opciones de la partida y el fin]]></description>
										<content:encoded><![CDATA[
<p class="has-medium-font-size wp-block-paragraph">En este capítulo de Ensamblador ZX Spectrum OXO vamos a implementar las distintas opciones de la partida y el fin de la misma; según lo dejamos en el capítulo anterior la partida continúa indefinidamente. Las opciones las seleccionaremos a través de un menú de inicio.</p>


<div role="navigation" aria-label="Tabla de contenidos" class="simpletoc wp-block-simpletoc-toc"><h2 class="simpletoc-title">Tabla de contenidos</h2>
<ul class="simpletoc-list">
<li><a href="#menu">Menú</a>
</li>
<li><a href="#inicio-de-partida">Inicio de partida</a>
</li>
<li><a href="#tiempo-de-turno">Tiempo de turno</a>
</li>
<li><a href="#fin-de-partida">Fin de partida</a>
</li>
<li><a href="#ensamblador-zx-spectrum-conclusion">Ensamblador ZX Spectrum, conclusión</a>
</li>
<li><a href="#enlaces-de-interes">Enlaces de interés</a>
</li></ul></div>


<p class="has-medium-font-size wp-block-paragraph">En Var.asm vamos a añadir las siguientes constantes para los colores, y así evitar poner números y que cambiar los colores en todo el juego sea más sencillo.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="INK0:	        equ $00
INK1:	        equ $01
INK2:	        equ $02
INK3:	        equ $03
INK4:	        equ $04
INK5:	        equ $05
INK6:	        equ $06
INK7:	        equ $07" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">INK0:</span><span style="color: #002339">	        </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$00</span></span>
<span class="line"><span style="color: #7EB233">INK1:</span><span style="color: #002339">	        </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$01</span></span>
<span class="line"><span style="color: #7EB233">INK2:</span><span style="color: #002339">	        </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$02</span></span>
<span class="line"><span style="color: #7EB233">INK3:</span><span style="color: #002339">	        </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$03</span></span>
<span class="line"><span style="color: #7EB233">INK4:</span><span style="color: #002339">	        </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$04</span></span>
<span class="line"><span style="color: #7EB233">INK5:</span><span style="color: #002339">	        </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$05</span></span>
<span class="line"><span style="color: #7EB233">INK6:</span><span style="color: #002339">	        </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$06</span></span>
<span class="line"><span style="color: #7EB233">INK7:</span><span style="color: #002339">	        </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$07</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Como ejercicio, revisad las declaraciones de títulos y textos y donde veías $10, cambiad el número que le sigue por la etiqueta INK que le corresponde.</p>



<p class="has-medium-font-size wp-block-paragraph">De igual manera, buscad en el resto de archivos las llamadas a INK, y en lugar de cargar en A el número de la tinta, cargad la etiqueta INK correspondiente.</p>



<h2 id="menu" class="wp-block-heading has-large-font-size">Menú</h2>



<p class="has-medium-font-size wp-block-paragraph">Parte de los textos del menú de inicio ya los tenemos definidos en Var.asm: la etiqueta TitleEspamatica y desde TitleOptionStart hasta TitleOptionTime.</p>



<p class="has-medium-font-size wp-block-paragraph">Vamos a borrar todas estas líneas pues la vamos a implementar de nuevo, añadiendo colores y posiciones, quedando así:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="Title3EnRaya:       db $10, INK2, $13, $01, $16, $02, $0a
                    defm &quot;Tres en raya&quot;
TitleOptionStart:   db $10, INK1, $13, $01, $16, $08, $08, &quot;0. &quot;
                    db $10, INK5
                    defm &quot;Empezar&quot;
TitleOptionPlayer:  db $10, INK7, $13, $01, $16, $0a, $08, &quot;1. &quot;
                    db $10, INK6
                    defm &quot;Jugadores&quot;
TitleOptionPoint:   db $10, INK7, $16, $0c, $08, &quot;2. &quot;, $10, INK6
                    defm &quot;Puntos&quot;
TitleOptionTime:    db $10, INK7, $16, $0e, $08, &quot;3. &quot;, $10, INK6
                    defm &quot;Tiempo&quot;
TitleEspamatica:    db $16, $14, $08
                    db $10, INK2, &quot;E&quot;, $10, INK6, &quot;s&quot;
                    db $10, INK4, &quot;p&quot;, $10, INK5, &quot;a&quot;
                    db $10, INK2, &quot;m&quot;, $10, INK6, &quot;a&quot;
                    db $10, INK4, &quot;t&quot;, $10, INK5, &quot;i&quot;
                    db $10, INK2, &quot;c&quot;, $10, INK6, &quot;a&quot;
                    db $10, INK7, &quot; 2019&quot;, $ff" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">Title3EnRaya:</span><span style="color: #002339">       </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK2, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$01</span><span style="color: #002339">, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$02</span><span style="color: #002339">, </span><span style="color: #174781">$0a</span></span>
<span class="line"><span style="color: #002339">                    defm &quot;Tres en raya&quot;</span></span>
<span class="line"><span style="color: #7EB233">TitleOptionStart:</span><span style="color: #002339">   </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK1, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$01</span><span style="color: #002339">, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$08</span><span style="color: #002339">, </span><span style="color: #174781">$08</span><span style="color: #002339">, &quot;</span><span style="color: #174781">0.</span><span style="color: #002339"> &quot;</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK5</span></span>
<span class="line"><span style="color: #002339">                    defm &quot;Empezar&quot;</span></span>
<span class="line"><span style="color: #7EB233">TitleOptionPlayer:</span><span style="color: #002339">  </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK7, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$01</span><span style="color: #002339">, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$0a</span><span style="color: #002339">, </span><span style="color: #174781">$08</span><span style="color: #002339">, &quot;</span><span style="color: #174781">1.</span><span style="color: #002339"> &quot;</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK6</span></span>
<span class="line"><span style="color: #002339">                    defm &quot;Jugadores&quot;</span></span>
<span class="line"><span style="color: #7EB233">TitleOptionPoint:</span><span style="color: #002339">   </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK7, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$0c</span><span style="color: #002339">, </span><span style="color: #174781">$08</span><span style="color: #002339">, &quot;</span><span style="color: #174781">2.</span><span style="color: #002339"> &quot;, </span><span style="color: #174781">$10</span><span style="color: #002339">, INK6</span></span>
<span class="line"><span style="color: #002339">                    defm &quot;Puntos&quot;</span></span>
<span class="line"><span style="color: #7EB233">TitleOptionTime:</span><span style="color: #002339">    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK7, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$0e</span><span style="color: #002339">, </span><span style="color: #174781">$08</span><span style="color: #002339">, &quot;</span><span style="color: #174781">3.</span><span style="color: #002339"> &quot;, </span><span style="color: #174781">$10</span><span style="color: #002339">, INK6</span></span>
<span class="line"><span style="color: #002339">                    defm &quot;Tiempo&quot;</span></span>
<span class="line"><span style="color: #7EB233">TitleEspamatica:</span><span style="color: #002339">    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$14</span><span style="color: #002339">, </span><span style="color: #174781">$08</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK2, &quot;E&quot;, </span><span style="color: #174781">$10</span><span style="color: #002339">, INK6, &quot;s&quot;</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK4, &quot;p&quot;, </span><span style="color: #174781">$10</span><span style="color: #002339">, INK5, &quot;a&quot;</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK2, &quot;m&quot;, </span><span style="color: #174781">$10</span><span style="color: #002339">, INK6, &quot;a&quot;</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK4, &quot;t&quot;, </span><span style="color: #174781">$10</span><span style="color: #002339">, INK5, &quot;i&quot;</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK2, &quot;c&quot;, </span><span style="color: #174781">$10</span><span style="color: #002339">, INK6, &quot;a&quot;</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, INK7, &quot; </span><span style="color: #174781">2019</span><span style="color: #002339">&quot;, $ff</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Ya tenemos la definición del menú de inicio casi lista para poder pintarlo, sólo nos falta una rutina para pintar los valores de la opciones. La implementamos en Screen.asm.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Pinta los valores de las opciones.
;
; Altera el valor de los registros AF, BC y HL.
; -------------------------------------------------------------------
PrintOptions:
ld      a, INK4         ; A = tinta verde
call    INK             ; Cambia tinta
ld      b, INI_TOP-$0a  ; B = coord Y
ld      c, INI_LEFT-$15 ; C = coord X
call    AT              ; Posiciona cursor
ld      hl, MaxPlayers  ; HL = valor jugadores
call    PrintBCD        ; Lo pinta
ld      b, INI_TOP-$0c  ; B = coord Y
call    AT              ; Posiciona cursor
ld      hl, MaxPoints   ; HL = valor puntos
call    PrintBCD        ; Lo pinta
ld      b, INI_TOP-$0e  ; B = coord Y
call    AT              ; Posiciona cursor
ld      hl, MaxSeconds  ; HL = valor tiempo
jp      PrintBCD        ; Lo pinta y sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Pinta los valores de las opciones.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF, BC y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">PrintOptions:</span></span>
<span class="line"><span style="color: #002339">ld      a, INK4         </span><span style="color: #357B42; font-style: italic">; A = tinta verde</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    INK             </span><span style="color: #357B42; font-style: italic">; Cambia tinta</span></span>
<span class="line"><span style="color: #002339">ld      b, INI_TOP-</span><span style="color: #174781">$0a</span><span style="color: #002339">  </span><span style="color: #357B42; font-style: italic">; B = coord Y</span></span>
<span class="line"><span style="color: #002339">ld      c, INI_LEFT-</span><span style="color: #174781">$15</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; C = coord X</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT              </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #002339">ld      hl, MaxPlayers  </span><span style="color: #357B42; font-style: italic">; HL = valor jugadores</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintBCD        </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #002339">ld      b, INI_TOP-</span><span style="color: #174781">$0c</span><span style="color: #002339">  </span><span style="color: #357B42; font-style: italic">; B = coord Y</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT              </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #002339">ld      hl, MaxPoints   </span><span style="color: #357B42; font-style: italic">; HL = valor puntos</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintBCD        </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #002339">ld      b, INI_TOP-</span><span style="color: #174781">$0e</span><span style="color: #002339">  </span><span style="color: #357B42; font-style: italic">; B = coord Y</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT              </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #002339">ld      hl, MaxSeconds  </span><span style="color: #357B42; font-style: italic">; HL = valor tiempo</span></span>
<span class="line"><span style="color: #7B30D0">jp</span><span style="color: #002339">      PrintBCD        </span><span style="color: #357B42; font-style: italic">; Lo pinta y sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">PrintOptions pinta los valores de las opciones en verde. Posiciona el cursor y va pintando cada uno de los valores.</p>



<p class="has-medium-font-size wp-block-paragraph">Vamos a ver que tal queda el menú de inicio. Localizamos Main en Main.asm, y debajo de CALL OPENCHAN añadimos estas líneas:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="Menu:
di                              ; Desactiva interrupciones
im      $01                     ; Interrupciones = modo 1
ei                              ; Activa interrupciones" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">Menu:</span></span>
<span class="line"><span style="color: #174781">di</span><span style="color: #002339">                              </span><span style="color: #357B42; font-style: italic">; Desactiva interrupciones</span></span>
<span class="line"><span style="color: #002339">im      </span><span style="color: #174781">$01</span><span style="color: #002339">                     </span><span style="color: #357B42; font-style: italic">; Interrupciones = modo 1</span></span>
<span class="line"><span style="color: #002339">ei                              </span><span style="color: #357B42; font-style: italic">; Activa interrupciones</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Hemos añadido una etiqueta para la parte del menú, desactivado la interrupciones para cambiar al modo uno y volverlas a activar. Luego usaremos las interrupciones en modo dos, y es por eso que estás líneas son necesarias aquí. </p>



<p class="has-medium-font-size wp-block-paragraph">Más abajo localizamos CALL CLS y a continuación, añadimos las líneas siguientes:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      hl, Title3EnRaya        ; HL = dirección tres en raya	
call    PrintString             ; Pinta el menú
menu_op:    
call    PrintOptions            ; Pinta las opciones
jr      menu_op                 ; Bucle menú" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      hl, Title3EnRaya        </span><span style="color: #357B42; font-style: italic">; HL = dirección tres en raya	</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintString             </span><span style="color: #357B42; font-style: italic">; Pinta el menú</span></span>
<span class="line"><span style="color: #7EB233">menu_op:</span><span style="color: #002339">    </span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintOptions            </span><span style="color: #357B42; font-style: italic">; Pinta las opciones</span></span>
<span class="line"><span style="color: #002339">jr      menu_op                 </span><span style="color: #357B42; font-style: italic">; Bucle menú</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Pintamos la pantalla de inicio y los valores de las opciones. Nos quedamos en un bucle infinito, ya que ahí vamos a implementar la lógica del menú.</p>



<p class="has-medium-font-size wp-block-paragraph">Con la definición del menú y una pocas líneas lo pintamos, pero falta hacerlo funcionar.</p>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y vemos como queda.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af49317ba2ea&quot;}" data-wp-interactive="core/image" data-wp-key="6af49317ba2ea" class="wp-block-image size-full wp-lightbox-container"><img data-recalc-dims="1" loading="lazy" decoding="async" width="702" height="610" data-attachment-id="3856" data-permalink="https://espamatica.com/paso04_01/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso04_01.png?fit=702%2C610&amp;ssl=1" data-orig-size="702,610" data-comments-opened="1" data-image-title="Menú" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador ZX Spectrum &amp;#8211; menú&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso04_01.png?fit=702%2C610&amp;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso04_01.png?resize=702%2C610&#038;ssl=1" alt="Ensamblador ZX Spectrum - menú" class="wp-image-3856" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso04_01.png?w=702&amp;ssl=1 702w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso04_01.png?resize=300%2C261&amp;ssl=1 300w" sizes="auto, (max-width: 702px) 100vw, 702px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Ensamblador ZX Spectrum &#8211; menú</figcaption></figure>



<p class="has-medium-font-size wp-block-paragraph">Antes de implementar la lógica del menú, en Game.asm vamos a implementar una rutina que utilice la ROM para leer el teclado y que nos devuelva el código ASCII de la última tecla pulsada. Esta rutina la vamos a usar para las opciones del menú y para la solicitud del nombre de los jugadores.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Espera a que se pulse una tecla y devuelve su código Ascii.
;
; Salida: A -&gt; Código Ascii de la tecla.
;
; Altera el valor de los registros AF y HL.
; -------------------------------------------------------------------
WaitKeyAlpha:
ld      hl, FLAGS_KEY           ; HL = dirección flag teclado
set     $03, (hl)               ; Entrada modo L

; Bucle hasta que se obtenga una tecla.
WaitKeyAlpha_loop:
bit     $05, (hl)               ; ¿Tecla pulsada?
jr      z, WaitKeyAlpha_loop    ; No pulsada, bucle
res     $05, (hl)               ; Bit a 0 para futuras inspecciones

; Obtiene el Ascii de la tecla pulsada
; Ascii válidos 12 ($0C), 13 ($0D) y de 32 ($20) a 127 ($7F)
; Si la tecla pulsada es Space, carga ' ' en A
WaitKeyAlpha_loadKey:
ld      hl, LAST_KEY            ; HL = dirección última tecla pulsada
ld      a, (hl)                 ; A = última tecla pulsada
cp      $80                     ; ¿Ascii &gt; 127?
jr      nc, WaitKeyAlpha        ; Sí, tecla no válida, bucle
cp      KEYDEL                  ; ¿Pulsado Delete?
ret     z                       ; Sí, sale
cp      KEYENT                  ; ¿Pulsado Enter?
ret     z                       ; Sí, sale
cp      KEYSPC                  ; ¿Pulsado Espacio?
jr      c, WaitKeyAlpha         ; Ascii &lt; espacio, inválida, bucle
ret                             ; Sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Espera a que se pulse una tecla y devuelve su código Ascii.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Salida: A -&gt; Código Ascii de la tecla.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">WaitKeyAlpha:</span></span>
<span class="line"><span style="color: #002339">ld      hl, FLAGS_KEY           </span><span style="color: #357B42; font-style: italic">; HL = dirección flag teclado</span></span>
<span class="line"><span style="color: #002339">set     </span><span style="color: #174781">$03</span><span style="color: #002339">, (hl)               </span><span style="color: #357B42; font-style: italic">; Entrada modo L</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Bucle hasta que se obtenga una tecla.</span></span>
<span class="line"><span style="color: #7EB233">WaitKeyAlpha_loop:</span></span>
<span class="line"><span style="color: #002339">bit     </span><span style="color: #174781">$05</span><span style="color: #002339">, (hl)               </span><span style="color: #357B42; font-style: italic">; ¿Tecla pulsada?</span></span>
<span class="line"><span style="color: #002339">jr      z, WaitKeyAlpha_loop    </span><span style="color: #357B42; font-style: italic">; No pulsada, bucle</span></span>
<span class="line"><span style="color: #002339">res     </span><span style="color: #174781">$05</span><span style="color: #002339">, (hl)               </span><span style="color: #357B42; font-style: italic">; Bit a 0 para futuras inspecciones</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Obtiene el Ascii de la tecla pulsada</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Ascii válidos 12 ($0C), 13 ($0D) y de 32 ($20) a 127 ($7F)</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Si la tecla pulsada es Space, carga &#39; &#39; en A</span></span>
<span class="line"><span style="color: #7EB233">WaitKeyAlpha_loadKey:</span></span>
<span class="line"><span style="color: #002339">ld      hl, LAST_KEY            </span><span style="color: #357B42; font-style: italic">; HL = dirección última tecla pulsada</span></span>
<span class="line"><span style="color: #002339">ld      a, (hl)                 </span><span style="color: #357B42; font-style: italic">; A = última tecla pulsada</span></span>
<span class="line"><span style="color: #002339">cp      </span><span style="color: #174781">$80</span><span style="color: #002339">                     </span><span style="color: #357B42; font-style: italic">; ¿Ascii &gt; 127?</span></span>
<span class="line"><span style="color: #002339">jr      nc, WaitKeyAlpha        </span><span style="color: #357B42; font-style: italic">; Sí, tecla no válida, bucle</span></span>
<span class="line"><span style="color: #002339">cp      KEYDEL                  </span><span style="color: #357B42; font-style: italic">; ¿Pulsado Delete?</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                       </span><span style="color: #357B42; font-style: italic">; Sí, sale</span></span>
<span class="line"><span style="color: #002339">cp      KEYENT                  </span><span style="color: #357B42; font-style: italic">; ¿Pulsado Enter?</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                       </span><span style="color: #357B42; font-style: italic">; Sí, sale</span></span>
<span class="line"><span style="color: #002339">cp      KEYSPC                  </span><span style="color: #357B42; font-style: italic">; ¿Pulsado Espacio?</span></span>
<span class="line"><span style="color: #002339">jr      c, WaitKeyAlpha         </span><span style="color: #357B42; font-style: italic">; Ascii &lt; espacio, inválida, bucle</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                             </span><span style="color: #357B42; font-style: italic">; Sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">WaitKeyAlpha espera hasta que se haya pulsado una tecla que sea válida para nosotros, esto es: delete, enter o un código ASCII entre treinta y dos y ciento veintisiete. Una vez que se ha pulsado una tecla válida, devuelve el código ASCII de la misma en A.</p>



<p class="has-medium-font-size wp-block-paragraph">Implementamos en Main.asm la rutina del menú, justo debajo de CALL PrintOptions, siendo el aspecto final este:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="menu_op:
call    PrintOptions        ; Pinta las opciones
call    WaitKeyAlpha        ; Espera pulsación tecla
cp      KEY0                ; ¿Pulsado 0?
jr      z, Init             ; Sí, inicia partida
menu_Players:
cp      KEY1                ; ¿Pulsado 1?
jr      nz, menu_Points     ; No, salta
ld      a, (MaxPlayers)     ; A = jugadores
xor     $03                 ; Alterna entre 1 y 2
ld      (MaxPlayers), a     ; Actualiza en memoria
jr      menu_op             ; Bucle
menu_Points:
cp      KEY2                ; ¿Pulsado 2?
jr      nz, menu_Time       ; No, salta
ld      a, (MaxPoints)      ; A = puntos
inc     a                   ; A += 1
cp      $06                 ; ¿A = 6?
jr      nz, menu_PointsDo   ; No, salta
ld      a, $01              ; A = 1
menu_PointsDo:  
ld      (MaxPoints), a      ; Actualiza en memoria
add     a, '0'              ; A = ascii de valor
ld      (info_points), a    ; Actualiza en memoria
cp      '1'                 ; ¿Puntos 1?
jr      z, menu_Points1     ; Sí, salta
ld      a, 's'              ; Plural
jr      menu_PointsEnd      ; Salta
menu_Points1:
ld      a, ' '              ; Singular
menu_PointsEnd:
ld      (info_gt1), a       ; Actualiza en memoria
jr      menu_op             ; Bucle
menu_Time:
cp      KEY3                ; ¿Pulsado 3?
jr      nz, menu_op         ; No, bucle
ld      a, (MaxSeconds)     ; A = segundos
add     a, $05              ; A += 5
daa                         ; Ajuste decimal
cp      $35                 ; ¿ A = 35 BCD?
jr      nz, menu_TimeDo     ; No, salta
ld      a, $05              ; A = 5
menu_TimeDo:
ld      (MaxSeconds), a     ; Actualiza en memoria
jr      menu_op             ; Bucle" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">menu_op:</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintOptions        </span><span style="color: #357B42; font-style: italic">; Pinta las opciones</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    WaitKeyAlpha        </span><span style="color: #357B42; font-style: italic">; Espera pulsación tecla</span></span>
<span class="line"><span style="color: #002339">cp      KEY0                </span><span style="color: #357B42; font-style: italic">; ¿Pulsado 0?</span></span>
<span class="line"><span style="color: #002339">jr      z, Init             </span><span style="color: #357B42; font-style: italic">; Sí, inicia partida</span></span>
<span class="line"><span style="color: #7EB233">menu_Players:</span></span>
<span class="line"><span style="color: #002339">cp      KEY1                </span><span style="color: #357B42; font-style: italic">; ¿Pulsado 1?</span></span>
<span class="line"><span style="color: #002339">jr      nz, menu_Points     </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #002339">ld      a, (MaxPlayers)     </span><span style="color: #357B42; font-style: italic">; A = jugadores</span></span>
<span class="line"><span style="color: #7B30D0">xor</span><span style="color: #002339">     </span><span style="color: #174781">$03</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Alterna entre 1 y 2</span></span>
<span class="line"><span style="color: #002339">ld      (MaxPlayers), a     </span><span style="color: #357B42; font-style: italic">; Actualiza en memoria</span></span>
<span class="line"><span style="color: #002339">jr      menu_op             </span><span style="color: #357B42; font-style: italic">; Bucle</span></span>
<span class="line"><span style="color: #7EB233">menu_Points:</span></span>
<span class="line"><span style="color: #002339">cp      KEY2                </span><span style="color: #357B42; font-style: italic">; ¿Pulsado 2?</span></span>
<span class="line"><span style="color: #002339">jr      nz, menu_Time       </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #002339">ld      a, (MaxPoints)      </span><span style="color: #357B42; font-style: italic">; A = puntos</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     a                   </span><span style="color: #357B42; font-style: italic">; A += 1</span></span>
<span class="line"><span style="color: #002339">cp      </span><span style="color: #174781">$06</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; ¿A = 6?</span></span>
<span class="line"><span style="color: #002339">jr      nz, menu_PointsDo   </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$01</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 1</span></span>
<span class="line"><span style="color: #7EB233">menu_PointsDo:</span><span style="color: #002339">  </span></span>
<span class="line"><span style="color: #002339">ld      (MaxPoints), a      </span><span style="color: #357B42; font-style: italic">; Actualiza en memoria</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, &#39;</span><span style="color: #174781">0</span><span style="color: #002339">&#39;              </span><span style="color: #357B42; font-style: italic">; A = ascii de valor</span></span>
<span class="line"><span style="color: #002339">ld      (info_points), a    </span><span style="color: #357B42; font-style: italic">; Actualiza en memoria</span></span>
<span class="line"><span style="color: #002339">cp      &#39;</span><span style="color: #174781">1</span><span style="color: #002339">&#39;                 </span><span style="color: #357B42; font-style: italic">; ¿Puntos 1?</span></span>
<span class="line"><span style="color: #002339">jr      z, menu_Points1     </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      a, &#39;s&#39;              </span><span style="color: #357B42; font-style: italic">; Plural</span></span>
<span class="line"><span style="color: #002339">jr      menu_PointsEnd      </span><span style="color: #357B42; font-style: italic">; Salta</span></span>
<span class="line"><span style="color: #7EB233">menu_Points1:</span></span>
<span class="line"><span style="color: #002339">ld      a, &#39; &#39;              </span><span style="color: #357B42; font-style: italic">; Singular</span></span>
<span class="line"><span style="color: #7EB233">menu_PointsEnd:</span></span>
<span class="line"><span style="color: #002339">ld      (info_gt1), a       </span><span style="color: #357B42; font-style: italic">; Actualiza en memoria</span></span>
<span class="line"><span style="color: #002339">jr      menu_op             </span><span style="color: #357B42; font-style: italic">; Bucle</span></span>
<span class="line"><span style="color: #7EB233">menu_Time:</span></span>
<span class="line"><span style="color: #002339">cp      KEY3                </span><span style="color: #357B42; font-style: italic">; ¿Pulsado 3?</span></span>
<span class="line"><span style="color: #002339">jr      nz, menu_op         </span><span style="color: #357B42; font-style: italic">; No, bucle</span></span>
<span class="line"><span style="color: #002339">ld      a, (MaxSeconds)     </span><span style="color: #357B42; font-style: italic">; A = segundos</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, </span><span style="color: #174781">$05</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A += 5</span></span>
<span class="line"><span style="color: #7B30D0">daa</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; Ajuste decimal</span></span>
<span class="line"><span style="color: #002339">cp      </span><span style="color: #174781">$35</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; ¿ A = 35 BCD?</span></span>
<span class="line"><span style="color: #002339">jr      nz, menu_TimeDo     </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$05</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 5</span></span>
<span class="line"><span style="color: #7EB233">menu_TimeDo:</span></span>
<span class="line"><span style="color: #002339">ld      (MaxSeconds), a     </span><span style="color: #357B42; font-style: italic">; Actualiza en memoria</span></span>
<span class="line"><span style="color: #002339">jr      menu_op             </span><span style="color: #357B42; font-style: italic">; Bucle</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Tras llamar a la rutina que comprueba si se ha pulsado alguna tecla válida, evalúa si es alguna entre la tecla cero y la tres, y según cual sea actúa de una manera u otra. Observad que sólo hace el ajuste decimal al incrementar los segundos; es la única opción cuyo valor pasa de nueve.</p>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y vemos los resultados. Todo parece ir bien hasta que pulsamos el cero, iniciamos la partida y quedan restos del menú.</p>



<p class="has-medium-font-size wp-block-paragraph">Para solucionar esto, debajo de la etiqueta Init añadimos la línea siguiente:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="call    CLS                     ; Limpia pantalla" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    CLS                     </span><span style="color: #357B42; font-style: italic">; Limpia pantalla</span></span></code></pre></div>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af49317bb9ea&quot;}" data-wp-interactive="core/image" data-wp-key="6af49317bb9ea" class="wp-block-image size-full wp-lightbox-container"><img data-recalc-dims="1" loading="lazy" decoding="async" width="701" height="611" data-attachment-id="3857" data-permalink="https://espamatica.com/paso04_02/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso04_02.png?fit=701%2C611&amp;ssl=1" data-orig-size="701,611" data-comments-opened="1" data-image-title="Opciones" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador ZX Spectrum &amp;#8211; opciones&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso04_02.png?fit=701%2C611&amp;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso04_02.png?resize=701%2C611&#038;ssl=1" alt="Ensamblador ZX Spectrum - opciones" class="wp-image-3857" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso04_02.png?w=701&amp;ssl=1 701w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/05/Paso04_02.png?resize=300%2C261&amp;ssl=1 300w" sizes="auto, (max-width: 701px) 100vw, 701px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Ensamblador ZX Spectrum &#8211; opciones</figcaption></figure>



<h2 id="inicio-de-partida" class="wp-block-heading">Inicio de partida</h2>



<p class="has-medium-font-size wp-block-paragraph">Al iniciar la partida, lo primero que vamos a hacer es solicitar los nombres de los jugadores. Antes de nada, añadimos otra constante en ROM.asm; en esta dirección están las coordenadas del cursor.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; Posición del cursor en pantalla 2. 
; Si se carga en BC -&gt; B = Y, C = X.
CURSOR:     equ $5c88" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; Posición del cursor en pantalla 2. </span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Si se carga en BC -&gt; B = Y, C = X.</span></span>
<span class="line"><span style="color: #7EB233">CURSOR:</span><span style="color: #002339">     </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$5c88</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Implementamos la rutina encargada de solicitar los nombres de los jugadores en Game.asm. Aunque seguimos sin explicar instrucción a instrucción, debido al tamaño de la rutina la vamos a ir implementando por bloques.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="GetPlayersName:
ld      hl, Name_p1      
ld      de, Name_p1+$01  
ld      bc, LENNAME*2-$01
ld      (hl), &quot; &quot;        
ldir" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">GetPlayersName:</span></span>
<span class="line"><span style="color: #002339">ld      hl, Name_p1      </span></span>
<span class="line"><span style="color: #002339">ld      de, Name_p1+</span><span style="color: #174781">$01</span><span style="color: #002339">  </span></span>
<span class="line"><span style="color: #002339">ld      bc, LENNAME*</span><span style="color: #174781">2</span><span style="color: #002339">-</span><span style="color: #174781">$01</span></span>
<span class="line"><span style="color: #002339">ld      (hl), &quot; &quot;        </span></span>
<span class="line"><span style="color: #002339">ldir</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Limpiamos los nombres de los jugadores.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      e, $01
getPlayersName_loop:
ld      a, INK4
call    INK
ld      b, INI_TOP - $0f
ld      c, INI_LEFT - $01
call    CLL
call    AT

ld      hl, TitlePlayerNumber
ld      (hl), &quot;1&quot;
ld      a, $01
cp      e
jr      z, getPlayersName_cont
ld      (hl), &quot;2&quot;
getPlayersName_cont:
ld      hl, TitlePlayerName
call    PrintString

ld      hl, Name_p1
ld      a, $01
cp      e
jr      z, getPlayersName_cont2
ld      hl, Name_p2" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      e, </span><span style="color: #174781">$01</span></span>
<span class="line"><span style="color: #7EB233">getPlayersName_loop:</span></span>
<span class="line"><span style="color: #002339">ld      a, INK4</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    INK</span></span>
<span class="line"><span style="color: #002339">ld      b, INI_TOP - </span><span style="color: #174781">$0f</span></span>
<span class="line"><span style="color: #002339">ld      c, INI_LEFT - </span><span style="color: #174781">$01</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    CLL</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      hl, TitlePlayerNumber</span></span>
<span class="line"><span style="color: #002339">ld      (hl), &quot;</span><span style="color: #174781">1</span><span style="color: #002339">&quot;</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$01</span></span>
<span class="line"><span style="color: #002339">cp      e</span></span>
<span class="line"><span style="color: #002339">jr      z, getPlayersName_cont</span></span>
<span class="line"><span style="color: #002339">ld      (hl), &quot;</span><span style="color: #174781">2</span><span style="color: #002339">&quot;</span></span>
<span class="line"><span style="color: #7EB233">getPlayersName_cont:</span></span>
<span class="line"><span style="color: #002339">ld      hl, TitlePlayerName</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintString</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      hl, Name_p1</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$01</span></span>
<span class="line"><span style="color: #002339">cp      e</span></span>
<span class="line"><span style="color: #002339">jr      z, getPlayersName_cont2</span></span>
<span class="line"><span style="color: #002339">ld      hl, Name_p2</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Hacemos un bucle de dos iteraciones máximo, una por jugador:&nbsp;cambiamos la tinta, borramos la línea en la que se solicitan los nombres, posicionamos el cursor, preparamos el título dependiendo del jugador y apuntamos HL al nombre del jugador.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="getPlayersName_cont2:
ld      d, $00
ld      a, INK3                   
call    INK                       
call    getPlayersName_getName 

ld      a, (MaxPlayers)           
cp      $02			 
jr      nz, getPlayersName_onlyOne
inc     e                         
cp      e                         
jr      z, getPlayersName_loop    
ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">getPlayersName_cont2:</span></span>
<span class="line"><span style="color: #002339">ld      d, </span><span style="color: #174781">$00</span></span>
<span class="line"><span style="color: #002339">ld      a, INK3                   </span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    INK                       </span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    getPlayersName_getName </span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      a, (MaxPlayers)           </span></span>
<span class="line"><span style="color: #002339">cp      </span><span style="color: #174781">$02</span><span style="color: #002339">			 </span></span>
<span class="line"><span style="color: #002339">jr      nz, getPlayersName_onlyOne</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     e                         </span></span>
<span class="line"><span style="color: #002339">cp      e                         </span></span>
<span class="line"><span style="color: #002339">jr      z, getPlayersName_loop    </span></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Usamos D para controlar la longitud del nombre, cambiamos la tinta y solicitamos el nombre del jugador. Obtenemos los jugadores, vemos si son dos, y si no es así ponemos el nombre por defecto al dos. Si son dos jugadores, comprobamos si el nombre introducido es del jugador dos, y si no es así bucle para solicitarlo.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="getPlayersName_onlyOne:
ld      hl, Name_p2Default
ld      de, Name_p2       
ld      bc, LENNAME       
ldir                      
ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">getPlayersName_onlyOne:</span></span>
<span class="line"><span style="color: #002339">ld      hl, Name_p2Default</span></span>
<span class="line"><span style="color: #002339">ld      de, Name_p2       </span></span>
<span class="line"><span style="color: #002339">ld      bc, LENNAME       </span></span>
<span class="line"><span style="color: #002339">ldir                      </span></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Si es un solo jugador, asigna al segundo el nombre por defecto.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="getPlayersName_getName:
push    hl                       
call    WaitKeyAlpha             
pop     hl                       

cp      KEYDEL                   
jr      z, getPlayersName_delete 
cp      KEYENT                   
jr      z, getPlayersName_enter		
push    de                       
ld      e, a                     
ld      a, LENNAME               
cp      d                        
ld      a, e 
pop     de 
jr      z, getPlayersName_getName
                                 
ld      (hl), a 
inc     hl 
rst     $10
inc     d 
jr      getPlayersName_getName" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">getPlayersName_getName:</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">    hl                       </span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    WaitKeyAlpha             </span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">     hl                       </span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">cp      KEYDEL                   </span></span>
<span class="line"><span style="color: #002339">jr      z, getPlayersName_delete </span></span>
<span class="line"><span style="color: #002339">cp      KEYENT                   </span></span>
<span class="line"><span style="color: #002339">jr      z, getPlayersName_enter		</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">    de                       </span></span>
<span class="line"><span style="color: #002339">ld      e, a                     </span></span>
<span class="line"><span style="color: #002339">ld      a, LENNAME               </span></span>
<span class="line"><span style="color: #002339">cp      d                        </span></span>
<span class="line"><span style="color: #002339">ld      a, e </span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">     de </span></span>
<span class="line"><span style="color: #002339">jr      z, getPlayersName_getName</span></span>
<span class="line"><span style="color: #002339">                                 </span></span>
<span class="line"><span style="color: #002339">ld      (hl), a </span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl </span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     d </span></span>
<span class="line"><span style="color: #002339">jr      getPlayersName_getName</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Esperamos a la pulsación de una tecla válida, comprobamos si es delete y de serlo saltamos a su manejo. Comprobamos si es enter y de serlo saltamos a su manejo.</p>



<p class="has-medium-font-size wp-block-paragraph">Si no es delete, ni es enter, vemos si hemos llegado a la longitud máxima, y si no es así añadimos el carácter al nombre y lo pintamos.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="getPlayersName_delete:
ld      a, $00                   
cp      d                        
jr      z, getPlayersName_getName

dec     d                        
dec     hl                       
ld      a, ' '                   
ld      (hl), a                  
ld      bc, (CURSOR)             
inc     c                        
call    AT                       
rst     $10                      
call    AT                       
jr      getPlayersName_getName" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">getPlayersName_delete:</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$00</span><span style="color: #002339">                   </span></span>
<span class="line"><span style="color: #002339">cp      d                        </span></span>
<span class="line"><span style="color: #002339">jr      z, getPlayersName_getName</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">dec</span><span style="color: #002339">     d                        </span></span>
<span class="line"><span style="color: #7B30D0">dec</span><span style="color: #002339">     hl                       </span></span>
<span class="line"><span style="color: #002339">ld      a, &#39; &#39;                   </span></span>
<span class="line"><span style="color: #002339">ld      (hl), a                  </span></span>
<span class="line"><span style="color: #002339">ld      bc, (CURSOR)             </span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     c                        </span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT                       </span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                      </span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT                       </span></span>
<span class="line"><span style="color: #002339">jr      getPlayersName_getName</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Si la tecla pulsada es delete y la longitud del nombre no es cero, borramos el carácter anterior del nombre y de la pantalla.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="getPlayersName_enter:
ld      a, 0                     
cp      d                        
jr      z, getPlayersName_getName
ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">getPlayersName_enter:</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">0</span><span style="color: #002339">                     </span></span>
<span class="line"><span style="color: #002339">cp      d                        </span></span>
<span class="line"><span style="color: #002339">jr      z, getPlayersName_getName</span></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Si la tecla pulsada es enter y la longitud del nombre no es cero, se finaliza la solicitud del nombre.</p>



<p class="has-medium-font-size wp-block-paragraph">El aspecto final de la rutina es el siguiente:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(3 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Solicita el nombre de los jugadores.
;
; Altera el valor de los registos AF, BC, DE y HL.
; -------------------------------------------------------------------
GetPlayersName:
ld      hl, Name_p1                 ; HL = dirección nombre jugador 1
ld      de, Name_p1+$01             ; DE = HL+1
ld      bc, LENNAME*2-$01           ; BC = longitud nombres - 1
ld      (hl), &quot; &quot;                   ; Limpia primera posición
ldir                                ; Limpia el resto

ld      e, $01			      ; E = 1
getPlayersName_loop:
ld      a, INK4                     ; A = tinta 4
call    INK                         ; Cambia tinta
ld      b, INI_TOP - $0f            ; B = coord Y
ld      c, INI_LEFT - $01           ; X = coord X
call    CLL                         ; Borra la línea
call    AT                          ; Posiciona cursor

ld      hl, TitlePlayerNumber       ; HL = número de jugador
ld      (hl), &quot;1&quot;                   ; Jugador 1
ld      a, $01                      ; A = 1
cp      e                           ; ¿Jugador 1?
jr      z, getPlayersName_cont      ; Sí, salta
ld      (hl), &quot;2&quot;                   ; Jugador 2    
getPlayersName_cont:
ld      hl, TitlePlayerName         ; HL = titulo nombre jugador
call    PrintString                 ; Lo pinta

ld      hl, Name_p1                 ; HL = dirección nombre jugador 1
ld      a, $01                      ; A = 1
cp      e                           ; ¿Jugador 1?
jr      z, getPlayersName_cont2     ; Sí, salta
ld      hl, Name_p2                 ; HL = dirección nombre jugador 2
getPlayersName_cont2:
ld      d, $00                      ; D = contador longitud nombre
ld      a, INK3                     ; A = tinta 3
call    INK                         ; Cambia tinta
call    getPlayersName_getName      ; Pide nombre jugador

ld      a, (MaxPlayers)             ; A = jugadores
cp      $02                         ; ¿Dos jugadores?
jr      nz, getPlayersName_onlyOne  ; Un jugador, nombre por defecto
inc     e                           ; E+=1
cp      e                           ; Compara con jugadores
jr      z, getPlayersName_loop      ; Iguales, salta
ret

; Un solo jugador
; Copia el nombre por defecto del jugador 2
getPlayersName_onlyOne:
ld      hl, Name_p2Default          ; HL = nombre por defecto jugador 2
ld      de, Name_p2                 ; DE = nombre jugador 2
ld      bc, LENNAME                 ; Longitud nombre
ldir                                ; Copia nombre por defecto
ret                                 ; Sale

; Pide el nombre del jugador
getPlayersName_getName:
push    hl                          ; Preserva HL
call    WaitKeyAlpha                ; Espera tecla válida
pop     hl                          ; Recupera HL

cp      KEYDEL                      ; ¿Delete?
jr      z, getPlayersName_delete    ; Sí, salta
cp      KEYENT                      ; ¿Enter?
jr      z, getPlayersName_enter     ; Sí, salta	
push    de                          ; Preserva DE
ld      e, a                        ; E = código Ascii
ld      a, LENNAME                  ; A = longitud máxima nombre
cp      d                           ; ¿D = longitud máxima?
ld      a, e                        ; A = código Ascii
pop     de                          ; Recupera DE
jr      z, getPlayersName_getName   ; D = longitud máxima
                                    ; otro carácter
                                    ; Enter o Delete

ld      (hl), a                     ; Añade caracter a nombre
inc     hl                          ; HL = siguiente posición
rst     $10                         ; Imprime carácter
inc     d                           ; D+=1
jr      getPlayersName_getName      ; Solicitar otro carácter

getPlayersName_delete:
ld      a, $00                      ; A = 0
cp      d                           ; ¿Longitud 0?
jr      z, getPlayersName_getName   ; Sí, otro carácter

dec     d                           ; D-=1
dec     hl                          ; HL-=1, carácter anterior
ld      a, ' '                      ; A = espacio
ld      (hl), a                     ; Limpia carácter anterior
ld      bc, (CURSOR)                ; BC = posición cursor
inc     c                           ; BC = columna anterior para AT
call    AT                          ; Posiciona cursor
rst     $10                         ; Borra el carácter pantalla	
call    AT                          ; Posiciona cursor
jr      getPlayersName_getName      ; Otro carácter

getPlayersName_enter:
ld      a, 0                        ; A = 0
cp      d                           ; ¿Longitud 0?
jr      z, getPlayersName_getName   ; Sí, otro carácter
ret                                 ; Fin nombre" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Solicita el nombre de los jugadores.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registos AF, BC, DE y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">GetPlayersName:</span></span>
<span class="line"><span style="color: #002339">ld      hl, Name_p1                 </span><span style="color: #357B42; font-style: italic">; HL = dirección nombre jugador 1</span></span>
<span class="line"><span style="color: #002339">ld      de, Name_p1+</span><span style="color: #174781">$01</span><span style="color: #002339">             </span><span style="color: #357B42; font-style: italic">; DE = HL+1</span></span>
<span class="line"><span style="color: #002339">ld      bc, LENNAME*</span><span style="color: #174781">2</span><span style="color: #002339">-</span><span style="color: #174781">$01</span><span style="color: #002339">           </span><span style="color: #357B42; font-style: italic">; BC = longitud nombres - 1</span></span>
<span class="line"><span style="color: #002339">ld      (hl), &quot; &quot;                   </span><span style="color: #357B42; font-style: italic">; Limpia primera posición</span></span>
<span class="line"><span style="color: #002339">ldir                                </span><span style="color: #357B42; font-style: italic">; Limpia el resto</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      e, </span><span style="color: #174781">$01</span><span style="color: #002339">			      </span><span style="color: #357B42; font-style: italic">; E = 1</span></span>
<span class="line"><span style="color: #7EB233">getPlayersName_loop:</span></span>
<span class="line"><span style="color: #002339">ld      a, INK4                     </span><span style="color: #357B42; font-style: italic">; A = tinta 4</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    INK                         </span><span style="color: #357B42; font-style: italic">; Cambia tinta</span></span>
<span class="line"><span style="color: #002339">ld      b, INI_TOP - </span><span style="color: #174781">$0f</span><span style="color: #002339">            </span><span style="color: #357B42; font-style: italic">; B = coord Y</span></span>
<span class="line"><span style="color: #002339">ld      c, INI_LEFT - </span><span style="color: #174781">$01</span><span style="color: #002339">           </span><span style="color: #357B42; font-style: italic">; X = coord X</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    CLL                         </span><span style="color: #357B42; font-style: italic">; Borra la línea</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT                          </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      hl, TitlePlayerNumber       </span><span style="color: #357B42; font-style: italic">; HL = número de jugador</span></span>
<span class="line"><span style="color: #002339">ld      (hl), &quot;</span><span style="color: #174781">1</span><span style="color: #002339">&quot;                   </span><span style="color: #357B42; font-style: italic">; Jugador 1</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$01</span><span style="color: #002339">                      </span><span style="color: #357B42; font-style: italic">; A = 1</span></span>
<span class="line"><span style="color: #002339">cp      e                           </span><span style="color: #357B42; font-style: italic">; ¿Jugador 1?</span></span>
<span class="line"><span style="color: #002339">jr      z, getPlayersName_cont      </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      (hl), &quot;</span><span style="color: #174781">2</span><span style="color: #002339">&quot;                   </span><span style="color: #357B42; font-style: italic">; Jugador 2    </span></span>
<span class="line"><span style="color: #7EB233">getPlayersName_cont:</span></span>
<span class="line"><span style="color: #002339">ld      hl, TitlePlayerName         </span><span style="color: #357B42; font-style: italic">; HL = titulo nombre jugador</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintString                 </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      hl, Name_p1                 </span><span style="color: #357B42; font-style: italic">; HL = dirección nombre jugador 1</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$01</span><span style="color: #002339">                      </span><span style="color: #357B42; font-style: italic">; A = 1</span></span>
<span class="line"><span style="color: #002339">cp      e                           </span><span style="color: #357B42; font-style: italic">; ¿Jugador 1?</span></span>
<span class="line"><span style="color: #002339">jr      z, getPlayersName_cont2     </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      hl, Name_p2                 </span><span style="color: #357B42; font-style: italic">; HL = dirección nombre jugador 2</span></span>
<span class="line"><span style="color: #7EB233">getPlayersName_cont2:</span></span>
<span class="line"><span style="color: #002339">ld      d, </span><span style="color: #174781">$00</span><span style="color: #002339">                      </span><span style="color: #357B42; font-style: italic">; D = contador longitud nombre</span></span>
<span class="line"><span style="color: #002339">ld      a, INK3                     </span><span style="color: #357B42; font-style: italic">; A = tinta 3</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    INK                         </span><span style="color: #357B42; font-style: italic">; Cambia tinta</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    getPlayersName_getName      </span><span style="color: #357B42; font-style: italic">; Pide nombre jugador</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      a, (MaxPlayers)             </span><span style="color: #357B42; font-style: italic">; A = jugadores</span></span>
<span class="line"><span style="color: #002339">cp      </span><span style="color: #174781">$02</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; ¿Dos jugadores?</span></span>
<span class="line"><span style="color: #002339">jr      nz, getPlayersName_onlyOne  </span><span style="color: #357B42; font-style: italic">; Un jugador, nombre por defecto</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     e                           </span><span style="color: #357B42; font-style: italic">; E+=1</span></span>
<span class="line"><span style="color: #002339">cp      e                           </span><span style="color: #357B42; font-style: italic">; Compara con jugadores</span></span>
<span class="line"><span style="color: #002339">jr      z, getPlayersName_loop      </span><span style="color: #357B42; font-style: italic">; Iguales, salta</span></span>
<span class="line"><span style="color: #7B30D0">ret</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Un solo jugador</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Copia el nombre por defecto del jugador 2</span></span>
<span class="line"><span style="color: #7EB233">getPlayersName_onlyOne:</span></span>
<span class="line"><span style="color: #002339">ld      hl, Name_p2Default          </span><span style="color: #357B42; font-style: italic">; HL = nombre por defecto jugador 2</span></span>
<span class="line"><span style="color: #002339">ld      de, Name_p2                 </span><span style="color: #357B42; font-style: italic">; DE = nombre jugador 2</span></span>
<span class="line"><span style="color: #002339">ld      bc, LENNAME                 </span><span style="color: #357B42; font-style: italic">; Longitud nombre</span></span>
<span class="line"><span style="color: #002339">ldir                                </span><span style="color: #357B42; font-style: italic">; Copia nombre por defecto</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                                 </span><span style="color: #357B42; font-style: italic">; Sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Pide el nombre del jugador</span></span>
<span class="line"><span style="color: #7EB233">getPlayersName_getName:</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">    hl                          </span><span style="color: #357B42; font-style: italic">; Preserva HL</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    WaitKeyAlpha                </span><span style="color: #357B42; font-style: italic">; Espera tecla válida</span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">     hl                          </span><span style="color: #357B42; font-style: italic">; Recupera HL</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">cp      KEYDEL                      </span><span style="color: #357B42; font-style: italic">; ¿Delete?</span></span>
<span class="line"><span style="color: #002339">jr      z, getPlayersName_delete    </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">cp      KEYENT                      </span><span style="color: #357B42; font-style: italic">; ¿Enter?</span></span>
<span class="line"><span style="color: #002339">jr      z, getPlayersName_enter     </span><span style="color: #357B42; font-style: italic">; Sí, salta	</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">    de                          </span><span style="color: #357B42; font-style: italic">; Preserva DE</span></span>
<span class="line"><span style="color: #002339">ld      e, a                        </span><span style="color: #357B42; font-style: italic">; E = código Ascii</span></span>
<span class="line"><span style="color: #002339">ld      a, LENNAME                  </span><span style="color: #357B42; font-style: italic">; A = longitud máxima nombre</span></span>
<span class="line"><span style="color: #002339">cp      d                           </span><span style="color: #357B42; font-style: italic">; ¿D = longitud máxima?</span></span>
<span class="line"><span style="color: #002339">ld      a, e                        </span><span style="color: #357B42; font-style: italic">; A = código Ascii</span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">     de                          </span><span style="color: #357B42; font-style: italic">; Recupera DE</span></span>
<span class="line"><span style="color: #002339">jr      z, getPlayersName_getName   </span><span style="color: #357B42; font-style: italic">; D = longitud máxima</span></span>
<span class="line"><span style="color: #002339">                                    </span><span style="color: #357B42; font-style: italic">; otro carácter</span></span>
<span class="line"><span style="color: #002339">                                    </span><span style="color: #357B42; font-style: italic">; Enter o Delete</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      (hl), a                     </span><span style="color: #357B42; font-style: italic">; Añade caracter a nombre</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                          </span><span style="color: #357B42; font-style: italic">; HL = siguiente posición</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; Imprime carácter</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     d                           </span><span style="color: #357B42; font-style: italic">; D+=1</span></span>
<span class="line"><span style="color: #002339">jr      getPlayersName_getName      </span><span style="color: #357B42; font-style: italic">; Solicitar otro carácter</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">getPlayersName_delete:</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$00</span><span style="color: #002339">                      </span><span style="color: #357B42; font-style: italic">; A = 0</span></span>
<span class="line"><span style="color: #002339">cp      d                           </span><span style="color: #357B42; font-style: italic">; ¿Longitud 0?</span></span>
<span class="line"><span style="color: #002339">jr      z, getPlayersName_getName   </span><span style="color: #357B42; font-style: italic">; Sí, otro carácter</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">dec</span><span style="color: #002339">     d                           </span><span style="color: #357B42; font-style: italic">; D-=1</span></span>
<span class="line"><span style="color: #7B30D0">dec</span><span style="color: #002339">     hl                          </span><span style="color: #357B42; font-style: italic">; HL-=1, carácter anterior</span></span>
<span class="line"><span style="color: #002339">ld      a, &#39; &#39;                      </span><span style="color: #357B42; font-style: italic">; A = espacio</span></span>
<span class="line"><span style="color: #002339">ld      (hl), a                     </span><span style="color: #357B42; font-style: italic">; Limpia carácter anterior</span></span>
<span class="line"><span style="color: #002339">ld      bc, (CURSOR)                </span><span style="color: #357B42; font-style: italic">; BC = posición cursor</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     c                           </span><span style="color: #357B42; font-style: italic">; BC = columna anterior para AT</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT                          </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; Borra el carácter pantalla	</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT                          </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #002339">jr      getPlayersName_getName      </span><span style="color: #357B42; font-style: italic">; Otro carácter</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">getPlayersName_enter:</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">0</span><span style="color: #002339">                        </span><span style="color: #357B42; font-style: italic">; A = 0</span></span>
<span class="line"><span style="color: #002339">cp      d                           </span><span style="color: #357B42; font-style: italic">; ¿Longitud 0?</span></span>
<span class="line"><span style="color: #002339">jr      z, getPlayersName_getName   </span><span style="color: #357B42; font-style: italic">; Sí, otro carácter</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                                 </span><span style="color: #357B42; font-style: italic">; Fin nombre</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Vamos a ver si todo funciona. En Main.asm localizamos Init y, debajo de CALL CLS, añadimos la llamada a la solicitud de los nombres y otra llamada a CLS.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="call    GetPlayersName          ; Solicita nombres jugadores
call    CLS                     ; Limpia pantalla" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    GetPlayersName          </span><span style="color: #357B42; font-style: italic">; Solicita nombres jugadores</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    CLS                     </span><span style="color: #357B42; font-style: italic">; Limpia pantalla</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y vemos los resultados. Ya podemos proporcionar los nombres de los jugadores y aparecen en la información de la partida. Si la partida es a un solo jugador, jugamos contra ZX Spectrum.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af49317bdbe2&quot;}" data-wp-interactive="core/image" data-wp-key="6af49317bdbe2" class="wp-block-image size-full wp-lightbox-container"><img data-recalc-dims="1" loading="lazy" decoding="async" width="704" height="611" data-attachment-id="3747" data-permalink="https://espamatica.com/paso04_04/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso04_04.png?fit=704%2C611&amp;ssl=1" data-orig-size="704,611" data-comments-opened="1" data-image-title="Nombres" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador ZX Spectrum &amp;#8211; nombres&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso04_04.png?fit=704%2C611&amp;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso04_04.png?resize=704%2C611&#038;ssl=1" alt="Ensamblador ZX Spectrum - nombres" class="wp-image-3747" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso04_04.png?w=704&amp;ssl=1 704w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso04_04.png?resize=300%2C260&amp;ssl=1 300w" sizes="auto, (max-width: 704px) 100vw, 704px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Ensamblador ZX Spectrum &#8211; nombres</figcaption></figure>



<h2 id="tiempo-de-turno" class="wp-block-heading has-large-font-size">Tiempo de turno</h2>



<p class="has-medium-font-size wp-block-paragraph">Unas de las opciones son los segundos de los que dispone cada jugador para realizar el movimiento, si pasados esos segundos no se ha realizado el movimiento, pierde el turno y pasa al otro jugador.</p>



<p class="has-medium-font-size wp-block-paragraph">Vamos a hacer uso de la interrupciones para controlar el tiempo. Creamos el archivo Int.asm.</p>



<p class="has-medium-font-size wp-block-paragraph">Al inicio de Main.asm, justo debajo de ORG $5E88, añadimos las líneas siguientes (ya lo hicimos en Batalla espacial):</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Indicadores
;       bit 0   -&gt;  Reiniciar cuenta atrás
;       bit 1   -&gt;  Pierde turno
;       bit 2   -&gt;  Pintar cuenta atrás
;       bit 3   -&gt;  Sonido de advertencia, acaba cuenta atrás
; -------------------------------------------------------------------
flags:      db $00
; Valor cuenta atrás
countdown:  db $00
; Segundos por turno
seconds:    db $00" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Indicadores</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       bit 0   -&gt;  Reiniciar cuenta atrás</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       bit 1   -&gt;  Pierde turno</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       bit 2   -&gt;  Pintar cuenta atrás</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       bit 3   -&gt;  Sonido de advertencia, acaba cuenta atrás</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #174781">flags</span><span style="color: #002339">:      </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Valor cuenta atrás</span></span>
<span class="line"><span style="color: #7EB233">countdown:</span><span style="color: #002339">  </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Segundos por turno</span></span>
<span class="line"><span style="color: #7EB233">seconds:</span><span style="color: #002339">    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Seconds la vamos a usar para que las interrupciones sepan el número de segundos por turno que han seleccionado los jugadores. Con seconds ya no es necesaria la variable MaxSeconds, la quitamos.</p>



<p class="has-medium-font-size wp-block-paragraph">Localizamos Main, y tras la línea CALL OPENCHAN, inicializamos seconds:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, $10                  ; A = $10 BCD
ld      (seconds), a            ; Actualiza segundos
ld      (countdown), a          ; Actualiza cuenta atrás" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$10</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; A = $10 BCD</span></span>
<span class="line"><span style="color: #002339">ld      (seconds), a            </span><span style="color: #357B42; font-style: italic">; Actualiza segundos</span></span>
<span class="line"><span style="color: #002339">ld      (countdown), a          </span><span style="color: #357B42; font-style: italic">; Actualiza cuenta atrás</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Localizamos menu_Time y tras JR NZ, menu_op modificamos la línea LD A, (MaxSeconds), quedando así:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, (seconds)            ; A = segundos" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, (seconds)            </span><span style="color: #357B42; font-style: italic">; A = segundos</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Localizamos menu_TimeDo, borramos LD, (MaxSecond), A y en su lugar añadimos las líneas siguientes:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      (seconds), a            ; Actualiza segundos
ld      (countdown), a          ; Actualiza cuenta atrás" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      (seconds), a            </span><span style="color: #357B42; font-style: italic">; Actualiza segundos</span></span>
<span class="line"><span style="color: #002339">ld      (countdown), a          </span><span style="color: #357B42; font-style: italic">; Actualiza cuenta atrás</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">En Screen.asm, al final de la rutina PrintOptions, reemplazamos LD HL, MaxSeconds por:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld	hl, seconds	                ; HL = valor tiempo" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld	hl, seconds	                </span><span style="color: #357B42; font-style: italic">; HL = valor tiempo</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Por último, en Var.asm, borramos la definición de MaxSeconds.</p>



<p class="has-medium-font-size wp-block-paragraph">La rutina de las interrupciones cambiará el valor de flags y el de countdown; debemos tenerlo en cuenta en el bucle principal.</p>



<p class="has-medium-font-size wp-block-paragraph">Para que la rutina de interrupciones se ejecute cincuenta veces por segundo (en PAL, sesenta en NTSC) hay que activar el modo dos de las mismas. Localizamos Loop en Mains.asm y encima añadimos:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="di                              ; Desactiva interrupciones
ld      a, $28                  ; A = $28
ld      i, a                    ; I = A (interrupciones en $7e5c)
im      $02                     ; Interrupciones = modo 2
ei                              ; Actualiza interrupciones" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #174781">di</span><span style="color: #002339">                              </span><span style="color: #357B42; font-style: italic">; Desactiva interrupciones</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$28</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; A = $28</span></span>
<span class="line"><span style="color: #002339">ld      i, a                    </span><span style="color: #357B42; font-style: italic">; I = A (interrupciones en $7e5c)</span></span>
<span class="line"><span style="color: #002339">im      </span><span style="color: #174781">$02</span><span style="color: #002339">                     </span><span style="color: #357B42; font-style: italic">; Interrupciones = modo 2</span></span>
<span class="line"><span style="color: #002339">ei                              </span><span style="color: #357B42; font-style: italic">; Actualiza interrupciones</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Desactivamos las interrupciones, cargamos $28 en el registro de interrupciones, las ponemos en modo dos y las activamos.</p>



<p class="has-medium-font-size wp-block-paragraph">Buscamos loop_key, y justo debajo implementamos la lógica del manejo de flags.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, (flags)              ; A = Flags
bit     $02, a                  ; ¿Bit 2 activo?
res     $02, a                  ; Desactiva bit 2
jr      z, loop_warning         ; No activo, salta
push    af                      ; Preserva AF
call    PrintCountDown          ; Pinta cuenta atrás
pop     af                      ; Recupera AF" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, (</span><span style="color: #174781">flags</span><span style="color: #002339">)              </span><span style="color: #357B42; font-style: italic">; A = Flags</span></span>
<span class="line"><span style="color: #002339">bit     </span><span style="color: #174781">$02</span><span style="color: #002339">, a                  </span><span style="color: #357B42; font-style: italic">; ¿Bit 2 activo?</span></span>
<span class="line"><span style="color: #002339">res     </span><span style="color: #174781">$02</span><span style="color: #002339">, a                  </span><span style="color: #357B42; font-style: italic">; Desactiva bit 2</span></span>
<span class="line"><span style="color: #002339">jr      z, loop_warning         </span><span style="color: #357B42; font-style: italic">; No activo, salta</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">    af                      </span><span style="color: #357B42; font-style: italic">; Preserva AF</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintCountDown          </span><span style="color: #357B42; font-style: italic">; Pinta cuenta atrás</span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">     af                      </span><span style="color: #357B42; font-style: italic">; Recupera AF</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Cargamos flags en A, evaluamos si el bit dos está activo y lo desactivamos. Si no está activo saltamos, si lo está pintamos la cuenta atrás.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="loop_warning:
bit     $03, a                  ; ¿Bit 3 activo?             
res     $03, a                  ; Desactiva bit 3
jr      z, loop_lostMov         ; No activo, salta
ld      bc, SoundCountDown      ; BC = dirección sonido 
call    PlayMusic               ; Emite sonido" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">loop_warning:</span></span>
<span class="line"><span style="color: #002339">bit     </span><span style="color: #174781">$03</span><span style="color: #002339">, a                  </span><span style="color: #357B42; font-style: italic">; ¿Bit 3 activo?             </span></span>
<span class="line"><span style="color: #002339">res     </span><span style="color: #174781">$03</span><span style="color: #002339">, a                  </span><span style="color: #357B42; font-style: italic">; Desactiva bit 3</span></span>
<span class="line"><span style="color: #002339">jr      z, loop_lostMov         </span><span style="color: #357B42; font-style: italic">; No activo, salta</span></span>
<span class="line"><span style="color: #002339">ld      bc, SoundCountDown      </span><span style="color: #357B42; font-style: italic">; BC = dirección sonido </span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PlayMusic               </span><span style="color: #357B42; font-style: italic">; Emite sonido</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Evaluamos si el bit tres está activo y lo desactivamos. Si no está activo saltamos, si lo está emitimos el sonido de advertencia.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="loop_lostMov:
bit     $01, a                  ; ¿Bit 1 activo?
res     $01, a                  ; Desactiva bit 1
ld      (flags), a              ; Actualiza en memoria
halt                            ; Sincroniza con interrupciones
jr      z, loop_keyCont         ; No activo, salta
ld      hl, TitleLostMovement   ; HL = dirección mov perdido
ld      de, TitleLostMov_name   ; DE = dirección nombre
call    DoMsg                   ; Pinta mensaje
ld      bc, SoundLostMovement   ; BC = dirección sonido
call    PlayMusic               ; Emite sonido
jr      loop_cont               ; Salta
loop_keyCont:" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">loop_lostMov:</span></span>
<span class="line"><span style="color: #002339">bit     </span><span style="color: #174781">$01</span><span style="color: #002339">, a                  </span><span style="color: #357B42; font-style: italic">; ¿Bit 1 activo?</span></span>
<span class="line"><span style="color: #002339">res     </span><span style="color: #174781">$01</span><span style="color: #002339">, a                  </span><span style="color: #357B42; font-style: italic">; Desactiva bit 1</span></span>
<span class="line"><span style="color: #002339">ld      (</span><span style="color: #174781">flags</span><span style="color: #002339">), a              </span><span style="color: #357B42; font-style: italic">; Actualiza en memoria</span></span>
<span class="line"><span style="color: #002339">halt                            </span><span style="color: #357B42; font-style: italic">; Sincroniza con interrupciones</span></span>
<span class="line"><span style="color: #002339">jr      z, loop_keyCont         </span><span style="color: #357B42; font-style: italic">; No activo, salta</span></span>
<span class="line"><span style="color: #002339">ld      hl, TitleLostMovement   </span><span style="color: #357B42; font-style: italic">; HL = dirección mov perdido</span></span>
<span class="line"><span style="color: #002339">ld      de, TitleLostMov_name   </span><span style="color: #357B42; font-style: italic">; DE = dirección nombre</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    DoMsg                   </span><span style="color: #357B42; font-style: italic">; Pinta mensaje</span></span>
<span class="line"><span style="color: #002339">ld      bc, SoundLostMovement   </span><span style="color: #357B42; font-style: italic">; BC = dirección sonido</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PlayMusic               </span><span style="color: #357B42; font-style: italic">; Emite sonido</span></span>
<span class="line"><span style="color: #002339">jr      loop_cont               </span><span style="color: #357B42; font-style: italic">; Salta</span></span>
<span class="line"><span style="color: #7EB233">loop_keyCont:</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Evaluamos si el bit uno está activo, lo desactivamos, actualizamos flags y sincronizamos con las interrupciones. Si no está activo saltamos, si lo está pintamos el mensaje de movimiento perdido y emitimos el sonido. La etiqueta loop_keyCont queda encima de CALL WaitKeyBoard.</p>



<p class="has-medium-font-size wp-block-paragraph">Por último, localizamos loop_cont, borramos JR Loop y añadimos en su lugar las líneas siguientes:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, $01                  ; A = reiniciar cuenta atrás
ld      (flags), a              ; Actualiza flags
jp      Loop                    ; Bucle principal" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$01</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; A = reiniciar cuenta atrás</span></span>
<span class="line"><span style="color: #002339">ld      (</span><span style="color: #174781">flags</span><span style="color: #002339">), a              </span><span style="color: #357B42; font-style: italic">; Actualiza flags</span></span>
<span class="line"><span style="color: #7B30D0">jp</span><span style="color: #002339">      </span><span style="color: #7B30D0">Loop</span><span style="color: #002339">                    </span><span style="color: #357B42; font-style: italic">; Bucle principal</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Actualizamos flags para que la rutina de interrupciones reincie la cuenta atrás. También hemos sustituido JR por JP debido a las líneas que hemos añadido, hacen que JR esté fuera de rango.</p>



<p class="has-medium-font-size wp-block-paragraph">En Screen.asm vamos implementar la rutina que pinta la cuenta atrás.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; ------------------------------------------------------------------------
; Pinta la cuenta atrás.
;
; Altera el valor de los registros AF, BC y HL.
; ------------------------------------------------------------------------
PrintCountDown:
ld      a, INK3         ; A = tinta 3
call    INK             ; Cambia tinta
ld      b, INI_TOP-$0c  ; B = coord Y
ld      c, INI_LEFT     ; C = coord X
call    AT              ; Posiciona cursor
ld      hl, countdown   ; HL = dirección cuenta atrás
call    PrintBCD        ; Pinta cuenta atrás izquierda
ld      c, INI_LEFT-$1e ; C = coord X
call    AT              ; Posiciona cursor
call    PrintBCD        ; Pinta cuenta atrás derecha
ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; ------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Pinta la cuenta atrás.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF, BC y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; ------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">PrintCountDown:</span></span>
<span class="line"><span style="color: #002339">ld      a, INK3         </span><span style="color: #357B42; font-style: italic">; A = tinta 3</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    INK             </span><span style="color: #357B42; font-style: italic">; Cambia tinta</span></span>
<span class="line"><span style="color: #002339">ld      b, INI_TOP-</span><span style="color: #174781">$0c</span><span style="color: #002339">  </span><span style="color: #357B42; font-style: italic">; B = coord Y</span></span>
<span class="line"><span style="color: #002339">ld      c, INI_LEFT     </span><span style="color: #357B42; font-style: italic">; C = coord X</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT              </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #002339">ld      hl, countdown   </span><span style="color: #357B42; font-style: italic">; HL = dirección cuenta atrás</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintBCD        </span><span style="color: #357B42; font-style: italic">; Pinta cuenta atrás izquierda</span></span>
<span class="line"><span style="color: #002339">ld      c, INI_LEFT-</span><span style="color: #174781">$1e</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; C = coord X</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT              </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintBCD        </span><span style="color: #357B42; font-style: italic">; Pinta cuenta atrás derecha</span></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">La cuenta atrás la pintamos en dos posiciones, a la izquierda y la derecha del tablero. Ponemos la tinta en magenta, ponemos el cursor a la izquierda, pintamos la cuenta atrás, ponemos el cursor a la derecha y pintamos la cuenta atrás.</p>



<p class="has-medium-font-size wp-block-paragraph">La rutina de manejo de las interrupciones la implementamos en Int.asm (no incluyáis este archivo en Main.asm). También vamos a ver esta implementación por bloques.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Int.asm
;
; Manejo de interrupciones en modo 2
; -------------------------------------------------------------------
org     $7e5c

; -------------------------------------------------------------------
; Indicadores
;       bit 0   -&gt;  Reiniciar cuenta atrás
;       bit 1   -&gt;  Pierde turno
;       bit 2   -&gt;  Pintar cuenta atrás
;       bit 3   -&gt;  Sonido de advertencia, acaba cuenta atrás
; -------------------------------------------------------------------
FLAGS:      equ $5e88

COUNTDOWN:  equ FLAGS+$01       ; Valor cuenta atrás
SECONDS:    equ FLAGS+$02       ; Segundos por turno" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Int.asm</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Manejo de interrupciones en modo 2</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #002339">org     </span><span style="color: #174781">$7e5c</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Indicadores</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       bit 0   -&gt;  Reiniciar cuenta atrás</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       bit 1   -&gt;  Pierde turno</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       bit 2   -&gt;  Pintar cuenta atrás</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       bit 3   -&gt;  Sonido de advertencia, acaba cuenta atrás</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #174781">FLAGS</span><span style="color: #002339">:      </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$5e88</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">COUNTDOWN:</span><span style="color: #002339">  </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">FLAGS</span><span style="color: #002339">+</span><span style="color: #174781">$01</span><span style="color: #002339">       </span><span style="color: #357B42; font-style: italic">; Valor cuenta atrás</span></span>
<span class="line"><span style="color: #7EB233">SECONDS:</span><span style="color: #002339">    </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">FLAGS</span><span style="color: #002339">+</span><span style="color: #174781">$02</span><span style="color: #002339">       </span><span style="color: #357B42; font-style: italic">; Segundos por turno</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">La rutina de interrupciones carga en la dirección $7E5C. Después añadimos las constantes con las direcciones de memoria que usaremos&nbsp; para el intercambio de información entre Main.asm e Int.asm.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="CountDownISR:
push    af                  
push    bc                  
push    de                  
push    hl                  
push    ix                      ; Preserva registros" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">CountDownISR:</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">    af                  </span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">    bc                  </span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">    de                  </span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">    hl                  </span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">    ix                      </span><span style="color: #357B42; font-style: italic">; Preserva registros</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Preservamos el valor de los registros.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="countDown_flags:
ld      a, (FLAGS)              ; A = flags
and     $01                     ; ¿Reiniciar cuenta atrás?
jr      z, countDown_cont       ; No, salta
ld      a, (SECONDS)            ; A = SECONDS
ld      (COUNTDOWN), a          ; Actualiza en memoria
ld      a, $04                  ; A = pintar cuenta atrás
ld      (FLAGS), a              ; Actualiza en memoria
jr      countDownISR_end        ; Fin" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">countDown_flags:</span></span>
<span class="line"><span style="color: #002339">ld      a, (</span><span style="color: #174781">FLAGS</span><span style="color: #002339">)              </span><span style="color: #357B42; font-style: italic">; A = flags</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$01</span><span style="color: #002339">                     </span><span style="color: #357B42; font-style: italic">; ¿Reiniciar cuenta atrás?</span></span>
<span class="line"><span style="color: #002339">jr      z, countDown_cont       </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #002339">ld      a, (SECONDS)            </span><span style="color: #357B42; font-style: italic">; A = SECONDS</span></span>
<span class="line"><span style="color: #002339">ld      (COUNTDOWN), a          </span><span style="color: #357B42; font-style: italic">; Actualiza en memoria</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$04</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; A = pintar cuenta atrás</span></span>
<span class="line"><span style="color: #002339">ld      (</span><span style="color: #174781">FLAGS</span><span style="color: #002339">), a              </span><span style="color: #357B42; font-style: italic">; Actualiza en memoria</span></span>
<span class="line"><span style="color: #002339">jr      countDownISR_end        </span><span style="color: #357B42; font-style: italic">; Fin</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Comprobamos si desde Main.asm se indica que se debe reiniciar la cuenta atrás (cambio de turno) y salta si no es así. Si hay cambio de turno, reinicia la cuenta atrás al valor especificado en el menú, indica en flags que se debe pintar la cuenta atrás y salta para salir de la rutina.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="countDown_cont:
ld      hl, countDownTicks      ; HL = contador ticks
inc     (hl)                    ; Contador ticks+=1
ld      a, $32                  ; A = 50
cp      (hl)                    ; ¿Contador ticks = 50?
jr      nz, countDownISR_end    ; No, salta.
xor     a                       ; A = 0, Z = 1, Carry = 0
ld      (hl), a                 ; Contador ticks = 0" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">countDown_cont:</span></span>
<span class="line"><span style="color: #002339">ld      hl, countDownTicks      </span><span style="color: #357B42; font-style: italic">; HL = contador ticks</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     (hl)                    </span><span style="color: #357B42; font-style: italic">; Contador ticks+=1</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$32</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; A = 50</span></span>
<span class="line"><span style="color: #002339">cp      (hl)                    </span><span style="color: #357B42; font-style: italic">; ¿Contador ticks = 50?</span></span>
<span class="line"><span style="color: #002339">jr      nz, countDownISR_end    </span><span style="color: #357B42; font-style: italic">; No, salta.</span></span>
<span class="line"><span style="color: #7B30D0">xor</span><span style="color: #002339">     a                       </span><span style="color: #357B42; font-style: italic">; A = 0, Z = 1, Carry = 0</span></span>
<span class="line"><span style="color: #002339">ld      (hl), a                 </span><span style="color: #357B42; font-style: italic">; Contador ticks = 0</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">En countDownTicks vamos sumando uno en cada interrupción, y cuando llegamos a cincuenta es señal de que ha pasado un segundo, lo que comprobamos en este bloque. Si no se ha llegado a cincuenta salta para salir de la rutina, si ha llegado ponemos el contador de ticks a cero y seguimos con la rutina.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; Ha llegado a 50, ha pasado un segundo
ld      a, (COUNTDOWN)          ; A = valor cuenta atrás
dec     a                       ; A-=1
daa                             ; Ajuste decimal
ld      (COUNTDOWN), a          ; Actualiza en memoria
ld      b, $04                  ; B = pintar cuenta atrás / 4 seg	
cp      b                       ; ¿Menos de 4 segundos?
jr      nc, countDownISR_reset  ; A &gt;= 4, salta
set     $03, b                  ; Sonido de advertencia
or      a                       ; ¿A = 0?
jr      nz, countDownISR_reset  ; No, salta
set     $01, b                  ; Pierde turno" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; Ha llegado a 50, ha pasado un segundo</span></span>
<span class="line"><span style="color: #002339">ld      a, (COUNTDOWN)          </span><span style="color: #357B42; font-style: italic">; A = valor cuenta atrás</span></span>
<span class="line"><span style="color: #7B30D0">dec</span><span style="color: #002339">     a                       </span><span style="color: #357B42; font-style: italic">; A-=1</span></span>
<span class="line"><span style="color: #7B30D0">daa</span><span style="color: #002339">                             </span><span style="color: #357B42; font-style: italic">; Ajuste decimal</span></span>
<span class="line"><span style="color: #002339">ld      (COUNTDOWN), a          </span><span style="color: #357B42; font-style: italic">; Actualiza en memoria</span></span>
<span class="line"><span style="color: #002339">ld      b, </span><span style="color: #174781">$04</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; B = pintar cuenta atrás / 4 seg	</span></span>
<span class="line"><span style="color: #002339">cp      b                       </span><span style="color: #357B42; font-style: italic">; ¿Menos de 4 segundos?</span></span>
<span class="line"><span style="color: #002339">jr      nc, countDownISR_reset  </span><span style="color: #357B42; font-style: italic">; A &gt;= 4, salta</span></span>
<span class="line"><span style="color: #002339">set     </span><span style="color: #174781">$03</span><span style="color: #002339">, b                  </span><span style="color: #357B42; font-style: italic">; Sonido de advertencia</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">      a                       </span><span style="color: #357B42; font-style: italic">; ¿A = 0?</span></span>
<span class="line"><span style="color: #002339">jr      nz, countDownISR_reset  </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #002339">set     </span><span style="color: #174781">$01</span><span style="color: #002339">, b                  </span><span style="color: #357B42; font-style: italic">; Pierde turno</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">En el caso de que haya pasado un segundo, calculamos que tipo de información hay que pasar a Main.asm. Restamos un segundo de la cuenta atrás, vemos si está por debajo de cuatro (también comunica a Main.asm que hay que pintar la cuenta atrás), y saltamos si no lo está. Si lo está, activamos el bit para el sonido de la advertencia, evaluamos si la cuenta atrás ha llegado a cero, y saltamos si no lo ha hecho. Activa el bit de perdida de turno si ha llegado a cero.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="countDownISR_reset:
ld      a, b                    ; A = B
ld      (FLAGS), a              ; Actualiza en memoria" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">countDownISR_reset:</span></span>
<span class="line"><span style="color: #002339">ld      a, b                    </span><span style="color: #357B42; font-style: italic">; A = B</span></span>
<span class="line"><span style="color: #002339">ld      (</span><span style="color: #174781">FLAGS</span><span style="color: #002339">), a              </span><span style="color: #357B42; font-style: italic">; Actualiza en memoria</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Actualizamos el valor de flags con la información que hay que pasar a Main.asm.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="countDownISR_end:
pop	ix                      
pop	hl                      
pop	de                      
pop	bc                      
pop	af                          ; Recupera registros
	

ei                              ; Reactiva interrupciones
reti                            ; Sale

countDownTicks: db $00          ; Ticks (50*seg)" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">countDownISR_end:</span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">	ix                      </span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">	hl                      </span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">	de                      </span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">	bc                      </span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">	af                          </span><span style="color: #357B42; font-style: italic">; Recupera registros</span></span>
<span class="line"><span style="color: #002339">	</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ei                              </span><span style="color: #357B42; font-style: italic">; Reactiva interrupciones</span></span>
<span class="line"><span style="color: #002339">reti                            </span><span style="color: #357B42; font-style: italic">; Sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">countDownTicks:</span><span style="color: #002339"> </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">          </span><span style="color: #357B42; font-style: italic">; Ticks (50*seg)</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Recuperamos el valor de los registros, activamos interrupciones y salimos. Por último, declaramos el contador de ticks.</p>



<p class="has-medium-font-size wp-block-paragraph">Recordad que es necesario compilar ahora dos .tap por separado y hacer nuestro propio cargador.</p>



<p class="has-medium-font-size wp-block-paragraph">El cargador Basic es el siguiente:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">VB</span><span role="button" tabindex="0" data-code="10 CLEAR 24200
20 LOAD &quot;&quot;CODE 24200
30 LOAD &quot;&quot;CODE 32348
40 RANDOMIZE USR 24200" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #174781">10</span><span style="color: #002339"> </span><span style="color: #1AB394">CLEAR</span><span style="color: #002339"> </span><span style="color: #174781">24200</span></span>
<span class="line"><span style="color: #174781">20</span><span style="color: #002339"> LOAD </span><span style="color: #A44185">&quot;&quot;</span><span style="color: #002339">CODE </span><span style="color: #174781">24200</span></span>
<span class="line"><span style="color: #174781">30</span><span style="color: #002339"> LOAD </span><span style="color: #A44185">&quot;&quot;</span><span style="color: #002339">CODE </span><span style="color: #174781">32348</span></span>
<span class="line"><span style="color: #174781">40</span><span style="color: #0991B6"> RANDOMIZE </span><span style="color: #002339">USR </span><span style="color: #174781">24200</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">El script para compilar en Windows queda así:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ShellScript</span><span role="button" tabindex="0" data-code="echo off
cls
echo Compilando oxo
pasmo --name TresEnRaya --tap Main.asm oxo.tap oxo.log
echo Compilando int
pasmo --name Int --tap Int.asm int.tap int.log
echo Generando Tres en raya
copy /y /b cargador.tap+oxo.tap+int.tap TresEnRaya.tap
echo Proceso finalizado" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">off</span></span>
<span class="line"><span style="color: #7EB233">cls</span></span>
<span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">Compilando</span><span style="color: #002339"> </span><span style="color: #A44185">oxo</span></span>
<span class="line"><span style="color: #7EB233">pasmo</span><span style="color: #002339"> </span><span style="color: #174781">--name</span><span style="color: #002339"> </span><span style="color: #A44185">TresEnRaya</span><span style="color: #002339"> </span><span style="color: #174781">--tap</span><span style="color: #002339"> </span><span style="color: #A44185">Main.asm</span><span style="color: #002339"> </span><span style="color: #A44185">oxo.tap</span><span style="color: #002339"> </span><span style="color: #A44185">oxo.log</span></span>
<span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">Compilando</span><span style="color: #002339"> </span><span style="color: #A44185">int</span></span>
<span class="line"><span style="color: #7EB233">pasmo</span><span style="color: #002339"> </span><span style="color: #174781">--name</span><span style="color: #002339"> </span><span style="color: #A44185">Int</span><span style="color: #002339"> </span><span style="color: #174781">--tap</span><span style="color: #002339"> </span><span style="color: #A44185">Int.asm</span><span style="color: #002339"> </span><span style="color: #A44185">int.tap</span><span style="color: #002339"> </span><span style="color: #A44185">int.log</span></span>
<span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">Generando</span><span style="color: #002339"> </span><span style="color: #A44185">Tres</span><span style="color: #002339"> </span><span style="color: #A44185">en</span><span style="color: #002339"> </span><span style="color: #A44185">raya</span></span>
<span class="line"><span style="color: #7EB233">copy</span><span style="color: #002339"> </span><span style="color: #A44185">/y</span><span style="color: #002339"> </span><span style="color: #A44185">/b</span><span style="color: #002339"> </span><span style="color: #A44185">cargador.tap+oxo.tap+int.tap</span><span style="color: #002339"> </span><span style="color: #A44185">TresEnRaya.tap</span></span>
<span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">Proceso</span><span style="color: #002339"> </span><span style="color: #A44185">finalizado</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">La versión en Linux queda así:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ShellScript</span><span role="button" tabindex="0" data-code="clear
echo Compilando oxo
pasmo --name TresEnRaya --tap Main.asm oxo.tap oxo.log
echo Compilando int
pasmo --name Int --tap Int.asm int.tap int.log
echo Generando Tres en raya
cat cargador.tap oxo.tap int.tap &gt; TresEnRaya.tap
echo Proceso finalizado" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">clear</span></span>
<span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">Compilando</span><span style="color: #002339"> </span><span style="color: #A44185">oxo</span></span>
<span class="line"><span style="color: #7EB233">pasmo</span><span style="color: #002339"> </span><span style="color: #174781">--name</span><span style="color: #002339"> </span><span style="color: #A44185">TresEnRaya</span><span style="color: #002339"> </span><span style="color: #174781">--tap</span><span style="color: #002339"> </span><span style="color: #A44185">Main.asm</span><span style="color: #002339"> </span><span style="color: #A44185">oxo.tap</span><span style="color: #002339"> </span><span style="color: #A44185">oxo.log</span></span>
<span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">Compilando</span><span style="color: #002339"> </span><span style="color: #A44185">int</span></span>
<span class="line"><span style="color: #7EB233">pasmo</span><span style="color: #002339"> </span><span style="color: #174781">--name</span><span style="color: #002339"> </span><span style="color: #A44185">Int</span><span style="color: #002339"> </span><span style="color: #174781">--tap</span><span style="color: #002339"> </span><span style="color: #A44185">Int.asm</span><span style="color: #002339"> </span><span style="color: #A44185">int.tap</span><span style="color: #002339"> </span><span style="color: #A44185">int.log</span></span>
<span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">Generando</span><span style="color: #002339"> </span><span style="color: #A44185">Tres</span><span style="color: #002339"> </span><span style="color: #A44185">en</span><span style="color: #002339"> </span><span style="color: #A44185">raya</span></span>
<span class="line"><span style="color: #7EB233">cat</span><span style="color: #002339"> </span><span style="color: #A44185">cargador.tap</span><span style="color: #002339"> </span><span style="color: #A44185">oxo.tap</span><span style="color: #002339"> </span><span style="color: #A44185">int.tap</span><span style="color: #002339"> </span><span style="color: #7B30D0">&gt;</span><span style="color: #002339"> </span><span style="color: #A44185">TresEnRaya.tap</span></span>
<span class="line"><span style="color: #1AB394">echo</span><span style="color: #002339"> </span><span style="color: #A44185">Proceso</span><span style="color: #002339"> </span><span style="color: #A44185">finalizado</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y comprobamos que se pinta la cuenta atrás, suena una alarma al bajar de cuatro segundos y pierde el turno al llegar a cero. También veremos el mensaje de perdida de turno.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af49317c19b3&quot;}" data-wp-interactive="core/image" data-wp-key="6af49317c19b3" class="wp-block-image size-full wp-lightbox-container"><img data-recalc-dims="1" loading="lazy" decoding="async" width="703" height="607" data-attachment-id="3763" data-permalink="https://espamatica.com/paso04_05/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso04_05.png?fit=703%2C607&amp;ssl=1" data-orig-size="703,607" data-comments-opened="1" data-image-title="Cuenta atrás" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador ZX Spectrum &amp;#8211; cuenta atrás&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso04_05.png?fit=703%2C607&amp;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso04_05.png?resize=703%2C607&#038;ssl=1" alt="Ensamblador ZX Spectrum - cuenta atrás" class="wp-image-3763" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso04_05.png?w=703&amp;ssl=1 703w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso04_05.png?resize=300%2C259&amp;ssl=1 300w" sizes="auto, (max-width: 703px) 100vw, 703px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Ensamblador ZX Spectrum &#8211; cuenta atrás</figcaption></figure>



<h2 id="fin-de-partida" class="wp-block-heading">Fin de partida</h2>



<p class="has-medium-font-size wp-block-paragraph">Para finalizar el capítulo vamos a implementar el fin de partida, que se da cuando uno de los jugadores llega a los puntos definidos en el menú, o se llega al máximo tablas.</p>



<p class="has-medium-font-size wp-block-paragraph">Al acabar la partida se pregunta si queremos otra; añadimos las teclas de la respuesta como constantes en Var.asm. También añadimos el número máximo de tablas.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="KEYN:           equ $4e ; Tecla N
KEYn:           equ $6e ; Tecla n
KEYS:           equ $53 ; Tecla S
KEYs:           equ $73 ; Tecla s
MAXTIES:        equ $05 ; Numero máximo tablas" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">KEYN:</span><span style="color: #002339">           </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$4e</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tecla N</span></span>
<span class="line"><span style="color: #7EB233">KEYn:</span><span style="color: #002339">           </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$6e</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tecla n</span></span>
<span class="line"><span style="color: #7EB233">KEYS:</span><span style="color: #002339">           </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$53</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tecla S</span></span>
<span class="line"><span style="color: #7EB233">KEYs:</span><span style="color: #002339">           </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$73</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tecla s</span></span>
<span class="line"><span style="color: #7EB233">MAXTIES:</span><span style="color: #002339">        </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$05</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Numero máximo tablas</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Dependiendo de si se opta o no por jugar otra partida, se saltará a un lugar u otro de Main.asm. Localizamos la etiqueta Init y después de CALL GetPlayersName añadimos la siguiente etiqueta:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="Start:" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">Start:</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Localizamos la etiqueta loop_reset y justo debajo de ella vamos a implementar la verificación de si alguien gana la partida.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="call    PrintPoints             ; Pinta los puntos
ld      a, (MaxPoints)          ; A = máximo puntos
ld      b, a                    ; B = A
ld      a, (Points_p1)          ; A = puntos jugador 1
cp      b                       ; ¿Jugador 1 gana?
jr      z, EndPlay              ; Sí, salta 
ld      a, (Points_p2)          ; A = puntos jugador 2
cp      b                       ; ¿Jugador 2 gana?
jr      z, EndPlay              ; Sí, salta
ld      b, MAXTIES              ; B = máximo tablas
ld      a, (Points_tie)         ; A = puntos tablas
cp      b                       ; ¿A = B?
jr      z, EndPlay              ; Sí, salta" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintPoints             </span><span style="color: #357B42; font-style: italic">; Pinta los puntos</span></span>
<span class="line"><span style="color: #002339">ld      a, (MaxPoints)          </span><span style="color: #357B42; font-style: italic">; A = máximo puntos</span></span>
<span class="line"><span style="color: #002339">ld      b, a                    </span><span style="color: #357B42; font-style: italic">; B = A</span></span>
<span class="line"><span style="color: #002339">ld      a, (Points_p1)          </span><span style="color: #357B42; font-style: italic">; A = puntos jugador 1</span></span>
<span class="line"><span style="color: #002339">cp      b                       </span><span style="color: #357B42; font-style: italic">; ¿Jugador 1 gana?</span></span>
<span class="line"><span style="color: #002339">jr      z, EndPlay              </span><span style="color: #357B42; font-style: italic">; Sí, salta </span></span>
<span class="line"><span style="color: #002339">ld      a, (Points_p2)          </span><span style="color: #357B42; font-style: italic">; A = puntos jugador 2</span></span>
<span class="line"><span style="color: #002339">cp      b                       </span><span style="color: #357B42; font-style: italic">; ¿Jugador 2 gana?</span></span>
<span class="line"><span style="color: #002339">jr      z, EndPlay              </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld      b, MAXTIES              </span><span style="color: #357B42; font-style: italic">; B = máximo tablas</span></span>
<span class="line"><span style="color: #002339">ld      a, (Points_tie)         </span><span style="color: #357B42; font-style: italic">; A = puntos tablas</span></span>
<span class="line"><span style="color: #002339">cp      b                       </span><span style="color: #357B42; font-style: italic">; ¿A = B?</span></span>
<span class="line"><span style="color: #002339">jr      z, EndPlay              </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Pintamos los puntos y comparamos los puntos de los jugadores con el máximo de puntos definidos. Si alguno de los jugadores tiene los puntos necesarios, gana la partida.</p>



<p class="has-medium-font-size wp-block-paragraph">Al final de Main.asm, antes de los include, añadimos la rutina del fin partida.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="EndPlay:
di                              ; Desactiva interrupciones
im      $01                     ; Interrupciones en modo 1
ei                              ; Activa interrupciones
ld      hl, TitleGameOver       ; HL = título game over
call    PrintMsg                ; Pinta el mensaje
endPlay_waitKey:
call    WaitKeyAlpha            ; Espera tecla
cp      KEYN                    ; ¿Pulsada N?
jp      z, Menu                 ; Sí, menú
cp      KEYn                    ; ¿Pulsada n?
jp      z, Menu                 ; Sí, menú
cp      KEYS                    ; ¿Pulsada S?
jp      z, Start                ; Sí, inicio
cp      KEYs                    ; ¿Pulsada s?
jp      z, Start                ; Sí, inicio
jr      endPlay_waitKey         ; No pulsadas, bucle" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">EndPlay:</span></span>
<span class="line"><span style="color: #174781">di</span><span style="color: #002339">                              </span><span style="color: #357B42; font-style: italic">; Desactiva interrupciones</span></span>
<span class="line"><span style="color: #002339">im      </span><span style="color: #174781">$01</span><span style="color: #002339">                     </span><span style="color: #357B42; font-style: italic">; Interrupciones en modo 1</span></span>
<span class="line"><span style="color: #002339">ei                              </span><span style="color: #357B42; font-style: italic">; Activa interrupciones</span></span>
<span class="line"><span style="color: #002339">ld      hl, TitleGameOver       </span><span style="color: #357B42; font-style: italic">; HL = título game over</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintMsg                </span><span style="color: #357B42; font-style: italic">; Pinta el mensaje</span></span>
<span class="line"><span style="color: #7EB233">endPlay_waitKey:</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    WaitKeyAlpha            </span><span style="color: #357B42; font-style: italic">; Espera tecla</span></span>
<span class="line"><span style="color: #002339">cp      KEYN                    </span><span style="color: #357B42; font-style: italic">; ¿Pulsada N?</span></span>
<span class="line"><span style="color: #7B30D0">jp</span><span style="color: #002339">      z, Menu                 </span><span style="color: #357B42; font-style: italic">; Sí, menú</span></span>
<span class="line"><span style="color: #002339">cp      KEYn                    </span><span style="color: #357B42; font-style: italic">; ¿Pulsada n?</span></span>
<span class="line"><span style="color: #7B30D0">jp</span><span style="color: #002339">      z, Menu                 </span><span style="color: #357B42; font-style: italic">; Sí, menú</span></span>
<span class="line"><span style="color: #002339">cp      KEYS                    </span><span style="color: #357B42; font-style: italic">; ¿Pulsada S?</span></span>
<span class="line"><span style="color: #7B30D0">jp</span><span style="color: #002339">      z, Start                </span><span style="color: #357B42; font-style: italic">; Sí, inicio</span></span>
<span class="line"><span style="color: #002339">cp      KEYs                    </span><span style="color: #357B42; font-style: italic">; ¿Pulsada s?</span></span>
<span class="line"><span style="color: #7B30D0">jp</span><span style="color: #002339">      z, Start                </span><span style="color: #357B42; font-style: italic">; Sí, inicio</span></span>
<span class="line"><span style="color: #002339">jr      endPlay_waitKey         </span><span style="color: #357B42; font-style: italic">; No pulsadas, bucle</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Desactivamos interrupciones, pasamos a modo uno, activamos interrupciones, esperamos a que se responda a la pregunta, y según la respuesta saltamos a un sitio u otro.</p>



<ul class="wp-block-list">
<li class="has-medium-font-size">Menu: volvemos al menú principal. Podemos volver a seleccionar las distintas opciones e introducir nuevos nombres de jugadores.</li>



<li class="has-medium-font-size">Start: es la etiqueta que hemos añadido. Limpia la pantalla, la pinta, reinicia los datos de la partida y pasa las interrupciones a modo dos.</li>
</ul>



<p class="has-medium-font-size wp-block-paragraph">Si no se ha pulsado ninguna de las teclas esperadas, bucle hasta que se pulse alguna.</p>



<p class="has-medium-font-size wp-block-paragraph">Si vais a la etiqueta Menu veréis que las tres primeras líneas son para pasar a modo uno de interrupciones, cosa que también hacemos en EndPlay. Borrad las tres líneas que están debajo de la etiqueta Menu.</p>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y vemos los resultados. Todo parece funcionar correctamente, pero al finalizar la partida la puntuación se muestra parpadeando. Esto lo arrastramos desde el principio, aunque no nos hayamos percatado hasta ahora.</p>



<p class="has-medium-font-size wp-block-paragraph">Para cambiar el comportamiento, localizamos PrintPoints dentro de Screen.asm, y justo debajo añadimos las líneas necesarias para desactivar el parpadeo.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, (ATTR_T)     ; A = atributos temporales
and     $7f             ; Quita parpadeo 
ld      (ATTR_T), a     ; Actualiza en memoria" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, (ATTR_T)     </span><span style="color: #357B42; font-style: italic">; A = atributos temporales</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$7f</span><span style="color: #002339">             </span><span style="color: #357B42; font-style: italic">; Quita parpadeo </span></span>
<span class="line"><span style="color: #002339">ld      (ATTR_T), a     </span><span style="color: #357B42; font-style: italic">; Actualiza en memoria</span></span></code></pre></div>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af49317c418f&quot;}" data-wp-interactive="core/image" data-wp-key="6af49317c418f" class="wp-block-image size-full wp-lightbox-container"><img data-recalc-dims="1" loading="lazy" decoding="async" width="702" height="609" data-attachment-id="3772" data-permalink="https://espamatica.com/paso04_06/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso04_06.png?fit=702%2C609&amp;ssl=1" data-orig-size="702,609" data-comments-opened="1" data-image-title="Paso04_06" data-image-description="&lt;p&gt;Ensamblador ZX Spectrum &amp;#8211; fin de partida&lt;/p&gt;
" data-image-caption="&lt;p&gt;Fin de partida&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso04_06.png?fit=702%2C609&amp;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso04_06.png?resize=702%2C609&#038;ssl=1" alt="Ensamblador ZX Spectrum - fin de partida" class="wp-image-3772" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso04_06.png?w=702&amp;ssl=1 702w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso04_06.png?resize=300%2C260&amp;ssl=1 300w" sizes="auto, (max-width: 702px) 100vw, 702px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Fin de partida</figcaption></figure>



<h2 id="ensamblador-zx-spectrum-conclusion" class="wp-block-heading has-large-font-size">Ensamblador ZX Spectrum, conclusión</h2>



<p class="has-medium-font-size wp-block-paragraph">En este capítulo hemos añadido un menú de inicio con distintas opciones, hemos implementado el inicio de la partida y el fin de la partida, y hemos utilizado las interrupciones para limitar el tiempo que tiene cada jugador para realizar el movimiento. Llegados aquí, podemos jugar las primeras partidas completas a dos jugadores.</p>



<p class="has-medium-font-size wp-block-paragraph">¿Queréis jugar contra el Spectrum y ganarle? Lo implementamos en el siguiente capítulo.</p>



<p class="has-medium-font-size wp-block-paragraph">Todo el código que hemos generado lo podéis descargar desde&nbsp;<a href="https://espamatica.com/wp-content/uploads/2023/04/OXO_0x04.zip">aquí</a>.</p>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<h2 class="wp-block-heading has-large-font-size">Enlaces de interés</h2>



<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://notepad-plus-plus.org/" target="_blank" rel="noreferrer noopener nofollow">Notepad++</a></li>



<li class="has-medium-font-size"><a href="https://code.visualstudio.com/" target="_blank" rel="noreferrer noopener nofollow">Visual Studio Code</a></li>



<li class="has-medium-font-size"><a href="https://www.sublimetext.com/" target="_blank" rel="noreferrer noopener nofollow">Sublime Text</a></li>



<li class="has-medium-font-size"><a href="https://github.com/chernandezba/zesarux" target="_blank" rel="noreferrer noopener nofollow">ZEsarUX</a></li>



<li class="has-medium-font-size"><a href="https://pasmo.speccy.org/" target="_blank" rel="noreferrer noopener nofollow">PASMO</a></li>



<li class="has-medium-font-size"><a href="https://git-scm.com/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Instalaci%C3%B3n-de-Git" target="_blank" rel="noreferrer noopener nofollow">Git</a></li>



<li class="has-medium-font-size"><a href="https://wiki.speccy.org/cursos/ensamblador/indice" target="_blank" rel="noreferrer noopener nofollow">Curso de ensamblador Z80 de Compiler Software</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/wp-content/uploads/2021/10/00-Referencia-Z80.zip">Referencia Z80</a></li>



<li class="has-medium-font-size"><a href="https://t.me/EnsambladorZXSpectrum" target="_blank" rel="noreferrer noopener nofollow">Ensamblador Z80 en Telegram</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/wp-content/uploads/2023/05/Espamatica.zip">Archivo .dsk con los juegos de los tutoriales</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x0f-ensamblador-zx-spectrum-marciano-depuracion/">Personalización y depuración con ZEsarUX</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/wp-content/uploads/2023/06/Ensamblador-para-ZX-Spectrum-OXO.zip">Tutorial completo en formato PDF y EPUB</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.itch.io/tres-en-raya" rel="nofollow noopener" target="_blank">El proyecto en itch.io</a></li>
</ul>
</div>



<p class="has-background has-medium-font-size wp-block-paragraph" style="background-color:#cdd6dd">Ensamblador para ZX Spectrum OXO por&nbsp;<a href="https://espamatica.com/">Juan Antonio Rubio García</a>.<br>Esta obra está bajo licencia de&nbsp;<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank" rel="noreferrer noopener nofollow">Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License</a>.</p>



<div align="center">
<a href="http://www.safecreative.org/work/2306054511935" rel="nofollow noopener" target="_blank"><img decoding="async" src="https://resources.safecreative.org:443/work-creativity-declaration/2306054511935/label/declaration-1-human-real-300" style="border:0;" title="null"/></a>
</div>
<br><br>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<p class="has-medium-font-size wp-block-paragraph">También puedes visitar el resto de tutoriales:</p>



<ul class="wp-block-list">
<li class="has-medium-font-size">.Net
<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://espamatica.com/mediatime/">MediaTime</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/nullabledatetimepicker/">NullableDateTimePicker</a></li>
</ul>
</li>



<li class="has-medium-font-size">Z80
<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://espamatica.com/entorno-de-desarrollo-para-ensamblador-z80/">Entorno de desarrollo</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/numeros-bcd-spectrum/">Números BCD</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/posiciones-de-pantalla-zx-spectrum/">Pantalla ZX Spectrum</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/ensamblador-zx-spectrum-pong-introduccion/">Pong</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x00-ensamblador-zx-spectrum-marciano-introduccion/">Batalla Espacial</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x01-ensamblador-zx-spectrum-oxo-tablero-de-juego/">Tres en raya</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/uso-de-beepfx/">Uso de BeepFX</a></li>
</ul>
</li>
</ul>
</div>



<p class="has-medium-font-size wp-block-paragraph">Y recuerda, si lo usas no te limites a copiarlo, intenta entenderlo y adaptarlo a tus necesidades.</p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://espamatica.com/0x04-ensamblador-zx-spectrum-oxo-opciones/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3730</post-id>	</item>
		<item>
		<title>0x03 Ensamblador ZX Spectrum OXO &#8211; sonido</title>
		<link>https://espamatica.com/0x03-ensamblador-zx-spectrum-oxo-sonido/</link>
					<comments>https://espamatica.com/0x03-ensamblador-zx-spectrum-oxo-sonido/#respond</comments>
		
		<dc:creator><![CDATA[Juan Antonio Rubio García]]></dc:creator>
		<pubDate>Fri, 12 May 2023 07:00:00 +0000</pubDate>
				<category><![CDATA[ZX Spectrum]]></category>
		<category><![CDATA[Ensamblador Z80]]></category>
		<category><![CDATA[Retro]]></category>
		<category><![CDATA[Ensamblador]]></category>
		<category><![CDATA[Tres en raya]]></category>
		<category><![CDATA[Z80]]></category>
		<guid isPermaLink="false">https://espamatica.com/?p=3719</guid>

					<description><![CDATA[En esta entrega de Ensamblador ZX Spectrum OXO vamos a implementar distintos sonidos, y los vamos a usar para temporizar]]></description>
										<content:encoded><![CDATA[
<p class="has-medium-font-size wp-block-paragraph">En esta entrega de Ensamblador ZX Spectrum OXO vamos a implementar distintos sonidos, y los vamos a usar para temporizar haciendo pausas entre distintos eventos.</p>


<div role="navigation" aria-label="Tabla de contenidos" class="simpletoc wp-block-simpletoc-toc"><h2 class="simpletoc-title">Tabla de contenidos</h2>
<ul class="simpletoc-list">
<li><a href="#sonidos">Sonidos</a>
</li>
<li><a href="#rutina-musical">Rutina musical</a>
</li>
<li><a href="#main">Main</a>
</li>
<li><a href="#ensamblador-zx-spectrum-conclusion">Ensamblador ZX Spectrum, conclusión</a>
</li>
<li><a href="#enlaces-de-interes">Enlaces de interés</a>
</li></ul></div>


<h2 id="sonidos" class="wp-block-heading has-large-font-size">Sonidos</h2>



<p class="has-medium-font-size wp-block-paragraph">Creamos el archivo Sound.asm y añadimos el include en Main.asm.</p>



<p class="has-medium-font-size wp-block-paragraph">En Sound.asm vamos añadir la definición de los distintos sonidos y melodías.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Sonidos.
;
; Los sonidos acaban en $00, byte que indica el final.
; -------------------------------------------------------------------
; Cuenta atrás
SoundCountDown:
db $03, $8c, $3a, $00

; Error
SoundError:
db $0d, $c6, $1e, $16, $13, $13, $00

; Perdida de movimiento
SoundLostMovement:	
db $0d, $07, $10, $0b, $96, $12, $0a, $4d, $14
db $0b, $96, $12, $1a, $2c, $08, $00

; Siguiente jugador
SoundNextPlayer:
db $01, $9d, $7b, $00

; Movimiento Spectrum
SoundSpectrum:
db $06, $6e, $20, $06, $6e, $20, $05, $b7, $24
db $06, $6e, $20, $05, $13, $29, $05, $b7, $24
db $06, $6e, $20, $00

; Tablas
SoundTie:
db $0d, $07, $10, $0b, $96, $12, $06, $d4, $1e
db $0b, $96, $12, $07, $a6, $1b, $0b, $96, $12
db $08, $a5, $18, $0b, $96, $12, $09, $b4, $15
db $0b, $96, $12, $0a, $4d, $14, $0b, $96, $12
db $0d, $07, $10, $00

; Punto
SoundWinGame:
db $06, $6e, $20, $05, $13, $29, $04, $40, $30
db $06, $6e, $20, $05, $13, $29, $04, $40, $30
db $06, $6e, $20, $05, $13, $29, $04, $c7, $2b
db $05, $13, $29, $05, $b7, $24, $05, $13, $29
db $06, $6e, $20, $05, $13, $29, $04, $40, $30
db $06, $6e, $20, $05, $13, $29, $04, $40, $30
db $06, $6e, $20, $05, $13, $29, $04, $c7, $2b
db $05, $13, $29, $05, $b7, $24, $06, $6e, $20
db $00" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Sonidos.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Los sonidos acaban en $00, byte que indica el final.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Cuenta atrás</span></span>
<span class="line"><span style="color: #7EB233">SoundCountDown:</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$03</span><span style="color: #002339">, </span><span style="color: #174781">$8c</span><span style="color: #002339">, </span><span style="color: #174781">$3a</span><span style="color: #002339">, </span><span style="color: #174781">$00</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Error</span></span>
<span class="line"><span style="color: #7EB233">SoundError:</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$0d</span><span style="color: #002339">, $c6, </span><span style="color: #174781">$1e</span><span style="color: #002339">, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$00</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Perdida de movimiento</span></span>
<span class="line"><span style="color: #7EB233">SoundLostMovement:</span><span style="color: #002339">	</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$0d</span><span style="color: #002339">, </span><span style="color: #174781">$07</span><span style="color: #002339">, </span><span style="color: #174781">$10</span><span style="color: #002339">, </span><span style="color: #174781">$0b</span><span style="color: #002339">, </span><span style="color: #174781">$96</span><span style="color: #002339">, </span><span style="color: #174781">$12</span><span style="color: #002339">, </span><span style="color: #174781">$0a</span><span style="color: #002339">, </span><span style="color: #174781">$4d</span><span style="color: #002339">, </span><span style="color: #174781">$14</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$0b</span><span style="color: #002339">, </span><span style="color: #174781">$96</span><span style="color: #002339">, </span><span style="color: #174781">$12</span><span style="color: #002339">, </span><span style="color: #174781">$1a</span><span style="color: #002339">, </span><span style="color: #174781">$2c</span><span style="color: #002339">, </span><span style="color: #174781">$08</span><span style="color: #002339">, </span><span style="color: #174781">$00</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Siguiente jugador</span></span>
<span class="line"><span style="color: #7EB233">SoundNextPlayer:</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$01</span><span style="color: #002339">, </span><span style="color: #174781">$9d</span><span style="color: #002339">, </span><span style="color: #174781">$7b</span><span style="color: #002339">, </span><span style="color: #174781">$00</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Movimiento Spectrum</span></span>
<span class="line"><span style="color: #7EB233">SoundSpectrum:</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$06</span><span style="color: #002339">, </span><span style="color: #174781">$6e</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$06</span><span style="color: #002339">, </span><span style="color: #174781">$6e</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$05</span><span style="color: #002339">, $b7, </span><span style="color: #174781">$24</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$06</span><span style="color: #002339">, </span><span style="color: #174781">$6e</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$05</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$29</span><span style="color: #002339">, </span><span style="color: #174781">$05</span><span style="color: #002339">, $b7, </span><span style="color: #174781">$24</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$06</span><span style="color: #002339">, </span><span style="color: #174781">$6e</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$00</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Tablas</span></span>
<span class="line"><span style="color: #7EB233">SoundTie:</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$0d</span><span style="color: #002339">, </span><span style="color: #174781">$07</span><span style="color: #002339">, </span><span style="color: #174781">$10</span><span style="color: #002339">, </span><span style="color: #174781">$0b</span><span style="color: #002339">, </span><span style="color: #174781">$96</span><span style="color: #002339">, </span><span style="color: #174781">$12</span><span style="color: #002339">, </span><span style="color: #174781">$06</span><span style="color: #002339">, $d4, </span><span style="color: #174781">$1e</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$0b</span><span style="color: #002339">, </span><span style="color: #174781">$96</span><span style="color: #002339">, </span><span style="color: #174781">$12</span><span style="color: #002339">, </span><span style="color: #174781">$07</span><span style="color: #002339">, $a6, </span><span style="color: #174781">$1b</span><span style="color: #002339">, </span><span style="color: #174781">$0b</span><span style="color: #002339">, </span><span style="color: #174781">$96</span><span style="color: #002339">, </span><span style="color: #174781">$12</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$08</span><span style="color: #002339">, $a5, </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$0b</span><span style="color: #002339">, </span><span style="color: #174781">$96</span><span style="color: #002339">, </span><span style="color: #174781">$12</span><span style="color: #002339">, </span><span style="color: #174781">$09</span><span style="color: #002339">, $b4, </span><span style="color: #174781">$15</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$0b</span><span style="color: #002339">, </span><span style="color: #174781">$96</span><span style="color: #002339">, </span><span style="color: #174781">$12</span><span style="color: #002339">, </span><span style="color: #174781">$0a</span><span style="color: #002339">, </span><span style="color: #174781">$4d</span><span style="color: #002339">, </span><span style="color: #174781">$14</span><span style="color: #002339">, </span><span style="color: #174781">$0b</span><span style="color: #002339">, </span><span style="color: #174781">$96</span><span style="color: #002339">, </span><span style="color: #174781">$12</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$0d</span><span style="color: #002339">, </span><span style="color: #174781">$07</span><span style="color: #002339">, </span><span style="color: #174781">$10</span><span style="color: #002339">, </span><span style="color: #174781">$00</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Punto</span></span>
<span class="line"><span style="color: #7EB233">SoundWinGame:</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$06</span><span style="color: #002339">, </span><span style="color: #174781">$6e</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$05</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$29</span><span style="color: #002339">, </span><span style="color: #174781">$04</span><span style="color: #002339">, </span><span style="color: #174781">$40</span><span style="color: #002339">, </span><span style="color: #174781">$30</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$06</span><span style="color: #002339">, </span><span style="color: #174781">$6e</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$05</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$29</span><span style="color: #002339">, </span><span style="color: #174781">$04</span><span style="color: #002339">, </span><span style="color: #174781">$40</span><span style="color: #002339">, </span><span style="color: #174781">$30</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$06</span><span style="color: #002339">, </span><span style="color: #174781">$6e</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$05</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$29</span><span style="color: #002339">, </span><span style="color: #174781">$04</span><span style="color: #002339">, $c7, </span><span style="color: #174781">$2b</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$05</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$29</span><span style="color: #002339">, </span><span style="color: #174781">$05</span><span style="color: #002339">, $b7, </span><span style="color: #174781">$24</span><span style="color: #002339">, </span><span style="color: #174781">$05</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$29</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$06</span><span style="color: #002339">, </span><span style="color: #174781">$6e</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$05</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$29</span><span style="color: #002339">, </span><span style="color: #174781">$04</span><span style="color: #002339">, </span><span style="color: #174781">$40</span><span style="color: #002339">, </span><span style="color: #174781">$30</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$06</span><span style="color: #002339">, </span><span style="color: #174781">$6e</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$05</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$29</span><span style="color: #002339">, </span><span style="color: #174781">$04</span><span style="color: #002339">, </span><span style="color: #174781">$40</span><span style="color: #002339">, </span><span style="color: #174781">$30</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$06</span><span style="color: #002339">, </span><span style="color: #174781">$6e</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$05</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$29</span><span style="color: #002339">, </span><span style="color: #174781">$04</span><span style="color: #002339">, $c7, </span><span style="color: #174781">$2b</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$05</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$29</span><span style="color: #002339">, </span><span style="color: #174781">$05</span><span style="color: #002339">, $b7, </span><span style="color: #174781">$24</span><span style="color: #002339">, </span><span style="color: #174781">$06</span><span style="color: #002339">, </span><span style="color: #174781">$6e</span><span style="color: #002339">, </span><span style="color: #174781">$20</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Todos los sonidos tienen como último byte cero, que vamos a usar en la rutina que los reproduce para saber cuando se acaban.</p>



<p class="has-medium-font-size wp-block-paragraph">En estas definiciones cada nota está compuesta por tres bytes en lugar de cuatro, los dos primeros son la nota y el tercero el byte bajo de la duración, siendo todas fusas y/o semifusas.</p>



<h2 id="rutina-musical" class="wp-block-heading has-large-font-size">Rutina musical</h2>



<p class="has-medium-font-size wp-block-paragraph">Implementamos la rutina que reproduce los sonidos.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Reproduce una melodía o sonido.
;
; Entrada: BC = Dirección de inicio de la melodía.
;
; Para ahorrar se hace byte a byte, siendo la duración siempre fusa o
; semifusa; sólo se necesita un byte para la duración.
; Esta rutina está adaptada para este funcionamiento.
; -------------------------------------------------------------------
PlayMusic:
push    af
push    bc
push    de
push    hl
push    ix                  ; Preserva registros

playMusic_loop:
ld      a, (bc)             ; A = byte alto nota
ld      h, a                ; H = A
or      a                   ; ¿A = 0?
jr      z, playMusic_end    ; A = 0, fin

inc     bc                  ; BC = siguiente valor
ld      a, (bc)             ; A = byte bajo nota
ld      l, a                ; L = A

inc     bc                  ; BC = siguiente valor
ld      a, (bc)             ; A = duración nota
ld      e, a                ; E = A
ld      d, $00              ; D = 0 (fusa o semifusa)
inc     bc                  ; BC = siguiente valor

push    bc                  ; Preserva BC
call    BEEPER              ; Reproduce nota
pop     bc                  ; Recupera BC

jr      playMusic_loop      ; Bucle hasta que llegue al 0
                            ; fin melodía

playMusic_end:
pop     ix
pop     hl
pop     de
pop     bc
pop     af              ; Recupera registros
ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Reproduce una melodía o sonido.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: BC = Dirección de inicio de la melodía.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Para ahorrar se hace byte a byte, siendo la duración siempre fusa o</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; semifusa; sólo se necesita un byte para la duración.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Esta rutina está adaptada para este funcionamiento.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">PlayMusic:</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">    af</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">    bc</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">    de</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">    hl</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">    ix                  </span><span style="color: #357B42; font-style: italic">; Preserva registros</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">playMusic_loop:</span></span>
<span class="line"><span style="color: #002339">ld      a, (bc)             </span><span style="color: #357B42; font-style: italic">; A = byte alto nota</span></span>
<span class="line"><span style="color: #002339">ld      h, a                </span><span style="color: #357B42; font-style: italic">; H = A</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">      a                   </span><span style="color: #357B42; font-style: italic">; ¿A = 0?</span></span>
<span class="line"><span style="color: #002339">jr      z, playMusic_end    </span><span style="color: #357B42; font-style: italic">; A = 0, fin</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     bc                  </span><span style="color: #357B42; font-style: italic">; BC = siguiente valor</span></span>
<span class="line"><span style="color: #002339">ld      a, (bc)             </span><span style="color: #357B42; font-style: italic">; A = byte bajo nota</span></span>
<span class="line"><span style="color: #002339">ld      l, a                </span><span style="color: #357B42; font-style: italic">; L = A</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     bc                  </span><span style="color: #357B42; font-style: italic">; BC = siguiente valor</span></span>
<span class="line"><span style="color: #002339">ld      a, (bc)             </span><span style="color: #357B42; font-style: italic">; A = duración nota</span></span>
<span class="line"><span style="color: #002339">ld      e, a                </span><span style="color: #357B42; font-style: italic">; E = A</span></span>
<span class="line"><span style="color: #002339">ld      d, </span><span style="color: #174781">$00</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; D = 0 (fusa o semifusa)</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     bc                  </span><span style="color: #357B42; font-style: italic">; BC = siguiente valor</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">    bc                  </span><span style="color: #357B42; font-style: italic">; Preserva BC</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    BEEPER              </span><span style="color: #357B42; font-style: italic">; Reproduce nota</span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">     bc                  </span><span style="color: #357B42; font-style: italic">; Recupera BC</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">jr      playMusic_loop      </span><span style="color: #357B42; font-style: italic">; Bucle hasta que llegue al 0</span></span>
<span class="line"><span style="color: #002339">                            </span><span style="color: #357B42; font-style: italic">; fin melodía</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">playMusic_end:</span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">     ix</span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">     hl</span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">     de</span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">     bc</span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">     af              </span><span style="color: #357B42; font-style: italic">; Recupera registros</span></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">PlayMusic recibe en BC la dirección del sonido a emitir, carga la nota en HL, la duración en DE, la emite y sigue en bucle hasta que se llegue al byte cero, que marca el fin del sonido. Sólo usa un byte para la duración, siendo D siempre cero.</p>



<p class="has-medium-font-size wp-block-paragraph">En Main.asm vamos a incluir las llamadas necesarias para que se emitan los sonidos.</p>



<p class="has-medium-font-size wp-block-paragraph">Localizamos la etiqueta Loop y borramos desde LD B, $19 hasta DJNZ loop_wait, ya que vamos a temportizar con el sonido. Más abajo, tras CALL PrintPoints, añadimos el sonido de siguiente jugador:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      bc, SoundNextPlayer
call    PlayMusic" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      bc, SoundNextPlayer</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PlayMusic</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Localizamos la etiqueta loop_print y justo por encima la línea JR Loop. Encima de esta línea añadimos el sonido de error:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      bc, SoundError
call    PlayMusic" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      bc, SoundError</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PlayMusic</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Localizamos la etiqueta loop_win y justo por debajo la línea INC (HL). Debajo de esta línea añadimos el sonido de ganador de punto:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      bc, SoundWinGame
call    PlayMusic" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      bc, SoundWinGame</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PlayMusic</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Localizamos la etiqueta loop_reset y justo por encima añadimos el sonido de tablas.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      bc, SoundTie
call    PlayMusic" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      bc, SoundTie</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PlayMusic</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y oímos cada uno de los sonidos.</p>



<h2 id="main" class="wp-block-heading has-large-font-size">Main</h2>



<p class="has-medium-font-size wp-block-paragraph">El tamaño de Main.asm ha crecido considerablemente desde que empezamos, por lo que es hora de ver el aspecto que debe tener una vez comentado.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="org     $5e88                   ; Dirección de carga

Main:
ld      hl, Sprite_P1           ; HL = dirección Sprite_P1
ld      (UDG), hl               ; UDG = dirección Sprite_p1
ld      a, $02                  ; A = 2
call    OPENCHAN                ; Abre canal 2

xor     a                       ; A = 0, Z = 0, C = 0
call    BORDER                  ; Cambia borde
call    CLA                     ; Cambia atributos pantalla
call    CLS                     ; Borra pantalla

Init:
call    PrintBoard              ; Pinta tablero

ld      hl, Name_p1             ; HL = nombre jugador 1
ld      de, player1_name        ; DE = nombre jugador 1
ld      bc, LENNAME             ; BC = longitud nombre
ldir                            ; Pasa datos
ld      hl, Name_p2             ; HL = nombre jugador 2
ld      de, player2_name        ; DE = nombre jugador 2
ld      bc, LENNAME             ; BC = longitud nombre
ldir                            ; Pasa datos
call    PrintInfo               ; Pinta info

ld      bc, LENDATA             ; BC = longitud datos partida
call    ResetValues             ; Limpia datos

Loop:
ld      hl, TitleTurn           ; HL = dirección turno
ld      de, TitleTurn_name      ; DE = dirección nombre en turno
call    DoMsg                   ; Compone y pinta turno
call    PrintPoints             ; Pinta puntos
ld      bc, SoundNextPlayer     ; BC = dirección sonido
call    PlayMusic               ; Emite sonido
loop_key:
call    WaitKeyBoard            ; Espera pulsación tecla
ld      a, c                    ; A = C
cp      KEY0                    ; ¿Pulsada tecla?
jr      z, loop_key             ; No, bucle
call    ToMove                  ; Comprueba movimiento
jr      z, loop_print           ; Correcto, salta
ld      hl, TitleError          ; HL = dirección error
call    PrintMsg                ; Pinta error
ld      bc, SoundError          ; BC = dirección sonido
call    PlayMusic               ; Emite sonido
jr      Loop                    ; Bucle principal
loop_print:
call    PrintOXO                ; Pinta ficha
loop_checkWinner:
call    ChekcWinner             ; ¿Algún ganador?
jr      nz, loop_tie            ; No, comprueba tablas
call    PrintWinnerLine         ; Pinta línea ganadora
ld      hl, TitlePointFor       ; HL = dirección ganador
ld      de, TitlePointName      ; HL = dirección nombre ganador
call    DoMsg                   ; Compone y pinta ganador
ld      hl, Points_p1           ; HL = dirección puntos jugador 1
ld      a, (PlayerMoves)        ; A = jugador que ha movido
or      a                       ; ¿Jugador 1?
jr      z, loop_win             ; Sí, salta
inc     hl                      ; HL = dirección puntos jugador 2
loop_win:
inc    (hl)                     ; Incrementa puntuación
ld      bc, SoundWinGame        ; BC = dirección sonido
call    PlayMusic               ; Emite sonido
jr      loop_reset              ; Salta
loop_tie:
ld      hl, MoveCounter         ; HL = dirección contador movimientos
inc     (hl)                    ; Incrementa contador
ld      a, $09                  ; A = 9
cp      (hl)                    ; ¿Contador = 9?
jr      nz, loop_cont           ; No, salta
ld      hl, Points_tie          ; HL = dirección puntos tablas
inc     (hl)                    ; Incrementa puntuación
ld      hl, TitleTie            ; HL = dirección tablas
call    PrintMsg                ; Pinta tablas
ld      bc, SoundTie            ; BC = dirección sonido
call    PlayMusic               ; Emite sonido
loop_reset:
ld      bc, LENDATA-$04         ; BC = longitud datos limpiar
call    ResetValues             ; Limpia datos
call    PrintBoard              ; Pinta tablero
loop_cont:
ld      a, (PlayerMoves)        ; A = jugador que ha movido
xor     $01                     ; A = jugador siguiente
ld      (PlayerMoves), a        ; Actualiza en memoria
jr      Loop                    ; Bucle principal

include &quot;Game.asm&quot;
include &quot;Rom.asm&quot;
include &quot;Screen.asm&quot;
include &quot;Sprite.asm&quot;
include &quot;Sound.asm&quot;
include &quot;Var.asm&quot;

end     Main" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">org     </span><span style="color: #174781">$5e88</span><span style="color: #002339">                   </span><span style="color: #357B42; font-style: italic">; Dirección de carga</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">Main:</span></span>
<span class="line"><span style="color: #002339">ld      hl, Sprite_P1           </span><span style="color: #357B42; font-style: italic">; HL = dirección Sprite_P1</span></span>
<span class="line"><span style="color: #002339">ld      (UDG), hl               </span><span style="color: #357B42; font-style: italic">; UDG = dirección Sprite_p1</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$02</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; A = 2</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    OPENCHAN                </span><span style="color: #357B42; font-style: italic">; Abre canal 2</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">xor</span><span style="color: #002339">     a                       </span><span style="color: #357B42; font-style: italic">; A = 0, Z = 0, C = 0</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    BORDER                  </span><span style="color: #357B42; font-style: italic">; Cambia borde</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    CLA                     </span><span style="color: #357B42; font-style: italic">; Cambia atributos pantalla</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    CLS                     </span><span style="color: #357B42; font-style: italic">; Borra pantalla</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">Init:</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintBoard              </span><span style="color: #357B42; font-style: italic">; Pinta tablero</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      hl, Name_p1             </span><span style="color: #357B42; font-style: italic">; HL = nombre jugador 1</span></span>
<span class="line"><span style="color: #002339">ld      de, player1_name        </span><span style="color: #357B42; font-style: italic">; DE = nombre jugador 1</span></span>
<span class="line"><span style="color: #002339">ld      bc, LENNAME             </span><span style="color: #357B42; font-style: italic">; BC = longitud nombre</span></span>
<span class="line"><span style="color: #002339">ldir                            </span><span style="color: #357B42; font-style: italic">; Pasa datos</span></span>
<span class="line"><span style="color: #002339">ld      hl, Name_p2             </span><span style="color: #357B42; font-style: italic">; HL = nombre jugador 2</span></span>
<span class="line"><span style="color: #002339">ld      de, player2_name        </span><span style="color: #357B42; font-style: italic">; DE = nombre jugador 2</span></span>
<span class="line"><span style="color: #002339">ld      bc, LENNAME             </span><span style="color: #357B42; font-style: italic">; BC = longitud nombre</span></span>
<span class="line"><span style="color: #002339">ldir                            </span><span style="color: #357B42; font-style: italic">; Pasa datos</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintInfo               </span><span style="color: #357B42; font-style: italic">; Pinta info</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      bc, LENDATA             </span><span style="color: #357B42; font-style: italic">; BC = longitud datos partida</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ResetValues             </span><span style="color: #357B42; font-style: italic">; Limpia datos</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">Loop</span><span style="color: #002339">:</span></span>
<span class="line"><span style="color: #002339">ld      hl, TitleTurn           </span><span style="color: #357B42; font-style: italic">; HL = dirección turno</span></span>
<span class="line"><span style="color: #002339">ld      de, TitleTurn_name      </span><span style="color: #357B42; font-style: italic">; DE = dirección nombre en turno</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    DoMsg                   </span><span style="color: #357B42; font-style: italic">; Compone y pinta turno</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintPoints             </span><span style="color: #357B42; font-style: italic">; Pinta puntos</span></span>
<span class="line"><span style="color: #002339">ld      bc, SoundNextPlayer     </span><span style="color: #357B42; font-style: italic">; BC = dirección sonido</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PlayMusic               </span><span style="color: #357B42; font-style: italic">; Emite sonido</span></span>
<span class="line"><span style="color: #7EB233">loop_key:</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    WaitKeyBoard            </span><span style="color: #357B42; font-style: italic">; Espera pulsación tecla</span></span>
<span class="line"><span style="color: #002339">ld      a, c                    </span><span style="color: #357B42; font-style: italic">; A = C</span></span>
<span class="line"><span style="color: #002339">cp      KEY0                    </span><span style="color: #357B42; font-style: italic">; ¿Pulsada tecla?</span></span>
<span class="line"><span style="color: #002339">jr      z, loop_key             </span><span style="color: #357B42; font-style: italic">; No, bucle</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove                  </span><span style="color: #357B42; font-style: italic">; Comprueba movimiento</span></span>
<span class="line"><span style="color: #002339">jr      z, loop_print           </span><span style="color: #357B42; font-style: italic">; Correcto, salta</span></span>
<span class="line"><span style="color: #002339">ld      hl, TitleError          </span><span style="color: #357B42; font-style: italic">; HL = dirección error</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintMsg                </span><span style="color: #357B42; font-style: italic">; Pinta error</span></span>
<span class="line"><span style="color: #002339">ld      bc, SoundError          </span><span style="color: #357B42; font-style: italic">; BC = dirección sonido</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PlayMusic               </span><span style="color: #357B42; font-style: italic">; Emite sonido</span></span>
<span class="line"><span style="color: #002339">jr      </span><span style="color: #7B30D0">Loop</span><span style="color: #002339">                    </span><span style="color: #357B42; font-style: italic">; Bucle principal</span></span>
<span class="line"><span style="color: #7EB233">loop_print:</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintOXO                </span><span style="color: #357B42; font-style: italic">; Pinta ficha</span></span>
<span class="line"><span style="color: #7EB233">loop_checkWinner:</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ChekcWinner             </span><span style="color: #357B42; font-style: italic">; ¿Algún ganador?</span></span>
<span class="line"><span style="color: #002339">jr      nz, loop_tie            </span><span style="color: #357B42; font-style: italic">; No, comprueba tablas</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintWinnerLine         </span><span style="color: #357B42; font-style: italic">; Pinta línea ganadora</span></span>
<span class="line"><span style="color: #002339">ld      hl, TitlePointFor       </span><span style="color: #357B42; font-style: italic">; HL = dirección ganador</span></span>
<span class="line"><span style="color: #002339">ld      de, TitlePointName      </span><span style="color: #357B42; font-style: italic">; HL = dirección nombre ganador</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    DoMsg                   </span><span style="color: #357B42; font-style: italic">; Compone y pinta ganador</span></span>
<span class="line"><span style="color: #002339">ld      hl, Points_p1           </span><span style="color: #357B42; font-style: italic">; HL = dirección puntos jugador 1</span></span>
<span class="line"><span style="color: #002339">ld      a, (PlayerMoves)        </span><span style="color: #357B42; font-style: italic">; A = jugador que ha movido</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">      a                       </span><span style="color: #357B42; font-style: italic">; ¿Jugador 1?</span></span>
<span class="line"><span style="color: #002339">jr      z, loop_win             </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                      </span><span style="color: #357B42; font-style: italic">; HL = dirección puntos jugador 2</span></span>
<span class="line"><span style="color: #7EB233">loop_win:</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">    (hl)                     </span><span style="color: #357B42; font-style: italic">; Incrementa puntuación</span></span>
<span class="line"><span style="color: #002339">ld      bc, SoundWinGame        </span><span style="color: #357B42; font-style: italic">; BC = dirección sonido</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PlayMusic               </span><span style="color: #357B42; font-style: italic">; Emite sonido</span></span>
<span class="line"><span style="color: #002339">jr      loop_reset              </span><span style="color: #357B42; font-style: italic">; Salta</span></span>
<span class="line"><span style="color: #7EB233">loop_tie:</span></span>
<span class="line"><span style="color: #002339">ld      hl, MoveCounter         </span><span style="color: #357B42; font-style: italic">; HL = dirección contador movimientos</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     (hl)                    </span><span style="color: #357B42; font-style: italic">; Incrementa contador</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$09</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; A = 9</span></span>
<span class="line"><span style="color: #002339">cp      (hl)                    </span><span style="color: #357B42; font-style: italic">; ¿Contador = 9?</span></span>
<span class="line"><span style="color: #002339">jr      nz, loop_cont           </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #002339">ld      hl, Points_tie          </span><span style="color: #357B42; font-style: italic">; HL = dirección puntos tablas</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     (hl)                    </span><span style="color: #357B42; font-style: italic">; Incrementa puntuación</span></span>
<span class="line"><span style="color: #002339">ld      hl, TitleTie            </span><span style="color: #357B42; font-style: italic">; HL = dirección tablas</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintMsg                </span><span style="color: #357B42; font-style: italic">; Pinta tablas</span></span>
<span class="line"><span style="color: #002339">ld      bc, SoundTie            </span><span style="color: #357B42; font-style: italic">; BC = dirección sonido</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PlayMusic               </span><span style="color: #357B42; font-style: italic">; Emite sonido</span></span>
<span class="line"><span style="color: #7EB233">loop_reset:</span></span>
<span class="line"><span style="color: #002339">ld      bc, LENDATA-</span><span style="color: #174781">$04</span><span style="color: #002339">         </span><span style="color: #357B42; font-style: italic">; BC = longitud datos limpiar</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ResetValues             </span><span style="color: #357B42; font-style: italic">; Limpia datos</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintBoard              </span><span style="color: #357B42; font-style: italic">; Pinta tablero</span></span>
<span class="line"><span style="color: #7EB233">loop_cont:</span></span>
<span class="line"><span style="color: #002339">ld      a, (PlayerMoves)        </span><span style="color: #357B42; font-style: italic">; A = jugador que ha movido</span></span>
<span class="line"><span style="color: #7B30D0">xor</span><span style="color: #002339">     </span><span style="color: #174781">$01</span><span style="color: #002339">                     </span><span style="color: #357B42; font-style: italic">; A = jugador siguiente</span></span>
<span class="line"><span style="color: #002339">ld      (PlayerMoves), a        </span><span style="color: #357B42; font-style: italic">; Actualiza en memoria</span></span>
<span class="line"><span style="color: #002339">jr      </span><span style="color: #7B30D0">Loop</span><span style="color: #002339">                    </span><span style="color: #357B42; font-style: italic">; Bucle principal</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">include &quot;Game.asm&quot;</span></span>
<span class="line"><span style="color: #002339">include &quot;Rom.asm&quot;</span></span>
<span class="line"><span style="color: #002339">include &quot;Screen.asm&quot;</span></span>
<span class="line"><span style="color: #002339">include &quot;Sprite.asm&quot;</span></span>
<span class="line"><span style="color: #002339">include &quot;Sound.asm&quot;</span></span>
<span class="line"><span style="color: #002339">include &quot;Var.asm&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">end     Main</span></span></code></pre></div>



<h2 id="ensamblador-zx-spectrum-conclusion" class="wp-block-heading has-large-font-size">Ensamblador ZX Spectrum, conclusión</h2>



<p class="has-medium-font-size wp-block-paragraph">Tenemos desarrollado y funcional gran parte del juego. Podemos jugar nuestras primeras partidas con amigos y/o familiares, y tenemos sonido.</p>



<p class="has-medium-font-size wp-block-paragraph">En el próximo capítulo implementaremos las distintas opciones de la partida, y el fin de la misma.</p>



<p class="has-medium-font-size wp-block-paragraph">Todo el código que hemos generado lo podéis descargar desde&nbsp;<a href="https://espamatica.com/wp-content/uploads/2023/04/OXO_0x03.zip">aquí</a>.</p>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<h2 class="wp-block-heading has-large-font-size">Enlaces de interés</h2>



<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://notepad-plus-plus.org/" target="_blank" rel="noreferrer noopener nofollow">Notepad++</a></li>



<li class="has-medium-font-size"><a href="https://code.visualstudio.com/" target="_blank" rel="noreferrer noopener nofollow">Visual Studio Code</a></li>



<li class="has-medium-font-size"><a href="https://www.sublimetext.com/" target="_blank" rel="noreferrer noopener nofollow">Sublime Text</a></li>



<li class="has-medium-font-size"><a href="https://github.com/chernandezba/zesarux" target="_blank" rel="noreferrer noopener nofollow">ZEsarUX</a></li>



<li class="has-medium-font-size"><a href="https://pasmo.speccy.org/" target="_blank" rel="noreferrer noopener nofollow">PASMO</a></li>



<li class="has-medium-font-size"><a href="https://git-scm.com/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Instalaci%C3%B3n-de-Git" target="_blank" rel="noreferrer noopener nofollow">Git</a></li>



<li class="has-medium-font-size"><a href="https://wiki.speccy.org/cursos/ensamblador/indice" target="_blank" rel="noreferrer noopener nofollow">Curso de ensamblador Z80 de Compiler Software</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/wp-content/uploads/2021/10/00-Referencia-Z80.zip">Referencia Z80</a></li>



<li class="has-medium-font-size"><a href="https://t.me/EnsambladorZXSpectrum" target="_blank" rel="noreferrer noopener nofollow">Ensamblador Z80 en Telegram</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/wp-content/uploads/2023/05/Espamatica.zip">Archivo .dsk con los juegos de los tutoriales</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x0f-ensamblador-zx-spectrum-marciano-depuracion/">Personalización y depuración con ZEsarUX</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/wp-content/uploads/2023/06/Ensamblador-para-ZX-Spectrum-OXO.zip">Tutorial completo en formato PDF y EPUB</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.itch.io/tres-en-raya" rel="nofollow noopener" target="_blank">El proyecto en itch.io</a></li>
</ul>
</div>



<p class="has-background has-medium-font-size wp-block-paragraph" style="background-color:#cdd6dd">Ensamblador para ZX Spectrum OXO por&nbsp;<a href="https://espamatica.com/">Juan Antonio Rubio García</a>.<br>Esta obra está bajo licencia de&nbsp;<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank" rel="noreferrer noopener nofollow">Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License</a>.</p>



<div align="center">
<a href="http://www.safecreative.org/work/2306054511935" rel="nofollow noopener" target="_blank"><img decoding="async" src="https://resources.safecreative.org:443/work-creativity-declaration/2306054511935/label/declaration-1-human-real-300" style="border:0;" title="null"/></a>
</div>
<br><br>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<p class="has-medium-font-size wp-block-paragraph">También puedes visitar el resto de tutoriales:</p>



<ul class="wp-block-list">
<li class="has-medium-font-size">.Net
<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://espamatica.com/mediatime/">MediaTime</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/nullabledatetimepicker/">NullableDateTimePicker</a></li>
</ul>
</li>



<li class="has-medium-font-size">Z80
<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://espamatica.com/entorno-de-desarrollo-para-ensamblador-z80/">Entorno de desarrollo</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/numeros-bcd-spectrum/">Números BCD</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/posiciones-de-pantalla-zx-spectrum/">Pantalla ZX Spectrum</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/ensamblador-zx-spectrum-pong-introduccion/">Pong</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x00-ensamblador-zx-spectrum-marciano-introduccion/">Batalla Espacial</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x01-ensamblador-zx-spectrum-oxo-tablero-de-juego/">Tres en raya</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/uso-de-beepfx/">Uso de BeepFX</a></li>
</ul>
</li>
</ul>
</div>



<p class="has-medium-font-size wp-block-paragraph">Y recuerda, si lo usas no te limites a copiarlo, intenta entenderlo y adaptarlo a tus necesidades.</p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://espamatica.com/0x03-ensamblador-zx-spectrum-oxo-sonido/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3719</post-id>	</item>
		<item>
		<title>0x02 Ensamblador ZX Spectrum OXO &#8211; marcadores y partida a dos</title>
		<link>https://espamatica.com/0x02-ensamblador-zx-spectrum-oxo-marcadores/</link>
					<comments>https://espamatica.com/0x02-ensamblador-zx-spectrum-oxo-marcadores/#respond</comments>
		
		<dc:creator><![CDATA[Juan Antonio Rubio García]]></dc:creator>
		<pubDate>Fri, 05 May 2023 07:00:00 +0000</pubDate>
				<category><![CDATA[ZX Spectrum]]></category>
		<category><![CDATA[Ensamblador Z80]]></category>
		<category><![CDATA[Retro]]></category>
		<category><![CDATA[Ensamblador]]></category>
		<category><![CDATA[Tres en raya]]></category>
		<category><![CDATA[Z80]]></category>
		<guid isPermaLink="false">https://espamatica.com/?p=3652</guid>

					<description><![CDATA[El siguiente paso de Ensamblador ZX Spectrum OXO es implementar los marcadores y la partida a dos jugadores, teniendo así]]></description>
										<content:encoded><![CDATA[
<p class="has-medium-font-size wp-block-paragraph">El siguiente paso de Ensamblador ZX Spectrum OXO es implementar los marcadores y la partida a dos jugadores, teniendo así gran parte del programa desarrollado.</p>


<div role="navigation" aria-label="Tabla de contenidos" class="simpletoc wp-block-simpletoc-toc"><h2 class="simpletoc-title">Tabla de contenidos</h2>
<ul class="simpletoc-list">
<li><a href="#informacion">Información</a>
</li>
<li><a href="#partida-a-dos">Partida a dos</a>

<ul>
<li><a href="#reinicio-del-tablero">Reinicio del tablero</a>
</li>
<li><a href="#mensajes-de-informacion">Mensajes de información</a>
</li>
<li><a href="#comprobacion-de-tablas">Comprobación de tablas</a>
</li>
<li><a href="#comprobacion-de-tres-en-raya">Comprobación de tres en raya</a>
</li>
<li><a href="#actualizacion-del-marcador">Actualización del marcador</a>
</li>
</ul>
</li>
<li><a href="#ensamblador-zx-spectrum-conclusion">Ensamblador ZX Spectrum, conclusión</a>
</li>
<li><a href="#enlaces-de-interes">Enlaces de interés</a>
</li></ul></div>


<h2 id="informacion" class="wp-block-heading has-large-font-size">Información</h2>



<p class="has-medium-font-size wp-block-paragraph">En primer lugar añadiremos el nombre del programa, jugadores, marcadores y la ficha que mueven. </p>



<p class="has-medium-font-size wp-block-paragraph">Agregamos en Var.asm los datos necesarios.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="LENNAME:            equ $0c ; Longitud nombre jugadores

; Información
Info:               db $10, $07, $16, $00, $05, &quot;Tres en raya a &quot;
info_points:        db &quot;5 punto&quot;
info_gt1:           db &quot;s&quot;

player1_title:      db $10, $05, $16, $02, $00
player1_name:       defs LENNAME, &quot; &quot;
player1_figure:     db $16, $04, $00, $90, $91, $0d, $91, $90

player_tie:         db $10, $02, $16, $02, $0d, &quot;Tablas&quot;

player2_title:      db $10, $06, $16, $02, $14
player2_name:       defs LENNAME, &quot; &quot;
player2_figure:     db $16, $04, $1b, $92, $93, $16, $05, $1b
                    db $94, $95, $ff

; Títulos
TitleTurn:          db $16, $15, $05, $13, $01
                    db &quot;Turno para &quot;
TitleTurn_name:     defs LENNAME, &quot; &quot;
                    db $ff
TitleError:         db $10, $02, $16, $15, $09, $12, $01, $13, $01
                    defm &quot;Casilla ocupada&quot;, $ff
TitleEspamatica:    defm &quot;Espamatica 2019&quot;, $ff
TitleGameOver:      db $10, $07, $16, $15, $03, $12, $01, $13, $01
                    defm &quot;Partida finalizada. Otra?&quot;, $ff
TitleLostMovement:  db $10, $02, $12, $01, $13, $01, $16, $15, $05
                    defm &quot;Pierde turno &quot;
TitleLostMov_name:  defs LENNAME, &quot; &quot;
                    db $ff
TitleOptionStart:   defm &quot;0. Empezar&quot;, $ff
TitleOptionPlayer:  defm &quot;1. Jugadores&quot;, $ff
TitleOptionPoint:   defm &quot;2. Puntos&quot;, $ff
TitleOptionTime:    defm &quot;3. Tiempo&quot;, $ff
TitlePlayerName:    defm &quot;Nombre jugador &quot;
TitlePlayerNumber:  db &quot; : &quot;, $ff
TitlePointFor:      db $10, $07, $16, $15, $05, $12, $01, $13, $01
                    defm &quot;Punto para &quot;
TitlePointName:     defs LENNAME, &quot; &quot;
                    db $ff
TitleTie:           db $10, $07, $16, $15, $0d, $12, $01, $13, $01
                    defm &quot;Tablas&quot;, $ff

; -------------------------------------------------------------------
; Desarrollo de la partida.
; -------------------------------------------------------------------
; Casillas del tablero. Un byte por casilla, del 1 al 9.
; Bit 0, casilla ocupada por jugador 1.
; Bit 4, casilla ocupada por jugador 2.
Grid:               db $00, $00, $00, $00, $00, $00, $00, $00, $00
; Posiciones de las fichas en el tablero, 2 bytes por ficha X, Y
GridPos:            db POS1_LEFT, POS1_TOP  ; 1
                    db POS2_LEFT, POS1_TOP  ; 2
                    db POS3_LEFT, POS1_TOP  ; 3
                    db POS1_LEFT, POS2_TOP  ; 4
                    db POS2_LEFT, POS2_TOP  ; 5
                    db POS3_LEFT, POS2_TOP  ; 6
                    db POS1_LEFT, POS3_TOP  ; 7
                    db POS2_LEFT, POS3_TOP  ; 8
                    db POS3_LEFT, POS3_TOP  ; 9

Points_p1:          db $00                  ; Puntos jugador 1
Points_p2:          db $00                  ; Puntos jugador 2
Points_tie:         db $00                  ; Puntos tablas
PlayerMoves:        db $00                  ; Jugador que mueve

MaxPlayers:         db $01                  ; Máximo jugadores
MaxPoints:          db $05                  ; Máximo puntos
MaxSeconds:         db $10                  ; Máximo seguntos

Name_p1:            db &quot;Amstrad CPC &quot;       ; Nombre jugador 1
Name_p2:            db &quot;ZX Spectrum &quot;       ; Nombre jugador 2
Name_p2Default:     db &quot;ZX Spectrum &quot;       ; Nombre por defecto" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">LENNAME:</span><span style="color: #002339">            </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$0c</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Longitud nombre jugadores</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Información</span></span>
<span class="line"><span style="color: #7EB233">Info:</span><span style="color: #002339">               </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, </span><span style="color: #174781">$07</span><span style="color: #002339">, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$05</span><span style="color: #002339">, &quot;Tres en raya a &quot;</span></span>
<span class="line"><span style="color: #7EB233">info_points:</span><span style="color: #002339">        </span><span style="color: #0991B6">db</span><span style="color: #002339"> &quot;</span><span style="color: #174781">5</span><span style="color: #002339"> punto&quot;</span></span>
<span class="line"><span style="color: #7EB233">info_gt1:</span><span style="color: #002339">           </span><span style="color: #0991B6">db</span><span style="color: #002339"> &quot;s&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">player1_title:</span><span style="color: #002339">      </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, </span><span style="color: #174781">$05</span><span style="color: #002339">, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$02</span><span style="color: #002339">, </span><span style="color: #174781">$00</span></span>
<span class="line"><span style="color: #7EB233">player1_name:</span><span style="color: #002339">       defs LENNAME, &quot; &quot;</span></span>
<span class="line"><span style="color: #7EB233">player1_figure:</span><span style="color: #002339">     </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$04</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$90</span><span style="color: #002339">, </span><span style="color: #174781">$91</span><span style="color: #002339">, </span><span style="color: #174781">$0d</span><span style="color: #002339">, </span><span style="color: #174781">$91</span><span style="color: #002339">, </span><span style="color: #174781">$90</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">player_tie:</span><span style="color: #002339">         </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, </span><span style="color: #174781">$02</span><span style="color: #002339">, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$02</span><span style="color: #002339">, </span><span style="color: #174781">$0d</span><span style="color: #002339">, &quot;Tablas&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">player2_title:</span><span style="color: #002339">      </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, </span><span style="color: #174781">$06</span><span style="color: #002339">, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$02</span><span style="color: #002339">, </span><span style="color: #174781">$14</span></span>
<span class="line"><span style="color: #7EB233">player2_name:</span><span style="color: #002339">       defs LENNAME, &quot; &quot;</span></span>
<span class="line"><span style="color: #7EB233">player2_figure:</span><span style="color: #002339">     </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$04</span><span style="color: #002339">, </span><span style="color: #174781">$1b</span><span style="color: #002339">, </span><span style="color: #174781">$92</span><span style="color: #002339">, </span><span style="color: #174781">$93</span><span style="color: #002339">, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$05</span><span style="color: #002339">, </span><span style="color: #174781">$1b</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$94</span><span style="color: #002339">, </span><span style="color: #174781">$95</span><span style="color: #002339">, $ff</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Títulos</span></span>
<span class="line"><span style="color: #7EB233">TitleTurn:</span><span style="color: #002339">          </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$15</span><span style="color: #002339">, </span><span style="color: #174781">$05</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$01</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> &quot;Turno para &quot;</span></span>
<span class="line"><span style="color: #7EB233">TitleTurn_name:</span><span style="color: #002339">     defs LENNAME, &quot; &quot;</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> $ff</span></span>
<span class="line"><span style="color: #7EB233">TitleError:</span><span style="color: #002339">         </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, </span><span style="color: #174781">$02</span><span style="color: #002339">, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$15</span><span style="color: #002339">, </span><span style="color: #174781">$09</span><span style="color: #002339">, </span><span style="color: #174781">$12</span><span style="color: #002339">, </span><span style="color: #174781">$01</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$01</span></span>
<span class="line"><span style="color: #002339">                    defm &quot;Casilla ocupada&quot;, $ff</span></span>
<span class="line"><span style="color: #7EB233">TitleEspamatica:</span><span style="color: #002339">    defm &quot;Espamatica </span><span style="color: #174781">2019</span><span style="color: #002339">&quot;, $ff</span></span>
<span class="line"><span style="color: #7EB233">TitleGameOver:</span><span style="color: #002339">      </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, </span><span style="color: #174781">$07</span><span style="color: #002339">, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$15</span><span style="color: #002339">, </span><span style="color: #174781">$03</span><span style="color: #002339">, </span><span style="color: #174781">$12</span><span style="color: #002339">, </span><span style="color: #174781">$01</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$01</span></span>
<span class="line"><span style="color: #002339">                    defm &quot;Partida finalizada. Otra?&quot;, $ff</span></span>
<span class="line"><span style="color: #7EB233">TitleLostMovement:</span><span style="color: #002339">  </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, </span><span style="color: #174781">$02</span><span style="color: #002339">, </span><span style="color: #174781">$12</span><span style="color: #002339">, </span><span style="color: #174781">$01</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$01</span><span style="color: #002339">, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$15</span><span style="color: #002339">, </span><span style="color: #174781">$05</span></span>
<span class="line"><span style="color: #002339">                    defm &quot;Pierde turno &quot;</span></span>
<span class="line"><span style="color: #7EB233">TitleLostMov_name:</span><span style="color: #002339">  defs LENNAME, &quot; &quot;</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> $ff</span></span>
<span class="line"><span style="color: #7EB233">TitleOptionStart:</span><span style="color: #002339">   defm &quot;</span><span style="color: #174781">0.</span><span style="color: #002339"> Empezar&quot;, $ff</span></span>
<span class="line"><span style="color: #7EB233">TitleOptionPlayer:</span><span style="color: #002339">  defm &quot;</span><span style="color: #174781">1.</span><span style="color: #002339"> Jugadores&quot;, $ff</span></span>
<span class="line"><span style="color: #7EB233">TitleOptionPoint:</span><span style="color: #002339">   defm &quot;</span><span style="color: #174781">2.</span><span style="color: #002339"> Puntos&quot;, $ff</span></span>
<span class="line"><span style="color: #7EB233">TitleOptionTime:</span><span style="color: #002339">    defm &quot;</span><span style="color: #174781">3.</span><span style="color: #002339"> Tiempo&quot;, $ff</span></span>
<span class="line"><span style="color: #7EB233">TitlePlayerName:</span><span style="color: #002339">    defm &quot;Nombre jugador &quot;</span></span>
<span class="line"><span style="color: #7EB233">TitlePlayerNumber:</span><span style="color: #002339">  </span><span style="color: #0991B6">db</span><span style="color: #002339"> &quot; : &quot;, $ff</span></span>
<span class="line"><span style="color: #7EB233">TitlePointFor:</span><span style="color: #002339">      </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, </span><span style="color: #174781">$07</span><span style="color: #002339">, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$15</span><span style="color: #002339">, </span><span style="color: #174781">$05</span><span style="color: #002339">, </span><span style="color: #174781">$12</span><span style="color: #002339">, </span><span style="color: #174781">$01</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$01</span></span>
<span class="line"><span style="color: #002339">                    defm &quot;Punto para &quot;</span></span>
<span class="line"><span style="color: #7EB233">TitlePointName:</span><span style="color: #002339">     defs LENNAME, &quot; &quot;</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> $ff</span></span>
<span class="line"><span style="color: #7EB233">TitleTie:</span><span style="color: #002339">           </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, </span><span style="color: #174781">$07</span><span style="color: #002339">, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$15</span><span style="color: #002339">, </span><span style="color: #174781">$0d</span><span style="color: #002339">, </span><span style="color: #174781">$12</span><span style="color: #002339">, </span><span style="color: #174781">$01</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$01</span></span>
<span class="line"><span style="color: #002339">                    defm &quot;Tablas&quot;, $ff</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Desarrollo de la partida.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Casillas del tablero. Un byte por casilla, del 1 al 9.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Bit 0, casilla ocupada por jugador 1.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Bit 4, casilla ocupada por jugador 2.</span></span>
<span class="line"><span style="color: #7EB233">Grid:</span><span style="color: #002339">               </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Posiciones de las fichas en el tablero, 2 bytes por ficha X, Y</span></span>
<span class="line"><span style="color: #7EB233">GridPos:</span><span style="color: #002339">            </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS1_LEFT, POS1_TOP  </span><span style="color: #357B42; font-style: italic">; 1</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS2_LEFT, POS1_TOP  </span><span style="color: #357B42; font-style: italic">; 2</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS3_LEFT, POS1_TOP  </span><span style="color: #357B42; font-style: italic">; 3</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS1_LEFT, POS2_TOP  </span><span style="color: #357B42; font-style: italic">; 4</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS2_LEFT, POS2_TOP  </span><span style="color: #357B42; font-style: italic">; 5</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS3_LEFT, POS2_TOP  </span><span style="color: #357B42; font-style: italic">; 6</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS1_LEFT, POS3_TOP  </span><span style="color: #357B42; font-style: italic">; 7</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS2_LEFT, POS3_TOP  </span><span style="color: #357B42; font-style: italic">; 8</span></span>
<span class="line"><span style="color: #002339">                    </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS3_LEFT, POS3_TOP  </span><span style="color: #357B42; font-style: italic">; 9</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">Points_p1:</span><span style="color: #002339">          </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Puntos jugador 1</span></span>
<span class="line"><span style="color: #7EB233">Points_p2:</span><span style="color: #002339">          </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Puntos jugador 2</span></span>
<span class="line"><span style="color: #7EB233">Points_tie:</span><span style="color: #002339">         </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Puntos tablas</span></span>
<span class="line"><span style="color: #7EB233">PlayerMoves:</span><span style="color: #002339">        </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Jugador que mueve</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">MaxPlayers:</span><span style="color: #002339">         </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$01</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Máximo jugadores</span></span>
<span class="line"><span style="color: #7EB233">MaxPoints:</span><span style="color: #002339">          </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$05</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Máximo puntos</span></span>
<span class="line"><span style="color: #7EB233">MaxSeconds:</span><span style="color: #002339">         </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Máximo seguntos</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">Name_p1:</span><span style="color: #002339">            </span><span style="color: #0991B6">db</span><span style="color: #002339"> &quot;Amstrad CPC &quot;       </span><span style="color: #357B42; font-style: italic">; Nombre jugador 1</span></span>
<span class="line"><span style="color: #7EB233">Name_p2:</span><span style="color: #002339">            </span><span style="color: #0991B6">db</span><span style="color: #002339"> &quot;ZX Spectrum &quot;       </span><span style="color: #357B42; font-style: italic">; Nombre jugador 2</span></span>
<span class="line"><span style="color: #7EB233">Name_p2Default:</span><span style="color: #002339">     </span><span style="color: #0991B6">db</span><span style="color: #002339"> &quot;ZX Spectrum &quot;       </span><span style="color: #357B42; font-style: italic">; Nombre por defecto</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">En la etiqueta Info definimos los literales que se van a mostrar en la parte superior de la pantalla. Aunque lo veáis raro, la división que se hace en varias etiquetas se debe a que hay valores que cambian por la selección que hagan los jugadores:</p>



<ul class="wp-block-list">
<li class="has-medium-font-size">Puntos necesarios para ganar la partida.</li>



<li class="has-medium-font-size">Si son más de un punto, se pone en plural.</li>



<li class="has-medium-font-size">Nombre de los jugadores.</li>
</ul>



<p class="has-medium-font-size wp-block-paragraph">También se definen las etiquetas que vamos a usar para llevar la cuenta de la puntuación de cada jugador y sus nombres.</p>



<p class="has-medium-font-size wp-block-paragraph">Vamos a Screen.asm e implementamos una rutina para pintar la información y otra para pintar la puntuación.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Pinta la información de la partida.
;
; Altera el valor de HL.
; -------------------------------------------------------------------
PrintInfo:
ld      hl, Info        ; HL = información
jp      PrintString     ; La pinta" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Pinta la información de la partida.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">PrintInfo:</span></span>
<span class="line"><span style="color: #002339">ld      hl, Info        </span><span style="color: #357B42; font-style: italic">; HL = información</span></span>
<span class="line"><span style="color: #7B30D0">jp</span><span style="color: #002339">      PrintString     </span><span style="color: #357B42; font-style: italic">; La pinta</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">PrintInfo pinta la información a mostrar en la parte superior de la pantalla. No asigna colores de tinta, ni posiciones, ya que todo eso está definido en la etiqueta Info.</p>



<p class="has-medium-font-size wp-block-paragraph">Ya lo tenemos todo listo. Vamos a Main.asm y tras la llamada a PrintBoard, añadimos el código que pinta la información y la puntuación.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      hl, Name_p1
ld      de, player1_name
ld      bc, LENNAME
ldir
ld      hl, Name_p2
ld      de, player2_name
ld      bc, LENNAME
ldir
call    PrintInfo

xor     a
ld      hl, Points_p1
ld      de, Points_p1+$01
ld      bc, $03
ld      (hl), a
ldir
call    PrintPoints" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      hl, Name_p1</span></span>
<span class="line"><span style="color: #002339">ld      de, player1_name</span></span>
<span class="line"><span style="color: #002339">ld      bc, LENNAME</span></span>
<span class="line"><span style="color: #002339">ldir</span></span>
<span class="line"><span style="color: #002339">ld      hl, Name_p2</span></span>
<span class="line"><span style="color: #002339">ld      de, player2_name</span></span>
<span class="line"><span style="color: #002339">ld      bc, LENNAME</span></span>
<span class="line"><span style="color: #002339">ldir</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintInfo</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">xor</span><span style="color: #002339">     a</span></span>
<span class="line"><span style="color: #002339">ld      hl, Points_p1</span></span>
<span class="line"><span style="color: #002339">ld      de, Points_p1+</span><span style="color: #174781">$01</span></span>
<span class="line"><span style="color: #002339">ld      bc, </span><span style="color: #174781">$03</span></span>
<span class="line"><span style="color: #002339">ld      (hl), a</span></span>
<span class="line"><span style="color: #002339">ldir</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintPoints</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Los nombres de los jugadores están en las etiquetas Name_p1 y Name_p2, por lo que tenemos que pasarlos al lugar correspondiente de la información. Inicializamos la puntuación y la pintamos.</p>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y vemos los resultados.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af493182e528&quot;}" data-wp-interactive="core/image" data-wp-key="6af493182e528" class="wp-block-image aligncenter size-full wp-lightbox-container"><img data-recalc-dims="1" loading="lazy" decoding="async" width="702" height="609" data-attachment-id="3660" data-permalink="https://espamatica.com/paso02_01/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_01.png?fit=702%2C609&amp;ssl=1" data-orig-size="702,609" data-comments-opened="1" data-image-title="Información" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador ZX Spectrum &amp;#8211; información&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_01.png?fit=702%2C609&amp;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_01.png?resize=702%2C609&#038;ssl=1" alt="Ensamblador ZX Spectrum - Tres en raya" class="wp-image-3660" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_01.png?w=702&amp;ssl=1 702w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_01.png?resize=300%2C260&amp;ssl=1 300w" sizes="auto, (max-width: 702px) 100vw, 702px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Ensamblador ZX Spectrum &#8211; información</figcaption></figure>



<h2 id="partida-a-dos" class="wp-block-heading has-large-font-size">Partida a dos</h2>



<p class="has-medium-font-size wp-block-paragraph">Vamos a implementar la partida a dos jugadores: controles, movimientos de ficha, comprobaciones de que sean correctos y de consecución de tres en raya.</p>



<p class="has-medium-font-size wp-block-paragraph">En Var.asm incluimos unas serie de constantes con colores de tinta, líneas en las que se producen las tres en raya, y códigos de teclas, que vamos a usar junto a la rutina de la ROM para verificar los controles.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="INKWARNING:     equ $C2 ; Tinta advertencias
INKPLAYER1:     equ $05 ; Tinta jugador 1
INKPLAYER2:     equ $06 ; Tinta jugador 2
INKTIE:         equ $07 ; Tinta tablas

KEYDEL:         equ $0c ; Tecla Delete
KEYENT:         equ $0d ; Tecla Enter
KEYSPC:         equ $20 ; Tecla Space
KEY0:           equ $30 ; Tecla 0
KEY1:           equ $31 ; Tecla 1
KEY2:           equ $32 ; Tecla 2
KEY3:           equ $33 ; Tecla 3
KEY4:           equ $34 ; Tecla 4
KEY5:           equ $35 ; Tecla 5
KEY6:           equ $36 ; Tecla 6
KEY7:           equ $37 ; Tecla 7
KEY8:           equ $38 ; Tecla 8
KEY9:           equ $39 ; Tecla 9

WINNERLINE123:  equ $01 ; Linea ganadora 123
WINNERLINE456:  equ $02 ; Linea ganadora 456
WINNERLINE789:  equ $03 ; Linea ganadora 789
WINNERLINE147:  equ $04 ; Linea ganadora 147
WINNERLINE258:  equ $05 ; Linea ganadora 258
WINNERLINE369:  equ $06 ; Linea ganadora 369
WINNERLINE159:  equ $07 ; Linea ganadora 159
WINNERLINE357:  equ $08 ; Linea ganadora 357" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">INKWARNING:</span><span style="color: #002339">     </span><span style="color: #1AB394">equ</span><span style="color: #002339"> $C2 </span><span style="color: #357B42; font-style: italic">; Tinta advertencias</span></span>
<span class="line"><span style="color: #7EB233">INKPLAYER1:</span><span style="color: #002339">     </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$05</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tinta jugador 1</span></span>
<span class="line"><span style="color: #7EB233">INKPLAYER2:</span><span style="color: #002339">     </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$06</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tinta jugador 2</span></span>
<span class="line"><span style="color: #7EB233">INKTIE:</span><span style="color: #002339">         </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$07</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tinta tablas</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">KEYDEL:</span><span style="color: #002339">         </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$0c</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tecla Delete</span></span>
<span class="line"><span style="color: #7EB233">KEYENT:</span><span style="color: #002339">         </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$0d</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tecla Enter</span></span>
<span class="line"><span style="color: #7EB233">KEYSPC:</span><span style="color: #002339">         </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$20</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tecla Space</span></span>
<span class="line"><span style="color: #7EB233">KEY0:</span><span style="color: #002339">           </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$30</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tecla 0</span></span>
<span class="line"><span style="color: #7EB233">KEY1:</span><span style="color: #002339">           </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$31</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tecla 1</span></span>
<span class="line"><span style="color: #7EB233">KEY2:</span><span style="color: #002339">           </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$32</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tecla 2</span></span>
<span class="line"><span style="color: #7EB233">KEY3:</span><span style="color: #002339">           </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$33</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tecla 3</span></span>
<span class="line"><span style="color: #7EB233">KEY4:</span><span style="color: #002339">           </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$34</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tecla 4</span></span>
<span class="line"><span style="color: #7EB233">KEY5:</span><span style="color: #002339">           </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$35</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tecla 5</span></span>
<span class="line"><span style="color: #7EB233">KEY6:</span><span style="color: #002339">           </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$36</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tecla 6</span></span>
<span class="line"><span style="color: #7EB233">KEY7:</span><span style="color: #002339">           </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$37</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tecla 7</span></span>
<span class="line"><span style="color: #7EB233">KEY8:</span><span style="color: #002339">           </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$38</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tecla 8</span></span>
<span class="line"><span style="color: #7EB233">KEY9:</span><span style="color: #002339">           </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$39</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Tecla 9</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">WINNERLINE123:</span><span style="color: #002339">  </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$01</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Linea ganadora 123</span></span>
<span class="line"><span style="color: #7EB233">WINNERLINE456:</span><span style="color: #002339">  </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$02</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Linea ganadora 456</span></span>
<span class="line"><span style="color: #7EB233">WINNERLINE789:</span><span style="color: #002339">  </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$03</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Linea ganadora 789</span></span>
<span class="line"><span style="color: #7EB233">WINNERLINE147:</span><span style="color: #002339">  </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$04</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Linea ganadora 147</span></span>
<span class="line"><span style="color: #7EB233">WINNERLINE258:</span><span style="color: #002339">  </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$05</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Linea ganadora 258</span></span>
<span class="line"><span style="color: #7EB233">WINNERLINE369:</span><span style="color: #002339">  </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$06</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Linea ganadora 369</span></span>
<span class="line"><span style="color: #7EB233">WINNERLINE159:</span><span style="color: #002339">  </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$07</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Linea ganadora 159</span></span>
<span class="line"><span style="color: #7EB233">WINNERLINE357:</span><span style="color: #002339">  </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$08</span><span style="color: #002339"> </span><span style="color: #357B42; font-style: italic">; Linea ganadora 357</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">La lógica la vamos a implementar en el archivo Game.asm. Lo creamos y añadimos el include en Main.asm.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Espera a que se pulse alguna tecla del tablero.
; Durante el juego se activan las interrupciones para realizar la
; cuenta atrás. 
; Con las interrupciones activadas no actualiza FLAGS_KEY/LAST_KEY.
;
; Salida:   C   -&gt;  Tecla pulsada.
;
; Altera el valor de los registros AF y BC.
; -------------------------------------------------------------------
WaitKeyBoard:
ld      a, $f7          ; A = semifila 1-5
in      a, ($fe)        ; Lee semifila
cpl                     ; Invierte bits, teclas pulsadas a 1
and     $1F             ; A = bits 1 a 4
jr      z, waitKey_cont ; Niguna tecla pulsada, salta

; Evalúa la tecla pulsada del 1 al 5
ld      c, KEY1         ; C = tecla 1
ld      b, $05          ; B = teclas a comprobar
waitKey_1_5:
rra                     ; ¿Tecla pulsada?
ret     c               ; Pulsada, salta
inc     c               ; C = codigo siguiente tecla
djnz    waitKey_1_5     ; Bucle para 5 teclas

waitKey_cont:
ld      a, $ef          ; A = semifila 0-6
in      a, ($fe)        ; Lee semifila
cpl                     ; Invierte bits, teclas pulsadas a 1
and     $1F             ; A = bits 1 a 4
jr      z, waitKey_end  ; Niguna tecla pulsada, salta

; Evalúa la tecla pulsada 9 al 6
rra                     ; Se salta la tecla cero
ld      c, KEY9         ; C = tecla 9
ld      b, $04          ; B = teclas a comprobar
waitKey_9_6:
rra                     ; ¿Tecla pulsada?
ret     c               ; Pulsada, salta
dec     c               ; C = codigo siguiente tecla
djnz    waitKey_9_6     ; Bucle para 4 teclas

; No se ha pulsado ninguna tecla
waitKey_end:
ld      c, KEY0
ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Espera a que se pulse alguna tecla del tablero.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Durante el juego se activan las interrupciones para realizar la</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; cuenta atrás. </span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Con las interrupciones activadas no actualiza FLAGS_KEY/LAST_KEY.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Salida:   C   -&gt;  Tecla pulsada.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF y BC.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">WaitKeyBoard:</span></span>
<span class="line"><span style="color: #002339">ld      a, $f7          </span><span style="color: #357B42; font-style: italic">; A = semifila 1-5</span></span>
<span class="line"><span style="color: #7B30D0">in</span><span style="color: #002339">      a, ($fe)        </span><span style="color: #357B42; font-style: italic">; Lee semifila</span></span>
<span class="line"><span style="color: #002339">cpl                     </span><span style="color: #357B42; font-style: italic">; Invierte bits, teclas pulsadas a 1</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$1F</span><span style="color: #002339">             </span><span style="color: #357B42; font-style: italic">; A = bits 1 a 4</span></span>
<span class="line"><span style="color: #002339">jr      z, waitKey_cont </span><span style="color: #357B42; font-style: italic">; Niguna tecla pulsada, salta</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Evalúa la tecla pulsada del 1 al 5</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY1         </span><span style="color: #357B42; font-style: italic">; C = tecla 1</span></span>
<span class="line"><span style="color: #002339">ld      b, </span><span style="color: #174781">$05</span><span style="color: #002339">          </span><span style="color: #357B42; font-style: italic">; B = teclas a comprobar</span></span>
<span class="line"><span style="color: #7EB233">waitKey_1_5:</span></span>
<span class="line"><span style="color: #002339">rra                     </span><span style="color: #357B42; font-style: italic">; ¿Tecla pulsada?</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     c               </span><span style="color: #357B42; font-style: italic">; Pulsada, salta</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     c               </span><span style="color: #357B42; font-style: italic">; C = codigo siguiente tecla</span></span>
<span class="line"><span style="color: #002339">djnz    waitKey_1_5     </span><span style="color: #357B42; font-style: italic">; Bucle para 5 teclas</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">waitKey_cont:</span></span>
<span class="line"><span style="color: #002339">ld      a, $ef          </span><span style="color: #357B42; font-style: italic">; A = semifila 0-6</span></span>
<span class="line"><span style="color: #7B30D0">in</span><span style="color: #002339">      a, ($fe)        </span><span style="color: #357B42; font-style: italic">; Lee semifila</span></span>
<span class="line"><span style="color: #002339">cpl                     </span><span style="color: #357B42; font-style: italic">; Invierte bits, teclas pulsadas a 1</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$1F</span><span style="color: #002339">             </span><span style="color: #357B42; font-style: italic">; A = bits 1 a 4</span></span>
<span class="line"><span style="color: #002339">jr      z, waitKey_end  </span><span style="color: #357B42; font-style: italic">; Niguna tecla pulsada, salta</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Evalúa la tecla pulsada 9 al 6</span></span>
<span class="line"><span style="color: #002339">rra                     </span><span style="color: #357B42; font-style: italic">; Se salta la tecla cero</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY9         </span><span style="color: #357B42; font-style: italic">; C = tecla 9</span></span>
<span class="line"><span style="color: #002339">ld      b, </span><span style="color: #174781">$04</span><span style="color: #002339">          </span><span style="color: #357B42; font-style: italic">; B = teclas a comprobar</span></span>
<span class="line"><span style="color: #7EB233">waitKey_9_6:</span></span>
<span class="line"><span style="color: #002339">rra                     </span><span style="color: #357B42; font-style: italic">; ¿Tecla pulsada?</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     c               </span><span style="color: #357B42; font-style: italic">; Pulsada, salta</span></span>
<span class="line"><span style="color: #7B30D0">dec</span><span style="color: #002339">     c               </span><span style="color: #357B42; font-style: italic">; C = codigo siguiente tecla</span></span>
<span class="line"><span style="color: #002339">djnz    waitKey_9_6     </span><span style="color: #357B42; font-style: italic">; Bucle para 4 teclas</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; No se ha pulsado ninguna tecla</span></span>
<span class="line"><span style="color: #7EB233">waitKey_end:</span></span>
<span class="line"><span style="color: #002339">ld      c, KEY0</span></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Con WaitKeyBoard vamos a comprobar si se ha pulsado alguna de las teclas del tablero, del uno al nueve. En este caso no vamos a usar la rutina de la ROM ya que, más adelante, tendremos las interrupciones en modo dos activas, y no se actualizarán ni FLAGS_KEY ni LAST_KEY, y la ROM no podrá decirnos la última tecla pulsada.</p>



<p class="has-medium-font-size wp-block-paragraph">La comprobación de las teclas es muy parecida a la que hicimos en Batalla espacial, con las siguientes variantes:</p>



<ul class="wp-block-list">
<li class="has-medium-font-size">CPL: invertimos los bit y evaluamos si se pulsó alguna tecla con AND $1F; saltamos si no se pulsó ninguna.</li>



<li class="has-medium-font-size">Lo que devolvemos, en este caso en C, es el código ASCII de la tecla pulsada; de la tecla cero si no se ha pulsado ninguna.</li>
</ul>



<p class="has-medium-font-size wp-block-paragraph">También se puede ver que antes de comprobar las teclas del 9 al 6 hacemos una rotación para ignorar la tecla 0.</p>



<p class="has-medium-font-size wp-block-paragraph">Continuamos ahora con la lógica del movimiento de la ficha.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Comprueba y realiza el movimiento si es correcto.
;
; Entrada:  C   -&gt;  Tecla pulsada
; Salida:   Z   -&gt;  Movimiento correcto
;           NZ  -&gt;  Movimiento incorrecto
;
; Altera el valor de los registros AF y HL.
; -------------------------------------------------------------------
ToMove:
push        bc                  ; Perserva BC
ld          hl, Grid            ; HL = dirección grid
ld          a, c                ; A = C (codigo tecla)
sub         $30                 ; A = valor númerico tecla
dec         a                   ; A-=1, para que no sume uno más
ld          b, $00              ; B = 0
ld          c, a                ; C = A, BC = desplazamiento
add         hl, bc              ; HL = dirección casilla de tecla
pop         bc                  ; Recupera BC

ld          a, (hl)             ; A = valor casilla
or          a                   ; ¿Está libre?
ret         nz                  ; Ocupada, sale

ld          a, (PlayerMoves)    ; A = jugador que mueve
or          a                   ; ¿Jugador 1?
jr          nz, toMove_p2   	; Jugador 2, salta
set         $00, (hl)           ; Activa casilla jugador 1
jr          toMove_end      	; Salta

toMove_p2:
set        $04, (hl)            ; Activa casilla jugador 2

toMove_end:
xor         a                   ; Pone flag Z
ret                             ; Sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Comprueba y realiza el movimiento si es correcto.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada:  C   -&gt;  Tecla pulsada</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Salida:   Z   -&gt;  Movimiento correcto</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;           NZ  -&gt;  Movimiento incorrecto</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">ToMove:</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">        bc                  </span><span style="color: #357B42; font-style: italic">; Perserva BC</span></span>
<span class="line"><span style="color: #002339">ld          hl, Grid            </span><span style="color: #357B42; font-style: italic">; HL = dirección grid</span></span>
<span class="line"><span style="color: #002339">ld          a, c                </span><span style="color: #357B42; font-style: italic">; A = C (codigo tecla)</span></span>
<span class="line"><span style="color: #7B30D0">sub</span><span style="color: #002339">         </span><span style="color: #174781">$30</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = valor númerico tecla</span></span>
<span class="line"><span style="color: #7B30D0">dec</span><span style="color: #002339">         a                   </span><span style="color: #357B42; font-style: italic">; A-=1, para que no sume uno más</span></span>
<span class="line"><span style="color: #002339">ld          b, </span><span style="color: #174781">$00</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; B = 0</span></span>
<span class="line"><span style="color: #002339">ld          c, a                </span><span style="color: #357B42; font-style: italic">; C = A, BC = desplazamiento</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">         hl, bc              </span><span style="color: #357B42; font-style: italic">; HL = dirección casilla de tecla</span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">         bc                  </span><span style="color: #357B42; font-style: italic">; Recupera BC</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld          a, (hl)             </span><span style="color: #357B42; font-style: italic">; A = valor casilla</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">          a                   </span><span style="color: #357B42; font-style: italic">; ¿Está libre?</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">         nz                  </span><span style="color: #357B42; font-style: italic">; Ocupada, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld          a, (PlayerMoves)    </span><span style="color: #357B42; font-style: italic">; A = jugador que mueve</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">          a                   </span><span style="color: #357B42; font-style: italic">; ¿Jugador 1?</span></span>
<span class="line"><span style="color: #002339">jr          nz, toMove_p2   	</span><span style="color: #357B42; font-style: italic">; Jugador 2, salta</span></span>
<span class="line"><span style="color: #002339">set         </span><span style="color: #174781">$00</span><span style="color: #002339">, (hl)           </span><span style="color: #357B42; font-style: italic">; Activa casilla jugador 1</span></span>
<span class="line"><span style="color: #002339">jr          toMove_end      	</span><span style="color: #357B42; font-style: italic">; Salta</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">toMove_p2:</span></span>
<span class="line"><span style="color: #002339">set        </span><span style="color: #174781">$04</span><span style="color: #002339">, (hl)            </span><span style="color: #357B42; font-style: italic">; Activa casilla jugador 2</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">toMove_end:</span></span>
<span class="line"><span style="color: #7B30D0">xor</span><span style="color: #002339">         a                   </span><span style="color: #357B42; font-style: italic">; Pone flag Z</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                             </span><span style="color: #357B42; font-style: italic">; Sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">ToMove recibe en C el código de la tecla pulsada. Calculamos el valor restando el código ASCII de cero, restamos uno para no sumar uno de más en el desplazamiento, y apuntamos a la celda correspondiente a la tecla pulsada. Comprobamos si la celda no está ocupada, si no lo está activamos los bits uno o cuatro de la celda según el jugador que mueve. Si la celda está ocupada sale con NZ, si no lo está sale con Z (XOR A).</p>



<p class="has-medium-font-size wp-block-paragraph">Necesitamos una rutina que pinte la ficha en el lugar correcto; la implementamos en Screen.asm.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Pinta la ficha.
;
; Entrada:  C   -&gt;  Tecla pulsada.
;
; Altera el valor de los registros AF, BC y HL.
; -------------------------------------------------------------------
PrintOXO:
; Cálculo posición ficha
ld      a, c                ; A = tecla
sub     $30                 ; A = valor tecla
dec     a                   ; A-=1, para no sumar de más en desplazamiento
add     a, a                ; A+=A, desplazamiento, dos bytes por posición
ld      b, $00              ; B = 0
ld      c, a                ; C = A
ld      hl, GridPos         ; HL = dirección posiciones grid
add     hl, bc              ; HL+=BC, dirección coord X celda
ld      c, (hl)             ; C = coord X celda
inc     hl                  ; HL = dirección coord Y
ld      b, (hl)             ; B = coord Y celda
call    AT                  ; Posiciona cursor

; Cálculo ficha
ld      a, (PlayerMoves)    ; A = jugador que mueve
or      a                   ; Comprueba jugador
jr      nz, printOXO_Y      ; No cero, salta

printOXO_X:
ld      a, INKPLAYER1       ; A = tinta jugador 1
call    INK                 ; Cambia tinta
ld      a, $90              ; A = 1er sprite
rst     $10                 ; Lo pinta
ld      a, $91              ; A = 2º sprite
rst     $10                 ; Lo pinta
dec     b                   ; B = línea inferior
call    AT                  ; Posiciona cursor
ld      a, $91              ; A = 2º sprite
rst     $10                 ; Lo pinta
ld      a, $90              ; A = 1er sprite
rst     $10                 ; Lo pinta
ret                         ; Sale

printOXO_Y:
ld      a, INKPLAYER2       ; A = tinta jugador 2
call    INK                 ; Cambia tinta
ld      a, $92              ; A = 1er sprite
rst     $10                 ; Lo pinta
ld      a, $93              ; A = 2º sprite
rst     $10                 ; Lo pinta
dec     b                   ; B = línea inferior
call    AT                  ; Posiciona cursor
ld      a, $94              ; A = 3er sprite
rst     $10                 ; Lo pinta
ld      a, $95              ; A = 4º sprite
rst     $10                 ; Lo pinta
ret                         ; Sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Pinta la ficha.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada:  C   -&gt;  Tecla pulsada.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF, BC y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">PrintOXO:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Cálculo posición ficha</span></span>
<span class="line"><span style="color: #002339">ld      a, c                </span><span style="color: #357B42; font-style: italic">; A = tecla</span></span>
<span class="line"><span style="color: #7B30D0">sub</span><span style="color: #002339">     </span><span style="color: #174781">$30</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; A = valor tecla</span></span>
<span class="line"><span style="color: #7B30D0">dec</span><span style="color: #002339">     a                   </span><span style="color: #357B42; font-style: italic">; A-=1, para no sumar de más en desplazamiento</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, a                </span><span style="color: #357B42; font-style: italic">; A+=A, desplazamiento, dos bytes por posición</span></span>
<span class="line"><span style="color: #002339">ld      b, </span><span style="color: #174781">$00</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; B = 0</span></span>
<span class="line"><span style="color: #002339">ld      c, a                </span><span style="color: #357B42; font-style: italic">; C = A</span></span>
<span class="line"><span style="color: #002339">ld      hl, GridPos         </span><span style="color: #357B42; font-style: italic">; HL = dirección posiciones grid</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     hl, bc              </span><span style="color: #357B42; font-style: italic">; HL+=BC, dirección coord X celda</span></span>
<span class="line"><span style="color: #002339">ld      c, (hl)             </span><span style="color: #357B42; font-style: italic">; C = coord X celda</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; HL = dirección coord Y</span></span>
<span class="line"><span style="color: #002339">ld      b, (hl)             </span><span style="color: #357B42; font-style: italic">; B = coord Y celda</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT                  </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Cálculo ficha</span></span>
<span class="line"><span style="color: #002339">ld      a, (PlayerMoves)    </span><span style="color: #357B42; font-style: italic">; A = jugador que mueve</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">      a                   </span><span style="color: #357B42; font-style: italic">; Comprueba jugador</span></span>
<span class="line"><span style="color: #002339">jr      nz, printOXO_Y      </span><span style="color: #357B42; font-style: italic">; No cero, salta</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">printOXO_X:</span></span>
<span class="line"><span style="color: #002339">ld      a, INKPLAYER1       </span><span style="color: #357B42; font-style: italic">; A = tinta jugador 1</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    INK                 </span><span style="color: #357B42; font-style: italic">; Cambia tinta</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$90</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 1er sprite</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$91</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 2º sprite</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #7B30D0">dec</span><span style="color: #002339">     b                   </span><span style="color: #357B42; font-style: italic">; B = línea inferior</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT                  </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$91</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 2º sprite</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$90</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 1er sprite</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; Sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">printOXO_Y:</span></span>
<span class="line"><span style="color: #002339">ld      a, INKPLAYER2       </span><span style="color: #357B42; font-style: italic">; A = tinta jugador 2</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    INK                 </span><span style="color: #357B42; font-style: italic">; Cambia tinta</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$92</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 1er sprite</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$93</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 2º sprite</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #7B30D0">dec</span><span style="color: #002339">     b                   </span><span style="color: #357B42; font-style: italic">; B = línea inferior</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT                  </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$94</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 3er sprite</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$95</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; A = 4º sprite</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Lo pinta</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                         </span><span style="color: #357B42; font-style: italic">; Sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">En la primera parte de PrintOXO se calcula el desplazamiento para obtener las coordenadas donde pintar la ficha, se obtienen y se posiciona el cursor. Tras esto se obtiene que jugador mueve.</p>



<p class="has-medium-font-size wp-block-paragraph">La forma de pintar una u otra ficha son casi idénticas: cambia la tinta, pinta la parte de arriba, posiciona el cursor en la línea inferior, y pinta la parte de abajo antes de salir.</p>



<p class="has-medium-font-size wp-block-paragraph">Ya podemos empezar a probar como se ve en el programa todo lo implementado. Vamos a Main.asm y debajo de la etiqueta Loop, antes de JR Loop, añadimos las llamadas a las rutinas implementadas.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="call    WaitKeyBoard
ld      a, c
cp      KEY0
jr      z, loop_cont
call    ToMove
jr      nz, loop_cont
call    PrintOXO
ld      a, (PlayerMoves)
xor     $01
ld      (PlayerMoves), a
loop_cont:" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    WaitKeyBoard</span></span>
<span class="line"><span style="color: #002339">ld      a, c</span></span>
<span class="line"><span style="color: #002339">cp      KEY0</span></span>
<span class="line"><span style="color: #002339">jr      z, loop_cont</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ToMove</span></span>
<span class="line"><span style="color: #002339">jr      nz, loop_cont</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintOXO</span></span>
<span class="line"><span style="color: #002339">ld      a, (PlayerMoves)</span></span>
<span class="line"><span style="color: #7B30D0">xor</span><span style="color: #002339">     </span><span style="color: #174781">$01</span></span>
<span class="line"><span style="color: #002339">ld      (PlayerMoves), a</span></span>
<span class="line"><span style="color: #7EB233">loop_cont:</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Esperamos a que el jugador pulse una tecla, si la ha pulsado se comprueba si el movimiento es correcto, y si es así pintamos la ficha y cambiamos de jugador. </p>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y vemos los resultados.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af493182fa53&quot;}" data-wp-interactive="core/image" data-wp-key="6af493182fa53" class="wp-block-image aligncenter size-full wp-lightbox-container"><img data-recalc-dims="1" loading="lazy" decoding="async" width="702" height="609" data-attachment-id="3669" data-permalink="https://espamatica.com/paso02_02/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_02.png?fit=702%2C609&amp;ssl=1" data-orig-size="702,609" data-comments-opened="1" data-image-title="Fichas" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador ZX Spectrum &amp;#8211; fichas&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_02.png?fit=702%2C609&amp;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_02.png?resize=702%2C609&#038;ssl=1" alt="Ensamblador ZX Spectrum - Tres en raya" class="wp-image-3669" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_02.png?w=702&amp;ssl=1 702w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_02.png?resize=300%2C260&amp;ssl=1 300w" sizes="auto, (max-width: 702px) 100vw, 702px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Ensamblador ZX Spectrum &#8211; fichas</figcaption></figure>



<p class="has-medium-font-size wp-block-paragraph">Vemos como las fichas se pintan y una vez que se ocupa todo el tablero sólo podemos reiniciar y volver a cargar, por lo que tenemos que implementar lo siguiente:</p>



<ul class="wp-block-list">
<li class="has-medium-font-size">Si el tablero está lleno, reiniciarlo.</li>



<li class="has-medium-font-size">Mostrar mensajes de información.</li>



<li class="has-medium-font-size">Comprobar si hay tres en raya o tablas.</li>



<li class="has-medium-font-size">Actualizar el marcador.</li>
</ul>



<h3 id="reinicio-del-tablero" class="wp-block-heading has-large-font-size">Reinicio del tablero</h3>



<p class="has-medium-font-size wp-block-paragraph">En Var.asm, antes de PlayersMoves, añadimos una etiqueta para llevar la cuenta del número de movimientos. El tablero estará lleno en el momento en el que el valor llegue a nueve.</p>



<p class="has-medium-font-size wp-block-paragraph">La ponemos antes porque PlayersMoves sólo la vamos a reiniciar cuando si inicia una partida. Si la reiniciamos con cada punto, el jugador uno siempre movería primero.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="MoveCounter:	db $00	; Contador de movimientos" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">MoveCounter:</span><span style="color: #002339">	</span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">	</span><span style="color: #357B42; font-style: italic">; Contador de movimientos</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">También en Var.asm añadimos una constante al inicio, en la que especificamos la longitud de datos a inicializar en cada partida.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="LENDATA:	equ $04	; Longitud de los datos a inicializar" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">LENDATA:</span><span style="color: #002339">	</span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$04</span><span style="color: #002339">	</span><span style="color: #357B42; font-style: italic">; Longitud de los datos a inicializar</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Según sea necesario añadir más datos que debamos inicializar, cambiaremos el valor de esta constante. </p>



<p class="has-medium-font-size wp-block-paragraph">En Main.asm localizamos la etiqueta Loop y cuatro líneas antes la línea LD BC, $03. Sustituimos está línea por la siguiente:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      bc, LENDATA" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      bc, LENDATA</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y comprobamos que todo sigue funcionando.</p>



<p class="has-medium-font-size wp-block-paragraph">Como hemos comentado, no siempre vamos a inicializar todos los datos, por lo que es buena idea implementar una rutina a la que se le pueda pasar la longitud de los datos a inicializar, y así poder llamarla desde distintos sitios, con distintos valores.</p>



<p class="has-medium-font-size wp-block-paragraph">Los valores que vamos a inicializar son:</p>



<ul class="wp-block-list">
<li class="has-medium-font-size">Points_p1</li>



<li class="has-medium-font-size">Points_p2</li>



<li class="has-medium-font-size">Points_tie</li>



<li class="has-medium-font-size">MoveCounter</li>



<li class="has-medium-font-size">PlayerMoves (solo al iniciar la partida)</li>
</ul>



<p class="has-medium-font-size wp-block-paragraph">Hay más valores que debemos inicializar, pero están más arriba, por lo que, o los inicializamos en dos partes, o cambiamos la etiqueta de sitio. La etiqueta es Grid (movimientos de cada jugador), y debemos de poner todos los valores a cero al inicio de cada punto. Vamos a cambiar la etiqueta de lugar, justo por encima de Points_p1, quedando así:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Desarrollo de la partida.
; -------------------------------------------------------------------
; Posiciones de las fichas en el tablero, 2 bytes por ficha Y, X
GridPos:        db POS1_LEFT, POS1_TOP  ; 1
                db POS2_LEFT, POS1_TOP  ; 2
                db POS3_LEFT, POS1_TOP  ; 3
                db POS1_LEFT, POS2_TOP  ; 4
                db POS2_LEFT, POS2_TOP  ; 5
                db POS3_LEFT, POS2_TOP  ; 6
                db POS1_LEFT, POS3_TOP  ; 7
                db POS2_LEFT, POS3_TOP  ; 8
                db POS3_LEFT, POS3_TOP  ; 9

; Casillas del tablero. Un byte por casilla, del 1 al 9.
; Bit 0 a 1, casilla ocupada por jugador 1.
; Bit 4 a 1, casilla ocupada por jugador 2.
Grid:           db $00, $00, $00, $00, $00, $00, $00, $00, $00
Points_p1:      db $00                  ; Puntos jugador 1
Points_p2:      db $00                  ; Puntos jugador 2
Points_tie:     db $00                  ; Puntos tablas
MoveCounter:    db $00                  ; Contador de movimientos
PlayerMoves:    db $00                  ; Jugador que mueve" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Desarrollo de la partida.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Posiciones de las fichas en el tablero, 2 bytes por ficha Y, X</span></span>
<span class="line"><span style="color: #7EB233">GridPos:</span><span style="color: #002339">        </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS1_LEFT, POS1_TOP  </span><span style="color: #357B42; font-style: italic">; 1</span></span>
<span class="line"><span style="color: #002339">                </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS2_LEFT, POS1_TOP  </span><span style="color: #357B42; font-style: italic">; 2</span></span>
<span class="line"><span style="color: #002339">                </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS3_LEFT, POS1_TOP  </span><span style="color: #357B42; font-style: italic">; 3</span></span>
<span class="line"><span style="color: #002339">                </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS1_LEFT, POS2_TOP  </span><span style="color: #357B42; font-style: italic">; 4</span></span>
<span class="line"><span style="color: #002339">                </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS2_LEFT, POS2_TOP  </span><span style="color: #357B42; font-style: italic">; 5</span></span>
<span class="line"><span style="color: #002339">                </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS3_LEFT, POS2_TOP  </span><span style="color: #357B42; font-style: italic">; 6</span></span>
<span class="line"><span style="color: #002339">                </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS1_LEFT, POS3_TOP  </span><span style="color: #357B42; font-style: italic">; 7</span></span>
<span class="line"><span style="color: #002339">                </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS2_LEFT, POS3_TOP  </span><span style="color: #357B42; font-style: italic">; 8</span></span>
<span class="line"><span style="color: #002339">                </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS3_LEFT, POS3_TOP  </span><span style="color: #357B42; font-style: italic">; 9</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Casillas del tablero. Un byte por casilla, del 1 al 9.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Bit 0 a 1, casilla ocupada por jugador 1.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Bit 4 a 1, casilla ocupada por jugador 2.</span></span>
<span class="line"><span style="color: #7EB233">Grid:</span><span style="color: #002339">           </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span></span>
<span class="line"><span style="color: #7EB233">Points_p1:</span><span style="color: #002339">      </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Puntos jugador 1</span></span>
<span class="line"><span style="color: #7EB233">Points_p2:</span><span style="color: #002339">      </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Puntos jugador 2</span></span>
<span class="line"><span style="color: #7EB233">Points_tie:</span><span style="color: #002339">     </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Puntos tablas</span></span>
<span class="line"><span style="color: #7EB233">MoveCounter:</span><span style="color: #002339">    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Contador de movimientos</span></span>
<span class="line"><span style="color: #7EB233">PlayerMoves:</span><span style="color: #002339">    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Jugador que mueve</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">El valor de LENDATA hay que cambiarlo por $0D.</p>



<p class="has-medium-font-size wp-block-paragraph">Implementamos la rutina de inicialización en Game.asm.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Inicializa los valores de la partida/punto.
;
; Entrada:  BC  -&gt;  Longitud de los valores a inicializar.
;
; Altera el valor de los registros BC, DE y HL.
; -------------------------------------------------------------------
ResetValues:
ld      hl, Grid        ; HL = dirección de Grid
ld      de, Grid+$01    ; DE = dirección de Grid+1
ld      (hl), $00       ; Pone a cero la primera posición
ldir                    ; Pone a cero el resto (BC)

ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Inicializa los valores de la partida/punto.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada:  BC  -&gt;  Longitud de los valores a inicializar.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros BC, DE y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">ResetValues:</span></span>
<span class="line"><span style="color: #002339">ld      hl, Grid        </span><span style="color: #357B42; font-style: italic">; HL = dirección de Grid</span></span>
<span class="line"><span style="color: #002339">ld      de, Grid+</span><span style="color: #174781">$01</span><span style="color: #002339">    </span><span style="color: #357B42; font-style: italic">; DE = dirección de Grid+1</span></span>
<span class="line"><span style="color: #002339">ld      (hl), </span><span style="color: #174781">$00</span><span style="color: #002339">       </span><span style="color: #357B42; font-style: italic">; Pone a cero la primera posición</span></span>
<span class="line"><span style="color: #002339">ldir                    </span><span style="color: #357B42; font-style: italic">; Pone a cero el resto (BC)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">ResetValues recibe en BC el número de bytes a limpiar (debe ser uno menos de la longitud total, por eso LENDATA es igual a $0D en lugar de $0E), apunta HL y DE a la primera y segunda posición de Grid, limpia la primera y luego el resto.</p>



<p class="has-medium-font-size wp-block-paragraph">Si os fijáis bien, esta rutina os debe de sonar mucho, id y mirad la rutina CLS de Screen.asm. ¡Son casi iguales!</p>



<p class="has-medium-font-size wp-block-paragraph">Podríamos implementar una rutina con las líneas LD (HL), $00, LDIR y RET, teniendo en cuenta que antes de llamarla habría que cargar los valores necesarios en HL y BC, y eliminar CLS y ResetValues. Lo dejo a vuestra elección, yo lo voy a dejar como está ahora.</p>



<p class="has-medium-font-size wp-block-paragraph">Volvemos a Main.asm, localizamos Loop y unas líneas más arriba XOR A. Desde XOR A a CALL PrintPoint, sólo vamos a dejar las líneas LD BC, LENDATA y CALL PrintPoints, el resto las borramos.</p>



<p class="has-medium-font-size wp-block-paragraph">Entre LD BC, LENDATA y CALL PrintPoints, vamos a añadir CALL ResetValues, quedando así:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="call    PrintInfo

ld      bc, LENDATA
call    ResetValues
call    PrintPoints

Loop:" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintInfo</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      bc, LENDATA</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ResetValues</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintPoints</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">Loop</span><span style="color: #002339">:</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Tras cargar la longitud de los datos a limpiar en BC, llamamos a la inicialización de los valores y pintamos los puntos.</p>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y vemos que todo sigue funcionando.</p>



<p class="has-medium-font-size wp-block-paragraph">Para poder saber si el tablero está lleno, tenemos que actualizar MoveCounter con cada movimiento y comprobar si ha llegado a nueve.</p>



<p class="has-medium-font-size wp-block-paragraph">Localizamos loop_cont y añadimos las líneas siguientes justo por encima, después de LD (PlayerMoves), A:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      hl, MoveCounter
inc     (hl)
ld      a, $09
cp      (hl)
jr      nz, loop_cont
ld      bc, LENDATA-$01
call    ResetValues
call    PrintBoard" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      hl, MoveCounter</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     (hl)</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$09</span></span>
<span class="line"><span style="color: #002339">cp      (hl)</span></span>
<span class="line"><span style="color: #002339">jr      nz, loop_cont</span></span>
<span class="line"><span style="color: #002339">ld      bc, LENDATA-</span><span style="color: #174781">$01</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ResetValues</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintBoard</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Incrementamos el contador de movimientos, comprobamos si ha llegado a nueve, en cuyo caso cargamos en BC la longitud de los datos a limpiar menos uno (para no limpiar el jugador que mueve), inicializamos los datos y pintamos el tablero vacío.</p>



<p class="has-medium-font-size wp-block-paragraph">Compilamos y cargamos en el emulador. Si vamos pulsando las teclas del uno al nueve, hasta que se llene el tablero, el jugador al que le toca mover no se ha limpiado y mueve al que le tocaba en el siguiente turno.</p>



<h3 id="mensajes-de-informacion" class="wp-block-heading has-large-font-size">Mensajes de información</h3>



<p class="has-medium-font-size wp-block-paragraph">Durante el transcurso de la partida se deben mostrar diversos mensajes a los jugadores: si el movimiento es erróneo, el jugador que mueve, quién consigue el punto, si hay tablas y si la partida a finalizado.</p>



<p class="has-medium-font-size wp-block-paragraph">Los mensajes ya los definimos al inicio del capítulo, y en cada uno de ellos la tinta, brillo, parpadeo y localización, por lo que lo único que tendríamos que hacer es llamar a PrintString con la dirección del mensaje en HL.</p>



<p class="has-medium-font-size wp-block-paragraph">Hay dos motivos para no poder hacerlo así:</p>



<ul class="wp-block-list">
<li class="has-medium-font-size">Los mensajes Turno para, Pierde turno y Punto para no están completos, se completan con el nombre del jugador en posesión del turno.</li>



<li class="has-medium-font-size">Antes de escribir un mensaje, hay que borrar la línea.</li>
</ul>



<p class="has-medium-font-size wp-block-paragraph">Vamos a implementar dos rutinas, una en Game.asm y la otra en Screen.asm; estas rutinas nos harán de puente cuando llamemos a PrintString.</p>



<p class="has-medium-font-size wp-block-paragraph">Empezamos por la rutina que implementamos en Screen.asm.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Pinta los mensajes
;
; Entrada:    HL    -&gt; dirección del mensaje
; -------------------------------------------------------------------
PrintMsg:
ld      b, INI_TOP-$15  ; B = coord Y linea a borrar (invertida)
call    CLL             ; Borra la línea
jp      PrintString     ; Pinta el mensaje" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Pinta los mensajes</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada:    HL    -&gt; dirección del mensaje</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">PrintMsg:</span></span>
<span class="line"><span style="color: #002339">ld      b, INI_TOP-</span><span style="color: #174781">$15</span><span style="color: #002339">  </span><span style="color: #357B42; font-style: italic">; B = coord Y linea a borrar (invertida)</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    CLL             </span><span style="color: #357B42; font-style: italic">; Borra la línea</span></span>
<span class="line"><span style="color: #7B30D0">jp</span><span style="color: #002339">      PrintString     </span><span style="color: #357B42; font-style: italic">; Pinta el mensaje</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">PrintMsg recibe en HL la dirección del mensaje, borra la línea de mensajes y salta a pintar el mensaje; sale por allí. Borrar la línea antes de pintar un nuevo mensaje es la única utilidad de esta rutina.</p>



<p class="has-medium-font-size wp-block-paragraph">Implementamos la rutina de Game.asm, que va a completar los tres mensajes que pintan el nombre del jugador.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Completa los mensajes en los que se muestra el nombre del jugador.
;
; Entrada:  HL  -&gt;  dirección del mensaje
;           DE  -&gt;  dirección donde debe ir el nombre
;
; Altera el valor de los registros AF, BC y DE.
; -------------------------------------------------------------------
DoMsg:
push    hl                  ; Perserva HL
ld      hl, player1_name    ; HL = nombre jugador 1
ld      a, (PlayerMoves)    ; A = jugador
or      a                   ; ¿Jugador 1?
ld      a, INKPLAYER1       ; A = tinta jugador 1
jr      z, doMsg_cont       ; Jugador 1, salta
ld      hl, player2_name    ; HL = nombre jugador 2
ld      a, INKPLAYER2       ; A = tinta jugador 2
doMsg_cont:
call    INK                 ; Cambia tinta
ld      bc, LENNAME         ; BC = longitud nombre
ldir                        ; Pasa nombre jugador a mensaje
pop     hl                  ; Recupera HL
jp      PrintMsg            ; Pinta mensaje" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Completa los mensajes en los que se muestra el nombre del jugador.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada:  HL  -&gt;  dirección del mensaje</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;           DE  -&gt;  dirección donde debe ir el nombre</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF, BC y DE.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">DoMsg:</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">    hl                  </span><span style="color: #357B42; font-style: italic">; Perserva HL</span></span>
<span class="line"><span style="color: #002339">ld      hl, player1_name    </span><span style="color: #357B42; font-style: italic">; HL = nombre jugador 1</span></span>
<span class="line"><span style="color: #002339">ld      a, (PlayerMoves)    </span><span style="color: #357B42; font-style: italic">; A = jugador</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">      a                   </span><span style="color: #357B42; font-style: italic">; ¿Jugador 1?</span></span>
<span class="line"><span style="color: #002339">ld      a, INKPLAYER1       </span><span style="color: #357B42; font-style: italic">; A = tinta jugador 1</span></span>
<span class="line"><span style="color: #002339">jr      z, doMsg_cont       </span><span style="color: #357B42; font-style: italic">; Jugador 1, salta</span></span>
<span class="line"><span style="color: #002339">ld      hl, player2_name    </span><span style="color: #357B42; font-style: italic">; HL = nombre jugador 2</span></span>
<span class="line"><span style="color: #002339">ld      a, INKPLAYER2       </span><span style="color: #357B42; font-style: italic">; A = tinta jugador 2</span></span>
<span class="line"><span style="color: #7EB233">doMsg_cont:</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    INK                 </span><span style="color: #357B42; font-style: italic">; Cambia tinta</span></span>
<span class="line"><span style="color: #002339">ld      bc, LENNAME         </span><span style="color: #357B42; font-style: italic">; BC = longitud nombre</span></span>
<span class="line"><span style="color: #002339">ldir                        </span><span style="color: #357B42; font-style: italic">; Pasa nombre jugador a mensaje</span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">     hl                  </span><span style="color: #357B42; font-style: italic">; Recupera HL</span></span>
<span class="line"><span style="color: #7B30D0">jp</span><span style="color: #002339">      PrintMsg            </span><span style="color: #357B42; font-style: italic">; Pinta mensaje</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">DoMsg recibe en HL la dirección de mensaje a pintar, y en DE la dirección dónde se debe poner el nombre del jugador. Comprueba que jugador tiene el turno, pone uno u otro nombre y la tinta del jugador. Pinta el mensaje y sale por allí.</p>



<p class="has-medium-font-size wp-block-paragraph">Vamos a Main.asm y pintamos todos los mensajes que podemos pintar, por ahora, empezando por quién tiene el turno.</p>



<p class="has-medium-font-size wp-block-paragraph">Localizamos Loop, y justo debajo añadimos las siguientes líneas:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      b, $19
loop_wait:
halt
djnz    loop_wait
ld      hl, TitleTurn
ld      de, TitleTurn_name
call    DoMsg
loop_key:" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      b, </span><span style="color: #174781">$19</span></span>
<span class="line"><span style="color: #7EB233">loop_wait:</span></span>
<span class="line"><span style="color: #002339">halt</span></span>
<span class="line"><span style="color: #002339">djnz    loop_wait</span></span>
<span class="line"><span style="color: #002339">ld      hl, TitleTurn</span></span>
<span class="line"><span style="color: #002339">ld      de, TitleTurn_name</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    DoMsg</span></span>
<span class="line"><span style="color: #7EB233">loop_key:</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Cada vez que pasamos por el bucle pintamos el jugador al que le toca mover. Antes realizamos una pausa de como medio segundo para que de tiempo a leer los mensajes.</p>



<p class="has-medium-font-size wp-block-paragraph">Ahora localizamos la línea CP KEY0 y, justo debajo, en la línea JR Z, loop_cont, cambiamos loop_cont por loop_key.</p>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y vemos que ya pintamos a que jugador le toca mover.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af493183219b&quot;}" data-wp-interactive="core/image" data-wp-key="6af493183219b" class="wp-block-image aligncenter size-full wp-lightbox-container"><img data-recalc-dims="1" loading="lazy" decoding="async" width="702" height="611" data-attachment-id="3679" data-permalink="https://espamatica.com/paso02_03-2/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_03-1.png?fit=702%2C611&amp;ssl=1" data-orig-size="702,611" data-comments-opened="1" data-image-title="Turno para" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador ZX Spectrum &amp;#8211; turno para&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_03-1.png?fit=702%2C611&amp;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_03-1.png?resize=702%2C611&#038;ssl=1" alt="Ensamblador ZX Spectrum - Tres en raya" class="wp-image-3679" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_03-1.png?w=702&amp;ssl=1 702w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_03-1.png?resize=300%2C261&amp;ssl=1 300w" sizes="auto, (max-width: 702px) 100vw, 702px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Ensamblador ZX Spectrum &#8211; turno para</figcaption></figure>



<p class="has-medium-font-size wp-block-paragraph">Vamos a pintar también el mensaje de error de casilla ocupada. Localizamos la línea CALL ToMove, borramos la línea siguiente, JR NZ, loop_cont, y añadimos las siguientes:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="jr      z, loop_print
ld      hl, TitleError
call    PrintMsg
jr      Loop
loop_print:" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">jr      z, loop_print</span></span>
<span class="line"><span style="color: #002339">ld      hl, TitleError</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintMsg</span></span>
<span class="line"><span style="color: #002339">jr      </span><span style="color: #7B30D0">Loop</span></span>
<span class="line"><span style="color: #7EB233">loop_print:</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Si retorna de la rutina ToMove con el flag Z activo, siginifca que el movimiento es correcto y saltamos a loop_print, etiqueta que hemos añadido antes de CALL PrintOXO. Si no es el caso, el movimiento no es correcto y pintamos el mensaje de error y volvemos al inicio del bucle.</p>



<p class="has-medium-font-size wp-block-paragraph">Compilad, cargad en el emulador e intentad mover a una casilla ocupada. Se debe pintar el mensaje de error, aunque se ve durante un corto espacio de tiempo; no os preocupéis, más adelante quitaremos la pausa al inicio de Loop y utilizaremos los efectos de sonido para poder temporizar.</p>



<h3 id="comprobacion-de-tablas" class="wp-block-heading has-large-font-size">Comprobación de tablas</h3>



<p class="has-medium-font-size wp-block-paragraph">La comprobación de tablas es sencilla; si se ha llegado a nueve movimientos y no hay tres en raya, hay tablas.</p>



<p class="has-medium-font-size wp-block-paragraph">Localizamos la etiqueta loop_cont y cuatro líneas por encima, entre JR NZ, loop_cont y LD BC, LENDATA-$01, añadimos lo siguiente:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      hl, Points_tie
inc     (hl)
ld      hl, TitleTie
call    PrintMsg" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      hl, Points_tie</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     (hl)</span></span>
<span class="line"><span style="color: #002339">ld      hl, TitleTie</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintMsg</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Con estas líneas, si se llega a nueve movimientos sin haber tres en raya, se suma uno al marcador de tablas.</p>



<p class="has-medium-font-size wp-block-paragraph">Id a la etiqueta loop_key y encima añadid la siguiente línea:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="call    PrintPoints" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintPoints</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Ahora, en cada iteración del bucle pintamos las puntuaciones. El CALL PrintPoints que hay justo encima de Loop lo podemos quitar.</p>



<p class="has-medium-font-size wp-block-paragraph">Compilad, cargad en el emulador y veréis como no todo funciona como debería, no se actualiza el marcador de tablas.</p>



<p class="has-medium-font-size wp-block-paragraph">En realidad todo está funcionando como debe, el problema está en que ResetValues está reiniciando las puntuaciones, lo cual es fácil de solucionar, aunque lo haremos más adelante.</p>



<p class="has-medium-font-size wp-block-paragraph">También observamos que al repintar el tablero el parpadeo está activo, debido a que el mensaje Punto para lo deja así.</p>



<p class="has-medium-font-size wp-block-paragraph">Para solucionarlo podríamos implementar una rutina para quitar el parpadeo, pero optamos por solucionarlo en la definición del tablero. Vamos a Var.asm y justo debajo de la etiqueta Board_1 añadimos la siguiente línea para desactivar el parpadeo y brillo al pintar el tablero.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="db $12, $00, $13, $00" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$12</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$13</span><span style="color: #002339">, </span><span style="color: #174781">$00</span></span></code></pre></div>



<h3 id="comprobacion-de-tres-en-raya" class="wp-block-heading has-large-font-size">Comprobación de tres en raya</h3>



<p class="has-medium-font-size wp-block-paragraph">La comprobación de tres en raya no tendríamos que realizarla hasta que se hayan realizado al menos tres movimientos. En principio, se deberían dar al menos cinco movimientos antes de poder haber tres en raya, pero dado que vamos a implementar la posibilidad de que el jugador pierda el turno si tarda más de lo establecido en realizarlo, es posible que con tres movimientos haya tres en raya. No obstante, vamos a realizar la operación cada vez que se mueva una ficha, y así siempre tardará lo mismo cada iteración del bucle (más o menos).</p>



<p class="has-medium-font-size wp-block-paragraph">En Game.asm añadimos la rutina que comprueba si hay tres en raya.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Comprueba si hay tres en raya.
;
; Retorno:  A    -&gt;  línea de tres en raya
;           Z si hay tres en raya, NZ en el caso contrario.   
;       
; Altera el valor de los registros AF, B e IX.
; -------------------------------------------------------------------
ChekcWinner:
ld      ix, Grid-$01            ; IX = dirección grid - 1
ld      b, $03                  ; B = suma celdas jugador 1
ld      a, (PlayerMoves)        ; A = jugador
or      a                       ; ¿Jugador 1?
jr      z, ChekcWinner_check    ; Jugador 1, salta
ld      b, $30                  ; B = suma celdas jugador 2

ChekcWinner_check:
ld      a, (ix+1)               ; A = celda 1
add     a, (ix+2)               ; A+= celda 2
add     a, (ix+3)               ; A+= celda 3
cp      b                       ; ¿Tres en raya?
ld      a, WINNERLINE123        ; A = indicador línea 123
ret     z                       ; Tres en raya, sale

ld      a, (ix+4)               ; A = celda 4
add     a, (ix+5)               ; A+= celda 5
add     a, (ix+6)               ; A+= celda 6
cp      b                       ; ¿Tres en raya?
ld      a, WINNERLINE456        ; A = indicador línea 456
ret     z                       ; Tres en raya, sale

ld      a, (ix+7)               ; A = celda 7
add     a, (ix+8)               ; A+= celda 8
add     a, (ix+9)               ; A+= celda 9
cp      b                       ; ¿Tres en raya?
ld      a, WINNERLINE789        ; A = indicador línea 789
ret     z                       ; Tres en raya, sale

ld      a, (ix+1)               ; A = celda 1
add     a, (ix+4)               ; A+= celda 4
add     a, (ix+7)               ; A+= celda 7
cp      b                       ; ¿Tres en raya?
ld      a, WINNERLINE147        ; A = indicador línea 147
ret     z                       ; Tres en raya, sale

ld      a, (ix+2)               ; A = celda 2
add     a, (ix+5)               ; A+= celda 5
add     a, (ix+8)               ; A+= celda 8
cp      b                       ; ¿Tres en raya?
ld      a, WINNERLINE258        ; A = indicador línea 258
ret     z                       ; Tres en raya, sale

ld      a, (ix+3)               ; A = celda 3
add     a, (ix+6)               ; A+= celda 6
add     a, (ix+9)               ; A+= celda 9
cp      b                       ; ¿Tres en raya?
ld      a, WINNERLINE369        ; A = indicador línea 369
ret     z                       ; Tres en raya, sale

ld      a, (ix+1)               ; A = celda 1
add     a, (ix+5)               ; A+= celda 5
add     a, (ix+9)               ; A+= celda 9
cp      b                       ; ¿Tres en raya?
ld      a, WINNERLINE159        ; A = indicador línea 159
ret     z                       ; Tres en raya, sale

ld      a, (ix+3)               ; A = celda 3
add     a, (ix+5)               ; A+= celda 5
add     a, (ix+7)               ; A+= celda 7
cp      b                       ; ¿Tres en raya?
ld      a, WINNERLINE357        ; A = indicador línea 357
ret                             ; Ultima condición, siempre sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Comprueba si hay tres en raya.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Retorno:  A    -&gt;  línea de tres en raya</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;           Z si hay tres en raya, NZ en el caso contrario.   </span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;       </span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF, B e IX.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">ChekcWinner:</span></span>
<span class="line"><span style="color: #002339">ld      ix, Grid-</span><span style="color: #174781">$01</span><span style="color: #002339">            </span><span style="color: #357B42; font-style: italic">; IX = dirección grid - 1</span></span>
<span class="line"><span style="color: #002339">ld      b, </span><span style="color: #174781">$03</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; B = suma celdas jugador 1</span></span>
<span class="line"><span style="color: #002339">ld      a, (PlayerMoves)        </span><span style="color: #357B42; font-style: italic">; A = jugador</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">      a                       </span><span style="color: #357B42; font-style: italic">; ¿Jugador 1?</span></span>
<span class="line"><span style="color: #002339">jr      z, ChekcWinner_check    </span><span style="color: #357B42; font-style: italic">; Jugador 1, salta</span></span>
<span class="line"><span style="color: #002339">ld      b, </span><span style="color: #174781">$30</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; B = suma celdas jugador 2</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">ChekcWinner_check:</span></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">1</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A = celda 1</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">2</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 2</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">3</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 3</span></span>
<span class="line"><span style="color: #002339">cp      b                       </span><span style="color: #357B42; font-style: italic">; ¿Tres en raya?</span></span>
<span class="line"><span style="color: #002339">ld      a, WINNERLINE123        </span><span style="color: #357B42; font-style: italic">; A = indicador línea 123</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                       </span><span style="color: #357B42; font-style: italic">; Tres en raya, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">4</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A = celda 4</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">5</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">6</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 6</span></span>
<span class="line"><span style="color: #002339">cp      b                       </span><span style="color: #357B42; font-style: italic">; ¿Tres en raya?</span></span>
<span class="line"><span style="color: #002339">ld      a, WINNERLINE456        </span><span style="color: #357B42; font-style: italic">; A = indicador línea 456</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                       </span><span style="color: #357B42; font-style: italic">; Tres en raya, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">7</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A = celda 7</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">8</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 8</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">9</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 9</span></span>
<span class="line"><span style="color: #002339">cp      b                       </span><span style="color: #357B42; font-style: italic">; ¿Tres en raya?</span></span>
<span class="line"><span style="color: #002339">ld      a, WINNERLINE789        </span><span style="color: #357B42; font-style: italic">; A = indicador línea 789</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                       </span><span style="color: #357B42; font-style: italic">; Tres en raya, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">1</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A = celda 1</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">4</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 4</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">7</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 7</span></span>
<span class="line"><span style="color: #002339">cp      b                       </span><span style="color: #357B42; font-style: italic">; ¿Tres en raya?</span></span>
<span class="line"><span style="color: #002339">ld      a, WINNERLINE147        </span><span style="color: #357B42; font-style: italic">; A = indicador línea 147</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                       </span><span style="color: #357B42; font-style: italic">; Tres en raya, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">2</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A = celda 2</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">5</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">8</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 8</span></span>
<span class="line"><span style="color: #002339">cp      b                       </span><span style="color: #357B42; font-style: italic">; ¿Tres en raya?</span></span>
<span class="line"><span style="color: #002339">ld      a, WINNERLINE258        </span><span style="color: #357B42; font-style: italic">; A = indicador línea 258</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                       </span><span style="color: #357B42; font-style: italic">; Tres en raya, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">3</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A = celda 3</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">6</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 6</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">9</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 9</span></span>
<span class="line"><span style="color: #002339">cp      b                       </span><span style="color: #357B42; font-style: italic">; ¿Tres en raya?</span></span>
<span class="line"><span style="color: #002339">ld      a, WINNERLINE369        </span><span style="color: #357B42; font-style: italic">; A = indicador línea 369</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                       </span><span style="color: #357B42; font-style: italic">; Tres en raya, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">1</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A = celda 1</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">5</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">9</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 9</span></span>
<span class="line"><span style="color: #002339">cp      b                       </span><span style="color: #357B42; font-style: italic">; ¿Tres en raya?</span></span>
<span class="line"><span style="color: #002339">ld      a, WINNERLINE159        </span><span style="color: #357B42; font-style: italic">; A = indicador línea 159</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z                       </span><span style="color: #357B42; font-style: italic">; Tres en raya, sale</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld      a, (ix+</span><span style="color: #174781">3</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A = celda 3</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">5</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 5</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, (ix+</span><span style="color: #174781">7</span><span style="color: #002339">)               </span><span style="color: #357B42; font-style: italic">; A+= celda 7</span></span>
<span class="line"><span style="color: #002339">cp      b                       </span><span style="color: #357B42; font-style: italic">; ¿Tres en raya?</span></span>
<span class="line"><span style="color: #002339">ld      a, WINNERLINE357        </span><span style="color: #357B42; font-style: italic">; A = indicador línea 357</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">                             </span><span style="color: #357B42; font-style: italic">; Ultima condición, siempre sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">En CheckWinner apuntamos IX a la dirección anterior a Grid, en B cargamos el valor que deben sumar las celdas en el caso de que gane uno u otro jugador: tres para el jugador uno y treinta para el dos.</p>



<p class="has-medium-font-size wp-block-paragraph">Luego, vamos comprobando las posibles combinaciones de tres en raya que hay y salimos si se ha producido alguna, con la combinación ganadora en A y el flag Z activado. Para comprobar si ha habido tres en raya, sumamos los valores de las celdas en A y lo compramos con B.</p>



<p class="has-medium-font-size wp-block-paragraph">En la última comprobación, si no se han logrado las tres en raya, se sale con el flag Z desactivado.</p>



<p class="has-medium-font-size wp-block-paragraph">En Main.asm vamos a añadir las líneas para la comprobación de tres en raya, y para actuar según se haya conseguido o no. Añadimos las líneas siguientes justo debajo de CALL PrintOXO.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="loop_checkWinner:
call    ChekcWinner
jr      nz, loop_tie
ld      hl, TitlePointFor
ld      de, TitlePointName
call    DoMsg
ld      hl, Points_p1
ld      a, (PlayerMoves)
or      a
jr      z, loop_win
inc     hl
loop_win:
inc     (hl)
jr      loop_reset 
loop_tie:" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">loop_checkWinner:</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    ChekcWinner</span></span>
<span class="line"><span style="color: #002339">jr      nz, loop_tie</span></span>
<span class="line"><span style="color: #002339">ld      hl, TitlePointFor</span></span>
<span class="line"><span style="color: #002339">ld      de, TitlePointName</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    DoMsg</span></span>
<span class="line"><span style="color: #002339">ld      hl, Points_p1</span></span>
<span class="line"><span style="color: #002339">ld      a, (PlayerMoves)</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">      a</span></span>
<span class="line"><span style="color: #002339">jr      z, loop_win</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl</span></span>
<span class="line"><span style="color: #7EB233">loop_win:</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     (hl)</span></span>
<span class="line"><span style="color: #002339">jr      loop_reset </span></span>
<span class="line"><span style="color: #7EB233">loop_tie:</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Llamamos a la comprobación de tres en raya y saltamos si no las hay. Si hay tres en raya, pintamos el mensaje de <em>Punto para</em>, obtenemos que jugador lo ha conseguido e incrementamos su marcador.</p>



<p class="has-medium-font-size wp-block-paragraph">Justo debajo de loop_tie están estas líneas:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="ld      a, (PlayerMoves)
xor     $01
ld      (PlayerMoves), a" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">ld      a, (PlayerMoves)</span></span>
<span class="line"><span style="color: #7B30D0">xor</span><span style="color: #002339">     </span><span style="color: #174781">$01</span></span>
<span class="line"><span style="color: #002339">ld      (PlayerMoves), a</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Las quitamos y las ponemos debajo de la etiqueta loop_cont, de lo contrario el siguiente punto lo empieza el mismo jugador que ganó el anterior.</p>



<p class="has-medium-font-size wp-block-paragraph">Por último, antes de LD BC, LENDATA-$01 añadimos la etiqueta loop_reset.</p>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y todo parece funcionar, excepto los marcadores que siguen sin actualizarse.</p>



<p class="has-medium-font-size wp-block-paragraph">Vamos a marcar visualmente dónde se han producido las tres en raya, dibujando una diagonal que cruce las tres fichas. Implementamos la rutina en Screen.asm.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Imprime la línea ganadora.
;
; Entrada:	A	-&gt;	Línea ganadora
;
; Altera el valor de los registros AF, BC, DE y HL.
; -------------------------------------------------------------------
PrintWinnerLine:
ld	    hl, COORDX		        ; HL = coord X
ld	    bc, $6c6c		        ; BC = desplazamiento
ld	    de, $01ff		        ; DE = orientación
cp	    WINNERLINE159		    ; ¿Gana línea 159?
jr	    z, printWinnerLine_159  ; Sí, salta
ld	    e, $01			        ; DE = orientación
cp	    WINNERLINE357		    ; ¿Gana línea 357?
jr	    z, printWinnerLine_357	; Sí, salta

ld	    c, $00			        ; Desplazamiento
cp	    WINNERLINE147		    ; ¿Gana línea 147?
jr	    z, printWinnerLine_147	; Sí, salta
cp	    WINNERLINE258		    ; ¿Gana línea 258?
jr	    z, printWinnerLine_258	; Sí, salta
cp	    WINNERLINE369		    ; ¿Gana línea 369?
jr	    z, printWinnerLine_369	; Sí, salta

ld	    bc, $006c		        ; Desplazamiento
ld	    (hl), $48		        ; Coord X
inc	    hl			            ; Apunta HL a coord Y
cp	    WINNERLINE123		    ; ¿Gana línea 123?
jr	    z, printWinnerLine_123	; Sí, salta
cp	    WINNERLINE456		    ; ¿Gana línea 456?
jr	    z, printWinnerLine_456	; Sí, salta
cp	    WINNERLINE789		    ; ¿Gana línea 789?
jr	    z, printWinnerLine_789	; Si es así, salta a pintarla.

printWinnerLine_159:
ld	    (hl), $b7		        ; Coord X
jr	    printWinnerLine_Y

printWinnerLine_357:
ld	    (hl), $48		        ; Coord X
jr	    printWinnerLine_Y

printWinnerLine_147:
ld	    (hl), $58		        ; Coord X
jr	    printWinnerLine_Y

printWinnerLine_258:
ld	    (hl), $80		        ; Coord X
jr	    printWinnerLine_Y

printWinnerLine_369:
ld	    (hl), $a8		        ; Coord X

printWinnerLine_Y:
inc	    hl			            ; Apunta HL a coord Y
ld	    (hl), $10		        ; Coord Y
jr	    printWinnerLine_end	    ; Pinta la línea

printWinnerLine_123:
ld	    (hl), $70		        ; Coord Y
jr	    printWinnerLine_end	    ; Pinta la línea

printWinnerLine_456:
ld	    (hl), $47		        ; Coord Y
jr	    printWinnerLine_end	    ; Pinta la línea

printWinnerLine_789:
ld	    (hl), $20		        ; Coord Y

printWinnerLine_end:
jp	    DRAW			        ; Pinta la línea" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Imprime la línea ganadora.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada:	A	-&gt;	Línea ganadora</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF, BC, DE y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">PrintWinnerLine:</span></span>
<span class="line"><span style="color: #002339">ld	    hl, COORDX		        </span><span style="color: #357B42; font-style: italic">; HL = coord X</span></span>
<span class="line"><span style="color: #002339">ld	    bc, </span><span style="color: #174781">$6c6c</span><span style="color: #002339">		        </span><span style="color: #357B42; font-style: italic">; BC = desplazamiento</span></span>
<span class="line"><span style="color: #002339">ld	    de, </span><span style="color: #174781">$01ff</span><span style="color: #002339">		        </span><span style="color: #357B42; font-style: italic">; DE = orientación</span></span>
<span class="line"><span style="color: #002339">cp	    WINNERLINE159		    </span><span style="color: #357B42; font-style: italic">; ¿Gana línea 159?</span></span>
<span class="line"><span style="color: #002339">jr	    z, printWinnerLine_159  </span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">ld	    e, </span><span style="color: #174781">$01</span><span style="color: #002339">			        </span><span style="color: #357B42; font-style: italic">; DE = orientación</span></span>
<span class="line"><span style="color: #002339">cp	    WINNERLINE357		    </span><span style="color: #357B42; font-style: italic">; ¿Gana línea 357?</span></span>
<span class="line"><span style="color: #002339">jr	    z, printWinnerLine_357	</span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld	    c, </span><span style="color: #174781">$00</span><span style="color: #002339">			        </span><span style="color: #357B42; font-style: italic">; Desplazamiento</span></span>
<span class="line"><span style="color: #002339">cp	    WINNERLINE147		    </span><span style="color: #357B42; font-style: italic">; ¿Gana línea 147?</span></span>
<span class="line"><span style="color: #002339">jr	    z, printWinnerLine_147	</span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">cp	    WINNERLINE258		    </span><span style="color: #357B42; font-style: italic">; ¿Gana línea 258?</span></span>
<span class="line"><span style="color: #002339">jr	    z, printWinnerLine_258	</span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">cp	    WINNERLINE369		    </span><span style="color: #357B42; font-style: italic">; ¿Gana línea 369?</span></span>
<span class="line"><span style="color: #002339">jr	    z, printWinnerLine_369	</span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld	    bc, </span><span style="color: #174781">$006c</span><span style="color: #002339">		        </span><span style="color: #357B42; font-style: italic">; Desplazamiento</span></span>
<span class="line"><span style="color: #002339">ld	    (hl), </span><span style="color: #174781">$48</span><span style="color: #002339">		        </span><span style="color: #357B42; font-style: italic">; Coord X</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">	    hl			            </span><span style="color: #357B42; font-style: italic">; Apunta HL a coord Y</span></span>
<span class="line"><span style="color: #002339">cp	    WINNERLINE123		    </span><span style="color: #357B42; font-style: italic">; ¿Gana línea 123?</span></span>
<span class="line"><span style="color: #002339">jr	    z, printWinnerLine_123	</span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">cp	    WINNERLINE456		    </span><span style="color: #357B42; font-style: italic">; ¿Gana línea 456?</span></span>
<span class="line"><span style="color: #002339">jr	    z, printWinnerLine_456	</span><span style="color: #357B42; font-style: italic">; Sí, salta</span></span>
<span class="line"><span style="color: #002339">cp	    WINNERLINE789		    </span><span style="color: #357B42; font-style: italic">; ¿Gana línea 789?</span></span>
<span class="line"><span style="color: #002339">jr	    z, printWinnerLine_789	</span><span style="color: #357B42; font-style: italic">; Si es así, salta a pintarla.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">printWinnerLine_159:</span></span>
<span class="line"><span style="color: #002339">ld	    (hl), $b7		        </span><span style="color: #357B42; font-style: italic">; Coord X</span></span>
<span class="line"><span style="color: #002339">jr	    printWinnerLine_Y</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">printWinnerLine_357:</span></span>
<span class="line"><span style="color: #002339">ld	    (hl), </span><span style="color: #174781">$48</span><span style="color: #002339">		        </span><span style="color: #357B42; font-style: italic">; Coord X</span></span>
<span class="line"><span style="color: #002339">jr	    printWinnerLine_Y</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">printWinnerLine_147:</span></span>
<span class="line"><span style="color: #002339">ld	    (hl), </span><span style="color: #174781">$58</span><span style="color: #002339">		        </span><span style="color: #357B42; font-style: italic">; Coord X</span></span>
<span class="line"><span style="color: #002339">jr	    printWinnerLine_Y</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">printWinnerLine_258:</span></span>
<span class="line"><span style="color: #002339">ld	    (hl), </span><span style="color: #174781">$80</span><span style="color: #002339">		        </span><span style="color: #357B42; font-style: italic">; Coord X</span></span>
<span class="line"><span style="color: #002339">jr	    printWinnerLine_Y</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">printWinnerLine_369:</span></span>
<span class="line"><span style="color: #002339">ld	    (hl), $a8		        </span><span style="color: #357B42; font-style: italic">; Coord X</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">printWinnerLine_Y:</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">	    hl			            </span><span style="color: #357B42; font-style: italic">; Apunta HL a coord Y</span></span>
<span class="line"><span style="color: #002339">ld	    (hl), </span><span style="color: #174781">$10</span><span style="color: #002339">		        </span><span style="color: #357B42; font-style: italic">; Coord Y</span></span>
<span class="line"><span style="color: #002339">jr	    printWinnerLine_end	    </span><span style="color: #357B42; font-style: italic">; Pinta la línea</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">printWinnerLine_123:</span></span>
<span class="line"><span style="color: #002339">ld	    (hl), </span><span style="color: #174781">$70</span><span style="color: #002339">		        </span><span style="color: #357B42; font-style: italic">; Coord Y</span></span>
<span class="line"><span style="color: #002339">jr	    printWinnerLine_end	    </span><span style="color: #357B42; font-style: italic">; Pinta la línea</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">printWinnerLine_456:</span></span>
<span class="line"><span style="color: #002339">ld	    (hl), </span><span style="color: #174781">$47</span><span style="color: #002339">		        </span><span style="color: #357B42; font-style: italic">; Coord Y</span></span>
<span class="line"><span style="color: #002339">jr	    printWinnerLine_end	    </span><span style="color: #357B42; font-style: italic">; Pinta la línea</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">printWinnerLine_789:</span></span>
<span class="line"><span style="color: #002339">ld	    (hl), </span><span style="color: #174781">$20</span><span style="color: #002339">		        </span><span style="color: #357B42; font-style: italic">; Coord Y</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">printWinnerLine_end:</span></span>
<span class="line"><span style="color: #7B30D0">jp</span><span style="color: #002339">	    DRAW			        </span><span style="color: #357B42; font-style: italic">; Pinta la línea</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">PrintWinnerLine recibe en A la línea ganadora. En primer lugar evaluamos cual es esa línea para saltar a una parte u otra de la rutina. Dado que las distintas líneas a pintar comparten datos comunes, se van cambiando solo los datos que difieren y se llama a DRAW para pintar la línea y salir por allí (para más información ver comentarios de DRAW en ROM.asm).</p>



<p class="has-medium-font-size wp-block-paragraph">En Main.asm, localizamos la etiqueta loop_checkWinner y debajo de JR NZ, loop_tie añadimos la línea siguiente:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="call    PrintWinnerLine" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintWinnerLine</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y vemos los resultados.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af49318344ba&quot;}" data-wp-interactive="core/image" data-wp-key="6af49318344ba" class="wp-block-image aligncenter size-full wp-lightbox-container"><img data-recalc-dims="1" loading="lazy" decoding="async" width="704" height="610" data-attachment-id="3702" data-permalink="https://espamatica.com/paso02_04/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_04.png?fit=704%2C610&amp;ssl=1" data-orig-size="704,610" data-comments-opened="1" data-image-title="Tres en raya" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador ZX Spectrum &amp;#8211; tres en raya&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_04.png?fit=704%2C610&amp;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_04.png?resize=704%2C610&#038;ssl=1" alt="Ensamblador ZX Spectrum - Tres en raya" class="wp-image-3702" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_04.png?w=704&amp;ssl=1 704w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_04.png?resize=300%2C260&amp;ssl=1 300w" sizes="auto, (max-width: 704px) 100vw, 704px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Ensamblador ZX Spectrum &#8211; tres en raya</figcaption></figure>



<p class="has-medium-font-size wp-block-paragraph">Como podemos comprobar se pinta una línea marcando las tres en raya, aunque es tan rápido que apenas podemos verlo. En el próximo capítulo usaremos el sonido para temporizar.</p>



<p class="has-medium-font-size wp-block-paragraph">No obstante, si queréis comprobar que se pinta la línea, podéis poner debajo de CALL PrintWinnerLine, estas dos líneas:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="tmp:
jr      tmp" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #7EB233">tmp:</span></span>
<span class="line"><span style="color: #002339">jr      tmp</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">No olvidéis quitarlas luego.</p>



<h3 id="actualizacion-del-marcador" class="wp-block-heading has-large-font-size">Actualización del marcador</h3>



<p class="has-medium-font-size wp-block-paragraph">Vamos a arreglar el error que arrastramos desde hace tiempo y que provoca que el marcador no se esté actualizando.</p>



<p class="has-medium-font-size wp-block-paragraph">En Var.asm localizamos la etiqueta Grid y vemos que por debajo están las etiquetas Points_p1, Points_p2 y Point_tie. Movemos estas tres etiquetas a justo debajo de MoveCounter.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Desarrollo de la partida.
; -------------------------------------------------------------------
; Posiciones de las fichas en el tablero, 2 bytes por ficha Y, X
GridPos:	  db POS1_LEFT, POS1_TOP  ; 1
		        db POS2_LEFT, POS1_TOP  ; 2
		        db POS3_LEFT, POS1_TOP  ; 3
		        db POS1_LEFT, POS2_TOP  ; 4
		        db POS2_LEFT, POS2_TOP  ; 5
		        db POS3_LEFT, POS2_TOP  ; 6
		        db POS1_LEFT, POS3_TOP  ; 7
		        db POS2_LEFT, POS3_TOP  ; 8
		        db POS3_LEFT, POS3_TOP  ; 9

; Casillas del tablero. Un byte por casilla, del 1 al 9.
; Bit 0 a 1, casilla ocupada por jugador 1.
; Bit 4 a 1, casilla ocupada por jugador 2.
Grid:		    db $00, $00, $00, $00, $00, $00, $00, $00, $00
MoveCounter:db $00                  ; Contador de movimientos
Points_p1:  db $00                  ; Puntos jugador 1
Points_p2:  db $00                  ; Puntos jugador 2
Points_tie: db $00                  ; Puntos tablas
PlayerMoves:db $00                  ; Jugador que mueve" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Desarrollo de la partida.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Posiciones de las fichas en el tablero, 2 bytes por ficha Y, X</span></span>
<span class="line"><span style="color: #7EB233">GridPos:</span><span style="color: #002339">	  </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS1_LEFT, POS1_TOP  </span><span style="color: #357B42; font-style: italic">; 1</span></span>
<span class="line"><span style="color: #002339">		        </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS2_LEFT, POS1_TOP  </span><span style="color: #357B42; font-style: italic">; 2</span></span>
<span class="line"><span style="color: #002339">		        </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS3_LEFT, POS1_TOP  </span><span style="color: #357B42; font-style: italic">; 3</span></span>
<span class="line"><span style="color: #002339">		        </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS1_LEFT, POS2_TOP  </span><span style="color: #357B42; font-style: italic">; 4</span></span>
<span class="line"><span style="color: #002339">		        </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS2_LEFT, POS2_TOP  </span><span style="color: #357B42; font-style: italic">; 5</span></span>
<span class="line"><span style="color: #002339">		        </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS3_LEFT, POS2_TOP  </span><span style="color: #357B42; font-style: italic">; 6</span></span>
<span class="line"><span style="color: #002339">		        </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS1_LEFT, POS3_TOP  </span><span style="color: #357B42; font-style: italic">; 7</span></span>
<span class="line"><span style="color: #002339">		        </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS2_LEFT, POS3_TOP  </span><span style="color: #357B42; font-style: italic">; 8</span></span>
<span class="line"><span style="color: #002339">		        </span><span style="color: #0991B6">db</span><span style="color: #002339"> POS3_LEFT, POS3_TOP  </span><span style="color: #357B42; font-style: italic">; 9</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Casillas del tablero. Un byte por casilla, del 1 al 9.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Bit 0 a 1, casilla ocupada por jugador 1.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Bit 4 a 1, casilla ocupada por jugador 2.</span></span>
<span class="line"><span style="color: #7EB233">Grid:</span><span style="color: #002339">		    </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span></span>
<span class="line"><span style="color: #7EB233">MoveCounter:</span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Contador de movimientos</span></span>
<span class="line"><span style="color: #7EB233">Points_p1:</span><span style="color: #002339">  </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Puntos jugador 1</span></span>
<span class="line"><span style="color: #7EB233">Points_p2:</span><span style="color: #002339">  </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Puntos jugador 2</span></span>
<span class="line"><span style="color: #7EB233">Points_tie:</span><span style="color: #002339"> </span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Puntos tablas</span></span>
<span class="line"><span style="color: #7EB233">PlayerMoves:</span><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">                  </span><span style="color: #357B42; font-style: italic">; Jugador que mueve</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">En Main.asm, localizamos la etiqueta loop_reset, y en la línea de más abajo, LD BC, LENDATA-$01, sustituimos $01 por $04.</p>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y, ahora sí, se actualizan los marcadores.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af4931835286&quot;}" data-wp-interactive="core/image" data-wp-key="6af4931835286" class="wp-block-image aligncenter size-full wp-lightbox-container"><img data-recalc-dims="1" loading="lazy" decoding="async" width="704" height="608" data-attachment-id="3706" data-permalink="https://espamatica.com/paso02_05/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_05.png?fit=704%2C608&amp;ssl=1" data-orig-size="704,608" data-comments-opened="1" data-image-title="Puntuación" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador ZX Spectrum &amp;#8211; puntuación&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_05.png?fit=704%2C608&amp;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_05.png?resize=704%2C608&#038;ssl=1" alt="Ensamblador ZX Spectrum - Tres en raya" class="wp-image-3706" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_05.png?w=704&amp;ssl=1 704w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso02_05.png?resize=300%2C259&amp;ssl=1 300w" sizes="auto, (max-width: 704px) 100vw, 704px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Ensamblador ZX Spectrum &#8211; puntuación</figcaption></figure>



<h2 id="ensamblador-zx-spectrum-conclusion" class="wp-block-heading has-large-font-size">Ensamblador ZX Spectrum, conclusión</h2>



<p class="has-medium-font-size wp-block-paragraph">En este capítulo hemos  pintado la información de la partida y empezado la implementación de la partida a dos, controlando cuando hay tablas o tres en raya y sumando los puntos.</p>



<p class="has-medium-font-size wp-block-paragraph">En el próximo capítulo de Ensamblador ZX Spectrum OXO implementaremos el sonido.</p>



<p class="has-medium-font-size wp-block-paragraph">Todo el código que hemos generado lo podéis descargar desde&nbsp;<a href="https://espamatica.com/wp-content/uploads/2023/04/OXO_0x02.zip">aquí</a>.</p>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<h2 class="wp-block-heading has-large-font-size">Enlaces de interés</h2>



<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://notepad-plus-plus.org/" target="_blank" rel="noreferrer noopener nofollow">Notepad++</a></li>



<li class="has-medium-font-size"><a href="https://code.visualstudio.com/" target="_blank" rel="noreferrer noopener nofollow">Visual Studio Code</a></li>



<li class="has-medium-font-size"><a href="https://www.sublimetext.com/" target="_blank" rel="noreferrer noopener nofollow">Sublime Text</a></li>



<li class="has-medium-font-size"><a href="https://github.com/chernandezba/zesarux" target="_blank" rel="noreferrer noopener nofollow">ZEsarUX</a></li>



<li class="has-medium-font-size"><a href="https://pasmo.speccy.org/" target="_blank" rel="noreferrer noopener nofollow">PASMO</a></li>



<li class="has-medium-font-size"><a href="https://git-scm.com/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Instalaci%C3%B3n-de-Git" target="_blank" rel="noreferrer noopener nofollow">Git</a></li>



<li class="has-medium-font-size"><a href="https://wiki.speccy.org/cursos/ensamblador/indice" target="_blank" rel="noreferrer noopener nofollow">Curso de ensamblador Z80 de Compiler Software</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/wp-content/uploads/2021/10/00-Referencia-Z80.zip">Referencia Z80</a></li>



<li class="has-medium-font-size"><a href="https://t.me/EnsambladorZXSpectrum" target="_blank" rel="noreferrer noopener nofollow">Ensamblador Z80 en Telegram</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/wp-content/uploads/2023/05/Espamatica.zip">Archivo .dsk con los juegos de los tutoriales</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x0f-ensamblador-zx-spectrum-marciano-depuracion/">Personalización y depuración con ZEsarUX</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/wp-content/uploads/2023/06/Ensamblador-para-ZX-Spectrum-OXO.zip">Tutorial completo en formato PDF y EPUB</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.itch.io/tres-en-raya" rel="nofollow noopener" target="_blank">El proyecto en itch.io</a></li>
</ul>
</div>



<p class="has-background has-medium-font-size wp-block-paragraph" style="background-color:#cdd6dd">Ensamblador para ZX Spectrum OXO por&nbsp;<a href="https://espamatica.com/">Juan Antonio Rubio García</a>.<br>Esta obra está bajo licencia de&nbsp;<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank" rel="noreferrer noopener nofollow">Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License</a>.</p>



<div align="center">
<a href="http://www.safecreative.org/work/2306054511935" rel="nofollow noopener" target="_blank"><img decoding="async" src="https://resources.safecreative.org:443/work-creativity-declaration/2306054511935/label/declaration-1-human-real-300" style="border:0;" title="null"/></a>
</div>
<br><br>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<p class="has-medium-font-size wp-block-paragraph">También puedes visitar el resto de tutoriales:</p>



<ul class="wp-block-list">
<li class="has-medium-font-size">.Net
<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://espamatica.com/mediatime/">MediaTime</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/nullabledatetimepicker/">NullableDateTimePicker</a></li>
</ul>
</li>



<li class="has-medium-font-size">Z80
<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://espamatica.com/entorno-de-desarrollo-para-ensamblador-z80/">Entorno de desarrollo</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/numeros-bcd-spectrum/">Números BCD</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/posiciones-de-pantalla-zx-spectrum/">Pantalla ZX Spectrum</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/ensamblador-zx-spectrum-pong-introduccion/">Pong</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x00-ensamblador-zx-spectrum-marciano-introduccion/">Batalla Espacial</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x01-ensamblador-zx-spectrum-oxo-tablero-de-juego/">Tres en raya</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/uso-de-beepfx/">Uso de BeepFX</a></li>
</ul>
</li>
</ul>
</div>



<p class="has-medium-font-size wp-block-paragraph">Y recuerda, si lo usas no te limites a copiarlo, intenta entenderlo y adaptarlo a tus necesidades.</p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://espamatica.com/0x02-ensamblador-zx-spectrum-oxo-marcadores/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3652</post-id>	</item>
		<item>
		<title>0x01 Ensamblador ZX Spectrum OXO &#8211; tablero de juego</title>
		<link>https://espamatica.com/0x01-ensamblador-zx-spectrum-oxo-tablero-de-juego/</link>
					<comments>https://espamatica.com/0x01-ensamblador-zx-spectrum-oxo-tablero-de-juego/#respond</comments>
		
		<dc:creator><![CDATA[Juan Antonio Rubio García]]></dc:creator>
		<pubDate>Fri, 28 Apr 2023 07:00:00 +0000</pubDate>
				<category><![CDATA[ZX Spectrum]]></category>
		<category><![CDATA[Ensamblador Z80]]></category>
		<category><![CDATA[Retro]]></category>
		<category><![CDATA[Ensamblador]]></category>
		<category><![CDATA[Tres en raya]]></category>
		<category><![CDATA[Z80]]></category>
		<guid isPermaLink="false">https://espamatica.com/?p=3628</guid>

					<description><![CDATA[En ensamblador ZX Spectrum OXO - tablero de juego, definiremos y pintaremos el tablero sobre el que se desarrollarán las partidas de tres en raya.]]></description>
										<content:encoded><![CDATA[
<p class="has-medium-font-size wp-block-paragraph">Tres en raya nació de la lectura del libro “Club de programación de juegos de ZX Spectrum”, de Gary Plowman. Al terminar de teclear el listado Basic que viene en el libro, nos propone como ejercicio añadir el modo de un jugador.</p>



<p class="has-medium-font-size wp-block-paragraph">Una vez que llegué a la conclusión de que el Basic no es lo mío, decidí desarrollar el juego desde cero en ensamblador, con las opciones siguientes:</p>



<ul class="wp-block-list">
<li class="has-medium-font-size">Modo de uno y dos jugadores.</li>



<li class="has-medium-font-size">Posibilidad de especificar los nombres de los jugadores.</li>



<li class="has-medium-font-size">Puntos a conseguir para terminar la partida.</li>



<li class="has-medium-font-size">Tiempo máximo por movimiento.</li>
</ul>



<p class="has-medium-font-size wp-block-paragraph">En Batalla espacial vimos el uso de la rutina de la ROM para el manejo de teclado, pero es en Tres en raya donde se utiliza de manera más intensa.</p>



<p class="has-medium-font-size wp-block-paragraph">También vamos a hacer uso de las interrupciones, para controlar el tiempo máximo por movimiento e informar al usuario, con una cuenta atrás, de los segundos que le quedan para mover; perderá el turno si los consume sin haber realizado el movimiento.</p>



<p class="has-medium-font-size wp-block-paragraph">Llegados a este punto, tras haber leído los tutoriales de <a href="https://espamatica.com/ensamblador-zx-spectrum-pong-introduccion/">Pong</a> y <a href="https://espamatica.com/0x00-ensamblador-zx-spectrum-marciano-introduccion/">Batalla espacial</a>, ya se debería tener cierto nivel, por lo que no se explicarán las instrucciones una a una; se explicará lo que hace la rutina en su conjunto, que junto con los comentarios debería ser suficiente para su comprensión.</p>


<div role="navigation" aria-label="Tabla de contenidos" class="simpletoc wp-block-simpletoc-toc"><h2 class="simpletoc-title">Tabla de contenidos</h2>
<ul class="simpletoc-list">
<li><a href="#tablero-de-juego">Tablero de juego</a>

<ul>
<li><a href="#sprites">Sprites</a>
</li>
<li><a href="#rutinas-y-variables-de-la-rom">Rutinas y variables de la ROM</a>
</li>
<li><a href="#variables">Variables</a>
</li>
<li><a href="#pantalla">Pantalla</a>
</li>
<li><a href="#main">Main</a>
</li>
</ul>
</li>
<li><a href="#ensamblador-zx-spectrum-conclusion">Ensamblador ZX Spectrum, conclusión</a>
</li>
<li><a href="#enlaces-de-interes">Enlaces de interés</a>
</li></ul></div>


<h2 id="tablero-de-juego" class="wp-block-heading has-large-font-size">Tablero de juego</h2>



<p class="has-medium-font-size wp-block-paragraph">Lo primero que vamos a hacer es diseñar y pintar el tablero de juego, que se compone de una cuadrícula con nueve celdas.</p>



<p class="has-medium-font-size wp-block-paragraph">Creamos la carpeta TresEnRaya, y dentro los archivos:</p>



<ul class="wp-block-list">
<li class="has-medium-font-size">Main.asm</li>



<li class="has-medium-font-size">Rom.asm</li>



<li class="has-medium-font-size">Screen.asm</li>



<li class="has-medium-font-size">Sprite.asm</li>



<li class="has-medium-font-size">Var.asm</li>
</ul>



<p class="has-medium-font-size wp-block-paragraph">Esta vez no voy a ir creando carpetas por cada paso, aunque si lo preferís, podéis seguir haciéndolo así.</p>



<h3 id="sprites" class="wp-block-heading has-large-font-size">Sprites</h3>



<p class="has-medium-font-size wp-block-paragraph">Definimos los gráficos en Sprite.asm: la X del jugador uno, la O del jugador dos, la cruceta del tablero y las líneas vertical y horizontal. Al igual que en Batalla espacial, vamos usar los UDG.</p>



<p class="has-medium-font-size wp-block-paragraph">El aspecto de los gráficos en Sprite.asm es el siguiente:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Fichero: Sprite.asm
;
; Definición de gráficos.
; -------------------------------------------------------------------
; Sprite jugador 1
Sprite_P1:
db $c0, $e0, $70, $38, $1c, $0e, $07, $03	   ; $90
db $03, $07, $0e, $1c, $38, $70, $e0, $c0    ; $91

; Sprite jugador 2
Sprite_P2:
db $03, $0f, $1c, $30, $60, $60, $c0, $c0    ; $92 Arriba/Izquierda
db $c0, $f0, $38, $0c, $06, $06, $03, $03    ; $93 Arriba/Derecha
db $c0, $c0, $60, $60, $30, $1c, $0f, $03    ; $94 Abajo/Izquierda
db $03, $03, $06, $06, $0c, $38, $f0, $c0    ; $95 Abajo/Derecha

; Sprite cruceta
Sprite_CROSS:
db $18, $18, $18, $ff, $ff, $18, $18, $18    ; $96

; Sprite línea vertical
Sprite_SLASH:
db $18, $18, $18, $18, $18, $18, $18, $18    ; $97

; Sprite línea horizontal
Sprite_MINUS:
db $00, $00, $00, $ff, $ff, $00, $00, $00    ; $98" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Fichero: Sprite.asm</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Definición de gráficos.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Sprite jugador 1</span></span>
<span class="line"><span style="color: #7EB233">Sprite_P1:</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> $c0, $e0, </span><span style="color: #174781">$70</span><span style="color: #002339">, </span><span style="color: #174781">$38</span><span style="color: #002339">, </span><span style="color: #174781">$1c</span><span style="color: #002339">, </span><span style="color: #174781">$0e</span><span style="color: #002339">, </span><span style="color: #174781">$07</span><span style="color: #002339">, </span><span style="color: #174781">$03</span><span style="color: #002339">	   </span><span style="color: #357B42; font-style: italic">; $90</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$03</span><span style="color: #002339">, </span><span style="color: #174781">$07</span><span style="color: #002339">, </span><span style="color: #174781">$0e</span><span style="color: #002339">, </span><span style="color: #174781">$1c</span><span style="color: #002339">, </span><span style="color: #174781">$38</span><span style="color: #002339">, </span><span style="color: #174781">$70</span><span style="color: #002339">, $e0, $c0    </span><span style="color: #357B42; font-style: italic">; $91</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Sprite jugador 2</span></span>
<span class="line"><span style="color: #7EB233">Sprite_P2:</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$03</span><span style="color: #002339">, </span><span style="color: #174781">$0f</span><span style="color: #002339">, </span><span style="color: #174781">$1c</span><span style="color: #002339">, </span><span style="color: #174781">$30</span><span style="color: #002339">, </span><span style="color: #174781">$60</span><span style="color: #002339">, </span><span style="color: #174781">$60</span><span style="color: #002339">, $c0, $c0    </span><span style="color: #357B42; font-style: italic">; $92 Arriba/Izquierda</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> $c0, $f0, </span><span style="color: #174781">$38</span><span style="color: #002339">, </span><span style="color: #174781">$0c</span><span style="color: #002339">, </span><span style="color: #174781">$06</span><span style="color: #002339">, </span><span style="color: #174781">$06</span><span style="color: #002339">, </span><span style="color: #174781">$03</span><span style="color: #002339">, </span><span style="color: #174781">$03</span><span style="color: #002339">    </span><span style="color: #357B42; font-style: italic">; $93 Arriba/Derecha</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> $c0, $c0, </span><span style="color: #174781">$60</span><span style="color: #002339">, </span><span style="color: #174781">$60</span><span style="color: #002339">, </span><span style="color: #174781">$30</span><span style="color: #002339">, </span><span style="color: #174781">$1c</span><span style="color: #002339">, </span><span style="color: #174781">$0f</span><span style="color: #002339">, </span><span style="color: #174781">$03</span><span style="color: #002339">    </span><span style="color: #357B42; font-style: italic">; $94 Abajo/Izquierda</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$03</span><span style="color: #002339">, </span><span style="color: #174781">$03</span><span style="color: #002339">, </span><span style="color: #174781">$06</span><span style="color: #002339">, </span><span style="color: #174781">$06</span><span style="color: #002339">, </span><span style="color: #174781">$0c</span><span style="color: #002339">, </span><span style="color: #174781">$38</span><span style="color: #002339">, $f0, $c0    </span><span style="color: #357B42; font-style: italic">; $95 Abajo/Derecha</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Sprite cruceta</span></span>
<span class="line"><span style="color: #7EB233">Sprite_CROSS:</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">, $ff, $ff, </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">    </span><span style="color: #357B42; font-style: italic">; $96</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Sprite línea vertical</span></span>
<span class="line"><span style="color: #7EB233">Sprite_SLASH:</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">, </span><span style="color: #174781">$18</span><span style="color: #002339">    </span><span style="color: #357B42; font-style: italic">; $97</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Sprite línea horizontal</span></span>
<span class="line"><span style="color: #7EB233">Sprite_MINUS:</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, $ff, $ff, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">, </span><span style="color: #174781">$00</span><span style="color: #002339">    </span><span style="color: #357B42; font-style: italic">; $98</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Con las prácticas que realizasteis en Batalla espacial, deberíais ser capaces de dibujar los sprites en un papel para ver cómo quedan.</p>



<p class="has-medium-font-size wp-block-paragraph">El siguiente paso es pintar el tablero. Son necesarias constantes para referenciar la ROM, definir posiciones, datos a pintar y rutinas para pintarlos.</p>



<h3 id="rutinas-y-variables-de-la-rom" class="wp-block-heading has-large-font-size">Rutinas y variables de la ROM</h3>



<p class="has-medium-font-size wp-block-paragraph">Las constantes de la ROM las definimos en ROM.asm.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Fichero: Rom.asm
;
; Rutinas de la ROM y variables de sistema.
; -------------------------------------------------------------------

; Atributos permanentes de la pantalla 2, principal.
ATTR_S:    	equ $5c8d

; Atributos actuales de la pantalla 2.
ATTR_T:     equ $5c8f

; Atributo del borde y pantalla 1. Usada por BEEPER.
BORDCR:     equ $5c48

; Dirección de las coordenadas de inicio X e Y (PLOT)
COORDX:	    equ $5c7d
COORDY:	    equ $5c7e

;--------------------------------------------------------------------
; Dirección donde están los flags de estado del teclado cuando 
; no están activas las interrupciones.
;
; Bit 3 = 1 entrada en modo L, 0 entrada en modo K.
; Bit 5 = 1 se ha pulsado una tecla, 0 no se ha pulsado.
; Bit 6 = 1 carácter numérico, 0 alfanumérico.
;--------------------------------------------------------------------
FLAGS_KEY:	equ $5c3b

;--------------------------------------------------------------------
; Dirección dónde está la última tecla pulsada
; cuando no están activas las interruciones.
;--------------------------------------------------------------------
LAST_KEY:	  equ $5c08

; Dirección de los gráficos definidos por el usuario.
UDG:		    equ $5c7b

; Dirección de inicio del área de gráficos de la VideoRAM.
VIDEORAM:	  equ $4000

; Longitud del área de gráficos de la VideoRAM.
VIDEORAM_L:	equ $1800

; Dirección de inicio del área de atributos de la VideoRAM.
VIDEOATT:	  equ $5800

; Longitud del área de atributos de la VideoRAM.
VIDEOATT_L: equ $0300

;--------------------------------------------------------------------
; Rutina beeper de la ROM.
;
; Entrada:      HL -&gt; Nota.
;               DE -&gt; Duracion.
;
; Altera el valor de los registros AF, BC, DE, HL e IX.
;--------------------------------------------------------------------
BEEPER:		equ $03b5

;--------------------------------------------------------------------
; Dibuja una línea desde las coordenadas COORDS.
;
; Entrada: B -&gt; Desplazamiento vertical de la línea.
;          C -&gt; Desplazamiento horizontal de la línea.
;          D -&gt; Orientación vertical de la línea:
; 				    $01 = Arriba, $FF = Abajo.
;          E -&gt; Orientación horizontal de la línea:
; 				    $01 = Izquierda, $FF = Derecha.
; Altera el valor de los registros AF, BC y HL.
;--------------------------------------------------------------------
DRAW:		  equ $24ba

;--------------------------------------------------------------------
; Rutina AT de la ROM. Posiciona el cursor.
;
; Entrada:      B -&gt; Coordenada Y.
;               C -&gt; Coordenada X.
;
; La esquina superior izquierda de la pantalla es 24, 33.
; (0-21) (0-31)
;--------------------------------------------------------------------
LOCATE:		equ $0dd9

;--------------------------------------------------------------------
; Rutina de la ROM que abre el canal de la pantalla.
;
; Entrada:      A -&gt; Canal (1 = Pantalla 2, 2 = Pantalla 1).
;--------------------------------------------------------------------
OPENCHAN:	equ $1601" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Fichero: Rom.asm</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Rutinas de la ROM y variables de sistema.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Atributos permanentes de la pantalla 2, principal.</span></span>
<span class="line"><span style="color: #7EB233">ATTR_S:</span><span style="color: #002339">    	</span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$5c8d</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Atributos actuales de la pantalla 2.</span></span>
<span class="line"><span style="color: #7EB233">ATTR_T:</span><span style="color: #002339">     </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$5c8f</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Atributo del borde y pantalla 1. Usada por BEEPER.</span></span>
<span class="line"><span style="color: #7EB233">BORDCR:</span><span style="color: #002339">     </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$5c48</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Dirección de las coordenadas de inicio X e Y (PLOT)</span></span>
<span class="line"><span style="color: #7EB233">COORDX:</span><span style="color: #002339">	    </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$5c7d</span></span>
<span class="line"><span style="color: #7EB233">COORDY:</span><span style="color: #002339">	    </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$5c7e</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">;--------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Dirección donde están los flags de estado del teclado cuando </span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; no están activas las interrupciones.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Bit 3 = 1 entrada en modo L, 0 entrada en modo K.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Bit 5 = 1 se ha pulsado una tecla, 0 no se ha pulsado.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Bit 6 = 1 carácter numérico, 0 alfanumérico.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;--------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">FLAGS_KEY:</span><span style="color: #002339">	</span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$5c3b</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">;--------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Dirección dónde está la última tecla pulsada</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; cuando no están activas las interruciones.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;--------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">LAST_KEY:</span><span style="color: #002339">	  </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$5c08</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Dirección de los gráficos definidos por el usuario.</span></span>
<span class="line"><span style="color: #7EB233">UDG:</span><span style="color: #002339">		    </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$5c7b</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Dirección de inicio del área de gráficos de la VideoRAM.</span></span>
<span class="line"><span style="color: #7EB233">VIDEORAM:</span><span style="color: #002339">	  </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$4000</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Longitud del área de gráficos de la VideoRAM.</span></span>
<span class="line"><span style="color: #7EB233">VIDEORAM_L:</span><span style="color: #002339">	</span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$1800</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Dirección de inicio del área de atributos de la VideoRAM.</span></span>
<span class="line"><span style="color: #7EB233">VIDEOATT:</span><span style="color: #002339">	  </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$5800</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Longitud del área de atributos de la VideoRAM.</span></span>
<span class="line"><span style="color: #7EB233">VIDEOATT_L:</span><span style="color: #002339"> </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$0300</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">;--------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Rutina beeper de la ROM.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada:      HL -&gt; Nota.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;               DE -&gt; Duracion.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF, BC, DE, HL e IX.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;--------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">BEEPER:</span><span style="color: #002339">		</span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$03b5</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">;--------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Dibuja una línea desde las coordenadas COORDS.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: B -&gt; Desplazamiento vertical de la línea.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;          C -&gt; Desplazamiento horizontal de la línea.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;          D -&gt; Orientación vertical de la línea:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; 				    $01 = Arriba, $FF = Abajo.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;          E -&gt; Orientación horizontal de la línea:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; 				    $01 = Izquierda, $FF = Derecha.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF, BC y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;--------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">DRAW:</span><span style="color: #002339">		  </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$24ba</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">;--------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Rutina AT de la ROM. Posiciona el cursor.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada:      B -&gt; Coordenada Y.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;               C -&gt; Coordenada X.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; La esquina superior izquierda de la pantalla es 24, 33.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; (0-21) (0-31)</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;--------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">LOCATE:</span><span style="color: #002339">		</span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$0dd9</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">;--------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Rutina de la ROM que abre el canal de la pantalla.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada:      A -&gt; Canal (1 = Pantalla 2, 2 = Pantalla 1).</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;--------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">OPENCHAN:</span><span style="color: #002339">	</span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$1601</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Como veréis, hemos añadido variables y rutinas no vistas hasta ahora. No os preocupéis, las iremos viendo según avanzamos.</p>



<h3 id="variables" class="wp-block-heading has-large-font-size">Variables</h3>



<p class="has-medium-font-size wp-block-paragraph">En Var.asm añadimos los datos necesarios para pintar el tablero.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Fichero: Var.asm
;
; Declaraciones de variables y constantes.
; -------------------------------------------------------------------

; Tinta del tablero
INKBOARD:   equ $04

; Posición Y = 0 para LOCATE.
INI_TOP:    equ $18
; Posición X = 0 para LOCATE.
INI_LEFT:   equ $21
; Posiciones para pintar los elementos de OXO.
POS1_TOP:   equ INI_TOP - $07
POS2_TOP:   equ POS1_TOP - $05
POS3_TOP:   equ POS2_TOP - $05

POS1_LEFT:  equ INI_LEFT - $0a
POS2_LEFT:  equ POS1_LEFT - $05
POS3_LEFT:  equ POS2_LEFT - $05
; -------------------------------------------------------------------
; Gráficos.
; -------------------------------------------------------------------
; Líneas verticales del tablero.
Board_1:		
db $20, $20, $20, $20, $97, $20, $20, $20, $20, $97, $20, $20, $20
db $20, $ff

; Líneas horizontales del tablero.
Board_2:		
db $98, $98, $98, $98, $96, $98, $98, $98, $98, $96, $98, $98, $98
db $98, $ff

; -------------------------------------------------------------------
; Partes de la pantalla.
; -------------------------------------------------------------------
; Números de guía para que el jugador sepa que tecla pulsar
; para poner las fichas (O X O)
Board_Helper:
; Tinta magenta
db $10, $03 
; AT,Y,X,número
db $16, $08, $0a, &quot;1&quot;, $16, $08, $10, &quot;2&quot;, $16, $08, $15, &quot;3&quot;
db $16, $0d, $0a, &quot;4&quot;, $16, $0d, $10, &quot;5&quot;, $16, $0d, $15, &quot;6&quot;
db $16, $12, $0a, &quot;7&quot;, $16, $12, $10, &quot;8&quot;, $16, $12, $15, &quot;9&quot;
db $ff" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Fichero: Var.asm</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Declaraciones de variables y constantes.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Tinta del tablero</span></span>
<span class="line"><span style="color: #7EB233">INKBOARD:</span><span style="color: #002339">   </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$04</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Posición Y = 0 para LOCATE.</span></span>
<span class="line"><span style="color: #7EB233">INI_TOP:</span><span style="color: #002339">    </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$18</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Posición X = 0 para LOCATE.</span></span>
<span class="line"><span style="color: #7EB233">INI_LEFT:</span><span style="color: #002339">   </span><span style="color: #1AB394">equ</span><span style="color: #002339"> </span><span style="color: #174781">$21</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Posiciones para pintar los elementos de OXO.</span></span>
<span class="line"><span style="color: #7EB233">POS1_TOP:</span><span style="color: #002339">   </span><span style="color: #1AB394">equ</span><span style="color: #002339"> INI_TOP - </span><span style="color: #174781">$07</span></span>
<span class="line"><span style="color: #7EB233">POS2_TOP:</span><span style="color: #002339">   </span><span style="color: #1AB394">equ</span><span style="color: #002339"> POS1_TOP - </span><span style="color: #174781">$05</span></span>
<span class="line"><span style="color: #7EB233">POS3_TOP:</span><span style="color: #002339">   </span><span style="color: #1AB394">equ</span><span style="color: #002339"> POS2_TOP - </span><span style="color: #174781">$05</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">POS1_LEFT:</span><span style="color: #002339">  </span><span style="color: #1AB394">equ</span><span style="color: #002339"> INI_LEFT - </span><span style="color: #174781">$0a</span></span>
<span class="line"><span style="color: #7EB233">POS2_LEFT:</span><span style="color: #002339">  </span><span style="color: #1AB394">equ</span><span style="color: #002339"> POS1_LEFT - </span><span style="color: #174781">$05</span></span>
<span class="line"><span style="color: #7EB233">POS3_LEFT:</span><span style="color: #002339">  </span><span style="color: #1AB394">equ</span><span style="color: #002339"> POS2_LEFT - </span><span style="color: #174781">$05</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Gráficos.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Líneas verticales del tablero.</span></span>
<span class="line"><span style="color: #7EB233">Board_1:</span><span style="color: #002339">		</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$97</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$97</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$20</span><span style="color: #002339">, </span><span style="color: #174781">$20</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$20</span><span style="color: #002339">, $ff</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Líneas horizontales del tablero.</span></span>
<span class="line"><span style="color: #7EB233">Board_2:</span><span style="color: #002339">		</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$98</span><span style="color: #002339">, </span><span style="color: #174781">$98</span><span style="color: #002339">, </span><span style="color: #174781">$98</span><span style="color: #002339">, </span><span style="color: #174781">$98</span><span style="color: #002339">, </span><span style="color: #174781">$96</span><span style="color: #002339">, </span><span style="color: #174781">$98</span><span style="color: #002339">, </span><span style="color: #174781">$98</span><span style="color: #002339">, </span><span style="color: #174781">$98</span><span style="color: #002339">, </span><span style="color: #174781">$98</span><span style="color: #002339">, </span><span style="color: #174781">$96</span><span style="color: #002339">, </span><span style="color: #174781">$98</span><span style="color: #002339">, </span><span style="color: #174781">$98</span><span style="color: #002339">, </span><span style="color: #174781">$98</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$98</span><span style="color: #002339">, $ff</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Partes de la pantalla.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Números de guía para que el jugador sepa que tecla pulsar</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; para poner las fichas (O X O)</span></span>
<span class="line"><span style="color: #7EB233">Board_Helper:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Tinta magenta</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$10</span><span style="color: #002339">, </span><span style="color: #174781">$03</span><span style="color: #002339"> </span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; AT,Y,X,número</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$08</span><span style="color: #002339">, </span><span style="color: #174781">$0a</span><span style="color: #002339">, &quot;</span><span style="color: #174781">1</span><span style="color: #002339">&quot;, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$08</span><span style="color: #002339">, </span><span style="color: #174781">$10</span><span style="color: #002339">, &quot;</span><span style="color: #174781">2</span><span style="color: #002339">&quot;, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$08</span><span style="color: #002339">, </span><span style="color: #174781">$15</span><span style="color: #002339">, &quot;</span><span style="color: #174781">3</span><span style="color: #002339">&quot;</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$0d</span><span style="color: #002339">, </span><span style="color: #174781">$0a</span><span style="color: #002339">, &quot;</span><span style="color: #174781">4</span><span style="color: #002339">&quot;, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$0d</span><span style="color: #002339">, </span><span style="color: #174781">$10</span><span style="color: #002339">, &quot;</span><span style="color: #174781">5</span><span style="color: #002339">&quot;, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$0d</span><span style="color: #002339">, </span><span style="color: #174781">$15</span><span style="color: #002339">, &quot;</span><span style="color: #174781">6</span><span style="color: #002339">&quot;</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$12</span><span style="color: #002339">, </span><span style="color: #174781">$0a</span><span style="color: #002339">, &quot;</span><span style="color: #174781">7</span><span style="color: #002339">&quot;, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$12</span><span style="color: #002339">, </span><span style="color: #174781">$10</span><span style="color: #002339">, &quot;</span><span style="color: #174781">8</span><span style="color: #002339">&quot;, </span><span style="color: #174781">$16</span><span style="color: #002339">, </span><span style="color: #174781">$12</span><span style="color: #002339">, </span><span style="color: #174781">$15</span><span style="color: #002339">, &quot;</span><span style="color: #174781">9</span><span style="color: #002339">&quot;</span></span>
<span class="line"><span style="color: #0991B6">db</span><span style="color: #002339"> $ff</span></span></code></pre></div>



<h3 id="pantalla" class="wp-block-heading has-large-font-size">Pantalla</h3>



<p class="has-medium-font-size wp-block-paragraph">En Screen.asm vamos a implementar las rutinas necesarias para pintar los elementos en la pantalla.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Posiciona el cursor. La esquina superior está en 24,33.
;
; Entrada:  	B -&gt; Y.
;				      C -&gt; X.
; -------------------------------------------------------------------
AT:
push 	af
push 	bc
push 	de
push 	hl		  ; Preserva registros

call 	LOCATE	; Posiciona cursor.

pop 	hl
pop 	de
pop 	bc
pop 	af		  ; Recupera registros.

ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Posiciona el cursor. La esquina superior está en 24,33.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada:  	B -&gt; Y.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;				      C -&gt; X.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">AT:</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339"> 	af</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339"> 	bc</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339"> 	de</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339"> 	hl		  </span><span style="color: #357B42; font-style: italic">; Preserva registros</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339"> 	LOCATE	</span><span style="color: #357B42; font-style: italic">; Posiciona cursor.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339"> 	hl</span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339"> 	de</span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339"> 	bc</span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339"> 	af		  </span><span style="color: #357B42; font-style: italic">; Recupera registros.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">La rutina AT recibe en los registro B y C las coordenadas Y y X simultáneamente (son coordenadas invertidas). Llama a la rutina de la ROM que posiciona el cursor.</p>



<p class="has-medium-font-size wp-block-paragraph">Vamos a administrar los distintos atributos de color de manera diferenciada, con una rutina para cada atributo.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Cambia el color de borde.
;
; Entrada: A -&gt; Color para el borde.
;
; Altera el valor de los registros AF.
; -------------------------------------------------------------------
BORDER:
push	bc		; Preserva BC
and 	$07		; A = color
out 	($fe), a	; Cambia color borde

rlca
rlca
rlca				; Rota tres bits a izquierda para poner
 					  ; color en bits de paper/border
ld 	b, a		; B = A
ld	a, (BORDCR)	; A = variable sistema BORDCR.
and 	$c7		; Quita los bits de paper/border
or	b				; Agrega el color de paper/border

ld	(BORDCR), a ; BORDCR = A, para que BEEPER no cambie
pop	bc			; Recupera BC

ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Cambia el color de borde.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: A -&gt; Color para el borde.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">BORDER:</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">	bc		</span><span style="color: #357B42; font-style: italic">; Preserva BC</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339"> 	</span><span style="color: #174781">$07</span><span style="color: #002339">		</span><span style="color: #357B42; font-style: italic">; A = color</span></span>
<span class="line"><span style="color: #7B30D0">out</span><span style="color: #002339"> 	($fe), a	</span><span style="color: #357B42; font-style: italic">; Cambia color borde</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">rlca</span></span>
<span class="line"><span style="color: #002339">rlca</span></span>
<span class="line"><span style="color: #002339">rlca				</span><span style="color: #357B42; font-style: italic">; Rota tres bits a izquierda para poner</span></span>
<span class="line"><span style="color: #002339"> 					  </span><span style="color: #357B42; font-style: italic">; color en bits de paper/border</span></span>
<span class="line"><span style="color: #002339">ld 	b, a		</span><span style="color: #357B42; font-style: italic">; B = A</span></span>
<span class="line"><span style="color: #002339">ld	a, (BORDCR)	</span><span style="color: #357B42; font-style: italic">; A = variable sistema BORDCR.</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339"> 	$c7		</span><span style="color: #357B42; font-style: italic">; Quita los bits de paper/border</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">	b				</span><span style="color: #357B42; font-style: italic">; Agrega el color de paper/border</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld	(BORDCR), a </span><span style="color: #357B42; font-style: italic">; BORDCR = A, para que BEEPER no cambie</span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">	bc			</span><span style="color: #357B42; font-style: italic">; Recupera BC</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">La rutina BORDER recibe en A el color a asignar al borde. Para asegurar que es un color correcto, nos quedamos con los bits 0, 1 y 2. Cambiamos el color de borde y luego ponemos el valor en la variable de sistema BORDCR para que BEEPER no lo cambie.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Asigna el color de la tinta.
;
; Entrada: A -&gt; Color de la tinta.
;		             FBPPPIII
;
; Altera el valor de los registros AF.
; -------------------------------------------------------------------
INK:
push	bc		        ; Preserva BC
and    $07         	; A = INK
ld     b, a        	; B = A

ld     a, (ATTR_T) 	; A = atributo actual
and    $f8         	; A = FLASH, BRIGHT y PAPER
or     b           	; Añade INK

ld     (ATTR_T), a 	; Actualiza atributo actual
ld     (ATTR_S), a 	; Actualiza atributo permanente
pop	bc		          ; Recupera BC

ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Asigna el color de la tinta.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: A -&gt; Color de la tinta.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;		             FBPPPIII</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">INK:</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">	bc		        </span><span style="color: #357B42; font-style: italic">; Preserva BC</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">    </span><span style="color: #174781">$07</span><span style="color: #002339">         	</span><span style="color: #357B42; font-style: italic">; A = INK</span></span>
<span class="line"><span style="color: #002339">ld     b, a        	</span><span style="color: #357B42; font-style: italic">; B = A</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld     a, (ATTR_T) 	</span><span style="color: #357B42; font-style: italic">; A = atributo actual</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">    $f8         	</span><span style="color: #357B42; font-style: italic">; A = FLASH, BRIGHT y PAPER</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">     b           	</span><span style="color: #357B42; font-style: italic">; Añade INK</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld     (ATTR_T), a 	</span><span style="color: #357B42; font-style: italic">; Actualiza atributo actual</span></span>
<span class="line"><span style="color: #002339">ld     (ATTR_S), a 	</span><span style="color: #357B42; font-style: italic">; Actualiza atributo permanente</span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">	bc		          </span><span style="color: #357B42; font-style: italic">; Recupera BC</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">La rutina INK recibe en A el color de la tinta. Nos aseguramos de quedarnos solo con el color de la tinta, obtenemos los atributos actuales, dejamos el parpadeo, brillo y fondo, y le añadimos la tinta. Actualizamos las variables de sistema, que son consultadas por RST $10 y al cambiar el canal, para aplicar los atributos de color.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Asigna el color de fondo.
;
; Entrada: A -&gt; Color de fondo.
;
; Altera el valor de los registros AF.
; -------------------------------------------------------------------
PAPER:
push	bc		        ; Preserva BC
and     $07         ; A = color
rlca
rlca
rlca			          ; Rota tres bits a izquierda para poner 
 			              ; color en bits de paper/border
ld      b, a        ; B = A
ld      a, (ATTR_T) ; A = atributo actual
and     $c7         ; Quita fondo

or      b           ; Añade fondo
ld      (ATTR_T), a ; Actualiza atributo actual
ld      (ATTR_S), a ; Actualiza atributo permanente
pop	bc		          ; Recupera BC

ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Asigna el color de fondo.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: A -&gt; Color de fondo.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">PAPER:</span></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">	bc		        </span><span style="color: #357B42; font-style: italic">; Preserva BC</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$07</span><span style="color: #002339">         </span><span style="color: #357B42; font-style: italic">; A = color</span></span>
<span class="line"><span style="color: #002339">rlca</span></span>
<span class="line"><span style="color: #002339">rlca</span></span>
<span class="line"><span style="color: #002339">rlca			          </span><span style="color: #357B42; font-style: italic">; Rota tres bits a izquierda para poner </span></span>
<span class="line"><span style="color: #002339"> 			              </span><span style="color: #357B42; font-style: italic">; color en bits de paper/border</span></span>
<span class="line"><span style="color: #002339">ld      b, a        </span><span style="color: #357B42; font-style: italic">; B = A</span></span>
<span class="line"><span style="color: #002339">ld      a, (ATTR_T) </span><span style="color: #357B42; font-style: italic">; A = atributo actual</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     $c7         </span><span style="color: #357B42; font-style: italic">; Quita fondo</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">      b           </span><span style="color: #357B42; font-style: italic">; Añade fondo</span></span>
<span class="line"><span style="color: #002339">ld      (ATTR_T), a </span><span style="color: #357B42; font-style: italic">; Actualiza atributo actual</span></span>
<span class="line"><span style="color: #002339">ld      (ATTR_S), a </span><span style="color: #357B42; font-style: italic">; Actualiza atributo permanente</span></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">	bc		          </span><span style="color: #357B42; font-style: italic">; Recupera BC</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">La rutina PAPER recibe el color en A. Nos quedamos con el color, rotamos tres bits a la izquierda para ponerlo en los bits del fondo, y lo guardamos en B. Obtenemos los atributos actuales, quitamos el fondo y le agregamos el que venía a A. Actualizamos las variables de sistema.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Pinta cadenas terminadas en $FF.
;
; Entrada: HL -&gt; Dirección de la cadena.
;
; Altera el valor de los registros AF y HL.
; -------------------------------------------------------------------
PrintString:
ld      a, (hl)     ; A = carácter a pintar
cp      $ff         ; ¿Es $FF?
ret     z           ; Sí, sale
rst     $10         ; Pinta carácter
inc     hl          ; HL = siguiente carácter
jr      PrintString ; Bucle hasta fin de cadena" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Pinta cadenas terminadas en $FF.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: HL -&gt; Dirección de la cadena.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">PrintString:</span></span>
<span class="line"><span style="color: #002339">ld      a, (hl)     </span><span style="color: #357B42; font-style: italic">; A = carácter a pintar</span></span>
<span class="line"><span style="color: #002339">cp      $ff         </span><span style="color: #357B42; font-style: italic">; ¿Es $FF?</span></span>
<span class="line"><span style="color: #7B30D0">ret</span><span style="color: #002339">     z           </span><span style="color: #357B42; font-style: italic">; Sí, sale</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">         </span><span style="color: #357B42; font-style: italic">; Pinta carácter</span></span>
<span class="line"><span style="color: #7B30D0">inc</span><span style="color: #002339">     hl          </span><span style="color: #357B42; font-style: italic">; HL = siguiente carácter</span></span>
<span class="line"><span style="color: #002339">jr      PrintString </span><span style="color: #357B42; font-style: italic">; Bucle hasta fin de cadena</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">La rutina PrintString ya la vimos en Batalla espacial, por lo que no necesita explicación.</p>



<p class="has-medium-font-size wp-block-paragraph">Vamos a implementar rutinas para limpiar la pantalla completa, una línea y los atributos.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Cambia los atributos de la VideoRAM con el atributo especificado
;
; Entrada:	A -&gt; Atributo especificado (FBPPPIII)
;	            Bits 0-2	Color de tinta (0-7).
;	            Bits 3-5	Color de papel (0-7).
;	            Bit  6		Brillo (0/1).
;	            Bit  7		Parpadeo (0/1).
;
; Altera el valor de los registros BC, DE y HL.
; -------------------------------------------------------------------
CLA:
ld		hl, VIDEOATT		; HL = inicio atributos
ld		(hl), a			    ; Cambia atributo
ld		de, VIDEOATT+1  ; DE = 2ª dirección atributos VideoRAM
ld		bc, VIDEOATT_L-1; BC = longitud atributos - 1
ldir					        ; Cambia los atributos

ld		(ATTR_T), a		  ; Actualiza variable de sistema
ld		(ATTR_S), a		  ; atributo actual, permanente
ld		(BORDCR), a		  ; y borde
ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Cambia los atributos de la VideoRAM con el atributo especificado</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada:	A -&gt; Atributo especificado (FBPPPIII)</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;	            Bits 0-2	Color de tinta (0-7).</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;	            Bits 3-5	Color de papel (0-7).</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;	            Bit  6		Brillo (0/1).</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;	            Bit  7		Parpadeo (0/1).</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros BC, DE y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">CLA:</span></span>
<span class="line"><span style="color: #002339">ld		hl, VIDEOATT		</span><span style="color: #357B42; font-style: italic">; HL = inicio atributos</span></span>
<span class="line"><span style="color: #002339">ld		(hl), a			    </span><span style="color: #357B42; font-style: italic">; Cambia atributo</span></span>
<span class="line"><span style="color: #002339">ld		de, VIDEOATT+</span><span style="color: #174781">1</span><span style="color: #002339">  </span><span style="color: #357B42; font-style: italic">; DE = 2ª dirección atributos VideoRAM</span></span>
<span class="line"><span style="color: #002339">ld		bc, VIDEOATT_L-</span><span style="color: #174781">1</span><span style="color: #357B42; font-style: italic">; BC = longitud atributos - 1</span></span>
<span class="line"><span style="color: #002339">ldir					        </span><span style="color: #357B42; font-style: italic">; Cambia los atributos</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld		(ATTR_T), a		  </span><span style="color: #357B42; font-style: italic">; Actualiza variable de sistema</span></span>
<span class="line"><span style="color: #002339">ld		(ATTR_S), a		  </span><span style="color: #357B42; font-style: italic">; atributo actual, permanente</span></span>
<span class="line"><span style="color: #002339">ld		(BORDCR), a		  </span><span style="color: #357B42; font-style: italic">; y borde</span></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">La rutina CLA recibe en A los atributos a asignar a la pantalla, en el formato que ya hemos visto anteriormente. Los cambia y actualiza las variables de sistema de atributos actuales, permanentes y borde.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Borra la línea de patalla especificada.
;
; Entrada: B -&gt; Línea de pantalla a borrar.
;			          Coordenas invertidas.
;
; Altera el valor de los registros AF.
; -------------------------------------------------------------------
CLL:
ld	    a, (ATTR_T)	; A = atributos actuales
and 	$3f		        ; A = PAPER + INK
ld	    (ATTR_T), a	; Actualiza en memoria

push	bc		        ; Preserva BC

ld	    c, INI_LEFT	; C = 1ª columna
call	AT		        ; Posiciona cursor.
ld	    b, $20		  ; B = 32 columnas*línea.
CLL_loop:
ld	    a, $20		  ; A = espacio
rst	    $10		      ; Lo imprime
djnz	CLL_loop	    ; Bucle mientras B &gt; 0

pop	bc		          ; Recupera BC

ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Borra la línea de patalla especificada.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: B -&gt; Línea de pantalla a borrar.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;			          Coordenas invertidas.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">CLL:</span></span>
<span class="line"><span style="color: #002339">ld	    a, (ATTR_T)	</span><span style="color: #357B42; font-style: italic">; A = atributos actuales</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339"> 	</span><span style="color: #174781">$3f</span><span style="color: #002339">		        </span><span style="color: #357B42; font-style: italic">; A = PAPER + INK</span></span>
<span class="line"><span style="color: #002339">ld	    (ATTR_T), a	</span><span style="color: #357B42; font-style: italic">; Actualiza en memoria</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">push</span><span style="color: #002339">	bc		        </span><span style="color: #357B42; font-style: italic">; Preserva BC</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">ld	    c, INI_LEFT	</span><span style="color: #357B42; font-style: italic">; C = 1ª columna</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">	AT		        </span><span style="color: #357B42; font-style: italic">; Posiciona cursor.</span></span>
<span class="line"><span style="color: #002339">ld	    b, </span><span style="color: #174781">$20</span><span style="color: #002339">		  </span><span style="color: #357B42; font-style: italic">; B = 32 columnas*línea.</span></span>
<span class="line"><span style="color: #7EB233">CLL_loop:</span></span>
<span class="line"><span style="color: #002339">ld	    a, </span><span style="color: #174781">$20</span><span style="color: #002339">		  </span><span style="color: #357B42; font-style: italic">; A = espacio</span></span>
<span class="line"><span style="color: #002339">rst	    </span><span style="color: #174781">$10</span><span style="color: #002339">		      </span><span style="color: #357B42; font-style: italic">; Lo imprime</span></span>
<span class="line"><span style="color: #002339">djnz	CLL_loop	    </span><span style="color: #357B42; font-style: italic">; Bucle mientras B &gt; 0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">pop</span><span style="color: #002339">	bc		          </span><span style="color: #357B42; font-style: italic">; Recupera BC</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">La rutina CLL recibe en A la línea a borrar (con las coordenadas invertidas) y la borra. Antes quita el brillo y el parpadeo de los atributos actuales.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Borra los gráficos de la VideoRAM.
;
; Altera el valor de los registros BC, DE y HL.
; -------------------------------------------------------------------
CLS:
ld      hl, VIDEORAM        ; HL = dirección VideoRAM
ld      de, VIDEORAM+1      ; DE = 2ª dirección VideoRAM
ld      bc, VIDEORAM_L-1    ; BC = logitud VideoRAM - 1
ld      (hl), $00           ; Limpia 1ª posición
ldir                        ; Limpia el resto

ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Borra los gráficos de la VideoRAM.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros BC, DE y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">CLS:</span></span>
<span class="line"><span style="color: #002339">ld      hl, VIDEORAM        </span><span style="color: #357B42; font-style: italic">; HL = dirección VideoRAM</span></span>
<span class="line"><span style="color: #002339">ld      de, VIDEORAM+</span><span style="color: #174781">1</span><span style="color: #002339">      </span><span style="color: #357B42; font-style: italic">; DE = 2ª dirección VideoRAM</span></span>
<span class="line"><span style="color: #002339">ld      bc, VIDEORAM_L-</span><span style="color: #174781">1</span><span style="color: #002339">    </span><span style="color: #357B42; font-style: italic">; BC = logitud VideoRAM - 1</span></span>
<span class="line"><span style="color: #002339">ld      (hl), </span><span style="color: #174781">$00</span><span style="color: #002339">           </span><span style="color: #357B42; font-style: italic">; Limpia 1ª posición</span></span>
<span class="line"><span style="color: #002339">ldir                        </span><span style="color: #357B42; font-style: italic">; Limpia el resto</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">La rutina CLS borra el área gráfica de la pantalla. No usamos la rutina de la ROM porque tenemos elementos de varios colores, pero son muy estáticos y no cambian, sin embargo la rutina CLS de la ROM si que cambia los atributos, así que implementamos una a medida.</p>



<p class="has-medium-font-size wp-block-paragraph">Al igual que hicimos en Batalla espacial, vamos a pintar diversos datos numéricos en formato BDC, pero esta vez, debido a que el rango de los números va estar entre cero y diez, controlamos si la decena es cero para pintar un espacio en su lugar.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Pinta el valor de números BCD.
;
; Sólo pinta números del 0 al 99.
;
; Entrada: HL -&gt; Puntero al número a pintar.
;
; Altera el valor del registro AF.
; -------------------------------------------------------------------
PrintBCD:
ld      a, (hl)             ; A = número a pintar
and     $f0                 ; A = decenas
rrca
rrca
rrca
rrca                        ; Decenas a bits del 0 al 3
or      a                   ; ¿Decena = 0?
jr      nz, PrintBCD_ascii  ; No, salta
ld      a, ' '              ; Decena = 0
jr      PrintBCD_continue   ; Pinta espacio

PrintBCD_ascii:
add     a, '0'              ; A = A + código Ascii del 0

PrintBCD_continue:
rst     $10                 ; Pinta 1er dígito
ld      a, (hl)             ; A = número a pintar
and     $0f                 ; Se queda con las unidades
add     a, '0'              ; A = A + código Ascii del 0
rst     $10                 ; Imprime 2ª dígito
ret" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Pinta el valor de números BCD.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Sólo pinta números del 0 al 99.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Entrada: HL -&gt; Puntero al número a pintar.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor del registro AF.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">PrintBCD:</span></span>
<span class="line"><span style="color: #002339">ld      a, (hl)             </span><span style="color: #357B42; font-style: italic">; A = número a pintar</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     $f0                 </span><span style="color: #357B42; font-style: italic">; A = decenas</span></span>
<span class="line"><span style="color: #002339">rrca</span></span>
<span class="line"><span style="color: #002339">rrca</span></span>
<span class="line"><span style="color: #002339">rrca</span></span>
<span class="line"><span style="color: #002339">rrca                        </span><span style="color: #357B42; font-style: italic">; Decenas a bits del 0 al 3</span></span>
<span class="line"><span style="color: #7B30D0">or</span><span style="color: #002339">      a                   </span><span style="color: #357B42; font-style: italic">; ¿Decena = 0?</span></span>
<span class="line"><span style="color: #002339">jr      nz, PrintBCD_ascii  </span><span style="color: #357B42; font-style: italic">; No, salta</span></span>
<span class="line"><span style="color: #002339">ld      a, &#39; &#39;              </span><span style="color: #357B42; font-style: italic">; Decena = 0</span></span>
<span class="line"><span style="color: #002339">jr      PrintBCD_continue   </span><span style="color: #357B42; font-style: italic">; Pinta espacio</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">PrintBCD_ascii:</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, &#39;</span><span style="color: #174781">0</span><span style="color: #002339">&#39;              </span><span style="color: #357B42; font-style: italic">; A = A + código Ascii del 0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">PrintBCD_continue:</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Pinta 1er dígito</span></span>
<span class="line"><span style="color: #002339">ld      a, (hl)             </span><span style="color: #357B42; font-style: italic">; A = número a pintar</span></span>
<span class="line"><span style="color: #7B30D0">and</span><span style="color: #002339">     </span><span style="color: #174781">$0f</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Se queda con las unidades</span></span>
<span class="line"><span style="color: #7B30D0">add</span><span style="color: #002339">     a, &#39;</span><span style="color: #174781">0</span><span style="color: #002339">&#39;              </span><span style="color: #357B42; font-style: italic">; A = A + código Ascii del 0</span></span>
<span class="line"><span style="color: #002339">rst     </span><span style="color: #174781">$10</span><span style="color: #002339">                 </span><span style="color: #357B42; font-style: italic">; Imprime 2ª dígito</span></span>
<span class="line"><span style="color: #7B30D0">ret</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">PrintBCD recibe el HL el puntero al número a pintar, lo carga en A, se queda con las decenas y si son cero, pinta un espacio. El resto de la rutina es igual a lo visto en Batalla espacial.</p>



<p class="has-medium-font-size wp-block-paragraph">Tenemos casi todo listo para pintar el tablero de juego, sólo nos falta la rutina que lo hace.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="; -------------------------------------------------------------------
; Pinta el tablero.
;
; Altera el valor de los registros AF, BC, D y HL.
; -------------------------------------------------------------------
PrintBoard:
ld      a, INKBOARD         ; A = tinta
call    INK                 ; Cambia tinta

; Coordenadas iniciales del tablero
ld      b, INI_TOP - $06    ; B = coord Y
ld      c, INI_LEFT - $09   ; C = coord X
ld      d, $0e              ; D = nº líneas tablero

printBoard_1:
call    AT                  ; Posiciona cursor
ld      hl, Board_1         ; HL = línea vertical
call    PrintString         ; Pinta caracteres línea vertical
dec     b                   ; B-=1, siguiente línea
dec     d                   ; D-=1
jr      nz, printBoard_1    ; Bucle mientras D &gt; 0

printBoard_2:
; Coodenadas de la primera línea horizontal
ld      b, INI_TOP - $0a    ; B = coord Y
ld      c, INI_LEFT - $09   ; C = coord X
call    AT                  ; Posiciona cursor
ld      hl, Board_2         ; HL = línea horizontal
call    PrintString         ; Pinta línea horizontal

; Coodenadas de la segunda línea horizontal, la coordenada X no cambia
ld      b, INI_TOP - $0f    ; B = coord Y
call    AT                  ; Posiciona cursor
ld      hl, Board_2
call    PrintString         ; Pinta línea horizontal

printBoard_3:
; Pinta los números de guía para que el usuario sepa que tecla pulsar
; para poner las fichas (O X O)
Ld	hl, Board_Helper        ; HL = helper
jp	PrintString             ; Pinta helper y sale" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Pinta el tablero.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">;</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Altera el valor de los registros AF, BC, D y HL.</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; -------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #7EB233">PrintBoard:</span></span>
<span class="line"><span style="color: #002339">ld      a, INKBOARD         </span><span style="color: #357B42; font-style: italic">; A = tinta</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    INK                 </span><span style="color: #357B42; font-style: italic">; Cambia tinta</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Coordenadas iniciales del tablero</span></span>
<span class="line"><span style="color: #002339">ld      b, INI_TOP - </span><span style="color: #174781">$06</span><span style="color: #002339">    </span><span style="color: #357B42; font-style: italic">; B = coord Y</span></span>
<span class="line"><span style="color: #002339">ld      c, INI_LEFT - </span><span style="color: #174781">$09</span><span style="color: #002339">   </span><span style="color: #357B42; font-style: italic">; C = coord X</span></span>
<span class="line"><span style="color: #002339">ld      d, </span><span style="color: #174781">$0e</span><span style="color: #002339">              </span><span style="color: #357B42; font-style: italic">; D = nº líneas tablero</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">printBoard_1:</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT                  </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #002339">ld      hl, Board_1         </span><span style="color: #357B42; font-style: italic">; HL = línea vertical</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintString         </span><span style="color: #357B42; font-style: italic">; Pinta caracteres línea vertical</span></span>
<span class="line"><span style="color: #7B30D0">dec</span><span style="color: #002339">     b                   </span><span style="color: #357B42; font-style: italic">; B-=1, siguiente línea</span></span>
<span class="line"><span style="color: #7B30D0">dec</span><span style="color: #002339">     d                   </span><span style="color: #357B42; font-style: italic">; D-=1</span></span>
<span class="line"><span style="color: #002339">jr      nz, printBoard_1    </span><span style="color: #357B42; font-style: italic">; Bucle mientras D &gt; 0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">printBoard_2:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Coodenadas de la primera línea horizontal</span></span>
<span class="line"><span style="color: #002339">ld      b, INI_TOP - </span><span style="color: #174781">$0a</span><span style="color: #002339">    </span><span style="color: #357B42; font-style: italic">; B = coord Y</span></span>
<span class="line"><span style="color: #002339">ld      c, INI_LEFT - </span><span style="color: #174781">$09</span><span style="color: #002339">   </span><span style="color: #357B42; font-style: italic">; C = coord X</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT                  </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #002339">ld      hl, Board_2         </span><span style="color: #357B42; font-style: italic">; HL = línea horizontal</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintString         </span><span style="color: #357B42; font-style: italic">; Pinta línea horizontal</span></span>
<span class="line"></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Coodenadas de la segunda línea horizontal, la coordenada X no cambia</span></span>
<span class="line"><span style="color: #002339">ld      b, INI_TOP - </span><span style="color: #174781">$0f</span><span style="color: #002339">    </span><span style="color: #357B42; font-style: italic">; B = coord Y</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    AT                  </span><span style="color: #357B42; font-style: italic">; Posiciona cursor</span></span>
<span class="line"><span style="color: #002339">ld      hl, Board_2</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintString         </span><span style="color: #357B42; font-style: italic">; Pinta línea horizontal</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">printBoard_3:</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; Pinta los números de guía para que el usuario sepa que tecla pulsar</span></span>
<span class="line"><span style="color: #357B42; font-style: italic">; para poner las fichas (O X O)</span></span>
<span class="line"><span style="color: #002339">Ld	hl, Board_Helper        </span><span style="color: #357B42; font-style: italic">; HL = helper</span></span>
<span class="line"><span style="color: #7B30D0">jp</span><span style="color: #002339">	PrintString             </span><span style="color: #357B42; font-style: italic">; Pinta helper y sale</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">PrintBoard pinta el tablero de juego: cambia la tinta y prepara todo para pintar la línea vertical, que es pintada en printBoard_1. La línea horizontal la pinta printBoard_2, y la guía para que sepa el jugador que teclas pulsar la pinta printBoard_3.</p>



<p class="has-medium-font-size wp-block-paragraph">Al pintar las líneas verticales y las horizontales, donde se cruzan la vertical se borra. Fijaos bien en la definición de Board2 y veréis como no se pinta el mismo carácter en toda ella.</p>



<h3 id="main" class="wp-block-heading has-large-font-size">Main</h3>



<p class="has-medium-font-size wp-block-paragraph">Para ver si todo funciona, implementamos la primera versión del archivo Main.asm.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#002339;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#f2f2f2;color:#003353">ASM</span><span role="button" tabindex="0" data-code="org     $5e88

Main:
ld      hl, Sprite_P1
ld      (UDG), hl
ld      a, $02          
call    OPENCHAN

xor     a
call    BORDER
call    CLA
call    CLS

Init:
call    PrintBoard

Loop:
jr      Loop

include &quot;Rom.asm&quot;
include &quot;Screen.asm&quot;
include &quot;Sprite.asm&quot;
include &quot;Var.asm&quot;

end     Main" style="color:#002339;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki slack-ochin" style="background-color: #FFF" tabindex="0"><code><span class="line"><span style="color: #002339">org     </span><span style="color: #174781">$5e88</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">Main:</span></span>
<span class="line"><span style="color: #002339">ld      hl, Sprite_P1</span></span>
<span class="line"><span style="color: #002339">ld      (UDG), hl</span></span>
<span class="line"><span style="color: #002339">ld      a, </span><span style="color: #174781">$02</span><span style="color: #002339">          </span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    OPENCHAN</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">xor</span><span style="color: #002339">     a</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    BORDER</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    CLA</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    CLS</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7EB233">Init:</span></span>
<span class="line"><span style="color: #7B30D0">call</span><span style="color: #002339">    PrintBoard</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B30D0">Loop</span><span style="color: #002339">:</span></span>
<span class="line"><span style="color: #002339">jr      </span><span style="color: #7B30D0">Loop</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">include &quot;Rom.asm&quot;</span></span>
<span class="line"><span style="color: #002339">include &quot;Screen.asm&quot;</span></span>
<span class="line"><span style="color: #002339">include &quot;Sprite.asm&quot;</span></span>
<span class="line"><span style="color: #002339">include &quot;Var.asm&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #002339">end     Main</span></span></code></pre></div>



<p class="has-medium-font-size wp-block-paragraph">Ponemos la dirección de inicio, teniendo en cuenta que haremos un cargador personificado. Indicamos dónde están los UDG, abrimos el canal dos, cambiamos borde, atributos, borramos la pantalla y pintamos el tablero. Nos quedamos en un bucle infinito que será el principal. </p>



<p class="has-medium-font-size wp-block-paragraph">Compilamos, cargamos en el emulador y vemos los resultados.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af49318535ab&quot;}" data-wp-interactive="core/image" data-wp-key="6af49318535ab" class="wp-block-image aligncenter size-full wp-lightbox-container"><img data-recalc-dims="1" loading="lazy" decoding="async" width="701" height="609" data-attachment-id="3640" data-permalink="https://espamatica.com/paso01_01/" data-orig-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso01_01.png?fit=701%2C609&amp;ssl=1" data-orig-size="701,609" data-comments-opened="1" data-image-title="Tablero de juego" data-image-description="" data-image-caption="&lt;p&gt;Ensamblador ZX Spectrum &amp;#8211; tablero de juego&lt;/p&gt;
" data-large-file="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso01_01.png?fit=701%2C609&amp;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso01_01.png?resize=701%2C609&#038;ssl=1" alt="Ensamblador ZX Spectrum - Tres en raya" class="wp-image-3640" srcset="https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso01_01.png?w=701&amp;ssl=1 701w, https://i0.wp.com/espamatica.com/wp-content/uploads/2023/04/Paso01_01.png?resize=300%2C261&amp;ssl=1 300w" sizes="auto, (max-width: 701px) 100vw, 701px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Ensamblador ZX Spectrum &#8211; tablero de juego</figcaption></figure>



<h2 id="ensamblador-zx-spectrum-conclusion" class="wp-block-heading has-large-font-size">Ensamblador ZX Spectrum, conclusión</h2>



<p class="has-medium-font-size wp-block-paragraph">En este capítulo hemos diseñado y pintado el tablero sobre el que se desarrollarán las partidas de tres en raya.</p>



<p class="has-medium-font-size wp-block-paragraph">En el próximo capítulo de Ensamblador ZX Spectrum OXO implementaremos los marcadores y la partida a dos jugadores.</p>



<p class="has-medium-font-size wp-block-paragraph">Todo el código que hemos generado lo podéis descargar desde <a href="https://espamatica.com/wp-content/uploads/2023/04/OXO_0x01.zip">aquí</a>.</p>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<h2 class="wp-block-heading has-large-font-size">Enlaces de interés</h2>



<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://notepad-plus-plus.org/" target="_blank" rel="noreferrer noopener nofollow">Notepad++</a></li>



<li class="has-medium-font-size"><a href="https://code.visualstudio.com/" target="_blank" rel="noreferrer noopener nofollow">Visual Studio Code</a></li>



<li class="has-medium-font-size"><a href="https://www.sublimetext.com/" target="_blank" rel="noreferrer noopener nofollow">Sublime Text</a></li>



<li class="has-medium-font-size"><a href="https://github.com/chernandezba/zesarux" target="_blank" rel="noreferrer noopener nofollow">ZEsarUX</a></li>



<li class="has-medium-font-size"><a href="https://pasmo.speccy.org/" target="_blank" rel="noreferrer noopener nofollow">PASMO</a></li>



<li class="has-medium-font-size"><a href="https://git-scm.com/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Instalaci%C3%B3n-de-Git" target="_blank" rel="noreferrer noopener nofollow">Git</a></li>



<li class="has-medium-font-size"><a href="https://wiki.speccy.org/cursos/ensamblador/indice" target="_blank" rel="noreferrer noopener nofollow">Curso de ensamblador Z80 de Compiler Software</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/wp-content/uploads/2021/10/00-Referencia-Z80.zip">Referencia Z80</a></li>



<li class="has-medium-font-size"><a href="https://t.me/EnsambladorZXSpectrum" target="_blank" rel="noreferrer noopener nofollow">Ensamblador Z80 en Telegram</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/wp-content/uploads/2023/05/Espamatica.zip">Archivo .dsk con los juegos de los tutoriales</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x0f-ensamblador-zx-spectrum-marciano-depuracion/">Personalización y depuración con ZEsarUX</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/wp-content/uploads/2023/06/Ensamblador-para-ZX-Spectrum-OXO.zip">Tutorial completo en formato PDF y EPUB</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.itch.io/tres-en-raya" rel="nofollow noopener" target="_blank">El proyecto en itch.io</a></li>
</ul>
</div>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<p class="has-background has-medium-font-size wp-block-paragraph" style="background-color:#cdd6dd">Ensamblador para ZX Spectrum OXO por&nbsp;<a href="https://espamatica.com/">Juan Antonio Rubio García</a>.<br>Esta obra está bajo licencia de&nbsp;<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank" rel="noreferrer noopener nofollow">Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License</a>.</p>



<div align="center">
<a href="http://www.safecreative.org/work/2306054511935" rel="nofollow noopener" target="_blank"><img decoding="async" src="https://resources.safecreative.org:443/work-creativity-declaration/2306054511935/label/declaration-1-human-real-300" style="border:0;" title="null"/></a>
</div>
<br><br>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<p class="has-medium-font-size wp-block-paragraph">También puedes visitar el resto de tutoriales:</p>



<ul class="wp-block-list">
<li class="has-medium-font-size">.Net
<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://espamatica.com/mediatime/">MediaTime</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/nullabledatetimepicker/">NullableDateTimePicker</a></li>
</ul>
</li>



<li class="has-medium-font-size">Z80
<ul class="wp-block-list">
<li class="has-medium-font-size"><a href="https://espamatica.com/entorno-de-desarrollo-para-ensamblador-z80/">Entorno de desarrollo</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/numeros-bcd-spectrum/">Números BCD</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/posiciones-de-pantalla-zx-spectrum/">Pantalla ZX Spectrum</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/ensamblador-zx-spectrum-pong-introduccion/">Pong</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x00-ensamblador-zx-spectrum-marciano-introduccion/">Batalla Espacial</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/0x01-ensamblador-zx-spectrum-oxo-tablero-de-juego/">Tres en raya</a></li>



<li class="has-medium-font-size"><a href="https://espamatica.com/uso-de-beepfx/">Uso de BeepFX</a></li>
</ul>
</li>
</ul>
</div>



<p class="has-medium-font-size wp-block-paragraph">Y recuerda, si lo usas no te limites a copiarlo, intenta entenderlo y adaptarlo a tus necesidades.</p>
</div>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://espamatica.com/0x01-ensamblador-zx-spectrum-oxo-tablero-de-juego/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3628</post-id>	</item>
	</channel>
</rss>
