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

VxWorks

开发平台:

C/C++

  1. /* unixALib.s - network assembly language routines */
  2. /* Copyright 1984-1994 Wind River Systems, Inc. */
  3. .data
  4. .globl _copyright_wind_river
  5. .long _copyright_wind_river
  6. /*
  7. modification history
  8. --------------------
  9. 01v,31oct94,tmk  added MC68LC040 support
  10. 01u,30may94,tpr  added MC68060 cpu support.
  11. 01t,23aug92,jcf  changed bxxx to jxx.
  12. 01s,26may92,rrr  the tree shuffle
  13. 01r,04oct91,rrr  passed through the ansification filter
  14.   -fixed #else and #endif
  15.   -changed ASMLANGUAGE to _ASMLANGUAGE
  16.   -changed copyright notice
  17. 01q,25sep91,yao  added support for CPU32.
  18. 01p,19jun91,elh  changed jcc to jcc  to be more portable.
  19. 01o,29jan91,elh  fixed cksum to clear extended carry for odd previous sum.
  20. 01n,01oct90,dab  changed conditional compilation identifier from
  21.     HOST_SUN to AS_WORKS_WELL.
  22. 01m,12sep90,dab  changed jmp instruction in _cksum() to .word to make
  23.    +lpf    non-SUN hosts happy.
  24. 01l,14jul90,jcf  fixed cksum from clobbering non-volatile d3
  25. 01k,31oct89,hjb  recoded cksum() according to Van Jacobson's algorithm
  26.  described in RFC1071.
  27. 01j,22jun88,dnw  removed unnecessary intLock()s in insque() and remque().
  28.  removed setjmp()/longjmp() to cALib.s.
  29. 01i,13feb87,dnw  changed setjmp and longjmp register lists to be processable
  30.    by Motorola assemblers.
  31.  added .data before copyright.
  32. 01h,13nov87,rdc  added setjmp and longjmp (temporary).
  33. 01g,24oct87,dnw  removed erroneous ';' at end of copyright.
  34. 01f,03apr87,ecs  added copyright.
  35. 01e,02apr87,jlf  removed .globl of tas, left behind after 01d.
  36. 01d,27mar86,rdc  moved tas() to vxALib.s for non-network systems.
  37. 01c,22dec86,dnw  more changes for assembler compatibility:
  38.    changed jeq/jne/jra to beq/bne/bra.
  39.    added .globl declarations of intLock(), intUnlock().
  40. 01b,30nov86,dnw  changed to be acceptable to various assemblers:
  41.    changed ".align 1" to ".even".
  42.    changed "mov" to "move"
  43.    replaced <n>[fb] labels with real labels.
  44. 01a,06aug86,rdc  written
  45. */
  46. /* optimized version available for 68020, 68040 and 68060 */
  47. #if (defined(PORTABLE) || (CPU!=MC68020) && (CPU!=MC68040) && 
  48.      (CPU!=MC68060) && (CPU!=MC68LC040))
  49.     
  50. #define unixALib_PORTABLE
  51. #endif
  52. #ifndef unixALib_PORTABLE
  53. #define _ASMLANGUAGE
  54. /* internals */
  55. .globl _cksum
  56. .globl  __insque
  57. .globl  __remque
  58. .text
  59. .even
  60. /**************************************************************************
  61. *
  62. * cksum - compute check sum
  63. *
  64. * return 16bit one's complement sum of 'sum' and the 16bit one's
  65. * complement sum of the string 'string' of byte length 'len'.
  66. * Complicated by 'len' or 'sumlen' not being even.
  67. *
  68. * RETURNS  int
  69. *
  70. * int cksum (sum, string, len, sumlen);
  71. */
  72. _cksum:
  73. movl    d2,sp@-
  74. movl    d3,sp@-
  75. movl    sp@(12),d0    /* sum */
  76. movl    sp@(16),a0 /* addr */
  77. movl    sp@(20),d1 /* len */
  78. btst #0,sp@(24+3) /* previously summed len */
  79. jeq ckEvenSum
  80. clrl d2 /* odd number of bytes summed previously */
  81. andb    #0xf,cc /* Clear X (extended carry flag) */
  82. movb a0@+,d2 /* add the first byte into our sum */
  83. addxl d2,d0 /* before others */
  84. subl #1,d1
  85. ckEvenSum:
  86. movl    d1,d2
  87. movl    d1,d3
  88. andl    #0x3,d3 /* count % 4 */
  89. lsrl    #6,d1 /* count/64 = # loop traversals */
  90. andl    #0x3c,d2 /* Then find fractions of a chunk */
  91. negl    d2
  92. andb    #0xf,cc /* Clear X (extended carry flag) */
  93. /* The jump instruction contained in the following conditional
  94.  * compilation executes a relative jump to one of the instructions
  95.  * between the labels ckInLoop and ckStartLoop based on the number
  96.  * of instructions between the labels.  Since the .word hardcodes
  97.  * this difference for non-SUN hosts, any change to the number or
  98.  * nature of instructions between the labels must be reflected
  99.  * in a recalculation of the binary values defined by the .word.
  100.  */
  101. #if defined(AS_WORKS_WELL)
  102. jmp     pc@(ckStartLoop-.-2:b,d2)   /* Jump into loop */
  103. #else
  104. .word   0x4efb,0x2842     /* Jump into loop */
  105. #endif /* AS_WORKS_WELL */
  106. ckInLoop:    /* Begin inner loop... */
  107. movl    a0@+,d2 /*  Fetch 32-bit word */
  108. addxl   d2,d0 /*    Add word + previous carry */
  109. movl    a0@+,d2
  110. addxl   d2,d0
  111. movl    a0@+,d2
  112. addxl   d2,d0
  113. movl    a0@+,d2
  114. addxl   d2,d0
  115. movl    a0@+,d2
  116. addxl   d2,d0
  117. movl    a0@+,d2
  118. addxl   d2,d0
  119. movl    a0@+,d2
  120. addxl   d2,d0
  121. movl    a0@+,d2
  122. addxl   d2,d0
  123. movl    a0@+,d2
  124. addxl   d2,d0
  125. movl    a0@+,d2
  126. addxl   d2,d0
  127. movl    a0@+,d2
  128. addxl   d2,d0
  129. movl    a0@+,d2
  130. addxl   d2,d0
  131. movl    a0@+,d2
  132. addxl   d2,d0
  133. movl    a0@+,d2
  134. addxl   d2,d0
  135. movl    a0@+,d2
  136. addxl   d2,d0
  137. movl    a0@+,d2
  138. addxl   d2,d0
  139. ckStartLoop:
  140. dbra    d1,ckInLoop /* dbra doesn't affect X */
  141. btst    #1,d3 /* another word to add? */
  142. jne     ckNextWord
  143. btst    #0,d3 /* another byte to add? */
  144. jne     ckNextByte
  145. jra     ckGetout
  146. ckNextWord:
  147. movw    a0@+,d2
  148. addxw   d2,d0
  149. btst    #0,d3 /* another byte to add? */
  150. jeq     ckGetout
  151. ckNextByte:
  152. movw    a0@+,d2
  153. andw    #0xff00,d2
  154. addxw   d2,d0
  155. ckGetout:
  156. movl    d0,d1 /* Fold 32 bit sum to 16 bits */
  157. swap    d1 /* swap doesn't affect X */
  158. addxw   d1,d0
  159. jcc     ckNoCarry
  160. addw    #1,d0
  161. ckNoCarry:
  162. andl    #0xffff,d0
  163. movl    sp@+,d3
  164. movl    sp@+,d2
  165. rts
  166. /****************************************************************************
  167. *
  168. * insque - insert a node into a linked list
  169. *
  170. */
  171. __insque:
  172. movel sp@(4),a0 /* new */
  173. movel sp@(8),a1 /* pred */
  174. movel a1@,d0 /* succ */
  175. movel d0,a0@
  176. movel a1,a0@(4)
  177. movel a0,a1@
  178. movel d0,a1
  179. movel a0,a1@(4)
  180. rts
  181. /****************************************************************************
  182. *
  183. * remque - delete a node from a linked list
  184. *
  185. */
  186. __remque:
  187. movel d0,d1
  188. movel sp@(4),a0
  189. movel a0@,a1
  190. movel a0@(4),d0
  191. movel d0,a1@(4)
  192. exg d0,a0
  193. movel a1,a0@
  194. rts
  195. #endif /* !unixALib_PORTABLE */