; AGAiff
; Include > arexx.s
*** ARexx Server Code totally rewritten
*** on 08-06-95
*** Translated C code from Amiga-Plus 1/94
* 11-May-96: Bug: ParseRexxMsg: Empty fields were marked with 0 in 4(a2), not with -1!

InitARexx	tst.l	rxsbase-j(a5)
		bne.s	.0
		moveq	#0,d0
		rts

.0		move.l	4.w,a6
		LIBCALL	CreateMsgPort
		move.l	d0,ARexxPort-j(a5)
		beq	noarexxport
		move.l	d0,a1
		move.b	MP_SIGBIT(a1),Signal.arexx-j(a5)
		move.l	#ARexxPortName,LN_NAME(a1)
		LIBCALL	AddPort

		lea	rx_Startupname(pc),a3	* Startup script
		moveq	#rx_Startupnamel,d3

CallARexxScript	; a3 *scriptname
		; d3 scriptnamelength
		move.l	rxsbase(pc),a6
		move.l	ARexxPort(pc),a0
		lea	rx_ext(pc),a1
		lea	ARexxPortName(pc),a2
		LIBCALL	CreateRexxMsg
		move.l	d0,d6
		beq.s	noarexxport

		move.l	d6,a2
		move.l	#RXCOMM,rm_Action(a2)
		move.l	rxsbase(pc),a6
		move.l	a3,a0
		move.l	d3,d0
		LIBCALL	CreateArgstring
		move.l	d0,rm_Args(a2)
		beq.s	.keinargstring

		bsr	PutRexxMsg
		tst.w	d0
		beq.s	.noserver
		addq.w	#1,rx_ownmsgs-j(a5)
		rts

.noserver	move.l	rm_Args(a2),a0
		move.l	rxsbase(pc),a6
		LIBCALL	DeleteArgstring

.keinargstring	move.l	d6,a0
		LIBCALL	DeleteRexxMsg
noarexxport	moveq	#0,d0
		rts

ARexxPort	dc.l	0
ARexxPortName	dc.b	"AGAIFF_REXX",0
rx_ext	dc.b	"agaiff",0
ServerPortName	dc.b	"REXX",0
rx_Startupname dc.b	"Startup",0
rx_Startupnamel equ	*-rx_Startupname-1
		even

PutRexxMsg	; d6 *RexxMsg
		move.l	4.w,a6
		LIBCALL	Forbid
		lea	ServerPortName(pc),a1
		LIBCALL	FindPort
		tst.l	d0
		beq.s	.noserver
		move.l	d0,a0
		move.l	d6,a1
		LIBCALL	PutMsg
		addq.w	#1,rx_msgsout-j(a5)
		LIBCALL	Permit
		clr.l	gad14t+4-j(a5)
		moveq	#-1,d0
		rts
.noserver	LIBCALL	Permit
		moveq	#0,d0
		rts

KickARexx	tst.l	rxsbase-j(a5)
		beq.s	.0

		move.l	ARexxPort(pc),d2
		beq.s	.0

		move.l	4.w,a6
		move.l	d2,a1
		LIBCALL	RemPort
		st	Signal.arexx-j(a5)
		move.l	d2,a0
		LIBCALL	DeleteMsgPort
.0		rts

EvalARexxMessage
		move.l	4.w,a6
		move.l	ARexxPort(pc),a0
		LIBCALL	GetMsg
		move.l	d0,rx_curmsg-j(a5)
		beq.s	.ende

		move.l	d0,a2
		move.b	LN_TYPE(a2),d0
		cmp.b	#NT_MESSAGE,d0
		beq	rx_MESSAGE
		cmp.b	#NT_REPLYMSG,d0
		beq	rx_REPLYMSG

		move.l	a2,a1		;wrong type
		LIBCALL	ReplyMsg
		bra	EvalARexxMessage
.ende		rts

rx_REPLYMSG	subq.w	#1,rx_msgsout-j(a5)
		move.l	rm_Args+(MAXRMARG*4)(a2),d0
		beq.s	.0
		clr.l	rm_Args+(MAXRMARG*4)(a2)
		move.l	4.w,a6
		move.l	d0,a1
		LIBCALL	ReplyMsg
		bra.s	.1
.0		move.l	rm_Args(a2),a0
		move.l	rxsbase(pc),a6
		LIBCALL	DeleteArgstring

.1		move.l	a2,a0
		move.l	rxsbase(pc),a6
		LIBCALL	DeleteRexxMsg
		bra	EvalARexxMessage

