Traducción de macros en los demas días y revisiones del Día 6

This commit is contained in:
jota 2022-01-11 18:10:49 -03:00
parent 804a750d8b
commit 22323c4ab5
4 changed files with 112 additions and 75 deletions

View File

@ -1018,32 +1018,32 @@ por ejemplo, lo siguiente dividirá el ancho de la pantalla en dos, utilizando e
#01 SFT2
```
### macros HALF
### macros MITAD
para seguir ilustrando el uso de las macros, podríamos definir unas macros HALF y HALF2, utilizando DIV o SFT.
para seguir ilustrando el uso de las macros, podríamos definir unas macros MITAD y MITAD2, utilizando DIV o SFT.
usando DIV:
```
%HALF { #02 DIV } ( numero -- numero/2 )
%HALF2 { #0002 DIV2 } ( numero -- numero/2 )
%MITAD { #02 DIV } ( numero -- numero/2 )
%MITAD2 { #0002 DIV2 } ( numero -- numero/2 )
```
usando SFT:
```
%HALF { #01 SFT } ( numero -- numero/2 )
%HALF2 { #01 SFT2 } ( numero -- numero/2 )
%MITAD { #01 SFT } ( numero -- numero/2 )
%MITAD2 { #01 SFT2 } ( numero -- numero/2 )
```
and use any of them to calculate the center:
```
.Pantalla/ancho DEI2 HALF2 .Pantalla/x DEO2
.Pantalla/alto DEI2 HALF2 .Pantalla/y DEO2
.Pantalla/ancho DEI2 MITAD2 .Pantalla/x DEO2
.Pantalla/alto DEI2 MITAD2 .Pantalla/y DEO2
```
notemos que la macro HALF2 que utiliza SFT2 necesitará un byte menos que la que utiliza DIV2. esto puede o no ser importante dependiendo de tus prioridades :)
notemos que la macro MITAD2 que utiliza SFT2 necesitará un byte menos que la que utiliza DIV2. esto puede o no ser importante dependiendo de tus prioridades :)
## dibujando sprites en posiciones específicas

View File

@ -286,7 +286,7 @@ una posible desventaja es que podría ser menos legible. pero una posible ventaj
```
( incrementar un short desde la página cero )
%ZP-INC2 { DUP LDZ2 INC2 ROT STZ2 } ( zp-dirección -- )
%PC-INC2 { DUP LDZ2 INC2 ROT STZ2 } ( pc-dirección -- )
```
## variables en direcciones relativas
@ -402,7 +402,7 @@ el siguiente programa ilustra los puntos anteriores, haciendo que nuestro cuadra
|20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &pad $2 &x $2 &y $2 &direc $2 &pixel $1 &sprite $1 ]
( macros/constantes )
%HALF2 { #01 SFT2 } ( desplazar un bit a la derecha ) ( corto -- corto/2 )
%MITAD2 { #01 SFT2 } ( desplazar un bit a la derecha ) ( corto -- corto/2 )
%color-borrar { #40 } ( borrar 1bpp sprite del primer plano )
%color-2 { #4a } ( dibujar sprite de 1bpp con color 2 y transparencia )
@ -418,7 +418,7 @@ el siguiente programa ilustra los puntos anteriores, haciendo que nuestro cuadra
#2ce5 .Sistema/b DEO2
( fijar la Pantalla/y a la mitad de la pantalla, menos 4 )
.Pantalla/alto DEI2 HALF2 #0004 SUB2 .Pantalla/y DEO2
.Pantalla/alto DEI2 MITAD2 #0004 SUB2 .Pantalla/y DEO2
( fijar la dirección del sprite )
;cuadrado .Pantalla/direc DEO2
@ -503,7 +503,7 @@ el siguiente programa nos permite controlar la posición horizontal de nuestro c
|80 @Controlador [ &vector $2 &boton $1 &tecla $1 ]
( macros/constantes )
%HALF2 { #01 SFT2 } ( desplazar un bit a la derecha ) ( corto -- corto/2 )
%MITAD2 { #01 SFT2 } ( desplazar un bit a la derecha ) ( corto -- corto/2 )
%color-borrar { #40 } ( borrar 1bpp sprite del primer plano )
%color-2 { #4a } ( dibujar sprite de 1bpp con color 2 y transparencia )
@ -519,7 +519,7 @@ el siguiente programa nos permite controlar la posición horizontal de nuestro c
#2ce5 .Sistema/b DEO2
( fijar la Pantalla/y a la mitad de la pantalla, menos 4 )
.Pantalla/alto DEI2 HALF2 #0004 SUB2 .Pantalla/y DEO2
.Pantalla/alto DEI2 MITAD2 #0004 SUB2 .Pantalla/y DEO2
( fijar la dirección del sprite )
;cuadrado .Pantalla/direc DEO2
@ -826,7 +826,7 @@ la sección "borrar el sprite" no es realmente necesaria en este caso debido a l
|20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &pad $2 &x $2 &y $2 &direc $2 &pixel $1 &sprite $1 ]
( macros/constantes )
%HALF2 { #01 SFT2 } ( desplazar un bit a la derecha ) ( corto -- corto/2 )
%MITAD2 { #01 SFT2 } ( desplazar un bit a la derecha ) ( corto -- corto/2 )
%8MOD { #07 AND } ( byte -- byte%8 )
%A-CORTO { #00 SWP } ( byte -- corto )
@ -845,8 +845,8 @@ la sección "borrar el sprite" no es realmente necesaria en este caso debido a l
#2ce5 .Sistema/b DEO2
( fijar Pantalla/x y y a la mitad de la pantalla menos 4 )
.Pantalla/ancho DEI2 HALF2 #0004 SUB2 .Pantalla/x DEO2
.Pantalla/alto DEI2 HALF2 #0004 SUB2 .Pantalla/y DEO2
.Pantalla/ancho DEI2 MITAD2 #0004 SUB2 .Pantalla/x DEO2
.Pantalla/alto DEI2 MITAD2 #0004 SUB2 .Pantalla/y DEO2
( establecer la dirección del sprite )
;animación .Pantalla/direc DEO2

View File

@ -562,7 +562,7 @@ para llamar a la subrutina, podrías hacer algo como lo siguiente
```
#0008 ( empujar x inicial )
.Pantalla/altura DEI2 HALF2 ( empujar y )
.Pantalla/altura DEI2 MITAD2 ( empujar y )
#ff ( empujar longitud de la línea )
;dibujar-linea-horizontal JSR2 ( llamar subrutina )
```

View File

@ -32,7 +32,7 @@ empecemos con el siguiente programa como plantilla. incluye los datos para un sp
( dispositivos )
|00 @Sistema [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ]
|20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &auto $1 &pad $1 &x $2 &y $2 &direc $2 &pixel $1 &sprite $1 ]
|80 @Controlador [ &vector $2 &boton $1 &llave $1 ]
|80 @Controlador [ &vector $2 &boton $1 &tecla $1 ]
( macros )
%RTN { JMP2r }
@ -44,7 +44,7 @@ empecemos con el siguiente programa como plantilla. incluye los datos para un sp
#2ce9 .Sistema/r DEO2
#01c0 .Sistema/g DEO2
#2ce5 .Sistema/b DEO2
BRK
@ -138,11 +138,11 @@ en este punto, la pila tiene la nueva x en la parte superior de la pila, y el an
podemos compararlos en modo mantener para conservar esos valores en la pila, y hacer nuestro salto como antes:
```
GTH2k ( ¿es ese ancho mayor que x? aka ¿es x menor que el ancho? )
GTH2k ( ¿es ese ancho mayor que x?, o también, ¿es x menor que el ancho? )
,&bucle-x JCN ( salta si x es menor que el límite )
```
cuando terminamos el bucle, tenemos que POP ambos valores.
cuando terminamos el bucle, tenemos que hacer POP de ambos valores.
usando esta estrategia, obtendríamos el siguiente bucle:
@ -177,7 +177,7 @@ lo siguiente muestra nuestro programa en contexto, llenando completamente la pri
( dispositivos )
|00 @Sistema [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ]
|20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &auto $1 &pad $1 &x $2 &y $2 &direc $2 &pixel $1 &sprite $1 ]
|80 @Controlador [ &vector $2 &boton $1 &llave $1 ]
|80 @Controlador [ &vector $2 &boton $1 &tecla $1 ]
( macros )
%RTN { JMP2r }
@ -331,7 +331,7 @@ podemos pensar en las dos palas del juego como dos rectángulos, cada uno con su
la coordenada x de cada pala puede ser constante, y la coordenada y debe ser de seguro una variable.
en esta parte veremos como dibujar las palas en base a estos parámetros, y también recapitularemos como cambiar sus coordenadas y con el controlador.
en esta parte veremos como dibujar las palas en base a estos parámetros, y también recapitularemos como cambiar sus coordenadas `y` con el controlador.
## dibujar las palas multi-tile
@ -521,7 +521,7 @@ un margen para separar las palas de los bordes podría ser agradable también:
por último, recuperemos nuestra macro HALF2 de días anteriores:
```
%HALF2 { #01 SFT2 } ( corto -- corto/2 )
%MITAD2 { #01 SFT2 } ( corto -- corto/2 )
```
### iniciar posiciones
@ -542,7 +542,7 @@ MARGEN SUB2 ANCHO-PALA SUB2
.derecha/x STZ2
```
para centrar las coordenadas y podemos restar la altura de la pala a la altura de la pantalla, y luego dividir entre dos:
para centrar las coordenadas `y` podemos restar la altura de la pala a la altura de la pantalla, y luego dividir entre dos:
```
.Pantalla/alto DEI2 ALTO-PALA SUB2 HALF2
@ -573,11 +573,11 @@ omitiendo la definición de las subrutinas dibuja-fondo y dibuja-pala, y como fo
( dispositivos )
|00 @Sistema [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ]
|20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &auto $1 &pad $1 &x $2 &y $2 &direc $2 &pixel $1 &sprite $1 ]
|80 @Controlador [ &vector $2 &boton $1 &llave $1 ]
|80 @Controlador [ &vector $2 &boton $1 &tecla $1 ]
( macros )
%RTN { JMP2r }
%HALF2 { #01 SFT2 } ( corto -- corto/2 )
%MITAD2 { #01 SFT2 } ( corto -- corto/2 )
( constantes )
%ANCHO-PALA { #0010 } ( 2 tiles )
@ -668,7 +668,7 @@ podemos usar las flechas arriba y abajo para cambiar la posición de la pala izq
podemos tener una macro para definir la velocidad de la pala, es decir, cuánto sumaremos o restaremos al mover cada cuadro:
```
%VELOC-PALA { #0001 }
%VEL-PALA { #0001 }
```
todo esto puede ir dentro de su propia subrutina para facilitar la lectura:
@ -686,10 +686,10 @@ todo esto puede ir dentro de su propia subrutina para facilitar la lectura:
&derecha JMP ( salta si no se ha pulsado ninguno de los dos )
&izquierda-arriba
.izquierda/y LDZ2 VELOC-PALA SUB2 .izquierda/y STZ2
.izquierda/y LDZ2 VEL-PALA SUB2 .izquierda/y STZ2
,&derecha JMP
&izquierda-abajo
.izquierda/y LDZ2 VELOC-PALA ADD2 .izquierda/y STZ2
.izquierda/y LDZ2 VEL-PALA ADD2 .izquierda/y STZ2
,&derecha JMP
&derecha
@ -702,13 +702,13 @@ todo esto puede ir dentro de su propia subrutina para facilitar la lectura:
&fin JMP ( salta si no se ha pulsado ninguno de los dos )
&derecha-arriba
.derecha/y LDZ2 VELOC-PALA SUB2 .derecha/y STZ2
.derecha/y LDZ2 VEL-PALA SUB2 .derecha/y STZ2
,&fin JMP
&derecha-abajo
.derecha/y LDZ2 VELOC-PALA ADD2 .derecha/y STZ2
.derecha/y LDZ2 VEL-PALA ADD2 .derecha/y STZ2
&fin
POP ( hacer pop al valor duplicado del botón )
POP ( hacer POP al valor duplicado del botón )
RTN
```
@ -879,22 +879,22 @@ utilizaremos este último enfoque con la velocidad, ya que nos ayudará a discut
incluimos estas variables en nuestra página cero, complementando las x e y que ya teníamos:
```
@pelota [ &x $2 &y $2 &veloc-x $2 &veloc-y $2 ]
@pelota [ &x $2 &y $2 &vel-x $2 &vel-y $2 ]
```
### diferentes direcciones
si, por ejemplo, iniciamos veloc-x con 1
si, por ejemplo, iniciamos vel-x con 1
```
#0001 .pelota/veloc-x STZ2
#0001 .pelota/vel-x STZ2
```
podemos hacer que la pelota se mueva hacia la derecha haciendo:
```
( dentro de actualiza-pelota )
.pelota/veloc-x LDZ2 ( obtener veloc-x )
.pelota/vel-x LDZ2 ( obtener vel-x )
.pelota/x LDZ2 ( obtener x )
ADD2 ( sumarlos )
.pelota/x STZ2 ( almacenar nueva x )
@ -908,7 +908,7 @@ en otros contextos, uno podría decir, ¡"-1"!
pero no hemos utilizado signos negativos en uxn; ¡no podemos!
entonces, ¿existe un valor positivo de veloc-x que haga que x se reduzca al sumarlos?
entonces, ¿existe un valor positivo de vel-x que haga que x se reduzca al sumarlos?
¡normalmente pensaríamos que no lo hay y que la pregunta no tiene sentido!
@ -960,14 +960,14 @@ podríamos continuar así obteniendo más y más números "negativos" que funcio
volviendo a nuestro código, si inicializamos nuestra velocidad con:
```
#ffff .pelota/veloc-x STZ2
#ffff .pelota/vel-x STZ2
```
y luego usamos exactamente el mismo código para actualizar la posición:
```
( dentro de actualiza-pelota )
.pelota/veloc-x LDZ2 ( obtener veloc-x )
.pelota/vel-x LDZ2 ( obtener vel-x )
.pelota/x LDZ2 ( obtener x )
ADD2 ( sumarlas )
.pelota/x STZ2 ( almacenar nueva x )
@ -978,8 +978,8 @@ ADD2 ( sumarlas )
podría tener sentido establecer estos valores como macros:
```
%PELOTA-VELOC-POS { #0001 } ( +1 )
%PELOTA-VELOC-NEG { #ffff } ( -1 )
%PELOTA-VEL-POS { #0001 } ( +1 )
%PELOTA-VEL-NEG { #ffff } ( -1 )
```
### implementando el movimiento de la pelota
@ -989,12 +989,12 @@ basándonos en lo que acabamos de discutir, podemos empezar nuestra subrutina de
```
@actualiza-pelota ( -- )
( obtener velocidad-x y x )
.pelota/veloc-x LDZ2 .pelota/x LDZ2
.pelota/vel-x LDZ2 .pelota/x LDZ2
ADD2 ( sumarlos )
.pelota/x STZ2 ( guarda la nueva x )
( obtener velocidad-y e y )
.pelota/velocidad-y LDZ2 .pelota/y LDZ2
.pelota/vel-y LDZ2 .pelota/y LDZ2
ADD2 ( sumarlos )
.pelota/y STZ2 ( almacenar nueva y )
RTN
@ -1011,8 +1011,8 @@ HALF2 .pelota/x STZ2
HALF2 .pelota/y STZ2
( iniciar la velocidad de la pelota )
PELOTA-VELOC-POS .pelota/veloc-x STZ2
PELOTA-VELOC-POS .pelota/veloc-y STZ2
PELOTA-VEL-POS .pelota/vel-x STZ2
PELOTA-VEL-POS .pelota/vel-y STZ2
```
woohoo! se mueve, pero de momento sale volando :)
@ -1057,11 +1057,11 @@ considerando que hay un margen en la parte superior, podemos hacer esta comproba
.pelota/y LDZ2
MARGEN-PARED
LTH2 ( ¿es pelota-y menos que el margen? )
,&establecer-veloc-pos JCN
,&establecer-vel-pos JCN
,&verif-pared-inf JMP
&establecer-veloc-pos
PELOTA-VELOC-POS .pelota/veloc-y STZ2
&establecer-vel-pos
PELOTA-VEL-POS .pelota/vel-y STZ2
&continuar JMP
&verif-pared-inf
```
@ -1081,11 +1081,11 @@ la coordenada y de la pared inferior sería la altura de la pantalla, menos el m
.Pantalla/alto DEI2
MARGEN-PARED SUB2 ( altura - margen )
GTH2 ( ¿es la pelota-y mayor que la pared-y? )
,&establecer-veloc-neg JCN
,&establecer-vel-neg JCN
&continuar JMP
&establecer-veloc-neg
PELOTA-VELOC-NEG .pelota/veloc-y STZ2
&establecer-vel-neg
PELOTA-VEL-NEG .pelota/vel-y STZ2
&continuar
```
@ -1097,13 +1097,13 @@ nuestra subrutina de actualización de la pelota tiene el siguiente aspecto ahor
@actualiza-pelota ( -- )
( actualizar x )
( obtener velocidad-x y x )
.pelota/speed-x LDZ2 .pelota/x LDZ2
.pelota/vel-x LDZ2 .pelota/x LDZ2
ADD2 ( sumarlas )
.pelota/x STZ2 ( guardar la nueva x )
( actualizar y )
( obtener velocidad-y e y )
.pelota/veloc-y LDZ2 .pelota/y LDZ2
.pelota/vel-y LDZ2 .pelota/y LDZ2
ADD2 ( sumarlos )
.pelota/y STZ2 ( almacenar nueva y )
@ -1112,11 +1112,11 @@ nuestra subrutina de actualización de la pelota tiene el siguiente aspecto ahor
.pelota/y LDZ2
MARGEN-PARED
LTH2 ( ¿es la pelota-y menor que el margen? )
,&establecer-veloc-pos JCN
,&establecer-vel-pos JCN
,&verif-pared-inf JMP
&establecer-veloc-pos
PELOTA-VELOC-POS .pelota/veloc-y STZ2
&establecer-vel-pos
PELOTA-VEL-POS .pelota/vel-y STZ2
&continuar JMP
&verif-pared-inf
@ -1124,11 +1124,11 @@ nuestra subrutina de actualización de la pelota tiene el siguiente aspecto ahor
.pantalla/alto DEI2
MARGEN-PARED SUB2 ( altura - margen )
GTH2 ( ¿es la pelota-y mayor que la pared-y? )
,&establecer-veloc-neg JCN
,&establecer-vel-neg JCN
&continuar JMP
&establecer-veloc-neg
PELOTA-VELOC-NEG .pelota/veloc-y STZ2
&establecer-vel-neg
PELOTA-VEL-NEG .pelota/vel-y STZ2
&continuar
RTN
```
@ -1149,12 +1149,12 @@ para ello, podemos comprobar si x es menor que la suma del margen y el ancho de
( dentro de actualiza-pelota )
&verif-pala-izq
.pelota/x LDZ2
MARGEN ALTO-PALA ADD2
MARGEN ANCHO-PALA ADD2
LTH2 ( ¿es la pelota-x menor que el margen + el ancho-de-pala? )
,&x-en-izq JCN
,&x-en-izquierda JCN
,&verif-pala-der JMP
&x-en-izq
&x-en-izquierda
( ... )
&verif-pala-der
@ -1171,20 +1171,20 @@ si esas dos condiciones se cumplen, entonces podemos establecer una velocidad po
```
( dentro de actualiza-pelota )
&x-en-izq
&x-en-izquierda
.pelota/y LDZ2 DUP2
.izquierda/y LDZ2 TAM-PELOTA SUB2 GTH2 ( primera bandera ) STH
.izquierda/y LDZ2 ALTO-PALA ADD2 LTH2 ( segunda bandera )
STHr ( recupera la primera bandera )
AND ( hacer AND en ambas banderas )
&rebote-izq JCN
&rebote-izquierda JCN
```
donde rebote-izq sería:
donde rebote-izquierda sería:
```
&rebote-izq
PELOTA-VELOC-POS .pelota/veloc-x STZ2
&rebote-izquierda
PELOTA-VEL-POS .pelota/vel-x STZ2
,&fin JMP
```
@ -1192,17 +1192,17 @@ donde rebote-izq sería:
podemos dejar que la pelota siga moviéndose, pero comprobando que no ha cruzado la pared izquierda, comparando con 0000.
todo el código x-en-izq terminaría pareciendo:
todo el código x-en-izquierda terminaría pareciendo:
```
( dentro de actualiza-pelota )
&x-en-izq
&x-en-izquierda
.pelota/y LDZ2 DUP2
.izquierda/y LDZ2 BALL-SIZE SUB2 GTH2 ( primera bandera ) STH
.izquierda/y LDZ2 PADDLE-HEIGHT ADD2 LTH2 ( segunda bandera )
.izquierda/y LDZ2 TAM-PELOTA SUB2 GTH2 ( primera bandera ) STH
.izquierda/y LDZ2 ALTO-PALA ADD2 LTH2 ( segunda bandera )
STHr ( recupera la primera bandera )
AND ( hacer AND en ambas banderas )
,&rebote-izq JCN
,&rebote-izquierda JCN
.pelota/x LDZ2 #0000 NEQ2 ( ¿ha llegado a la pared? )
,&fin JCN
@ -1214,7 +1214,7 @@ todo el código x-en-izq terminaría pareciendo:
,&fin JMP
&rebote-izquierda
PELOTA-VELOC-POS .pelota/veloc-x STZ2
PELOTA-VEL-POS .pelota/vel-x STZ2
,&fin JMP
&verif-pala-der
@ -1230,3 +1230,40 @@ si comprobáramos que la coordenada x es menor que ffff, ¡entonces cada valor p
este puede ser otro buen ejercicio para ti: ¿cómo comprobarías si la bola ha cruzado la pared izquierda independientemente de su velocidad?
### pala derecha
para la pala derecha haremos lo mismo que arriba, pero cambiando las comparaciones relativas a la coordenada x de la pelota: usaremos el ancho de la pantalla como referencia para la pared derecha, y a partir de ahí le restaremos el margen y el ancho.
```
&verif-pala-der
.pelota/x LDZ2 TAM-PELOTA ADD2 ( pelota-x + tamaño-pelota )
.Pantalla/ancho DEI2 MARGEN SUB2 ANCHO-PALA SUB2
GTH2 ( ¿es la coordenada derecha de la bola mayor que el ancho de la pantalla - margen - ancho de la paleta? )
,&x-en-derecha JCN
&fin JMP
&x-en-derecha
.pelota/y LDZ2 DUP2
.derecha/y LDZ2 TAM-PELOTA SUB2 GTH2 ( primera bandera ) STH
.derecha/y LDZ2 ALTO-PALA ADD2 LTH2 ( segunda bandera )
STHr ( recupera la primera bandera )
AND ( juntar las dos banderas )
,&rebote-derecha JCN
.pelota/x LDZ2
.Pantalla/ancho DEI2 NEQ2 ( ¿ha llegado a la pared? )
,&fin JCN
&reset-derecha
( aquí puedes aumentar la puntuación
de la paleta izquierda )
;reset JSR2
,&fin JMP
&rebote-derecha
PELOTA-VEL-NEG .pelota/vel-x STZ2
,&fin JMP
&fin
RTN
```