Comment écrire un jeu pour un ordinateur dans lequel il n'y a pas de périphériques d'entrée et de sortie

Que peut-on faire avec un ordinateur sur des relais électromagnétiques qui n'a pas de périphériques d'entrée, et à partir de périphériques de sortie - seulement un vidage de huit registres?

Jouez à des jeux bien sûr! Les anciens ont joué sur les calculatrices MK-61/52, qui ne sont qu'un peu plus évidentes.



Devinez le nombre


J'ai commencé avec le jeu, où l'ordinateur utilisant la demi-division devrait trouver l'entier caché par le joueur de 0 à 100.

L'ordinateur écrit son intuition pour enregistrer A, puis s'arrête.

Les valeurs de tous les registres sont visibles grâce aux LED intégrées au relais:



Maintenant, le joueur doit changer le code du programme dans la ROM, en remplaçant la constante chargée dans le registre D. S'il n'y a pas 0, cela signifie que l'hypothèse est supérieure au nombre que vous avez demandé. Sinon, moins. Après cela, vous devez cliquer sur le bouton "continuer le travail". Après avoir vérifié le cas D, l'ordinateur utilise l'hypothèse précédente comme limite supérieure ou inférieure lors de la tentative suivante.

La première version du programme
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 




L'inconvénient du premier programme est qu'il est peu pratique à utiliser. Cela peut être compris en regardant la photo de la ROM - ce n'est pas très facile de commuter de si petits interrupteurs à bascule pendant le jeu (mais vous devez également vous assurer que le programme ne le gâche pas accidentellement).

J'ai donc trouvé une option d'entrée différente. Pour le débogage , un interrupteur à bascule est fourni à côté de chaque registre pour réinitialiser sa valeur. Le commuter est beaucoup plus pratique que de changer la ROM.

Maintenant, l'ordinateur entre à l'avance dans le registre D, et le joueur la rejette (si la supposition est inférieure au nombre prévu) ou la laisse telle quelle (si la supposition est plus).

La version finale du programme
  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 



Jeu de soustraction (jeu bashe)


Un autre jeu classique que les programmeurs novices implémentent souvent est le jeu Bachet.
Dans celui-ci, deux joueurs d'un tas contenant initialement N objets à tour de rôle prennent au moins un et pas plus de M éléments. Le perdant est celui qui n'a rien à prendre.



Dans ma version, le jeu est livré avec un ordinateur. Initialement, un tas de 21 éléments (par exemple, 21 correspondances). Les joueurs prennent 1 à 3 matchs à leur tour, et celui qui prend le dernier match gagne.

Le jeu a une stratégie gagnante pour le premier joueur - laissez toujours le nombre de matchs, qui est un multiple de quatre. Puisque 0 est également un multiple de quatre, le deuxième joueur ne pourra pas amener le jeu à cette position, ce qui signifie qu'il perdra.

L'ordinateur passe en second, laissant une chance aux gens, mais il ne fait pas d'erreurs. Et si le joueur ne suit pas une stratégie gagnante, l'ordinateur le fera.

La première version du programme
  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 


Dans la première version, la même approche était utilisée que pour «deviner le nombre» - à votre tour, vous deviez encoder le nombre de correspondances dans l'une des instructions. Vous pouvez même compter et prendre tous les matchs en même temps, et l'ordinateur ne remarquera rien.

Mais j'ai aussi réécrit ce programme. Maintenant, dans trois registres (B, C, D), l'ordinateur entre 1 chacun et le joueur doit réinitialiser 0, 1 ou 2 d'entre eux. Les unités restantes sont les matchs qu'il prend. La tricherie est également possible si vous réinitialisez les trois registres (comme si vous ne preniez rien).

La version finale du programme
  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 


Bien sûr, le programme s'est avéré être un peu plus long, mais son utilisation est beaucoup plus pratique.


De plus, je prévois de terminer la ROM (maintenant il n'y a que 32 mots sur un possible de 64), et d'ajouter également un périphérique d'entrée sous la forme d'une matrice de commutateurs à bascule. Peut-être que vous pouvez alors faire au moins du tic-tac-toe.

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


All Articles