;/* CyReq:                                         */
;/*                                                */
;/* lenkt EasyRequestArgs auf BuildEasyRequestArgs */
;/* und AutoRequest auf BuildSysRequest um, damit  */
;/* FreeSysRequest ueber den LVO aufgerufen wird,  */
;/* und nicht direkt aus dem ROM angejumpt wird.   */


	include	exec/memory.i
	include exec/nodes.i
	include exec/ports.i
	include exec/tasks.i
	include	dos/dos.i

	include	lvo/exec_lib.i
	include lvo/intuition_lib.i

MIN_STACK = 4096

	move.l	4.w,a6
	
	lea	portname(pc),a1
	jsr	_LVOFindPort(a6)
	tst.l	d0
	bne	.exit
		
	lea	intname(pc),a1
	moveq	#36,d0
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,intbase
	bne.s	.ok

	moveq	#RETURN_WARN,d0
	rts

.ok:
	move.l	#PATCHEND-PATCHSTART+1,d0
	move.l	#MEMF_PUBLIC,d1
	jsr	_LVOAllocMem(a6)
	move.l	d0,mem
	bne.s	.ok2

	moveq	#RETURN_WARN,d0
	rts
	
.ok2:
	jsr	_LVOForbid(a6)			;/* Kill Multitasking */
	
	move.l	intbase(pc),a1			;/* Library */
	lea	_LVOEasyRequestArgs,a0		;/* LVO */
	move.l	#New_EasyRequestArgs,d0		;/* New Function */
	sub.l	#PATCHSTART,d0
	add.l	mem(pc),d0
	jsr	_LVOSetFunction(a6)

	move.l	intbase(pc),a1			;/* Library */
	lea	_LVOAutoRequest,a0		;/* LVO */

	move.l	#New_AutoRequest,d0		;/* New Function */
	sub.l	#PATCHSTART,d0
	add.l	mem(pc),d0
	jsr	_LVOSetFunction(a6)
	
	lea	PATCHSTART(pc),a0
	move.l	mem(pc),a1
	move.l	#PATCHEND-PATCHSTART+1,d0
	jsr	_LVOCopyMem(a6)			;/* Copy routines */
	
	jsr	_LVOCacheClearU(a6)		;/* !!!! */
	
	jsr	_LVOPermit(a6)			;/* Re-activate Multitasking */

	move.l	mem(pc),a1
	lea	port-PATCHSTART(a1),a1
	lea	portname-port(a1),a0
	move.l	a0,LN_NAME(a1)
	jsr	_LVOAddPort(a6)
	
.exit:
	moveq	#RETURN_OK,d0
	rts


PATCHSTART:

;/*===================================================*/

New_EasyRequestArgs:
	movem.l	d2/a0/a1/a4-a6,-(sp)

	lea	-(4+StackSwapStruct_SIZEOF)(sp),sp
	move.l	sp,a5

	move.l	a6,d2			;// backup IntuitionBase
	move.l	4.w,a6
	
	sub.l	a1,a1
	jsr	_LVOFindTask(a6)
	move.l	d0,a4
	
	move.l	sp,d0
	cmp.l	TC_SPLOWER(a4),d0
	bls.s	.with_stackswap
	cmp.l	TC_SPUPPER(a4),d0
	bhs.s	.with_stackswap
	sub.l	#MIN_STACK,d0
	cmp.l	TC_SPLOWER(a4),d0
	bls.s	.with_stackswap

.nomem:
	lea	4+StackSwapStruct_SIZEOF(sp),sp
	movem.l	(sp)+,d2/a0/a1/a4-a6
	bra.s	My_EasyRequestArgs

.with_stackswap:
	move.l	#MIN_STACK,d0
	move.l	#MEMF_PUBLIC+MEMF_REVERSE,d1
	jsr	_LVOAllocVec(a6)
	tst.l	d0
	beq.s	.nomem
	
	move.l	d0,(a5)
	move.l	d0,4+stk_Lower(a5)
	add.l	#MIN_STACK,d0
	move.l	d0,4+stk_Upper(a5)
	move.l	d0,4+stk_Pointer(a5)

	lea	4(a5),a0

	jsr	_LVOStackSwap(a6)
	
	exg.l	a6,d2			;// IntuitionBase
	
	movem.l	4+StackSwapStruct_SIZEOF(a5),d0/a0/a1
	
	bsr.s	My_EasyRequestArgs
	move.l	d0,a4			;// save result
	
	exg.l	a6,d2			;// ExecBase
	
	lea	4(a5),a0
	jsr	_LVOStackSwap(a6)
	
	move.l	(a5),a1
	jsr	_LVOFreeVec(a6)
	
	move.l	a4,d0
	lea	4+StackSwapStruct_SIZEOF(a5),sp
	movem.l	(sp)+,d2/a0/a1/a4-a6
	rts

My_EasyRequestArgs:
;// a0 = window
;// a1 = easyStruct
;// a2 = idcmpPtr
;// a3 = args
;// a6 = IntuitionBase

	move.l	a3,-(sp)

	moveq	#0,d0				;// idcmp
	cmp.l	#0,a2				;// idcmpPtr ?
	beq.s	.idcmpOK

	move.l	(a2),d0				;// idcmp = *idcmpPtr

.idcmpOK:
	jsr	_LVOBuildEasyRequestArgs(a6)
	cmp.l	#1,d0
	bls.s	.raus

	move.l	d0,a3

