 INCLUDE "exec/types.i"
 INCLUDE "rexx/rxslib.i"

MSGBUFSIZE equ 18

	XDEF @DoMsg

	XREF ___ctype
	XREF _RexxSysBase
	XREF __CXM33
	XREF _LVOReplyMsg
	XREF _AbsExecBase

	SECTION DoMsg,CODE

; this code is the dispatcher for ARexx messages.  It has been moved
; to assembly to allow use of registerized parameters and to optimize it by
; hand a bit.  It takes as its arguments:
;
;	A0 = pointer to ARexx message
;	A1 = pointer to CmdTbl
;	D0 = Number of ARexx commands
;	D1 = BringerDown flag

@DoMsg
	link	a5,#-MSGBUFSIZE-4
	movem.l	d5-d7/a2-a3/a6,-(sp)

	movea.l a0,a3
	movea.l	a1,a2
	move.l	d0,d7
	move.l	d1,d6

	movea.l	_RexxSysBase(a4),a6
	jsr	_LVOIsRexxMsg(a6)
	tst.l	d0
	beq.w	DMAcleanup

2$	moveq	#20,d0
	move.l	d0,rm_Result1(a3)
	clr.l	rm_Result2(a3)

	tst.w	d6	; BringerDown ?
	beq.s	3$

	moveq	#22,d0
	move.l	d0,rm_Result1(a3)
	bra.w	DMAcleanup

3$	lea	-(MSGBUFSIZE+4)(a5),a0
	movea.l	rm_Args(a3),a1
	moveq	#MSGBUFSIZE,d0
	jsr	_LVOStrcpyU(a6)

	moveq	#0,d6
4$	cmp.l	d7,d6
	bge.s	5$

	move.l	d6,d0
	moveq	#$0e,d1
	jsr	__CXM33(pc)
	move.w	00(a2,d0.l),d1
	ext.l	d1
	lea	-(MSGBUFSIZE+4)(a5),a0
	movea.l	02(a2,d0.l),a1
	move.l	d1,d0
	jsr	_LVOStrcmpN(a6)
	tst.l	d0
	beq.s	5$
	addq.l	#1,d6
	bra.s	4$

5$	cmp.l	d7,d6
	bge.w	DMAcleanup

	move.l	d6,d0
	moveq	#$0e,d1
	jsr	__CXM33(pc)
	move.l	d0,d7
	movea.l	rm_Args(a3),a1
	adda.w	00(a2,d7.l),a1
	lea	1(a1),a1
	movem.l	a1,-4(a5)

	move.w	6(a2,d7.l),d1
	cmpi.b	#3,d1
	bne.s	6$

	movea.l	a3,a0
	movea.l	10(a2,d7.l),a1
	jsr	(a1)
	bra.s	DMAreturn

6$	cmpi.b	#2,d1
	bne.s	7$

	movem.l	-4(a5),a0
	jsr	_LVOCVa2i(a6)
	movea.l	10(a2,d7.l),a1
	jsr	(a1)
	bra.s	DMAreturn

7$	cmpi.b	#1,d1
	bne.s	9$

	movem.l	-4(a5),a0
	lea	___ctype+1(a4),a1
	moveq	#8,d5
8$	move.b	(a0),d0
	ext.w	d0
	ext.l	d0
	move.b	0(a1,d0.l),d0
	ext.w	d0
	ext.l	d0
	and.l	d5,d0
	beq.s	9$
	addq.l	#1,a0
	bra.s	8$
9$	movea.l	10(a2,d7.l),a1
	jsr	(a1)

DMAreturn
	move.w	8(a2,d7.l),d1
	cmpi.b	#2,d1
	bne.s	1$

	move.l	d0,rm_Result1(a3)
	bra.s	DMAcleanup

1$	cmpi.b	#1,d1
	beq.s	2$
	cmpi.b	#3,d1
	bne.s	5$

2$	btst	#1,rm_Action+1(a3)
	bne.b	3$

	cmpi.b	#3,d1
	bne.s	6$

	movea.l	d0,a0
	jsr	_LVODeleteArgstring(a6)

6$	moveq	#21,d0
	move.l	d0,rm_Result1(a3)
	bra.s	DMAcleanup

3$	movea.l	d0,a0
	cmpi.b	#3,d1
	beq.s	4$

	move.l	a0,d0
	beq.s	44$

	jsr	_LVOStrlen(a6)
44$	jsr	_LVOCreateArgstring(a6)
4$	move.l	a0,rm_Result2(a3)

5$	clr.l	rm_Result1(a3)

DMAcleanup
	movea.l	a3,a1
	movea.l	_AbsExecBase.w,a6
	jsr	_LVOReplyMsg(a6)

	movem.l	(sp)+,d5-d7/a2-a3/a6
	unlk	a5
	rts

	END
