home *** CD-ROM | disk | FTP | other *** search
- ; asm(1.0) macro package - Various macros that may be
- ; found useful.
- ;
- ; This macro package has been written and placed in the
- ; public domain by Douglas J Leavitt, 1986. Feel free
- ; to use this package in anyway whatsoever, hopefully
- ; making millions of dollars in the process.
- ;
- ; Global Macro Variables start with ___
- ; ___argchk is a local temp variable used by various macros
- ; To pass extra params to the ARGCHK macro
- ;
-
- ; ARGCHK min_args,max_args,nargs
- ;
- ; Check a macro invocation for the proper number of arguments
-
- ifnd ASM_COMMON
- ASM_COMMON = 1
- ARGCHK macro
- ifne narg-2
- ___badarg=2 ; args to ARGCHK are bad
- mexit
- endc
- ___badarg=0 ; Just the right amount
- iflt ___argchk-\\1
- ___badarg=-1 ; Not enough args
- endc
- ifgt ___argchk-\\2
- ___badarg=1 ; Too many args
- endc
- endm
-
- endc ; ASM_COMMON
-
- ; SETFP fp
- ;
- ; Change the Default frame pointer variable (___deffp)
- ;
- SETFP macro
- ___argchk=narg
- ARGCHK 1,1
- ___deffp=\1
- endm
-
- ; Initial setting
- SETFP a6
-
- ; CSAVE local_size,[fp]
- ;
- ; Generate a legal C function prolog (Without saving registers)
- ; The default frame Pointer is: ___deffp (normally a6)
- ;
- CSAVE macro
- ___argchk=narg
- ARGCHK 1,2
- ifne ___badarg
- fail ; Generate a user warning
- mexit ; Incorrect arguments given
- endc
- iflt \1
- fail
- mexit
- endc
- ifle \1-32767
- ifeq narg-1 ; Use default fp (a6)
- link ___deffp,#\1
- endc
- ifeq narg-2 ; Use chosen fp
- link \2,#\1
- endc
- endc
- ifgt \1-32767
- ifeq narg-1 ; Use default fp (a6)
- link ___deffp,#0
- sub.l #\1,sp
- endc
- ifeq narg-2 ; Use chosen fp
- link \2,#0
- sub.l #\1,sp
- endc
- endc
- endm
-
- ; CRET [fp]
- ;
- ; generate C subroutine epilog (no register saving)
- ;
- CRET macro
- ___argchk=narg
- ARGCHK 0,1
- ifeq narg
- unlk ___deffp
- endc
- ifeq narg-1
- unlk \1
- endc
- rts
- endm
-
- ; REGDIR field1,field2,dir
- ;
- ; sets ___movmask to either field1 or field2 depending on dir
- ;
- REGDIR macro
- ___argchk=narg
- ARGCHK 3,3
- ifeq \\3
- ___movmask=\\1
- endc
- ifne \\3
- ___movmask=\\2
- endc
- endm
-
- ; REGSET reg_name,dir
- ;
- ; sets ___movmask to be the value of the given regname
- ; depending on the given direction.
- ;
- REGSET macro
- ifne narg-2
- mexit
- endc
- ifc \\1,"d0"
- REGDIR 0x0001,0x8000,\\2
- endc
- ifc \\1,"d1"
- REGDIR 0x0002,0x4000,\\2
- endc
- ifc \\1,"d2"
- REGDIR 0x0004,0x2000,\\2
- endc
- ifc \\1,"d3"
- REGDIR 0x0008,0x1000,\\2
- endc
- ifc \\1,"d4"
- REGDIR 0x0010,0x0800,\\2
- endc
- ifc \\1,"d5"
- REGDIR 0x0020,0x0400,\\2
- endc
- ifc \\1,"d6"
- REGDIR 0x0040,0x0200,\\2
- endc
- ifc \\1,"d7"
- REGDIR 0x0080,0x0100,\\2
- endc
- ifc \\1,"a0"
- REGDIR 0x0100,0x0080,\\2
- endc
- ifc \\1,"a1"
- REGDIR 0x0200,0x0040,\\2
- endc
- ifc \\1,"a2"
- REGDIR 0x0400,0x0020,\\2
- endc
- ifc \\1,"a3"
- REGDIR 0x0800,0x0010,\\2
- endc
- ifc \\1,"a4"
- REGDIR 0x1000,0x0008,\\2
- endc
- ifc \\1,"a5"
- REGDIR 0x2000,0x0004,\\2
- endc
- ifc \\1,"a6"
- REGDIR 0x4000,0x0002,\\2
- endc
- ifc \\1,"a7"
- REGDIR 0x8000,0x0001,\\2
- endc
- endm
-
- ; GENMOVEM pred,dir,addr,reg1,reg2,....
- ;
- ; pred is set if predecrement mode is to be used
- ; dir is 0 for movem to mem, 1 for movem to registers
- ; addr is the addressing mode to use
- ; reg1,reg2,... are the registers to save
- ;
- GENMOVEM macro
- ___argchk=narg
- ARGCHK 4,16
- ___movval=0
- REGSET "\4",\1
- ___movval=___movval!___movmask
- REGSET "\5",\1
- ___movval=___movval!___movmask
- REGSET "\6",\1
- ___movval=___movval!___movmask
- REGSET "\7",\1
- ___movval=___movval!___movmask
- REGSET "\8",\1
- ___movval=___movval!___movmask
- REGSET "\9",\1
- ___movval=___movval!___movmask
- REGSET "\10",\1
- ___movval=___movval!___movmask
- REGSET "\11",\1
- ___movval=___movval!___movmask
- REGSET "\12",\1
- ___movval=___movval!___movmask
- REGSET "\13",\1
- ___movval=___movval!___movmask
- REGSET "\14",\1
- ___movval=___movval!___movmask
- REGSET "\15",\1
- ___movval=___movval!___movmask
- REGSET "\16",\1
- ___movval=___movval!___movmask
- ifeq \2
- movem.l #___movval,\3
- endc
- ifne \2
- movem.l \3,#___movval
- endc
- endm
-
-