home *** CD-ROM | disk | FTP | other *** search
/ Amiga Developer CD 2.1 / Amiga Developer CD v2.1.iso / Reference / DevCon / Washington_1988 / DevCon88.1 / AmigaTechniques / strings.asm < prev   
Encoding:
Assembly Source File  |  1992-08-27  |  4.0 KB  |  219 lines

  1. ******* Startup/Strings **********************************************
  2. *
  3. *   Copyright 1986, Robert R. Burns
  4. *
  5. *   Executables based on this information may be used in software
  6. *   for Commodore Amiga computers.
  7. *
  8. **********************************************************************
  9.  
  10.  
  11.     SECTION    startup,CODE
  12.  
  13.     XDEF    StrLen
  14.     XDEF    StrCopy
  15.     XDEF    StrCmp
  16.     XDEF    StrNCCmp
  17.     XDEF    StrToNum
  18.     XDEF    StrB2C
  19.  
  20.     XDEF    _StrLen
  21.     XDEF    _StrCopy
  22.     XDEF    _StrCmp
  23.     XDEF    _StrNCCmp
  24.     XDEF    _StrToNum
  25.     XDEF    _StrB2C
  26.  
  27. ******* StrLen *******************************************************
  28. _StrLen:
  29.         move.l    4(a7),a0
  30.  
  31. StrLen:
  32.         moveq    #-1,d0
  33. 1$:
  34.         addq.l    #1,d0
  35.         tst.b    (a0)+
  36.         bne.s    1$
  37.         rts
  38.  
  39. ******* StrCopy ******************************************************
  40. _StrCopy:
  41.         movem.l    4(a7),a0/a1
  42.  
  43. StrCopy:
  44.         move.b    (a0)+,(a1)+
  45.         bne.s    StrCopy
  46.  
  47.         rts
  48.  
  49. ******* StrCmp *******************************************************
  50. _StrCmp:
  51.         movem.l    4(a7),a0/a1
  52.  
  53. StrCmp:
  54.         move.b    (a1)+,d0
  55.         beq.s    1$        ; second string is done
  56.         cmp.b    (a0)+,d0
  57.         beq.s    StrCmp        ; still equal
  58.         bgt.s    2$        ; second string is greater
  59. 3$:
  60.         moveq    #1,d0        ; first string is greater
  61.         rts
  62. 1$:
  63.         tst.b    (a0)        ; is first string done?
  64.         bne.s    3$        ; first string is greater
  65.         moveq    #0,d0        ; strings are equal
  66.         rts
  67. 2$:
  68.         moveq    #-1,d0        ; second string is greater
  69.         rts
  70. ******* StrNCCmp *****************************************************
  71. _StrNCCmp:
  72.         movem.l    4(a7),a0/a1
  73.  
  74. StrNCCmp:
  75.         movem.l    d2/d3,-(a7)
  76.         clr    d0
  77. snccStillEqual:
  78.         move.b    (a1)+,d0
  79.         beq.s    1$        ; second string is done
  80.         bsr.s    deCase
  81.         move.b    d0,d1        ; save decased byte
  82.         move.b    (a0)+,d0
  83.         bsr.s    deCase
  84.         cmp.b    d0,d1
  85.         beq.s    snccStillEqual    ; still equal
  86.         bgt.s    2$        ; second string is greater
  87. 3$:
  88.         moveq    #1,d0        ; first string is greater
  89.         bra.s    snccRts
  90. 1$:
  91.         tst.b    (a0)        ; is first string done?
  92.         bne.s    3$        ; first string is greater
  93.         moveq    #0,d0        ; strings are equal
  94.         bra.s    snccRts
  95. 2$:
  96.         moveq    #-1,d0        ; second string is greater
  97. snccRts:
  98.         movem.l    (a7)+,d2/d3
  99.         rts
  100.  
  101. deCase:
  102.         move.w    d0,d2
  103.         and.w    #7,d2
  104.         move.w    d0,d3
  105.         lsr.w    #3,d3
  106.         btst    d2,caseList(pc,d3.w)
  107.         beq.s    noLC
  108.         and.b    #$df,d0        ; convert to upper case
  109. noLC:
  110.         rts
  111.  
  112. caseList:    dc.b    0,0,0,0,0,0,0,0
  113.         dc.b    %11111110,%11111111,%11111111,%00000111
  114.         dc.b    %11111110,%11111111,%11111111,%00000111
  115.         dc.b    0,0,0,0,0,0,0,0
  116.         dc.b    %11111111,%11111111,%11111110,%11111110
  117.         dc.b    %11111111,%11111111,%11111110,%11111110
  118.  
  119. ******* StrToNum *****************************************************
  120. _StrToNum:
  121.         move.l    4(a7),a0
  122.  
  123. StrToNum:
  124.         movem.l    d2/d3,-(a7)
  125.         moveq    #0,d0        ; start with zero
  126.         moveq    #0,d1        ; clear upper bytes
  127.         moveq    #10,d3        ; assume base of 10
  128.  
  129.         cmpi.b    #'-',(a0)    ; check for minus sign
  130.         bne.s    initialStr
  131.         moveq    #31,d1
  132.         bset    d1,d3        ; show minus sign
  133.         addq.l    #1,a0        ; skip minus sign
  134.  
  135. initialStr:
  136.  
  137.         move.b    (a0)+,d1    ; get characters from start
  138.         cmpi.b    #'0',d1
  139.         beq.s    initialStr    ; chuck initial zeros
  140.         cmpi.b    #'x',d1        ; check for hex forms
  141.         beq.s    initialHex    ;
  142.         cmpi.b    #'$',d1        ;
  143.         beq.s    initialHex    ;
  144.         tst.b    d1
  145.         bra.s    bodyConvert        
  146.  
  147. bodyStr:
  148.         move.b    (a0)+,d1    ; get next character
  149. bodyConvert:
  150.         beq.s    bodyDone
  151.         move.w    d0,d2        ; save lsw of collection
  152.         swap    d0
  153.         mulu    d3,d0        ; multiply up msw of collection
  154.         swap    d0
  155.         clr.w    d0        ; throw away any overflow (!)
  156.         mulu    d3,d2        ; multiply up ls2 of collection
  157.         add.l    d2,d0
  158.  
  159.         cmpi.b    #'0',d1
  160.         blt.s    badChar
  161.         cmpi.b    #'9',d1
  162.         bgt.s    perhapsHex
  163.         subi.b    #'0',d1
  164.         add.l    d1,d0
  165.         bra.s    bodyStr
  166.  
  167. perhapsHex:
  168.         cmp.w    #16,d3
  169.         bne.s    badChar
  170.         cmpi.b    #'A',d1
  171.         blt.s    badChar
  172.         cmpi.b    #'F',d1
  173.         bgt.s    perhapsLCHex
  174.         subi.b    #'A'-10,d1
  175.         add.l    d1,d0
  176.         bra.s    bodyStr
  177.  
  178. perhapsLCHex:
  179.         cmpi.b    #'a',d1
  180.         blt.s    badChar
  181.         cmpi.b    #'f',d1
  182.         bgt.s    badChar
  183.         subi.b    #'a'-10,d1
  184.         add.l    d1,d0
  185.         bra.s    bodyStr
  186.  
  187. initialHex:
  188.         move.w    #16,d3        ; show base of 16, preserving minus
  189.         bra.s    bodyStr
  190.  
  191. bodyDone:
  192.         tst.l    d3
  193.         bpl.s    returnNum
  194.         neg.l    d0
  195. returnNum:
  196.         movem.l    (a7)+,d2/d3
  197.         rts
  198.  
  199. badChar:
  200.         move.l    #$80000000,d0
  201.         bra.s    returnNum
  202.  
  203. ******* StrB2C *******************************************************
  204. _StrB2C:
  205.         movem.l    4(a7),a0/a1
  206.  
  207. StrB2C:
  208.         clr.w    d0
  209.         move.b    (a0)+,d0
  210.         bra.s    2$
  211. 1$:
  212.         move.b    (a0)+,(a1)+
  213. 2$:
  214.         dbf    d0,1$
  215.         clr.b    (a1)
  216.         rts
  217.  
  218.     END
  219.