Merge pull request 'jota/acentos_en_código_y_ocb' (#8) from Roboe/compudanzas:jota/acentos_en_código_y_ocb into main

Reviewed-on: https://codeberg.org/sejo/compudanzas/pulls/8
This commit is contained in:
sejo 2022-02-03 02:00:48 +01:00
commit 2824e1f0fc
7 changed files with 141 additions and 136 deletions

View File

@ -12,9 +12,9 @@ o primero que nada... ¿qué es uxn?
=> https://100r.co/site/uxn.html 100R - uxn
te invito a leer "why create a smol virtual computer" en ese sitio de 100R, también.
te invito a leer "why create a smol virtual computer" ("por qué crear una pequeña computadora virtual") del sitio de 100R, para que conozcas más sobre la historia del proyecto.
uxn es el núcleo de la computadora virtual (¿por el momento?) varvara. es lo suficientemente simple como para ser emulada por diversas plataformas de computación viejas y nuevas y ser seguida a mano.
uxn es el núcleo de la computadora virtual varvara. es lo suficientemente simple como para ser emulada por diversas plataformas de computación viejas y nuevas y ser seguida a mano.
personalmente, veo en ella las siguientes virtudes:
@ -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 conceotos 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:
@ -237,7 +237,7 @@ uxntal es el lenguaje ensamblador para la máquina uxn.
estuvimos hablando antes sobre el cpu uxn y las 32 instrucciones que sabe cómo ejecutar, cada una de ellas codificada como una sola palabra de 8 bits (byte).
ese lenguaje ensamblador uxntal 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.
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.
@ -272,7 +272,7 @@ ensamblémoslo y corrámoslo:
$ ./bin/uxnasm hola.tal bin/hola.rom && ./bin/uxnemu bin/hola.rom
```
veremos una salida con el siguiente aspecto:
se abrirá una ventana negra, y en la consola veremos una salida parecida a la siguiente:
```
Assembled bin/hola.rom in 5 bytes(0.40% used), 0 labels, 0 macros.
@ -317,13 +317,13 @@ mirando en la tabla de dispositivos de la referencia varvara, podemos ver que el
=> https://wiki.xxiivv.com/site/varvara.html varvara
asique, el dispositivo 18 corresponde a "escribir en consola", o salida estándar.
así que, el dispositivo 18 corresponde a "escribir en consola", o salida estándar.
¡nuestro programa está enviando el valor hexadecimal 68 (carácter 'h') a la salida estándar!
puedes ver los valores hexadecimales de los caracteres ascii en la siguiente tabla:
=> https://wiki.xxiivv.com/site/ascii.html ascii table
=> https://wiki.xxiivv.com/site/ascii.html tabla ascii
### números literales
@ -339,6 +339,13 @@ podemos ver que el ensamblador reporta que nuestro programa es de 5 bytes de tam
Assembled bin/hola.rom(5 bytes), 0 labels, 0 macros.
```
podemos confirmarlo usando el programa wc (word count):
```
$ wc --bytes hola.rom
5 hola.rom
```
para le curiose (¡como tú!), podemos usar una herramienta como hexdump para ver sus contenidos:
```
@ -349,7 +356,7 @@ $ hexdump -C bin/hola.rom
80 es el "opcode" correspondiente a LIT y 17 es el opcode correspondiente a DEO. ¡y ahí están nuestros 68 y 18!
¡osea, efectivamente, nuestro programa ensamblado presenta una correspondencia uno a uno con las instrucciones que acabamos de escribir!
¡o sea, efectivamente, nuestro programa ensamblado presenta una correspondencia uno a uno con las instrucciones que acabamos de escribir!
de hecho, podríamos haber escrito nuestro programa con estos números hexadecimales (el código máquina) y hubiera funcionado igual:
@ -389,7 +396,7 @@ las runas son caracteres especiales que indican a uxnasm algún preprocesamiento
## runa de pad absoluto
ya vimos la primera de ellas: | define un pad absoluto: la dirección donde el siguiente elemento escrito será ubicado en memoria.
ya vimos la primera de ellas: | define un pad absoluto, o sea, la dirección donde el siguiente elemento escrito será ubicado en memoria.
si la dirección es de 1 byte de longitud, es asumido que es una dirección del espacio de entrada/salida o de la página cero.
@ -408,7 +415,7 @@ usando esta runa, podemos reescribir nuestro primer programa como:
|0100 #68 #18 DEO
```
el siguiente tendría el mismo comportamiento que el programa de arriba, pero usando un byte menos (en la siguiente sección/día veremos por qué)
el siguiente tendría el mismo comportamiento que el programa de arriba, pero usando un byte menos (en el siguiente día veremos por qué):
```
( hola.tal )
@ -421,13 +428,13 @@ importante: recuerda que esta runa (y las otras con la palabra "literal" en su n
si solo queremos tener un número específico en la memoria principal, sin empujarlo a la pila, simplemente escribiríamos el número tal cual, "crudo". esta es la forma en que lo hicimos en nuestros primeros programas de arriba.
## runa de carácter "crudo" o "raw"
## runa de carácter crudo o "raw"
esta es la runa de carácter raw: '
esta es la runa de carácter crudo: '
nos permite que uxnasm decodifique el valor numérico de un carácter ascii.
nuestro "programa hola" luciría de la siguiente manera, usando las nuevas runas que acabamos de aprender:
nuestro programa "hola" luciría de la siguiente manera, usando las nuevas runas que acabamos de aprender:
```
( hola.tal )
@ -438,7 +445,7 @@ nuestro "programa hola" luciría de la siguiente manera, usando las nuevas runas
#0a #18 DEO ( nuevalínea )
```
el "raw" en el nombre de esta runa indica que no es literal, por ejemplo que no agrega una instrucción LIT.
el "crudo" en el nombre de esta runa indica que no es literal, por ejemplo que no agrega una instrucción LIT.
por eso debemos incluir una instrucción LIT.
@ -556,7 +563,7 @@ usando todos estos macros y runas, nuestro programa puede terminar luciendo como
termina siendo ensamblado en los mismos 25 bytes que los ejemplos de arriba, pero con suerte más legible y mantenible.
podemos "mejorar" este programa haciendo que un bucle imprima los caracteres, pero estudiaremos eso más tarde.
podemos "mejorar" este programa haciendo que un bucle imprima los caracteres, pero estudiaremos eso más tarde :)
# ejercicios
@ -574,16 +581,16 @@ EMIT EMIT EMIT EMIT EMIT
si miras en la tabla ascii, verás que el código hexadecimal 30 corresponde al dígito 0, 31 al dígito 1, siguiendo hasta el 39 que corresponde al dígito 9.
define un macro IMPRIMIR-DIGITO que toma un número (del 0 al 9) de la pila, e imprime el correspondiente dígito en la salida estándar.
define un macro IMPRIMIR-DÍGITO que toma un número (del 0 al 9) de la pila, e imprime el correspondiente dígito en la salida estándar.
```
%IMPRIMIR-DIGITO { } ( número -- )
%IMPRIMIR-DÍGITO { } ( número -- )
```
recordemos que el número tendría que ser escrito como un byte completo para que sea uxntal válido. si quisieras probar esta macro con, por ejemplo, el número 2, tendrías que escribirlo como 02:
```
#02 IMPRIMIR-DIGITO
#02 IMPRIMIR-DÍGITO
```
# instrucciones del día 1

View File

@ -291,7 +291,6 @@ las 8 posibles combinaciones del byte 'píxel' que tenemos para dibujar un píxe
+ <tr><td>42</td><td>primer plano</td><td>2</td></tr>
+ <tr><td>43</td><td>primer plano</td><td>3</td></tr>
+ </table>
& * 00: dibujar el píxel con el color 0 en la capa del fondo
& * 01: dibujar un píxel con el color 1 en la capa del fondo
& * 02: dibujar el píxel con el color 2 en la capa del fondo
@ -470,7 +469,7 @@ usando estas macros que definimos arriba, nuestro código puede terminar viéndo
agradable, ¿no? ¡las operaciones ahora se ven más claras! y si quisiéramos tener esta línea disponible para usarla en otras posiciones, podríamos definir una macro para ella:
```
%DIBUJAR-LINEA { } ( -- )
%DIBUJAR-LÍNEA { } ( -- )
```
¡intenta escribiendo la macro y utilizándola en diferentes posiciones de la pantalla!

View File

@ -13,7 +13,7 @@ el dispositivo controlador del ordenador varvara nos permite leer las entradas d
la definición de sus puertos tendría el siguiente aspecto en un programa típico:
```
|80 @Controlador [ &vector $2 &boton $1 &tecla $1 ]
|80 @Controlador [ &vector $2 &botón $1 &tecla $1 ]
```
## el byte de botón
@ -87,7 +87,7 @@ este utiliza el procedimiento de dibujo de sprites que probamos el día anterior
( dispositivos )
|00 @Sistema [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ]
|20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &pad $2 &x $2 &y $2 &direc $2 &píxel $1 &sprite $1 ]
|80 @Controlador [ &vector $2 &boton $1 &tecla $1 ]
|80 @Controlador [ &vector $2 &botón $1 &tecla $1 ]
( programa principal )
|0100
@ -107,7 +107,7 @@ BRK
#0008 .Pantalla/y DEO2
( establecer la direccion del sprite )
;cuadrado .Pantalla/direc DEO2
;cuadrado .Pantalla/direc DEO2
( dibujar el sprite en el fondo )
( usando el color 1 para el contorno )
@ -280,9 +280,9 @@ hay varias runas que se refieren a direcciones y etiquetas. uxnasm las lee y las
en los días anteriores ya hablamos de algunas de ellas; esta es una recapitulación de las mismas y una introducción de las nuevas:
* dirección literal en la página cero: .etiqueta (un byte)
* dirección literal en memoria principal: ;label (un corto)
* dirección literal relativa en la memoria principal: ,label (un byte)
* dirección cruda ("raw") en la memoria principal: :label (un byte)
* dirección literal en memoria principal: ;etiqueta (un corto)
* dirección literal relativa en la memoria principal: ,etiqueta (un byte)
* dirección cruda ("raw") en la memoria principal: :etiqueta (un byte)
para definir las etiquetas, utilizamos:
@ -382,7 +382,7 @@ observe cómo las condiciones se escriben una tras otra: siempre que una bandera
también note que este código no está optimizado para el tamaño o la velocidad, sino para la legibilidad.
estaría en ti, por ejemplo, realizar una aritmética con el valor de la tecla que se pulsó para calcular el color a asignar al sprite - ¡podrías inspirarte en tu macro IMPRIMIR-DIGITO del día 1!
estaría en ti, por ejemplo, realizar una aritmética con el valor de la tecla que se pulsó para calcular el color a asignar al sprite - ¡podrías inspirarte en tu macro IMPRIMIR-DÍGITO del día 1!
# manipulación de la pila
@ -491,15 +491,15 @@ en el caso que acabamos de discutir la entrada es la tecla que se presiona, pero
esto implica que podríamos escribir la rutina como una macro:
```
%?DIGITO-ASCII { DUP #2f GTH SWP #3a LTH AND } ( byte -- bandera )
%?DÍGITO-ASCII { DUP #2f GTH SWP #3a LTH AND } ( byte -- bandera )
```
y utilizarla con el byte que queramos:
```
#30 ?DIGITO-ASCII ( empuja 01 hacia abajo en la pila )
#20 ?DIGITO-ASCII ( empuja 00 hacia abajo en la pila )
.Controlador/tecla DEI ?DIGITO-ASCII ( empuja la bandera correspondiente a la pila )
#30 ?DÍGITO-ASCII ( empuja 01 hacia abajo en la pila )
#20 ?DÍGITO-ASCII ( empuja 00 hacia abajo en la pila )
.Controlador/tecla DEI ?DÍGITO-ASCII ( empuja la bandera correspondiente a la pila )
```
### duplicados para los condicionales
@ -636,7 +636,7 @@ observa el uso de las máscaras AND, los saltos condicionales y algunas operacio
( dispositivos )
|00 @Sistema [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ]
|20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &pad $2 &x $2 &y $2 &direc $2 &píxel $1 &sprite ]
|80 @Controlador [ &vector $2 &boton $1 &tecla $1 ]
|80 @Controlador [ &vector $2 &botón $1 &tecla $1 ]
( programa principal )
|0100
@ -656,13 +656,13 @@ observa el uso de las máscaras AND, los saltos condicionales y algunas operacio
BRK
@en-controlador ( -> )
.Controlador/boton DEI DUP ( leer y duplicar el byte del boton )
.Controlador/botón DEI DUP ( leer y duplicar el byte del botón )
#01 AND ( aislar el bit 0, correspondiente a Ctrl )
,&relleno JCN ( si el bit no es 0, saltar al relleno, si no, continuar )
&contorno
#01 .Pantalla/sprite DEO ( dibujar contorno )
,&comprobar-flechas JMP ( continuar con la comprobación de las flechas )
,&comprobar-flechas JMP ( continuar con comprobar-flechas )
&relleno
#04 .Pantalla/sprite DEO ( dibujar relleno )
@ -672,11 +672,11 @@ BRK
DUP #10 AND ( aislar el bit 4, correspondiente a Arriba )
,&arriba JCN ( saltar si no es 0 )
DUP #20 AND ( aísla el bit 5, correspondiente a Abajo )
&down JCN ( salta si no es 0 )
&abajo JCN ( salta si no es 0 )
DUP #40 AND ( aislar el bit 6, correspondiente a Izquierda )
,&left JCN ( salta si no es 0 )
,&izquierda JCN ( salta si no es 0 )
DUP #80 AND ( aísla el bit 7, correspondiente a Derecha )
&right JCN ( salta si no es 0 )
&derecha JCN ( salta si no es 0 )
POP BRK