rx_MESSAGE	move.l	rxsbase(pc),a6
		move.l	a2,a0
		LIBCALL	IsRexxMsg
		tst.l	d0
		beq	.norxmsg

		move.l	rm_Action(a2),d0
		and.l	#RXCODEMASK,d0
		cmp.l	#RXCOMM,d0
		bne	.senditaway

		bsr	ParseRexxMsg
		move.l	d0,d2
		beq.s	.senditaway
		move.l	d2,a3

		clr.l	rm_Result1(a2)
		clr.l	rm_Result2(a2)

		lea	rx_msgargs+6(pc),a2
		move.l	rx_curmsg(pc),d7
		jsr	(a3)
		move.l	rx_curmsg(pc),a2
		tst.l	rm_Result1(a2)
		bne.s	.000
		move.l	d0,rm_Result1(a2)

.000		bra.s	.norxmsg


.senditaway	move.l	rxsbase(pc),a6
		move.l	ARexxPort(pc),a0
		lea	rx_ext(pc),a1
		move.l	#ARexxPortName,d0
		LIBCALL	CreateRexxMsg
		move.l	rx_curmsg(pc),a2
		tst.l	d0
		beq.s	.nonewmsg
		move.l	d0,a3
		move.l	rm_Action(a2),rm_Action(a3)
		move.l	rm_Stdin(a2),rm_Stdin(a3)
		move.l	rm_Stdout(a2),rm_Stdout(a3)
		move.l	rm_Args(a2),rm_Args(a3)
		move.l	a2,rm_Args+(MAXRMARG*4)(a3)
		move.l	a3,d6
		bsr	PutRexxMsg
		tst.w	d0
		bne	EvalARexxMessage	;everything OK!

		move.l	a3,a0
		move.l	rxsbase(pc),a6
		LIBCALL	DeleteRexxMsg
.nonewmsg	move.l	#RC_FATAL,rm_Result1(a2)

.norxmsg	move.l	rx_curmsg(pc),a1
		move.l	4.w,a6
		LIBCALL	ReplyMsg
		bra	EvalARexxMessage

ParseRexxMsg	; a2 *RexxMsg
		; RETURNS d0 *fptr or NULL
		movem.l	a2-a6/d2-d7,-(sp)
		lea	rx_msgargs(pc),a3
		moveq	#14,d0
.clear		move.l	#-1,(a3)+
		move.w	#-1,(a3)+
		dbra	d0,.clear


		lea	rx_msgargs(pc),a3
		lea	rx_buf,a4
		move.l	rm_Args(a2),a5

		move.l	a5,a0
		move.l	rxsbase(pc),a6
		LIBCALL	LengthArgstring
		move.l	d0,d2

		moveq	#14,d3

		moveq	#0,d5	;string mode ("") = -1, sonst 0

.loop		moveq	#0,d4	;length of current item
		move.l	a4,(a3)+

.search		move.b	(a5)+,d0
		subq.l	#1,d2
		bmi.s	.endofitem

		tst.w	d5
		bne.s	.nospace
		cmp.b	#' ',d0
		bne.s	.nospace
		tst.w	d4
		beq.s	.search
		clr.b	(a4)+
		bra.s	.endofitem

.nospace	cmp.b	#'"',d0
		bne.s	.nostring
		not.w	d5
		beq.s	.stringoff
.stringon	tst.w	d4
		beq.s	.search
.stringoff	clr.b	(a4)+
		bra.s	.endofitem

.nostring	move.b	d0,(a4)+

		addq.w	#1,d4
		bra.s	.search

.endofitem	move.w	d4,(a3)+
		bne.s	.nonzero
		move.w	#-1,-2(a3)
.nonzero	tst.l	d2
		dbeq	d3,.loop
		clr.b	(a4)


		move.l	rx_msgargs(pc),a2
		lea	rx_COMMANDS(pc),a3
		move.l	utilbase(pc),a6
		moveq	#rx_NUMCOMS-1,d2
.findcmd	move.l	a2,a0
		lea	rx_COMMANDS(pc),a1
		add.w	(a3),a1
		LIBCALL	Stricmp
		tst.l	d0
		beq.s	.okay
		addq.l	#4,a3
		dbra	d2,.findcmd
		moveq	#0,d0
		bra.s	.ende
.okay		lea	rx_COMMANDS(pc),a0
		add.w	2(a3),a0
		move.l	a0,d0
.ende		movem.l	(sp)+,a2-a6/d2-d7
		rts

rx_msgsout	dc.w	0
rx_ownmsgs	dc.w	0

rx_curmsg	dc.l	0

; -- APTR ArgX, UWORD ArgXLen or -1 when doesn't exist
; -- Arguments are ordinary C-Strings in arexxargbuf.
; -- First Argument is COMMAND NAME
rx_msgargs	ds.b	15*(4+2)

* ### Routinen werden mit *rx_msgargs+6 in a2
* ### und *RexxMsg in d7 aufgerufen !!

rxcom		macro
		dc.w	rx_\1n-rx_COMMANDS,rx_\1-rx_COMMANDS
		endm

