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

  1. ; ***********************************************************************
  2. ; *                                    *
  3. ; *    Library include file for assembly programming.            *
  4. ; *                                    *
  5. ; *    ### VERSION 1.72 ###                        *
  6. ; *                                    *
  7. ; *                                    *
  8. ; *    Created by JM 880110 021500                    *
  9. ; *                                    *
  10. ; *    Edited:                                *
  11. ; *    880110    - print creates primm automatically            *
  12. ; *        - libnames added                    *
  13. ; *        - lib6 added                        *
  14. ; *        - print simplified                    *
  15. ; *                                    *
  16. ; *    880227    - notc and notx macros added                *
  17. ; *                                    *
  18. ; *    880305    - flib and printa added                    *
  19. ; *        - double nulls changed to singles in libnames        *
  20. ; *                                    *
  21. ; *    880307    - push and pull by Tomi Marin                *
  22. ; *                                    *
  23. ; *    880426    - closlab, liba, liba6 by Jukka Marin            *
  24. ; *                                    *
  25. ; *    880501    - fileptr added to print                *
  26. ; *                                    *
  27. ; *    880513    - printa edited                        *
  28. ; *    880515    - printa edited: accepts a filehandle, too        *
  29. ; *                                    *
  30. ; *    880603    - clrv, setv, notc added                *
  31. ; *                                    *
  32. ; *    880605    - printa edited: works also with a0/a1/d0/d1        *
  33. ; *                                    *
  34. ; *    880609    - printa edited: now always prints right # of chars    *
  35. ; *                                    *
  36. ; *    880612    - closl added to save memory (doesn't check or reset    *
  37. ; *          library base pointer)                    *
  38. ; *                                    *
  39. ; *    881030    - a4 RELATIVE addressing added to certain routines.    *
  40. ; *          for use with Aztec Assembler etc.            *
  41. ; *        - relbase, rlong, rword, rbyte written            *
  42. ; *                                    *
  43. ; *    881105    - if filehandle in print[a] is NULL don't call Write()    *
  44. ; *        - bugs fixed in print[a] RELATIVE            *
  45. ; *        - dir added to relbase                    *
  46. ; *                                    *
  47. ; *    890122    - clrz, setz, notz added                *
  48. ; *        - extra "d" removed from line:                *
  49. ; *    880603  - clrv, setv, notc addded                *
  50. ; *                                    *
  51. ; *    890303    - peek added                        *
  52. ; *                                    *
  53. ; *    890310    - defines blo and bhs macros if A68k is used.        *
  54. ; *                                    *
  55. ; *    890311    - .s-extensions added.                    *
  56. ; *        - libnames no longer defines lib base prts if RELATIVE    *
  57. ; *          mode is used.                        *
  58. ; *                                    *
  59. ; *    890612    - lbase written.  Gets the library base pointer        *
  60. ; *          into given register.                    *
  61. ; *                                    *
  62. ; *    890612    - expansion library support added.            *
  63. ; *                                    *
  64. ; *    890617    - rbase, rlong, rword, and rbyte removed.  Use the    *
  65. ; *          macros provided in util.i instead.            *
  66. ; *                                    *
  67. ; *    890701    - ckeven added.                        *
  68. ; *                                    *
  69. ; *    890714    - openlib version number can now be specified.        *
  70. ; *                                    *
  71. ; ***********************************************************************
  72. ;
  73. ;  setz        sets the zero flag
  74. ;  clrz        clears  -  "  -
  75. ;  notz        toggles -  "  -
  76. ;  setc        sets the carry flag
  77. ;  clrc        clears  -  "  -
  78. ;  notc        toggles -  "  -
  79. ;  setx        sets the extend flag
  80. ;  clrx        clears  -  "  -
  81. ;  notx        toggles -  "  -
  82. ;  setv        sets the overflow flag
  83. ;  clrv        clears  -  "  -
  84. ;  notv        toggles -  "  -
  85. ;
  86. ;  print    Prints the text immediately following the command.
  87. ;        Text must NOT be null-terminated. The second parameter,
  88. ;        if specified, is the file pointer.
  89. ;
  90. ;  printa    Prints the text from address given. Text must be
  91. ;        null-terminated.
  92. ;        Example: printa a2
  93. ;        prints a text from (a2) on.
  94. ;        Example: printa text(pc),outfile(pc)
  95. ;        prints a text from (text(pc)) on to outfile(pc)
  96. ;
  97. ;  openlib    Opens a library. Example: openlib Dos,cleanup
  98. ;        tries to open dos.library. If fails, branches to label
  99. ;        cleanup. Label is optional.
  100. ;        openlib Dos,cleanup,34 specifies the oldest library
  101. ;        version number to be accepted.
  102. ;
  103. ;  closlib    Closes a library if its pointer is not zero. Finally
  104. ;        the pointer is set to zero to prevent closing lib again.
  105. ;        Example: closlib Dos
  106. ;        tries to close dos.library.
  107. ;
  108. ;  closl    Closes a library regardless of its pointer.  Doesn't reset
  109. ;        the pointer.  Saves memory but is not so safe to use as
  110. ;        closlib.
  111. ;        Example: closl Intuition
  112. ;        tries to close intuition.library.
  113. ;
  114. ;  closlab    As closlib but doesn't use PC-relative addressing.
  115. ;
  116. ;  lib        Calls a library routine. Example: lib Dos,Delay
  117. ;        loads _DosBase into a6 and calls _LVODelay(a6).
  118. ;  liba        As lib but doesn't use PC-relative addressing.
  119. ;
  120. ;  lib6        lib6 = lib but saves a6 first.
  121. ;  liba6    liba6 = liba but saves a6 first.
  122. ;
  123. ;  flib        Calls a library routine without loading a6 first.
  124. ;        Use only when a6 already contains right library base address.
  125. ;        Example: flib Dos,Delay or flib Delay
  126. ;
  127. ;  lbase    Gets the library base pointer into given register.  Example:
  128. ;        lbase Dos,a2    gets dosbase into a2.
  129. ;
  130. ;  libnames    Defines library names and pointers needed by openlib.
  131. ;        Must be added to the end of the program if print or lib
  132. ;        macros are used.
  133. ;
  134. ;  push        Pushes processor register(s) onto the stack.
  135. ;  pull        Pulls processor register(s) from the stack.
  136. ;  peek        Peeks processor register(s) from the stack
  137. ;          without altering the value of SP.
  138. ;        Examples: push all  = movem.l d0-d7/a0-a6,-(sp)
  139. ;              push a0-a5
  140. ;              pull d0-d4/a4
  141. ;
  142. ;  ckeven    Checks if current PC value is even.  Causes an error if not.
  143. ;        Needs a label (at even address) as a parameter.
  144. ;
  145. ;
  146.  
  147.  
  148.  
  149. setz        macro
  150.         ori    #4,ccr
  151.         endm
  152.  
  153. clrz        macro
  154.         andi    #251,ccr
  155.         endm
  156.  
  157. notz        macro
  158.         eori    #4,ccr
  159.         endm
  160.  
  161. setc        macro
  162.         ori    #1,ccr
  163.         endm
  164.  
  165. clrc        macro
  166.         andi    #254,ccr
  167.         endm
  168.  
  169. notc        macro
  170.         eori    #1,ccr
  171.         endm
  172.  
  173. setx        macro
  174.         ori    #16,ccr
  175.         endm
  176.  
  177. clrx        macro
  178.         andi    #239,ccr
  179.         endm
  180.  
  181. notx        macro
  182.         eori    #16,ccr
  183.         endm
  184.  
  185. setv        macro
  186.         ori    #2,ccr
  187.         endm
  188.  
  189. clrv        macro
  190.         andi    #253,ccr
  191.         endm
  192.  
  193. notv        macro
  194.         eori    #2,ccr
  195.         endm
  196.  
  197.  
  198.         ifd    .A68k
  199.         include    "bb.i"        ; defines blo and bhs
  200.         endc
  201.  
  202.  
  203.  
  204. ckeven        macro    *label_at_even_addr
  205.         ifne    (*-\1)&1
  206.         Error: This line begins at odd address!!!
  207.         endc
  208.         endm
  209.  
  210.  
  211.  
  212. print        macro    *STRING        print <'This is a test',10> [,file]
  213.         ifnd    Dprimm
  214.         bra.s    _primmover
  215.  
  216. primm        move.l    (sp)+,a2
  217.         move.l    a2,d2
  218. primmloop1    tst.b    (a2)+
  219.         bne.s    primmloop1
  220.         move.l    a2,d3
  221.         sub.l    d2,d3
  222.         subq.l    #1,d3
  223.         beq.s    primmloop2
  224.         tst.l    d1
  225.         beq.s    primmloop2
  226.         jsr    _LVOWrite(a6)
  227. primmloop2    move.l    a2,d0
  228.         addq.l    #3,d0
  229.         and.b    #252,d0
  230.         move.l    d0,-(sp)
  231.         rts
  232. _primmover
  233. Dprimm        set    1
  234.         endc
  235.         movem.l    a0-a2/a6/d0-d3,-(sp)
  236.         ifc    '\2',''
  237.         lib    Dos,Output
  238.         move.l    d0,d1
  239.         endc
  240.         ifnc    '\2',''
  241.         move.l    \2,d1        optional filehandle
  242.         endc
  243.         ifd    RELATIVE
  244.         move.l    _DosBase(a4),a6
  245.         endc
  246.         ifnd    RELATIVE
  247.         move.l    _DosBase(pc),a6
  248.         endc
  249.         jsr    primm(pc)
  250.         dc.b    \1
  251.         dc.b    0
  252.         cnop    0,4
  253.         movem.l    (sp)+,a0-a2/a6/d0-d3
  254.         endm
  255.  
  256. printa        macro    *STRINGPTR    printa a4//printa #STARTMSG
  257.         movem.l    a0-a1/a6/d0-d3,-(sp)
  258.         move.l    \1,d2
  259.         ifc    '\2',''
  260.         lib    Dos,Output
  261.         move.l    d0,d1
  262.         endc
  263.         ifnc    '\2',''
  264.         move.l    \2,d1        optional filehandle
  265.         endc
  266.         beq.s    printa\@
  267.         ifd    RELATIVE
  268.         move.l    _DosBase(a4),a6
  269.         endc
  270.         ifnd    RELATIVE
  271.         move.l    _DosBase(pc),a6
  272.         endc
  273.         jsr    print_addr(pc)
  274. printa\@    movem.l    (sp)+,a0-a1/a6/d0-d3
  275.         ifnd    Dprinta
  276.         bra.s    _printaovr
  277.  
  278. print_addr    move.l    d2,a0        buffer
  279. printadloop    tst.b    (a0)+
  280.         bne.s    printadloop
  281.         subq.l    #1,a0
  282.         move.l    a0,d3        length
  283.         sub.l    d2,d3
  284.         flib    Write
  285.         rts
  286. _printaovr
  287. Dprinta        set    1
  288.         endc
  289.         endm
  290.  
  291.  
  292.  
  293. push        macro    * push <reg list | all>
  294.         ifc    '\1','all'
  295.         movem.l    d0-d7/a0-a6,-(sp)
  296.         endc
  297.         ifnc    '\1','all'
  298.         movem.l    \1,-(sp)
  299.         endc
  300.         endm
  301.  
  302. pull        macro    * pull <reg list | all>
  303.         ifc    '\1','all'
  304.         movem.l    (sp)+,d0-d7/a0-a6
  305.         endc
  306.         ifnc    '\1','all'
  307.         movem.l    (sp)+,\1
  308.         endc
  309.         endm
  310.  
  311. peek        macro    * peek <reg list | all>
  312.         ifc    '\1','all'
  313.         movem.l    (sp),d0-d7/a0-a6
  314.         endc
  315.         ifnc    '\1','all'
  316.         movem.l    (sp),\1
  317.         endc
  318.         endm
  319.  
  320.  
  321.  
  322. openlib        macro    *LIB_ID,CLEANUP    openlib Dos[,cleanup[,ver]]
  323. D\1        set    1
  324.         move.l    4,a6
  325.         lea    _\1Lib(pc),a1
  326.         ifc    '\3',''
  327.         moveq.l    #0,d0
  328.         endc
  329.         ifnc    '\3',''
  330.         moveq    #\3,d0
  331.         endc
  332.         jsr    _LVOOpenLibrary(a6)
  333.         ifd    RELATIVE
  334.         move.l    d0,_\1Base(a4)
  335.         endc
  336.         ifnd    RELATIVE
  337.         move.l    d0,_\1Base
  338.         endc
  339.         ifnc    '\2',''
  340.         beq    \2
  341.         endc
  342.         endm
  343.  
  344. closlib        macro    *LIB_ID        closlib Dos
  345.         ifd    RELATIVE
  346.         move.l    _\1Base(a4),a1
  347.         endc
  348.         ifnd    RELATIVE
  349.         move.l    _\1Base(pc),a1
  350.         endc
  351.         move.l    a1,d0
  352.         beq.s    cLIB\@
  353.         move.l    4,a6
  354.         jsr    _LVOCloseLibrary(a6)
  355. cLIB\@        
  356.         ifd    RELATIVE
  357.         clr.l    _\1Base(a4)
  358.         endc
  359.         ifnd    RELATIVE
  360.         clr.l    _\1Base
  361.         endc
  362.         endm
  363.  
  364. closl        macro    *LIB_ID        closl Dos (no security measures)
  365.         ifd    RELATIVE
  366.         move.l    _\1Base(a4),a1
  367.         endc
  368.         ifnd    RELATIVE
  369.         move.l    _\1Base(pc),a1
  370.         endc
  371.         move.l    4,a6
  372.         jsr    _LVOCloseLibrary(a6)
  373.         endm
  374.  
  375. closlab        macro    *LIB_ID        closlab Dos, absolute addressing
  376.         move.l    _\1Base,a1
  377.         move.l    a1,d0
  378.         beq.s    cLIBa\@
  379.         move.l    4,a6
  380.         jsr    _LVOCloseLibrary(a6)
  381. cLIBa\@        clr.l    _\1Base
  382.         endm
  383.  
  384. lib        macro    *LIB_ID,ROUTINE    lib Dos, Delay
  385.         ifnc    '\1','Exec'
  386.         ifd    RELATIVE
  387.         move.l    _\1Base(a4),a6
  388.         endc
  389.         ifnd    RELATIVE
  390.         move.l    _\1Base(pc),a6
  391.         endc
  392.         endc
  393.         ifc    '\1','Exec'
  394.         move.l    $4,a6
  395.         endc
  396.         jsr    _LVO\2(a6)
  397.         endm
  398.  
  399. liba        macro    *LIB_ID,ROUTINE    liba Dos,Delay, absolute addressing
  400.         ifnc    '\1','Exec'
  401.         move.l    _\1Base,a6
  402.         endc
  403.         ifc    '\1','Exec'
  404.         move.l    $4,a6
  405.         endc
  406.         jsr    _LVO\2(a6)
  407.         endm
  408.  
  409. lib6        macro    *LIB_ID,ROUTINE    lib6 Dos, Delay
  410.         move.l    a6,-(sp)
  411.         lib    \1,\2
  412.         move.l    (sp)+,a6
  413.         endm
  414.  
  415. liba6        macro    *LIB_ID,ROUTINE    lib Dos, Delay
  416.         move.l    a6,-(sp)
  417.         liba    \1,\2
  418.         move.l    (sp)+,a6
  419.         endm
  420.  
  421. flib        macro    *LIB_ID,ROUTINE//ROUTINE flib Dos,Delay//flib Delay
  422.         ifnc    '\2',''
  423.         jsr    _LVO\2(a6)
  424.         endc
  425.         ifc    '\2',''
  426.         jsr    _LVO\1(a6)
  427.         endc
  428.         endm
  429.  
  430.  
  431. lbase        macro    *LIB_ID,REGISTER lib Dos,a4
  432.         ifnc    '\1','Exec'
  433.         ifd    RELATIVE
  434.         move.l    _\1Base(a4),\2
  435.         endc
  436.         ifnd    RELATIVE
  437.         move.l    _\1Base(pc),\2
  438.         endc
  439.         endc
  440.         ifc    '\1','Exec'
  441.         move.l    $4,\2
  442.         endc
  443.         endm
  444.  
  445.  
  446. libnames    macro
  447.         ifd    DClist
  448. _ClistLib    dc.b    'clist.library',0
  449.         cnop    0,2
  450.         ifnd    _ClistBase
  451.         ifnd    RELATIVE
  452. _ClistBase    dc.l    0
  453.         endc
  454.         endc
  455.         endc
  456.  
  457.         ifd    DGfx
  458. _GfxLib        dc.b    'graphics.library',0
  459.         cnop    0,2
  460.         ifnd    _GfxBase
  461.         ifnd    RELATIVE
  462. _GfxBase    dc.l    0
  463.         endc
  464.         endc
  465.         endc
  466.  
  467.         ifd    DLayers
  468. _LayersLib    dc.b    'layers.library',0
  469.         cnop    0,2
  470.         ifnd    _LayersBase
  471.         ifnd    RELATIVE
  472. _LayersBase    dc.l    0
  473.         endc
  474.         endc
  475.         endc
  476.  
  477.         ifd    DIntuition
  478. _IntuitionLib    dc.b    'intuition.library',0
  479.         cnop    0,2
  480.         ifnd    _IntuitionBase
  481.         ifnd    RELATIVE
  482. _IntuitionBase    dc.l    0
  483.         endc
  484.         endc
  485.         endc
  486.  
  487.         ifd    DMath
  488. _MathLib    dc.b    'mathffp.library',0
  489.         cnop    0,2
  490.         ifnd    _MathBase
  491.         ifnd    RELATIVE
  492. _MathBase    dc.l    0
  493.         endc
  494.         endc
  495.         endc
  496.  
  497.         ifd    DMathTrans
  498. _MathTransLib    dc.b    'mathtrans.library',0
  499.         cnop    0,2
  500.         ifnd    _MathTransBase
  501.         ifnd    RELATIVE
  502. _MathTransBase    dc.l    0
  503.         endc
  504.         endc
  505.         endc
  506.  
  507.         ifd    DMathIeeeDoubBas
  508. _MathIeeeDoubBasLib    dc.b    'mathieeedoubbas.library',0
  509.         cnop    0,2
  510.         ifnd    _MathIeeeDoubBasBase
  511.         ifnd    RELATIVE
  512. _MathIeeeDoubBasBase    dc.l    0
  513.         endc
  514.         endc
  515.         endc
  516.  
  517.         ifd    DDos
  518. _DosLib        dc.b    'dos.library',0
  519.         cnop    0,2
  520.         ifnd    _DosBase
  521.         ifnd    RELATIVE
  522. _DosBase    dc.l    0
  523.         endc
  524.         endc
  525.         endc
  526.  
  527.         ifd    DTranslator
  528. _TranslatorLib    dc.b    'translator.library',0
  529.         cnop    0,2
  530.         ifnd    _TranslatorBase
  531.         ifnd    RELATIVE
  532. _TranslatorBase    ds.l    1
  533.         endc
  534.         endc
  535.         endc
  536.  
  537.         ifd    DIcon
  538. _IconLib    dc.b    'icon.library',0
  539.         cnop    0,2
  540.         ifnd    _IconBase
  541.         ifnd    RELATIVE
  542. _IconBase    dc.l    0
  543.         endc
  544.         endc
  545.         endc
  546.  
  547.         ifd    DDiskfont
  548. _DiskfontLib    dc.b    'diskfont.library',0
  549.         cnop    0,2
  550.         ifnd    _DiskfontBase
  551.         ifnd    RELATIVE
  552. _DiskfontBase    dc.l    0
  553.         endc
  554.         endc
  555.         endc
  556.  
  557.         ifd    DExpansion
  558. _ExpansionLib    dc.b    'expansion.library',0
  559.         cnop    0,2
  560.         ifnd    _ExpansionBase
  561.         ifnd    RELATIVE
  562. _ExpansionBase    dc.l    0
  563.         endc
  564.         endc
  565.         endc
  566.  
  567.         ifnd    _ExecBase
  568. _ExecBase    equ    $4
  569.         endc
  570.  
  571.         endm
  572.  
  573.