View File

@ -495,7 +495,7 @@ el siguiente programa nos permite controlar la posición horizontal de nuestro c
( dispositivos )
|00 @Sistema [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ]
|20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &pad $2 &x $2 &y $2 &direc $2 &píxel $1 &sprite $1 ]
|80 @Controlador [ &vector $2 &boton $1 &tecla $1 ]
|80 @Controlador [ &vector $2 &botón $1 &tecla $1 ]
( macros/constantes )
%MITAD2 { #01 SFT2 } ( desplazar un bit a la derecha ) ( corto -- corto/2 )
@ -530,11 +530,11 @@ BRK
( 2: cambiar de posición con las flechas )
&verificar-flechas
.Controlador/boton DEI
.Controlador/botón DEI
#40 AND ( aislar el bit 6, correspondiente a la izquierda )
,&izquierda JCN ( saltar si no es 0 )
.Controlador/boton DEI
.Controlador/botón DEI
#80 AND ( aislar el bit 7, correspondiente a la derecha )
,&derecha JCN ( saltar si no es 0 )
@ -630,7 +630,7 @@ para efectos prácticos te recomendaría tener un número de fotogramas correspo
por ejemplo, lo siguiente es una secuencia de ocho sprites de 1bpp que corresponden a una línea diagonal que se mueve desde abajo a la derecha hasta arriba a la izquierda:
```
@animacion
@animación
&fotograma0 00 00 00 00 00 00 01 03
&fotograma1 00 00 00 00 01 03 06 0c
&fotograma2 00 00 01 03 06 0c 18 30
@ -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 )
;animacion ( obtener la dirección de la animación )
; n ( obtener la dirección de la animación )
ADD2 ( añadir el desfase a la dirección )
```
@ -796,7 +796,6 @@ y entonces podríamos enviar eso al puerto Pantalla/direc:
.Pantalla/direc DEO2 ( establecer la dirección calculada )
```
## el programa completo
el programa que hace todo esto tendría el siguiente aspecto.
@ -810,10 +809,10 @@ 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 pixelado. 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 píxelado. la diagonal se mueve desde abajo a la derecha hasta arriba a la izquierda
```
( hola-animacion.tal )
( hola-animación.tal )
( dispositivos )
|00 @Sistema [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ]
@ -843,7 +842,7 @@ la sección "borrar el sprite" no es realmente necesaria en este caso debido a l
.Pantalla/alto DEI2 MITAD2 #0004 SUB2 .Pantalla/y DEO2
( establecer la dirección del sprite )
;animacion .Pantalla/direc DEO2
;animación .Pantalla/direc DEO2
( establecer el vector de pantalla )
;en-cuadro .Pantalla/vector DEO2
@ -856,14 +855,14 @@ BRK
( 1: borrar sprite )
( borrar sprite del primer plano )
color-clear .Pantalla/sprite DEO
color-borrar .Pantalla/sprite DEO
( 2: actualizar la dirección del sprite )
.cuentaftg LDZ ( cargar cuentafotograma )
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 )
;animacion ( 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 )
.Pantalla/direc DEO2 ( establecer la dirección calculada )
@ -872,7 +871,7 @@ BRK
BRK
( datos del sprite )
@animacion
@animación
&fotograma0 00 00 00 00 00 00 01 03
&fotograma1 00 00 00 00 01 03 06 0c
&fotograma2 00 00 01 03 06 0c 18 30
@ -914,7 +913,7 @@ podemos utilizar estas macros para dividir la frecuencia en nuestro código:
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 )
;animacion ( 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 )
.Pantalla/direc DEO2 ( establecer la dirección calculada )
```

View File

@ -13,7 +13,7 @@ adicionalmente, tiene un par de cortos correspondientes a las coordenadas x,y de
vemos este dispositivo definido en uxntal de la siguiente manera:
```
|90 @Raton [ &vector $2 &x $2 &y $2 &estado $1 &pad $3 &despx $2 &despy $2 ]
|90 @Ratón [ &vector $2 &x $2 &y $2 &estado $1 &pad $3 &despx $2 &despy $2 ]
```
## byte de estado
@ -26,17 +26,17 @@ normalmente, en un ratón de tres botones, el primer botón es el izquierdo, el
utilizando un ratón de tres botones como este, tendríamos ocho valores posibles para el byte de estado, por ejemplo :
* 00 cuando no se pulsa ninguno de los botones
* 01 cuando solo se pulsa el primer botón
* 00 cuando no se presiona ninguno de los botones
* 01 cuando solo se presiona el primer botón
* 02 cuando solo se presiona el segundo botón
* 04 cuando solo se pulsa el tercer botón
* 04 cuando solo se presiona el tercer botón
nota que al igual que el dispositivo controlador, este sistema nos permite comprobar si hay varios botones pulsados a la vez:
nota que al igual que el dispositivo controlador, este sistema nos permite comprobar si hay varios botones presionados a la vez:
* 03 cuando el primer y el segundo botón están presionados
* 05 cuando se pulsan el primer y el tercer botón
* 06 cuando se pulsan el segundo y el tercer botón
* 07 cuando se pulsan los tres botones
* 05 cuando se presionan el primer y el tercer botón
* 06 cuando se presionan el segundo y el tercer botón
* 07 cuando se presionan los tres botones
recuerda que podemos utilizar las máscaras AND, tal y como se introdujo en el {tutorial de uxn día 3}, para aislar y evaluar por separado cualquiera de estos bits.
@ -62,7 +62,7 @@ dependiendo del dispositivo, los valores pueden ser mayores que 0001 o menores q
el vector del ratón se disparará en cualquiera de los siguientes eventos:
* se ha pulsado un botón
* se ha presionado un botón
* se suelta un botón
* el ratón se ha movido
* la rueda del ratón se ha movido
@ -75,21 +75,21 @@ el siguiente es un ejemplo simple que ilustra el uso de los siguientes elementos
* vector del ratón
* coordenadas x e `y` del ratón
* estado del ratón (pulsado o no pulsado)
* estado del ratón (presionado o no presionado)
combinado con un condicional y el dibujo de un sprite.
dibuja nuestro cuadrado en la posición del ratón, cambiando su color cuando se pulsa cualquier botón del ratón.
dibuja nuestro cuadrado en la posición del ratón, cambiando su color cuando se presiona cualquier botón del ratón.
=> ./img/screenshot_uxn-draw-with-mouse.png captura de pantalla que muestra un dibujo realizado con el programa: líneas onduladas compuestas por cuadrados superpuestos de dos colores diferentes
```
( hola-raton.tal )
( hola-ratón.tal )
( dispositivos )
|00 @Sistema [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ]
|20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &pad $2 &x $2 &y $2 &direc $2 &píxel $1 &sprite $1 ]
|90 @Raton [ &vector $2 &x $2 &y $2 &estado $1 &pad $3 &despx $2 &despy $2 ]
|90 @Ratón [ &vector $2 &x $2 &y $2 &estado $1 &pad $3 &despx $2 &despy $2 ]
( init )
|0100
@ -99,19 +99,19 @@ dibuja nuestro cuadrado en la posición del ratón, cambiando su color cuando se
#2ce5 .Sistema/b DEO2
( establecer vector del ratón )
;en-raton .Raton/vector DEO2
;en-ratón .Ratón/vector DEO2
( establecer dirección del sprite )
;cuadrado .Pantalla/direc DEO2
BRK
@en-raton ( -> )
.Raton/x DEI2 .Pantalla/x DEO2
.Raton/y DEI2 .Pantalla/y DEO2
@en-ratón ( -> )
.Ratón/x DEI2 .Pantalla/x DEO2
.Ratón/y DEI2 .Pantalla/y DEO2
( salta si se pulsa algún botón )
.Raton/estado DEI ,&presionado JCN
( salta si se presiona algún botón )
.Ratón/estado DEI ,&presionado JCN
( dibujar sprite usando el color 2 y 0 en el fondo )
#02 .Pantalla/sprite DEO
@ -157,7 +157,7 @@ este es un programa que logra dibujar el puntero en la pantalla
( dispositivos )
|00 @Sistema [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ]
|20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &pad $2 &x $2 &y $2 &direc $2 &píxel $1 &sprite $1 ]
|90 @Raton [ &vector $2 &x $2 &y $2 &estado $1 &pad $3 &despx $2 &despy $2 ]
|90 @Ratón [ &vector $2 &x $2 &y $2 &estado $1 &pad $3 &despx $2 &despy $2 ]
( página cero )
|0000
@ -171,14 +171,14 @@ este es un programa que logra dibujar el puntero en la pantalla
#2ce5 .Sistema/b DEO2
( establecer el vector del ratón )
;en-raton .Raton/vector DEO2
;en-ratón .Ratón/vector DEO2
( establecer dirección del sprite )
;puntero_icn .Pantalla/direc DEO2
BRK
@en-raton ( -> )
@en-ratón ( -> )
( envía la posición del puntero a la pantalla )
.puntero/x LDZ2 .Pantalla/x DEO2
.puntero/y LDZ2 .Pantalla/y DEO2
@ -187,8 +187,8 @@ BRK
#40 .Pantalla/sprite DEO
( actualizar la posición del puntero )
.Raton/x DEI2 .puntero/x STZ2
.Raton/y DEI2 .puntero/y STZ2
.Ratón/x DEI2 .puntero/x STZ2
.Ratón/y DEI2 .puntero/y STZ2
( enviar la posición del puntero a la pantalla )
.puntero/x LDZ2 .Pantalla/x DEO2
@ -211,13 +211,13 @@ este modo de mezcla te permitiría dibujar cosas en el plano de fondo y que el p
### algunos problemas
ahora, podemos ver que el programa funciona, pero está inundando la subrutina en-raton con mucho código.
ahora, podemos ver que el programa funciona, pero está inundando la subrutina en-ratón con mucho código.
eso es aun mas cierto si consideramos que solo estamos dibujando el puntero y no tomando ninguna otra acción, como responder a los botones.
crear una macro para todo este código podría ser posible, pero también poco práctico debido a la cantidad de código.
¿tal vez podríamos tener un JMP a otra sección del programa, que al final tiene otro JMP para c vnm a la posición correspondiente en la subrutina en-raton?
¿tal vez podríamos tener un JMP a otra sección del programa, que al final tiene otro JMP para c vnm a la posición correspondiente en la subrutina en-ratón?
de hecho, eso es casi lo que haremos, pero con un elemento adicional de uxn: ¡su pila de retorno!
@ -247,8 +247,8 @@ en primer lugar, vamos a mover nuestra subrutina de dibujo de punteros a otra et
#40 .Pantalla/sprite DEO
( actualizar la posición del puntero )
.Raton/x DEI2 .puntero/x STZ2
.Raton/y DEI2 .puntero/y STZ2
.Ratón/x DEI2 .puntero/x STZ2
.Ratón/y DEI2 .puntero/y STZ2
( enviar la posición del puntero a la pantalla )
.puntero/x LDZ2 .Pantalla/x DEO2
@ -263,24 +263,24 @@ notemos que podríamos unir las acciones de actualizar la posición del puntero
```
( actualizar la posición del puntero y enviarla a la pantalla )
.Raton/x DEI2 DUP2 .puntero/x STZ2 .Pantalla/x DEO2
.Raton/y DEI2 DUP2 .puntero/y STZ2 .Pantalla/y DEO2
.Ratón/x DEI2 DUP2 .puntero/x STZ2 .Pantalla/x DEO2
.Ratón/y DEI2 DUP2 .puntero/y STZ2 .Pantalla/y DEO2
```
esto dejaría nuestra subrutina en-raton vacía:
esto dejaría nuestra subrutina en-ratón vacía:
```
@en-raton( -> )
@en-ratón( -> )
BRK
```
### usando saltos normales
con lo que ya sabemos, y dependiendo de la posición de dibuja-puntero con respecto a en-raton, podríamos hacer un salto relativo:
con lo que ya sabemos, y dependiendo de la posición de dibuja-puntero con respecto a en-ratón, podríamos hacer un salto relativo:
```
@en-raton ( -> )
@en-ratón ( -> )
,dibuja-puntero JMP
&retorno
@ -291,7 +291,7 @@ BRK
o un salto absoluto:
```
@en-raton ( -> )
@en-ratón ( -> )
;dibuja-puntero JMP2
&retorno
@ -299,12 +299,12 @@ o un salto absoluto:
BRK
```
el detalle esta en que si queremos que ocurra algo más después de dibujar el puntero dentro de en-raton, no podemos atrás fácilmente.
el detalle esta en que si queremos que ocurra algo más después de dibujar el puntero dentro de en-ratón, no podemos atrás fácilmente.
al final de nuestra subrutina dibuja-puntero, necesitaríamos "saltar hacia atrás" así:
```
;en-raton/retornar JMP2
;en-ratón/retornar JMP2
```
funcionaría, pero no es la mejor forma.
@ -324,7 +324,7 @@ en ambos casos, JSR empujará una dirección absoluta (2 bytes) hacia abajo en l
por ejemplo, nuestros saltos podrían reescribirse de la siguiente manera. en el caso de un salto relativo:
```
@en-raton ( -> )
@en-ratón ( -> )
,dibuja-puntero JSR
( algo más aquí )
@ -336,7 +336,7 @@ BRK
y en el caso de un salto absoluto:
```
@en-raton ( -> )
@en-ratón ( -> )
;dibuja-puntero JSR2
( algo más aquí )
@ -415,7 +415,7 @@ este es el programa hola-puntero.tal, pero utilizando dibuja-puntero como subrut
( dispositivos )
|00 @Sistema [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ]
|20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &pad $2 &x $2 &y $2 &direc $2 &píxel $1 &sprite $1 ]
|90 @Raton [ &vector $2 &x $2 &y $2 &estado $1 &pad $3 &despx $2 &despy $2 ]
|90 @Ratón [ &vector $2 &x $2 &y $2 &estado $1 &pad $3 &despx $2 &despy $2 ]
( macros )
%RTN { JMP2r }
@ -432,14 +432,14 @@ este es el programa hola-puntero.tal, pero utilizando dibuja-puntero como subrut
#2ce5 .Sistema/b DEO2
( establecer el vector del ratón )
;en-raton .Raton/vector DEO2
;en-ratón .Ratón/vector DEO2
( establecer dirección del sprite )
;puntero_icn .Pantalla/direc DEO2
BRK
@en-raton ( -> )
@en-ratón ( -> )
;dibuja-puntero JSR2 ( o ,dibuja-puntero JSR )
( algo más )
@ -454,8 +454,8 @@ BRK
#40 .Pantalla/sprite DEO
( actualizar la posición del puntero )
.Raton/x DEI2 .puntero/x STZ2
.Raton/y DEI2 .puntero/y STZ2
.Ratón/x DEI2 .puntero/x STZ2
.Ratón/y DEI2 .puntero/y STZ2
( enviar la posición del puntero a la pantalla )
.puntero/x LDZ2 .Pantalla/x DEO2
@ -746,7 +746,7 @@ puedes tener diferentes "modos" seleccionables: tal vez cambien el pincel que es
considera cómo seleccionarías esos modos: ¿botones en pantalla? ¿teclas del teclado? ¿acordes con los botones del ratón?
ten en cuenta que puedes cambiar el vector de un dispositivo durante el tiempo de ejecución: podrías tener una subrutina en-raton diferente dependiendo del modo que hayas seleccionado :)
ten en cuenta que puedes cambiar el vector de un dispositivo durante el tiempo de ejecución: podrías tener una subrutina en-ratón diferente dependiendo del modo que hayas seleccionado :)
¿cómo podrías utilizar la rueda del ratón como ayuda para dibujar?

View File

@ -32,14 +32,14 @@ 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 &píxel $1 &sprite $1 ]
|80 @Controlador [ &vector $2 &boton $1 &tecla $1 ]
|80 @Controlador [ &vector $2 &botón $1 &tecla $1 ]
( macros )
%RTN { JMP2r }
( programa principal )
|0100
@configuracion
@configuración
( establecer los colores del sistema )
#2ce9 .Sistema/r DEO2
#01c0 .Sistema/g DEO2
@ -79,7 +79,7 @@ el segundo paso, añadir 8 a x, ya lo sabemos:
```
.Pantalla/x DEI2 #0008 ADD2 ( añadir 8 a x )
.Pantalla/x DEO2 ( guardar la nueva x )
.Pantalla/x DEO2 ( almacenar nueva x )
```
comprobar si x es menor que el límite, saltando si lo es, sería algo así:
@ -100,7 +100,7 @@ integrando todo ello, podríamos obtener:
#03 .Pantalla/sprite DEO ( dibujar sprite de 1bpp con color 3 y 0 )
.Pantalla/x DEI2 #0008 ADD2 ( añadir 8 a la x )
DUP2 ( duplicar la nueva x )
.Pantalla/x DEO2 ( guardar la nueva x )
.Pantalla/x DEO2 ( almacenar nueva x )
.Pantalla/ancho DEI2 ( obtener el límite )
LTH2 ,&bucle-x JCN ( saltar si x es menor que el límite )
```
@ -176,14 +176,14 @@ 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 &píxel $1 &sprite $1 ]
|80 @Controlador [ &vector $2 &boton $1 &tecla $1 ]
|80 @Controlador [ &vector $2 &botón $1 &tecla $1 ]
( macros )
%RTN { JMP2r }
( programa principal )
|0100
@configuracion
@configuración
( establecer los colores del sistema )
#2ce9 .Sistema/r DEO2
#01c0 .Sistema/g DEO2
@ -420,7 +420,7 @@ adicionalmente, guardaré el color en la pila de retorno:
```
@dibuja-pala ( x^ y^ color -- )
( guardar color )
( almacenar color )
STH
( establecer `y` y x iniciales )
@ -572,7 +572,7 @@ omitiendo la definición de las subrutinas dibuja-fondo y dibuja-pala y como for
( 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 &píxel $1 &sprite $1 ]
|80 @Controlador [ &vector $2 &boton $1 &tecla $1 ]
|80 @Controlador [ &vector $2 &botón $1 &tecla $1 ]
( macros )
%RTN { JMP2r }
@ -592,7 +592,7 @@ omitiendo la definición de las subrutinas dibuja-fondo y dibuja-pala y como for
( programa principal )
|0100
@configuracion
@configuración
( establecer los colores del sistema )
#2ce9 .Sistema/r DEO2
#01c0 .Sistema/g DEO2
@ -676,13 +676,13 @@ todo esto puede ir dentro de su propia subrutina para facilitar la lectura:
@actualiza-palas ( -- )
&izquierda
( pala izquierda: botones arriba y abajo )
.Controlador/boton DEI
.Controlador/botón DEI
DUP #10 AND ( comprobar bit para arriba )
,&izquierda-arriba JCN
DUP #20 AND ( comprobar bit para abajo )
&izquierda-abajo JCN
&derecha JMP ( salta si no se ha pulsado ninguno de los dos )
&derecha JMP ( salta si no se ha presionado ninguno de los dos )
&izquierda-arriba
.izquierda/y LDZ2 VEL-PALA SUB2 .izquierda/y STZ2
@ -698,7 +698,7 @@ todo esto puede ir dentro de su propia subrutina para facilitar la lectura:
DUP #02 AND ( comprobar bit para B )
&derecha-abajo JCN
&fin JMP ( salta si no se ha pulsado ninguno de los dos )
&fin JMP ( salta si no se ha presionado ninguno de los dos )
&derecha-arriba
.derecha/y LDZ2 VEL-PALA SUB2 .derecha/y STZ2
@ -990,7 +990,7 @@ basándonos en lo que acabamos de discutir, podemos empezar nuestra subrutina ac
( obtener velocidad-x y `x` )
.pelota/vel-x LDZ2 .pelota/x LDZ2
ADD2 ( sumar ambas cosas )
.pelota/x STZ2 ( guarda la nueva x )
.pelota/x STZ2 ( almacenar nueva x )
( obtener velocidad-y e `y` )
.pelota/vel-y LDZ2 .pelota/y LDZ2
@ -1098,7 +1098,7 @@ nuestra subrutina actualiza-pelota tiene el siguiente aspecto hasta el momento:
( obtener velocidad-x y x )
.pelota/vel-x LDZ2 .pelota/x LDZ2
ADD2 ( sumar ambas cosas )
.pelota/x STZ2 ( guardar la nueva x )
.pelota/x STZ2 ( almacenar nueva x )
( actualizar y )
( obtener velocidad-y e `y` )
@ -1303,7 +1303,7 @@ aquí está todo el código que hemos escrito hoy:
|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 &píxel $1 &sprite $1 ]
|80 @Controlador [ &vector $2 &boton $1 &tecla $1 ]
|80 @Controlador [ &vector $2 &botón $1 &tecla $1 ]
( macros )
%RTN { JMP2r }
@ -1331,7 +1331,7 @@ aquí está todo el código que hemos escrito hoy:
( configuración )
|0100
@configuracion ( -> )
@configuración ( -> )
( establecer los colores del sistema )
#2ce9 .Sistema/r DEO2
#01c0 .Sistema/g DEO2
@ -1411,12 +1411,12 @@ RTN
( obtener velocidad-x y x )
.pelota/vel-x LDZ2 .pelota/x LDZ2 ( obtener x )
ADD2 ( sumar ambas cosas )
.pelota/x STZ2 ( guardar la nueva x )
.pelota/x STZ2 ( almacenar nueva x )
( obtener velocidad-y e `y` )
.pelota/vel-y LDZ2 .pelota/y LDZ2 ( obtener y )
ADD2 ( sumar ambas cosas )
.pelota/y STZ2 ( guardar la nueva y )
.pelota/y STZ2 ( almacenar nueva y )
( comprobar colisiones con las paredes )
&verif-pared-sup
@ -1546,13 +1546,13 @@ RTN
@actualiza-palas ( -- )
&izquierda
( pala izquierda: botones arriba 10 y abajo 20 )
.Controlador/boton DEI
.Controlador/botón DEI
DUP #10 AND ( comprobar bit para arriba )
,&izquierda-arriba JCN
DUP #20 AND ( comprobar bit para abajo )
,&izquierda-abajo JCN
,&derecha JMP ( salta si no se ha pulsado ninguno de los dos )
,&derecha JMP ( salta si no se ha presionado ninguno de los dos )
&izquierda-arriba
.izquierda/y LDZ2 VEL-PALA SUB2 .izquierda/y STZ2
@ -1568,7 +1568,7 @@ RTN
DUP #02 AND ( comprobar bit para B )
,&derecha-abajo JCN
,&fin JMP ( salta si no se ha pulsado ninguno de los dos )
,&fin JMP ( salta si no se ha presionado ninguno de los dos )
&derecha-arriba
.derecha/y LDZ2 VEL-PALA SUB2 .derecha/y STZ2
@ -1585,7 +1585,7 @@ RTN
```
@dibuja-pala ( x^ y^ color -- )
( guardar color )
( almacenar color )
STH
( establecer `y` y x iniciales )