rx_COMMANDS	rxcom	SHOWGUI
		rxcom	HIDEGUI
		rxcom	LOAD
		rxcom	ADDPRESET
		rxcom	CLEARPRESETS
		rxcom	LOCKGUI
		rxcom	UNLOCKGUI
		rxcom	RESHOW
		rxcom	USETOPAZ
		rxcom	VERSION
		rxcom	SAVE
		rxcom	SFORMAT
		rxcom	CFORMAT
		rxcom	RESTORE
		rxcom	SETPRESET
		rxcom	RANGE
		rxcom	DISPMODE
		rxcom	STATUS
		rxcom	TYPETEXT
		rxcom	NOSHOW
		rxcom	DCSIZE
		rxcom	GLOBALNOSHOW
		rxcom	LOCKRANGE
		rxcom	SCREENPROMO
		rxcom	GETPIXEL
		rxcom	SEARCHPIXEL
		rxcom	SHOWPIC
		rxcom	ANEXT
		rxcom	ACTIVEWIN
		rxcom	SAVECLOSE
		rxcom	REQUESTFILE
		rxcom	REQUEST
		rxcom	COORDS
rx_NUMCOMS	equ	(*-rx_COMMANDS)/4

rx_SHOWGUIn		dc.b	"SHOWGUI",0
rx_HIDEGUIn		dc.b	"HIDEGUI",0
rx_LOADn		dc.b	"LOAD",0
rx_ADDPRESETn	dc.b	"ADDPRESET",0
rx_CLEARPRESETSn	dc.b	"CLEARPRESETS",0
rx_LOCKGUIn		dc.b	"LOCKGUI",0
rx_UNLOCKGUIn	dc.b	"UNLOCKGUI",0
rx_RESHOWn		dc.b	"RESHOW",0
rx_USETOPAZn		dc.b	"USETOPAZ",0
rx_VERSIONn		dc.b	"VERSION",0
rx_SAVEn		dc.b	"SAVE",0
rx_SFORMATn		dc.b	"SFORMAT",0
rx_CFORMATn		dc.b	"CFORMAT",0
rx_RESTOREn		dc.b	"RESTORE",0
rx_SETPRESETn	dc.b	"SETPRESET",0
rx_RANGEn		dc.b	"RANGE",0
rx_DISPMODEn		dc.b	"DISPMODE",0
rx_STATUSn		dc.b	"STATUS",0
rx_TYPETEXTn		dc.b	"TYPETEXT",0
rx_NOSHOWn		dc.b	"NOSHOW",0
rx_DCSIZEn		dc.b	"DCSIZE",0
rx_GLOBALNOSHOWn	dc.b	"GLOBALNOSHOW",0
rx_LOCKRANGEn	dc.b	"LOCKRANGE",0
rx_SCREENPROMOn	dc.b	"SCREENPROMO",0
rx_GETPIXELn		dc.b	"GETPIXEL",0
rx_SEARCHPIXELn	dc.b	"SEARCHPIXEL",0
rx_SHOWPICn		dc.b	"SHOWPIC",0
rx_ANEXTn		dc.b	"ANEXT",0
rx_ACTIVEWINn	dc.b	"ACTIVEWIN",0
rx_SAVECLOSEn	dc.b	"SAVECLOSE",0
rx_REQUESTFILEn	dc.b	"REQUESTFILE",0
rx_REQUESTn		dc.b	"REQUEST",0
rx_COORDSn		dc.b	"COORDS",0
			even

rx_SHOWGUI	bsr	ShowWindow
		tst.l	d0
		beq	err10
		moveq	#0,d0
		rts

rx_HIDEGUI	bsr	HideWindow
		moveq	#0,d0
		rts

t_NOSHOW	dc.b	"NOSHOW",0
		even

rx_LOAD		clr.w	NOSHOWflag-j(a5)
		move.l	utilbase(pc),a6
		tst.w	10(a2)
		bmi.s	.000
		move.l	6(a2),a0
		lea	t_NOSHOW(pc),a1
		LIBCALL	Stricmp
		tst.l	d0
		bne.s	.000
		st	NOSHOWflag-j(a5)

.000		lea	pathname,a1
		move.l	(a2),a0
		tst.w	4(a2)
		bmi	err10
.1		move.b	(a0)+,(a1)+
		bne.s	.1
		clr.b	(a1)+
		bsr	ShowWindow
		tst.l	d0
		beq	err10

		move.l	dosbase(pc),a6
		move.l	#pathname,d1
		LIBCALL	FilePart
		move.l	d0,a0
		lea	snstitlemod(pc),a1
		moveq	#28,d0
.666		move.b	(a0)+,(a1)+
		dbra	d0,.666
		clr.b	(a1)+

		bra	LOADentry

