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:
commit
ab75057acb
|
@ -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
|
||||
|
|
|
@ -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!
|
||||
|
||||
|
|
Loading…
Reference in New Issue