TIS-100 #HO | Tessellated Intelligence System

AikonCWD

Introducción

Me resulta curioso que no exista un hilo de TIS-100 en Mediavida, os hago un poco la introducción. TIS-100 es un juego creado por Zachtronics (los mismo de SpaceChem o Infinifactory). Se trata de un juego de puzzles y programación a partes iguales. La historia nos pone delante de un ordenador antiguo llamado TIS-100, nada más encenderlo sucede un error de memoria y el sistema entra en modo debugger para intentar reparar cada uno de sus módulos. Para resolver los puzzles deberemos introducir las instrucciones necesarias para completar el programa requerido, para ello el sistema utiliza una modificación del lenguaje ensamblador (ASM para los amigos), reducido y adaptado para que su aprendizaje sea rápido. El juego viene acompañado de un estupendo manual en formato PDF para que podamos saber que hace cada instrucción.

A parte de resolver los puzzles del ordenador, en el transcurso de las pruebas nos iremos adentrando en una historia con un transfondo curioso e intrigante. A parte el sistema TIS-100 está lleno de secretos y curiosidades, ficheros de memoria perdidos, etc... Pese a que el manual de TIS-100 es muy completo, a día de hoy sabemos que existen ciertas instrucciones en ASM que se implementaron en TIS-100 pero jamás se llegaron a documentar. Lograrás descubrirlas?

#Steam

Cómo se juega

Aquí tenemos la pantalla de TIS-100 con un programa cargado, esperando instrucciones. He pintado y numerado en azul las zonas importantes:

  1. Nombre programa / descripción: Nos indica exactamente como debería funcionar el programa
  2. Entrada/Salida de datos: Nos indica la secuencia de entrada y la secuencia de salida correcta que deberá tener el programa
  3. Controles del debugger: Nos permite detener, iniciar el programa, iniciar paso a paso o iniciar deprisa.
  4. Cores programables: TIS-100 tiene un procesador con 14 núcleos, en ellos deberemos introducir las instrucciones y armar el programa.
  5. Entrada de datos: Nos indica en que núcleo se iniciará la entrada de datos, así como su nombre. Puede existir más de una entrada por programa
  6. Salida de datos: Nos indica en que núcleo se deberá sacar los valores procesados. Puede existir más de una salida por programa

Ahora descargad el manual oficial, son pocas páginas. En inglés pero se entiende fácil. Podría currarme alguna traducción si fuera necesario. Dejo un mini resumen con las instrucciones más típicas:

En el ejemplo de la imagen, el programa nos pide recoger el valor de entrada IN.A, duplicar su valor y sacarlo por la salida OUT.A. Luego explicaré con detalle como lograr ese cometido, pero por el momento familiarízate con la sintaxis ASM:

MOV LEFT, ACC
ADD ACC
MOV ACC, DOWN

Tenemos 3 instrucciones, vayamos poquito a poquito:

  1. Coge un valor que venga del núcleo de su izquierda y lo mueve a una zona de memoria reservada llamada acumulador (ACC).
  2. Suma el valor de ACC con el valor del parámetro ADD, guarda el resultado en ACC
  3. Movemos el valor de ACC hacia el núcleo inferior.

Verás que el resto de núcleos simplemente mueven el valor de IN.A hasta el núcleo inferior, duplicamos el valor y sacamos el resultado por OUT.A, fácil no? El resto de programas se irán complicando de forma exponencial.

Evaluar el resultado

Al completar y finalizar un programa correctamente, obtendremos una puntuación basada en 3 resultados:

  • Número de ciclos empleados
  • Número de núcleos empleados
  • Número de instrucciones utilizadas

Un mismo programa puede escribirse de muchas formas diferentes, en ese caso el programa que cumpla su función en el menor número de ciclos, usando el menor número de núcleos y el menor menor número de instrucciones se considerará mejor optimizado y de mucho más valor. Podremos comparar nuestro resultado con la media mundial.

Atajos de teclado básicos

  • F1: Ver una chuleta rápida de las principales instrucciones
  • F2: ???
  • F5: Iniciar el programa
  • F6: Ejecutar un paso del programa o pausar la ejecución actual
  • Ctrl+Z: Deshacer
  • Ctrl+Y: Rehacer
  • Ctrl+X: Cortar
  • Ctrl+C: Copiar
  • Ctrl+V: Pegar
  • Ctrl+Flecha: Navegar entre núcleos

Podemos poner un breakpoint añadiendo el símbolo ! delante de una instrucción.

Ejemplo de bucle "for"

Como último apunte, os dejo un ejemplo de código sencillo para crear un bucle "for" en ASM:

MOV RIGHT, ACC
SWP
MOV 10, ACC

L:
 JEZ END
 SUB 1
 JMP L

END:
 SWP
 MOV ACC, DOWN

Recogemos el valor de la derecha y lo guardamos en nuestro acumulador. Hacemos swap para guardar el acumulador en nuestra unidad de backup. Movemos el número 10 al acumulador. Comprobamos si el acumulador es igual a cero (JEZ), en tal caso saltaríamos a la etiqueta END. Restamos 1 al acumulador y saltamos (JMP) a la etiqueta L. Tras completar el bucle, hacemos swap para rescatar el valor original que teníamos en el backup y lo guardamos en el acumulador para finalmente enviarlo hacia el núcleo inferior.

Despedida

Pues de momento me paro aquí, si veo cierto interés y la gente necesita ayuda, puedo ampliar el hilo con más ejemplos y explicaciones. Yo estoy atascado en el programa 8, a ver si entre todos conseguimos completar el maldito juego!

El juego tiene su tiempo, en internet y youtube están las soluciones, evitad mirar ejemplos si no queréis aburrir el juego en 5 minutos

8
Cryoned

Es un juegazo de puzzles tremendo. Terriblemente adictivo, con un diseño impecable. Los juegos de este desarrollador (spacechem, infinifactory), podrìa decirse que entran sin el más mínimo problema en los mejores juegos de puzzles de la historia.

No es para todo el mundo, pero a su vez es accesible, al final no deja de ser un juego de lógica.. Yo lo recomiendo y por lo que cuesta, más.

1
B

Me esperaba que con F2 me saltara un susto o algo...no la respuesta a la historia detras del aparato :D

1 respuesta
Aidanciyo

Lo que me faltaba, de pasar a soñar con e nexo a soñar con ensamblador

B

Ya he tenido suficiente este año con ARM, pero quizas en una temporada le doy un try

1 respuesta
AikonCWD

#3 Tienes las teclas documentadas en el PDF oficial, no he spoileado nada :)

#5 Es divertido, y para nada se trata de usar ASM real, son puzzles que deberemos resolver usando una serie de instrucciones muy básicas.

El juego se complica bastante, hay un módulo de stack (pila) de tipo LIFO (Last Input First Out) que me está volviendo loco, tengo que armar un programa que multiplique dos valores y no me sale xD. Luego más adelante nos muestra un modulo para dibujar, en unos días ampliaré el hilo con dicha información (si llego xD).

1 1 respuesta
L

Añado el juego en Steam.

1
valdrar

Está genial ¡ llegas a casa después de estar 8 horas programando y para desconectar, unos puzles en ensamblador jejeje bueno, es coña, para los que les gusta programar es la caña ¡ pero animo a todos a probarlo, porque no es necesario, que seas programador, solo hay que aplicar la lógica ¡

1 respuesta
Postmortem

Venía a decir lo de #8 , no sé si después de estar tocando código 8 horas puede no apetecer seguir dándole, pero al final programar en juegos suele ser entretenido como en el juego de los creadores de LittleInferno, así que definitivamente lo tengo en mi radar, y por ese precio seguramente caiga en la 2º ronda de repaso que haga a Steam antes de que terminen las ofertas

AikonCWD

Exacto, que nadie se asuste. Ésto no deja de ser un juego, el único requisito es tener cierta lógica y una mente abierta y preparada para diseñar procesos y flujos, la sintaxis de éste ASM modificado es MUY sencilla y el número de instrucciones es muy bajo (se pueden memorizar en 1 hora o menos).

Animo a cualquier que lo pruebe, aunque no sepa programar.

B

#6 Si si, pero que se me hace curioso que tarden en darte esa información en la historia pero puedas sacarla con una tecla

n3krO

Entiendo que solo hay 1 registro por nucleo que es lo que llaman "acc" ?

Termino de comprar el juego, a ver si el viernes me vicio jajaja

1 respuesta
AikonCWD

#12 Cada núcleo (cada caja), tiene un registro llamado ACC (acumulador) y otro registro llamado BAK (backup). Con el ACC podemos operar, es el registro encargado de las operaciones ADD y SUB, así como los saltos condicionales JEZ, JNZ, etc...
El registro BAK no se puede "utilizar", pero podemos guardar el valor de ACC en BAK usando el operador SAV o intercambiar los valores de ACC por BAK usando el operador SWP.

