Advertisement
Guest User

Untitled

a guest
Feb 18th, 2020
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.92 KB | None | 0 0
  1. AREA RESET, CODE, READONLY
  2. ; IMPORT main
  3.  
  4. ; sample program makes the 4 LEDs P1.16, P1.17, P1.18, P1.19 go on and off in sequence
  5. ; (c) Mike Brady, 2011 -- 2019.
  6.  
  7. ; EXPORT start
  8. start
  9.  
  10. IO1DIR EQU 0xE0028018
  11. IO1SET EQU 0xE0028014
  12. IO1CLR EQU 0xE002801C
  13. IO1PIN EQU 0xE0028010
  14.  
  15. ; main
  16. ; @PARAMETERS: args[]
  17. ; @RETURNS: 0
  18. ;
  19. BL initSerial ; init[serials]
  20.  
  21. while ; while (True) {
  22. BL getKey ; getKey()
  23. BL handleKey ; handleKey(key)
  24. BL displayN ; displayN(n)
  25. B while ; }
  26.  
  27. ; getKey
  28. ; @PARAMETERS: None
  29. ; @RETURNS: R0 -> buttonIndex
  30. ;
  31. getKey
  32. PUSH {R1-R12, LR}
  33.  
  34. MOV R0, #0 ; buttonIndex = 0
  35. LDR R1, =4000000 ; delay = 4000000
  36. LDR R2, =IO1PIN ; init[io1pins]
  37. LDR R3, =0x00F00000 ; maskPins = 0x00F00000
  38.  
  39. gkWhile ; do {
  40. LDR R4, [R2] ; load[pins]
  41. AND R4, R4, R3 ; pins = pins & mask
  42. CMP R4, R3 ; }
  43. BEQ gkWhile ; while (pins == mask)
  44.  
  45. MOV R5, R4 ; pressedButton = pins
  46. gkLongW CMP R5, R4 ; while (pressedButton == pins)
  47. BNE gkPress ; {
  48. CMP R6, R1 ; if (delayCounter != delay)
  49. BEQ gkLong ; {
  50. LDR R4, [R2] ; load[pins]
  51. AND R4, R4, R3 ; pins = pins & mask
  52. ADD R6, R6, #1 ; delayCounter++
  53. B gkLongW ; }
  54.  
  55. gkLong
  56. MOV R0, R5 ; buttonIndex = pins
  57. BL index ; index(button)
  58. RSB R0, R0, #0 ; NEG(buttonIndex)
  59. B gkEnd ; }
  60. gkPress
  61. MOV R0, R5 ; buttonIndex = pins
  62. BL index ; index(button)
  63.  
  64. gkEnd
  65. POP {R1-R12, PC}
  66.  
  67. ; handleKey
  68. ; @PARAMETERS: R0 -> buttonIndex, R1 -> n, R2 -> prevN, R3 -> prevO
  69. ; @RETURNS: None
  70. ;
  71. handleKey
  72. PUSH {R4-R12, LR}
  73.  
  74. CMP R0, #23 ; if (add)
  75. BNE hkSub ; {
  76. BL nAdd ; add()
  77. B hkEnd ; }
  78.  
  79. hkSub CMP R0, #22 ; else if (sub)
  80. BNE hkAddOp ; {
  81. BL nSub ; sub()
  82. B hkEnd ; }
  83.  
  84. hkAddOp CMP R0, #21 ; else if (addOp)
  85. BNE hkSubOp ; {
  86. BL addOp ; addOp()
  87. B hkEnd ; }
  88.  
  89. hkSubOp CMP R0, #20 ; else if (subOp)
  90. BNE hkLastClear ; {
  91. BL subOp ; subOp()
  92. B hkEnd ; }
  93.  
  94. hkLastClear CMP R0, #-21 ; else if (lastClear)
  95. BEQ hkFullClear ; {
  96. BL lastClear ; lastClear()
  97. B hkEnd ; }
  98.  
  99. hkFullClear CMP R0, #-20 ; else
  100. BL fullClear ; { fullClear }
  101.  
  102. hkEnd
  103. MOV R0, #0 ; buttonIndex = 0
  104.  
  105. POP {R4-R12, PC}
  106.  
  107. ; nAdd
  108. ; @PARAMETERS: R1 -> n
  109. ; @RETURNS:
  110. ;
  111. nAdd
  112. PUSH {R0, R2-R12, LR}
  113.  
  114. ADD R1, R1, #1 ; n++
  115.  
  116. POP {R0, R2-R12, PC}
  117.  
  118. ; nSub
  119. ; @PARAMETERS: R1 -> n
  120. ; @RETURNS:
  121. ;
  122. nSub
  123. PUSH {R0, R2-R12, LR}
  124.  
  125. SUB R1, R1, #1 ; n--
  126.  
  127. POP {R0, R2-R12, PC}
  128.  
  129. ; addOp
  130. ; @PARAMETERS: R1 -> n, R2 -> prevN, R3 -> prevO
  131. ; @RETURNS:
  132. ;
  133. addOp
  134. PUSH {R0, R4-R12, LR}
  135.  
  136. ADD R4, R1, R2 ; temp = n + prevN
  137. MOV R3, #1 ; prevO = True
  138. MOV R2, #0 ; prevN = n
  139. MOV R1, R4 ; n = temp
  140.  
  141. POP {R0, R4-R12, PC}
  142.  
  143. ; subOp
  144. ; @PARAMETERS: R1 -> n, R2 -> prevN, R3 -> prevO
  145. ; @RETURNS: None
  146. ;
  147. subOp
  148. PUSH {R0, R4-R12, LR}
  149.  
  150. SUB R4, R1, R2 ; temp = n + prevN
  151. MOV R3, #1 ; prevO = True
  152. MOV R2, R1 ; prevN = n
  153. MOV R1, R4 ; n = temp
  154.  
  155. POP {R0, R4-R12, PC}
  156.  
  157. ; lastClear
  158. ; @PARAMETERS: R2 -> prevN, R3 -> prevO
  159. ; @RETURNS: None
  160. ;
  161. lastClear
  162. PUSH {R0-R1, R4-R12, LR}
  163.  
  164. MOV R2, #0 ; prevN = 0
  165. MOV R3, #0 ; prevO = 0
  166.  
  167. POP {R0-R1, R4-R12, LR}
  168.  
  169. ; fullClear
  170. ; @PARAMETERS: R0 -> buttonIndex, R1 -> n, R2 -> prevN, R3 -> prevO
  171. ; @RETURNS: None
  172. ;
  173. fullClear
  174. PUSH {R4-R12, LR}
  175.  
  176. MOV R0, #0 ; buttonIndex = 0
  177. MOV R1, #0 ; n = 0
  178. MOV R2, #0 ; prevN = 0
  179. MOV R3, #0 ; prevO = 0
  180. BL initSerial ; led(off)
  181.  
  182. POP {R4-R12, PC}
  183.  
  184. ; reverseBits
  185. ; @PARAMETERS: R1 -> n
  186. ; @RETURNS: R12 -> rev
  187. ;
  188. reverseBits
  189. PUSH {R0, R2-R11, LR}
  190.  
  191. MOV R0, #3 ; num_of_bits = 3
  192. AND R2, R1, #0x0000000F ; revN = n & 0x0000000F
  193. MOV R3, #1 ; mask = 1
  194. MOV R4, #0 ; rev = 0
  195.  
  196. rbWhile CMP R2, #0 ; while (n > 0)
  197. BEQ rbEnd ; {
  198. AND R5, R3, R2 ; bit = n & mask
  199. CMP r5, #0 ; if (bit != 0)
  200. BEQ rbElse ; {
  201. ORR R4, R4, R3, LSL R0 ; result |= 1 << num_of_bits
  202. rbElse ; }
  203. MOV r2, r2, lsr #1 ; n >>= 1
  204. SUB r0, r0, #1 ; num_of_bits--
  205. B rbWhile ; }
  206.  
  207. rbEnd
  208. MOV R12, R4 ; reversed = result
  209. POP {R0, R2-R11, PC}
  210.  
  211. ; displayN
  212. ; @PARAMETERS: R1 -> n
  213. ; @RETURNS: None
  214. ;
  215. displayN
  216. PUSH {R0, R2-R12, LR}
  217.  
  218. LDR R2, =IO1CLR ; load(io1clr)
  219. BL reverseBits ; reverseBits(n)
  220. LSL R12, R12, #16 ; on = reversedN << 16
  221. STR R12, [R2] ; led(on)
  222.  
  223. POP {R0, R2-R12, PC}
  224.  
  225. ; index
  226. ; @PARAMETERS: R0 -> pins
  227. ; @RETURNS: R0 -> buttonIndex
  228. ;
  229. index
  230. PUSH {R1-R12, LR}
  231.  
  232. LDR R1, =0x00E00000 ; p1.20
  233. LDR R2, =0x00D00000 ; p1.21
  234. LDR R3, =0x00B00000 ; p1.22
  235. LDR R4, =0x00700000 ; p1.23
  236.  
  237. CMP R0, R1 ; if (pins == p1.20)
  238. BNE iTwo ; {
  239. MOV R0, #20 ; buttonIndex = 20
  240. B iEnd ; }
  241.  
  242. iTwo CMP R0, R2 ; if (pins == p1.21)
  243. BNE iThree ; {
  244. MOV R0, #21 ; buttonIndex = 21
  245. B iEnd ; }
  246.  
  247. iThree CMP R0, R3 ; if (pins == 1.22)
  248. BNE iFour ; {
  249. MOV R0, #22 ; buttonIndex = 22
  250. B iEnd ; }
  251.  
  252. iFour
  253. MOV R0, #23 ; else { buttonIndex = 23 }
  254.  
  255. iEnd
  256. POP {R1-R12, PC}
  257.  
  258. ; initSerial
  259. ; @PARAMETERS: None
  260. ; @RETURNS: None
  261. ;
  262. initSerial
  263. PUSH {R0-R12, LR}
  264.  
  265. LDR R1, =IO1DIR ; load(io1dir)
  266. LDR R2, =0x000f0000 ; select P1.19--P1.16
  267. STR R2, [R1] ; make them outputs
  268. LDR R1, =IO1SET ; load(io1set)
  269. STR R2, [R1] ; set them to turn the LEDs off
  270.  
  271. POP {R0-R12, PC}
  272.  
  273. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement