
main()		macro
		ifnd	STACKVARIABLES
		variables
		endc
Allocmnr	set	0
reg_id		set	2
auto_var	set	1
mainflag	set	1
isauvar		set	0
elsefl		set	0
iffl		set	0
		ds.b	DefSiz
varbase		ds.b	8
		XDEF	varbase


		section	main,CODE

_main		clr.b	-1(a0,d0.l)
		lea	varbase,a4
		move.l	a4,(a4)
		move.l	d0,d2
		move.l	a0,a2
		move.l	sp,_stackpoint(a4)
		move.l	sp,_RandSeed(a4)
		move.w	$dff006,d1
		add.l	a1,d1
		move.l	d1,_RandSeed2(a4)
		move.l	4,_SysBase(a4)
		ifd	database
		lea	database,a5
		move.l	a5,4(a4)
		endc
		OpenDos
		ifnc	'\1',''
		sub.l	a1,a1
		move.l	_SysBase(a4),a6
		jsr	-294(a6)	;FindTask
		move.l	d0,a0
		move.l	172(a0),d0	;pr_CLI
		lsl.l	#2,d0
		move.l	d0,a1
		move.l	16(a1),d0	;cli_CommandName
		lsl.l	#2,d0
		move.l	d0,a0
		moveq	#0,d0
		move.b	(a0)+,d0	;size of name
		clr.b	0(a0,d0.l)
		move.l	a0,argv(a4)	
		moveq	#1,d3
		lea	argbuf(a4),a1
		lea	argv1(a4),a3
                lea     0(a2,d2.l),a0
stripjunk:
                cmp.b   #' ',-(a0)
                dbhi    d2,stripjunk

                clr.b   1(a0)
newarg:
                ;-- skip spaces
                move.b  (a2)+,d1
                beq.s   parmExit
                cmp.b   #' ',d1
                beq.s   newarg
                cmp.b   #9,d1           ; tab
                beq.s   newarg
                cmp.w   #7,d3
                beq.s   parmExit
                move.l  a1,(a3)+
                addq.w  #1,d3
                cmp.b   #'"',d1
                beq.s   doquote
                move.b  d1,(a1)+

nextchar:
                move.b  (a2)+,d1
                beq.s   parmExit
                cmp.b   #' ',d1
                beq.s   endarg

                move.b  d1,(a1)+
                bra.s   nextchar

endarg:
                clr.b   (a1)+
                bra.s   newarg
doquote:
                move.b  (a2)+,d1
                beq.s   parmExit
                cmp.b   #'"',d1
                beq.s   endarg
                cmp.b   #'*',d1
                bne.s   addquotechar

                move.b  (a2)+,d1
                move.b  d1,d2
                and.b   #$df,d2         ;d2 is temp toupper'd d1

                cmp.b   #'N',d2         ;check for dos newline char
                bne.s   checkEscape
                moveq   #10,d1
                bra.s   addquotechar

checkEscape:
                cmp.b   #'E',d2
                bne.s   addquotechar
                moveq   #27,d1

addquotechar:
                move.b  d1,(a1)+
                bra.s   doquote

parmExit:
                clr.b   (a1)
                clr.l   (a3)
		move.l	d3,argc(a4)
		endc
		move.l	_DosBase(a4),a6
		jsr	-60(a6)		;_LVOOutput(a6)
		move.l	d0,_stdout(a4)
isauvar		set	1
DefSiz		set	0
DefPtr		set	0
		endm

OpenDos		macro
		move.l	4,a6
		lea	_Dos(pc),a1
		move.l	#0,d0
		jsr	-552(a6)	;LVOOpenLibrary(a6)
		ifd	STACKVARIABLES
		lea	_DosBase(a4),a0
		endc
		ifnd	STACKVARIABLES
		lea	_DosBase(pc),a0
		endc
		move.l	d0,(a0)
		beq	_cleandoss
		bra	overdosname
_Dos		dc.b	"dos.library",0
		ds.w	0
overdosname
		endm

CloseDos	macro
_cleandoss	move.l	4,a6
		ifd	STACKVARIABLES
		move.l	_DosBase(a4),a1
		endc
		ifnd	STACKVARIABLES
		move.l	_DosBase(pc),a1
		endc
		move.l	a1,d0
		beq	clibz2
		jsr	-414(a6)	;_LVOCloseLibrary(a6)
clibz2		ifd	STACKVARIABLES
		clr.l	_DosBase(a4)
		endc
		ifnd	STACKVARIABLES	
		lea	_DosBase(pc),a0
		clr.l	(a0)
		endc
		endm
			
    IFND EXEC_TYPES_I
EXEC_TYPES_I SET 1

EXTERN_LIB  MACRO
            XREF    _LVO\1
            ENDM

STRUCTURE   MACRO
STRUCTFL	set	1
\1          SET     0	                   * for assembler's sake
SOFFSET     SET     \2
            ENDM

BOOL        MACRO
\1          EQU     SOFFSET
SOFFSET     SET     SOFFSET+2
\1short	
            ENDM

