home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 303.lha / AssemTools / Include / numlib.i < prev    next >
Text File  |  1980-12-03  |  8KB  |  440 lines

  1.  
  2. ;  *** Include Library for Handling Numeric Strings ***
  3. ;  180988 v 1.42 TM       =AMIGA= Metacc Macro Assembler
  4.  
  5. ;  Edited:  25.11.88 TM  'sput10, lzput10' CREATED
  6. ;        17.12.88 TM  'sput10' RECURSIVE 'div10' CREATED
  7. ;             'put10' RECURSIVE
  8. ;        22.02.89 JM  'put10' now returns length in d0 again -> v 1.21
  9. ;                 *** If something does not work, try saving d0.
  10. ;        04.03.89 TM  sortentry.comments added -> v1.22
  11. ;        27.03.89 TM  'get16, put16' now save registers
  12. ;             affected onto the stack -> v1.23
  13. ;        21.06.89 TM  'check10' made -> v1.3
  14. ;        22.06.89 TM  code compressed & speeded up -> v1.4
  15. ;        01.07.89 TM     'check16' made -> v1.42
  16. *T
  17. *T    NUMLIB.I * Metacc Include File
  18. *T        Version 1.42
  19. *T           Date 01.07.89
  20. *T
  21. *B
  22.  
  23. ;  get10    (string10 to integer /signed/)
  24. ;  in:        a0=*string;
  25. ;  call:    numlib get10;
  26. ;  out:        a0=*endofvalue; d0=integer;
  27. ;          p.c=error_exit; /if no value present/
  28.  
  29. ;  get16    (string16 to integer /signed/)
  30. ;  in:        a0=*string;
  31. ;  call:    numlib get16;
  32. ;  out:        a0=*endofstring; d0=integer;
  33. ;        p.c=error_exit; /if no value present/
  34.  
  35. ;  getval    (string to integer /signed/)
  36. ;  in:        a0=*string;
  37. ;  call:    numlib getval;
  38. ;  out:        a0=*endofstring; d0=integer;
  39. ;          p.c=error_exit; /if no value present/
  40. ;  notes:    /base 16 values have prefix $/
  41. ;          /base 10 values have no prefix or prefix +/
  42.  
  43. ;  check10    (check whether decimal (base10) value follows)
  44. ;  in:        a0=*ptr;
  45. ;  call:    numlib check10;
  46. ;  out:        p.z=result (NE if no value)
  47. ;  notes:    /the value may be terminated by any character
  48. ;        less than '@' (64) except a decimal digit/
  49. ;        /if any other character terminates it, it is
  50. ;        not considered to be a number/
  51.  
  52. ;  check16    (check whether hexadec (base16) value follows)
  53. ;  in:        a0=*ptr;
  54. ;  call:    numlib check16;
  55. ;  out:        p.z=result (NE if no value)
  56. ;  notes:    /the value may be terminated by any character
  57. ;        less than '@' (64) except a hexadecimal digit/
  58. ;        /if any other character terminates it, it is
  59. ;        not considered to be a number/
  60.  
  61. ;  put10    (integer to string10 /signed/)
  62. ;  in:        a0=*string; d0=integer;
  63. ;  call:    numlib put10;
  64. ;  out:        a0=*(NULL); d0=length;
  65.  
  66. ;  div10    (divide long-integer by 10 /unsigned/)
  67. ;  in:        d0=value;
  68. ;  call:    numlib div10;
  69. ;  out:        d0=value DIV 10; d1=(UWORD) value MOD 10;
  70.  
  71. ;  sput10    (short integer to string10 /signed/)
  72. ;  in:        a0=*string; d0=short_integer;
  73. ;  call:    numlib sput10;
  74. ;  out:        a0=*(NULL);
  75.  
  76. ;  lzput10    (short integer to string10 /unsigned, incl. leading zeroes/)
  77. ;  in:        a0=*string; d0=short_integer;
  78. ;  call:    numlib lzput10;
  79. ;  out:        a0=*(NULL);
  80. ;  notes:    /output string always 5 characters + NULL/
  81.  
  82. ;  put16    (integer to string16 /signed/)
  83. ;  in:        a0=*string; d0=integer;
  84. ;  call:    numlib put16;
  85. ;  out:        a0=*(NULL); d0=length;
  86.  
  87. ;  isdigit10    (check if base10 digit)
  88. ;  in:        d0=character;
  89. ;  call:    numlib isdigit10;
  90. ;  out:        p=(flags) result /eq if true/;
  91.  
  92. ;  isdigit16    (check if base16 digit /non-case-sensitive/)
  93. ;  in:        d0=character;
  94. ;  call:    numlib isdigit10;
  95. ;  out:        p=(flags) result /eq if true/;
  96.  
  97. ;  skipblk    (skip blanks /32, 9, 10/)
  98. ;  in:        a0=*string;
  99. ;  call:    numlib skipblk;
  100. ;  out:        a0=*newstring; d0=num_of_skipped_chars;
  101.  
  102. *E
  103.  
  104. ;;;
  105.  
  106.  
  107.  
  108. numlib    macro
  109.  
  110.       ifnc      '\1',''
  111.  
  112. _NUMF\1        set        1
  113.         jsr        _NUM\1
  114.         mexit
  115.  
  116.       endc
  117.  
  118.         ifd        _NUMFcheck10
  119.  
  120. _NUMcheck10    push    a0/d0
  121. _NUMcheck10.1    move.b    (a0)+,d0
  122.         cmp.b    #'-',d0
  123.         beq.s    _NUMcheck10.1
  124.         cmp.b    #'0',d0
  125.         blo.s    _NUMcheck10ne
  126.         cmp.b    #'9',d0
  127.         bhi.s    _NUMcheck10ne
  128. _NUMcheck10.2    move.b    (a0)+,d0
  129.         cmp.b    #'@',d0
  130.         bhs.s    _NUMcheck10ne
  131.         cmp.b    #'0',d0
  132.         blo.s    _NUMcheck10eq
  133.         cmp.b    #'9',d0
  134.         bls.s    _NUMcheck10.2
  135. _NUMcheck10eq    moveq    #0,d0
  136.         pull    a0/d0
  137.         rts
  138. _NUMcheck10ne    moveq    #1,d1
  139.         pull    a0/d0
  140.         rts
  141.  
  142.         endc
  143.  
  144.  
  145.         ifd        _NUMFcheck16
  146.  
  147. _NUMcheck16    push    a0/d0
  148. _NUMcheck16.1    move.b    (a0)+,d0
  149.         cmp.b    #'-',d0
  150.         beq.s    _NUMcheck16.1
  151.         numlib    isdigit16
  152.         bne.s    _NUMcheck16ne
  153. _NUMcheck16.2    move.b    (a0)+,d0
  154.         numlib    isdigit16
  155.         beq.s    _NUMcheck16.2
  156.         cmp.b    #'@',d0
  157.         bhs.s    _NUMcheck16ne
  158. _NUMcheck16eq    moveq    #0,d0
  159.         pull    a0/d0
  160.         rts
  161. _NUMcheck16ne    moveq    #1,d1
  162.         pull    a0/d0
  163.         rts
  164.  
  165.         endc
  166.  
  167.  
  168.         ifd        _NUMFgetval
  169.  
  170. _NUMgetval    move.b    (a0),d0
  171.         numlib    isdigit10
  172.         beq.s    _getval1
  173.         cmp.b    #'+',d0
  174.         bne.s    _getval2
  175.         addq.l    #1,a0
  176. _getval1    numlib    get10
  177.         rts
  178. _getval2    cmp.b    #'$',d0
  179.         bne.s    _getval3
  180.         addq.l    #1,a0
  181.         numlib    get16
  182.         rts
  183. _getval3    setc
  184.         rts
  185.  
  186.         endc
  187.  
  188.  
  189.         ifd        _NUMFget10
  190.  
  191. _NUMget10    cmp.b    #'-',(a0)
  192.         beq.s    _get10n
  193.         move.b    (a0),d0
  194.         cmp.b    #'0',d0
  195.         blo.s    _get10x
  196.         cmp.b    #'9',d0
  197.         bhi.s    _get10x
  198.         move.l    d2,-(sp)
  199.         moveq    #0,d0
  200.         move.l    d0,d1
  201. _get10a        move.b    (a0)+,d1
  202.         sub.b    #'0',d1
  203.         blo.s    _get10b
  204.         cmp.b    #9,d1
  205.         bhi.s    _get10b
  206.         add.l    d0,d0
  207.         move.l    d0,d2
  208.         asl.l    #2,d0
  209.         add.l    d2,d0
  210.         add.l    d1,d0
  211.         bra.s    _get10a
  212. _get10b        subq.l    #1,a0
  213.         move.l    (sp)+,d2
  214.         clrc
  215.         rts
  216. _get10n        addq.l    #1,a0
  217.         bsr.s    _NUMget10
  218.         neg.l    d0
  219.         clrc
  220.         rts
  221. _get10x        moveq.l    #0,d0
  222.         setc
  223.         rts
  224.  
  225.         endc
  226.  
  227.  
  228.         ifd        _NUMFget16
  229.  
  230. _NUMget16    move.l    d1,-(sp)
  231.         cmp.b    #'-',(a0)
  232.         beq.s    _get16n
  233.         moveq    #0,d0
  234. _get16a        move.b    (a0)+,d1
  235.         sub.b    #'0',d1
  236.         blo.s    _get16b
  237.         cmp.b    #9,d1
  238.         bls.s    _get16c
  239.         cmp.b    #'a'-'0',d1
  240.         blo.s    _get16d
  241.         sub.b    #32,d1
  242. _get16d        sub.b    #7,d1
  243.         cmp.b    #10,d1
  244.         blo.s    _get16x
  245.         cmp.b    #15,d1
  246.         bhi.s    _get16x
  247. _get16c        asl.l    #4,d0
  248.         or.b    d1,d0
  249.         bra.s    _get16a
  250. _get16b        subq.l    #1,a0
  251.         move.l    (sp)+,d1
  252.         clrc
  253.         rts
  254. _get16n        addq.l    #1,a0
  255.         bsr.s    _NUMget16
  256.         bcs.s    _get16x
  257.         move.l    (sp)+,d1
  258.         neg.l    d0
  259.         clrc
  260.         rts
  261. _get16x        move.l    (sp)+,d1
  262.         setc
  263.         rts
  264.  
  265.         endc
  266.  
  267.  
  268.         ifd        _NUMFput10
  269.  
  270. _NUMput10    move.l    d1,-(sp)
  271.         move.l    a0,-(sp)
  272.         tst.l    d0
  273.         bpl.s    _put10a
  274.         neg.l    d0
  275.         move.b    #'-',(a0)+
  276. _put10a        numlib    div10
  277.         tst.l    d0
  278.         beq.s    _put10b
  279.         bsr.s    _NUMput10
  280. _put10b        or.b    #'0',d1
  281.         move.b    d1,(a0)+
  282.         clr.b    (a0)
  283.         move.l    a0,d0
  284.         sub.l    (sp)+,d0
  285.         move.l    (sp)+,d1
  286.         rts
  287.  
  288.         endc
  289.  
  290.  
  291.         ifd        _NUMFdiv10
  292.  
  293. _NUMdiv10    move.l    d2,-(sp)
  294.         move.l    d0,d1
  295.         swap    d1
  296.         ext.l    d1
  297.         divu.w    #10,d1
  298.         move.w    d1,d2
  299.         swap    d2
  300.         move.w    d0,d1
  301.         divu.w    #10,d1
  302.         move.w    d1,d2
  303.         swap    d1
  304.         move.l    d2,d0
  305.         move.l    (sp)+,d2
  306.         rts
  307.  
  308.         endc
  309.  
  310.  
  311.         ifd        _NUMFlzput10
  312.  
  313. _NUMlzput10    move.l    d1,-(sp)
  314.         moveq    #4,d1
  315.         addq.l    #5,a0
  316.         clr.b    (a0)
  317. _lzput10a    and.l    #$ffff,d0
  318.         divu    #10,d0
  319.         swap    d0
  320.         or.b    #'0',d0
  321.         move.b    d0,-(a0)
  322.         swap    d0
  323.         dbf    d1,_lzput10a
  324.         addq.l    #5,a0
  325.         move.l    (sp)+,d1
  326.         rts
  327.  
  328.         endc
  329.  
  330.  
  331.         ifd        _NUMFsput10
  332.  
  333. _NUMsput10    move.l    d0,-(sp)
  334.         tst.w    d0
  335.         bpl.s    _sput10a
  336.         neg.w    d0
  337.         move.b    #'-',(a0)+
  338. _sput10a    ext.l    d0
  339.         divu.w    #10,d0
  340.         beq.s    _sput10b
  341.         bsr.s    _NUMsput10
  342. _sput10b    swap    d0
  343.         or.b    #'0',d0
  344.         move.b    d0,(a0)+
  345.         clr.b    (a0)
  346.         move.l    (sp)+,d0
  347.         rts
  348.  
  349.         endc
  350.  
  351.  
  352.         ifd        _NUMFput16
  353.  
  354. _NUMput16    push    d1-d4
  355.         moveq    #0,d2
  356.         move.b    d2,d3
  357.         tst.l    d0
  358.         bpl.s    _put16b
  359.         neg.l    d0
  360.         move.b    #'-',(a0)+
  361.         addq.l    #1,d2
  362. _put16b        moveq    #7,d4
  363. _put16a        rol.l    #4,d0
  364.         move.b    d0,d1
  365.         and.w    #15,d1
  366.         cmp.w    #9,d1
  367.         bls.s    1$
  368.         addq.w    #7,d1
  369. 1$        add.b    #'0',d1
  370.         tst.b    d3
  371.         bne.s    _put16d
  372.         tst.b    d4
  373.         beq.s    _put16d
  374.         cmp.b    #'0',d1
  375.         beq.s    _put16e
  376. _put16d        move.b    d1,(a0)+
  377.         addq.l    #1,d2
  378.         moveq    #-1,d3
  379. _put16e        dbf    d4,_put16a
  380.         clr.b    (a0)
  381.         move.l    d2,d0
  382.         pull    d1-d4
  383.         rts
  384.  
  385.         endc
  386.  
  387.  
  388.         ifd        _NUMFisdigit10
  389.  
  390. _NUMisdigit10    cmp.b    #'0',d0
  391.         blo.s    _nnisdigit10.1
  392.         cmp.b    #'9',d0
  393.         bhi.s    _nnisdigit10.1
  394.         cmp.b    d0,d0
  395. _nnisdigit10.1    rts
  396.  
  397.         endc
  398.  
  399.  
  400.         ifd        _NUMFisdigit16
  401.  
  402. _NUMisdigit16    cmp.b    #'0',d0
  403.         blo.s    _nnisdigit161
  404.         cmp.b    #'f',d0
  405.         bhi.s    _nnisdigit161
  406.         cmp.b    #'a',d0
  407.         bhs.s    _nnisdigit162
  408.         cmp.b    #'F',d0
  409.         bhi.s    _nnisdigit161
  410.         cmp.b    #'A',d0
  411.         bhs.s    _nnisdigit162
  412.         cmp.b    #'9',d0
  413.         bhi.s    _nnisdigit161
  414. _nnisdigit162    cmp.b    d0,d0
  415.         rts
  416. _nnisdigit161    cmp.b    #'5',d0
  417.         rts
  418.  
  419.         endc
  420.  
  421.  
  422.         ifd        _NUMFskipblk
  423.  
  424. _NUMskipblk    moveq    #0,d0
  425. _nskipblk1    cmp.b    #32,(a0)
  426.         beq.s    _nskipblk2
  427.         cmp.b    #10,(a0)
  428.         beq.s    _nskipblk2
  429.         cmp.b    #9,(a0)
  430.         beq.s    _nskipblk2
  431.         rts
  432. _nskipblk2    addq.l    #1,a0
  433.         addq.l    #1,d0
  434.         bra.s    _nskipblk1
  435.  
  436.         endc
  437.  
  438.     endm
  439.  
  440.