home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
17 Bit Software 1: Collection A
/
17Bit_Collection_A.iso
/
files
/
73.dms
/
73.adf
/
include
/
common
/
asmmac.i
< prev
Wrap
Text File
|
2008-06-02
|
4KB
|
220 lines
; 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