BYTE        MACRO
		ifne	STRUCTFL
\1          EQU     SOFFSET
SOFFSET     SET     SOFFSET+1
\1char
		endc
		ifeq	STRUCTFL
DefSiz		set	DefSiz+2
DefPtr		set	DefPtr-2
\1		set	DefPtr
\1ptr		set	1
\1sw		set	1
		ifne	auto_var
\1auto		set	1
		endc
\1char		set	1
		ifnc	'\2',''
		BYTE	\2,\3,\4,\5,\6,\7,\8
		endc
		endc
            ENDM

UBYTE       MACRO
\1          EQU     SOFFSET
SOFFSET     SET     SOFFSET+1
\1char
            ENDM

WORD        MACRO
\1          EQU     SOFFSET
SOFFSET     SET     SOFFSET+2
\1short
            ENDM

UWORD       MACRO
\1          EQU     SOFFSET
SOFFSET     SET     SOFFSET+2
\1short
            ENDM

USHORT      MACRO
\1          EQU     SOFFSET
SOFFSET     SET     SOFFSET+2
\1short
            ENDM

LONG        MACRO
\1          EQU     SOFFSET
SOFFSET     SET     SOFFSET+4
\1int
            ENDM

ULONG       MACRO
\1          EQU     SOFFSET
SOFFSET     SET     SOFFSET+4
\1int
            ENDM

APTR        MACRO
\1          EQU     SOFFSET
SOFFSET     SET     SOFFSET+4
\1int
            ENDM

CPTR        MACRO
		ifne	STRUCTFL
\1          EQU     SOFFSET
SOFFSET     SET     SOFFSET+4
\1int
		endc
		ifeq	STRUCTFL
DefSiz		set	DefSiz+4
DefPtr		set	DefPtr-4
\1		set	DefPtr
\1ptr		set	1
\1sw		set	1
		ifne	auto_var
\1auto		set	1
		endc
\1int		set	1
		ifnc	'\2',''
		CPTR	\2,\3,\4,\5,\6,\7,\8
		endc
		endc
            ENDM

BPTR		macro
		CPTR	\1
		endm

BSTR		macro
		CPTR	\1
		endm
RPTR        MACRO
\1          EQU     SOFFSET
SOFFSET     SET     SOFFSET+2
\1short
            ENDM

STRUCT      MACRO
\1          EQU     SOFFSET
SOFFSET     SET     SOFFSET+\2
            ENDM

LABEL       MACRO
STRUCTFL	set	0
\1          EQU     SOFFSET
SOFFSET	    SET	    -1
            ENDM

LIBRARY_VERSION EQU     33

BITDEF      MACRO   * prefix,&name,&bitnum
            BITDEF0 \1,\2,B_,\3
\@BITDEF    SET     1<<\3
            BITDEF0 \1,\2,F_,\@BITDEF
            ENDM

BITDEF0     MACRO   * prefix,&name,&type,&value
\1\3\2      EQU     \4
            ENDM

    ENDC EXEC_TYPES_I

				
openlibrary	macro
lbid		set	1
		move.l	4,a6
		lea	100$(pc),a1
		ifc	\2,''
		moveq	#0,d0
		endc
		ifnc	\2,''
		move.l	#\2,d0
		endc
		jsr	-552(a6)	;_LVOOpenLibrary(a6)
		bra	101$
100$		dc.b	\1,0
		ds.w	0
101$
		endm

closelibrary	macro
clid		set	1
		move.l	\1(a4),d0
		beq	102$
		move.l	d0,a1
		move.l	4,a6
		jsr	-414(a6)	;_LVOCloseLibrary(a6)
102$	
		endm 

exit		macro
		moveq	#0,d0
		ifnc	'\1',''
		varin	\1,d0
		endc
		move.l	d0,-4(a4)
		jmp	exitcode(pc)
		ifnd	exitid
exitcode	ifd	_MathffpBase
		closelibrary	_MathffpBase
		endc
		ifd	_IntuitionBase
		closelibrary	_IntuitionBase
		endc
		ifd	_GfxBase
		closelibrary	_GfxBase
		endc
		ifd	_MathffBase
		closelibrary	_MathffBase
		endc
		closelibrary	_DosBase
		unlk	a3
		move.l	-4(a4),d0
		move.l	_stackpoint(a4),sp
		rts
exitid		set	1
		endc
		endm

variables	macro
		ifnd	database
		section	start,code
		jmp	_main
		endc
		ifnd	STACKVARIABLES
STACKVARIABLES
		endc
	section	variables,BSS
