Merge pull request 'correciones_posrebase' (#9) from jotaemese/compudanzas:correciones_posresbase into main

Reviewed-on: https://codeberg.org/sejo/compudanzas/pulls/9
This commit is contained in:
sejo 2022-02-03 23:16:41 +01:00
commit ab75057acb
2 changed files with 37 additions and 37 deletions

View File

@ -25,7 +25,7 @@ personalmente, veo en ella las siguientes virtudes:
* ámbito de práctica y experimentación de computación dentro de límites
* ya portada a plataformas de computación actuales y de varios años de antigüedad
¡todos estos conceptos suenan genial para mí y espero que para ti también!
¡todos estos conceptos suenan genial para mí y espero que para ti también!
sin embargo, noto algunos aspectos que pueden hacerla parecer no tan asequible:
@ -103,7 +103,7 @@ irás descubriendo cómo el uso de la pila puede ser muy poderoso ya que ahorra
una de las cuestiones de programar una computadora a un nivel bajo de abstracción, como estaremos haciendo con uxn, es que tenemos que conocer y estar atentos a sus funcionamientos internos.
## 8-bits y hexadecimal
## 8-bits y hexadecimal
las palabras binarias de 8 bits, también conocidas como bytes, son los elementos básicos de codificación y manipulación de datos en uxn.
@ -160,7 +160,7 @@ la instrucción va a implicar normalmente un cambio en la o las pilas y algunas
=> https://git.sr.ht/~rabbits/uxn ~rabbits/uxn - sourcehut git
puedes construir estas herramientas desde el código fuente o descargar binarios precompilados para múltiples plataformas.
puedes construir estas herramientas desde el código fuente o descargar binarios precompilados para múltiples plataformas.
estas instrucciones son para sistemas basados en linux.
@ -239,7 +239,7 @@ estuvimos hablando antes sobre el cpu uxn y las 32 instrucciones que sabe cómo
que uxntal sea un lenguaje "ensamblado" implica que hay una relación uno a uno mapeando de una instrucción escrita en el lenguaje a una palabra de 8 bit correspondiente que el cpu puede interpretar.
por ejemplo, la instrucción ADD (suma) en uxntal es codificada como un byte con el valor 18 en hexadecimal y corresponde al siguiente conjunto de de acciones: toma los dos elementos superiores de la pila, los suma y empuja el resultado a la pila.
por ejemplo, la instrucción ADD (suma) en uxntal es codificada como un byte con el valor 18 en hexadecimal y corresponde al siguiente conjunto de acciones: toma los dos elementos superiores de la pila, los suma y empuja el resultado a la pila.
en sistemas de tipo forth podemos ver el siguiente tipo de notación para expresar los operandos que una instrucción toma de la pila y el o los resultados que empuja de vuelta a la pila:
@ -313,7 +313,7 @@ leyendo el programa de izquierda a derecha, podemos ver el siguiente comportamie
¿y qué es el dispositivo de entrada/salida con la dirección 18?
mirando en la tabla de dispositivos de la referencia varvara, podemos ver que el dispositivo con la dirección 1 en el nibble superior es la consola (entrada y salida estándar) y que la columna con la dirección 8 corresponde a "escritura".
mirando en la tabla de dispositivos de la referencia varvara, podemos ver que el dispositivo con la dirección 1 en el nibble superior es la consola (entrada y salida estándar) y que la columna con la dirección 8 corresponde al puerto "escritura".
=> https://wiki.xxiivv.com/site/varvara.html varvara
@ -342,14 +342,14 @@ Assembled bin/hola.rom(5 bytes), 0 labels, 0 macros.
podemos confirmarlo usando el programa wc (word count):
```
$ wc --bytes hola.rom
$ wc --bytes hola.rom
5 hola.rom
```
para le curiose (¡como tú!), podemos usar una herramienta como hexdump para ver sus contenidos:
```
$ hexdump -C bin/hola.rom
$ hexdump -C bin/hola.rom
00000000 80 68 80 18 17 |.h...|
00000005
```
@ -438,10 +438,10 @@ nuestro programa "hola" luciría de la siguiente manera, usando las nuevas runas
```
( hola.tal )
|0100 LIT 'h #18 DEO
LIT 'o #18 DEO
LIT 'l #18 DEO
LIT 'a #18 DEO
|0100 LIT 'h #18 DEO
LIT 'o #18 DEO
LIT 'l #18 DEO
LIT 'a #18 DEO
#0a #18 DEO ( nuevalínea )
```
@ -494,10 +494,10 @@ podemos reescribir nuestro "programa hola mundo" como sigue:
|10 @Consola [ &vector $2 &lee $1 &pad $5 &escribe $1 &error $1 ]
( programa principal )
|0100 LIT 'h .Consola/escribe DEO
LIT 'o .Consola/escribe DEO
LIT 'l .Consola/escribe DEO
LIT 'a .Consola/escribe DEO
|0100 LIT 'h .Consola/escribe DEO
LIT 'o .Consola/escribe DEO
LIT 'l .Consola/escribe DEO
LIT 'a .Consola/escribe DEO
#0a .Consola/escribe DEO ( nuevalínea )
```
@ -528,7 +528,7 @@ para llamar a un macro, solo escribimos su nombre:
```
( imprime carácter h )
LIT 'h EMIT
LIT 'h EMIT
```
podemos llamar a macros dentro de macros, por ejemplo:
@ -555,7 +555,7 @@ usando todos estos macros y runas, nuestro programa puede terminar luciendo como
( programa principal )
|0100 LIT 'h EMIT
LIT 'o EMIT
LIT 'o EMIT
LIT 'l EMIT
LIT 'a EMIT
NL

View File

@ -1,6 +1,6 @@
# tutorial uxn: día 4, variables y bucle de animación
¡esta es la cuarta sección del {tutorial de uxn}!
¡esta es la cuarta sección del {tutorial de uxn}!
aquí hablamos del bucle de animación del ordenador varvara, a través de su vector de dispositivo de pantalla.
@ -8,7 +8,7 @@ también hablamos del uso de la memoria del programa como un espacio para datos
# el vector pantalla
discutimos el dispositivo de pantalla de varvara en el día 2, pero nos saltamos su puerto vectorial para centrarnos en cómo dibujar con él:
discutimos el dispositivo de pantalla de varvara en el día 2, pero nos saltamos su puerto vectorial para centrarnos en cómo dibujar con él:
```
|20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &pad $2 &x $2 &y $2 &direc $2 &píxel $1 &sprite $1 ]
@ -61,7 +61,7 @@ BRK
BRK
```
nota que el código es muy similar al que escribimos el día 2 para dibujar una línea.
nota que el código es muy similar al que escribimos el día 2 para dibujar una línea.
en ese, incrementamos manualmente el valor de Pantalla/x para dibujar 6 píxeles.
@ -79,7 +79,7 @@ estos son algunos cambios para que los pruebes y practiques:
# variables
¡el vector de pantalla varvara abre todo un mundo de posibilidades!
¡el vector de pantalla varvara abre todo un mundo de posibilidades!
merece señalar que muchas de estas posibilidades requieren formas de almacenar y recuperar datos entre fotogramas.
@ -134,7 +134,7 @@ aquí están las dos instrucciones que nos ayudarían:
* LDA: "load", carga y empuja hacia abajo en la pila el valor en la dirección absoluta dada ( dirección -- valor )
* STA: "store", almacena en la dirección absoluta dada el valor dado ( dirección valor -- )
como ya hemos comentado, una dirección absoluta siempre tendrá una longitud de dos bytes.
como ya hemos comentado, una dirección absoluta siempre tendrá una longitud de dos bytes.
en el modo corto, LDA2 cargará un corto desde la dirección dada y STA2 almacenará un corto en la dirección dada.
@ -168,7 +168,7 @@ BRK
@píxel [ &x $2 &y $2 ]
```
nótese que podríamos haber conseguido el mismo resultado almacenando el resultado y luego recargándolo y enviándolo como salida.
nótese que podríamos haber conseguido el mismo resultado almacenando el resultado y luego recargándolo y enviándolo como salida.
aquí podemos ver cómo un DUP2 puede facilitar esa operación, siempre y cuando mantengamos un modelo mental (¡o tangible!) de lo que ocurre en la pila.
@ -245,7 +245,7 @@ en este caso el programa es más largo, pero puede ser visto como una buena plan
( establecer coordenadas iniciales x,y )
#0008 .píxel/x STZ2
#0008 .píxel/y STZ2
( establecer el vector de pantalla )
;en-cuadro .Pantalla/vector DEO2
BRK
@ -277,7 +277,7 @@ nota que las siguientes instrucciones también incrementarían .píxel/x, pero e
te recomiendo que sigas cómo cambia el contenido de la pila en cada uno de los siguientes pasos: ten en cuenta que algunas de las instrucciones están en modo corto :)
esta línea de código contiene la misma cantidad de bytes que la anterior.
esta línea de código contiene la misma cantidad de bytes que la anterior.
una posible desventaja es que podría ser menos legible. pero una posible ventaja es que podría convertirse en una macro:
@ -431,7 +431,7 @@ BRK
( 2: cambiar posición )
( incrementar sprite/pos-x )
.sprite/pos-x LDZ2 INC2 .sprite/pos-x STZ2
.sprite/pos-x LDZ2 INC2 .sprite/pos-x STZ2
( 3 : dibujar sprite )
( carga la coordenada x de la página cero y la envía a la pantalla )
@ -478,7 +478,7 @@ cuando usamos el vector controlador, estamos actuando en base a un cambio en el/
pero, ¿cómo podemos tratar de hacer una acción continua cuando una tecla se mantiene presionada?
en algunos sistemas operativos, si mantenemos una tecla pulsada, esta dispara el vector controlador varias veces, ¡pero no necesariamente al mismo ritmo que el vector pantalla!
en algunos sistemas operativos, si mantenemos una tecla pulsada, esta dispara el vector controlador varias veces, ¡pero no necesariamente al mismo ritmo que el vector pantalla!
¡esta repetición puede no permitir un movimiento suave como el que podemos conseguir si comprobamos el estado del controlador dentro de la subrutina en-cuadro!
@ -539,16 +539,16 @@ BRK
,&derecha JCN ( saltar si no es 0 )
( si no se ha pulsado ninguna de esas teclas, dibujar sin cambios )
,&dibujar JMP
,&dibujar JMP
&izquierda
( disminuir sprite/pos-x )
.sprite/pos-x LDZ2 #0001 SUB2 .sprite/pos-x STZ2
.sprite/pos-x LDZ2 #0001 SUB2 .sprite/pos-x STZ2
,&dibujar JMP
&derecha
( incrementar sprite/pos-x )
.sprite/pos-x LDZ2 INC2 .sprite/pos-x STZ2
.sprite/pos-x LDZ2 INC2 .sprite/pos-x STZ2
( 3 : dibujar sprite )
&dibujar
@ -577,7 +577,7 @@ por ejemplo, en lugar de tener un incremento incondicional en la coordenada x:
```
( incremento sprite/pos-x )
.sprite/pos-x LDZ2 INC2 .sprite/pos-x STZ2
.sprite/pos-x LDZ2 INC2 .sprite/pos-x STZ2
```
podríamos comprobar primero si ha alcanzado una cantidad específica, como el ancho de la pantalla, y no incrementar si es el caso:
@ -590,7 +590,7 @@ EQU2 ( ¿es x igual a la anchura de la pantalla - 8? )
&incremento
( incrementar sprite/pos-x )
.sprite/pos-x LDZ2 INC2 .sprite/pos-x STZ2
.sprite/pos-x LDZ2 INC2 .sprite/pos-x STZ2
&continuar
```
@ -612,7 +612,7 @@ podemos aplicar esas macros después de incrementar o decrementar. por ejemplo:
```
( incrementar sprite/pos-x )
.sprite/pos-x LDZ2 INC2
.sprite/pos-x LDZ2 INC2
.Pantalla/ancho DEI2 MOD2 ( aplicar modulo de ancho de pantalla )
.sprite/pos-x STZ2 ( almacenar el resultado )
```
@ -749,7 +749,7 @@ después de aplicar el módulo 8 a nuestro cuentafotogramas podemos multiplicarl
nota que hasta ahora hemos estado trabajando con bytes y todo ha ido bien.
sin embargo, ¡las direcciones absolutas son cortos!
sin embargo, ¡las direcciones absolutas son cortos!
esto significa que tenemos que convertir nuestro desfase en un corto para poder añadirlo a la dirección de los datos de la animación.
@ -786,7 +786,7 @@ añadir este desfase a la dirección de nuestra animación es comparativamente s
8MOD ( aplicar el módulo 8 para obtener la secuencia entre 0 y 7 )
#08 MUL ( multiplicar por 8 para obtener el desfase )
A-CORTO ( convertir a corto )
; n ( obtener la dirección de la animación )
;animación ( obtener la dirección de la animación )
ADD2 ( añadir el desfase a la dirección )
```
@ -809,7 +809,7 @@ nota que utiliza una secuencia similar a la de los programas anteriores:
la sección "borrar el sprite" no es realmente necesaria en este caso debido a los colores que se utilizan, pero lo sería cuando se utilizan colores con transparencia en ellos :)
=> ./img/screencap_uxn-animation.gif animación de una franja diagonal dentro de un cuadrado píxelado. la diagonal se mueve desde abajo a la derecha hasta arriba a la izquierda
=> ./img/screencap_uxn-animation.gif animación de una franja diagonal dentro de un cuadrado pixelado. la diagonal se mueve desde abajo a la derecha hasta arriba a la izquierda
```
( hola-animación.tal )
@ -953,7 +953,7 @@ en el {tutorial de uxn día 5} introducimos el dispositivo de ratón varvara par
¡también discutimos posibles estructuras para crear bucles y programas más complejos utilizando estos recursos!
¡primero te invito a tomar un descanso!
¡primero te invito a tomar un descanso!
después, ¡sigue explorando y comparte tus descubrimientos!