Guest User

Untitled

a guest
Oct 20th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.62 KB | None | 0 0
  1. ; @file Console.asm
  2. ; @author Andrew D. Zonenberg
  3. ; @brief Implementation of serial console
  4.  
  5. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  6. ; SFR defines
  7.  
  8. ; Serial port SFRs
  9. .define IO_UART 0x00
  10. .define IO_UART_TXBUF 0x00
  11. .define IO_UART_TXBUSY 0x01
  12. .define IO_UART_RXBUF 0x02
  13. .define IO_UART_RXBUSY 0x03
  14. .define IO_UART_RXRDY 0x04
  15.  
  16. ; String table SFRs
  17. .define IO_STRING 0x10
  18. .define IO_STRING_VERSTART 0x00
  19. .define IO_STRING_VEREND 0x7b
  20. .define IO_STRING_CLISTART 0x80
  21. .define IO_STRING_CLIEND 0x87
  22. .define IO_STRING_ERRSTART 0xa0
  23. .define IO_STRING_ERREND 0xb2
  24. .define IO_STRING_BOOTSTART 0xc0
  25. .define IO_STRING_BOOTEND 0xfd
  26.  
  27. ; PWM channel SFRs
  28. .define IO_PWM 0x80
  29. .define IO_PWM_HISTART 0x00
  30. .define IO_PWM_LOSTART 0x20
  31.  
  32. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  33. ; Variable addresses
  34. .define strend 0x00
  35. .define hextemp 0x01
  36. .define wftx_r2 0x02
  37. .define wftx_r3 0x03
  38. .define chnum 0x04
  39. .define dchi 0x05
  40. .define dclo 0x06
  41.  
  42. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  43. ; Program entry point
  44. reset:
  45.  
  46. ; Print version string
  47. li r1, IO_STRING_VERSTART
  48. li r2, IO_STRING_VEREND
  49. call puts
  50.  
  51. ; Print bootup message
  52. li r1, IO_STRING_BOOTSTART
  53. li r2, IO_STRING_BOOTEND
  54. call puts
  55.  
  56. ; Clear all channels to center
  57. li r0, 0x00
  58. bootloop:
  59. li r2, IO_PWM ; r2:r3 = high channel address
  60. li r3, IO_PWM_HISTART
  61. add r3, r0
  62. li r1, 0x02 ; dcycle = 0x02xx
  63. out r1, r2:r3
  64.  
  65. li r3, IO_PWM_LOSTART ; r2:r3 = low channel address
  66. add r3, r0
  67. li r1, 0x00 ; dcycle = 0x0200
  68. out r1, r2:r3
  69.  
  70. addi r0, 1 ; chnum++
  71.  
  72. li r1, 0x21 ; if(chnum == 0x21) break
  73. seq r0, r1
  74. j bootloop
  75.  
  76. ; Enter main command loop and run forever
  77. main_loop:
  78. ; print prompt
  79. li r1, IO_STRING_CLISTART
  80. li r2, IO_STRING_CLIEND
  81. call puts
  82.  
  83. ; get a character
  84. call waitforchar ; wait for a key to be pressed
  85. li r2, IO_UART
  86. li r3, IO_UART_RXBUF
  87. in r0, r2:r3 ; r0 = URXBUF
  88.  
  89. li r3, IO_UART_TXBUF ;echo it
  90. out r0, r2:r3
  91.  
  92. ; switch on the character
  93. li r2, 'v' ; 'v': print version number
  94. sne r0, r2
  95. j main_printversion
  96.  
  97. li r2, 'd' ; 'd': set duty cycle
  98. sne r0, r2
  99. j main_setdcycle
  100.  
  101. ; if we get to this point, input is invalid
  102. ; print error and continue
  103. li r1, IO_STRING_ERRSTART
  104. li r2, IO_STRING_ERREND
  105. call puts
  106. j main_loop
  107.  
  108. ; print version and continue
  109. main_printversion:
  110. li r1, IO_STRING_VERSTART
  111. li r2, IO_STRING_VEREND
  112. call puts
  113. j main_loop
  114.  
  115. ; read duty cycle string and apply it
  116. main_setdcycle:
  117.  
  118. ;Read the message and convert to raw binary
  119. call readhexbyte ; Channel number
  120. subi r3, 1 ; make 1-based
  121. sw r3, chnum
  122. call readhexbyte ; Duty cycle high
  123. sw r3, dchi
  124. call readhexbyte ; Duty cycle low
  125. sw r3, dclo
  126.  
  127. ;Update duty cycle high word
  128. li r0, IO_PWM
  129. lw r1, chnum
  130. addi r1, IO_PWM_HISTART
  131. lw r2, dchi
  132. out r2, r0:r1
  133.  
  134. ;Update duty cycle low word
  135. lw r1, chnum
  136. addi r1, IO_PWM_LOSTART
  137. lw r2, dclo
  138. out r2, r0:r1
  139.  
  140. ;done
  141. j main_loop
  142.  
  143. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  144. ; Waits for a character to arrive on the uart.
  145. ; Busy wait as we havent implemented interrupts yet!
  146. waitforchar:
  147. li r2, IO_UART
  148. li r3, IO_UART_RXRDY
  149. in r2, r2:r3 ; r2 = URXRDY
  150.  
  151. li r0, 1 ; if ready, quit
  152. seq r0, r2
  153. j waitforchar
  154.  
  155. ret
  156.  
  157. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  158. ; Waits for the UART to be free
  159. ; Busy wait as we havent implemented interrupts yet!
  160. waitfortx:
  161. sw r2, wftx_r2
  162. sw r3, wftx_r3
  163.  
  164. li r2, IO_UART
  165. li r3, IO_UART_TXBUSY
  166. in r2, r2:r3 ; r2 = UTXRBUSY
  167.  
  168. li r3, 0 ; if not busy, quit
  169. seq r2, r3
  170. j waitfortx
  171.  
  172. lw r2, wftx_r2
  173. lw r3, wftx_r3
  174.  
  175. ret
  176.  
  177.  
  178. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  179. ; Print a string to the UART
  180. ; Arguments:
  181. ; r1 = starting low-order address of string
  182. ; r2 = ending low-order address of string
  183. puts:
  184. sw r2, strend ; save end of string
  185.  
  186. ;r1 = current string pointer
  187. putsloop:
  188.  
  189. call waitfortx ; Wait until transmitter is free
  190.  
  191. putsprint: ; At this point transmitter is idle and we're ready to send
  192. ; Read the character from the string table
  193.  
  194. li r0, IO_STRING
  195. in r0, r0:r1 ; r0 = stringtable[i]
  196.  
  197. li r2, IO_UART ; send it
  198. li r3, IO_UART_TXBUF
  199. out r0, r2:r3
  200.  
  201. addi r1, 1 ; bump current position
  202.  
  203. lw r2, strend ; if(start == end) break
  204. seq r1, r2
  205. j putsloop
  206.  
  207. ret
  208.  
  209. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  210. ; Reads two hex characters from the UART and returns the byte's value in r3
  211. readhexbyte:
  212.  
  213. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  214. ; high order nibble
  215.  
  216. call waitfortx ; Wait until transmitter is free
  217. call waitforchar ; wait for a key to be pressed
  218. li r2, IO_UART
  219. li r3, IO_UART_RXBUF
  220. in r0, r2:r3
  221. li r3, IO_UART_TXBUF ;echo it
  222. out r0, r2:r3
  223.  
  224. ;ascii-binary conversion
  225. mov r1, r0
  226. andi r1, 0x40 ;zero if a digit, 40 if a letter
  227. li r2, 0x40
  228. sne r1, r2
  229. j hexlet1; ;if a letter, jump
  230. hexdig1:
  231. subi r0, 0x30 ;subtract '0'
  232. j hexdone1
  233. hexlet1:
  234. andi r0, 0xdf ;convert from upper/lower case letter to binary
  235. subi r0, 0x37 ;and fall through to done
  236.  
  237. hexdone1:
  238. add r0, r0 ;double it four times to shift left by a nibble
  239. add r0, r0
  240. add r0, r0
  241. add r0, r0
  242.  
  243. sw r0, hextemp ;save in a temporary variable
  244.  
  245. ;print the raw value
  246. ;call waitfortx
  247. ;li r2, IO_UART
  248. ;li r3, IO_UART_TXBUF
  249. ;out r0, r2:r3
  250.  
  251. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  252. ; low order nibble
  253.  
  254. call waitfortx ; Wait until transmitter is free
  255. call waitforchar ; wait for second char to arrive
  256. li r2, IO_UART
  257. li r3, IO_UART_RXBUF
  258. in r0, r2:r3
  259. li r3, IO_UART_TXBUF ;echo it
  260. out r0, r2:r3
  261.  
  262. ;ascii-binary conversion
  263. mov r1, r0
  264. andi r1, 0x40 ;zero if a digit, 40 if a letter
  265. li r2, 0x40
  266. sne r1, r2
  267. j hexlet2; ;if a letter, jump
  268. hexdig2:
  269. subi r0, 0x30 ;subtract '0'
  270. j hexdone2
  271. hexlet2:
  272. andi r0, 0xdf ;convert from upper/lower case letter to binary
  273. subi r0, 0x37 ;and fall through to done
  274. hexdone2:
  275.  
  276. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  277. ; merge nibbles
  278. lw r3, hextemp
  279. add r3, r0
  280.  
  281. ;print the raw value
  282. ;sw r3, hextemp
  283. ;call waitfortx
  284. ;li r2, IO_UART
  285. ;li r3, IO_UART_TXBUF
  286. ;lw r0, hextemp
  287. ;out r0, r2:r3
  288. ;lw r3, hextemp
  289.  
  290. ret
Add Comment
Please, Sign In to add comment