DefPtr		set	0
DefSiz		set	0
DefSiz		set	DefSiz+256
DefPtr		set	DefPtr-256
getbuf		set	DefPtr
getbufsw	set	0	
DefSiz		set	DefSiz+256
DefPtr		set	DefPtr-256
argbuf		set	DefPtr
argbufsw	set	0
STRUCTFL	set	0	
structsflag	set	0
switchflag	set	0
defaultflag	set	0
dataareaflag	set	0
auto_var	set	0
elsefl		set	0
iffl		set	0
SOFFSET		set	-1
		CPTR	_SysBase
		CPTR	_D3Base
		CPTR	_DosBase
		CPTR	_MathffpBase
		CPTR	_stdout
		CPTR	_stackpoint
		int	argc
		CPTR	argv7
		CPTR	argv6
		CPTR	argv5
		CPTR	argv4
		CPTR	argv3
		CPTR	argv2
		CPTR	argv1
		CPTR	argv
argv2dm1	set	7
		int	_RandSeed2
		int	_RandSeed
		XDEF	_SysBase
		XDEF	_D3Base
		XDEF	_DosBase
		XDEF	_MathffpBase
		XDEF	_stdout
		XDEF	_stackpoint
		XDEF	argc
		XDEF	argv
		XDEF	_RandSeed2
		XDEF	_RandSeed
		XDEF	getbuf
		endm

nomain		macro
		XREF	_SysBase
		XREF	_D3Base
		XREF	_DosBase
		XREF	_MathffBase
		XREF	_stdout
		XREF	_stackpoint
		XREF	argc
		XREF	argv
		XREF	_RandSeed2
		XREF	_RandSeed
		XREF	varbase
		XREF	getbuf
Allocmnr	set	0
reg_id		set	2
autovar		set	1
mainflag	set	0
isauvar		set	1
elsefl		set	0
iffl		set	0
structsflag	set	0
dataareaflag	set	0
		endm

global		macro
		\1	\2,\3,\4,\5,\6
		XDEF	\2
		ifnc	'\3',''
		XDEF	\3
		endc
		ifnc	'\4',''
		XDEF	\4
		endc
		endm

extern		macro
		XREF	\2
\2sw		set	1
		ifc	'\1','int'
\2int				
		endc
		ifc	'\1','CPTR'
\2int
		endc
		ifc	'\1','short'
\2short
		endc
		ifc	'\1','char'
\2char
		endc
		ifc	'\1','byte'
\2char		
		endc
		ifc	'\1','VOID'
\2vd
		endc
		endm

int		macro
DefSiz		set	DefSiz+4
DefPtr		set	DefPtr-4
\1		set	DefPtr
\1sw		set	1
		ifne	auto_var
\1auto		set	1
		endc
\1int		set	1
		ifnc	'\2',''
		int	\2,\3,\4,\5,\6,\7,\8
		endc
		endm

float		macro
		ifge	SOFFSET
\1		equ	SOFFSET
SOFFSET		set	SOFFSET+4
		endc
		iflt	SOFFSET
DefSiz		set	DefSiz+4
DefPtr		set	DefPtr-4
\1		set	DefPtr
\1sw		set	1
\1int		set	1
		ifne	auto_var
\1auto		set	1
		endc	
		ifnc	'\2',''
		float	\2,\3,\4,\5,\6,\7,\8
		endc
		endc
		endm

short		macro
		ifge	SOFFSET
\1		equ	SOFFSET
SOFFSET		set	SOFFSET+2
		endc
		iflt	SOFFSET
DefSiz		set	DefSiz+2
DefPtr		set	DefPtr-2
\1		set	DefPtr
\1sw		set	1
		ifne	auto_var
\1auto		set	1
		endc
\1short		set	1
		ifnc	'\2',''
		short	\2,\3,\4,\5,\6,\7,\8
		endc
		endc
		endm

char		macro
DefSiz		set	DefSiz+2
DefPtr		set	DefPtr-2
\1		set	DefPtr
\1sw		set	1
		ifne	auto_var
\1auto		set	1
		endc
\1char		set	1
		ifnc	'\2',''
		char	\2,\3,\4,\5,\6,\7,\8
		endc

		endm

register	macro
		ifge	reg_id-7
\2reg		set	1
		ifc	'\1','int'
\2int		set	1
		endc
		ifc	'\1','short'
\2short		set	1
		endc
		ifc	'\1','char'
\2char		set	1
		endc
\2		set	reg_id
reg_id		set	reg_id+1
		endc
		ifle	reg_id-8		;auto variables
\2auto		set	1
		\1	\2
		endc		
		endm