rx_SAVE		tst.l	load.rawmemory-j(a5)
		beq	err10
		move.l	a2,a0
		tst.w	4(a0)
		bmi	err10
		move.l	(a0),a0
		lea	savepathname,a1
.1		move.b	(a0)+,(a1)+
		bne.s	.1
		bsr	SAVEentry
		moveq	#0,d0
		tst.w	d4
		bne.s	.ok
		moveq	#5,d0
.ok		rts

rx_REQUESTFILE
		tst.w	4(a2)
		bmi	err10
		move.l	window(pc),aslrequesttags+4-j(a5)
		clr.b	buf1
		move.l	aslbase-j(a5),a6
		move.l	aslfilerequest4(pc),d6
		move.l	d6,a0
		lea	aslrequesttags-j(a5),a1
		move.l	(a2),12(a1)
		LIBCALL	AslRequest
		tst.l	d0
		beq	.return
		move.l	d6,a0
		move.l	4(a0),d2
		move.l	8(a0),a0
		lea	buf1,a1
		move.w	#199,d0
.1		move.b	(a0)+,d1
		move.b	d1,(a1)+
		dbeq	d0,.1
		move.l	#buf1,d1
		move.l	#200,d3
		move.l	dosbase(pc),a6
		LIBCALL	AddPart
.return		move.l	aslbase(pc),a6
		lea	buf1,a0
		bsr	rx_CreateRes2String
		moveq	#0,d0
		rts
aslrequesttags	dc.l	ASL_Window,0
		dc.l	ASL_Hail,0
		dc.l	ASLFR_SleepWindow,1
		dc.l	ASLFR_DoSaveMode,0
		dc.l	TAG_DONE

rx_REQUEST
		tst.w	4(a2)
		bmi	err10
		move.l	intbase(pc),a6
		sub.l	a0,a0
		lea	alertstruct(pc),a1
		move.l	(a2),12(a1)
		move.l	#alert2gadtext,16(a1)
		sub.l	a2,a2
		sub.l	a3,a3
		LIBCALL	EasyRequestArgs
		move.l	#alertgadtext,alertstruct+16-j(a5)
		rts
alert2gadtext	dc.b	"OK|Cancel",0
		even


rx_SETPRESET
		tst.w	4(a2)
		bmi	err10
		move.l	(a2),a2
		move.l	utilbase(pc),a6
		move.l	PresetsList+LH_HEAD(pc),a3
.1		tst.l	(a3)
		beq	err10
		lea	LN_SIZE(a3),a0
		move.l	a2,a1
		LIBCALL	Stricmp
		tst.l	d0
		beq.s	.found
		move.l	(a3),a3
		bra.s	.1
.found		move.w	LN_SIZE+32(a3),actsaveformat1-j(a5)
		move.w	LN_SIZE+34(a3),actsaveformat2-j(a5)
		move.w	LN_SIZE+36(a3),actcolsformat1-j(a5)
		move.w	LN_SIZE+38(a3),actcolsformat2-j(a5)
		bsr	UpdateFormatGadgets
		moveq	#0,d0
		rts

rx_ADDPRESET	tst.w	4(a2)
		bmi	err10

		lea	PresetsList(pc),a3
		move.l	4.w,a6
		move.l	#LN_SIZE+32+8,d0
		move.l	#MEMF_CLEAR,d1
		LIBCALL	AllocVec
		move.l	d0,d6	;neue Node
		beq	err5

		move.l	(a2),a0
		move.l	d6,a1
		lea	LN_SIZE(a1),a1
		move.l	a1,LN_NAME-LN_SIZE(a1)
		moveq	#31,d0
		lea	32(a1),a2
.1		move.b	(a0)+,(a1)+	;Name kopieren
		dbeq	d0,.1
		move.w	actsaveformat1(pc),(a2)+
		move.w	actsaveformat2(pc),(a2)+
		move.w	actcolsformat1(pc),(a2)+
		move.w	actcolsformat2(pc),(a2)+
		move.l	a3,a0
		move.l	d6,a1
		ADDTAIL
		bsr	PWUpdateList
		moveq	#0,d0
		rts

rx_CLEARPRESETS
FreePresetList	move.l	PresetsList+LH_HEAD(pc),a2
		move.l	4.w,a6
.1		tst.l	(a2)
		beq.s	.ende
		move.l	a2,a1
		move.l	(a2),a2
		LIBCALL	FreeVec
		bra.s	.1
.ende		lea	PresetsList(pc),a0
		NEWLIST	a0
		bsr	PWUpdateList
		moveq	#0,d0
		rts

rx_LOCKGUI	addq.w	#1,GUI_locknestcnt-j(a5)
		cmp.w	#1,GUI_locknestcnt-j(a5)
		bhi.s	.11

		move.l	window(pc),d0
		beq.s	.11
		move.l	d0,a0
		bsr	LockWindow
		move.l	window(pc),a0
		move.l	glistpointer(pc),a1
		moveq	#-1,d0
		move.l	intbase(pc),a6
		LIBCALL	RemoveGList
.11		moveq	#0,d0
		rts

rx_UNLOCKGUI	tst.w	GUI_locknestcnt-j(a5)
		beq.s	.0
		subq.w	#1,GUI_locknestcnt-j(a5)
		bne.s	.0
		move.l	window(pc),d0
		beq.s	.0
		move.l	d0,a0
		bsr	UnlockWindow
		move.l	window(pc),a0
		move.l	glistpointer(pc),a1
		moveq	#0,d0
		moveq	#-1,d1
		sub.l	a2,a2
		LIBCALL	AddGList
.0		moveq	#0,d0
		rts

GUI_locknestcnt	dc.w	0

rx_RESHOW	tst.l	load.rawmemory-j(a5)
		beq	err5
		bsr	HG_reshow
		moveq	#0,d0
		rts

rx_NOSHOW	bsr	ClosePic
		st	NOSHOWflag-j(a5)
		moveq	#0,d0
		rts

rx_VERSION	lea	versionstring+6(pc),a0
		bsr	rx_CreateRes2String
		moveq	#0,d0
		rts

rx_CreateRes2String	; a0 *string
			; d7 *RexxMsg
* Packt String nach rm_Result2(d7) als ArgString !!
		move.l	a2,-(sp)
		move.l	d7,a1
		clr.l	rm_Result2(a1)
		move.l	rm_Action(a1),d0
		btst	#RXFB_RESULT,d0
		beq.s	.0
		move.l	a0,a1
		moveq	#-1,d0
.1		tst.b	(a1)+
		dbeq	d0,.1
		neg.w	d0
		subq.w	#1,d0
		move.l	rxsbase(pc),a6
		LIBCALL	CreateArgstring
		move.l	d7,a2
		move.l	d0,rm_Result2(a2)
		bne.s	.0
		move.l	#RC_FATAL,rm_Result1(a2)
.0		move.l	(sp)+,a2
		rts

rx_SFORMAT	lea	rx_ParseStruct.sformat1(pc),a2
		lea	actsaveformat1(pc),a3
		bsr	rx_ParseCmdLine
		lea	rx_ParseStruct.sformat2(pc),a2
		lea	actsaveformat2(pc),a3
		bsr	rx_ParseCmdLine
		bsr	UpdateFormatGadgets
		moveq	#0,d0
		rts

rx_CFORMAT	lea	rx_ParseStruct.cformat1(pc),a2
		lea	actcolsformat1(pc),a3
		bsr	rx_ParseCmdLine
		lea	rx_ParseStruct.cformat2(pc),a2
		lea	actcolsformat2(pc),a3
		bsr	rx_ParseCmdLine
		bsr	UpdateFormatGadgets
		moveq	#0,d0
		rts

rx_RESTORE	bsr	HG_restore
		moveq	#0,d0
		rts

rx_ParseCmdLine	; a2*ParseStruct a3*Zieladresse
		move.l	utilbase(pc),a6
.loop0		lea	rx_msgargs(pc),a4
		moveq	#14,d2
.loop1		move.l	(a4)+,a0
		move.w	(a4)+,d0
		bmi.s	.yoyoyo
		clr.b	(a0,d0.w)
		lea	rx_COMMANDS,a1
		add.w	(a2),a1
		LIBCALL	Stricmp
		tst.l	d0
		bne.s	.yoyo
		move.w	2(a2),(a3)
.yoyo		dbra	d2,.loop1
.yoyoyo		addq.l	#4,a2
		tst.l	(a2)
		bne.s	.loop0
		rts

PS		macro
		dc.w	\1-rx_COMMANDS
		dc.w	\2
		endm
rx_ParseStruct.sformat1
		PS	t_IFF,0
		PS	t_RAWNORM,1
		PS	t_RAWBLIT,2
		PS	t_NOPIC,3
		PS	t_COPPER,4
		PS	t_SPRITE,5
		PS	t_MASK,6
		PS	t_MASK1pl,7
		PS	t_CHUNKY1,8
		PS	t_CHUNKY2,9
		dc.l	0
rx_ParseStruct.sformat2
		PS	t_FILE,0
		PS	t_DC,1
		PS	t_PC,2
		dc.l	0
rx_ParseStruct.cformat1
		PS	t_NOCOLS,0
		PS	t_TOP,1
		PS	t_BOTTOM,2
		dc.l	0
rx_ParseStruct.cformat2
		PS	t_12BIT,0
		PS	t_24BIT0RGB,1
		PS	t_24BITRGB0,2
		PS	t_24BITRGB,3
		PS	t_24BITHL,4
		PS	t_24BITHLI,5
		PS	t_24BITLH,6
		PS	t_24BITLHI,7
		PS	t_96BIT,8
		dc.l	0

