document.write('
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. /* rdispatch_send_msg: Sends msgs from PDAEMON processes to HOST
  2. * In: $r10: pid (Process Id)
  3. * $r11: msg_id (Message Id)
  4. * $r12: payload_size (Size of the message payload being sent)
  5. * $r13: start of payload
  6. */
  7. rdispatch_send_msg:
  8.  
  9. push $r1
  10. push $r2
  11. push $r3
  12. push $r4
  13.  
  14. mov b32 $r1 $r10
  15. mov b32 $r2 $r11
  16. mov b32 $r3 $r12
  17.  
  18. movw $r12 #const_rdispatch_size
  19.  
  20. wait_for_size_available_loop:
  21.  
  22. /*while( RING_SIZE - memoryUsed() < payload_size + 3);*/
  23. call #rdispatch_memory_used
  24. sub b32 $r10 $r12 $r10
  25. add b32 $r11 $r3 3
  26. cmpu b32 $r10 $r11
  27. bra l #wait_for_size_available_loop
  28.  
  29. /* $r4 = $r10 = RFIFO_PUT */
  30. IOADDR(`#io_RFIFO_PUT', `$r15')
  31. iord $r4 I[$r15]
  32. mov $r10 $r4
  33.  
  34. /* D[*PUT] = pid; D[*PUT+1] = msg_id; D[*PUT+2] = payload_size; */
  35. st b8 D[$r10] $r1
  36. movw $r11 1
  37. movw $r12 #const_rdispatch_size
  38. call #rdispatch_wrap_around
  39. st b8 D[$r10] $r2
  40. call #rdispatch_wrap_around
  41. st b8 D[$r10] $r3
  42.  
  43. /* $r14 = payload_size */
  44. mov $r14 $r3
  45. call #memcpy_ring
  46.  
  47. cont: /* Inc PUT. *PUT = wrap_around(*PUT, payload_size+3, RING_SIZE); */
  48. add b32 $r11 $r3 3
  49. call #rdispatch_wrap_around
  50. iowrs I[$r15] $r4
  51.  
  52. pop $r4
  53. pop $r3
  54. pop $r2
  55. pop $r1
  56.  
  57. ret
  58.  
  59.  
  60. /* memcpy:
  61. * In: $r10: dst
  62. * $r11: unused
  63. * $r12: ring_size
  64. * $r13: src
  65. * $r14: length
  66. * Out: None
  67. */
  68. memcpy_ring:
  69. /* return when length == 0 */
  70. cmpu b32 $r14 0
  71. bra e #memcpy_ring_exit
  72.  
  73. movw $r11 1
  74. call #rdispatch_wrap_around
  75. /* dst[0] = src[0] */
  76. ld b8 $r15 D[$r13]
  77. st b8 D[$r10] $r15
  78.  
  79. /* inc $r11 then dec $r14 */
  80. add b32 $r11 1
  81. sub b32 $r14 1
  82.  
  83. bra #memcpy_ring
  84.  
  85. memcpy_ring_exit:
  86. ret
  87.  
  88.  
  89. /* rdispatch_wrap_around: calculate the wrap-around for rdispatch
  90. * In: $r10: current position
  91. * $r11: bump increment
  92. * $r12: ring size
  93. * Out: $r10: new position
  94. */
  95. rdispatch_wrap_around:
  96. add b32 $r10 $r10 $r11
  97. mod $r10 $r10 $r12
  98. ret
  99.  
  100.  
  101. /* rdispatch_memory_used: return the number of bytes used by rdispatch
  102. * In: None
  103. * Out: $r10: number of bytes used by rdispatch
  104. */
  105. rdispatch_memory_used:
  106. IOADDR(`#io_RFIFO_PUT', `$r12')
  107. iord $r10 I[$r12]
  108.  
  109. IOADDR(`#io_RFIFO_GET', `$r12')
  110. iord $r11 I[$r12]
  111.  
  112. cmpu b32 $r10 $r11
  113. bra ae #rdispatch_memory_used_put_greater
  114.  
  115. add b32 $r10 $r10 #const_rdispatch_size
  116. movw $r12 #const_rdispatch_size
  117. st b32 D[$r0 + 8] $r12
  118.  
  119. rdispatch_memory_used_put_greater:
  120. sub b32 $r10 $r10 $r11
  121. ret
');