146 lines
3.0 KiB
ArmAsm
146 lines
3.0 KiB
ArmAsm
# main.s
|
|
# Trevor Barnes
|
|
# CE2801-031
|
|
# Lab 3: Subroutines
|
|
# Description: The driver for Lab 3. Displays the binary ASCII
|
|
# value of the hardcoded number "1234", one character
|
|
# at a time every half second.
|
|
|
|
.syntax unified
|
|
.cpu cortex-m4
|
|
.thumb
|
|
.section .text
|
|
|
|
.global main
|
|
|
|
main:
|
|
mov r0, #0
|
|
mov r1, #0
|
|
mov r2, #0
|
|
|
|
main_loop:
|
|
|
|
mov r0, #1234
|
|
bl num_to_ASCII
|
|
mov r1, r0
|
|
# r1 is a 4 character ASCII value
|
|
mov r0, #500
|
|
# Display 1
|
|
ubfx r0, r1, #24, #8
|
|
bl num_to_LED
|
|
mov r0, #500
|
|
bl delay_ms
|
|
# Display 2
|
|
ubfx r0, r1, #16, #8
|
|
bl num_to_LED
|
|
mov r0, #500
|
|
bl delay_ms
|
|
# Display 3
|
|
ubfx r0, r1, #8, #8
|
|
bl num_to_LED
|
|
mov r0, #500
|
|
bl delay_ms
|
|
# Display 4
|
|
ubfx r0, r1, #0, #8
|
|
bl num_to_LED
|
|
mov r0, #500
|
|
bl delay_ms
|
|
b main_loop
|
|
|
|
.global num_to_ASCII
|
|
# Takes in a value from 0-9999 and converts it to ASCII
|
|
# Input:
|
|
# r0: Input binary value
|
|
# Output:
|
|
# r1: Output 4 ASCII characters
|
|
num_to_ASCII:
|
|
|
|
# If outside of range, return ASCII "Err."
|
|
push {r1,r2,r3,lr}
|
|
|
|
cmp r0,#0
|
|
blt out_of_range
|
|
# cmp r0,#9999
|
|
# bgt out_of_range
|
|
|
|
# Normal conversion behavior
|
|
mov r1, #16
|
|
lsl r0, #3
|
|
sub r1, #3
|
|
shift_cycle:
|
|
|
|
lsl r0, #1
|
|
sub r1, #1
|
|
|
|
# Verify Each Nibble is less than or equal to 4
|
|
ubfx r2, r0, #16, #4
|
|
# If value is less than or equal to 4, then skip to next nibble
|
|
cmp r2, #4
|
|
ble 2f
|
|
add r2, #3
|
|
bfi r0, r2, #16, #4
|
|
2: ubfx r2, r0, #20, #4
|
|
# If value is less than or equal to 4, then skip to next nibble
|
|
cmp r2, #4
|
|
ble 3f
|
|
add r2, #3
|
|
bfi r0, r2, #20, #4
|
|
3: ubfx r2, r0, #24, #4
|
|
# If value is less than or equal to 4, then skip to next nibble
|
|
cmp r2, #4
|
|
ble 4f
|
|
add r2, #3
|
|
bfi r0, r2, #24, #4
|
|
4: ubfx r2, r0, #28, #4
|
|
# If value is less than or equal to 4 skip to end
|
|
cmp r2, #4
|
|
ble end_verify_nibbles
|
|
add r2, #3
|
|
bfi r0, r2, #28, #4
|
|
end_verify_nibbles:
|
|
|
|
# If value hasn't been shifted 16 times, shift again
|
|
cmp r1, #0
|
|
bne shift_cycle
|
|
mov r3, #3
|
|
# Encode BCD numbers to ASCII
|
|
# Extract ones nibble
|
|
ubfx r2, r0, #16, #4
|
|
# Insert ones nibble
|
|
bfi r1, r2, #0, #4
|
|
# Insert 3 in front of nibble for ASCII encoding
|
|
bfi r1, r3, #4, #4
|
|
|
|
# Extract tens nibble
|
|
ubfx r2, r0, #20, #4
|
|
# Insert tens nibble
|
|
bfi r1, r2, #8, #4
|
|
# Insert 3 in front of nibble for ASCII encoding
|
|
bfi r1, r3, #12, #4
|
|
|
|
# Extract hundreds nibble
|
|
ubfx r2, r0, #24, #4
|
|
# Insert hundreds nibble
|
|
bfi r1, r2, #16, #4
|
|
# Insert 3 in front of nibble for ASCII encoding
|
|
bfi r1, r3, #20, #4
|
|
|
|
# Extract thousands nibble
|
|
ubfx r2, r0, #28, #4
|
|
# Insert thousands nibble
|
|
bfi r1, r2, #24, #4
|
|
# Insert 3 in front of nibble for ASCII encoding
|
|
bfi r1, r3, #28, #4
|
|
|
|
b end_ASCII
|
|
out_of_range:
|
|
# Insert ASCII "Err."
|
|
movw r1, #0x722E
|
|
movt r1, #0x4572
|
|
|
|
end_ASCII:
|
|
# Return value in r0
|
|
mov r0, r1
|
|
pop {r1,r2,r3,lr}
|
|
bx lr
|