Es más fácil de lo que parece, el único requisito es que pienses bien lo que tienes que hacer para que el programa funcione.

Id practicando con el juego, entre hoy y mañana publicaré un nuevo hilo sobre algo que irá relacionado con TIS-100 :)

1 respuesta
n3krO

#13 Digo yo que para operar 2 numeros tendras 1 numero en cada nucleo y harias algo asi como:

ADD RIGHT

sumandole lo que esta en el ACC de tu derecha a tu ACC, no?

xddd

1 respuesta
AikonCWD

#14 Mas o menos, , previamente en el modulo de la derecha tendrás que poner la instruccion MOV ACC, LEFT para que en el modulo de la izquierda lo recogas con un ADD RIGHT por ejemplo.

Ahora imagina sobre tu mente como harías la función de multiplicar 2 números y sacar el resultado, teniendo en cuenta que no existe ninguna instrucción MUL, solo ADD para sumar xD

1 respuesta
n3krO

#15 Bucle for y usando el registro de 2 o 3 nucleos contiguos xdddd (creo que serian 2 nucleos, siendo que en uno de ellos vas haciendo swaps con el registro de backup)

Bueno, pues eso, que el viernes me vicio si no quedo jajaja

1
MrAllOnA

Interesante. Aunque da cierta pereza...jeje

Resa

Ya le estoy dando. No tengo puta idea de programar asi que tengo esta duda:

Estoy en este nivel:

El problema es que cuando ejecuto, en el procesador por el que entra in.s no se detiene cuando llega a "MOV ANY ACC" por lo que no recoje el 7 que le viene por la derecha en el ciclo que es y se jode todo.

Imagen del paso donde falla:

Imagen del programa si lo ejecuto:

2 respuestas
AikonCWD

#18 Si quieres recoger el valor que viene por su derecha, utiliza MOV RIGHT, ACC en lugar de MOV ANY, ACC El resto del codigo no lo he comprobado, pero esa duda yo la resolvería así.

n3krO

#18 Estas evaluando In.S en 3 nucleos para decidir en cual de los nucleos pasas ACC al nucleo del centro.

Yo haria toda la logica en el nucleo central, y los otros 2 nucleos solo pasarian In.A e In.B al nucleo central.

angelrcd

No es tan complicado como pueda parecer, he tenido que mirar un video un par de minutos porque solo con el manual no me coscaba de nada, pero en cuanto pillas mas o menos la mecánica todo va rodado y con el manual de 13 páginas que te viene (del cual solo necesitas 4,5 páginas a lo sumo) te basta y te sobra.

Lo recomiendo, entretiene un montón.

1 respuesta
AikonCWD

#21 Por donde vas? Yo estoy atascado en la tercera línea de programas, y me falta por hacer el último programa de la línea 2 :psyduck:

Estoy empezando a trabajar con modulos de stack (pila, tipo LIFO) y me está gustando y estresando a partes iguales xD:

angelrcd

Yo estoy atascado entre "sequence counter" (de este paso de momento porque no lo saco ni de broma) y "signal edge detector"

n3krO

A mi loo que me pone de los nervios es que el numero de lineas por nucleo esta limitado xd

No me da espacio para tener el codigo bonito con sus espacios y tal xd

Resa

Sere yi un inutil pero me estan jodiendo vivo los programas de sucesiones donde tienes que almacenar valores para operar con ellos.

B

A los que se les atragante este les recomiendo muchísimo SpaceChem, del mismo creador, más visual y más accesible. Me parece un juegazo como la copa de un pino y ahora mismo está regaladísimo.

n3krO

Termino de hacer el programa de las interrupciones.

Lo que no veo es como puedo optimizarlo ._.

Resa

Acabo de hacer el de multiplicar haciendo ciclos. Veo que hay modulos de memoria por ahi, ¿como seria el algoritmo para hacerlo con eso?

1 respuesta
AikonCWD

#28 Has hecho el de multiplicar sin utilizar el memory stack? xDDDDDDD Que puto amo eres.

1 respuesta
Resa

#29 Si y lo peor es que no lo se hacer de otra manera. Eso si, chupa millones de ciclos (en concreto 2300)

1 respuesta

Usuarios habituales

Tags