»·······T·······T·······T·······T·······T·······T·······T·······T·······T·····T

;NOTE: A4 IS USED INTERNALLY IN TRASH'M-ONE AND MAY ONLY BE USED IF IT IS 
;      RESTORED..

******* MACROS FOR EXTERN ASSEMBLER *******

;D7 FLAG

AF_OPTIMIZE=	0
AF_BRATOLONG=	1
AF_UNDEFVALUE=	2
AF_BSS_AREA=	3
AF_BYTE_STRING=	4
AF_MACRO_END=	6
AF_FINISHED=	7
AF_LOCALFOUND=	8
AF_LABELCOL=	9
AF_MACROS_OFF=	10
AF_GETLOCAL= 	11
AF_EXTERN_ASM=	12
AF_PASSONE=	15
AF_SEMICOMMENT=	25
AF_OFFSET=	26
AF_OFFSET_A4=	27
AF_ALLERRORS=	28
AF_LISTFILE=	29
AF_DEBUG1=	30
AF_IF_FALSE=	31


GET:			MACRO			GET NEXT WORD TO CHECK
			MOVE.W	(A3)+,D0
			AND.W	D4,D0
			ENDM
CXD:			MACRO			CHECK WORD AND JUMP SHORT
			CMP.W	#\1,D0
			BEQ.\0	\2
			ENDM
ECXD:			MACRO			CHECK END WORD AND JUMP SHORT
			CMP.W	#\1+$8000,D0
			BEQ.\0	\2
			ENDM
CXDS:			MACRO			CHECK BYTE AND JUMP SHORT
			CMP.W	#\1<<8,D0
			BEQ.\0	\2
			ENDM
ECXDS:			MACRO			CHECK END BYTE AND JUMP SHORT
			CMP.W	#\1<<8+$8000,D0
			BEQ.\0	\2
			ENDM
NOCXD:			MACRO			IF NO COMMAND IS FOUND.
			MOVE.L	(SP)+,(SP)
			RTS
			ENDM
ERROR			MACRO			OUTPUT ERROR
			LEA	.\@,A0
			BRA.W	REP_ERROR
.\@			DC.B	\1,0
			EVEN
			ENDM
NEXTKOMMA		MACRO			GOTO NEXT "," , 
			BSR	PARSE_GET_KOMMA	IF NO KOMMA IS THERE
;						IT WILL DISPLAY
;						"ILLEGAL OPERAND"
			ENDM
CXDRTS			MACRO			USED INSTEAD OF RTS
			ADDQ.W	#4,SP
			RTS
			ENDM
SENDBYTE		MACRO			$XX
			BSR.\0	SND1B
			ENDM
SENDBYTESIGNED		MACRO			$xx	  XREF
			BSR.\0	SND1BS
			ENDM
SENDBYTEUNSIGNED	MACRO			$xx	  XREF
			BSR.\0	SND1BUN
			ENDM
SEND2BYTEUNSIGNED	MACRO			$00xx	  XREF
			BSR.\0	SND2BUN
			ENDM
SENDWORD		MACRO			$xxxx
			BSR.\0	SND1W
			ENDM
SENDWORDSIGNED		MACRO			$xxxx	  XREF
			BSR.\0	SND1WS
			ENDM
SENDWORDUNSIGNED	MACRO			$xxxx	  XREF
			BSR.\0	SND1WUN
			ENDM
SENDLONG		MACRO			$xxxxxxxx
			BSR.\0	SND1L
			ENDM
SENDLONGRELOC		MACRO			$xxxxxxxx RELOC
			BSR.\0	SND1LR
			ENDM
SENDBEGIN		MACRO
			BSR.W	ASKIP
			ENDM
SENDEND			MACRO
			BSR.W	AINSERT
			ENDM
NEXTSYMBOL		MACRO
			BSR.W	NSYMBOL
			ENDM
NS_AVALUE=$61		;RETURN VALUE FOR NEXTSYMBOL(D1) IF GOT A VALUE
NS_ALABEL=$62		;RETURN VALUE FOR NEXTSYMBOL(D1) IF GOT A LABEL
			;USE NEXT LABEL TO GET THE VALUE(D3)
NEXTSYMBOLBUFFER	MACRO
			SUBQ.W	#4,SP
			BSR.W	NSYMBOLBUFFER
			MOVE.L	(SP)+,\1
			ENDM
INCDIRBUFFER		MACRO
			SUBQ.W	#4,SP
			BSR.W	INCDIRBUF
			MOVE.L	(SP)+,\1
			ENDM
INPUTBUFFER		MACRO
			SUBQ.W	#4,SP
			BSR.W	INPUTBUF
			MOVE.L	(SP)+,\1
			ENDM
RESERVECODE		MACRO
			MOVE.L	\1,D0
			JSR	RESERVE
			MOVE.L	D0,\2
			ENDM
NEXTLABEL		MACRO
			BSR.W	NLABEL
			ENDM
GETVALUE		MACRO			GET STRINGS VALUE
			BSR.W	GET_VALUE
			ENDM
GETADDR			MACRO
			BSR.W	GET_ADDR
			ENDM
GETLABEL		MACRO
			BSR	GETLABELVAL
			ENDM

;	MOVE.L	INSTRUCTION_DATA_FIELD_PTR(A4),D0
;	MOVE.L	CURRENT_ABS_ADDRESS,D1			ONLY IN PASS2
;	MOVE.W	CURRENT_SECTION(A4),D2

ASMHEAD	MACRO
	MOVEQ	#0,D0
	RTS

