Advertisement
Guest User

Untitled

a guest
May 3rd, 2018
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.    
  2.     .equ    RED_LED, 0x10000000    # Base address for red LEDs
  3.     .equ    NUM_RED_LED, 18        # Number of red LEDs
  4.  
  5.     .text
  6.     .global _start
  7.  
  8. _start:
  9.     # Move base address of red LEDs to r16
  10.     movia r16, RED_LED
  11.     # Move number of red LEDs to r17
  12.     movia r17, NUM_RED_LED
  13.     # Set lowest bit in r18 to signify first red LED
  14.     movi r18, 0b1
  15.        
  16. loop:
  17.     # Branch to _start if r17 is equal to zero
  18.     beq r17, r0, _start
  19.     # Store the value in r18 to base address
  20.     # of red LEDs (to light the corresponding
  21.     # red LED)
  22.     stwio r18, 0(r16)
  23.     # Load 100 into register r4 (for 100 ms)
  24.     movi r4, 10000
  25.     # Call paus_ms
  26.     call paus_ms    
  27.     # Shift register r18 to light to next
  28.     # red LED
  29.     slli r18, r18, 1
  30.     # Decrement the number of remaining red
  31.     # LEDs (this value is in register r17)
  32.     subi r17, r17, 1
  33.     # Branch to loop
  34.     br loop
  35. loop_end:
  36.     br      end
  37.    
  38.    
  39.    
  40. ########################################################################
  41. # paus (r4)                                                            #
  42. # Pauses the program for some number of iterations.                    #
  43. # r4: Number of iterations                                             #
  44. ########################################################################
  45. paus:
  46.     beq     r0, r4, end_paus
  47.     subi    r4, r4, 0x1
  48.     br      paus
  49. end_paus:
  50.     ret
  51.  
  52.    
  53.        
  54. ########################################################################
  55. # paus_ms (r4)                                                         #
  56. # Pauses the program for some number of milliseconds.                  #
  57. # r4: Number of milliseconds                                           #
  58. ########################################################################
  59. paus_ms:
  60.     # Convert milliseconds to 50 MHz ticks. If the number of
  61.     # milliseconds are too big to fit within the limits of the
  62.     # 32 bits available, then the timer must be repeated an
  63.     # appropriate number of times.
  64.  
  65.     # Calculate milliseconds available
  66.     nor     r8, r0, r0  # Set all bits in r8 to 1
  67.     movui   r9, 0xC350  # Set r9 to 50 * 10^3
  68.     divu    r8, r8, r9
  69.  
  70.     # Calculate the required number of timer loops
  71.     divu    r8, r4, r8
  72.     addi    r8, r8, 0x1  # r8 now contains the number of timer runs
  73.  
  74.     # Milliseconds per run
  75.     divu    r9, r4, r8  # r9 now contains the number of milliseconds required per timer run
  76.  
  77.     # Calculate timer ticks
  78.     movui   r11, 0xC350
  79.     mul     r9, r9, r11
  80.  
  81.     # Set timer low bits
  82.     movia   r10, 0x10002000  # Address of timer
  83.     sthio   r9, 8(r10)       # Store lower values
  84.     # Set timer high bits
  85.     roli    r9, r9, 0x10
  86.     sthio   r9, 12(r10)
  87.     roli    r9, r9, 0x10  # Reset timer value
  88.  
  89.     # Set control register and start timer
  90.     movui   r9, 0b110
  91.     sthio   r9, 4(r10)
  92.  
  93. paus_timer_loop:
  94.     beq     r0, r8, end_paus_ms  # End if r8 is zero
  95.  
  96.     # Reset TO bit
  97.     ldhio   r9, 0(r10)
  98.     andi    r9, r9, 0xFFFE
  99.     sthio   r9, 0(r10)  # Set the TO bit to 0
  100.  
  101. paus_poll_to_loop:  
  102.     ldhio   r9, 0(r10)
  103.     andi    r9, r9, 0b1
  104.     beq     r0, r9, paus_poll_to_loop
  105.     subi    r8, r8, 0x1
  106.     br      paus_timer_loop
  107.        
  108. end_paus_ms:
  109.     ret
  110.        
  111. end:        
  112.     .end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement