fecha holoceno
This commit is contained in:
parent
6c3fcba6a0
commit
5ee0826789
|
@ -0,0 +1,323 @@
|
|||
# avr-asm
|
||||
|
||||
explorando programación de microcontroladores avr a través de asm, en attiny85. {s-camino}
|
||||
|
||||
=> ./s-camino.gmi {s-camino}
|
||||
|
||||
# attiny85
|
||||
|
||||
## diagrama de pines
|
||||
|
||||
```diagrama de pines
|
||||
┌──────┐
|
||||
PB5 │1 8│ VCC
|
||||
PB3 │2 7│ PB2
|
||||
PB4 │3 6│ PB1
|
||||
GND │4 5│ PB0
|
||||
└──────┘
|
||||
```
|
||||
|
||||
además, cada pin es:
|
||||
|
||||
* 1: PB5 / PCINT5 / ~RESET / ADC0 / dW
|
||||
* 2: PB3 / PCINT3 / XTAL1 / CLKI / ~OC1B / ADC3
|
||||
* 3: PB4 / PCINT4 / XTAL2 / CLKO / OC1B / ADC2
|
||||
* 5: PB0 / MOSI / DI / SDA / AIN0 / OC0A / ~OC1A / AREF / PCINT0
|
||||
* 6: PB1 / MISO / DO / AIN1 / OC0B / OC1A / PCINT1
|
||||
* 7: PB2 / SCK / USCK / SCL / ADC1 / T0 / INT0 / PCINT2
|
||||
|
||||
para flashear nos interesan los pines desde el punto de vista de SPI:
|
||||
|
||||
```pines spi
|
||||
┌──────┐
|
||||
~RESET │1 8│ VCC
|
||||
│2 7│ SCK
|
||||
│3 6│ MISO
|
||||
GND │4 5│ MOSI
|
||||
└──────┘
|
||||
```
|
||||
|
||||
## programador
|
||||
|
||||
=> https://www.fischl.de/usbasp/ USBasp - USB programmer for Atmel AVR controllers (web)
|
||||
|
||||
## makefile
|
||||
|
||||
para ensamblar y flashear
|
||||
|
||||
```makefile
|
||||
# Makefile
|
||||
# nombre del programa sin .S :
|
||||
PROG = test
|
||||
# config hardware
|
||||
BOARD = attiny85
|
||||
PROGRAMMER = usbasp
|
||||
|
||||
# ensambla programa a .hex
|
||||
hex:
|
||||
avr-gcc -Os -DF_CPU=8000000 -mmcu=$(BOARD) -c $(PROG).S
|
||||
avr-ld -o $(PROG).elf $(PROG).o
|
||||
avr-objcopy $(PROG).elf -O ihex $(PROG).hex
|
||||
rm $(PROG).o $(PROG).elf
|
||||
|
||||
# flashea
|
||||
flash:
|
||||
avrdude -c $(PROGRAMMER) -p $(BOARD) -U flash:w:$(PROG).hex:i
|
||||
|
||||
# lee la memoria flash a read.hex
|
||||
read:
|
||||
avrdude -c $(PROGRAMMER) -p $(BOARD) -U flash:r:read.hex:i
|
||||
|
||||
# prueba conexión con programador y micro
|
||||
test:
|
||||
avrdude -c $(PROGRAMMER) -p $(BOARD)
|
||||
```
|
||||
|
||||
|
||||
|
||||
# programas
|
||||
|
||||
software experimental, compartido como referencia y sin garantía de ningún tipo :)
|
||||
|
||||
|
||||
## test.S
|
||||
|
||||
enciende un el pin PB0 — conecta un led
|
||||
|
||||
```
|
||||
; test.S
|
||||
; enciende un pin
|
||||
#include <avr/io.h>
|
||||
.org 0x0000
|
||||
|
||||
ldi r17, (1<<DDB0) ; configura al PB0 como salida
|
||||
sts DDRB, r17
|
||||
|
||||
ldi r16, (1<<PB0) ; enciende el bit correspondiente al PB0
|
||||
sts PORTB, r16 ; actualiza el puerto
|
||||
|
||||
sleep ; duerme por siempre (?)
|
||||
```
|
||||
|
||||
## blink.S
|
||||
|
||||
parpadea el pin PB0 usando el timer/counter0 — conecta un led
|
||||
|
||||
```
|
||||
; blink.S
|
||||
; parpadea el pin PB0 (OC0A)!
|
||||
; r16 y r17 se usan como registros auxiliares
|
||||
|
||||
; el programa usa el timer/counter 0 con:
|
||||
; * waveform generation mode (WGM0): 2, que es CTC (clear timer on compare match)
|
||||
; * compare match output A mode (COM0A): 1, que es toggle en compare match
|
||||
; * clock select (CS0): 5, que utiliza el reloj i/o dividido entre 1024
|
||||
|
||||
; notas sobre el reloj:
|
||||
; por default el attiny85 va a 8MHz, y el reloj i/o va a 1MHz
|
||||
; 1MHz/1024 ~= 967 Hz
|
||||
|
||||
#include <avr/io.h>
|
||||
; ***********************
|
||||
; vectores de interrupts:
|
||||
; ***********************
|
||||
; Reset
|
||||
.org 0x0000
|
||||
rjmp main
|
||||
|
||||
; ***********************
|
||||
; Main
|
||||
; ***********************
|
||||
.org 0x0010
|
||||
main:
|
||||
; pin PB0 (OC0A) como pin de salida
|
||||
ldi r16, (1<<DDB0) ; pin de salida
|
||||
sts DDRB, r16
|
||||
|
||||
; togglea OC0A en Compare match (1 en COM0A[1:0])
|
||||
; y usa modo Clear Timer on Compare Match (2 en WGM0[2:0])
|
||||
ldi r16, (0<<COM0A1) | (1<<COM0A0) | (1<<WGM01) | (0<<WGM00)
|
||||
sts TCCR0A, r16
|
||||
|
||||
; completa el modo WGM (waveform generaton mode, bit 2)
|
||||
; establece el tipo de reloj: 0b101 en CS0 es clk/1024
|
||||
ldi r16, (0<<WGM02) | (1<<CS02) | (0<<CS01) | (1<<CS00)
|
||||
sts TCCR0B, r16
|
||||
|
||||
; el TOP es el valor en OCR0A
|
||||
ldi r16, 0x80
|
||||
sts OCR0A, r16
|
||||
|
||||
loop:
|
||||
sleep
|
||||
rjmp loop
|
||||
```
|
||||
|
||||
## buzz.S
|
||||
|
||||
zumba el pin PB0 — conecta un buzzer
|
||||
|
||||
```
|
||||
; buzz.S
|
||||
; haz zumbar el pin PB0 (OC0A)!
|
||||
; el código es igual a blink.S, pero con diferentes frecuencias
|
||||
; r16 y r17 se usan como registros auxiliares
|
||||
|
||||
; el programa usa el timer/counter 0 con:
|
||||
; * waveform generation mode (WGM0): 2, que es CTC (clear timer on compare match)
|
||||
; * compare match output A mode (COM0A): 1, que es toggle en compare match
|
||||
; * clock select (CS0): 4, que utiliza el reloj i/o dividido entre 256
|
||||
|
||||
; notas sobre el reloj:
|
||||
; por default el attiny85 va a 8MHz, y el reloj i/o va a 1MHz
|
||||
; 1MHz/256 ~= 3906 Hz (/2 para el periodo completo ~=1953Hz)
|
||||
|
||||
#include <avr/io.h>
|
||||
; ***********************
|
||||
; vectores de interrupts:
|
||||
; ***********************
|
||||
; Reset
|
||||
.org 0x0000
|
||||
rjmp main
|
||||
|
||||
; ***********************
|
||||
; Main
|
||||
; ***********************
|
||||
.org 0x0010
|
||||
main:
|
||||
; pin PB0 (OC0A) como pin de salida
|
||||
ldi r16, (1<<DDB0) ; pin de salida
|
||||
sts DDRB, r16
|
||||
|
||||
; togglea OC0A en Compare match (1 en COM0A[1:0])
|
||||
; y usa modo Clear Timer on Compare Match (2 en WGM0[2:0])
|
||||
ldi r16, (0<<COM0A1) | (1<<COM0A0) | (1<<WGM01) | (0<<WGM00)
|
||||
sts TCCR0A, r16
|
||||
|
||||
; completa el modo WGM (waveform generaton mode, bit 2)
|
||||
; establece el tipo de reloj: 0b100 en CS0 es clk/256
|
||||
ldi r16, (0<<WGM02) | (1<<CS02) | (0<<CS01) | (0<<CS00)
|
||||
sts TCCR0B, r16
|
||||
|
||||
; el TOP es el valor en OCR0A
|
||||
ldi r16, 0x02
|
||||
sts OCR0A, r16
|
||||
|
||||
loop:
|
||||
sleep
|
||||
rjmp loop
|
||||
```
|
||||
|
||||
## alarm.S
|
||||
|
||||
zumbido intermitente en el pin PB0 — conecta un buzzer
|
||||
|
||||
```
|
||||
; alarm.S
|
||||
; zumbido intermitente en el pin PB0 (OC0A)!
|
||||
; r16 y r17 se usan como registros auxiliares
|
||||
; r20 tiene el valor de TCCR0A para apagar sonido
|
||||
; r21 tiene el valor de TCCR0A para encenderlo
|
||||
|
||||
; el programa usa el timer/counter 0 con:
|
||||
; * waveform generation mode (WGM0): 2, que es CTC (clear timer on compare match)
|
||||
; * compare match output A mode (COM0A): 1, que es toggle en compare match
|
||||
; * clock select (CS0): 3, que utiliza el reloj i/o dividido entre 64
|
||||
|
||||
; y el timer/counter 1 con:
|
||||
; * clock select (CS1): 0b1010, que es clk/512
|
||||
; * interrupciones de overflow y de compare match A:
|
||||
; - en compare match A el zumbido se apaga
|
||||
; - en overflow el zumbido inicia
|
||||
|
||||
; notas sobre el reloj:
|
||||
; por default el attiny85 va a 8MHz, y el reloj i/o va a 1MHz
|
||||
; 1MHz/256 ~= 3906 Hz (/2 para el periodo completo ~=1953Hz)
|
||||
|
||||
#include <avr/io.h>
|
||||
; ***********************
|
||||
; vectores de interrupts:
|
||||
; ***********************
|
||||
; Reset
|
||||
.org 0x0000
|
||||
rjmp main
|
||||
|
||||
; dirección 0x0003 * 2
|
||||
.org 0x0006
|
||||
rjmp timer1compareA_isr
|
||||
|
||||
; dirección 0x0004 * 2
|
||||
.org 0x0008
|
||||
rjmp timer1overflow_isr
|
||||
|
||||
; ***********************
|
||||
; Main
|
||||
; ***********************
|
||||
.org 0x001E
|
||||
main:
|
||||
;----------------------------------
|
||||
; configuración general
|
||||
;----------------------------------
|
||||
|
||||
; habilita interrupciones
|
||||
sei
|
||||
|
||||
; pin PB0 (OC0A) como pin de salida
|
||||
ldi r16, (1<<DDB0) ; pin de salida
|
||||
sts DDRB, r16
|
||||
|
||||
; valores de TCCR0A para encender o apagar sonido
|
||||
ldi r20, (0<<COM0A1) | (0<<COM0A0) | (1<<WGM01) | (0<<WGM00)
|
||||
ldi r21, (0<<COM0A1) | (1<<COM0A0) | (1<<WGM01) | (0<<WGM00)
|
||||
|
||||
;----------------------------------
|
||||
; configuración TIMER0 para buzzer
|
||||
;----------------------------------
|
||||
; togglea OC0A en Compare match (1 en COM0A[1:0])
|
||||
; y usa modo Clear Timer on Compare Match (2 en WGM0[2:0])
|
||||
sts TCCR0A, r21
|
||||
|
||||
; completa el modo WGM (waveform generaton mode, bit 2)
|
||||
; establece el tipo de reloj: 0b011 en CS0 es clk/64
|
||||
ldi r16, (0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00)
|
||||
sts TCCR0B, r16
|
||||
|
||||
; el TOP es el valor en OCR0A
|
||||
; más pequeño es más agudo
|
||||
ldi r16, 0x06
|
||||
sts OCR0A, r16
|
||||
|
||||
;----------------------------------
|
||||
; configuración TIMER1 para alternar entre sonido on/off
|
||||
;----------------------------------
|
||||
; CS1 en 0b1010 es CK/512
|
||||
ldi r16, (1<<CS13) | (0<<CS12) | (1<<CS11) | (0<<CS10)
|
||||
sts TCCR1, r16
|
||||
|
||||
; establece el valor A al que cuenta el timer1 antes de apagar sonido
|
||||
; menor valor, menor tiempo de sonido (duty cycle)
|
||||
ldi r16, 0x30
|
||||
sts OCR1A, r16
|
||||
|
||||
; set Timer overflow interrupt enable 1
|
||||
; y timer output compare A interrupt enable 1
|
||||
ldi r16, (1<<TOIE1) | (1<<OCIE1A)
|
||||
sts TIMSK, r16
|
||||
|
||||
loop:
|
||||
sleep
|
||||
rjmp loop
|
||||
|
||||
timer1compareA_isr:
|
||||
; apaga la salida
|
||||
sts TCCR0A, r20
|
||||
reti
|
||||
|
||||
timer1overflow_isr:
|
||||
; enciende la salida
|
||||
sts TCCR0A, r21
|
||||
; regresa de la interrupción
|
||||
reti
|
||||
```
|
||||
|
||||
página actualizada en: sejmana-1660, día 1 (12021-05-20)
|
|
@ -0,0 +1,51 @@
|
|||
# coloring computers
|
||||
|
||||
non-electronic computers that work when you color them according to a simple set of rules.
|
||||
|
||||
an exploration of computation without electricity and semiconductors, an attempt to reinvent digital systems away from efficiency and productivity, and hopeful prototypes to expose the inner workings of computers.
|
||||
|
||||
# 4-bits to 7-segment display hexadecimal decoder (12020)
|
||||
|
||||
=> ./img/foto_20201130_hex7segdecoder_01.png the coloring computer/decoder, waiting to be activated
|
||||
=> ./img/foto_20201130_hex7segdecoder_02.png a human coloring the wires according to the logic rules
|
||||
=> ./img/foto_20201130_hex7segdecoder_03.png the coloring computer/decoder, with an input of 0011, and an output that can be read as 3
|
||||
|
||||
a coloring decoder built with NOT (triangle), AND (semicircle), and OR (the other shape (?)) gates, based on a manual design.
|
||||
|
||||
=> ./img/dibujo_20201207_hex7segdecoder_small.png the complete decoder
|
||||
|
||||
=> https://opguides.info/engineering/digitallogic/ colored and animated version by Vega
|
||||
=> https://ipfs.io/ipfs/QmZv53hr7QEzxrPaRNpiyU9VUNHw9UgyaTUqYD9x9iFpNA/dibujo_20201207_hex7segdecoder.png download the decoder in full size 1487x3057 (png, ~446KB)
|
||||
|
||||
# computadora no(r)pal (12019)
|
||||
|
||||
=> ./img/dibujo_20190715-norpalera-fulladder_blanco_small.png logic circuit in the shape of nopal
|
||||
|
||||
a full-adder built with nor gates (see {logiteca}) in the shape of no(r)pales
|
||||
|
||||
=> ./logiteca.gmi {logiteca}
|
||||
|
||||
=> https://ipfs.io/ipfs/QmPz2D3bZRYFi1HnfiNJB8o9TZZvH8atuYpFixMKccYCYP/dibujo_20190715-norpalera-fulladder_blanco.png download computadora no(r)pal in full size 1200x1600 (png, ~429KB)
|
||||
|
||||
# coloring computers (12018)
|
||||
|
||||
the original ones
|
||||
|
||||
=> ./img/foto_coloring-computers_cover-lee.png photo of the cover of the zine, colored
|
||||
=> ./img/foto_coloring-computers_7seg-lee.png photo of a pair of colored pages of the zine, with a 7 segment display showing the digits 2 and 3
|
||||
=> ./img/foto_coloring-computers_pcd2019.png photo of a pair of colored pages of the zine, showing a digital circuit answering if two colors are the same
|
||||
|
||||
the booklet contains three series of computers: computers that compare, computers that count, and computers that play. they are all NOR-based logic circuits designed by using truth tables, karnaugh maps, and maxterm expansions.
|
||||
|
||||
=> https://ipfs.io/ipfs/QmYz7DPRWypGQcbAHr7Mi8EKB6ntSPsEnUsCXbAhBiHQZP/ original site and resources
|
||||
=> https://ipfs.io/ipfs/QmYz7DPRWypGQcbAHr7Mi8EKB6ntSPsEnUsCXbAhBiHQZP/coloringcomputers_pages.pdf download the page-by-page zine (pdf, ~1.5MB)
|
||||
=> https://ipfs.io/ipfs/QmYz7DPRWypGQcbAHr7Mi8EKB6ntSPsEnUsCXbAhBiHQZP/coloringcomputers.pdf download the ready-to-print-and-cut zine (pdf, ~1.4MB)
|
||||
|
||||
CC-BY-SA 4.0
|
||||
|
||||
for the print and cut zine: print double-sided, cut in half, fold the pages and assemble
|
||||
|
||||
presented as a workshop in the
|
||||
=> https://processing.nyc/2019/#workshops processing community day nyc 2019
|
||||
|
||||
página actualizada en: sejmana-1660, día 1 (12021-05-20)
|
|
@ -0,0 +1,116 @@
|
|||
# compudanzas
|
||||
|
||||
materializando ciencias computacionales en cuerpxs humanxs y coreografía
|
||||
|
||||
# el taller
|
||||
|
||||
## abstract
|
||||
|
||||
el taller de compudanzas materializa ciencias computacionales en cuerpxs humanxs y coreografía.
|
||||
|
||||
¿qué es una computadora? ¿cómo es tan poderosa y hace lo que hace, si “solo” consiste en minerales super ordenados a través de procesos complejos?
|
||||
|
||||
¿qué pasa si la alentamos? ¿y si incrementamos su tamaño? ¿y si le quitamos todo rastro de eficiencia para que la podamos bailar?
|
||||
|
||||
en este taller nos insertaremos entre el mundo abstracto de las ciencias computacionales y el mundo de su materialización industrial, para darle cuerpo humano, social, coreográfico, a algunos de sus conceptos fundamentales: máquinas de turing, compuertas lógicas, autómatas celulares, arquitectura von neumann, y más.
|
||||
|
||||
lo que queremos es construir y programar computadoras relativamente lentas, grandes e ineficientes, a partir de personas en movimiento siguiendo/jugando instrucciones. así, nos podremos reapropiar de las maneras computacionales de entender el mundo, para usarlas a nuestro gusto con el fin de proponer otras posibles computadoras, danzas, y/o vidas.
|
||||
|
||||
## justificación
|
||||
|
||||
la miniaturización y aceleración de los circuitos de semiconductores, además de tener un gran costo ambiental, social y económico, dificulta el conocer y entender qué pasa en su interior, y cómo es que logran hacer emerger todas las capacidades que entendemos inherentes al cómputo.
|
||||
|
||||
por otro lado, la configuración social actual genera e incrementa una brecha de conocimientos y posibilidades entre unos cuantos que tienen el poder de desarrollar las tecnologías digitales, y el resto de la población al que se le asigna únicamente un rol de consumidor y de fuente de datos a extraer.
|
||||
|
||||
por si fuera poco, lo abstracto y ofuscado de las ciencias computacionales y de la forma en que suelen ser compartidas, se oponen a sanar esta brecha de acceso.
|
||||
|
||||
es por esto que el taller busca experimentar con otros acercamientos y estrategias para abordar estos temas, tratando no de hablarlos y racionalizarlos sino de bailarlos, sentirlos y recontextualizarlos.
|
||||
|
||||
partimos de que todo el cuerpo de conocimientos sobre la computación fue desarrollado por personas con pasiones así como cualquier otra, por lo que las nociones de lo "frío" y "cuadrado" de lo "maquínico" y digital pueden ser entendidas desde una perspectiva que las acerca a lo orgánico, lo fluido, y a nosotras como personas vivas.
|
||||
|
||||
dadas las crisis climáticas, ecológicas y sociales actuales, consideramos que el taller es un importante ejercicio de imaginación donde nos preguntamos: ¿qué pasaría si las computadoras fueran bailes y no cajas de metal y semiconductor?
|
||||
|
||||
|
||||
## objetivos
|
||||
|
||||
* introducir y difundir conceptos fundamentales de la computación a través de estrategias pedagógicas inspiradas en la danza.
|
||||
* visibilizar procesos e ideas que rigen las realidades digitales actuales pero que suelen ser accesibles solo para un grupo reducido de personas.
|
||||
* instigar la reapropriación de dichos conceptos con el objetivo de imaginar y realizar mundos donde sirven a intereses alternos, como los de la danza, la vida y la liberación.
|
||||
* promover el pensar y sentir con el cuerpo, con énfasis en lo computacional por ser algo considerado abstracto y cerebral a pesar de sus múltiples impactos materiales.
|
||||
|
||||
|
||||
## temario
|
||||
|
||||
los siguientes temas son puntos de partida para los bailes y actividades corporales propuestos, así como para los proyectos creativos de les participantes.
|
||||
|
||||
se abordarán los principios teóricos, pero sin ahondar en discusiones abstractas que se alejen mucho del cuerpo
|
||||
|
||||
* ciencias computacionales, coreografía, ¿cyborgs?
|
||||
* el universo discreto: estados finitos y tiempos discontinuos
|
||||
* operaciones lógicas / digitales
|
||||
* memoria básica con registro de corrimiento
|
||||
* mundo binario: operaciones y compuertas lógicas
|
||||
* autómatas celulares y complejidad emergente
|
||||
* computación formal
|
||||
* sistemas de "tag"
|
||||
* máquinas de turing
|
||||
* máquina universal de turing
|
||||
* organización computacional
|
||||
* arquitectura de von neumann
|
||||
* código máquina y programación
|
||||
|
||||
## agenda
|
||||
|
||||
el taller consiste en 6 sesiones de 2 horas de duración cada una
|
||||
|
||||
* danzas compuertas
|
||||
* autómatas celulares
|
||||
* computación formal
|
||||
* máquina universal de turing
|
||||
* organización computacional
|
||||
* integración
|
||||
|
||||
# las danzas
|
||||
|
||||
sección en construcción
|
||||
|
||||
## ciclo de memoria
|
||||
|
||||
en la que nos volvemos un registro de corrimiento (shift register) síncrono para almacenar de manera activa una secuencia de símbolos.
|
||||
|
||||
## danzas compuertas
|
||||
|
||||
en la que nos convertimos en red de compuertas lógicas para resolver en conjunto operaciones aritméticas o lógicas.
|
||||
|
||||
comportamiento asíncrono, que podemos sincronizar para procesos más complejos.
|
||||
|
||||
=> ./logiteca.gmi {logiteca}
|
||||
|
||||
## reglas de wolfram
|
||||
|
||||
danzas en las que nuestro nuevo estado individual depende de nuestro estado propio y del de dos personas más.
|
||||
|
||||
## danzasistemas-tag
|
||||
|
||||
“batallas” en las que respondemos procesando elementos de la secuencia anterior.
|
||||
|
||||
=> ./danzasistemas-tag.gmi {danzasistemas-tag}
|
||||
|
||||
## d. turing
|
||||
|
||||
en donde bailamos con y a partir de una fila / tira / cinta de objetos / símbolos y una tabla específica de estados.
|
||||
|
||||
## máquina universal bailable
|
||||
|
||||
en donde bailamos con y a partir de una fila / tira / cinta de objetos y una tabla específica de estados, en un acomodo tal que nos permite simularnos bailando con y a partir de una fila / tira / cinta de objetos y cualquier tabla específica de estados
|
||||
|
||||
## pequeña persona computadora
|
||||
|
||||
en donde nuestras acciones toman la forma de las operaciones de una computadora organizada casi como las que conocemos.
|
||||
|
||||
enlazan aquí:
|
||||
=> ./danzasistemas-tag.gmi {danzasistemas-tag}
|
||||
=> ./logiteca.gmi {logiteca}
|
||||
|
||||
|
||||
página actualizada en: sejmana-1660, día 1 (12021-05-20)
|
|
@ -0,0 +1,80 @@
|
|||
# danzasistemas-tag
|
||||
|
||||
una compudanza basada en máquina abstracta (tag systems, o bien, máquina de post)
|
||||
|
||||
=> ./compudanzas.gmi {compudanzas}
|
||||
|
||||
# descripción
|
||||
|
||||
las danzasistemas-tag consisten en "batallas" de baile en las que alternamos recibiendo y respondiendo secuencias de movimiento.
|
||||
|
||||
las secuencias que respondemos son producto de procesar elementos de la secuencia que recibimos.
|
||||
|
||||
# indicaciones
|
||||
|
||||
necesitamos los siguientes elementos:
|
||||
|
||||
* A: alfabeto finito de símbolos/movimientos identificables y replicables
|
||||
* P: las reglas de producción: qué símbolos/movimientos hay que agregar al final de la nueva secuencia, de acuerdo al primer símbolo/movimiento de la secuencia recibida.
|
||||
* m: número de eliminación: cuántos símbolos/movimientos hay que eliminar del inicio de la secuencia recibida.
|
||||
|
||||
al recibir una secuencia de movimiento, hemos de poner atención y realizar lo siguiente para construir nuestra respuesta:
|
||||
|
||||
* notar el primer símbolo/movimiento, que nos indica qué regla de producción seguir al final de la secuencia.
|
||||
* descartar la cantidad de símbolos/movimientos del inicio de la secuencia de acuerdo al número de eliminación. (esto incluye al primer símbolo/movimiento).
|
||||
* memorizar y replicar la secuencia recibida a partir de ese punto, en orden y hasta el final.
|
||||
* agregar el o los símbolos/movimientos al final de la secuencia, de acuerdo a la regla de producción.
|
||||
|
||||
según la danzasistema-tag, la dinámica de respuestas continúa hasta llegar al símbolo/movimiento que indique detenerse, o hasta que la secuencia de movimiento quede vacía.
|
||||
|
||||
# ejemplo
|
||||
|
||||
cómputo de secuencias de collatz, tomado de wikipedia
|
||||
|
||||
=> https://en.wikipedia.org/wiki/Tag_system#Example:_Computation_of_Collatz_sequences Tag system - Example: Computation of Collatz sequences (web)
|
||||
|
||||
los elementos de nuestra danzasistema-tag serían los siguientes:
|
||||
|
||||
## A: alfabeto finito de símbolos/movimientos
|
||||
|
||||
tres símbolos/movimientos: a, b, c
|
||||
|
||||
## P: reglas de producción
|
||||
|
||||
si primer símbolo/movimiento es 'a', agrega 'bc' al final.
|
||||
|
||||
si primer símbolo/movimiento es 'b', agrega 'a' al final.
|
||||
|
||||
si primer símbolo/movimiento es 'c', agrega 'aaa' al final.
|
||||
|
||||
nota cómo cada regla de producción agrega una cantidad distinta de símbolos/movimientos al final.
|
||||
|
||||
## m: número de eliminación
|
||||
|
||||
en este caso, siempre descartaremos 2 símbolos/movimientos del inicio de la secuencia.
|
||||
|
||||
## desarrollo
|
||||
|
||||
partiendo de una secuencia inicial 'aaa'...
|
||||
|
||||
```
|
||||
inicio: aaa
|
||||
respuesta: abc
|
||||
respuesta: cbc
|
||||
respuesta: caaa
|
||||
respuesta: aaaaa
|
||||
respuesta: aaabc
|
||||
respuesta: abcbc
|
||||
respuesta: cbcbc
|
||||
etc...
|
||||
```
|
||||
|
||||
siempre se descartan los 2 símbolos/movimientos del inicio, pero la cantidad de símbolos/movimientos que se agregan al final cambian de acuerdo a la regla de producción.
|
||||
|
||||
esta dinámica de respuestas a partir de esa secuencia inicial, eventualmente termina descartando a la secuencia completa.
|
||||
|
||||
enlaza aquí {compudanzas}
|
||||
|
||||
=> ./compudanzas.gmi {compudanzas}
|
||||
|
||||
página actualizada en: sejmana-1660, día 1 (12021-05-20)
|
|
@ -0,0 +1,652 @@
|
|||
# darena
|
||||
|
||||
an open-ended game of rocks and sand
|
||||
|
||||
the sandy space contains a bunch of rocks in either one of two possible colors, and yourself.
|
||||
|
||||
push and arrange the rocks to prototype and build your own computer, cellular automata, 1-bit art, etc.
|
||||
|
||||
=> ./img/screenshot_darena.png screenshot of the game. it shows a square clear space inside a textured world. inside the square there are several round rocks of two possible colors. there is a small platform, and a person.
|
||||
|
||||
what will you do with the sand?
|
||||
|
||||
# about
|
||||
|
||||
darena was developed as an exercise to learn about the
|
||||
|
||||
=> https://wiki.xxiivv.com/site/uxn.html uxn virtual machine and assembly language
|
||||
|
||||
as part of the {s-camino} practice.
|
||||
|
||||
=> ./s-camino.gmi {s-camino}
|
||||
|
||||
# features
|
||||
|
||||
* a character that moves in all four cardinal directions
|
||||
* rocks that can be pushed around, unless they are colliding with other rocks or the borders of the "arena"
|
||||
* a toggling station where rocks can be switched to the other color
|
||||
* realistic animation: the character slows down when pushing rocks, recovering their original speed when walking
|
||||
|
||||
# controls
|
||||
|
||||
use the arrow keys for cartesian movement within the space
|
||||
|
||||
# possible "improvements"
|
||||
|
||||
* add an "official" pulling option (you can pull rocks right now, but in a hacky way)
|
||||
* save rocks state (position and color) to file
|
||||
* optimize the use of memory for rock colors, using one bit per rock instead of one byte
|
||||
|
||||
# the code
|
||||
|
||||
this iteration has 31 rocks and a single toggling station where one can switch their color/state.
|
||||
|
||||
last updated: sjm-1659d3 (changed JNZ to JCN)
|
||||
|
||||
you can also find the code in the
|
||||
=> https://git.sr.ht/~rabbits/uxn/log/master/item/projects/demos/darena.usm uxn repo
|
||||
|
||||
|
||||
|
||||
```darena.usm
|
||||
( darena.usm )
|
||||
( an open-ended game of rocks and sand )
|
||||
( cc0 sejo 12021 )
|
||||
|
||||
%DEBUG { .Console/byte DEO #0a .Console/char DEO }
|
||||
|
||||
=> ./ .Console/byte DEO #0a .Console/char DEO .gmi { .Console/byte DEO #0a .Console/char DEO }
|
||||
%DEBUG2 { .Console/short DEO2 #0a .Console/char DEO }
|
||||
|
||||
=> ./ .Console/short DEO2 #0a .Console/char DEO .gmi { .Console/short DEO2 #0a .Console/char DEO }
|
||||
|
||||
( parameters )
|
||||
%nrocks { #1f }
|
||||
|
||||
=> ./ #1f .gmi { #1f }
|
||||
%nrocks-1 { #1e }
|
||||
|
||||
=> ./ #1e .gmi { #1e }
|
||||
%nrocks_mask { #1f }
|
||||
|
||||
=> ./ #1f .gmi { #1f }
|
||||
%minposx { #0f }
|
||||
|
||||
=> ./ #0f .gmi { #0f }
|
||||
%minposy { #0f }
|
||||
|
||||
=> ./ #0f .gmi { #0f }
|
||||
%maxposx { #f1 }
|
||||
|
||||
=> ./ #f1 .gmi { #f1 }
|
||||
%maxposy { #f1 }
|
||||
|
||||
=> ./ #f1 .gmi { #f1 }
|
||||
%anispeedmask_normal { #03 }
|
||||
|
||||
=> ./ #03 .gmi { #03 }
|
||||
%anispeedmask_slow { #07 }
|
||||
|
||||
=> ./ #07 .gmi { #07 }
|
||||
|
||||
%c_color_normal { #33 }
|
||||
|
||||
=> ./ #33 .gmi { #33 }
|
||||
%c_color_flipx { #73 }
|
||||
|
||||
=> ./ #73 .gmi { #73 }
|
||||
%index_norock { #ff }
|
||||
|
||||
=> ./ #ff .gmi { #ff }
|
||||
|
||||
( output macros )
|
||||
%out_screen_x { LDA #00 SWP .Screen/x DEO2 } ( ;addr )
|
||||
|
||||
=> ./ LDA #00 SWP .Screen/x DEO2 .gmi { LDA #00 SWP .Screen/x DEO2 }
|
||||
%out_screen_y { LDA #00 SWP .Screen/y DEO2 } ( ;addr )
|
||||
|
||||
=> ./ LDA #00 SWP .Screen/y DEO2 .gmi { LDA #00 SWP .Screen/y DEO2 }
|
||||
|
||||
( helper macros )
|
||||
%get_bit_n { SFT #01 AND }
|
||||
|
||||
=> ./ SFT #01 AND .gmi { SFT #01 AND }
|
||||
%get_nibble_h { #04 SFT #0f AND }
|
||||
|
||||
=> ./ #04 SFT #0f AND .gmi { #04 SFT #0f AND }
|
||||
%get_nibble_l { #0f AND }
|
||||
|
||||
=> ./ #0f AND .gmi { #0f AND }
|
||||
|
||||
%is_bit_n_set { get_bit_n #01 EQU }
|
||||
|
||||
=> ./ get_bit_n #01 EQU .gmi { get_bit_n #01 EQU }
|
||||
|
||||
%set_animate { #01 ;c_state LDA ORA ;c_state STA }
|
||||
|
||||
=> ./ #01 ;c_state LDA ORA ;c_state STA .gmi { #01 ;c_state LDA ORA ;c_state STA }
|
||||
%rst_animate { #00 ;c_state STA }
|
||||
|
||||
=> ./ #00 ;c_state STA .gmi { #00 ;c_state STA }
|
||||
|
||||
( devices )
|
||||
|
||||
|00 @System [ &vector $2 &wst $1 &rst $1 &pad $4 &r $2 &g $2 &b $2 ]
|
||||
|10 @Console [ &pad $8 &char $1 &byte $1 &short $2 &string $2 ]
|
||||
|20 @Screen [ &vector $2 &width $2 &height $2 &pad $2 &x $2 &y $2 &addr $2 &color $1 ]
|
||||
|80 @Controller [ &vector $2 &button $1 &key $1 ]
|
||||
|
||||
( variables )
|
||||
|
||||
|0000
|
||||
|
||||
@c_pos [ &x $1 &y $1 ] ( character position )
|
||||
@c_speed [ &x $1 &y $1 ] ( character speed )
|
||||
@c_color [ $1 ] ( character color )
|
||||
@c_sprite [ $2 ] ( character sprite addr )
|
||||
@c_state [ $1 ] ( high_nibble: animation pointer, bit0: is_animated )
|
||||
|
||||
@f_count [ $1 ] ( frame counter )
|
||||
@ani_speedmask [ $1 ] ( animation speed mask )
|
||||
|
||||
@r_speed_x [ $f ]
|
||||
@r_speed_y [ $f ]
|
||||
|
||||
@tog [ &x $1 &y $1 &state $1 ] ( toggle station state )
|
||||
|
||||
( program )
|
||||
|
||||
|0100 @reset ( -> )
|
||||
#f396 .System/r DEO2
|
||||
#e263 .System/g DEO2
|
||||
#9030 .System/b DEO2
|
||||
|
||||
;on_frame .Screen/vector DEO2
|
||||
|
||||
( init character )
|
||||
#50 ;c_pos/x STA
|
||||
#10 ;c_pos/y STA
|
||||
#00 ;c_speed/x STA
|
||||
#00 ;c_speed/y STA
|
||||
c_color_normal ;c_color STA
|
||||
;s_monitx_stepfront0 ;c_sprite STA2
|
||||
rst_animate
|
||||
|
||||
anispeedmask_normal ;ani_speedmask STA
|
||||
|
||||
( init toggler )
|
||||
#27 ;tog/x STA
|
||||
#27 ;tog/y STA
|
||||
#00 ;tog/state STA
|
||||
|
||||
|
||||
( init background )
|
||||
;init_bg JSR2
|
||||
BRK
|
||||
|
||||
|
||||
@on_frame ( -> )
|
||||
;f_count LDA #01 ADD DUP ;f_count STA ( increase frame counter )
|
||||
;ani_speedmask LDA ( mask with animation speed mask )
|
||||
AND #00 EQU ,update_frame JCN ( jump to update if it's time )
|
||||
BRK
|
||||
|
||||
@update_frame
|
||||
( check keyboard )
|
||||
;check_keys JSR2
|
||||
|
||||
( animate character sprite )
|
||||
;animate_c JSR2
|
||||
|
||||
( clear sprites )
|
||||
;clear JSR2
|
||||
|
||||
( update character vars )
|
||||
;update_c/run JSR2
|
||||
|
||||
( update rocks + stand )
|
||||
;update_r/run JSR2
|
||||
|
||||
( draw )
|
||||
;draw JSR2
|
||||
|
||||
BRK
|
||||
|
||||
@clear
|
||||
( clear rocks )
|
||||
;s_clear .Screen/addr DEO2
|
||||
|
||||
nrocks #00
|
||||
&rocks_loop
|
||||
DUP ( get rocks_x[i] )
|
||||
;rocks_x ROT #00 SWP ADD2 out_screen_x
|
||||
|
||||
DUP ( get rocks_y[i] )
|
||||
;rocks_y ROT #00 SWP ADD2 out_screen_y
|
||||
|
||||
#30 .Screen/color DEO
|
||||
|
||||
#01 ADD
|
||||
DUP2
|
||||
NEQ ,&rocks_loop JCN
|
||||
POP2
|
||||
|
||||
( clear character )
|
||||
;clear_c JSR2
|
||||
JMP2r
|
||||
|
||||
@draw
|
||||
( draw toggler )
|
||||
|
||||
;tog/x out_screen_x
|
||||
;tog/x out_screen_y
|
||||
;s_stand .Screen/addr DEO2
|
||||
#23 .Screen/color DEO
|
||||
|
||||
( draw rocks )
|
||||
;s_bola .Screen/addr DEO2
|
||||
|
||||
nrocks #00
|
||||
|
||||
&rocks_loop
|
||||
DUP ( get rocks_x[i] )
|
||||
;rocks_x ROT #00 SWP ADD2 out_screen_x
|
||||
|
||||
DUP ( get rocks_y[i] )
|
||||
;rocks_y ROT #00 SWP ADD2 out_screen_y
|
||||
|
||||
( DUP ( get color bitwise ) )
|
||||
( ;r_color LDA SWP get_bit_n #31 ADD .Screen/color DEO )
|
||||
|
||||
DUP
|
||||
;r_color ROT #00 SWP ADD2 LDA #31 ADD .Screen/color DEO
|
||||
|
||||
#01 ADD
|
||||
|
||||
DUP2
|
||||
NEQ ,&rocks_loop JCN
|
||||
POP2
|
||||
|
||||
( draw character )
|
||||
;draw_c JSR2
|
||||
JMP2r
|
||||
|
||||
@check_keys
|
||||
#00 ;c_speed/x STA
|
||||
#00 ;c_speed/y STA
|
||||
|
||||
.Controller/button DEI #07 is_bit_n_set ,&der JCN
|
||||
.Controller/button DEI #06 is_bit_n_set ,&izq JCN
|
||||
.Controller/button DEI #05 is_bit_n_set ,&aba JCN
|
||||
.Controller/button DEI #04 is_bit_n_set ,&arr JCN
|
||||
|
||||
rst_animate
|
||||
|
||||
JMP2r
|
||||
|
||||
&der
|
||||
#01 ;c_speed/x STA
|
||||
set_animate
|
||||
c_color_normal ;c_color STA
|
||||
;s_monitx_stepside0 ;c_sprite STA2
|
||||
JMP2r
|
||||
|
||||
&izq
|
||||
#ff ;c_speed/x STA
|
||||
set_animate
|
||||
c_color_flipx ;c_color STA
|
||||
;s_monitx_stepside0 ;c_sprite STA2
|
||||
JMP2r
|
||||
|
||||
&aba
|
||||
#01 ;c_speed/y STA
|
||||
set_animate
|
||||
c_color_normal ;c_color STA
|
||||
;s_monitx_stepfront0 ;c_sprite STA2
|
||||
JMP2r
|
||||
|
||||
&arr
|
||||
#ff ;c_speed/y STA
|
||||
set_animate
|
||||
c_color_normal ;c_color STA
|
||||
;s_monitx_stepback0 ;c_sprite STA2
|
||||
JMP2r
|
||||
|
||||
&end
|
||||
JMP2r
|
||||
|
||||
( sub-routines )
|
||||
|
||||
( in: sourcex, source y, index, rangex, rangey )
|
||||
( puts in the stack the index of rock collisioned with )
|
||||
@collision_rocks
|
||||
&range_y $1
|
||||
&range_x $1
|
||||
&src_i $1
|
||||
&src_x $1
|
||||
&src_y $1
|
||||
|
||||
&rock_x $1
|
||||
&rock_y $1
|
||||
|
||||
&run
|
||||
,&range_y STR
|
||||
,&range_x STR
|
||||
,&src_i STR
|
||||
,&src_y STR
|
||||
,&src_x STR
|
||||
|
||||
( check collision with rocks )
|
||||
( nrocks #00 )
|
||||
,&src_i LDR nrocks_mask AND DUP #01 ADD nrocks_mask AND
|
||||
|
||||
&rocks_loop
|
||||
DUP ( get rocks_x[i] )
|
||||
;rocks_x ROT #00 SWP ADD2 LDA ,&rock_x STR
|
||||
|
||||
DUP ( get rocks_y[i] )
|
||||
;rocks_y ROT #00 SWP ADD2 LDA ,&rock_y STR
|
||||
|
||||
,&src_x LDR ,&rock_x LDR ,&range_x LDR SUB GTH ( if sx > rx - 8 )
|
||||
,&src_x LDR ,&rock_x LDR ,&range_x LDR ADD LTH ( if sx < rx + 8 )
|
||||
,&src_y LDR ,&rock_y LDR ,&range_y LDR SUB GTH ( if sy > ry - 8 )
|
||||
,&src_y LDR ,&rock_y LDR ,&range_y LDR ADD LTH ( if sy < ry + 8 )
|
||||
ADD ADD ADD #04 EQU ,&found JCN
|
||||
|
||||
#01 ADD nrocks_mask AND
|
||||
DUP2
|
||||
NEQ ,&rocks_loop JCN
|
||||
POP2
|
||||
#ff
|
||||
JMP2r
|
||||
&found
|
||||
SWP POP ( remove loop limit )
|
||||
DUP ;&src_i LDA NEQ ,&end JCN ( check if result is the same as index )
|
||||
POP #ff
|
||||
JMP2r
|
||||
|
||||
&end
|
||||
|
||||
JMP2r
|
||||
|
||||
@update_c ( update character position )
|
||||
&new_x $1
|
||||
&new_y $1
|
||||
|
||||
&rock_i $1
|
||||
&rock_x $1
|
||||
&rock_y $1
|
||||
|
||||
|
||||
&run
|
||||
;c_speed/x LDA ;c_pos/x LDA ADD
|
||||
,&new_x STR
|
||||
;c_speed/y LDA ;c_pos/y LDA ADD
|
||||
,&new_y STR
|
||||
|
||||
anispeedmask_normal ;ani_speedmask STA
|
||||
|
||||
&check_x
|
||||
( check collision with borders )
|
||||
,&new_x LDR minposx EQU ;&noup_x JCN2
|
||||
,&new_x LDR maxposx EQU ;&noup_x JCN2
|
||||
|
||||
|
||||
( check collision with rocks )
|
||||
,&new_x LDR ,&new_y LDR index_norock #09 #06
|
||||
;collision_rocks/run JSR2
|
||||
|
||||
( if it is colliding with rock, check further )
|
||||
DUP #ff NEQ ,&check_x_collision JCN
|
||||
POP
|
||||
,&update_x JMP
|
||||
|
||||
&check_x_collision
|
||||
( DUP DEBUG )
|
||||
( slow down and save rock index )
|
||||
anispeedmask_slow ;ani_speedmask STA
|
||||
,&rock_i STR
|
||||
|
||||
( check if rock collides with others )
|
||||
;rocks_x #00 ,&rock_i LDR ADD2 LDA ,&rock_x STR
|
||||
;rocks_y #00 ,&rock_i LDR ADD2 LDA ,&rock_y STR
|
||||
|
||||
,&rock_x LDR ,&rock_y LDR ,&rock_i LDR #09 #06
|
||||
;collision_rocks/run JSR2
|
||||
|
||||
( DUP DEBUG )
|
||||
|
||||
( if it is colliding, then skip adding x )
|
||||
DUP #ff NEQ ,&check_y JCN
|
||||
POP
|
||||
|
||||
|
||||
( if not, check for borders )
|
||||
;&rock_x LDA minposx EQU ;&noup_x JCN2
|
||||
;&rock_x LDA maxposx EQU ;&noup_x JCN2
|
||||
|
||||
( move rock with same speed as c )
|
||||
;&rock_x LDA ;c_speed/x LDA ADD
|
||||
;rocks_x #00 ;&rock_i LDA ADD2
|
||||
STA
|
||||
|
||||
|
||||
&update_x
|
||||
;&new_x LDA ;c_pos/x STA
|
||||
|
||||
,&check_y JMP
|
||||
|
||||
&noup_x
|
||||
|
||||
&check_y
|
||||
( check collision with borders )
|
||||
;&new_y LDA minposy EQU ;&noup_y JCN2
|
||||
;&new_y LDA maxposy EQU ;&noup_y JCN2
|
||||
|
||||
( check collision with rocks )
|
||||
;&new_x LDA ;&new_y LDA index_norock #06 #09
|
||||
;collision_rocks/run JSR2
|
||||
|
||||
( if it is colliding with rock, check further )
|
||||
DUP #ff NEQ ,&check_y_collision JCN
|
||||
POP
|
||||
,&update_y JMP
|
||||
|
||||
&check_y_collision
|
||||
( DUP DEBUG )
|
||||
anispeedmask_slow ;ani_speedmask STA
|
||||
;&rock_i STA
|
||||
|
||||
( check if rock collides with others )
|
||||
;rocks_x #00 ;&rock_i LDA ADD2 LDA ;&rock_x STA
|
||||
;rocks_y #00 ;&rock_i LDA ADD2 LDA ;&rock_y STA
|
||||
|
||||
;&rock_x LDA ;&rock_y LDA ;&rock_i LDA #06 #09
|
||||
;collision_rocks/run JSR2
|
||||
|
||||
( DUP DEBUG )
|
||||
|
||||
( if it is colliding, then skip adding y )
|
||||
DUP #ff NEQ ,&noup_y JCN
|
||||
POP
|
||||
|
||||
( if not, check for borders )
|
||||
;&rock_y LDA minposx EQU ;&noup_y JCN2
|
||||
;&rock_y LDA maxposx EQU ;&noup_y JCN2
|
||||
|
||||
( if not colliding, then move rock with same speed as c )
|
||||
;&rock_y LDA ;c_speed/y LDA ADD
|
||||
;rocks_y #00 ;&rock_i LDA ADD2
|
||||
STA
|
||||
|
||||
|
||||
&update_y
|
||||
;&new_y LDA ;c_pos/y STA
|
||||
JMP2r
|
||||
|
||||
&noup_y
|
||||
JMP2r
|
||||
|
||||
@update_r
|
||||
&rock_i $1
|
||||
|
||||
&run
|
||||
|
||||
( check collision with rocks )
|
||||
;tog/x LDA ;tog/y LDA index_norock #02 #02
|
||||
;collision_rocks/run JSR2
|
||||
|
||||
( if it is colliding with rock, check if it needs to change state )
|
||||
DUP #ff NEQ ,&change_state JCN
|
||||
|
||||
( DUP DEBUG )
|
||||
|
||||
( if there's no collision, reset toggler )
|
||||
POP
|
||||
#00 ;tog/state STA
|
||||
JMP2r
|
||||
|
||||
&change_state
|
||||
( DUP DEBUG )
|
||||
,&rock_i STR
|
||||
;tog/state LDA ,&done JCN ( don't toggle if state is active )
|
||||
|
||||
;r_color #00 ,&rock_i LDR ADD2 DUP2 STH2
|
||||
LDA #01 EOR STH2r STA
|
||||
#01 ;tog/state STA
|
||||
&done
|
||||
|
||||
JMP2r
|
||||
|
||||
@animate_c
|
||||
( is bit0 -animate- on? )
|
||||
;c_state LDA DUP #00 get_bit_n #01 NEQ ,&s_no_animate JCN
|
||||
|
||||
( increment and save animation pointer )
|
||||
&s_animate
|
||||
DUP
|
||||
get_nibble_h #01 ADD #03 AND #40 SFT
|
||||
SWP get_nibble_l ORA
|
||||
;c_state STA
|
||||
JMP2r
|
||||
|
||||
&s_no_animate
|
||||
get_nibble_h #0f AND ;c_state STA
|
||||
JMP2r
|
||||
|
||||
@draw_c ( draw character )
|
||||
#00 ;c_state LDA get_nibble_h #08 MUL
|
||||
;c_sprite LDA2 ADD2 .Screen/addr DEO2
|
||||
;c_pos/x out_screen_x
|
||||
;c_pos/y out_screen_y
|
||||
;c_color LDA .Screen/color DEO
|
||||
JMP2r
|
||||
|
||||
@clear_c ( clear character )
|
||||
;s_clear .Screen/addr DEO2
|
||||
;c_pos/x out_screen_x
|
||||
;c_pos/y out_screen_y
|
||||
#30 .Screen/color DEO
|
||||
JMP2r
|
||||
|
||||
@init_bg
|
||||
( init bg )
|
||||
;s_border .Screen/addr DEO2
|
||||
|
||||
.Screen/height DEI2 #0000 STH2
|
||||
&vertical0loop
|
||||
DUP2
|
||||
STH2r
|
||||
DUP2 .Screen/y DEO2
|
||||
|
||||
|
||||
.Screen/width DEI2 #0000 STH2
|
||||
&horizontal0loop
|
||||
DUP2
|
||||
STH2r
|
||||
DUP2 .Screen/x DEO2
|
||||
|
||||
#23 .Screen/color DEO
|
||||
|
||||
#0008 ADD2 DUP2 STH2
|
||||
GTH2 ,&horizontal0loop JCN
|
||||
|
||||
STH2r POP2 POP2
|
||||
|
||||
|
||||
#0008 ADD2 DUP2 STH2
|
||||
GTH2 ,&vertical0loop JCN
|
||||
STH2r
|
||||
POP2 POP2
|
||||
|
||||
( arena )
|
||||
|
||||
;s_clear .Screen/addr DEO2
|
||||
|
||||
#00 maxposy #00 minposy STH2
|
||||
&vertical0loop_clear
|
||||
DUP2
|
||||
STH2r
|
||||
DUP2 .Screen/y DEO2
|
||||
|
||||
|
||||
#00 maxposx #00 minposx STH2
|
||||
&horizontal0loop_clear
|
||||
DUP2
|
||||
STH2r
|
||||
DUP2 .Screen/x DEO2
|
||||
|
||||
#20 .Screen/color DEO
|
||||
|
||||
#0008 ADD2 DUP2 STH2
|
||||
GTH2 ,&horizontal0loop_clear JCN
|
||||
|
||||
STH2r POP2 POP2
|
||||
|
||||
#0008 ADD2 DUP2 STH2 GTH2 ,&vertical0loop_clear JCN
|
||||
STH2r
|
||||
POP2 POP2
|
||||
|
||||
JMP2r
|
||||
|
||||
( rocks )
|
||||
@rocks_x [ 25 30 42 50 67 90 98 e8 20 43 43 57 5a 7f bc a5
|
||||
e5 dd a2 20 b7 9b 38 e8 33 43 63 b7 aa cf bc ]
|
||||
@rocks_y [ 60 48 34 56 23 65 65 65 ba e9 24 22 72 91 22 c5
|
||||
25 30 42 50 67 90 98 e8 20 43 43 57 5a 7f bc ]
|
||||
@r_color [ 00 01 01 00 00 00 01 01 01 01 00 00 01 01 00 00
|
||||
01 00 01 00 00 01 00 01 01 01 01 01 00 00 00 ]
|
||||
|
||||
|
||||
( sprites )
|
||||
|
||||
@s_clear [ 0000 0000 0000 0000 ]
|
||||
@s_border [ 3288 7e83 780d e013 ]
|
||||
@s_bola [ 3c4e 9ffd f962 3c00 ]
|
||||
@s_stand [ 0000 0000 0024 7eff ]
|
||||
@s_stand_original [ 0000 0000 0000 3c7e ]
|
||||
|
||||
@s_monitx [ 3c7e 5a7f 1b3c 5a18 ]
|
||||
@s_monitx_back [ 3c7e 7efe d83c 5a18 ]
|
||||
|
||||
@s_monitx_stepfront0 [ 3c7e 5a7f 1b3c 5a18 ]
|
||||
@s_monitx_stepfront1 [ 3c7e 5a7f 1b3c 5a10 ]
|
||||
@s_monitx_stepfront2 [ 3c7e 5a7f 1b3c 5a18 ]
|
||||
@s_monitx_stepfront3 [ 3c7e 5a7f 1b3c 5a08 ]
|
||||
|
||||
@s_monitx_stepback0 [ 3c7e 7efe d83c 5a18 ]
|
||||
@s_monitx_stepback1 [ 3c7e 7efe d83c 5a10 ]
|
||||
@s_monitx_stepback2 [ 3c7e 7efe d83c 5a18 ]
|
||||
@s_monitx_stepback3 [ 3c7e 7efe d83c 5a08 ]
|
||||
|
||||
@s_monitx_stepside0 [ 1c3c 7afc d81c 1818 ]
|
||||
@s_monitx_stepside1 [ 1c3c 7afc d81c 1828 ]
|
||||
@s_monitx_stepside2 [ 1c3c 7afc d81c 3810 ]
|
||||
@s_monitx_stepside3 [ 1c3c 7afc d81c 1814 ]
|
||||
```
|
||||
|
||||
enlaza aquí {s-camino}
|
||||
|
||||
=> ./s-camino.gmi {s-camino}
|
||||
|
||||
página actualizada en: sejmana-1660, día 1 (12021-05-20)
|
|
@ -0,0 +1,114 @@
|
|||
# apuntes de ffmpeg
|
||||
|
||||
notas de usos comunes que le doy a ffmpeg
|
||||
|
||||
# "trim" / cortar
|
||||
|
||||
```
|
||||
ffmpeg -i input.video -ss 5 -t 20 output.video
|
||||
```
|
||||
|
||||
donde:
|
||||
-ss es el tiempo inicial
|
||||
-t es la duracion total del nuevo video
|
||||
|
||||
|
||||
# escalar
|
||||
|
||||
```
|
||||
ffmpeg -i input.video -vf scale=640:480 output.video
|
||||
```
|
||||
|
||||
y para reducir el tamaño del archivo, suele ser útil recomprimir con crf (constant rate factor)
|
||||
|
||||
```
|
||||
ffmpeg -i input.video -crf 24 output.video
|
||||
```
|
||||
|
||||
en teoría 24 es una compresión difícil de percibir. números mayores comprimen más.
|
||||
|
||||
# cambio de framerate
|
||||
|
||||
```
|
||||
ffmpeg -i input.video -r 30 output.video
|
||||
```
|
||||
|
||||
o
|
||||
|
||||
```
|
||||
ffmpeg -i input.video -filter:v fps=fps=30 output.video
|
||||
```
|
||||
|
||||
# cambio de "velocidad"
|
||||
|
||||
obtiene un video a 2x de velocidad:
|
||||
|
||||
```
|
||||
ffmpeg -i input.video -filter:v "setpts=0.5*PTS" output.video
|
||||
```
|
||||
|
||||
para hacer 60x (por ejemplo, convertir minutos a segundos):
|
||||
|
||||
```
|
||||
ffmpeg -i input.video -filter:v "setpts=0.016*PTS" output.video
|
||||
```
|
||||
|
||||
# concatenar
|
||||
|
||||
hacer lista de videos con el formato:
|
||||
|
||||
```
|
||||
file 'archivo1'
|
||||
file 'archivo2'
|
||||
file 'archivo3'
|
||||
```
|
||||
y luego:
|
||||
|
||||
```
|
||||
ffmpeg -f concat -i lista.txt -c copy output.video
|
||||
```
|
||||
|
||||
|
||||
# generar video desde serie de img
|
||||
|
||||
```
|
||||
ffmpeg -framerate 30 -i frame-%04d.tif -pix_fmt yuv420p -c:v libx264 <output.mp4>
|
||||
```
|
||||
|
||||
# crop (y exportar desde recordmydesktop)
|
||||
|
||||
```
|
||||
ffmpeg -i out.ogv -filter:v "crop=1280:720:0:0" -codec:v libx264 -codec:a libmp3lame output.mp4
|
||||
```
|
||||
|
||||
|
||||
# video a partir de una imagen
|
||||
|
||||
```
|
||||
# video de una imagen,
|
||||
# 10 segundos, 30 frames por segundo
|
||||
ffmpeg -loop 1 \
|
||||
-i imagen_verde.png \
|
||||
-t 00:00:10 -r 30 \
|
||||
video_verde.ogv
|
||||
```
|
||||
|
||||
# video a partir de serie de imágenes
|
||||
|
||||
```
|
||||
# cambia entre imágenes a 2fps,
|
||||
# video final a 30fps
|
||||
ffmpeg -framerate 2 \
|
||||
-i "%02d.png" \
|
||||
-pix_fmt yuv420p \
|
||||
-c:v libx264 \
|
||||
-r 30 salida.mp4
|
||||
```
|
||||
|
||||
# overlay de imagen sobre video
|
||||
|
||||
```
|
||||
ffmpeg -i input.mp4 -i imagen.png -filter_complex "overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2" output.mp4
|
||||
```
|
||||
|
||||
página actualizada en: sejmana-1660, día 1 (12021-05-20)
|
|
@ -0,0 +1,118 @@
|
|||
# apuntes de imagemagick
|
||||
|
||||
# redimensiona imagen
|
||||
|
||||
```
|
||||
convert imagen.png -resize 100x100 imagen100.png
|
||||
```
|
||||
|
||||
o con -scale, para no interpolar y mantener la apariencia de pixeles
|
||||
|
||||
```
|
||||
convert imagen.png -scale 200% imagenx2.png
|
||||
```
|
||||
|
||||
# reemplaza color por otro
|
||||
|
||||
reemplaza azul por blanco:
|
||||
|
||||
```
|
||||
convert imagen.png -fill white -opaque blue salida.png
|
||||
```
|
||||
|
||||
se puede agregar fuzz factor:
|
||||
|
||||
```
|
||||
convert imagen.png -fuzz 45% -fill white -opaque blue salida.png
|
||||
```
|
||||
|
||||
y para convertir a transparente:
|
||||
|
||||
```
|
||||
convert imagen.png -fuzz 45% -transparent blue salida.png
|
||||
```
|
||||
|
||||
# elimina metadatos exif
|
||||
|
||||
para imágenes jpg
|
||||
|
||||
```
|
||||
convert foto.jpg -strip fotolimpia.jpg
|
||||
```
|
||||
|
||||
esto re-comprime la imagen, pero puede usarse al mismo tiempo que se redimensiona
|
||||
|
||||
```
|
||||
convert foto.jpg -strip -resize 640x480 fotolimpia_480p.jpg
|
||||
```
|
||||
|
||||
# convierte pdf
|
||||
|
||||
por default la conversión sucede en baja calidad, esto la mejora:
|
||||
|
||||
```
|
||||
convert imagen.png -quality 100 -units PixelsPerInch -density 300x300 imagen.pdf
|
||||
```
|
||||
|
||||
y para el caso opuesto:
|
||||
|
||||
```
|
||||
convert -quality 100 -units PixelsPerInch -density 300x300 imagen.pdf imagen.png
|
||||
```
|
||||
|
||||
# reduce la cantidad de colores
|
||||
|
||||
deja que imagemagick elija qué colores utilizar:
|
||||
|
||||
```
|
||||
convert imagen.png -colors 8 imagen_8.png
|
||||
```
|
||||
|
||||
o con dithering:
|
||||
|
||||
```
|
||||
convert imagen.png -dither FloydSteinberg -colors 8 imagen_8.png
|
||||
```
|
||||
|
||||
en -dither se puede usar None, Riemersma, o FloydSteinberg
|
||||
|
||||
|
||||
# genera mapas de bits
|
||||
|
||||
con color plano:
|
||||
|
||||
```
|
||||
convert -size 100x100 xc:'rgb(0,255,0)' imagen_verde.png
|
||||
```
|
||||
|
||||
con ruido:
|
||||
|
||||
```
|
||||
convert -size 100x100 xc: +noise Random imagen_ruido.png
|
||||
```
|
||||
|
||||
# compone/encima imágenes
|
||||
|
||||
para componer una imagen con fondo transparente sobre otra que se convertirá en su fondo
|
||||
|
||||
```
|
||||
composite -gravity center imagen_con_alpha.png fondo.png resultado.png
|
||||
```
|
||||
|
||||
# corta
|
||||
|
||||
para cortar una imagen a ciertas dimensiones (wxh) y cierto offset en x,y
|
||||
|
||||
```
|
||||
convert imagen.png -crop 300x300+100+50 +repage recorte.png
|
||||
```
|
||||
|
||||
|
||||
para quitarte el borde de color constante a una imagen
|
||||
|
||||
```
|
||||
convert imagen.png -trim +repage sinborde.png
|
||||
```
|
||||
|
||||
|
||||
página actualizada en: sejmana-1660, día 1 (12021-05-20)
|
|
@ -0,0 +1,14 @@
|
|||
# ¿queso de mango?
|
||||
|
||||
cuaderno en proceso de almacenar y compartir notas variadas, con miras a que tengan (más) vida al vibrar en la red…
|
||||
|
||||
notebook in progress, saving and sharing various materials, trying to give them (networked) life.
|
||||
|
||||
=> ./compudanzas.gmi {compudanzas}
|
||||
=> ./coloring_computers.gmi {coloring computers}
|
||||
=> ./s-camino.gmi {s-camino}
|
||||
=> ./darena.gmi {darena}
|
||||
=> ./recetas.gmi {recetas}
|
||||
=> ./indice.gmi {índice}
|
||||
|
||||
página actualizada en: sejmana-1660, día 1 (12021-05-20)
|
|
@ -0,0 +1,14 @@
|
|||
# índice de páginas
|
||||
|
||||
=> ./avr-asm.gmi {avr-asm}
|
||||
=> ./coloring_computers.gmi {coloring computers}
|
||||
=> ./compudanzas.gmi {compudanzas}
|
||||
=> ./danzasistemas-tag.gmi {danzasistemas-tag}
|
||||
=> ./darena.gmi {darena}
|
||||
=> ./ffmpeg.gmi {ffmpeg}
|
||||
=> ./imagemagick.gmi {imagemagick}
|
||||
=> ./logiteca.gmi {logiteca}
|
||||
=> ./recetas.gmi {recetas}
|
||||
=> ./s-camino.gmi {s-camino}
|
||||
|
||||
página actualizada en: sejmana-1660, día 1 (12021-05-20)
|
|
@ -0,0 +1,290 @@
|
|||
# logiteca
|
||||
|
||||
compendio de circuitos lógicos que pueden implementarse en las "danzas compuertas".
|
||||
|
||||
material de referencia para las {compudanzas}
|
||||
|
||||
=> ./compudanzas.gmi {compudanzas}
|
||||
|
||||
# acerca de
|
||||
|
||||
este es un compendio de circuitos lógicos que pueden implementarse en las "danzas compuertas".
|
||||
|
||||
están descritos en *verilog*, un lenguaje descriptor de hardware. esto con la idea de estandarizarlos, de facilitar simularlos e implementarlos en otros materiales, y de indicar su cualidad de *red abstracta*.
|
||||
|
||||
utilizamos el lenguaje a nivel de compuertas lógicas solamente: cada compuerta se expresa como una función (`and()`, `not()`, `or()`, `nor()`, `nand()`, etc) donde el primer argumento es el nombre de la *salida* de la compuerta, y el o los otros argumentos son los nombres de las *entradas*.
|
||||
|
||||
el número de participantes asignado por circuito está contado como el *número de entradas* más el *número de compuertas*, donde alguna(s) de ella(s) incluyen las compuertas cuyas salidas son también la(s) del circuito. si se tienen más participantes, se pueden agregar el *número de salidas*: persona(s) que copien el resultado de la compuerta correspondiente.
|
||||
|
||||
# multiplicador de 1 bit
|
||||
|
||||
circuito que multiplica a dos números de 1 bit y da el resultado en 1 bit.
|
||||
|
||||
## multiplicador de 1 bit con compuertas habituales (3 o 4 participantes)
|
||||
|
||||
```
|
||||
// multiplicador construido con compuertas habituales
|
||||
// entradas (2): a,b
|
||||
// salidas (1): r (resultado)
|
||||
// compuertas (1): 1 de 2 entradas
|
||||
|
||||
module multiplicador( a, b, r);
|
||||
|
||||
input wire a, b;
|
||||
output wire r;
|
||||
|
||||
and C1(r, a, b);
|
||||
|
||||
endmodule
|
||||
```
|
||||
|
||||
## multiplicador de 1 bit con nor (5 o 6 participantes)
|
||||
|
||||
```
|
||||
// multiplicador construido con nor's
|
||||
// entradas (2): a,b
|
||||
// salidas (1): r (resultado)
|
||||
// compuertas (3): 2 de 1 y 1 de 2 entradas
|
||||
|
||||
module multiplicador( a, b, r);
|
||||
|
||||
input wire a, b;
|
||||
output wire r;
|
||||
wire p1,p2;
|
||||
|
||||
// negadas
|
||||
nor C1(p1, a);
|
||||
nor C2(p2, b);
|
||||
|
||||
// resultado
|
||||
nor C3(r, p1, p2);
|
||||
|
||||
endmodule
|
||||
```
|
||||
|
||||
# contadores
|
||||
|
||||
circuitos que incrementan 1 al número binario colocado en la entrada, con el mismo número de bits a la entrada que a la salida.
|
||||
|
||||
si la salida se "conecta" a la entrada, entonces con cada paso se obtiene el
|
||||
número siguiente en la secuencia, es decir se "cuenta".
|
||||
|
||||
al llegar al último número, se regresa a 0.
|
||||
|
||||
## contador de 2 bits con compuertas habituales (4 o 6 participantes)
|
||||
|
||||
```
|
||||
// contador de 2 bits con compuertas habituales
|
||||
// entradas (2): a, b
|
||||
// salidas (2): x, y
|
||||
// compuertas (2): 1 de 1 y 1 de 2 entradas
|
||||
|
||||
module contador(a, b, x, y);
|
||||
|
||||
input wire a,b;
|
||||
output wire x,y;
|
||||
|
||||
not C1(y, b);
|
||||
xor C2(x, a,b);
|
||||
|
||||
endmodule
|
||||
```
|
||||
|
||||
## contador de 2 bits con nor (7 o 9 participantes)
|
||||
|
||||
```
|
||||
// contador de 2 bits con nor
|
||||
// entradas (2): a, b
|
||||
// salidas (2): x, y
|
||||
// compuertas (5): 2 de 1 y 3 de 2 entradas
|
||||
|
||||
module contador(a, b, x, y);
|
||||
|
||||
input wire a,b;
|
||||
output wire x,y;
|
||||
wire p1, p2, p3;
|
||||
|
||||
// negaciones
|
||||
nor C1(y, b);
|
||||
nor C2(p1, a);
|
||||
|
||||
// para x
|
||||
nor C3(p2, a,b);
|
||||
nor C4(p3, y,p1);
|
||||
nor C5(x, p2,p3);
|
||||
|
||||
endmodule
|
||||
```
|
||||
|
||||
|
||||
## contador de 3 bits con nor (13 o 16 participantes)
|
||||
|
||||
```
|
||||
// contador de 3 bits con compuertas habituales
|
||||
// entradas (3): a, b, c
|
||||
// salidas (3): x, y, z
|
||||
// compuertas (10): 3 de 1, 4 de 2, 3 de 3 entradas
|
||||
|
||||
module contador(a, b, c, x, y, z);
|
||||
|
||||
input wire a,b,c;
|
||||
output wire x,y,z;
|
||||
wire p1, p2, p3, p4, p5, p6, p7;
|
||||
|
||||
// negaciones
|
||||
nor C1(p1, a);
|
||||
nor C2(p2, b);
|
||||
nor C3(z, c);
|
||||
|
||||
// para y
|
||||
nor C4(p3, b,c);
|
||||
nor C5(p4, p2,z);
|
||||
nor C6(y, p3,p4);
|
||||
|
||||
// para x
|
||||
nor C7(p5, a,b);
|
||||
nor C8(p6, p1, p2, z);
|
||||
nor C9(p7, a, p2, c);
|
||||
nor C10(x, p5, p6, p7);
|
||||
|
||||
endmodule
|
||||
```
|
||||
|
||||
|
||||
# half adder
|
||||
|
||||
circuito que suma dos bits y da el resultado en dos bits (resultado y *carry*)
|
||||
|
||||
## half adder con compuertas habituales (4 o 6 participantes)
|
||||
|
||||
```
|
||||
// half adder construido con compuertas habituales
|
||||
// entradas (2): a,b
|
||||
// salidas (2): r, c (resultado, carry)
|
||||
// compuertas (2): 2 de 2 entradas
|
||||
|
||||
module halfadder( a, b, r, c);
|
||||
|
||||
input wire a, b;
|
||||
output wire r,c;
|
||||
|
||||
// carry
|
||||
and C1(c, a, b);
|
||||
|
||||
// resultado
|
||||
xor C2(r, a, b);
|
||||
|
||||
endmodule
|
||||
```
|
||||
|
||||
## half adder usando nor (7 o 9 participantes)
|
||||
|
||||
```
|
||||
// half adder construido usando nor's
|
||||
// entradas (2): a,b
|
||||
// salidas (2): r, c (resultado, carry)
|
||||
// compuertas (5): 2 de 1 y 3 de 2 entradas
|
||||
|
||||
module halfadder( a, b, r, c);
|
||||
|
||||
input wire a, b;
|
||||
output wire r,c;
|
||||
wire p1,p2,p3;
|
||||
|
||||
// negadas
|
||||
nor C1(p1, a);
|
||||
nor C2(p2, b);
|
||||
|
||||
// carry
|
||||
nor C3(c, p1, p2);
|
||||
|
||||
// resultado
|
||||
nor C4(p3, a, b);
|
||||
nor C5(r, c, p3);
|
||||
|
||||
endmodule
|
||||
```
|
||||
|
||||
|
||||
# full adder
|
||||
|
||||
circuito que suma tres bits y da el resultado en dos bits (resultado y *carry*).
|
||||
|
||||
## full adder con compuertas habituales (14 o 16 participantes)
|
||||
|
||||
```
|
||||
// full adder construido con compuertas habituales
|
||||
// entradas (3): a, b, c
|
||||
// salidas (2): carry, r (resultado)
|
||||
// compuertas (11): 2 de 1 y 9 de 2 entradas
|
||||
|
||||
module fulladder( a, b, c, r, carry);
|
||||
|
||||
input wire a, b, c;
|
||||
output wire r, carry;
|
||||
wire p1, p2, p3, p4, p5, p6, p7, p8, p9;
|
||||
|
||||
// negadas
|
||||
not C1(p1, a);
|
||||
not C2(p3, p2);
|
||||
|
||||
// diferencias b,c
|
||||
xor C3(p2, b, c);
|
||||
or C4(p4, b, c);
|
||||
and C5(p5, b, c);
|
||||
|
||||
// armado de resultado
|
||||
and C6(p6, p1, p2);
|
||||
and C7(p7, a, p3);
|
||||
or C8(r, p6, p7);
|
||||
|
||||
// armado de carry
|
||||
and C9(p8, p1, p5);
|
||||
and C10(p9, a, p4);
|
||||
or C11(carry, p8, p9);
|
||||
|
||||
endmodule
|
||||
```
|
||||
|
||||
## full adder usando nor (15 o 17 participantes)
|
||||
|
||||
```
|
||||
// full adder construido usando nor's
|
||||
// entradas (3): a, b, c
|
||||
// salidas (2): carry, r (resultado)
|
||||
// compuertas (12): 3 de 1, 3 de 2, 4 de 3 y 1 de 4 entradas
|
||||
|
||||
module fulladder( a, b, c, r, carry);
|
||||
|
||||
input wire a, b, c;
|
||||
output wire r, carry;
|
||||
wire p1, p2, p3, p4, p5, p6, p7, p8, p9, p10;
|
||||
|
||||
// negadas
|
||||
nor C1(p1, a);
|
||||
nor C2(p2, b);
|
||||
nor C3(p3, c);
|
||||
|
||||
// pa'l carry
|
||||
nor C4(p4, a, b);
|
||||
nor C5(p5, a, c);
|
||||
nor C6(p6, b, c);
|
||||
|
||||
// pa resultado
|
||||
nor C7(p7, a, b , c);
|
||||
nor C8(p8, p1, b, p3);
|
||||
nor C9(p9, a, p2, p3);
|
||||
nor C10(p10, p1, p2, c);
|
||||
|
||||
// salidas
|
||||
nor C11(carry, p4, p5, p6);
|
||||
nor C12(r, p7, p8, p9, p10);
|
||||
|
||||
endmodule
|
||||
```
|
||||
|
||||
enlaza aquí {compudanzas}
|
||||
|
||||
=> ./compudanzas.gmi {compudanzas}
|
||||
|
||||
página actualizada en: sejmana-1660, día 1 (12021-05-20)
|
|
@ -0,0 +1,194 @@
|
|||
# recetas veganas
|
||||
|
||||
# hotcakes de chocolate
|
||||
|
||||
~35 min
|
||||
~10-12 piezas
|
||||
|
||||
(remix de sejo y mel* de la receta en pag 46 del libro "cocinar vegano vol.1" de francesca carpinelli cocinavegano.com)
|
||||
|
||||
## ingredientes
|
||||
|
||||
* 2 tazas avena (hojuela de grano entero, "old-fashioned")
|
||||
* 1.5 tazas leche de soya
|
||||
* 1 cdita polvo para hornear
|
||||
* 1 cdita bicarbonato de sodio
|
||||
* 1 cdita canela en polvo
|
||||
* 1/2 cdita sal de mar
|
||||
* 3 cdas azucar mascabado
|
||||
* 2 cdas cocoa en polvo
|
||||
* 1 cda extracto de vainilla
|
||||
* 1 cdita aceite de coco (u otro)
|
||||
* 1/2 taza chocolate amargo en trozos (opcional)
|
||||
|
||||
## instrucciones
|
||||
|
||||
* muele la avena hasta hacerla harina
|
||||
* agrega el polvo para hornear, bicarbonato de sodio, sal, canela, cocoa y azucar
|
||||
* mezcla bien
|
||||
* poco a poco agrega leche de soya y bate hasta incorporar los ingredientes
|
||||
* agrega el extracto de vainilla y bate de nuevo
|
||||
* coloca sarten a fuego medio
|
||||
* cuando se caliente, aceita y sirve la mezcla en partes iguales
|
||||
* cuando se hagan burbujas en la superficie, agrega trozos de chocolate y voltea
|
||||
* retira cuando tengan la consistencia que te agrade
|
||||
|
||||
(recuerda que no hay ingredientes crudos en la receta por lo que no hay riesgos por si parece que algo falta de cocerse)
|
||||
|
||||
## sugerencia
|
||||
|
||||
sirve con frutos rojos, moras, platano, mermeladas, mantequilla de cacahuate y/o de almendra.
|
||||
|
||||
|
||||
# "leche" y "queso" de soya
|
||||
|
||||
preparar "leche" de soya resulta en restos llamados "okara", que puede usarse entre otras cosas para preparar un "queso"
|
||||
|
||||
~60 min
|
||||
~1 lt de leche y
|
||||
un queso de ~120 gr
|
||||
|
||||
## ingredientes
|
||||
|
||||
solo para la "leche":
|
||||
|
||||
* 1/2 taza frijol de soya seco
|
||||
* 4 tazas agua
|
||||
|
||||
para el queso:
|
||||
|
||||
* 2 cditas levadura nutricional
|
||||
* 1/2 cdita sal
|
||||
* 1/2 limón
|
||||
* 1 chorrito aceite de oliva
|
||||
* 3 tazas agua
|
||||
|
||||
necesitas alguna herramienta para licuar/moler, y otra para colar finamente (e.g. manta de cielo)
|
||||
|
||||
dos ollas y algunos recipientes, y un colador ayuda
|
||||
|
||||
## instrucciones
|
||||
|
||||
### previo:
|
||||
|
||||
* deja remojando el frijol de soya por unas 8 horas
|
||||
|
||||
### durante:
|
||||
|
||||
para el queso:
|
||||
* empieza a hervir 3 tazas de agua
|
||||
|
||||
para la leche:
|
||||
* escurre el frijol de soya - al remojarse crece como hasta 1.5 tazas
|
||||
* muele en la licuadora el frijol con 3 tazas de agua
|
||||
* usa la manta de cielo para filtrar y exprimir el resultado dentro de una olla
|
||||
(el liquido se vuelve la leche, y lo solido es la okara)
|
||||
* pon la olla de la leche a hervir, cuidando de quitarle la espuma y nata
|
||||
* cuando hierva, cambia a fuego medio y espera ~20 minutos, quitando espuma y
|
||||
revolviendo en ocasiones
|
||||
* deja enfriar y bebe!
|
||||
|
||||
para el queso:
|
||||
* tan pronto el agua hierva, y ya tengas la okara, ponla en esa olla
|
||||
* deja cocer a fuego medio durante 15-20 minutos
|
||||
* usa el colador y la manta de cielo para filtrar el resultado (el liquido ya no
|
||||
lo usaremos, y el solido es la okara cocida)
|
||||
* deja enfriar un rato
|
||||
* cuando te sea posible, exprime para quitar todo el liquido que puedas
|
||||
* coloca la okara cocida y "seca" en un recipiente
|
||||
* sirve encima la levadura nutricional, sal, limon y aceite de oliva
|
||||
* mezcla muy bien con tus manos
|
||||
* compacta la mezcla para que sea "queso"
|
||||
* aparentemente conviene refrigerar un rato antes de comerlo
|
||||
|
||||
|
||||
## referencias
|
||||
|
||||
remix de estas recetas:
|
||||
=> https://simpleveganblog.com/homemade-soy-milk/ leche de soya
|
||||
=> https://youtube.com/watch?v=BU2LEYHb_qk tofu casero (youtube)
|
||||
|
||||
|
||||
|
||||
# pastel de garbanzo
|
||||
|
||||
remix de "falafel al horno"
|
||||
|
||||
(receta en proceso de afinarse porque la hago de manera intuitiva (?))
|
||||
|
||||
~60 min
|
||||
~2 "pasteles"
|
||||
|
||||
## ingredientes
|
||||
|
||||
### para la masa
|
||||
|
||||
* 1 taza garbanzo seco
|
||||
* 2 jitomates medianos
|
||||
* 1/2 cebolla
|
||||
* 2 dientes ajo
|
||||
* 1 cucharada sal
|
||||
* 1 cucharadita pimienta
|
||||
* 1 cucharada comino
|
||||
* 1.5 tazas agua
|
||||
* 1 cucharadita aceite
|
||||
* al gusto cilantro
|
||||
* al gusto chiles serranos
|
||||
|
||||
### extras:
|
||||
|
||||
* 1 cucharadita ajonjoli
|
||||
* 1 pimiento
|
||||
* 1/2 taza setas
|
||||
* 1/2 taza espinaca
|
||||
|
||||
necesitas horno y alguna herramienta para moler/licuar
|
||||
|
||||
## instrucciones
|
||||
|
||||
### previo:
|
||||
|
||||
* deja remojando los garbanzos entre 8 y 12 horas (crecen como a 2.25 tazas)
|
||||
|
||||
### durante:
|
||||
|
||||
* escurre y enjuaga los garbanzos
|
||||
* muele en la licuadora los garbanzos con el agua, cebolla, jitomates, ajo, sal,
|
||||
pimienta, comino, cilantro y chile(s)
|
||||
* aceita un par de moldes para pan y sirve la mezcla en ellos
|
||||
* opcional: deja reposar en el refrigerador por ~30 minutos
|
||||
* parte los pimientos y setas en rebanaditas, coloca junto con la espinaca y
|
||||
ajonjoli en la superficie de la masa
|
||||
* coloca los moldes en el horno, enciende a ~300 grados C
|
||||
* espera unos 40-50 minutos, o hasta que adquieran la consistencia que desees
|
||||
* apaga el horno y aprovecha el calor para seguir cociendo
|
||||
* deja enfriar y sirve!
|
||||
|
||||
queda bien junto con limon, aguacate, y alguna salsa (en proceso de definirla)
|
||||
|
||||
|
||||
# kombucha
|
||||
|
||||
(notas que uso para cada ronda)
|
||||
|
||||
~1 lt de kombucha
|
||||
|
||||
## ingredientes
|
||||
|
||||
* 1/2 taza liquido iniciador + scoby
|
||||
* 1 taza agua caliente
|
||||
* 1 cucharadita te negro (o 2 sobres)
|
||||
* 1/4 taza azucar mascabado (4 cucharadas)
|
||||
* 3 tazas agua fria
|
||||
|
||||
## instrucciones
|
||||
|
||||
* prepara el te con el agua caliente
|
||||
* cuela las hojas del te
|
||||
* disuelve la azucar en el te
|
||||
* diluye el te con el agua fria
|
||||
* agrega la mezcla al liquido iniciador + scoby
|
||||
* tapa con tela / filtros de cafe, y espera al menos un par de semanas
|
||||
|
||||
|
||||
página actualizada en: sejmana-1660, día 1 (12021-05-20)
|
|
@ -0,0 +1,33 @@
|
|||
# s-camino... el camino del ensamblador (?)
|
||||
|
||||
veo razones varias, múltiples, para el estudio poético y contemplativo de la computación a bajo nivel.
|
||||
|
||||
específicamente aquí me refiero al programar en el llamado lenguaje ensamblador (¿o idioma ensamblador?)
|
||||
|
||||
en otros contextos se puede hablar de que conviene hacerlo buscando eficiencia, velocidad, haciendo el sacrificio de descender por las escaleras para mover los fierros; ensuciarse las manos mientras se observa la complejidad del dispositivo... pero todo sea por la productividad y el resultado óptimo que se encontrará a final del tunel.
|
||||
|
||||
aquí no estamos en ese contexto, claramente. pero justo esa impracticidad, esa mugre, esa manualidad o artesanalidad, la imagen de que a fin de cuentas (solo) estamos moviendo bits de aquí para allá (conectados de tal manera que algo más sucede) es la que llama la atención.
|
||||
|
||||
¿qué tal si acompañamos a la máquina en un nivel cercano al que será su propósito (¿o condena?) de vida?
|
||||
|
||||
tomamos conciencia de cada uno de los pasos por la que la haremos pasar sin otra opción más que seguir, seguir, seguir…
|
||||
|
||||
y sí, al escribir y programar en ensamblador vamos con lentitud, porque las convenciones son extrañas (todo un dialecto que tal vez busca alejar a quien no tiene cierto perfil), porque es un mundo que contrasta con la costumbre de la eficiencia, de los resultados inmediatos.
|
||||
|
||||
además, ¿cuál es la prisa, por qué querer hacer tanto?
|
||||
|
||||
hacer un programa se puede convertir en un ritual; la invocación del libro de instrucciones y conexiones, la planeación y reflexión antes de escribir la primera letra; tardarse horas en algo que aquellas estructuras de facilidad, practicidad, te permiten hacer en minutos, segundos (¿pero te quitan toda la magia, todo el asombro y confrontación con lo que realmente está pasando?)
|
||||
|
||||
la no portabilidad del código está a nuestro favor, porque implica rehacerlo cada vez (o cuando sea necesario), re-contemplar, ir lento. de nuevo, ¿cuál es la prisa?
|
||||
|
||||
estoy de acuerdo, es un mundo inaccesible (¿similar a cualquier otro tipo de hechicería?), pero parte de la labor que me autoasigno es hacerle puertas (o grietas, hoyos, y adentro madrigueras) para poderlo compartir.
|
||||
|
||||
no cualquiera tiene el tiempo... igual aquí andaremos, con paciencia, y un paso a la vez.
|
||||
|
||||
(escrito el 12019-07-05)
|
||||
|
||||
enlazan aquí:
|
||||
=> ./avr-asm.gmi {avr-asm}
|
||||
=> ./darena.gmi {darena}
|
||||
|
||||
página actualizada en: sejmana-1660, día 1 (12021-05-20)
|
|
@ -32,6 +32,6 @@
|
|||
|
||||
END{
|
||||
print ""
|
||||
print "página actualizada en: " fechasjm
|
||||
print "página actualizada en: " fechasjm " (1" fecha ")"
|
||||
# fecha = system( "date -r " FILENAME " --rfc-3339=date" )
|
||||
}
|
||||
|
|
|
@ -321,6 +321,7 @@ END{
|
|||
print "<p><a href='./index.html'>{" sitio "}</a></p>"
|
||||
print "<p>página actualizada en: "
|
||||
print "<time datetime='"fecha"'>" fechasjm "</time>"
|
||||
print " (1"fecha")"
|
||||
print "</p>"
|
||||
# fecha = system( "date -r " FILENAME " --rfc-3339=date" )
|
||||
# print "</p>"
|
||||
|
|
Loading…
Reference in New Issue