{		macro
		ifeq	auto_var-1
		ifeq	isauvar-1
		link	a3,#-DefSiz
auto_var	set	2	
isauvar		set	1
		endc
		endc
		endm

array		macro
arraysz		set	0
		ifc	'\1','int'
arraysz		set	4
\2int		set	1
		endc
		ifc	'\1','CPTR'
arraysz		set	4
\2int		set	1
		endc
		ifc	'\1','short'
arraysz		set	2
\2short		set	1
		endc
		ifc	'\1','char'
arraysz		set	1
\2char		set	1
		endc
		ifc	'\1','byte'
arraysz		set	1
\2char		set	1
		endc
		ifeq	arraysz
		fail	no_size_of_array
		endc
\2dm1		set	\3
		ifc	'\4',''
\2dm2		set	1
		endc
		ifnc	'\4',''
\2dm2		set	\4
		endc
		ifne	dataareaflag
\2
		endc
		ifeq	dataareaflag
DefSiz		set	DefSiz+(arraysz*\2dm1*\2dm2)
DefPtr		set	DefPtr-(arraysz*\2dm1*\2dm2)
\2		set	DefPtr
\2sw		set	1
		endc
\2dm		set	1
		ifne	auto_var
\2auto		set	1
		endc
		endm

pointer		macro
		ifc	'\2','=&'
		ifc	'\4',''
		ifd	\3sw
		ifnd	\3auto
		lea	\3(a4),a0
		endc
		ifd	\3auto
		lea	\3(a3),a0
		endc
		endc
		ifnd	\3sw
		ifd	\3vd
		lea	\3,a0
		endc
		ifnd	\3vd
		ifd	\3
		lea	\3-database(a5),a0
		endc
		ifnd	\3
pntrid		set	1
		lea	105$(pc),a0
		bra	106$
105$		dc.b	\3,0
		ds.w	0
106$
		endc
		endc
		endc
		ifnd	\1auto
		move.l	a0,\1(a4)
		endc
		ifd	\1auto
		move.l	a0,\1(a3)
		endc
		endc
		ifnc	'\4',''
		ifd	\3auto
		lea	\3(a3),a0
		endc
		ifnd	\3auto
		move.l	#\3,d0
		lea	0(a4,d0.l),a0
		endc
		varin	\4,d0
		ifnc	'\5',''		;var,=&,array,dim1,dim2
		mulu	#\3dm2,d0
		varin	\5,d1
		add.l	d1,d0
		endc
		ifd	\3int
		asl.l	#2,d0
		lea	0(a0,d0.l),a1
		endc
		ifd	\3short
		asl.l	#1,d0
		lea	0(a0,d0.l),a1
		endc
		ifd	\3char
		lea	0(a0,d0.l),a1
		endc
		varinout	a1,\1
		endc
		endc
		ifnc	'\2','=&'
		fail	missing_=&
		endc
		endm

addrin		macro
		ifd	\1sw
		ifnd	\1auto
		ifnd	\1ptr
		lea	\1(a4),\2
		endc
		ifd	\1ptr
		move.l	\1(a4),\2
		endc
		endc
		ifd	\1auto
		ifd	\1ptr
		move.l	\1(a3),\2
		endc
		ifnd	\1ptr
		lea	\1(a3),\2
		endc
		endc
		endc
		ifnd	\1sw
		ifd	\1de
		move.l	#\1,\2
		endc
		ifnd	\1de
		ifd	\1
		lea	\1-database(a5),\2
		endc
		ifnd	\1
		move.l	#\1,\2
		endc
		endc
		endc
		endm

addrtxin	macro
		ifd	\1sw
		ifnd	\1auto
		ifnd	\1ptr
		lea	\1(a4),\2
		endc
		ifd	\1ptr
		move.l	\1(a4),\2
		endc
		endc
		ifd	\1auto
		ifd	\1ptr
		move.l	\1(a3),\2
		endc
		ifnd	\1ptr
		lea	\1(a3),\2
		endc
		endc
		endc
		ifnd	\1sw
		ifd	\1de
		move.l	#\1,\2
		endc
		ifnd	\1de
		ifd	\1
		lea	\1-database(a5),\2
		endc
		ifnd	\1
		
		ifc	"\1","0"
		move.l	#0,\2
		endc
		ifnd	"\1","0"
strids		set	1
		lea	100$(pc),\2
		bra	101$
100$		dc.b	\1,0
		ds.w	0
101$
		endc
		endc
		endc
		endc
		endm

memput		macro
		addrin	\1,a0
		ifc	'\2','='
		varin	\3,d0
		ifd	\3int
		move.l	d0,(a0)
		endc
		ifd	\3short
		move.w	d0,(a0)
		endc
		ifd	\3char
		move.b	d0,(a0)
		endc
		endc
		ifc	'\2','++'
		ifc	'\3','='
		varin	\4,d0
		ifd	\4int
		move.l	d0,(a0)+
		endc
		ifd	\4short
		move.w	d0,(a0)+
		endc
		ifd	\4char
		move.b	d0,(a0)+
		endc
		varinout	a0,\1
		endc
		endc
		endm

peek		macro
		addrin	\3,a0
		ifc	'\4',''
		varin	\1,d0
		ifd	\1int
		move.l	(a0),d0
		endc
		ifd	\1short
		move.w	(a0),d0
		endc
		ifd	\1char
		move.b	(a0),d0
		endc
		endc
		ifc	'\4','++'
		ifc	'\2','='
		ifd	\1int
		move.l	(a0)+,d0
		endc
		ifd	\1short
		move.w	(a0)+,d0
		endc
		ifd	\1char
		move.b	(a0)+,d0
		endc
		varinout	a0,\3
		endc
		endc
		varinout	d0,\1
		endm

varin		macro
		ifd	\1sw
		ifd	\1int
		ifnd	\1auto
		move.l	\1(a4),\2
		endc
		ifd	\1auto
		move.l	\1(a3),\2
		endc
		endc
		ifd	\1short
		ifnd	\1auto
		move.w	\1(a4),\2
		ext.l	\2
		endc
		ifd	\1auto
		move.w	\1(a3),\2
		ext.l	\2
		endc
		endc
		ifd	\1char
		moveq	#0,\2
		ifnd	\1auto
		move.b	\1(a4),\2
		endc
		ifd	\1auto
		move.b	\1(a3),\2
		endc
		endc
		endc
		ifnd	\1sw
		move.l	#\1,\2
		endc
		endm

varinout	macro
		ifd	\2int
		ifnd	\2auto
		move.l	\1,\2(a4)
		endc
		ifd	\2auto
		move.l	\1,\2(a3)
		endc
		endc
		ifd	\2short
		ifnd	\2auto
		move.w	\1,\2(a4)
		endc
		ifd	\2auto
		move.w	\1,\2(a3)
		endc
		endc
		ifd	\2char
		ifnd	\2auto
		move.b	\1,\2(a4)
		endc
		ifd	\2auto
		move.b	\1,\2(a3)
		endc
		endc
		endm

calc		macro
		ifnc	'\2','='
		varin	\1,d0
		ifc	'\2','++'
		addq.l	#1,d0
		endc
		ifc	'\2','--'
		subq.l	#1,d0
		endc
		ifc	'\2','~'
		neg.l	d0
		endc
		varinout	d0,\1
		endc
		ifc	'\2','='
		varin	\3,d0
		ifnc	'\3',''
		ifc	'\4','+'	;add
		varin	\5,d1
		add.l	d1,d0
		endc
		ifc	'\4','-'	;sub
		varin	\5,d1
		sub.l	d1,d0
		endc	
		ifc	'\4','*'	;multibly
		ifc	'\5','cos'
		move.l	d0,-(sp)
		varin	\6,d0
		move.l	_D3Base(a4),a6
		jsr	-30(a6)		;_LVOCosi(a6)
		move.l	(sp)+,d1
		muls.w	d1,d0
		clr.w	d0
		asl.l	#1,d0
		swap	d0
		endc
		ifc	'\5','sin'
		move.l	d0,-(sp)
		varin	\6,d0
		move.l	_D3Base(a4),a6
		jsr	-36(a6)		;_LVOSini(a6)
		move.l	(sp)+,d1
		muls.w	d1,d0
		asl.l	#1,d0
		clr.w	d0
		swap	d0
		endc
		ifc	'\6',''
		varin	\5,d1
		muls32bit	
		endc
		endc
		ifc	'\4','«'
		varin	\5,d1
		asl.l	d1,d0
		endc
		ifc	'\4','»'
		varin	\5,d1
		asr.l	d1,d0
		endc	
		ifc	'\4','|'
		varin	\5,d1
		or.l	d1,d0
		endc
		ifc	'\4','&'
		varin	\5,d1
		and.l	d1,d0
		endc
		ifc	'\4','/'	;divice
		varin	\5,d1
		divs32bit
		endc
		ifc	'\4','%'
		varin	\5,d1
		mod32bit
		endc
		endc
		varinout	d0,\1
		endc
		endm

swap		macro
		varin	\1,d0
		varin	\2,d1
		varinout	d1,\1
		varinout	d0,\2
		endm

muls32bit	macro
		jsr	muls32code(pc)
		ifnd	_muls32bitt
		bra	overmuls32bitt
muls32code	move.l	d0,d2
		eor.l	d1,d2			;plus or neg
		tst.l	d0
		bpl	50$
		neg.l	d0
50$		tst.l	d1
		bpl	51$
		neg.l	d1
51$		movem.l	d0/d1,-(sp)
		mulu	(sp),d1			;ah*bl
		mulu	4(sp),d0		;al*bh
		add.l	d1,d0
		swap	d0			;(ah*bl)+(al*bh)
		clr.w	d0
		move.w	6(sp),d1
		mulu.w	2(sp),d1
		add.l	d1,d0
		lea	8(sp),sp		;return stack
		tst.l	d2
		bpl	52$
		neg.l	d0
52$		rts
_muls32bitt	equ	1
overmuls32bitt
		endc
		endm

divs32bit	macro
		jsr	divs32bitcode(pc)
		ifnd	_divs32bit
		bra	divs32cont
divs32bitcode	movem.l	d2-d5/d7,-(sp)
		move.l	d1,d5
		beq	55$
		eor.l	d0,d5
		tst.l	d0
		bpl	56$
		neg.l	d0
56$		tst.l	d1
		bpl	57$
		neg.l	d1
57$		move.l	d1,d3			;subsract
		move.l	d1,d4
		subq.l	#1,d4
		moveq	#31,d7			;divice	by ten
		moveq	#0,d2
		moveq	#0,d1
53$		roxl.l	#1,d0
		roxl.l	#1,d1
		cmp.l	d4,d1
		bls	54$
		bset.l	d7,d2
		sub.l	d3,d1
54$		dbf	d7,53$
		move.l	d2,d0			;result
		tst.l	d5
		bpl	55$
		neg.l	d0
55$		movem.l	(sp)+,d2-d5/d7
		rts
_divs32bit	equ	1
divs32cont
		endc
		endm
	
mod32bit	macro
		divs32bit
		move.l	d1,d0
		endm

arrayset	macro
		ifc	'\2','='
		ifnd	\3sw
		lea	\3-database(a5),a0
		endc
		ifd	\3sw
		ifd	\3auto
		lea	\3(a3),a0
		endc
		ifnd	\3auto
		move.l	#\3,d0
		lea	0(a4,d0.l),a0
		endc
		endc
		varin	\4,d0
		ifnc	'\5',''		;v!r,=,array,dim1,dim2
		mulu	#\3dm1,d0
		varin	\5,d1
		add.l	d1,d0
		endc
		ifd	\3int
		asl.l	#2,d0
		ifnd	\1auto
		move.l	0(a0,d0.l),\1(a4)
		endc
		ifd	\1auto
		move.l	0(a0,d0.l),\1(a3)
		endc
		endc
		ifd	\3short
		asl.l	#1,d0
		ifnd	\1auto
		move.w	0(a0,d0.l),\1(a4)
		endc
		ifd	\1auto
		move.w	0(a0,d0.l),\1(a3)
		endc
		endc
		ifd	\3char
		ifnd	\1auto
		move.b	0(a0,d0.l),\1(a4)
		endc
		ifd	\1auto
		move.b	0(a0,d0.l),\1(a3)
		endc
		endc
		endc
		ifnc	'\2','='	;array,dim1,dim2,=,var
		ifnd	\1sw
		lea	\1-database(a5),a0
		endc
		ifd	\1sw
		ifd	\1auto
		lea	\1(a3),a0
		endc
		ifnd	\1auto
		move.l	#\1,d0
		lea	0(a4,d0.l),a0
		endc
		endc
		varin	\2,d0
		ifnc	'\3','='
		mulu	#\1dm1,d0
		varin 	\3,d1
		add.l	d1,d0
		varin	\5,d1
		endc
		ifc	'\3','='
		varin	\4,d1
		endc
		ifd	\1int
		asl.l	#2,d0
		move.l	d1,0(a0,d0.l)
		endc
		ifd	\1short
		asl.l	#1,d0
		move.w	d1,0(a0,d0.l)
		endc
		ifd	\1char
		move.b	d1,0(a0,d0.l)
		endc
		endc
		endm

complong	macro
		varin	\1,d0
		varin	\3,d1
		cmp.l	d1,d0
		endm

while		macro
_Branch\4
		ifnc	'\1','strcmp'
		complong	\1,\2,\3
		whilecmp	\2,\4
		endc
		ifc	'\1','strcmp'
		strcmp	\2,\3
		varin	\5,d1
		cmp.l	d1,d0
		whilecmp	\4,\6
		endc
		endm

whilecmp	macro
		ifc	'\1','=='
		bne	Branch\2
		endc
		ifc	'\1','!='
		beq	Branch\2
		endc
		ifc	'\1','»'
		blt	Branch\2
		endc
		ifc	'\1','»='
		ble	Branch\2
		endc
		ifc	'\1','«'
		bgt	Branch\2
		endc
		ifc	'\1','«='
		bge	Branch\2
		endc
		endm


}		macro
		ifeq	dataareaflag
		ifeq	structsflag
		ifc	'\1',''
		ifeq	iffl
		ifeq	elsefl
		ifeq	mainflag-1
		ifd	_MathffpOpnc
