Write an LMC program to let the user enter a PIN code to deactivate a burglar alarm.
The program should let the user have up to 3 attempts to enter the correct PIN code before starting the alarm.
The correct PIN code is “123”.
If the user gets the right PIN code the program should output value 1.
If the user gets the wrong PIN code the program should output value 9 indicating that they can have another go at entering the PIN code.
If after three attempts the PIN code entered is still incorrect, the program should output value -1.
LMC Simulators
Solution
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
START INP SUB PINCODE BRZ DEACTIVATE LDA WRONGCODE OUT LDA COUNTER SUB ONE STA COUNTER BRP START BRA ALARM HLT DEACTIVATE LDA TRUE OUT HLT ALARM LDA FALSE OUT HLT ONE DAT 1 COUNTER DAT 2 PINCODE DAT 123 TRUE DAT 1 FALSE DAT -1 WRONGCODE DAT 9 |
Your Task
You can now type/copy and test the above assembly code using one of the following online LMC Simulators:
Test your code and answer the following questions:
- What code is used to find out if the user did input the right PIN number?
- What is the purpose of the Counter label?
- How does the computer know if the user has used all 3 attempts?
LMC Instruction Set
Note that in the following table “xx” refers to a memory address (aka mailbox) in the RAM. The online LMC simulator has 100 different mailboxes in the RAM ranging from 00 to 99.
Mnemonic | Name | Description | Op Code |
INP | INPUT | Retrieve user input and stores it in the accumulator. | 901 |
OUT | OUTPUT | Output the value stored in the accumulator. | 902 |
LDA | LOAD | Load the Accumulator with the contents of the memory address given. | 5xx |
STA | STORE | Store the value in the Accumulator in the memory address given. | 3xx |
ADD | ADD | Add the contents of the memory address to the Accumulator | 1xx |
SUB | SUBTRACT | Subtract the contents of the memory address from the Accumulator | 2xx |
BRP | BRANCH IF POSITIVE | Branch/Jump to the address given if the Accumulator is zero or positive. | 8xx |
BRZ | BRANCH IF ZERO | Branch/Jump to the address given if the Accumulator is zero. | 7xx |
BRA | BRANCH ALWAYS | Branch/Jump to the address given. | 6xx |
HLT | HALT | Stop the code | 000 |
DAT | DATA LOCATION | Used to associate a label to a free memory address. An optional value can also be used to be stored at the memory address. |