t_IFF		dc.b	"IFF",0
t_RAWNORM	dc.b	"RAW",0
t_RAWBLIT	dc.b	"RAWI",0
t_NOPIC		dc.b	"NOPIC",0
t_COPPER	dc.b	"COPPER",0
t_SPRITE	dc.b	"SPRITE",0
t_FILE		dc.b	"FILE",0
t_DC		dc.b	"DC",0
t_PC		dc.b	"PC",0
t_NOCOLS	dc.b	"NOCOLS",0
t_TOP		dc.b	"TOP",0
t_BOTTOM	dc.b	"BOTTOM",0
t_12BIT		dc.b	"12BIT",0
t_24BIT0RGB	dc.b	"24BIT0RGB",0
t_24BITRGB0	dc.b	"24BITRGB0",0
t_24BITRGB	dc.b	"24BITRGB",0
t_24BITHL	dc.b	"24BITHL",0
t_24BITHLI	dc.b	"24BITHLI",0
t_24BITLH	dc.b	"24BITLH",0
t_24BITLHI	dc.b	"24BITLHI",0
t_96BIT		dc.b	"96BIT",0
t_MASK		dc.b	"MASK",0
t_MASK1pl	dc.b	"MASK1",0
t_CHUNKY1	dc.b	"UNPKEDCHUNKY",0
t_CHUNKY2	dc.b	"CHUNKYCOLS",0
		even

err10		moveq	#10,d0
		rts
err5		moveq	#5,d0
		rts

rx_DCSIZE
		tst.w	4(a2)
		bmi.s	err10
		move.l	(a2),a0
		bsr	ascii2long
		cmp.w	#2,d1
		bhi.s	err10
		move.w	d1,DCbwl-j(a5)
		moveq	#0,d0
		rts

t_FULLPIC	dc.b	"FULLPIC",0
		even

rx_RANGE	tst.l	load.rawmemory-j(a5)
		beq.s	err5
		tst.l	window-j(a5)
		beq.s	err5
		tst.w	4(a2)
		bmi.s	err10
		move.l	utilbase(pc),a6
		move.l	(a2),a0
		lea	t_FULLPIC(pc),a1
		LIBCALL	Stricmp
		tst.l	d0
		beq.s	.rangefullpic
		move.l	(a2),a0
		bsr	ascii2long
		move.w	d1,save.rangecopy-j(a5)
		tst.w	10(a2)
		bmi	err10
		move.l	6(a2),a0
		bsr	ascii2long
		move.w	d1,save.rangecopy+2-j(a5)
		tst.w	16(a2)
		bmi	err10
		move.l	12(a2),a0
		bsr	ascii2long
		move.w	d1,save.rangecopy+4-j(a5)
		tst.w	22(a2)
		bmi	err10
		move.l	18(a2),a0
		bsr	ascii2long
		move.w	d1,save.rangecopy+6-j(a5)
.final		bsr	HandleRangeGadgets
		moveq	#0,d0
		rts
.rangefullpic	clr.l	save.range-j(a5)
		move.w	load.pagesizexorg(pc),d0
		move.w	load.pagesize+2(pc),d1
		subq.w	#1,d0
		subq.w	#1,d1
		movem.w	d0/d1,save.range+4-j(a5)
		bsr	HandleRangeGadgets
		moveq	#0,d0
		rts

rx_DISPMODE	tst.l	load.rawmemory-j(a5)
		beq.w	err5
		tst.w	4(a2)
		bmi.w	err10
		move.l	(a2),a0
		bsr	ascii2long
		move.l	d1,d0
		bsr	SetModeID
		moveq	#0,d0
		rts

rx_STATUS	tst.w	4(a2)
		bmi	err10
		move.l	(a2),a0
		bsr	ascii2long
		cmp.w	#maxstati/2,d1
		bcc	err10
		lea	RXanswerbuf,a2
		lea	statustab(pc),a0
		add.w	(a0,d1.w*2),a0
		jsr	(a0)
		move.l	rx_curmsg(pc),d7
		lea	RXanswerbuf,a0
		bsr	rx_CreateRes2String
		moveq	#0,d0
		rts

statustab	dc.w	status.pathname-statustab
		dc.w	status.picsize-statustab
		dc.w	status.depth-statustab
		dc.w	status.range-statustab
		dc.w	status.dispmode-statustab
		dc.w	status.windowshown-statustab
		dc.w	status.rawmemory-statustab
		dc.w	status.popup-statustab
		dc.w	status.frame-statustab
maxstati	equ	*-statustab

status.pathname	move.l	a2,a0
		tst.l	load.rawmemory
		beq.s	.ok
		lea	pathname,a1