_nomathffplib	move.l	_MathffpBase(a4),d0
		beq	5736$
		move.l	d0,a1
		move.l	4,a6
		jsr	-414(a6)	;_LVOCloseLibrary(a6)
		endc
5736$		CloseDos
		ifeq	auto_var-2
		unlk	a3
auto_var	set	0
		endc
		rts
mainflag	set	0
		endc
		ifeq	mainflag
		ifeq	auto_var-2
		unlk	a3
auto_var	set	0
		endc
		rts
		endc
		endc
		endc
		endc
		ifnc	'\1',''
		ifeq	switchflag
		bra	_Branch\1
Branch\1
		endc
		ifne	switchflag
breaklabels\1
		add.l	#4,sp
switchflag	set	switchflag-1
		endc
		endc
		endc
		endc
		ifeq	structsflag
		ifeq	dataareaflag-1
dataareaflag	set	0
		endc
		endc
		ifne	structsflag
structsflag	set	0
		endc
		endm

func		macro
		\3	\4,\5,\6,\7,\8,\9,\10,\11,\12
		ifnd	\1sw
		unknown_variable
		endc
		varinout	d0,\1
		endm						

else		macro
		bra	elsestop\1
ifstop\1
elsefl		set	elsefl+1
		endm
		
ifend		macro
		ifd	ifstop\1
