Guest User

Untitled

a guest
Oct 19th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.33 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_BOOTSTART 0x00
  19. .define IO_STRING_BOOTEND 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.  
  25. ; PWM channel SFRs
  26. .define IO_PWM 0x80
  27. .define IO_PWM_HISTART 0x00
  28. .define IO_PWM_LOSTART 0x20
  29.  
  30. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  31. ; Variable defines
  32. .define strend 0x00
  33. .define hextemp 0x01
  34.  
  35. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  36. ; Program entry point
  37. reset:
  38.  
  39. ; Print bootup message
  40. j main_printversion
  41.  
  42. ; Enter main command loop and run forever
  43. main_loop:
  44. ; print prompt
  45. li r1, IO_STRING_CLISTART
  46. li r2, IO_STRING_CLIEND
  47. call puts
  48.  
  49. ; get a character
  50. call waitforchar ; wait for a key to be pressed
  51. li r2, IO_UART
  52. li r3, IO_UART_RXBUF
  53. in r0, r2:r3 ; r0 = URXBUF
  54.  
  55. ; switch on the character
  56. li r2, 'v' ; 'v': print version number
  57. sne r0, r2
  58. j main_printversion
  59.  
  60. li r2, 'd' ; 'd': set duty cycle
  61. sne r0, r2
  62. j main_setdcycle
  63.  
  64. ; if we get to this point, input is invalid
  65. ; print error and continue
  66. li r1, IO_STRING_ERRSTART
  67. li r2, IO_STRING_ERREND
  68. call puts
  69. j main_loop
  70.  
  71. ; print version and continue
  72. main_printversion:
  73. li r1, IO_STRING_BOOTSTART
  74. li r2, IO_STRING_BOOTEND
  75. call puts
  76. j main_loop
  77.  
  78. ; read duty cycle string and apply it
  79. main_setdcycle:
  80.  
  81. ;TODO: write to SFRs
  82. call readhexbyte ; Channel number
  83.  
  84. ; Debug - print the raw value
  85. li r0, IO_UART
  86. li r1, IO_UART_TXBUF
  87. out r3, r0:r1
  88.  
  89. ;call readhexbyte ; Duty cycle high
  90. ;call readhexbyte ; Duty cycle low
  91.  
  92. j main_loop
  93.  
  94. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  95. ; Waits for a character to arrive on the uart.
  96. ; Busy wait as we havent implemented interrupts yet!
  97. waitforchar:
  98. li r2, IO_UART
  99. li r3, IO_UART_RXRDY
  100. in r2, r2:r3 ; r2 = URXRDY
  101.  
  102. li r0, 1 ; if ready, quit
  103. seq r0, r2
  104. j waitforchar
  105.  
  106. ret
  107.  
  108. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  109. ; Print a string to the UART
  110. ; Arguments:
  111. ; r1 = starting low-order address of string
  112. ; r2 = ending low-order address of string
  113. puts:
  114. sw r2, strend ; save end of string
  115.  
  116. ;r1 = current string pointer
  117. putsloop:
  118.  
  119. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  120. ;Wait until transmitter is idle
  121. putsbusyloop:
  122. li r2, IO_UART
  123. li r3, IO_UART_TXBUSY
  124. in r2, r2:r3 ; r2 = UTXBUSY
  125.  
  126. li r3, 0 ; if UTXBUSY = 0, we're done
  127. seq r2, r3
  128. j putsbusyloop
  129. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  130.  
  131. putsprint: ; At this point transmitter is idle and we're ready to send
  132. ; Read the character from the string table
  133.  
  134. li r0, IO_STRING
  135. in r0, r0:r1 ; r0 = stringtable[i]
  136.  
  137. li r2, IO_UART ; send it
  138. li r3, IO_UART_TXBUF
  139. out r0, r2:r3
  140.  
  141. addi r1, 1 ; bump current position
  142.  
  143. lw r2, strend ; if(start == end) break
  144. seq r1, r2
  145. j putsloop
  146.  
  147. ret
  148.  
  149. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  150. ; Reads two hex characters from the UART and returns the byte's value in r3
  151. readhexbyte:
  152.  
  153. hexwait1: ; Wait for the first byte to be typed
  154. li r2, IO_UART
  155. li r3, IO_UART_RXRDY
  156. in r2, r2:r3 ; r2 = URXRDY
  157.  
  158. li r0, 1 ; if ready, quit
  159. seq r0, r2
  160. j hexwait1
  161.  
  162. li r2, IO_UART ; Echo it
  163. li r3, IO_TXBUF
  164. out r0, r2:r3
  165.  
  166. ; Convert '1' to 0x10, etc
  167. ; If it's a digit, convert to the raw value
  168. mov r1, r0
  169. andi r1, 0x40 ;zero if a digit, nonzero if a letter
  170. li r2, 0
  171. seq r1, r2
  172. j hexlet1; ;if a letter, jump
  173. hexdig1:
  174. subi r0, 0x30 ;subtract '0'
  175. j hexdone1
  176.  
  177. hexlet1:
  178. andi r0, 0xdf ;convert from upper/lower case letter to binary
  179. subi r0, 0x36
  180.  
  181. hexdone1:
  182. ; Done with the first digit, but it's in the wrong nibble
  183. ; Multiply it by 16 (2^4)
  184. add r0, r0 ;*2
  185. add r0, r0 ;*4
  186. add r0, r0 ;*8
  187. add r0, r0 ;*16
  188. sw r0, hextemp
  189.  
  190. ; Read the next digit
  191. hexwait2: ; Wait for the byte to be typed
  192. li r2, IO_UART
  193. li r3, IO_UART_RXRDY
  194. in r2, r2:r3 ; r2 = URXRDY
  195.  
  196. li r0, 1 ; if ready, quit
  197. seq r0, r2
  198. j hexwait2
  199.  
  200. li r2, IO_UART ; Echo it
  201. li r3, IO_TXBUF
  202. out r0, r2:r3
  203.  
  204. ; Convert '1' to 0x1, etc
  205. ; If it's a digit, convert to the raw value
  206. mov r1, r0
  207. andi r1, 0x40 ;zero if a digit, nonzero if a letter
  208. li r2, 0
  209. seq r1, r2
  210. j hexlet2; ;if a letter, jump
  211. hexdig2:
  212. subi r0, 0x30 ;subtract '0'
  213. j hexdone2
  214.  
  215. hexlet2:
  216. andi r0, 0xdf ;convert from upper/lower case letter to binary
  217. subi r0, 0x36
  218.  
  219. hexdone2:
  220. ; Low order digit is in r0, high is in hextemp
  221. lw r3, hextemp
  222. add r3, r0
  223.  
  224. ret
Add Comment
Please, Sign In to add comment