View File

@ -13,7 +13,7 @@ el dispositivo de archivo en el ordenador varvara nos permite leer y escribir en
sus puertos se definen normalmente de la siguiente manera:
```
|a0 @Archivo [ &vector $2 &exito $2 &estad $2 &borrar $1 &adjuntar $1 &nombre $2 &largo $2 &leer $2 &escribir $2 ]
|a0 @Archivo [ &vector $2 &éxito $2 &estad $2 &borrar $1 &adjuntar $1 &nombre $2 &largo $2 &leer $2 &escribir $2 ]
```
* el corto vector no se utiliza actualmente
@ -51,9 +51,9 @@ podemos usar una estructura como la siguiente, donde el nombre del archivo y la
;archivo/datos .Archivo/lectura DEO2
( comprobar el byte éxito y saltar según corresponda )
Archivo/exito DEI2 #0000 EQU2 ,&fallo JCN
Archivo/éxito DEI2 #0000 EQU2 ,&fallo JCN
&exito
&éxito
LIT 'Y .Consola/escribir DEO
RTN
@ -68,9 +68,9 @@ RTN
nótese que para el nombre del archivo estamos usando la runa de cadena cruda o `raw` (") que nos permite escribir varios caracteres en la memoria del programa hasta encontrar un espacio en blanco.
en este ejemplo estamos escribiendo un carácter en la consola en función de que el corto `exito` sea cero o no, pero podríamos decidir realizar cualquier acción que consideremos apropiada.
en este ejemplo estamos escribiendo un carácter en la consola en función de que el corto `éxito` sea cero o no, pero podríamos decidir realizar cualquier acción que consideremos apropiada.
además, en este ejemplo no nos preocupa realmente cuántos bytes se han leído realmente: ¡tenga en cuenta que esta información se almacena en Archivo/exito hasta que se produzca otra lectura o escritura!
además, en este ejemplo no nos preocupa realmente cuántos bytes se han leído realmente: ¡tenga en cuenta que esta información se almacena en Archivo/éxito hasta que se produzca otra lectura o escritura!
es importante recordar que, como siempre en este contexto, estamos tratando con bytes crudos.
@ -97,9 +97,9 @@ el siguiente programa escribirá "hola" y una nueva línea (0a) en un archivo ll
;archivo/datos .Archivo/escribir DEO2
( leer y evaluar el byte éxito )
.Archivo/exito DEI2 #0006 NEQ2 ,&fallo JCN
.Archivo/éxito DEI2 #0006 NEQ2 ,&fallo JCN
&exito
&éxito
LIT 'Y .Consola/escribir DEO
RTN
@ -139,9 +139,9 @@ podríamos adaptar nuestra subrutina anterior para cargar el archivo de temas y
;tema/datos .Archivo/cargar DEO2
( comprobar el byte éxito y saltar según corresponda )
.Archivo/exito DEI2 #0006 NEQ2 ,&fallo JCN
.Archivo/éxito DEI2 #0006 NEQ2 ,&fallo JCN
&exito
&éxito
( establecer los colores del sistema a partir de los datos leídos )
;tema/r LDA2 .Sistema/r DEO2
;tema/g LDA2 .Sistema/g DEO2
@ -177,9 +177,9 @@ y para hacer la operación contraria, podemos leer los colores del sistema en nu
;tema/datos .Archivo/guardar DEO2
( comprobar el byte de éxito y saltar según corresponda )
.Archivo/exito DEI2 #0006 NEQ2 ,&fallo JCN
.Archivo/éxito DEI2 #0006 NEQ2 ,&fallo JCN
&exito
&éxito
( ¿informar el éxito? )
RTN
@ -198,7 +198,7 @@ el dispositivo fechahora (o "datetime") puede ser útil para el cronometraje de
tiene varios campos que podemos leer, todos ellos basados en la hora del sistema actual y la zona horaria:
```
|b0 @FechaHora [ &ano $2 &mes $1 &dia $1 &hora $1 &minuto $1 &segundo $1 &ddls $1 &dda $2 &eshdv $1 ]
|b0 @FechaHora [ &año $2 &mes $1 &día $1 &hora $1 &minuto $1 &segundo $1 &ddls $1 &dda $2 &eshdv $1 ]
```
* el byte año corresponde al número de año de la llamada era común
@ -234,10 +234,10 @@ por fin, ¡el dispositivo de audio! o debería decir, ¡los dispositivos de audi
varvara tiene cuatro dispositivos estéreo idénticos (o "canales"), que se mezclan antes de pasar a los altavoces/auriculares:
```
|30 @Audio0 [ &vector $2 &posicion $2 &salida $1 &pad $3 &adsr $2 &largo $2 &direc $2 &volumen $1 &tono $1 ]
|40 @Audio1 [ &vector $2 &posicion $2 &salida $1 &pad $3 &adsr $2 &largo $2 &direc $2 &volumen $1 &tono $1 ]
|50 @Audio2 [ &vector $2 &posicion $2 &salida $1 &pad $3 &adsr $2 &largo $2 &direc $2 &volumen $1 &tono $1 ]
|60 @Audio3 [ &vector $2 &posicion $2 &salida $1 &pad $3 &adsr $2 &largo $2 &direc $2 &volumen $1 &tono $1 ]
|30 @Audio0 [ &vector $2 &posición $2 &salida $1 &pad $3 &adsr $2 &largo $2 &direc $2 &volumen $1 &tono $1 ]
|40 @Audio1 [ &vector $2 &posición $2 &salida $1 &pad $3 &adsr $2 &largo $2 &direc $2 &volumen $1 &tono $1 ]
|50 @Audio2 [ &vector $2 &posición $2 &salida $1 &pad $3 &adsr $2 &largo $2 &direc $2 &volumen $1 &tono $1 ]
|60 @Audio3 [ &vector $2 &posición $2 &salida $1 &pad $3 &adsr $2 &largo $2 &direc $2 &volumen $1 &tono $1 ]
```
de forma similar a como en el dispositivo de pantalla podemos dibujar apuntando a direcciones con datos de sprite, en los dispositivos de audio podremos reproducir sonidos apuntando a direcciones con datos de audio (muestras o "samples").
@ -273,7 +273,7 @@ el ejemplo piano.tal en el repositorio uxn, tiene varios de ellos, todos de 256
3d3c 3b3a 3a39 3838 3839 393a 3c3e 4146
4a50 575b 6064 686a 6e70 7274 7677 7a7d
@violin-pcm
@violín-pcm
8186 8d94 9ba0 a3a7 acb1 b5bc c2c7 cacc
cecf d0d1 d3d5 d8db dee1 e3e5 e6e5 e5e3
dfdc d7d0 c8c2 bbb2 a99f 968c 847c 746e
@ -406,7 +406,7 @@ en teoría, parecería que el siguiente programa debería reproducir nuestra mue
( hola-sonido.tal )
( dispositivos )
|30 @Audio0 [ &vector $2 &posicion $2 &salida $1 &pad $3 &adsr $2 &largo $2 &direc $2 &volumen $1 &tono $1 ]
|30 @Audio0 [ &vector $2 &posición $2 &salida $1 &pad $3 &adsr $2 &largo $2 &direc $2 &volumen $1 &tono $1 ]
( programa principal )
|0100
@ -472,7 +472,7 @@ ok, ¡ahora estamos listos para reproducir el sonido!
( hola-sonido.tal )
( dispositivos )
|30 @Audio0 [ &vector $2 &posicion $2 &salida $1 &pad $3 &adsr $2 &largo $2 &direc $2 &volumen $1 &tono $1 ]
|30 @Audio0 [ &vector $2 &posición $2 &salida $1 &pad $3 &adsr $2 &largo $2 &direc $2 &volumen $1 &tono $1 ]
( programa principal )
|0100