elsestop\1
elsefl		set	elsefl-1
		endc
		ifnd	ifstop\1
ifstop\1
		endc
iffl		set	iffl-1
		endm

if		macro
		ifnc	'\1','strcmp'
		complong	\1,\2,\3
		ifcomp		\2,\4
		endc
		ifc	'\1','strcmp'
		strcmp	\2,\3
		varin	\5,d1
		cmp.l	d1,d0
		ifcomp	\4,\6
		endc
iffl		set	iffl+1
		endm

ifcomp		macro
		ifc	'\1','=='
		bne	ifstop\2
		endc
		ifc	'\1','!='
		beq	ifstop\2
		endc
		ifc	'\1','«'
		bgt	ifstop\2
		endc
		ifc	'\1','«='
		bge	ifstop\2
		endc
		ifc	'\1','»'
		blt	ifstop\2
		endc
		ifc	'\1','»='
		ble	ifstop\2
		endc
		endm

structput	macro
		ifc	'\2','=&'		;var,=&,
		ifc	'\4','->'		;var,=&,var1,->,
		addrin	\3,a0
		lea	\5(a0),a0
		endc
		ifc	'\4','.'		;var,=&,base,.,
		lea	\3+\5-database(a5),a0
		endc	
		varinout	a0,\1
		endc	
	
		ifc	'\2','='		1
		ifnd	\5
		fail	no_\5
		endc
		ifc	'\4','.'		;var,=,base,.,
		lea	\3-database(a5),a0
		endc	

		ifc	'\4','->'		
		ifnd	\3auto
		move.l	\3(a4),a0
		endc				3
		ifd	\3auto
		move.l	\3(a3),a0
		endc
		endc

		moveq	#0,d0
		ifd	\5char			3
		move.b	\5(a0),d0
		endc				3
		ifd	\5short			3
		move.w	\5(a0),d0
		endc				3
		ifd	\5int			3
		move.l	\5(a0),d0
		endc				3
		varinout	d0,\1
		endc
		ifc	'\4','=&'
		ifnd	\3
		fail	no_\3
		endc		
		ifd	\5vd
		lea	\5,a1
		endc
		ifnd	\5vd
		addrin	\5,a1			base1,.,member,=&,base2
		endc
		ifc	'\2','.'
		lea	\1-database(a5),a0
		endc
		ifc	'\2','->'
		addrin	\1,a0
		endc
		move.l	a1,\3(a0)
		endc

		ifc	'\4','='
		ifnd	\3
		fail	no_\3
		endc
		ifnc	'\6',''		1
		ifc	'\6','.'		2
		lea	\5-database(a5),a1
		endc				2
		ifc	'\6','->'		
		ifnd	\5auto
		move.l	\5(a4),a1
		endc
		ifd	\5auto
		move.l	\5(a3),a1
		endc
		endc

		ifc	'\2','.'
		lea	\1-database(a5),a0
		endc				5
		ifc	'\2','->'
		ifnd	\1auto
		move.l	\1(a4),a0
		endc
		ifd	\1auto
		move.l	\1(a3),a0
		endc
		endc

		ifd	\7char			5
		move.b	\7(a1),\3(a0)
		endc				5
		ifd	\7short			5
		move.w	\7(a1),\3(a0)
		endc				5
		ifd	\7int			5
		move.l	\7(a1),\3(a0)
		endc				5
		endc

		ifc	'\6',''			4
		ifc	'\2','.'			6
		lea	\1-database(a5),a0
		endc				6
		ifc	'\2','->'			6
		addrin	\1,a0
		endc		

		ifd	\5sw
		ifd	\3char			6
		ifnd	\5auto
		move.b	\5(a4),\3(a0)
		endc
		ifd	\5auto
		move.b	\5(a3),\3(a0)
		endc
		endc	

		ifd	\3short			6
		ifnd	\5auto
		move.w	\5(a4),\3(a0)
		endc
		ifd	\5auto
		move.w	\5(a3),\3(a0)
		endc
		endc	

		ifd	\3int			6
		ifnd	\5auto
		move.l	\5(a4),\3(a0)
		endc
		ifd	\5auto
		move.l	\5(a3),\3(a0)
		endc
		endc				6
		endc

		ifnd	\5sw					6
		ifd	\3char			6
		move.b	#\5,\3(a0)
		endc				6
		ifd	\3short			6
		move.w	#\5,\3(a0)
		endc				6
		ifd	\3int			6
		move.l	#\5,\3(a0)
		endc				6
		endc				5
		endc
		endc
		endm