STARTOFASSEMBLER
	ILLEGAL
	DC.L	STARTOFASSEMBLER
	DC.L	\3
	DC.L	$80000900
	DC.L	.ASMNAME
	DC.L	.ASMVERSION
	DC.L	.ASMNODELIST
.ASMNAME
	DC.B	'\4.assembler',0	;Assembler name must be the same as
					;saved and in lower case
	DC.B	'$VER: '
.ASMVERSION
	DC.B	\5,0
	EVEN

.ASMNODELIST
	DC.L	$2A
	DC.L	.ASMNODELIST1
	DC.L	0
	DC.L	.0

.0	EXG	D0,A5
	MOVE.L	A6,$22(A5)
	MOVE.L	A0,$26(A5)
	MOVE.W	#$1D,$16(A5)
	EXG	D0,A5
	RTS

.ASMNODELIST1
	DC.L	.INSTALLASSEMBLER	Don't change
	DC.L	.REMOVEASSEMBLER	Don't change
	DC.L	.EXIT			Don't change
	DC.L	.EXIT			Don't change
	DC.L	INITTRASH		Don't Change
	DC.L	INITASSEMBLER		Don't Change
	DC.L	INITASSEMBLER2		Don't Change
	DC.L	.RESERVED
	DC.L	.RESERVED
	DC.L	.RESERVED
	DC.L	.RESERVED
	DC.L	.RESERVED
	DC.L	.RESERVED
	DC.L	.RESERVED
	DC.L	.RESERVED
	DC.L	.RESERVED
	DC.L	.RESERVED
	DC.L	.RESERVED
	DC.L	-1

.RESERVED
	rts

.EXIT	MOVEQ	#0,D0
	RTS

.INSTALLASSEMBLER
	ADDQ.W	#1,$20(A6)
	MOVE.L	A6,D0
	;START UP PROCEDURE
	RTS

.REMOVEASSEMBLER
	SUBQ.W	#1,$20(A6)
	BNE.S	.End
	MOVEM.L	D2/A5/A6,-(SP)
	MOVEA.L	A6,A5
	MOVE.L	$26(A5),D2
	MOVEA.L	A5,A1
	MOVEA.L	(A1)+,A0
	MOVEA.L	(A1),A1
	MOVE.L	A0,(A1)
	MOVE.L	A1,4(A0)
	MOVEA.L	$22(A5),A6
	MOVEA.L	A5,A1
	MOVEQ	#0,D0
	MOVE.W	$10(A5),D0
	SUBA.L	D0,A1
	ADD.W	$12(A5),D0
	JSR	-$D2(A6)
	MOVE.L	D2,D0
	MOVEM.L	(SP)+,D2/A5/A6
.End	RTS

******* LIBRARY HEADER FOR EXTERN ASSEMBLER *******

INITTRASH	MOVE.L	#\1,D0
		MOVE.L	#\2,D1
		RTS
INITASSEMBLER	MOVE.L	D0,REP_ERROR+2
		MOVE.L	D1,GET_VALUE+2
		MOVE.L	D2,PARSE_GET_KOMMA+2
		MOVE.L	D3,SND2BUN+2
		MOVE.L	D4,SND1BUN+2
		MOVE.L	D5,SND1B+2
		MOVE.L	D6,SND1BS+2
		MOVE.L	D7,SND1WS+2
		MOVE.L	A0,SND1WUN+2
		MOVE.L	A1,SND1W+2
		MOVE.L	A2,SND1L+2
		MOVE.L	A3,SND1LR+2
		MOVE.L	A4,ASKIP+2
		MOVE.L	A5,AINSERT+2
		RTS
INITASSEMBLER2	MOVE.L	D0,NSYMBOL+2
		MOVE.L	D1,NSYMBOLBUFFER+2
		MOVE.L	D2,NLABEL+2
		MOVE.L	D3,GET_ADDR+2
		MOVE.L	D4,GETLABELVAL+2
		MOVE.L	D5,INCDIRBUF+2
		MOVE.L	D6,PRINTTEXT+2
		MOVE.L	D7,DOSBASE
		MOVE.L	A0,INPUTBUF+2
		MOVE.L	A1,RESERVE+2
		MOVE.L	A2,PRINTLENGTH+2
		RTS


******* CODE FOR EXTERN ASSEMBLER ******

CHK68000	MOVE.L	(SP)+,(SP)
		RTS
REP_ERROR	JMP	$00000000.L
GET_VALUE	JMP	$00000000.L
PARSE_GET_KOMMA	JMP	$00000000.L
SND2BUN		JMP	$00000000.L
SND1BUN		JMP	$00000000.L
SND1B		JMP	$00000000.L
SND1BS		JMP	$00000000.L
SND1WS		JMP	$00000000.L
SND1WUN		JMP	$00000000.L
SND1W		JMP	$00000000.L
SND1L		JMP	$00000000.L
SND1LR		JMP	$00000000.L
ASKIP		JMP	$00000000.L
AINSERT		JMP	$00000000.L
NLABEL		JMP	$00000000.L
NSYMBOL		JMP	$00000000.L
GET_ADDR	JMP	$00000000.L
GETLABELVAL	JMP	$00000000.L
PRINTTEXT	JMP	$00000000.L
NSYMBOLBUFFER	MOVE.L	#$0,4(SP)
		RTS
INCDIRBUF	MOVE.L	#$0,4(SP)
		RTS
INPUTBUF	MOVE.L	#$0,4(SP)
		RTS
RESERVE		JMP	$00000000.L
PRINTLENGTH	JMP	$00000000.L
DOSBASE		DS.L	1
		ENDM
