Files
CE2801-Workspace/lab4lcd/Debug/lab4lcd.list
2019-11-14 20:06:51 -06:00

1089 lines
30 KiB
Plaintext

lab4lcd.elf: file format elf32-littlearm
Sections:
Idx Name Size VMA LMA File off Algn
0 .isr_vector 000001c4 08000000 08000000 00010000 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .text 00000480 080001c4 080001c4 000101c4 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .rodata 00000010 08000644 08000644 00010644 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .ARM.extab 00000000 08000654 08000654 00020004 2**0
CONTENTS
4 .ARM 00000000 08000654 08000654 00020004 2**0
CONTENTS
5 .preinit_array 00000000 08000654 08000654 00020004 2**0
CONTENTS, ALLOC, LOAD, DATA
6 .init_array 00000004 08000654 08000654 00010654 2**2
CONTENTS, ALLOC, LOAD, DATA
7 .fini_array 00000004 08000658 08000658 00010658 2**2
CONTENTS, ALLOC, LOAD, DATA
8 .data 00000004 20000000 0800065c 00020000 2**0
CONTENTS, ALLOC, LOAD, DATA
9 .bss 0000001c 20000004 08000660 00020004 2**2
ALLOC
10 ._user_heap_stack 00000600 20000020 08000660 00020020 2**0
ALLOC
11 .ARM.attributes 00000030 00000000 00000000 00020004 2**0
CONTENTS, READONLY
12 .debug_line 00000269 00000000 00000000 00020034 2**0
CONTENTS, READONLY, DEBUGGING
13 .debug_info 00000094 00000000 00000000 0002029d 2**0
CONTENTS, READONLY, DEBUGGING
14 .debug_abbrev 0000004e 00000000 00000000 00020331 2**0
CONTENTS, READONLY, DEBUGGING
15 .debug_aranges 00000088 00000000 00000000 00020380 2**3
CONTENTS, READONLY, DEBUGGING
16 .debug_str 00000096 00000000 00000000 00020408 2**0
CONTENTS, READONLY, DEBUGGING
17 .debug_ranges 00000020 00000000 00000000 000204a0 2**3
CONTENTS, READONLY, DEBUGGING
18 .debug_frame 0000002c 00000000 00000000 000204c0 2**2
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
080001c4 <__do_global_dtors_aux>:
80001c4: b510 push {r4, lr}
80001c6: 4c05 ldr r4, [pc, #20] ; (80001dc <__do_global_dtors_aux+0x18>)
80001c8: 7823 ldrb r3, [r4, #0]
80001ca: b933 cbnz r3, 80001da <__do_global_dtors_aux+0x16>
80001cc: 4b04 ldr r3, [pc, #16] ; (80001e0 <__do_global_dtors_aux+0x1c>)
80001ce: b113 cbz r3, 80001d6 <__do_global_dtors_aux+0x12>
80001d0: 4804 ldr r0, [pc, #16] ; (80001e4 <__do_global_dtors_aux+0x20>)
80001d2: f3af 8000 nop.w
80001d6: 2301 movs r3, #1
80001d8: 7023 strb r3, [r4, #0]
80001da: bd10 pop {r4, pc}
80001dc: 20000004 .word 0x20000004
80001e0: 00000000 .word 0x00000000
80001e4: 0800062c .word 0x0800062c
080001e8 <frame_dummy>:
80001e8: b508 push {r3, lr}
80001ea: 4b03 ldr r3, [pc, #12] ; (80001f8 <frame_dummy+0x10>)
80001ec: b11b cbz r3, 80001f6 <frame_dummy+0xe>
80001ee: 4903 ldr r1, [pc, #12] ; (80001fc <frame_dummy+0x14>)
80001f0: 4803 ldr r0, [pc, #12] ; (8000200 <frame_dummy+0x18>)
80001f2: f3af 8000 nop.w
80001f6: bd08 pop {r3, pc}
80001f8: 00000000 .word 0x00000000
80001fc: 20000008 .word 0x20000008
8000200: 0800062c .word 0x0800062c
08000204 <delay_ms>:
# A subroutine to create a delay of a certain number of milliseconds
# Input:
# r0: Length of delay (ms)
delay_ms:
push {r1,r2,r3,lr}
8000204: b50e push {r1, r2, r3, lr}
mov r3,r0
8000206: 4603 mov r3, r0
08000208 <ms_delay>:
ms_delay:
# 250 iterations = 1/16 of a millisecond
mov r2, #0x10
8000208: f04f 0210 mov.w r2, #16
# Loop 16 times
1:
# 250
mov r1, #0xFA
800020c: f04f 01fa mov.w r1, #250 ; 0xfa
# Loop 250 times
2:
sub r1, #1
8000210: f1a1 0101 sub.w r1, r1, #1
cmp r1, #0
8000214: 2900 cmp r1, #0
bne 2b
8000216: d1fb bne.n 8000210 <ms_delay+0x8>
sub r2, #1
8000218: f1a2 0201 sub.w r2, r2, #1
cmp r2, #0
800021c: 2a00 cmp r2, #0
bne 1b
800021e: d1f5 bne.n 800020c <ms_delay+0x4>
sub r0, #1
8000220: f1a0 0001 sub.w r0, r0, #1
cmp r0, #0
8000224: 2800 cmp r0, #0
bne ms_delay
8000226: d1ef bne.n 8000208 <ms_delay>
mov r0,r3
8000228: 4618 mov r0, r3
pop {r1,r2,r3,pc}
800022a: bd0e pop {r1, r2, r3, pc}
0800022c <lcd_delay>:
.global lcd_delay
# about r1 mircoseonds
lcd_delay:
# stack
push {lr}
800022c: b500 push {lr}
lsl r1, r1, #3
800022e: ea4f 01c1 mov.w r1, r1, lsl #3
1:
sub r1, r1, #1
8000232: f1a1 0101 sub.w r1, r1, #1
cmp r1, #0
8000236: 2900 cmp r1, #0
bne 1b
8000238: d1fb bne.n 8000232 <lcd_delay+0x6>
# return
pop {pc}
800023a: bd00 pop {pc}
0800023c <PortSetup>:
#Globally exposed functions
.global lcdInit
#Local helper function
PortSetup:
push {r1,r2,r3}
800023c: b40e push {r1, r2, r3}
#Turn on Ports in RCC
ldr r1, =RCC_BASE
800023e: 49bd ldr r1, [pc, #756] ; (8000534 <busy+0x42>)
ldr r2, [r1, #RCC_AHB1ENR]
8000240: 6b0a ldr r2, [r1, #48] ; 0x30
orr r2, r2, #RCC_GPIOAEN
8000242: f042 0201 orr.w r2, r2, #1
str r2, [r1, #RCC_AHB1ENR]
8000246: 630a str r2, [r1, #48] ; 0x30
ldr r2, [r1, #RCC_AHB1ENR]
8000248: 6b0a ldr r2, [r1, #48] ; 0x30
orr r2, r2, #RCC_GPIOCEN
800024a: f042 0204 orr.w r2, r2, #4
str r2, [r1, #RCC_AHB1ENR]
800024e: 630a str r2, [r1, #48] ; 0x30
#Set DB Pins to Outputs
ldr r1, =GPIOA_BASE
8000250: 49b9 ldr r1, [pc, #740] ; (8000538 <busy+0x46>)
ldr r2, [r1, #GPIO_MODER]
8000252: 680a ldr r2, [r1, #0]
movw r3, 0x5500
8000254: f245 5300 movw r3, #21760 ; 0x5500
movt r3, 0x0055
8000258: f2c0 0355 movt r3, #85 ; 0x55
orr r2,r2, r3
800025c: ea42 0203 orr.w r2, r2, r3
movw r3, 0xAA00
8000260: f64a 2300 movw r3, #43520 ; 0xaa00
movt r3, 0x00AA
8000264: f2c0 03aa movt r3, #170 ; 0xaa
bic r2, r2, r3
8000268: ea22 0203 bic.w r2, r2, r3
str r2, [r1, #GPIO_MODER]
800026c: 600a str r2, [r1, #0]
#Set RS RW E Pins to Outputs
ldr r1, =GPIOC_BASE
800026e: 49b3 ldr r1, [pc, #716] ; (800053c <busy+0x4a>)
ldr r2, [r1, #GPIO_MODER]
8000270: 680a ldr r2, [r1, #0]
movw r3, 0x0000
8000272: f240 0300 movw r3, #0
movt r3, 0x0015
8000276: f2c0 0315 movt r3, #21
orr r2,r2, r3
800027a: ea42 0203 orr.w r2, r2, r3
movw r3, 0x0000
800027e: f240 0300 movw r3, #0
movt r3, 0x00EA
8000282: f2c0 03ea movt r3, #234 ; 0xea
bic r2, r2, r3
8000286: ea22 0203 bic.w r2, r2, r3
str r2, [r1, #GPIO_MODER]
800028a: 600a str r2, [r1, #0]
pop {r1,r2,r3}
800028c: bc0e pop {r1, r2, r3}
bx lr
800028e: 4770 bx lr
08000290 <WriteInstruction>:
#Writes instruction
#RS=0 RW=0 R1-Arg
#No returns
WriteInstruction:
push {r2,r3,lr}
8000290: b50c push {r2, r3, lr}
#Set RS=0,RW=0,E=0
ldr r2, =GPIOC_BASE
8000292: 4aaa ldr r2, [pc, #680] ; (800053c <busy+0x4a>)
mov r3, RS_CLR
8000294: f04f 7380 mov.w r3, #16777216 ; 0x1000000
str r3, [r2, #GPIO_BSRR]
8000298: 6193 str r3, [r2, #24]
mov r3, RW_CLR
800029a: f04f 7300 mov.w r3, #33554432 ; 0x2000000
str r3, [r2, #GPIO_BSRR]
800029e: 6193 str r3, [r2, #24]
mov r3, E_CLR
80002a0: f04f 6380 mov.w r3, #67108864 ; 0x4000000
str r3, [r2, #GPIO_BSRR]
80002a4: 6193 str r3, [r2, #24]
#Set E=1
mov r3, E_SET
80002a6: f44f 6380 mov.w r3, #1024 ; 0x400
str r3, [r2, #GPIO_BSRR]
80002aa: 6193 str r3, [r2, #24]
#Set R1 -> DataBus
lsl r1, #4
80002ac: ea4f 1101 mov.w r1, r1, lsl #4
ldr r3, =GPIOA_BASE
80002b0: 4ba1 ldr r3, [pc, #644] ; (8000538 <busy+0x46>)
ldr r2, [r3, #GPIO_ODR]
80002b2: 695a ldr r2, [r3, #20]
bfc r2, #4, #8
80002b4: f36f 120b bfc r2, #4, #8
orr r2, r2, r1
80002b8: ea42 0201 orr.w r2, r2, r1
str r2, [r3, #GPIO_ODR ]
80002bc: 615a str r2, [r3, #20]
#Set E=0
ldr r2, =GPIOC_BASE
80002be: 4a9f ldr r2, [pc, #636] ; (800053c <busy+0x4a>)
mov r3, E_CLR
80002c0: f04f 6380 mov.w r3, #67108864 ; 0x4000000
str r3, [r2, #GPIO_BSRR]
80002c4: 6193 str r3, [r2, #24]
#Wait for appropriate delay
mov r1, #37
80002c6: f04f 0125 mov.w r1, #37 ; 0x25
bl lcd_delay
80002ca: f7ff ffaf bl 800022c <lcd_delay>
pop {r2,r3,pc}
80002ce: bd0c pop {r2, r3, pc}
080002d0 <WriteData>:
#Writes data
#RS=0 RW=0 R1-Arg
#No returns
WriteData:
push {r1,r2,r3,r4,lr}
80002d0: b51e push {r1, r2, r3, r4, lr}
#Set RS=1,RW=0,E=0
ldr r2, =GPIOC_BASE
80002d2: 4a9a ldr r2, [pc, #616] ; (800053c <busy+0x4a>)
mov r3, #RS_SET
80002d4: f44f 7380 mov.w r3, #256 ; 0x100
str r3, [r2, #GPIO_BSRR]
80002d8: 6193 str r3, [r2, #24]
mov r3, #RW_CLR
80002da: f04f 7300 mov.w r3, #33554432 ; 0x2000000
str r3, [r2, #GPIO_BSRR]
80002de: 6193 str r3, [r2, #24]
mov r3, #E_CLR
80002e0: f04f 6380 mov.w r3, #67108864 ; 0x4000000
str r3, [r2, #GPIO_BSRR]
80002e4: 6193 str r3, [r2, #24]
#Set E=1
mov r3, #E_SET
80002e6: f44f 6380 mov.w r3, #1024 ; 0x400
str r3, [r2, #GPIO_BSRR]
80002ea: 6193 str r3, [r2, #24]
#Set R1 -> DataBus
lsl r1, #4
80002ec: ea4f 1101 mov.w r1, r1, lsl #4
ldr r3, =GPIOA_BASE
80002f0: 4b91 ldr r3, [pc, #580] ; (8000538 <busy+0x46>)
ldr r2, [r3, #GPIO_ODR]
80002f2: 695a ldr r2, [r3, #20]
bfc r2, #4, #8
80002f4: f36f 120b bfc r2, #4, #8
orr r2, r2, r1
80002f8: ea42 0201 orr.w r2, r2, r1
str r2, [r3, #GPIO_ODR ]
80002fc: 615a str r2, [r3, #20]
#Set E=0
ldr r2, =GPIOC_BASE
80002fe: 4a8f ldr r2, [pc, #572] ; (800053c <busy+0x4a>)
mov r3, #E_CLR
8000300: f04f 6380 mov.w r3, #67108864 ; 0x4000000
str r3, [r2, #GPIO_BSRR]
8000304: 6193 str r3, [r2, #24]
#Wait for appropriate delay
mov r1, #37
8000306: f04f 0125 mov.w r1, #37 ; 0x25
bl lcd_delay
800030a: f7ff ff8f bl 800022c <lcd_delay>
pop {r1,r2,r3,r4,pc}
800030e: bd1e pop {r1, r2, r3, r4, pc}
08000310 <lcdInit>:
#Code to intialize the lcd
lcdInit:
push {r0,r1,lr}
8000310: b503 push {r0, r1, lr}
#Set up Ports
bl PortSetup
8000312: f7ff ff93 bl 800023c <PortSetup>
#Wait 40ms
mov r0, #40
8000316: f04f 0028 mov.w r0, #40 ; 0x28
bl delay_ms
800031a: f7ff ff73 bl 8000204 <delay_ms>
#Write Function Set (0x38)
mov r1, 0x38
800031e: f04f 0138 mov.w r1, #56 ; 0x38
bl WriteInstruction
8000322: f7ff ffb5 bl 8000290 <WriteInstruction>
mov r1, #37
8000326: f04f 0125 mov.w r1, #37 ; 0x25
bl lcd_delay
800032a: f7ff ff7f bl 800022c <lcd_delay>
#Write Function Set (0x38)
mov r1, 0x38
800032e: f04f 0138 mov.w r1, #56 ; 0x38
bl WriteInstruction
8000332: f7ff ffad bl 8000290 <WriteInstruction>
mov r1, #37
8000336: f04f 0125 mov.w r1, #37 ; 0x25
bl lcd_delay
800033a: f7ff ff77 bl 800022c <lcd_delay>
#Write Display On/Off(0x0F)
mov r1, 0x0F
800033e: f04f 010f mov.w r1, #15
bl WriteInstruction
8000342: f7ff ffa5 bl 8000290 <WriteInstruction>
mov r1, #37
8000346: f04f 0125 mov.w r1, #37 ; 0x25
bl lcd_delay
800034a: f7ff ff6f bl 800022c <lcd_delay>
#Write Display Clear (0x01)
mov r1, 0x01
800034e: f04f 0101 mov.w r1, #1
bl WriteInstruction
8000352: f7ff ff9d bl 8000290 <WriteInstruction>
mov r1, #2
8000356: f04f 0102 mov.w r1, #2
bl delay_ms
800035a: f7ff ff53 bl 8000204 <delay_ms>
#Write Entry Mode Set (0x06)
mov r1, 0x06
800035e: f04f 0106 mov.w r1, #6
bl WriteInstruction
8000362: f7ff ff95 bl 8000290 <WriteInstruction>
mov r1, #37
8000366: f04f 0125 mov.w r1, #37 ; 0x25
bl lcd_delay
800036a: f7ff ff5f bl 800022c <lcd_delay>
pop {r0,r1,pc}
800036e: bd03 pop {r0, r1, pc}
08000370 <lcdClear>:
.global lcdClear
# clears the display
# no arguments or return
# includes necessary delay
lcdClear:
push {r0,lr}
8000370: b501 push {r0, lr}
mov r1, 0x01
8000372: f04f 0101 mov.w r1, #1
bl WriteInstruction
8000376: f7ff ff8b bl 8000290 <WriteInstruction>
# Delay for at least 1.52ms
mov r0, #2
800037a: f04f 0002 mov.w r0, #2
bl delay_ms
800037e: f7ff ff41 bl 8000204 <delay_ms>
pop {r0,pc}
8000382: bd01 pop {r0, pc}
08000384 <lcdHome>:
.global lcdHome
# moves cursor to the home position
# no arguments or return
# includes necessary delay
lcdHome:
push {r1,lr}
8000384: b502 push {r1, lr}
mov r1, #0x02
8000386: f04f 0102 mov.w r1, #2
bl WriteInstruction
800038a: f7ff ff81 bl 8000290 <WriteInstruction>
mov r0, #2
800038e: f04f 0002 mov.w r0, #2
bl delay_ms
8000392: f7ff ff37 bl 8000204 <delay_ms>
pop {r1,pc}
8000396: bd02 pop {r1, pc}
08000398 <lcdSetPosition>:
.global lcdSetPosition
# moves cursor to the position indicated
# r0 is the zero-based row and r1 is the zero-based column, no return value
# includes necessary delay
lcdSetPosition:
push {r0,r1,lr}
8000398: b503 push {r0, r1, lr}
# Sub values to "actual" positions
sub r0, r0, #1
800039a: f1a0 0001 sub.w r0, r0, #1
sub r1, r1, #1
800039e: f1a1 0101 sub.w r1, r1, #1
# Shift row to actual
lsl r0, r0, #6
80003a2: ea4f 1080 mov.w r0, r0, lsl #6
orr r0, r0, r1
80003a6: ea40 0001 orr.w r0, r0, r1
mov r1, #0x80
80003aa: f04f 0180 mov.w r1, #128 ; 0x80
orr r1, r1, r0
80003ae: ea41 0100 orr.w r1, r1, r0
bl WriteInstruction
80003b2: f7ff ff6d bl 8000290 <WriteInstruction>
pop {r0,r1,pc}
80003b6: bd03 pop {r0, r1, pc}
080003b8 <lcdPrintString>:
.global lcdPrintString
# prints a null terminated string to the display
# r0 contains the address of the null terminated string (usually located in .data or .rodata), returns the number of characters written to display in r0
# includes necessary delay
lcdPrintString:
push {r0,r1,r2,r3,lr}
80003b8: b50f push {r0, r1, r2, r3, lr}
mov r2, #0
80003ba: f04f 0200 mov.w r2, #0
080003be <loop>:
loop:
ldrb r1, [r0, r2]
80003be: 5c81 ldrb r1, [r0, r2]
@ push {r0, r1}
@ mov r0, #2
@ mov r1, r2
@ bl lcdSetPosition
@ pop {r0, r1}
cmp r1, #0x00
80003c0: 2900 cmp r1, #0
beq done
80003c2: d004 beq.n 80003ce <done>
bl WriteData
80003c4: f7ff ff84 bl 80002d0 <WriteData>
add r2, r2, #1
80003c8: f102 0201 add.w r2, r2, #1
b loop
80003cc: e7f7 b.n 80003be <loop>
080003ce <done>:
done:
mov r0, r1
80003ce: 4608 mov r0, r1
pop {r0,r1,r2,r3,pc}
80003d0: bd0f pop {r0, r1, r2, r3, pc}
080003d2 <lcdPrintNum>:
.global lcdPrintNum
# prints a (decimal) number to the display
# the number to be printed is in r0, values of 0 to 9999 will print, anything above 9999 should print Err.
# includes necessary delay
lcdPrintNum:
push {r0,r1,r2,r3,r4,lr}
80003d2: b51f push {r0, r1, r2, r3, r4, lr}
bl num_to_ASCII
80003d4: f000 f820 bl 8000418 <num_to_ASCII>
# Store num in memory
ldr r2, =numToPrint
80003d8: 4a59 ldr r2, [pc, #356] ; (8000540 <busy+0x4e>)
str r0, [r2]
80003da: 6010 str r0, [r2, #0]
# Move cursor to right-most position
mov r1, #16
80003dc: f04f 0110 mov.w r1, #16
080003e0 <writeByte>:
writeByte:
mov r0, #2
80003e0: f04f 0002 mov.w r0, #2
bl lcdSetPosition
80003e4: f7ff ffd8 bl 8000398 <lcdSetPosition>
mov r4, r0
80003e8: 4604 mov r4, r0
mov r0, #1
80003ea: f04f 0001 mov.w r0, #1
bl delay_ms
80003ee: f7ff ff09 bl 8000204 <delay_ms>
mov r0, r4
80003f2: 4620 mov r0, r4
mov r0, r1
80003f4: 4608 mov r0, r1
ldrb r1, [r2, r3]
80003f6: 5cd1 ldrb r1, [r2, r3]
bl WriteData
80003f8: f7ff ff6a bl 80002d0 <WriteData>
mov r4, r0
80003fc: 4604 mov r4, r0
mov r0, #1
80003fe: f04f 0001 mov.w r0, #1
bl delay_ms
8000402: f7ff feff bl 8000204 <delay_ms>
mov r0, r4
8000406: 4620 mov r0, r4
add r3, r3, #1
8000408: f103 0301 add.w r3, r3, #1
cmp r3, #4
800040c: 2b04 cmp r3, #4
sub r1, r0, #1
800040e: f1a0 0101 sub.w r1, r0, #1
cmp r3, #4
8000412: 2b04 cmp r3, #4
bne writeByte
8000414: d1e4 bne.n 80003e0 <writeByte>
pop {r0,r1,r2,r3,r4,pc}
8000416: bd1f pop {r0, r1, r2, r3, r4, pc}
08000418 <num_to_ASCII>:
# r0: Input binary value
num_to_ASCII:
# If outside of range, return ASCII "Err."
push {r1,r2,r3,lr}
8000418: b50e push {r1, r2, r3, lr}
cmp r0,#0
800041a: 2800 cmp r0, #0
blt out_of_range
800041c: db4b blt.n 80004b6 <out_of_range>
ldr r1,=9999
800041e: f242 710f movw r1, #9999 ; 0x270f
cmp r0, r1
8000422: 4288 cmp r0, r1
bgt out_of_range
8000424: dc47 bgt.n 80004b6 <out_of_range>
# Normal conversion behavior
mov r1, #16
8000426: f04f 0110 mov.w r1, #16
lsl r0, #3
800042a: ea4f 00c0 mov.w r0, r0, lsl #3
sub r1, #3
800042e: f1a1 0103 sub.w r1, r1, #3
08000432 <shift_cycle>:
shift_cycle:
lsl r0, #1
8000432: ea4f 0040 mov.w r0, r0, lsl #1
sub r1, #1
8000436: f1a1 0101 sub.w r1, r1, #1
cmp r1, #0
800043a: 2900 cmp r1, #0
# Branch to encode section if shifted 16 times
beq encode
800043c: d020 beq.n 8000480 <encode>
# Verify Each Nibble is less than or equal to 4
ubfx r2, r0, #16, #4
800043e: f3c0 4203 ubfx r2, r0, #16, #4
# If value is less than or equal to 4, then skip to next nibble
cmp r2, #4
8000442: 2a04 cmp r2, #4
ble 2f
8000444: dd03 ble.n 800044e <shift_cycle+0x1c>
add r2, #3
8000446: f102 0203 add.w r2, r2, #3
bfi r0, r2, #16, #4
800044a: f362 4013 bfi r0, r2, #16, #4
2: ubfx r2, r0, #20, #4
800044e: f3c0 5203 ubfx r2, r0, #20, #4
# If value is less than or equal to 4, then skip to next nibble
cmp r2, #4
8000452: 2a04 cmp r2, #4
ble 3f
8000454: dd03 ble.n 800045e <shift_cycle+0x2c>
add r2, #3
8000456: f102 0203 add.w r2, r2, #3
bfi r0, r2, #20, #4
800045a: f362 5017 bfi r0, r2, #20, #4
3: ubfx r2, r0, #24, #4
800045e: f3c0 6203 ubfx r2, r0, #24, #4
# If value is less than or equal to 4, then skip to next nibble
cmp r2, #4
8000462: 2a04 cmp r2, #4
ble 4f
8000464: dd03 ble.n 800046e <shift_cycle+0x3c>
add r2, #3
8000466: f102 0203 add.w r2, r2, #3
bfi r0, r2, #24, #4
800046a: f362 601b bfi r0, r2, #24, #4
4: ubfx r2, r0, #28, #4
800046e: f3c0 7203 ubfx r2, r0, #28, #4
# If value is less than or equal to 4 skip to end
cmp r2, #4
8000472: 2a04 cmp r2, #4
ble end_verify_nibbles
8000474: dd03 ble.n 800047e <end_verify_nibbles>
add r2, #3
8000476: f102 0203 add.w r2, r2, #3
bfi r0, r2, #28, #4
800047a: f362 701f bfi r0, r2, #28, #4
0800047e <end_verify_nibbles>:
end_verify_nibbles:
b shift_cycle
800047e: e7d8 b.n 8000432 <shift_cycle>
08000480 <encode>:
encode:
mov r3, #3
8000480: f04f 0303 mov.w r3, #3
# Encode BCD numbers to ASCII
# Extract ones nibble
ubfx r2, r0, #16, #4
8000484: f3c0 4203 ubfx r2, r0, #16, #4
# Insert ones nibble
bfi r1, r2, #0, #4
8000488: f362 0103 bfi r1, r2, #0, #4
# Insert 3 in front of nibble for ASCII encoding
bfi r1, r3, #4, #4
800048c: f363 1107 bfi r1, r3, #4, #4
# Extract tens nibble
ubfx r2, r0, #20, #4
8000490: f3c0 5203 ubfx r2, r0, #20, #4
# Insert tens nibble
bfi r1, r2, #8, #4
8000494: f362 210b bfi r1, r2, #8, #4
# Insert 3 in front of nibble for ASCII encoding
bfi r1, r3, #12, #4
8000498: f363 310f bfi r1, r3, #12, #4
# Extract hundreds nibble
ubfx r2, r0, #24, #4
800049c: f3c0 6203 ubfx r2, r0, #24, #4
# Insert hundreds nibble
bfi r1, r2, #16, #4
80004a0: f362 4113 bfi r1, r2, #16, #4
# Insert 3 in front of nibble for ASCII encoding
bfi r1, r3, #20, #4
80004a4: f363 5117 bfi r1, r3, #20, #4
# Extract thousands nibble
ubfx r2, r0, #28, #4
80004a8: f3c0 7203 ubfx r2, r0, #28, #4
# Insert thousands nibble
bfi r1, r2, #24, #4
80004ac: f362 611b bfi r1, r2, #24, #4
# Insert 3 in front of nibble for ASCII encoding
bfi r1, r3, #28, #4
80004b0: f363 711f bfi r1, r3, #28, #4
b end_ASCII
80004b4: e003 b.n 80004be <end_ASCII>
080004b6 <out_of_range>:
out_of_range:
# Insert ASCII "Err."
movw r1, #0x722E
80004b6: f247 212e movw r1, #29230 ; 0x722e
movt r1, #0x4572
80004ba: f2c4 5172 movt r1, #17778 ; 0x4572
080004be <end_ASCII>:
end_ASCII:
# Return value in r0
mov r0, r1
80004be: 4608 mov r0, r1
pop {r1,r2,r3,pc}
80004c0: bd0e pop {r1, r2, r3, pc}
080004c2 <lcdBusyWait>:
.global lcdBusyWait
# Loops until the busy flag is 0
lcdBusyWait:
push {r0,r1,r2,r3,lr}
80004c2: b50f push {r0, r1, r2, r3, lr}
ldr r1, =GPIOA_BASE
80004c4: 491c ldr r1, [pc, #112] ; (8000538 <busy+0x46>)
ldr r2, [r1, #GPIO_MODER]
80004c6: 680a ldr r2, [r1, #0]
mov r3, #0
80004c8: f04f 0300 mov.w r3, #0
orr r2, r2, r3
80004cc: ea42 0203 orr.w r2, r2, r3
movw r3, 0xFF00
80004d0: f64f 7300 movw r3, #65280 ; 0xff00
movt r3, 0x00FF
80004d4: f2c0 03ff movt r3, #255 ; 0xff
bic r2, r2, r3
80004d8: ea22 0203 bic.w r2, r2, r3
str r2, [r1, #GPIO_MODER]
80004dc: 600a str r2, [r1, #0]
#Set RS=0, RW=1, E=1
ldr r2, =GPIOC_BASE
80004de: 4a17 ldr r2, [pc, #92] ; (800053c <busy+0x4a>)
mov r3, #RS_CLR
80004e0: f04f 7380 mov.w r3, #16777216 ; 0x1000000
str r3, [r2, #GPIO_BSRR]
80004e4: 6193 str r3, [r2, #24]
mov r3, #RW_SET
80004e6: f44f 7300 mov.w r3, #512 ; 0x200
str r3, [r2, #GPIO_BSRR]
80004ea: 6193 str r3, [r2, #24]
mov r3, #E_SET
80004ec: f44f 6380 mov.w r3, #1024 ; 0x400
str r3, [r2, #GPIO_BSRR]
80004f0: 6193 str r3, [r2, #24]
080004f2 <busy>:
busy:
#Set E=
mov r3, #E_SET
80004f2: f44f 6380 mov.w r3, #1024 ; 0x400
str r3, [r2, #GPIO_BSRR]
80004f6: 6193 str r3, [r2, #24]
#Set Databus -> R1
ldr r3, =GPIOA_BASE
80004f8: 4b0f ldr r3, [pc, #60] ; (8000538 <busy+0x46>)
ldr r1, [r3, #GPIO_IDR]
80004fa: 6919 ldr r1, [r3, #16]
#Set E=0
ldr r2, =GPIOC_BASE
80004fc: 4a0f ldr r2, [pc, #60] ; (800053c <busy+0x4a>)
mov r3, #E_CLR
80004fe: f04f 6380 mov.w r3, #67108864 ; 0x4000000
str r3, [r2, #GPIO_BSRR]
8000502: 6193 str r3, [r2, #24]
mov r2, #0x0010
8000504: f04f 0210 mov.w r2, #16
and r1, r2
8000508: ea01 0102 and.w r1, r1, r2
lsr r1, #4
800050c: ea4f 1111 mov.w r1, r1, lsr #4
# Are we still busy?
cmp r1, #1
8000510: 2901 cmp r1, #1
beq busy
8000512: d0ee beq.n 80004f2 <busy>
# Return DB port to original mode
ldr r1, =GPIOA_BASE
8000514: 4908 ldr r1, [pc, #32] ; (8000538 <busy+0x46>)
ldr r2, [r1, #GPIO_MODER]
8000516: 680a ldr r2, [r1, #0]
movw r3, 0x5500
8000518: f245 5300 movw r3, #21760 ; 0x5500
movt r3, 0x0055
800051c: f2c0 0355 movt r3, #85 ; 0x55
orr r2,r2, r3
8000520: ea42 0203 orr.w r2, r2, r3
movw r3, 0xAA00
8000524: f64a 2300 movw r3, #43520 ; 0xaa00
movt r3, 0x00AA
8000528: f2c0 03aa movt r3, #170 ; 0xaa
bic r2, r2, r3
800052c: ea22 0203 bic.w r2, r2, r3
str r2, [r1, #GPIO_MODER]
8000530: 600a str r2, [r1, #0]
pop {r0,r1,r2,r3,pc}
8000532: bd0f pop {r0, r1, r2, r3, pc}
ldr r1, =RCC_BASE
8000534: 40023800 .word 0x40023800
ldr r1, =GPIOA_BASE
8000538: 40020000 .word 0x40020000
ldr r1, =GPIOC_BASE
800053c: 40020800 .word 0x40020800
ldr r2, =numToPrint
8000540: 20000000 .word 0x20000000
08000544 <main>:
.global main
main:
bl lcdInit
8000544: f7ff fee4 bl 8000310 <lcdInit>
08000548 <mainLoop>:
mainLoop:
bl lcdClear
8000548: f7ff ff12 bl 8000370 <lcdClear>
mov r0, #5
800054c: f04f 0005 mov.w r0, #5
bl countDown
8000550: f000 f809 bl 8000566 <countDown>
ldr r0, =msg
8000554: 480d ldr r0, [pc, #52] ; (800058c <done+0x2>)
bl lcdPrintString
8000556: f7ff ff2f bl 80003b8 <lcdPrintString>
mov r0, #5
800055a: f04f 0005 mov.w r0, #5
bl countDown
800055e: f000 f802 bl 8000566 <countDown>
b mainLoop
8000562: e7f1 b.n 8000548 <mainLoop>
08000564 <end>:
end:
b end
8000564: e7fe b.n 8000564 <end>
08000566 <countDown>:
# r0 - value to be counted down from (0-9999)
countDown:
push {r0,r1,lr}
8000566: b503 push {r0, r1, lr}
08000568 <loop>:
loop:
# Print number
bl lcdPrintNum
8000568: f7ff ff33 bl 80003d2 <lcdPrintNum>
mov r1, r0
800056c: 4601 mov r1, r0
mov r0, #1
800056e: f04f 0001 mov.w r0, #1
# Save current value before delay subroutine
bl lcdHome
8000572: f7ff ff07 bl 8000384 <lcdHome>
mov r0, #1000
8000576: f44f 707a mov.w r0, #1000 ; 0x3e8
bl delay_ms
800057a: f7ff fe43 bl 8000204 <delay_ms>
mov r0, r1
800057e: 4608 mov r0, r1
cmp r0, #0
8000580: 2800 cmp r0, #0
beq done
8000582: d002 beq.n 800058a <done>
sub r0, r0, #1
8000584: f1a0 0001 sub.w r0, r0, #1
b loop
8000588: e7ee b.n 8000568 <loop>
0800058a <done>:
done:
pop {r0,r1,pc}
800058a: bd03 pop {r0, r1, pc}
ldr r0, =msg
800058c: 08000644 .word 0x08000644
08000590 <Reset_Handler>:
.section .text.Reset_Handler
.weak Reset_Handler
.type Reset_Handler, %function
Reset_Handler:
ldr r0, =_estack
8000590: 480d ldr r0, [pc, #52] ; (80005c8 <LoopForever+0x2>)
mov sp, r0 /* set stack pointer */
8000592: 4685 mov sp, r0
/* Copy the data segment initializers from flash to SRAM */
ldr r0, =_sdata
8000594: 480d ldr r0, [pc, #52] ; (80005cc <LoopForever+0x6>)
ldr r1, =_edata
8000596: 490e ldr r1, [pc, #56] ; (80005d0 <LoopForever+0xa>)
ldr r2, =_sidata
8000598: 4a0e ldr r2, [pc, #56] ; (80005d4 <LoopForever+0xe>)
movs r3, #0
800059a: 2300 movs r3, #0
b LoopCopyDataInit
800059c: e002 b.n 80005a4 <LoopCopyDataInit>
0800059e <CopyDataInit>:
CopyDataInit:
ldr r4, [r2, r3]
800059e: 58d4 ldr r4, [r2, r3]
str r4, [r0, r3]
80005a0: 50c4 str r4, [r0, r3]
adds r3, r3, #4
80005a2: 3304 adds r3, #4
080005a4 <LoopCopyDataInit>:
LoopCopyDataInit:
adds r4, r0, r3
80005a4: 18c4 adds r4, r0, r3
cmp r4, r1
80005a6: 428c cmp r4, r1
bcc CopyDataInit
80005a8: d3f9 bcc.n 800059e <CopyDataInit>
/* Zero fill the bss segment. */
ldr r2, =_sbss
80005aa: 4a0b ldr r2, [pc, #44] ; (80005d8 <LoopForever+0x12>)
ldr r4, =_ebss
80005ac: 4c0b ldr r4, [pc, #44] ; (80005dc <LoopForever+0x16>)
movs r3, #0
80005ae: 2300 movs r3, #0
b LoopFillZerobss
80005b0: e001 b.n 80005b6 <LoopFillZerobss>
080005b2 <FillZerobss>:
FillZerobss:
str r3, [r2]
80005b2: 6013 str r3, [r2, #0]
adds r2, r2, #4
80005b4: 3204 adds r2, #4
080005b6 <LoopFillZerobss>:
LoopFillZerobss:
cmp r2, r4
80005b6: 42a2 cmp r2, r4
bcc FillZerobss
80005b8: d3fb bcc.n 80005b2 <FillZerobss>
/* Call the clock system intitialization function.*/
bl SystemInit
80005ba: f3af 8000 nop.w
/* Call static constructors */
bl __libc_init_array
80005be: f000 f811 bl 80005e4 <__libc_init_array>
/* Call the application's entry point.*/
bl main
80005c2: f7ff ffbf bl 8000544 <main>
080005c6 <LoopForever>:
LoopForever:
b LoopForever
80005c6: e7fe b.n 80005c6 <LoopForever>
ldr r0, =_estack
80005c8: 20020000 .word 0x20020000
ldr r0, =_sdata
80005cc: 20000000 .word 0x20000000
ldr r1, =_edata
80005d0: 20000004 .word 0x20000004
ldr r2, =_sidata
80005d4: 0800065c .word 0x0800065c
ldr r2, =_sbss
80005d8: 20000004 .word 0x20000004
ldr r4, =_ebss
80005dc: 20000020 .word 0x20000020
080005e0 <ADC_IRQHandler>:
* @retval : None
*/
.section .text.Default_Handler,"ax",%progbits
Default_Handler:
Infinite_Loop:
b Infinite_Loop
80005e0: e7fe b.n 80005e0 <ADC_IRQHandler>
...
080005e4 <__libc_init_array>:
80005e4: b570 push {r4, r5, r6, lr}
80005e6: 4e0d ldr r6, [pc, #52] ; (800061c <__libc_init_array+0x38>)
80005e8: 4c0d ldr r4, [pc, #52] ; (8000620 <__libc_init_array+0x3c>)
80005ea: 1ba4 subs r4, r4, r6
80005ec: 10a4 asrs r4, r4, #2
80005ee: 2500 movs r5, #0
80005f0: 42a5 cmp r5, r4
80005f2: d109 bne.n 8000608 <__libc_init_array+0x24>
80005f4: 4e0b ldr r6, [pc, #44] ; (8000624 <__libc_init_array+0x40>)
80005f6: 4c0c ldr r4, [pc, #48] ; (8000628 <__libc_init_array+0x44>)
80005f8: f000 f818 bl 800062c <_init>
80005fc: 1ba4 subs r4, r4, r6
80005fe: 10a4 asrs r4, r4, #2
8000600: 2500 movs r5, #0
8000602: 42a5 cmp r5, r4
8000604: d105 bne.n 8000612 <__libc_init_array+0x2e>
8000606: bd70 pop {r4, r5, r6, pc}
8000608: f856 3025 ldr.w r3, [r6, r5, lsl #2]
800060c: 4798 blx r3
800060e: 3501 adds r5, #1
8000610: e7ee b.n 80005f0 <__libc_init_array+0xc>
8000612: f856 3025 ldr.w r3, [r6, r5, lsl #2]
8000616: 4798 blx r3
8000618: 3501 adds r5, #1
800061a: e7f2 b.n 8000602 <__libc_init_array+0x1e>
800061c: 08000654 .word 0x08000654
8000620: 08000654 .word 0x08000654
8000624: 08000654 .word 0x08000654
8000628: 08000658 .word 0x08000658
0800062c <_init>:
800062c: b5f8 push {r3, r4, r5, r6, r7, lr}
800062e: bf00 nop
8000630: bcf8 pop {r3, r4, r5, r6, r7}
8000632: bc08 pop {r3}
8000634: 469e mov lr, r3
8000636: 4770 bx lr
08000638 <_fini>:
8000638: b5f8 push {r3, r4, r5, r6, r7, lr}
800063a: bf00 nop
800063c: bcf8 pop {r3, r4, r5, r6, r7}
800063e: bc08 pop {r3}
8000640: 469e mov lr, r3
8000642: 4770 bx lr