structset	macro
		ifc	'\2',''
structsflag	set	1
		endc
\1
\1_ids		set	1
		ifnc	'\2',''
	ds.b	\2		;size of structure
		endc
		endm

sb		macro
		dc.b	\1
		ifnc	'\2',''
		sb	\2,\3,\4,\5,\6,\7,\8
		endc
		endm


sw		macro
		dc.w	\1
		ifnc	'\2',''
		sw	\2,\3,\4,\5,\6,\7,\8
		endc
		endm


sl		macro
		dc.l	\1
		ifnc	'\2',''
		sl	\2,\3,\4,\5,\6,\7,\8
		endc
		endm


sa		macro
		dc.l	\1
		ifnc	'\2',''
		sa	\2,\3,\4,\5,\6,\7,\8
		endc
		endm

varstack	macro
		ifd	\1int
stvar		set	stvar-4
		move.l	d0,stvar(sp)
		endc
		ifd	\1short
stvar		set	stvar-2
		move.w	d0,stvar(sp)
		endc
		ifd	\1char
stvar		set	stvar-2
		move.b	d0,stvar(sp)
		endc
		ifnd	\1sw
stvar		set	stvar-4
		move.l	d0,stvar(sp)
		endc
		endm
		

ROUTINE		macro
		ifnc	'\2','='
		routdo	\1,\2,\3,\4,\5,\6,\7,\8
		endc
		ifc	'\2','='
		routdo	\3,\4,\5,\6,\7,\8,\9,\10
		varinout	d0,\1
		endc
		endm