.cp		move.b	(a1)+,(a0)+
		bne.s	.cp
.ok		clr.b	(a0)+
		rts

status.picsize	move.l	a2,a0
		moveq	#0,d0
		move.w	load.pagesizexorg(pc),d0
		bsr	long2dec
		move.b	#" ",(a0)+
		moveq	#0,d0
		move.w	load.pagesize+2(pc),d0
		bsr	long2dec
		clr.b	(a0)+
		rts

status.depth	move.l	a2,a0
		moveq	#0,d0
		move.w	load.depth(pc),d0
		bsr	long2dec
		clr.b	(a0)+
		rts

status.range	move.l	a2,a0
		moveq	#0,d0
		move.w	save.range(pc),d0
		bsr	long2dec
		move.b	#" ",(a0)+
		moveq	#0,d0
		move.w	save.range+2(pc),d0
		bsr	long2dec
		move.b	#" ",(a0)+
		moveq	#0,d0
		move.w	save.range+4(pc),d0
		bsr	long2dec
		move.b	#" ",(a0)+
		moveq	#0,d0
		move.w	save.range+6(pc),d0
		bsr	long2dec
		clr.b	(a0)+
		rts

status.dispmode	move.l	a2,a0
		move.l	load.modeid(pc),d0
		bsr	long2dec
		clr.b	(a0)+
		rts

status.windowshown
		moveq	#0,d0
		tst.l	window-j(a5)
		beq.s	.0
		moveq	#1,d0
.0		move.l	a2,a0
		bsr	long2dec
		clr.b	(a0)+
		rts

status.rawmemory
		move.l	a2,a0
		move.l	load.rawmemory(pc),d0
		bsr	long2dec
		move.b	#" ",(a0)+
		move.l	load.rawmemlen(pc),d0
		bsr	long2dec
		clr.b	(a0)+
		rts

status.popup	move.l	a2,a0
		moveq	#0,d0
		move.w	popupflag(pc),d0
		bsr	long2dec
		clr.b	(a0)+
		rts

status.frame	move.l	a2,a0
		moveq	#0,d0
		move.w	animlstruct(pc),d0
		bsr	long2dec
		move.b	#" ",(a0)+
		moveq	#0,d0
		move.w	animlstruct+2(pc),d0
		bsr	long2dec
		clr.b	(a0)+
		rts

long2dec	;Converts Long in d0 to Dec-String in (a0)+
		tst.l	d0
		bne.s	.0
		move.b	#"0",(a0)+
		rts
.0		lea	.tab(pc),a1
		moveq	#9,d1
		moveq	#0,d6
.1		move.l	(a1)+,d2
		move.l	d0,d3
		moveq	#-1,d4
.2		move.l	d3,d5
		sub.l	d2,d3
		cmp.l	d5,d3
		dbhi	d4,.2
		add.l	d2,d3
		move.l	d3,d0
		not.w	d4
		bne.s	.3
		tst.w	d6
		beq.s	.4
.3		st	d6
		add.b	#"0",d4
		move.b	d4,(a0)+
.4		dbra	d1,.1
		rts
.tab		dc.l	1000000000,100000000,10000000,1000000,100000
		dc.l	10000,1000,100,10,1

rx_TYPETEXT
		tst.w	4(a2)
		bmi	err10
		move.l	(a2),a0
		bsr	type
		moveq	#0,d0
		rts

rx_USETOPAZ
		bsr.s	rx_offon
		move.w	d0,PREFS_font-j(a5)
		tst.l	window-j(a5)
		beq.s	.1
		bsr	HideWindow
		bsr	ShowWindow
.1		moveq	#0,d0
		rts

rx_LOCKRANGE
		bsr.s	rx_offon
		move.w	d0,range_locked-j(a5)
		movem.w	save.range(pc),d0-d3
		movem.w	d0-d3,save.rangelock-j(a5)
		bra	rx_actprefswin

rx_GLOBALNOSHOW
		bsr.s	rx_offon
		move.w	d0,noshow_global-j(a5)
		beq.s	.1
		bsr	ClosePic
		bra.s	.2
.1		bsr	OpenPic
.2		bra	rx_actprefswin

rx_ACTIVEWIN
		bsr.s	rx_offon
		move.w	d0,activate_window
		bra	rx_actprefswin

rx_SAVECLOSE
		bsr.s	rx_offon
		move.w	d0,save_close_pic
		bra	rx_actprefswin

rx_COORDS
		bsr.s	rx_offon
		move.w	d0,show_coords
		bra	rx_actprefswin

rx_SCREENPROMO
		bsr.s	rx_offon
		move.w	d0,promote_screen-j(a5)
		move.l	load.modeid(pc),d0
		and.l	#MONITOR_ID_MASK,d0
		move.l	d0,promote_monitor-j(a5)
		bra	rx_actprefswin

