home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 4 / FreshFish_May-June1994.bin / bbs / may94 / util / moni / snoopy.lha / Snoopy / Includes / macro.i next >
Text File  |  1993-12-14  |  12KB  |  655 lines

  1.          IFND    MACRO_I
  2. MACRO_I        equ    1
  3.  
  4. ;--------------    define a pixel size to both BYTE,WORD and LONG sizes
  5. DEFINE        MACRO
  6. \1        equ    \2
  7. \1.B        equ    (\2)/8
  8. \1.W        equ    (\2)/16
  9. \1.L        equ    (\2)/32
  10.         ENDM
  11.  
  12. ;--------------    some standard defines
  13. CSI        equ    $9b        ; 'Control Sequence Indicator'
  14. ESC        equ    $1b        ; 'ANSI ESCape character'
  15. VERTICALTAB    equ    $0b        ; 'VERTICAL TABulator' (Eine Zeile Hoch)
  16. PALID        equ    $FFFFFFDE    ; Anfang Pal-Bildschirm
  17. CENDVALUE    equ    $FFFFFFFE    ; Ende Copperliste (auch Macro cend)
  18.  
  19. ;--------------    all registers mask
  20. ALLREGISTERS    REG    D0-D7/A0-A6
  21.  
  22. ;--------------    standard boolean registers
  23. TRUE         equ    1
  24. FALSE        equ    0
  25.         IFND    NULL
  26. NULL        equ    0
  27.         ENDC
  28.  
  29. ;--------------    push/pop all registers on the stack
  30. PUSHALL        MACRO
  31.         pushm    d0-d7/a0-a6
  32.         ENDM
  33.  
  34. PULLALL        MACRO
  35.         popm    d0-d7/a0-a6
  36.         ENDM
  37.  
  38. ;--------------    call function \1 (optional: load library \2)
  39. ;--------------    NOTE: (to my mind) better than DOSCALL and stuff like that
  40. ;--------------    because a6 is only loaded if necesarry
  41. ;--------------    
  42. CALL        MACRO
  43.         IFEQ    NARG-2
  44.         movea.l    \2,a6
  45.         ENDC
  46.         jsr    (_LVO\1,a6)
  47.         ENDM
  48.  
  49. ;--------------    print \1 using arguments \2 (optional: dosBase = \3)
  50. DPRINTF        MACRO
  51.         pushm    d0-d3/a0-a1/a6
  52.         IFGT    NARG-1
  53.         move.l    #\2,D2
  54.         ELSE
  55.         moveq    #0,d2
  56.         ENDC
  57.         move.l    #\1,d1
  58.         IFGT    NARG-2
  59.         CALL    VPrintf,\3
  60.         ELSE
  61.         CALL    VPrintf,<(dosBase,pc)>
  62.         ENDC
  63.         popm    d0-d3/a0-a1/a6
  64.         ENDM
  65.  
  66. ;--------------    branch to \2 if \1 is uppercase
  67. ;--------------    
  68. IFUCASE        MACRO
  69.         cmpi.b    #'a',\1
  70.         blo\0    \2
  71.         cmpi.b    #'z',\1
  72.         bgt\0    \2
  73.         ENDM
  74.  
  75. ;--------------    make data register \1 uppercase
  76. UCASE        MACRO
  77.         cmpi.b    #'a',\1
  78.         blo.b    .UCASE\@
  79.         cmpi.b    #'z',\1
  80.         bgt.b    .UCASE\@
  81.         subi.b    #('a'-'A'),\1
  82. .UCASE\@    
  83.         ENDM
  84.  
  85. ;--------------    make data register \1 lowercase
  86. LCASE        MACRO
  87.         cmpi.b    #'A',\1
  88.         blo.b    .LCASE\@
  89.         cmpi.b    #'Z',\1
  90.         bgt.b    .LCASE\@
  91.         addi.b    #('a'-'A'),\1
  92. .LCASE\@    
  93.         ENDM
  94.  
  95. ;--------------    branch to \2 if \1 is a digit
  96. IFDIGIT        MACRO
  97.         cmpi.b    #'0',\1
  98.         blo.b    .DIGIT\@
  99.         cmpi.b    #'9',\1
  100.         bgt.b    .DIGIT\@
  101.         bra    \2
  102. .DIGIT\@    
  103.         ENDM
  104.  
  105. ;--------------    move BPTR \1 to APTR \2 (scratches d0)
  106. BMOVE        MACRO
  107.         move.l    \1,d0
  108.         lsl.l    #2,d0
  109.         move.l    d0,\2
  110.         ENDM
  111.  
  112. ;--------------    convert BSTR \1 to ASTR \2 (d0.b is set to the string size)
  113. B2ASTR        MACRO
  114.         IFNC    '\2','a0'
  115.         push    a0
  116.         ENDC
  117.         move.l    \1,d0
  118.         lsl.l    #2,d0
  119.         movea.l    d0,a0
  120.         move.b    (a0)+,d0
  121.         IFNC    '\2',a0
  122.         move.l    a0,\2
  123.         pop    a0
  124.         ENDC
  125.         ENDM
  126.  
  127. ;--------------    some "antique" defines
  128. exec.base    equ    4
  129. execBase    equ    4
  130. customBase    equ    $dff000
  131. custom.chips    equ    $dff000
  132.  
  133. ;--------------    cleanup memory area starting at \1, size=\2
  134. CLEARSECTION    MACRO
  135.         pushm    a0/d0
  136.         lea    \1,a0
  137.         move.l    #(\2)-1,d0
  138. .CLS\@        clr.b    (a0)+
  139.         dbra    d0,.CLS\@
  140.         popm    a0/d0
  141.         ENDM
  142.  
  143. ;--------------    define an AmigaDOS style version string \1
  144. VERSION        MACRO
  145.         db    0,'$VER: \1',0
  146.         even
  147.         ENDM
  148.  
  149. BRF        MACRO
  150.         IFEQ    NARG-3
  151.         tst    \1
  152.         ELSE
  153.         tst\3    \1
  154.         ENDC
  155.         beq\0    \2
  156.         ENDM
  157.  
  158. ;--------------    BRanch\0 to \2 if \1[\3] is TRUE
  159. BRT        MACRO
  160.         IFEQ    NARG-3
  161.         tst    \1
  162.         ELSE
  163.         tst\3    \1
  164.         ENDC
  165.         bne\0    \2
  166.         ENDM
  167.  
  168. ;--------------    BRanch\0 to \1 on Low Bit Clear in \2
  169. BRLBC        MACRO
  170.         btst    #0,\1
  171.         beq\0    \2
  172.         ENDM    
  173.  
  174. ;--------------    BRanch\0 to \1 on Low Bit Set in \2
  175. BRLBS        MACRO
  176.         btst    #0,\1
  177.         bne\0    \2
  178.         ENDM
  179.  
  180. ;--------------    BRanch\0 to \1 on Bit \1 Set in \2
  181. BRBS        MACRO
  182.         btst    \1,\2
  183.         bne\0    \3
  184.         ENDM
  185.  
  186. ;--------------    BRanch\0 to \1 on Bit \1 Clear in \2
  187. BRBC        MACRO
  188.         btst    \1,\2
  189.         beq\0    \3
  190.         ENDM
  191.  
  192. ;--------------    compare <ea>-values \1,\2 size=\0 ; scratches d0 or \3
  193. COMPARE        MACRO
  194.         IFEQ    NARG-3
  195.         move\0    \1,\3
  196.         cmp\0    \2,\3
  197.         ELSE
  198.         move\0    \1,d0
  199.         cmp\0    \2,d0
  200.         ENDC
  201.         ENDM
  202.  
  203. ;--------------    
  204. ;--------------    branch to \4 if \1 matches \3 any comparison
  205. ;-------------- possible comparisons are ==, !=, <, <=, >, >=
  206. BRANCH        MACRO    ; \1=Wert 1,\2=Condition Code,\3=Wert 2,\4=Label,[\5=Größe Vergleich]
  207.         IFEQ    NARG-5
  208.         COMPARE\5 \1,\3
  209.         ELSE
  210.         COMPARE    \1,\3
  211.         ENDC
  212.         IFC    '\2','=='
  213.         beq\0    \4
  214.         ENDC
  215.         IFC    '\2','!='
  216.         bne\0    \4
  217.         ENDC
  218.         IFC    '\2','<='
  219.         bls\0    \4
  220.         ENDC
  221.         IFC    '\2','<'
  222.         blo\0    \4
  223.         ENDC
  224.         IFC    '\2','>='
  225.         bhs\0    \4
  226.         ENDC
  227.         IFC    '\2','>'
  228.         bhi\0    \4
  229.         ENDC
  230.         ENDM
  231.  
  232. ;--------------    openlib \1 and put the base to \2 (version \3)
  233. OPENLIB        MACRO
  234.         lea    \1,a1
  235.         IFEQ    NARG-3
  236.         moveq    #\3,d0
  237.         ELSE
  238.         moveq    #0,d0
  239.         ENDC
  240.         CALL    OpenLibrary,<(execBase).w>
  241.         move.l    d0,\2
  242.         tst.l    d0
  243.         ENDM
  244.  
  245. ;--------------    "save" closing of library \1
  246. CLOSELIB    MACRO
  247.         tst.l    \1
  248.         beq.b    .Closelib\@
  249.         movea.l    \1,a1
  250.         CALL    CloseLibrary,<(execBase).w>
  251. .Closelib\@    
  252.         ENDM
  253.  
  254. ;--------------    clear stack memory sized \1 in stack register \2
  255. CLEARSTACK    MACRO
  256.         movem.l    d0/\2,-(sp)
  257.         move.w    #(\1)/2-1,d0
  258. .CLRSTK\@    move.w    #0,(\2)+
  259.         dbra    d0,.CLRSTK\@
  260.         movem.l    (sp)+,d0/\2
  261.         ENDM
  262.  
  263. ;--------------    create stack sized \1 in stack register \2
  264. ;--------------    NOTE: this stack has positive offsets, which means you 
  265. ;--------------    can directly access it with STRUCTURE macros
  266. CREATESTACK    MACRO
  267.         link    \2,#-\1
  268.         subi.l    #\1,\2
  269.         CLEARSTACK \1,\2
  270.         ENDM
  271.  
  272. ;--------------    remove local stack sized \1 in stack register \2
  273. ENDSTACK    MACRO
  274.         addi.l    #\1,\2
  275.         unlk    \2
  276.         ENDM
  277.  
  278. ;--------------    minimal function head for function \1 using register mask \2
  279. ;--------------    you *MUST* use DONE (or ENDSUB) to end this function;
  280. ;--------------    else the assembler will give you a warning
  281. XENTRY        MACRO
  282.         IFEQ    NARG-2            ; Wenn es 2 Argumente gibt
  283. \1_regs        reg    \2            ; Register sichern
  284. \1        movem.l    \1_regs,-(sp)        ; Register auf den Stack
  285.         ELSE                ; Sonst
  286. \1                        ; Nur den Funktionsnamen definieren    
  287.         ENDC                ; Ende
  288. ENTRYohneDONEfür    set    \1_done    
  289.         ENDM
  290.  
  291. ;--------------    all-purpose function entry macro. Defines function named \1 
  292. ;--------------    saving the registers \2. Optional: stacksize \3, stackregister \4
  293. ;--------------    you *MUST* use DONE (or ENDSUB) to end this function;
  294. ;--------------    else the assembler will give you a warning
  295. ENTRY        MACRO
  296.         IFD    IS_LINKABLE
  297.         xdef    \1
  298.         ENDC    
  299.         XENTRY    \1,\2
  300.         IFEQ    NARG-4
  301. \1_stksize    equ    \3
  302. \1_stkreg    equr    \4
  303.         CREATESTACK \3,\4
  304.         ENDC
  305.         ENDM
  306.  
  307. ;--------------    end a function created with ENTRY or XENTRY macros;
  308. ;--------------    it cleans up the stack (if one exists) and restores the
  309. ;--------------    saved register list
  310. ENDSUB        MACRO
  311.         IFNC    '','\1'
  312.         IFND    \1
  313.         FAIL    Die Funktion \1 existiert nicht
  314.         ENDC
  315.         IFND    \1_done
  316. \1_done        
  317.         ENDC
  318.         ELSE
  319. .function_done
  320.         ENDC
  321.         IFD    \1_stksize
  322.         ENDSTACK \1_stksize,\1_stkreg
  323.         ENDC
  324.         IFD    \1_regs
  325.         movem.l    (sp)+,\1_regs
  326.         ENDC
  327.         ENDM
  328.  
  329. ;--------------    same as ENDSUB but returns with RTS
  330. DONE        MACRO
  331.         ENDSUB    \1
  332.         rts
  333.         ENDM
  334.  
  335. ;--------------    same as ENDSUB but returns with RTE
  336. DONEEXCEPTION    MACRO
  337.         ENDSUB    \1
  338.         rte
  339.         ENDM
  340.  
  341. ;--------------    don't use this: internal DEBUG macro
  342. DEBUGALLOWED    MACRO
  343.         IFD    DEBUG_MODE
  344. __DEBUG_VAR    
  345.         IFC    '\1',''
  346.         DC.L    $7F000
  347.         ELSE
  348.         DC.L    \1
  349.         ENDC
  350.         ENDC
  351.         ENDM    
  352.  
  353. DEBUG        MACRO
  354.         IFD    DEBUG_MODE
  355.         move.l    a0,-(sp)
  356.         move.l    \1,-(sp)
  357.         movea.l    (__DEBUG_VAR),a0
  358.         move.l    (sp)+,(a0)+
  359.         IFGT    NARG-1
  360.         move.l    \2,(a0)+
  361.         ENDC    
  362.         IFGT    NARG-2
  363.         move.l    \3,(a0)+
  364.         ENDC    
  365.         IFGT    NARG-3
  366.         move.l    \4,(a0)+
  367.         ENDC    
  368.         IFGT    NARG-4
  369.         move.l    \5,(a0)+
  370.         ENDC    
  371.         IFGT    NARG-5
  372.         move.l    \6,(a0)+
  373.         ENDC    
  374.         move.l    a0,(__DEBUG_VAR)
  375.         move.l    (sp)+,a0
  376.         ENDC
  377.         ENDM
  378.  
  379. ;--------------    set or clear flag \3 if \1 matches \2 using comparison \3
  380. SETFLAG        MACRO
  381.         COMPARE\0 \1,\3
  382.         IFC    '\2','=='
  383.         seq    \4
  384.         ENDC
  385.         IFC    '\2','!='
  386.         sne    \4
  387.         ENDC
  388.         IFC    '\2','<='
  389.         sls    \4
  390.         ENDC
  391.         IFC    '\2','<'
  392.         slo    \4
  393.         ENDC
  394.         IFC    '\2','>='
  395.         sge    \4
  396.         ENDC
  397.         IFC    '\2','>'
  398.         sgt    \4
  399.         ENDC
  400.         ENDM
  401.  
  402. ;--------------    BROKEN::::::::::::::::::::::::::::::::::::::::::::::::
  403. IIF        MACRO    ;\1=ConditionCode,\2=Befehle
  404. IIF_FLAG    SET    0
  405.         IFC    '\1','EQ'
  406. IIF_FLAG    SET    1
  407.         bne.b    .iif\@
  408.         ENDC
  409.         IFC    '\1','NE'
  410. IIF_FLAG    SET    1
  411.         beq.b    .iif\@
  412.         ENDC
  413.         IFC    '\1','LS'
  414. IIF_FLAG    SET    1
  415.         bgt.b    .iif\@
  416.         ENDC
  417.         IFC    '\1','LO'
  418. IIF_FLAG    SET    1
  419.         bge.b    .iif\@
  420.         ENDC
  421.         IFC    '\1','HS'
  422. IIF_FLAG    SET    1
  423.         blo.b    .iif\@
  424.         ENDC
  425.         IFC    '\1','HI'
  426. IIF_FLAG    SET    1
  427.         bls.b    .iif\@
  428.         ENDC
  429.         IFNE    IIF_FLAG-1
  430.         FAIL     Ungültiger Conditioncode '\1' für IIF-Makro
  431.         ENDC
  432. \2
  433.         IFEQ    NARG-3
  434.         bra.b    .else\@
  435. .iif\@
  436. \3        **** BROKEN, DON'T USE ****
  437. .else\@
  438.         ELSE
  439. .iif\@
  440.         ENDC
  441.         ENDM
  442.  
  443. ;--------------    optimized clear for data registers
  444. CLEAR_DATAREG    MACRO
  445.         IFC    \*UPPER(\0),.L
  446.         moveq    #0,\1
  447.         ELSE
  448.         clr\0    \1
  449.         ENDC
  450.         ENDM
  451.  
  452. ;--------------    optimized clear for addr registers
  453. C