routdo		macro
stvar		set	-8
		movem.l	d2-d7/a3,-(sp)
		ifnc	'\2',''
		varin	\2,d0
		varstack	\2
		endc
		ifnc	'\3',''
		varin	\3,d0
		varstack	\3
		endc
		ifnc	'\4',''
		varin	\4,d0
		varstack	\4
		endc
		ifnc	'\5',''
		varin	\5,d0
		varstack	\5
		endc
		ifnc	'\6',''
		varin	\6,d0
		varstack	\6
		endc
		ifnc	'\7',''
		varin	\7,d0
		varstack	\7
		endc
		ifnc	'\8',''
		varin	\8,d0
		varstack	\8
		endc
		ifd	\1sw		;address from variables	
		addrin	\1,a0
		jsr	(a0)
		endc
		ifnd	\1sw		;subroutine
		ifd	\1vd
		XREF	\1
		jsr	\1
		endc
		ifnd	\1vd
		jsr	\1(pc)
		endc
		endc
		movem.l	(sp)+,d2-d7/a3
		endm

VOID		macro
		ifnd	_main
		nomain
		endc
\1
		XDEF	\1
reg_id		set	2
auto_var	set	1
DefSiz		set	0
DefPtr		set	0
		move.l	varbase,a4
		move.l	4(a4),a5
		endm

return		macro
		varin	\1,d0
		unlk	a3
		rts
		endm

Voidaddress	macro
		lea	\2(pc),a0
		ifnd	\1auto
		move.l	a0,\1(a4)
		endc
		ifd	\1auto
		move.l	a0,\1(a3)
		endc
		endm

#define		macro
		ifnd	\1
\1		equ	\2
		endc
\1de		set	1
		endm

switch		macro
		varin	\1,d0
		move.l	d0,-(sp)
		
switchflag	set	switchflag+1
		endm

case		macro
		move.l	#\1,d0
		cmp.l	(sp),d0
		bne	caselabels\2
		endm

break		macro
		ifeq	defaultflag
		bra	breaklabels\2
caselabels\1
		endc
		ifne	defaultflag
defaultflag	set	0
		endc
		endm

default		macro
defaultflag	set	1
		endm

DATAAREA	macro		
		section	start,CODE
		jmp	_main
		ifc	'\1',''
		section	struct,DATA
		endc
		ifnc	'\1',''
		section	struct,DATA,\1
		endc
database	

dataareaflag	set	1
		endm

LongRnd		macro
		movem.l	d2/d3,-(sp)	
		movem.l	_RandSeed(a4),d0/d1	D0=LSB's, D1=MSB's of random number
		andi.b	#$0E,d0		ensure upper 59 bits are an...
		ori.b	#$20,d0		...odd binary number
		move.l	d0,d2
		move.l	d1,d3
		add.l	d2,d2		accounts for 1 of 17 left shifts
		addx.l	d3,d3		[D2/D3] = RND*2
		add.l	d2,d0
		addx.l	d3,d1		[D0/D1] = RND*3
		swap	d3		shift [D2/D3] additional 16 times
		swap	d2
		move.l	d2,d3
		clr.w	d2
		add.l	d2,d0		add to [D0/D1]
		addx.l	d3,d1
		movem.l	d0/d1,_RandSeed(a4)	save for next time through
		move.l	d1,d0		most random part to D0
		movem.l	(sp)+,d2/d3
		endm
		
RandSeed	macro
		varin 	\1,d0
		add.l	d0,d1
		movem.l	d0/d1,_RandSeed(a4)
		endm

Random		macro
		varin 	\1,d0
		jsr	_Random(pc)
		ifnd	_Randoms
		bra	randomover
_Random				
		tst.l	d0
		beq	zerornd		range of 0 returns 0 always
		move.l	d0,d2
		LongRnd			get a longword random number
		move.l	d2,d1
		divs32bit		divide by range...
		move.l	d1,d0		a remainder
zerornd		rts
_Randoms		set	1
randomover
		endc
		endm