rx_offon	;testet erstes Argument auf nicht vorhanden = ON
		; oder OFF=OFF, liefert 0 oder 1.
		tst.w	4(a2)
		bmi.s	.on
		move.l	(a2),a0
		cmp.b	#"F",1(a0)	;OFF ?
		bne.s	.on
.off		moveq	#0,d0
		rts
.on		moveq	#1,d0
		rts

rx_actprefswin
		tst.l	pfwindow-j(a5)
		beq.s	.ok
		bsr	ClosePrefsWindow
		bsr	OpenPrefsWindow
.ok		moveq	#0,d0	
		rts

rx_GETPIXEL
		tst.w	10(a2)
		bmi	err10
		tst.l	load.rawmemory-j(a5)
		beq	err5
		move.l	(a2),a0
		bsr	ascii2long
		move.l	d1,d6
		move.l	6(a2),a0
		bsr	ascii2long
		move.l	d1,d7
		move.w	load.pagesizexorg(pc),d0
		move.w	load.pagesize(pc),d1
		cmp.w	d0,d6		;Rahmen überschritten ?
		bcc	err1
		cmp.w	d1,d7
		bcc	err1
		move.l	load.rawmemory(pc),a0
		move.w	load.depth(pc),d0
		addq.w	#1,d7
		mulu.w	d7,d0
		subq.w	#1,d0
		move.w	load.pagesize(pc),d1
		lsr.w	#3,d1
		move.w	d1,d3	; Breite einer planezeile
		mulu.w	d0,d1
		add.l	d1,a0	; letzte plane der entspr. reihe
		move.w	load.depth(pc),d2
		subq.w	#1,d2
		moveq	#0,d0
.loop		add.l	d0,d0
		bftst	(a0){d6:1}
		beq.s	.00
		addq.l	#1,d0
.00		sub.w	d3,a0
		dbra	d2,.loop
		lea	RXanswerbuf,a0
		bsr	long2dec
		clr.b	(a0)+
		lea	RXanswerbuf,a0
		move.l	rx_curmsg(pc),d7
		bsr	rx_CreateRes2String
		moveq	#0,d0
		rts

rx_SEARCHPIXEL	;xpos ypos color
		tst.w	16(a2)
		bmi	err10
		tst.l	load.rawmemory-j(a5)
		beq	err5
		move.l	(a2),a0
		bsr	ascii2long
		move.l	d1,d6
		move.l	6(a2),a0
		bsr	ascii2long
		move.l	d1,d7
		move.l	12(a2),a0
		bsr	ascii2long
		move.l	d1,d5
		move.l	load.rawmemory(pc),a0
		move.w	load.depth(pc),d0
		addq.w	#1,d7
		mulu.w	d7,d0
		subq.w	#1,d0
		move.w	load.pagesize(pc),d1
		move.w	load.pagesizexorg(pc),d4
		lsr.w	#3,d1
		move.w	d1,d3	; Breite einer planezeile
		mulu.w	d0,d1
		add.l	d1,a0	; letzte plane der entspr. reihe
		subq.w	#1,d6

.loopx		addq.w	#1,d6
		cmp.w	d4,d6	; Ende der Zeile ?
		bcc.s	err1
		move.l	a0,a1
		move.w	load.depth(pc),d2
		subq.w	#1,d2
		moveq	#0,d0
.loop		add.l	d0,d0
		bftst	(a1){d6:1}
		beq.s	.00
		addq.l	#1,d0
.00		sub.w	d3,a1
		dbra	d2,.loop
		cmp.l	d5,d0	; Pixel = gesuchte Farbe ?
		bne.s	.loopx

		lea	RXanswerbuf,a0
		moveq	#0,d0
		move.w	d6,d0	;gefundene XPos zurückgeben.
		bsr	long2dec
		clr.b	(a0)+
		lea	RXanswerbuf,a0
		move.l	rx_curmsg(pc),d7
		bsr	rx_CreateRes2String
		moveq	#0,d0
		rts
err1		moveq	#1,d0
		rts

rx_SHOWPIC
		bsr	ShowPictureScreen
		moveq	#0,d0
		tst.l	showscreen-j(a5)
		bne.s	.ok
		moveq	#1,d0
.ok		rts

rx_ANEXT	equ	HG_next

*********************************************************************

ascii2long	; konvertiert Dezimalstring ab (a0) zu Longword in D1 !!
		moveq	#0,d1
.loop		moveq	#0,d0
		move.b	(a0)+,d0
		sub.b	#"0",d0
		cmp.b	#9,d0
		bhi.s	.oki
		move.l	d1,d2
		lsl.l	#3,d1
		add.l	d2,d1
		add.l	d2,d1
		add.l	d0,d1
		bra.s	.loop
.oki		rts
