Esse site contém uma implementação do Little Man Computer
O simulador é implementado usando JavaScript, HTML e CSS e roda inteiramente no navegador WEB.
É completamente funcional, e inclui diversos programas de exemplo.
Minha intenção foi criar uma aplicação web simples de usar para ajudar os estudantes a programas na linguagem do LMC.
Essa aplicação possui um diagrama clicável da CPU, que é animado quando um programa LMC é executado, mostrando os valores nos registradores principais, o fluxo de dados dentro da CPU, e as atividades de leitura e escrita na memória.
Clicando em um registrador quando um programa não está rodando irá apresentar uma breve descrição. Os registradores apresentados são:
Registrador | Nome | Proposta |
---|---|---|
PC | Program Counter (Contador de Programa) | O Contador de Programa contém o endereço da próxima instrução a ser buscada da memória. Se você observar atentamente durante a execução de um programa, irá ver que o PC incrementa em 1 imediatamente após uma instrução ser lida da memória. As instruções de ramificação ('BRA', 'BRZ', e 'BRP') podem mudar o valor do PC, causando um salto na execução do programa para um novo endereço de memória. |
CIR | Current Instruction Register (Registrador de Instrução Atual) | O Registrador de Instrução Atual contém a última instrução buscada da memória via o MDR. Antes da instrução ser executada, ele deve ser decodificado em uma série de sinais pelo Decodificador. |
Decoder | Decoder (Decodificador, parte da Unidade de Controle) | O Decodificador pega o código de instrução do CIR e transforma ele em uma série de sinais para controlar a execução da instrução. |
Input | Input Mailbox (Caixa de entrada) | A caixa de entrada é usada para segurar a entrada de dado do usuário antes dele ser movido para o acumulador. Quando uma instrução 'INP' é executada, o usuário é solicitado a entrar com o valor que será colocado na caixa de entrada e então movido para o acumulador. |
ALU | Arithmetic and Logic Unit (Unidade Lógica e Aritmética) | A Unidade Lógica e Aritmética é responsável pelas operações de 'ADD' e 'SUB'. Em um processador moderno, a ALU seria muito mais complexa, mas o conjunto de instruções do LMC possui apenas essas duas operações. |
ACC | Accumulator (Acumulador) | O Acumulador normalmente mantem o resultado da última operação resultante da ALU, mas um valor pode ser diretamente carregada no acumulador advinda da memória, usando a instrução 'LDA'. É possível escrever o valor atual do acumulador na memória usando a instrução 'STA'. Finalmente, o acumulador pode ser carregado por uma entrada do usuário (instrução 'INP') ou usado como saída para o usuário (instrução 'OUT'). |
MAR | Memory Address Register (Registrador de Endereço de Memória) | O Registrador de Endereço de Memória mantém um endereço para um local da memória que será lido ou escrito. Em uma operação de leitura (que poderia estar buscando uma instrução ou lendo um dado), o valor no endereço de memória será recuperado e colocado na MDR. Em uma operação de escrita (parte da instrução 'STA'), o valor no MDR será escrito na memória no endereço especificado. |
MDR | Memory Data Register (Registrador de Dado da Memória) | O Registrador de Dado da Memória mantém o valor que foi lido da memória, ou que será escrito na memória. É importante notas que esse valor pode ser uma instrução ou dado. No caso de uma instrução, ele sempre terá sido lido da memória como parte do ciclo BUSCA-EXECUTA-DECODIFICA. No caso de um dado, o valor pode ter sido lido da memória (instrução 'ADD', 'SUB' ou 'LDA') ou será escrito na memória (instrução 'STA'). |
SR | Status Register (Registrador de Estado) | O Registrador de Estado é um componente importante de qualquer processador moderno. Quando a ALU completa uma operação, o Registrador de Estado é atualizado com uma informação sobre essa operação. Nesse simulador, apenas 3 bits são usados: O bit menos significativo (bit 0) é uma flag de transbordamento - se o resultado de uma soma for maior que 999, ou o resultado de uma subtração for menos que -999, essa flag terá valor 1. Bit 1 é usado para quando o resultado de uma operação é zero, e o bit 2 é usado para quando o resultado de uma operação é positivo (zero ou mais). Bits 1 e 2 são usados nas operações de ramificação 'BRZ' e 'BRP'. |
Output | Output Mailbox (Caixa de Saída) | A Caixa de Saída é usada para guardar a saída do acumulador. Quando uma instrução 'OUT' é executada, o valor do Acumulador é movido para a Caixa de Saída e apresentado ao usuário. |
O editor de código é baseado em um design de tabela, tornando fácil separar os rótulos, operadores, e operandos.
Quando um programa está executando, a linha atual do código é mostrada com um ponto verde, e o valor das variáveis é atualizado no Editor de Código e também na memória.
Programas podem ser salvos no armazenamento local, enviados do armazenamento local, e convertidos para PDF para impressão (ou incluídos em relatórios de projeto).
Quando um programa LMC está rodando, o console provê um resumo de cada operação.
O repositório original do simulador The Little Man Computer pode ser encontrado em: https://github.com/Wellingborough/LMC
O código fonte do simulador LMC está disponível sob licença GNU General Public License v3.0.