Cómo escribir un juego para una computadora en la que no hay dispositivos de entrada y salida

¿Qué se puede hacer con una computadora en relés electromagnéticos que no tiene ningún dispositivo de entrada, y desde dispositivos de salida, solo un volcado de ocho registros?

¡Juega juegos, por supuesto! Los antiguos jugaban con calculadoras MK-61/52, que son solo un poco más obvias.



Adivina el número


Comencé con el juego, donde la computadora que usa media división debería encontrar el número entero oculto por el jugador de 0 a 100.

La computadora escribe su presentimiento para registrar A, y luego se detiene.

Los valores de todos los registros se pueden ver gracias a los LED integrados en el relé:



Ahora el reproductor debe cambiar el código del programa en la ROM, reemplazando la constante cargada en el registro D. Si no hay 0, esto significa que la suposición es mayor que el número que solicitó. De lo contrario, menos. Después de eso, debe hacer clic en el botón "continuar trabajando". Después de verificar el caso D, la computadora usa el supuesto anterior como límite superior o inferior en el siguiente intento.

La primera versión del programa.
MOVI B, 1 ; 00: 10000001 00000001 MOVI C, 101 ; 01: 10000010 01100101 Loop: ADD A, B, C ; 02: 01001000 00011010 SHR A, A ; 03: 01111000 00001100 HALT ; 04: 00010000 00000000 MOVI D, guess ; 05: 10000011 iiiiiiii OR F, D, D ; 06: 01101000 00110011 JMP NZ, Greater ; 07: 11100111 00001010 MOV B, A ; 08: 00011001 00000000 JMP Loop ; 09: 10000111 00000010 Greater: MOV C, A ; 0a: 00011010 00000000 JMP Loop ; 0b: 10000111 00000010 




La desventaja del primer programa es que es incómodo de usar. Esto puede entenderse mirando la foto de la ROM: no es muy fácil cambiar interruptores de palanca tan pequeños mientras se juega (pero también debes asegurarte de que el programa no lo estropee accidentalmente).

Entonces se me ocurrió una opción de entrada diferente. Para la depuración , se proporciona un interruptor de palanca junto a cada registro para restablecer su valor. Cambiarlo es mucho más conveniente que cambiar la ROM.

Ahora la computadora ingresa a la unidad en el registro D de antemano, y el jugador la descarta (si la suposición es menor que el número deseado) o la deja como está (si la suposición es mayor).

La versión final del programa.
  MOVI B, 1 ; 00: 10000001 00000001 MOVI C, 101 ; 01: 10000010 01100101 Loop: ADD A, B, C ; 02: 01001000 00011010 SHR A, A ; 03: 01111000 00001100 MOVI D, 1 ; 04: 10000011 00000001 HALT ; 05: 00010000 00000000 OR F, D, D ; 06: 01101000 00110011 JMP NZ, Greater ; 07: 11100111 00001010 MOV B, A ; 08: 00011001 00000000 JMP Loop ; 09: 10000111 00000010 Greater: MOV C, A ; 0a: 00011010 00000000 JMP Loop ; 0b: 10000111 00000010 



Juego de resta (juego bashe)


Otro juego clásico que los programadores novatos a menudo implementan es el juego Bachet.
En él, dos jugadores de un montón que contiene inicialmente N ítems se turnan para tomar al menos uno y no más de M ítems. El perdedor es el que no tiene nada que tomar.



En mi versión, el juego viene con una computadora. Inicialmente, un conjunto de 21 elementos (por ejemplo, 21 coincidencias). Los jugadores toman de 1 a 3 partidos en su turno, y el que toma el último partido gana.

El juego tiene una estrategia ganadora para el primer jugador: siempre deje el número de partidos, que es un múltiplo de cuatro. Como 0 también es múltiplo de cuatro, el segundo jugador no podrá llevar el juego a esta posición, lo que significa que perderá.

La computadora va en segundo lugar, dejando una oportunidad a las personas, pero no comete errores. Y si el jugador no sigue una estrategia ganadora, entonces la computadora lo hará.

La primera versión del programa.
  MOVI A, 21 ; 00: 10000000 00001101 Loop: HALT ; 01: 00010000 00000000 MOVI B, move ; 02: 10000001 000000mm SUB A, A, B ; 03: 01011000 00001001 AND C, A, 3 ; 04: 01100010 10001011 MOVI Z, C, 1 ; 05: 10010010 00000001 SUB A, A, C ; 06: 01011000 00001010 JMP Loop ; 07: 10000111 00000001 


En la primera versión, se utilizó el mismo enfoque que para "adivinar el número": en su turno tenía que codificar el número de coincidencias dentro de una de las instrucciones. Incluso podría contar y tomar todas las coincidencias a la vez, y la computadora no notará nada.

Pero luego reescribí este programa también. Ahora en tres registros (B, C, D) la computadora ingresa 1 cada uno, y el jugador debe reiniciar 0, 1 o 2 de ellos. Las unidades restantes son esos partidos que él toma. La trampa también es posible si restablece los tres registros (como si no estuviera tomando nada).

La versión final del programa.
  MOVI A, 21 ; 00: 10000000 00010101 Loop: MOVI B, 1 ; 01: 10000001 00000001 MOVI C, 1 ; 02: 10000010 00000001 MOVI D, 1 ; 03: 10000011 00000001 HALT ; 04: 00010000 00000000 SUB A, A, B ; 05: 01011000 00001001 SUB A, A, C ; 06: 01011000 00001010 SUB A, A, D ; 07: 01011000 00001011 AND C, A, 3 ; 08: 01100010 10001011 MOVI Z, C, 1 ; 09: 10010010 00000001 SUB A, A, C ; 0a: 01011000 00001010 JC Exit ; 0b: 10110111 00001101 JNZ Loop ; 0c: 11100111 00000001 Exit: HALT ; 0d: 00010000 00000000 


Por supuesto, el programa resultó ser algo más largo, pero usarlo es mucho más conveniente.


Además, planeo terminar la ROM (ahora solo hay 32 palabras de un posible 64), y también agregar un dispositivo de entrada en forma de una matriz de interruptores de palanca. Quizás entonces puedas hacer al menos tres en raya.

Source: https://habr.com/ru/post/es421491/


All Articles