Como escrever um jogo para um computador no qual não há dispositivos de entrada e saída

O que pode ser feito com um computador em relés eletromagnéticos que não possui nenhum dispositivo de entrada e a partir de dispositivos de saída - apenas um despejo de oito registros?

Jogue, é claro! Os povos antigos jogavam nas calculadoras MK-61/52, que são apenas um pouco mais óbvias.



Adivinhe o número


Comecei com o jogo, onde o computador usando meia divisão deve encontrar o número inteiro oculto pelo jogador de 0 a 100.

O computador grava seu palpite para registrar A e depois pára.

Os valores de todos os registros podem ser vistos graças aos LEDs embutidos no relé:



Agora o jogador deve alterar o código do programa na ROM, substituindo a constante carregada no registro D. Se não houver 0, isso significa que a suposição é maior que o número solicitado. Caso contrário, menos. Depois disso, você precisa clicar no botão "continuar trabalhando". Após verificar o caso D, o computador usa a suposição anterior como limite superior ou inferior na próxima tentativa.

A primeira versão do 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 




A desvantagem do primeiro programa é que é inconveniente de usar. Isso pode ser entendido observando a foto da ROM - não é muito fácil alternar interruptores tão pequenos durante o jogo (mas você também precisa garantir que o programa não o estrague acidentalmente).

Então, eu vim com uma opção de entrada diferente. Para depuração , é fornecida uma opção de alternância ao lado de cada registro para redefinir seu valor. Mudar é muito mais conveniente do que mudar a ROM.

Agora o computador entra na unidade no registro D com antecedência e o jogador a descarta (se a estimativa é menor que o número pretendido) ou a deixa como está (se a estimativa é maior).

A versão final do 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 



Jogo de subtração (bashe game)


Outro jogo clássico que os programadores iniciantes costumam implementar é o jogo Bachet.
Nele, dois jogadores de uma pilha contendo inicialmente N itens se revezam, pegando pelo menos um e não mais que M itens. O perdedor é quem não tem o que levar.



Na minha versão, o jogo vem com um computador. Inicialmente, um monte de 21 itens (por exemplo, 21 correspondências). Os jogadores disputam de 1 a 3 partidas, e quem vence a última partida.

O jogo tem uma estratégia vencedora para o primeiro jogador - sempre deixe o número de partidas, que é múltiplo de quatro. Como 0 também é múltiplo de quatro, o segundo jogador não poderá trazer o jogo para essa posição, o que significa que ele perderá.

O computador fica em segundo lugar, deixando uma chance para as pessoas, mas não comete erros. E se o jogador não seguir uma estratégia vencedora, o computador fará isso.

A primeira versão do 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 


Na primeira versão, a mesma abordagem foi usada para "adivinhar o número" - na sua vez, você tinha que codificar o número de correspondências dentro de uma das instruções. Você pode até contar e aceitar todas as correspondências de uma só vez, e o computador não notará nada.

Mas então eu reescrevi este programa também. Agora, em três registros (B, C, D), o computador insere 1 cada e o reprodutor deve redefinir 0, 1 ou 2 deles. As unidades restantes são aquelas partidas que ele recebe. Também é possível trapacear se você redefinir todos os três registros (como se não estivesse usando nada).

A versão final do 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 


Obviamente, o programa acabou sendo um pouco mais longo, mas usá-lo é muito mais conveniente.


Além disso, pretendo terminar a ROM (agora existem apenas 32 palavras em um possível 64) e também adicionar um dispositivo de entrada na forma de uma matriz de comutadores. Talvez você possa fazer pelo menos tic-tac-toe.

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


All Articles