Skip to content

Little Man Computer

Peter Higginson's LMC implementation - Help Page from Peter Higginson's LMC implementation

I have also created a GitHub repository dedicated to LMC examples.

Glossary

Knowing the definition of the following words is required to fully understand the User Guide.

Word / Phrase Definition
Accumulator Stores the result of the last operation or calculation.
Program Counter Stores the memory location of the next operation to be executed.

Basic Instructions

The following is a list of the basic instructions that can be performed on LMC.

Instruction Description
HLT Signifies the end of the program.
INP Waits for numeric input and stores it in the accumulator.
OUT Outputs the contents of the accumulator.
ADD Adds the contents of the given memory address to the accumulator.
SUB Subtracts the contents of the given memory address from the accumulator.
STA Stores the contents of the accumulator to the given memory address.
LDA Loads the contents of the given memory address to the accumulator.
DAT Stores the given value in the memory address of the instruction.

Example (basic_calc)

Using the knowledge you've gained above, you should be able to build a simple calculator program like the one below:

1
2
3
4
5
6
    INP    # Waits for input and stores it in the accumulator
    STA 99 # Stores the contents of the accumulator to the memory address: 99
    INP    # Waits for input and stores it in the accumulator
    ADD 99 # Add the contents of memory address: 99 to the accumulator
    OUT    # Outputs the contents of the accumulator
    HLT    # Signify the end of the program

Labels

In larger programs, you may be storing lots of data, so using raw memory locations all over the place probably isn't the best of ideas. Labels solve this problem, and make you code neater at the same time.

Labels represents a memory address, and can be defined anywhere in your program.

Representing an instruction (labels_basic)

Here we are using a label to represent the memory location of an instruction.

1
2
3
4
5
6
START INP    # Waits for input and stores it in the accumulator
      STA 99 # Stores the contents of the accumulator to the memory address: 99
      INP    # Waits for input and stores it in the accumulator
      ADD 99 # Add the contents of memory address: 99 to the accumulator
      OUT    # Outputs the contents of the accumulator
      HLT    # Signify the end of the program

Representing a memory location for data (labels_advanced)

Here we are using a label to represent the memory location of data.

1
2
3
4
5
6
7
START INP     # Waits for input and stores it in the accumulator
      STA NUM # Stores the contents of the accumulator to the memory address of the label: NUM
      INP     # Waits for input and stores it in the accumulator
      ADD NUM # Add the contents of memory address of the label: NUM to the accumulator
      OUT     # Outputs the contents of the accumulator
      HLT     # Signify the end of the program
NUM   DAT 1   # Defines the label: NUM as containing data, and sets it to a preset of 1

Branching

Branching is the process of executing a different sequence of instructions.

Instructions

The following are instructions relevant to branching.

Instruction Description
BRA Branches to the given memory address.
BRZ Branches to the given memory address, if the value in the Accumulator is 0.

Example (improved_calc)

Continuing with the trend of a calculator, let's build a dual-purpose calculator using the skills learnt above.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
START    INP          # Waits for input and stores it in the accumulator
         STA MODE     # Stores the contents of the accumulator into the memory location of the label: MODE

         INP          # Waits for input and stores it in the accumulator
         STA VALUE_O  # Stores the contents of the accumulator into the memory location of the label: VALUE_O
         INP          # Waits for input and stores it in the accumulator
         STA VALUE_T  # Stores the contents of the accumulator into the memory location of the label: VALUE_T

         LDA MODE     # Loads the contents of the memory location of the label: MODE to the accumulator
         BRZ ADDITION # Branches to the memory location of the label: ADDITION is the contents of the accumulator are 0
         BRA SUBTRACT # Branches to the memory location of the label: SUBTRACT

ADDITION LDA VALUE_O  # Loads the contents of the memory location of the label: VALUE_O to the accumulator
         ADD VALUE_T  # Add the contents of memory address of the label: NUM to the accumulator
         BRA END      # Branches to the memory location of the label: END

SUBTRACT LDA VALUE_O  # Loads the contents of the memory location of the label: VALUE_O to the accumulator
         SUB VALUE_T  # Subtract the contents of memory address of the label: NUM to the accumulator
         BRA END      # Branches to the memory location of the label: END

END      OUT          # Outputs the contents of the accumulator
         HLT          # Signify the end of the program

MODE     DAT 1        # Defines the label: MODE as containing data, and sets it to a preset of 1
VALUE_O  DAT 1        # Defines the label: VALUE_O as containing data, and sets it to a preset of 1
VALUE_T  DAT 2        # Defines the label: VALUE_T as containing data, and sets it to a preset of 2

Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Mozilla Public License 2.0.