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:
- Nombre programa / descripción: Nos indica exactamente como debería funcionar el programa
- Entrada/Salida de datos: Nos indica la secuencia de entrada y la secuencia de salida correcta que deberá tener el programa
- Controles del debugger: Nos permite detener, iniciar el programa, iniciar paso a paso o iniciar deprisa.
- Cores programables: TIS-100 tiene un procesador con 14 núcleos, en ellos deberemos introducir las instrucciones y armar el programa.
- 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
- 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:
- Coge un valor que venga del núcleo de su izquierda y lo mueve a una zona de memoria reservada llamada acumulador (ACC).
- Suma el valor de ACC con el valor del parámetro ADD, guarda el resultado en ACC
- 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