.schleife:
	move.l	a3,a0				;// window
	move.l	a2,a1				;// idcmpPtr
	moveq	#1,d0				;// waitInput
	
	jsr	_LVOSysReqHandler(a6)
	
	cmp.l	#-2,d0
	beq.s	.schleife
	
	move.l	a3,a0
	move.l	d0,a3

	jsr	_LVOFreeSysRequest(a6)

	move.l	a3,d0

.raus:
	move.l	(sp)+,a3
	rts
	

;/*===================================================*/

New_AutoRequest:
	movem.l	d0-d2/a0/a1/a4-a6,-(sp)

	lea	-(4+StackSwapStruct_SIZEOF)(sp),sp
	move.l	sp,a5

	move.l	4.w,a6	
	sub.l	a1,a1
	jsr	_LVOFindTask(a6)
	move.l	d0,a4
	
	move.l	sp,d0
	cmp.l	TC_SPLOWER(a4),d0
	bls.s	.with_stackswap
	cmp.l	TC_SPUPPER(a4),d0
	bhs.s	.with_stackswap
	sub.l	#MIN_STACK,d0
	cmp.l	TC_SPLOWER(a4),d0
	bls.s	.with_stackswap

.nomem:
	lea	4+StackSwapStruct_SIZEOF(sp),sp
	movem.l	(sp)+,d0-d2/a0/a1/a4-a6
	bra.s	My_AutoRequest

.with_stackswap:
	move.l	#MIN_STACK,d0
	move.l	#MEMF_PUBLIC+MEMF_REVERSE,d1
	jsr	_LVOAllocVec(a6)
	tst.l	d0
	beq.s	.nomem
	
	move.l	d0,(a5)
	move.l	d0,4+stk_Lower(a5)
	add.l	#MIN_STACK,d0
	move.l	d0,4+stk_Upper(a5)
	move.l	d0,4+stk_Pointer(a5)

	lea	4(a5),a0

	jsr	_LVOStackSwap(a6)

	;// get IntuitionBase	
	move.l	4+StackSwapStruct_SIZEOF+7*4(a5),a6
	
	movem.l	4+StackSwapStruct_SIZEOF(a5),d0-d2/a0/a1
	
	bsr.s	My_AutoRequest
	move.l	d0,a4			;// save result
	
	move.l	4.w,a6
	
	lea	4(a5),a0
	jsr	_LVOStackSwap(a6)
	
	move.l	(a5),a1
	jsr	_LVOFreeVec(a6)
	
	move.l	a4,d0
	lea	4+StackSwapStruct_SIZEOF+4(a5),sp
	movem.l	(sp)+,d1-d2/a0/a1/a4-a6
	rts

DAT2_idcmp 	= -4
DAT2_arg_pFlag	= -8
DAT2_len	= -8

My_AutoRequest:
;// a0 = window
;// a1 = body
;// a2 = posText
;// a3 = negText
;// d0 = pFlag
;// d1 = nFlag
;// d2 = width
;// d3 = height
;// a6 = IntuitionBase

	link	a5,#DAT2_len

	movem.l	d2/a3,-(sp)

	clr.l	DAT2_idcmp(a5)			;// idcmp=0

	move.l	d0,DAT2_arg_pFlag(a5)

	or.l	d1,d0				;// d0 = pFlag | nFlag
	move.l	d2,d1
	move.l	d3,d2
	
	jsr	_LVOBuildSysRequest(a6)
	cmp.l	#1,d0
	bls.s	.raus
	
	move.l	d0,a3
	
.schleife:
	move.l	a3,a0				;// window
	lea	DAT2_idcmp(a5),a1		;// idcmpPtr
	moveq	#1,d0				;// waitInput
	
	jsr	_LVOSysReqHandler(a6)
	
	cmp.l	#-2,d0
	beq.s	.schleife
	
	move.l	a3,a0
	move.l	d0,a3

	jsr	_LVOFreeSysRequest(a6)

	move.l	a3,d0
	
	cmp.l	#-1,d0
	bne.s	.raus
	
	moveq	#0,d0

	move.l	DAT2_idcmp(a5),d1
	and.l	DAT2_arg_pFlag(a5),d1		;// idcmp&posFlag ?
	beq.s	.raus

	moveq	#1,d0

.raus:
	movem.l	(sp)+,d2/a3
	unlk	a5
	rts
	


;/*===================================================*/


port:
	dc.l	0		;//ln_Succ
	dc.l	0		;//ln_Pred
	dc.b	NT_MSGPORT	;//ln_Type
	dc.b	-128		;//ln_Pri
	dc.l	portname	;//ln_Name
	dc.b	PA_IGNORE	;//mp_Flags
	dc.b	0		;//mp_SigBit
	dc.l	0		;//mp_SigTask
	dc.l	0		;//mp_MsgList head
	dc.l	0		;//tail
	dc.l	0		;//tailpred
	dc.b	0
	dc.b	0
portname:
	dc.b	'CyReq',0

PATCHEND:
	
;/*===================================================*/

intbase:
	dc.l 	0
mem:
	dc.l	0

intname:
	dc.b 'intuition.library',0

version:
	dc.b '$VER: CyReq 1.4 (20.02.2000)',0
	dc.b '$AUTH: Georg Steger',0

	END
	
	
