home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 612b.lha / IAS_Library / IASLIBRA.S < prev    next >
Text File  |  1992-02-11  |  9KB  |  699 lines

  1.  
  2. SAD    MACRO
  3.     movem.l    d0-d7/a0-a6,-(sp)
  4.     ENDM
  5.  
  6. GAD    MACRO
  7.     movem.l    (sp)+,d0-d7/a0-a6
  8.     ENDM
  9.     
  10. SAD2    MACRO
  11.     movem.l    d0-d5,-(sp)
  12.     ENDM
  13.  
  14. GAD2    MACRO
  15.     movem.l    (sp)+,d0-d5
  16.     ENDM
  17.  
  18. SAD3    MACRO
  19.     movem.l    d0-d1,-(sp)
  20.     ENDM
  21.  
  22. GAD3    MACRO
  23.     movem.l    (sp)+,d0-d1
  24.     ENDM
  25.  
  26. SAD4    MACRO
  27.     movem.l    d0-d6,-(sp)
  28.     ENDM
  29.  
  30. GAD4    MACRO
  31.     movem.l    (sp)+,d0-d6
  32.     ENDM
  33.  
  34. SAD5    MACRO
  35.     movem.l    d0-d7,-(sp)
  36.     ENDM
  37.  
  38. GAD5    MACRO
  39.     movem.l    (sp)+,d0-d7
  40.     ENDM
  41.  
  42.     NOLIST
  43.     INCLUDE    'exec/types.i'
  44.     INCLUDE    'exec/libraries.i'
  45.     INCLUDE    'exec/lists.i'
  46.     INCLUDE    'exec/alerts.i'
  47.     INCLUDE    'exec/initializers.i'
  48.     INCLUDE    'exec/resident.i'
  49.     INCLUDE    'exec/asmsupp.i'
  50.     INCLUDE    'libraries/ias.i'
  51.     
  52. _AbsExecBase    = $4
  53. _LVOOpenLibrary    = -552
  54. _LVOCloseLibrary    = -414
  55. _LVOAlert    = -108
  56. _LVOFreeMem    = -210
  57. _LVORemove    = -252
  58.  
  59. start
  60.     moveq    #-1,d0
  61.     rts
  62.     
  63. MYPRI    = 0
  64.  
  65. initDDescrip
  66.     dc.w    RTC_MATCHWORD
  67.     dc.l    initDDescrip
  68.     dc.l    EndCode
  69.     dc.b    RTF_AUTOINIT
  70.     dc.b    VERSION
  71.     dc.b    NT_LIBRARY
  72.     dc.b    MYPRI
  73.     dc.l    iasName
  74.     dc.l    idstring
  75.     dc.l    init
  76.     
  77. iasName    IASNAME
  78.     even
  79. VERSION    = 33
  80. REVISION    = 1
  81.  
  82. idstring    dc.b 'IASlibrary 33.1 ( (c)Craig Eales 20 Sep 1991)',13,10,0
  83.  
  84.     ds.w    0
  85.     
  86. init
  87.     dc.l    IasBase_SIZEOF
  88.     dc.l    funcTable
  89.     dc.l    dataTable
  90.     dc.l    initRoutine
  91.  
  92. funcTable
  93.     dc.l    Open
  94.     dc.l    Close
  95.     dc.l    Expunge
  96.     dc.l    Null
  97.     
  98.     dc.l    INTmulu
  99.     dc.l    INTdivu
  100.     dc.l    IASdivs
  101.     dc.l    IASabs
  102.     dc.l    IASneg
  103.     dc.l    IAScif
  104.     dc.l    IAScfi
  105.     dc.l    IASsub
  106.     dc.l    IASadd
  107.     dc.l    IASmuls
  108.     dc.l    IASdivi
  109.     dc.l    IAScfa
  110.     dc.l    INTcia
  111.     
  112.     dc.l    -1
  113.     
  114. dataTable
  115.     INITBYTE    LN_TYPE,NT_LIBRARY
  116.     INITLONG    LN_NAME,iasName
  117.     INITBYTE    LIB_FLAGS,LIBF_SUMUSED!LIBF_CHANGED
  118.     INITWORD    LIB_VERSION,VERSION
  119.     INITWORD    LIB_REVISION,REVISION
  120.     INITLONG    LIB_IDSTRING,idstring
  121.     dc.l    0
  122.  
  123. initRoutine
  124.     move.l    a5,-(sp)
  125.     move.l    d0,a5
  126.     move.l    a6,iasb_SysLib(a5)
  127.     move.l    a0,iasb_SegList(a5)
  128.     move.l    a5,d0
  129.     move.l    (sp)+,a5
  130.     rts
  131.  
  132. Open
  133.     addq.w    #1,LIB_OPENCNT(a6)
  134.     bclr    #LIBB_DELEXP,iasb_Flags(a6)
  135.     move.l    a6,d0
  136.     rts
  137.  
  138. Close
  139.     CLEAR    d0
  140.     subq.w    #1,LIB_OPENCNT(a6)
  141.     bne.s    .templab
  142.     btst    #LIBB_DELEXP,iasb_Flags(a6)
  143.     beq.s    .templab
  144.     bsr    Expunge
  145. .templab
  146.     rts
  147.  
  148. Expunge
  149.     movem.l    d2/a5/a6,-(sp)
  150.     move.l    a6,a5
  151.     move.l    iasb_SysLib(a5),a6
  152.     tst.w    LIB_OPENCNT(a5)
  153.     beq.s    .templab
  154.     bset    #LIBB_DELEXP,iasb_Flags(a5)
  155.     CLEAR    d0
  156.     bra.s    Expunge_End
  157. .templab
  158.     move.l    iasb_SegList(a5),d2
  159.     move.l    a5,a1
  160.     CALLSYS    Remove
  161.     
  162.     CLEAR    d0
  163.     move.l    a5,a1
  164.     move.w    LIB_NEGSIZE(a5),d0
  165.     sub.l    d0,a1
  166.     add.w    LIB_POSSIZE(a5),d0
  167.     CALLSYS    FreeMem
  168.     move.l    d2,d0
  169. Expunge_End
  170.     movem.l    (sp)+,d2/a5/a6
  171.     rts
  172.     
  173. Null
  174.     CLEAR    d0
  175.     rts
  176.     
  177.     
  178. ***** 32 bit multiply  ******
  179. ;times d0*d1 to d2
  180. INTmulu
  181.     movem.l    d0-d4,-(a7)
  182.     
  183.     clr.l    d4
  184.     
  185.     move.l    d0,d2
  186.     move.l    d1,d3
  187.     
  188.     swap    d2
  189.     and.l    #$ffff,d2
  190.     
  191.     and.l    #$ffff,d3
  192.     mulu    d2,d3
  193.     
  194.     and.l    #$ffff,d3
  195.     swap    d3
  196.     
  197.     add.l    d3,d4
  198.     
  199.     move.l    d0,d2
  200.     move.l    d1,d3
  201.     
  202.     swap    d3
  203.     and.l    #$ffff,d3
  204.     
  205.     and.l    #$ffff,d2
  206.     mulu    d2,d3
  207.     
  208.     and.l    #$ffff,d3
  209.     swap    d3
  210.     
  211.     add.l    d3,d4
  212.     
  213.     move.l    d0,d2
  214.     move.l    d1,d3
  215.     and.l    #$ffff,d2
  216.     and.l    #$ffff,d3
  217.     mulu    d2,d3
  218.     add.l    d3,d4
  219.     
  220.     move.l    d4,result
  221.     movem.l    (a7)+,d0-d4
  222.     move.l    result,d2
  223.     rts
  224.     
  225. ***** ARP 32 bit divide *****
  226. ;32 bit divide d0/d1 to d2
  227. INTdivu
  228.     movem.l    d0-d3,-(a7)
  229.     swap    d1
  230.     tst.w    d1
  231.     bne.s    lab5
  232.     swap    d1
  233.     move.w    d1,d3
  234.     move.w    d0,d2
  235.     clr.w    d0
  236.     swap    d0
  237.     divu    d3,d0
  238.     move.l    d0,d1
  239.     swap    d0
  240.     move.w    d2,d1
  241.     divu    d3,d1
  242.     move.w    d1,d0
  243.     clr.w    d1
  244.     swap    d1
  245.     move.l    d0,result
  246.     movem.l    (a7)+,d0-d3
  247.     move.l    result,d2
  248.     rts
  249. lab5
  250.     swap    d1
  251.     move.l    d1,d3
  252.     move.l    d0,d1
  253.     clr.w    d1
  254.     swap    d1
  255.     swap    d0
  256.     clr.w    d0
  257.     moveq    #$f,d2
  258. lab7
  259.     add.l    d0,d0
  260.     addx.l    d1,d1
  261.     cmp.l    d1,d3
  262.     bhi.s    lab6
  263.     sub.l    d3,d1
  264.     addq.w    #1,d0
  265. lab6
  266.     dbf    d2,lab7
  267.     move.l    d0,result
  268.     movem.l    (a7)+,d0-d3
  269.     move.l    result,d2
  270.     rts
  271.  
  272. ***** Full IAS divide ***
  273. ;divide d0 by d1 to d2 (all IAS)
  274. IASdivs
  275.     SAD5
  276.     move.l    d0,d3
  277.     move.l    d1,d4
  278.     
  279.     and.l    #$7ffffff,d0
  280.     and.l    #$7ffffff,d1
  281.     
  282.     move.l    d0,d5
  283.     move.l    d1,d6
  284.     
  285.     jsr    INTdivu        ;now in d7 ab/cd=e
  286.     move.l    d2,d7
  287.     
  288.     and.l    #$ffff,d7
  289.     swap    d7
  290.     
  291.     SAD4
  292.     move.l    d2,d0
  293.     move.l    d6,d1
  294.     jsr    INTmulu
  295.     move.l    d2,result
  296.     GAD4
  297.     move.l    result,d6
  298.     
  299.     sub.l    d6,d5        ;rem now in d5
  300.     
  301.     move.l    d0,d6
  302.     move.l    #$80000000,d0
  303.     jsr    INTdivu
  304.     lsl.l    #1,d2
  305.     
  306.     SAD4
  307.     move.l    d5,d0
  308.     move.l    d2,d1
  309.     jsr    INTmulu
  310.     move.l    d2,result
  311.     GAD4
  312.     move.l    result,d2
  313.  
  314.     swap    d2
  315.     and.l    #$ffff,d2
  316.     
  317.     add.l    d2,d7
  318.     
  319.     eor.l    d3,d4
  320.     and.l    #$80000000,d4
  321.     or.l    d4,d7
  322.     
  323.     move.l    d7,result
  324.     GAD5
  325.     move.l    result,d2
  326.     rts
  327.     
  328.     
  329.  
  330.  
  331. ***** Absolute IAS ******
  332. ;find abs value of d0
  333. IASabs
  334.     and.l    #$7ffffff,d0
  335.     move.l    d0,result
  336.     rts
  337.  
  338. ***** Negate IAS ********
  339. ;Make IAS in d0 neg
  340. IASneg
  341.     eor.l    #$80000000,d0
  342.     move.l    d0,result
  343.     rts
  344.         
  345. ***** Integer To  IAS *****    
  346. ;convert integer in d0 to IAS
  347. IAScif
  348.     tst.l    d0
  349.     bmi.s    .doneg
  350.     
  351.     and.l    #$ffff,d0
  352.     swap    d0
  353.     
  354.     move.l    d0,result
  355.     rts
  356. .doneg
  357.     neg.l    d0
  358.     and.l    #$ffff,d0
  359.     swap    d0
  360.     
  361.     or.l    #$80000000,d0
  362.     move.l    d0,result
  363.     rts
  364.  
  365. ******* IAS to Integer ****
  366. ;convert IAS in d0 to integer
  367. IAScfi
  368.     SAD3
  369.     move.l    d0,d1
  370.     and.l    #$80000000,d1
  371.     bne.s    .negbit
  372.     
  373.     swap    d0
  374.     and.l    #$ffff,d0
  375.     
  376.     move.l    d0,result
  377.     GAD3
  378.     move.l    result,d0
  379.     rts
  380. .negbit
  381.     and.l    #$7fffffff,d0
  382.     
  383.     swap    d0
  384.     and.l    #$ffff,d0
  385.     
  386.     neg.l    d0
  387.     move.l    d0,result
  388.     GAD3
  389.     move.l    result,d0
  390.     rts
  391.     
  392. ***** Fixed Point Sub *****
  393. ;Sub d1 from d0 and store in d2
  394. IASsub
  395.     SAD3
  396.     eor.l    #$80000000,d1
  397.     jsr    IASadd
  398.     GAD3
  399.     move.l    result,d2
  400.     rts
  401.         
  402. ***** Fixed Point Add *****
  403. ;add d0 to d1 and put in d2
  404. IASadd
  405.     SAD2
  406.     move.l    d0,d2
  407.     move.l    d1,d3
  408.     move.l    d1,d4
  409.     eor.l    d2,d4
  410.     and.l    #$80000000,d4
  411.     beq.s    .justaddem
  412.  
  413.     move.l    d0,d4
  414.     and.l    #$80000000,d4
  415.     bne.s    .swopem
  416. .swoped
  417.     and.l    #$7fffffff,d2
  418.     and.l    #$7fffffff,d3
  419.     sub.l    d3,d2,
  420.     cmp.l    d3,d0
  421.     blt.s    .makeneg
  422. .madeneg
  423.     move.l    d2,result
  424.     GAD2
  425.     move.l    result,d2
  426.     rts
  427.  
  428. .swopem
  429.     move.l    d0,d4
  430.     move.l    d1,d0
  431.     move.l    d4,d1
  432.     move.l    d0,d2
  433.     move.l    d1,d3
  434.     bra.s    .swoped
  435. .makeneg    
  436.     neg.l    d2
  437.     or.l    #$80000000,d2
  438.     bra.s    .madeneg
  439.     
  440. .justaddem
  441.     move.l    d1,d5
  442.     and.l    #$7fffffff,d5
  443.     and.l    #$7fffffff,d2
  444.     add.l    d5,d2
  445.     move.l    d0,d4
  446.     and.l    #$80000000,d4
  447.     or.l    d4,d2
  448.     move.l    d2,result
  449.     GAD2
  450.     move.l    result,d2
  451.     rts
  452.  
  453.  
  454. **** Fixed Point Multiply ****
  455. ;Times d0 and d1 into d2
  456. IASmuls
  457.     SAD2
  458.     move.l    d0,d2
  459.     move.l    d1,d3
  460.     
  461.     and.l    #$7fffffff,d3
  462.     and.l    #$7fffffff,d2
  463.     
  464.     swap    d3
  465.     and.l    #$ffff,d3
  466.     swap    d2
  467.     and.l    #$ffff,d2
  468.     
  469.     mulu    d3,d2
  470.     
  471.     and.l    #$ffff,d2
  472.     swap    d2
  473.     
  474.     move.l    d0,d3
  475.     move.l    d1,d4
  476.     and.l    #$7fffffff,d3
  477.     and.l    #$ffff,d4
  478.     
  479.     swap    d3
  480.     and.l    #$ffff,d3
  481.  
  482.     mulu    d3,d4
  483.     add.l    d4,d2
  484.     
  485.     move.l    d0,d3
  486.     move.l    d1,d4
  487.     and.l    #$ffff,d3
  488.     and.l    #$7fffffff,d4
  489.     
  490.     swap    d4
  491.     and.l    #$ffff,d4
  492.     
  493.     mulu    d3,d4
  494.     add.l    d4,d2
  495.  
  496.     move.l    d0,d3
  497.     move.l    d1,d4
  498.     and.l    #$ffff,d3
  499.     and.l    #$ffff,d4
  500.     mulu    d3,d4
  501.     
  502.     swap    d4
  503.     and.l    #$ffff,d4
  504.     
  505.     add.l    d4,d2
  506.     
  507.     eor.l    d0,d1
  508.     and.l    #$80000000,d1
  509.     beq.s    .end
  510.     or.l    #$80000000,d2
  511. .end
  512.     move.l    d2,result
  513.     GAD2
  514.     move.l    result,d2
  515.     rts
  516.  
  517. **** Divide IAS by integer **
  518. ;Divides IAS in d0 by integer in d1 to IAS in d2
  519. IASdivi
  520.     SAD2
  521.     move.l    d0,d2
  522.     move.l    d1,d3
  523.     clr.l    d5
  524.     clr.l    d4
  525.     and.l    #$7fffffff,d2
  526.     tst.l    d3
  527.     bpl.s    .isplus
  528.     neg.l    d3
  529. .isplus
  530.     
  531.     
  532.     swap    d2
  533.     and.l    #$ffff,d2
  534.     
  535.     divu    d3,d2
  536.     swap    d2
  537.     move.w    d2,d5
  538.     swap    d2
  539.     
  540.     and.l    #$ffff,d2
  541.     swap    d2
  542.     
  543.     move.l    #$00010000,d4
  544.     divu    d3,d4
  545.     and.l    #$ffff,d4
  546.     mulu    d4,d5
  547.     add.l    d5,d2
  548.     
  549.     move.l    d0,d4
  550.     and.l    #$ffff,d4
  551.     move.l    d1,d5
  552.     divu    d5,d4
  553.     and.l    #$ffff,d4
  554.     add.l    d4,d2
  555.     
  556.     move.l    d0,d3
  557.     and.l    #$80000000,d3
  558.     move.l    d1,d4
  559.     tst.l    d4
  560.     bmi.s    .divbyneg
  561.     
  562.     tst.l    d3
  563.     beq.s    .doneall
  564.     or.l    #$80000000,d2
  565.     bra.s    .doneall
  566. .divbyneg
  567.     tst.l    d3
  568.     bne.s    .doneall
  569.     or.l    #$80000000,d2
  570. .doneall    
  571.     move.l    d2,result
  572.     GAD2
  573.     move.l    result,d2
  574.     rts
  575.     
  576. **** Convert IAS to ASCII ***
  577. ;Converts IAS in d0 to ASCII at a0 (12 bytes)
  578. IAScfa
  579.     SAD
  580.     move.l    d0,d1
  581.     and.l    #$80000000,d1
  582.     beq.s    .doplus
  583.     move.b    #'-',(a0)+
  584.     bra.s    .donsign
  585. .doplus
  586.     move.b    #'+',(a0)+
  587. .donsign
  588.     and.l    #$7fffffff,d0
  589.     move.l    d0,d2
  590.     move.l    a0,a1
  591.     
  592.     swap    d0
  593.     and.l    #$ffff,d0
  594.     
  595.     clr.l    d1
  596.     move.l    #buffer1,a0
  597.     jsr    convert
  598.     add.l    #5,a0
  599.     move.b    (a0)+,(a1)+
  600.     move.b    (a0)+,(a1)+
  601.     move.b    (a0)+,(a1)+
  602.     move.b    (a0)+,(a1)+
  603.     move.b    (a0)+,(a1)+
  604.     move.b    #'.',(a1)+
  605.     
  606.     move.l    d2,d0
  607.     and.l    #$ffff,d0
  608.     move.l    #15259,d1
  609.     mulu    d1,d0
  610.     clr.l    d1
  611.     move.l    #buffer1,a0
  612.     jsr    convert
  613.     add.l    #1,a0
  614.     move.b    (a0)+,(a1)+
  615.     move.b    (a0)+,(a1)+
  616.     move.b    (a0)+,(a1)+
  617.     move.b    (a0)+,(a1)+
  618.     move.b    #0,(a1)+
  619.     GAD
  620.     rts
  621.     
  622. **** Convert Integer to ASCII ***
  623. ; INT d0 to a0
  624. INTcia    
  625.     SAD
  626.     move.l    #$1,d1
  627.     jsr    convert
  628.     GAD
  629.     rts
  630.     
  631. **** Convert d0 to ASCII ****
  632. ;d0 source
  633. ;d1 Flags - bit 0 signed - bit 1 strip
  634. ;a0 dest
  635. convert
  636.     SAD
  637.     and.l    #$1,d1
  638.     beq    .donesign
  639.     tst.l    d0
  640.     bmi.s    .dominus
  641.     move.b    #'+',(a0)+
  642. .donesign    
  643.     lea    cols,a1
  644.     move.w    #9,d3
  645. .digits    
  646.     move.l    (a1)+,d1
  647.     bsr.s    .dodigit
  648.     dbra    d3,.digits
  649.     GAD
  650.     SAD
  651.     move.l    d1,d2
  652.     and.l    #$2,d1
  653.     beq.s    .removed
  654.     and.l    #$1,d2
  655.     beq.s    .strip
  656.     addq.l    #1,a0
  657. .strip
  658.     cmp.b    #'0',(a0)
  659.     bne.s    .removed
  660.     bra.s    .remove
  661. .removed
  662.     GAD
  663.     rts
  664.  
  665. .dodigit
  666.     clr.l    d2
  667. .loop
  668.     addq.l    #1,d2
  669.     sub.l    d1,d0
  670.     bpl.s    .loop
  671.     add.l    d1,d0
  672.     subq.l    #1,d2
  673.     add.b    #'0',d2
  674.     move.b    d2,(a0)+
  675.     rts
  676. .dominus
  677.     move.b    #'-',(a0)+
  678.     not.l    d0
  679.     add.l    #1,d0
  680.     bra.s    .donesign
  681. .remove
  682.     SAD
  683.     move.l    #9,d1
  684. .nexts
  685.     move.b    1(a0),(a0)+
  686.     dbra    d1,.nexts
  687.     GAD
  688.     bra.s    .strip
  689.     
  690. cols    dc.l    1000000000,100000000,10000000
  691.     dc.l    1000000,100000,10000,1000,100,10,1
  692.     
  693.     
  694. **** FLAGS ETC *****
  695. result    dc.l    0
  696. buffer1    dc.l    0,0,0
  697.  
  698. EndCode:    END
  699.