Created
August 17, 2016 16:34
-
-
Save ryandhubbard/a2477dea12b68029f98656b4ef7fb9fb to your computer and use it in GitHub Desktop.
arm assembly lock control system
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.equ SEG_A,0x80 | |
.equ SEG_B,0x40 | |
.equ SEG_C,0x20 | |
.equ SEG_D,0x08 | |
.equ SEG_E,0x04 | |
.equ SEG_F,0x02 | |
.equ SEG_G,0x01 | |
.equ SEG_P,0x10 | |
.global _start | |
.text | |
_start: | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
Unlocked: | |
mov r1,#00 | |
bl Display8Segment | |
swi 0x202 | |
cmp r0, #0x01 | |
beq Program | |
cmp r0, #0x02 | |
blt Unlocked | |
@beq ActOnLeftBlack | |
ldr r1, =codeValid | |
ldr r1, [r1] | |
cmp r1, #00 | |
beq Unlocked | |
@bal Unlocked | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
Locked: | |
mov r1, #01 | |
bl Display8Segment | |
bl acceptUnlockCode | |
cmp r0, #00 | |
beq Error | |
bal Unlocked | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
Program: | |
mov r1, #02 | |
bl Display8Segment | |
ldr r3, =codeP | |
ldr r5, =lengthP | |
bl ReceiveCode | |
ldr r1, =codeValid | |
ldr r1, [r1] | |
cmp r1, #00 | |
bne Forget | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
Confirm: | |
mov r1, #03 | |
bl Display8Segment | |
ldr r3, =codeC | |
ldr r5, =lengthC | |
bl ReceiveCode | |
bl setCode | |
cmp r0, #01 | |
beq Accept | |
bal Error | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
Forget: | |
mov r1, #04 | |
bl Display8Segment | |
ldr r3, =codeC | |
ldr r5, =lengthC | |
bl ReceiveCode | |
bl forgetCode | |
cmp r0, #01 | |
beq Accept | |
bal Error | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
Accept: | |
mov r1, #05 | |
bl Display8Segment | |
bl waitProc | |
ldr r0, =codeValid | |
ldr r0, [r0] | |
cmp r0, #00 | |
beq Unlocked | |
bal Locked | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
Error: | |
mov r1, #06 | |
bl Display8Segment | |
bl waitProc | |
ldr r0, =codeValid | |
ldr r0, [r0] | |
cmp r0, #00 | |
beq Unlocked | |
bal Locked | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
setCode: | |
stmfa sp!,{r1-r6,lr} | |
ldr r1, =lengthP | |
ldr r2, =lengthC | |
ldr r1, [r1] | |
ldr r2, [r2] | |
cmp r1, r2 | |
bne exitError | |
ldr r2, =codeP | |
ldr r3, =codeC | |
ldr r6, =codeStored | |
mov r0, #01 | |
compareLoop: | |
ldr r4, [r2], #2 | |
ldr r5, [r3], #2 | |
cmp r4, r5 | |
bne exitError | |
str r4, [r6], #2 | |
subs r1, r1, #01 | |
adds r2, r2, #2 | |
adds r3, r3, #2 | |
adds r6, r6, #2 | |
cmp r1, #00 | |
bne compareLoop | |
ldr r3, =lengthP | |
str r3, =lengthStored | |
mov r0, #1 | |
ldr r2, =codeValid | |
str r0, [r2] | |
bal returnSetCode | |
exitError: | |
mov r0, #00 | |
returnSetCode: | |
ldmfa sp!,{r1-r6,pc} | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
forgetCode: | |
stmfa sp!,{r1-r5,lr} | |
ldr r1, =lengthP | |
ldr r2, =lengthC | |
ldr r1, [r1] | |
ldr r2, [r2] | |
cmp r1, r2 | |
bne exitError | |
ldr r2, =codeP | |
ldr r3, =codeC | |
mov r0, #01 | |
compareLoop2: | |
ldr r4, [r2], #2 | |
ldr r5, [r3], #2 | |
cmp r4, r5 | |
bne exitError2 | |
str r4, [r6], #2 | |
subs r1, r1, #01 | |
adds r2, r2, #2 | |
adds r3, r3, #2 | |
adds r6, r6, #2 | |
cmp r1, #00 | |
bne compareLoop2 | |
mov r0, #00 | |
ldr r2, =codeValid | |
str r0, [r2] | |
mov r0, #01 | |
bal returnForgetCode | |
exitError2: | |
mov r0, #00 | |
returnForgetCode: | |
ldmfa sp!,{r1-r5,pc} | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
waitProc: | |
stmfa sp!,{r0-r2,lr} | |
mov r0, #100 | |
mov r1, #010000 | |
waitLoop1: | |
mov r1, #010000 | |
waitLoop2: | |
subs r1,r1, #01 | |
cmp r1, #00 | |
bne waitLoop2 | |
subs r0, r0, #01 | |
cmp r0,#00 | |
bne waitLoop1 | |
ldmfa sp!,{r0-r2,pc} | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
Display8Segment: | |
stmfa sp!,{r0-r2,lr} | |
ldr r2,=Letters | |
@add r2, r2, r1 | |
ldr r0,[r2,r1,lsl#2] | |
@tst r1,#0x01 @if r1=1, | |
@orrne r0,r0,#SEG_P @then show “P” | |
swi 0x200 | |
ldmfa sp!,{r0-r2,pc} | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
acceptUnlockCode: | |
stmfa sp!,{r1-r6,lr} | |
ldr r3, =codeC | |
ldr r5, =lengthC | |
mov r4, #00 | |
receiveCode2: | |
swi 0x202 | |
cmp r0, #0x02 | |
beq exitReceiveCode2 | |
swi 0x203 | |
cmp r0,#00 | |
beq receiveCode2 | |
mov r1, #0 | |
decodeLooop2: | |
adds r1, r1 ,#01 | |
mov r2, r0 | |
mov r0, r0, lsr#01 | |
and r2, r2, #01 | |
cmp r2, #1 | |
bne decodeLooop2 | |
str r1, [r3], #2 | |
adds r4, r4, #1 | |
adds r3, r3, #2 | |
mov r1, #0 | |
bal receiveCode2 | |
exitReceiveCode2: | |
str r4, [r5], #1 | |
ldr r1, =lengthStored | |
ldr r2, =lengthC | |
ldr r1, [r1] | |
ldr r2, [r2] | |
cmp r1, r2 | |
bne exitError | |
ldr r2, =codeStored | |
ldr r3, =codeC | |
mov r0, #01 | |
compareLoop3: | |
ldr r4, [r2], #2 | |
ldr r5, [r3], #2 | |
cmp r4, r5 | |
bne exitError3 | |
str r4, [r6], #2 | |
subs r1, r1, #01 | |
adds r2, r2, #2 | |
adds r3, r3, #2 | |
adds r6, r6, #2 | |
cmp r1, #00 | |
bne compareLoop3 | |
mov r0, #01 | |
bal returnacceptUnlockCode | |
exitError3: | |
mov r0, #00 | |
returnacceptUnlockCode: | |
ldmfa sp!,{r1-r6,pc} | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
ReceiveCode: | |
stmfa sp!,{r0-r5,lr} | |
mov r4, #00 | |
receiveCode: | |
swi 0x202 | |
cmp r0, #0x01 | |
beq exitReceiveCode | |
swi 0x203 | |
cmp r0,#00 | |
beq receiveCode | |
mov r1, #0 | |
decodeLooop: | |
adds r1, r1 ,#01 | |
mov r2, r0 | |
mov r0, r0, lsr#01 | |
and r2, r2, #01 | |
cmp r2, #1 | |
bne decodeLooop | |
str r1, [r3], #2 | |
adds r4, r4, #1 | |
adds r3, r3, #2 | |
mov r1, #0 | |
bal receiveCode | |
exitReceiveCode: | |
str r4, [r5], #1 | |
ldmfa sp!,{r0-r5,pc} | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
.data | |
.align | |
InFileName: .asciz "input.txt" | |
FileOpenInpErrMsg: .asciz "Failed to open input file \n" | |
EndOfFileMsg: .asciz "End of file reached\n" | |
ColonSpace: .asciz": " | |
NL: .asciz "\n " @ new line | |
Message1: .asciz "Hello World! \n" | |
.align | |
codeValid: .byte 0 | |
.align | |
codeStored: .skip 100 | |
codeP: .skip 100 | |
codeC: .skip 100 | |
.align | |
lengthStored: .skip 1 | |
.align | |
lengthP: .skip 1 | |
.align | |
lengthC: .skip 1 | |
.align | |
InFileHandle: .skip 4 | |
MyArray: .skip 100 * 4 | |
length: .skip 4 | |
Letters: | |
.word SEG_B|SEG_C|SEG_D|SEG_E|SEG_G @U | |
.word SEG_D|SEG_E|SEG_G @L | |
.word SEG_A|SEG_B|SEG_F|SEG_E|SEG_G @P | |
.word SEG_A|SEG_D|SEG_E|SEG_G @C | |
.word SEG_A|SEG_F|SEG_E|SEG_G @F | |
.word SEG_B|SEG_C|SEG_A|SEG_E|SEG_G|SEG_F @A | |
.word SEG_A|SEG_F|SEG_D|SEG_E|SEG_G @E | |
.end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment