unixALib.s
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:4k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* unixALib.s - network assembly language routines */
  2. /* Copyright 1984-1992 Wind River Systems, Inc. */
  3. .data
  4. .globl _copyright_wind_river
  5. .long _copyright_wind_river
  6. /*
  7. modification history
  8. --------------------
  9. 01n,26may92,rrr  the tree shuffle
  10. 01m,04oct91,rrr  passed through the ansification filter
  11.   -fixed #else and #endif
  12.   -changed ASMLANGUAGE to _ASMLANGUAGE
  13.   -changed copyright notice
  14. 01l,23apr91,del  made __insque and __remque work w/i960.
  15. 01k,31oct89,hjb  recoded cksum() according to Van Jacobson's algorithm
  16.  described in RFC1071.
  17. 01j,22jun88,dnw  removed unnecessary intLock()s in insque() and remque().
  18.  removed setjmp()/longjmp() to cALib.s.
  19. 01i,13feb87,dnw  changed setjmp and longjmp register lists to be processable
  20.    by Motorola assemblers.
  21.  added .data before copyright.
  22. 01h,13nov87,rdc  added setjmp and longjmp (temporary).
  23. 01g,24oct87,dnw  removed erroneous ';' at end of copyright.
  24. 01f,03apr87,ecs  added copyright.
  25. 01e,02apr87,jlf  removed .globl of tas, left behind after 01d.
  26. 01d,27mar86,rdc  moved tas() to vxALib.s for non-network systems.
  27. 01c,22dec86,dnw  more changes for assembler compatibility:
  28.    changed jeq/jne/jra to beq/bne/bra.
  29.    added .globl declarations of intLock(), intUnlock().
  30. 01b,30nov86,dnw  changed to be acceptable to various assemblers:
  31.    changed ".align 1" to ".even".
  32.    changed "mov" to "move"
  33.    replaced <n>[fb] labels with real labels.
  34. 01a,06aug86,rdc  written
  35. */
  36. #define _ASMLANGUAGE
  37. /* internals */
  38. .globl _cksum
  39. .globl  __insque
  40. .globl  __remque
  41. .text
  42. .align 4
  43. /**************************************************************************
  44. *
  45. * cksum - compute check sum
  46. *
  47. * return 16bit one's complement sum of 'sum' and the 16bit one's
  48. * complement sum of the string 'string' of byte length 'len'.
  49. * Complicated by 'len' or 'sumlen' not being even.
  50. *
  51. * RETURNS  int
  52. *
  53. * int cksum (sum, string, len, sumlen);
  54. */
  55. .align 4
  56. _cksum:
  57. #if FALSE
  58. movl    d2,sp@-
  59. movl    sp@(8),d0    /* sum */
  60. movl    sp@(12),a0 /* addr */
  61. movl    sp@(16),d1 /* len */
  62. btst #0,sp@(20+3) /* previously summed len */
  63. beq ckEvenSum
  64. clrl d2 /* odd number of bytes summed previously */
  65. movb a0@+,d2 /* add the first byte into our sum */
  66. addxl d2,d0 /* before others */
  67. subl #1,d1
  68. ckEvenSum:
  69. movl    d1,d2
  70. movl    d1,d3
  71. andl    #0x3,d3 /* count % 4 */
  72. lsrl    #6,d1 /* count/64 = # loop traversals */
  73. andl    #0x3c,d2 /* Then find fractions of a chunk */
  74. negl    d2
  75. andb    #0xf,cc /* Clear X (extended carry flag) */
  76. jmp     pc@(ckStartLoop-.-2:b,d2)   /* Jump into loop */
  77. ckInLoop:    /* Begin inner loop... */
  78. movl    a0@+,d2 /*  Fetch 32-bit word */
  79. addxl   d2,d0 /*    Add word + previous carry */
  80. movl    a0@+,d2
  81. addxl   d2,d0
  82. movl    a0@+,d2
  83. addxl   d2,d0
  84. movl    a0@+,d2
  85. addxl   d2,d0
  86. movl    a0@+,d2
  87. addxl   d2,d0
  88. movl    a0@+,d2
  89. addxl   d2,d0
  90. movl    a0@+,d2
  91. addxl   d2,d0
  92. movl    a0@+,d2
  93. addxl   d2,d0
  94. movl    a0@+,d2
  95. addxl   d2,d0
  96. movl    a0@+,d2
  97. addxl   d2,d0
  98. movl    a0@+,d2
  99. addxl   d2,d0
  100. movl    a0@+,d2
  101. addxl   d2,d0
  102. movl    a0@+,d2
  103. addxl   d2,d0
  104. movl    a0@+,d2
  105. addxl   d2,d0
  106. movl    a0@+,d2
  107. addxl   d2,d0
  108. movl    a0@+,d2
  109. addxl   d2,d0
  110. ckStartLoop:
  111. dbra    d1,ckInLoop /* dbra doesn't affect X */
  112. btst    #1,d3 /* another word to add? */
  113. bne     ckNextWord
  114. btst    #0,d3 /* another byte to add? */
  115. bne     ckNextByte
  116. bra     ckGetout
  117. ckNextWord:
  118. movw    a0@+,d2
  119. addxw   d2,d0
  120. btst    #0,d3 /* another byte to add? */
  121. beq     ckGetout
  122. ckNextByte:
  123. movw    a0@+,d2
  124. andw    #0xff00,d2
  125. addxw   d2,d0
  126. ckGetout:
  127. movl    d0,d1 /* Fold 32 bit sum to 16 bits */
  128. swap    d1 /* swap doesn't affect X */
  129. addxw   d1,d0
  130. jcc     ckNoCarry
  131. addw    #1,d0
  132. ckNoCarry:
  133. andl    #0xffff,d0
  134. movl    sp@+,d2
  135. rts
  136. #endif /* FALSE */
  137. /****************************************************************************
  138. *
  139. * insque - insert a node into a linked list
  140. *
  141. */
  142. .align 4
  143. __insque:
  144. ld (g1), r3
  145. st r3, (g0)
  146. st g1, 0x04(g0)
  147. st g0, (g1)
  148. st g0, 0x04(r3)
  149. ret
  150. /****************************************************************************
  151. *
  152. * remque - delete a node from a linked list
  153. *
  154. */
  155. .align 4
  156. __remque:
  157. ld (g0), r4
  158. ld 0x04(g0), r3
  159. st r3, 0x04(r4)
  160. st r4, (r3)
  161. ret