*****************************************
*		MiniXpkGuide		*
* Small AmigaGuide-viewer with XPK sup.	*
*	V1.0 by Martin Gierich		*
*	Last change:07.03.95		*
*****************************************

;Can be started from WB and CLI
;Tabsize=8

;exec
_LVOOpenLibrary		= -552
_LVOOldOpenLibrary	= -408
_LVOCloseLibrary	= -414
_LVOFindTask		= -294
_LVOWaitPort		= -384
_LVOGetMsg		= -372
_LVOReplyMsg		= -378
_LVOForbid		= -132

;xpkmaster
_LVOXpkExamine		= -36
_LVOXpkUnpack		= -48

;amigaguide
_LVOOpenAmigaGuideA	= -54
_LVOCloseAmigaGuide	= -66

;dos
_LVODeleteFile		= -72
_LVOReadArgs		= -798
_LVOFreeArgs		= -858


XPK_InName	= $80005851	filename
XPK_OutName	= $80005860	filename
XPK_GetError	= $80005875	buffer
XPK_TaskPri	= $8000587f	ubyte

		RSRESET
;NewAmigaGuide-structure
nag_Lock	RS.L	1	Lock on the document directory
nag_Name	RS.L	1	Name of document file
nag_Screen	RS.L	1	Screen to place windows within
nag_PubScreen	RS.L	1	Public screen name to open on
nag_HostPort	RS.L	1	Application's ARexx port name
nag_ClientPort	RS.L	1	Name to assign to the clients ARexx port
nag_BaseName	RS.L	1	Base name of the application
nag_Flags	RS.L	1	Flags
nag_Context	RS.L	1	NULL terminated context table
nag_Node	RS.L	1	Node to align on first (defaults to Main)
nag_Line	RS.L	1	Line to align on
nag_Extens	RS.L	1	Tag array extens
nag_Client	RS.L	1	Private! MUST be NULL
NewAmigaGuide_SIZEOF	RS.W	0

TagSize		= 3*2+1		longwords for tags
NameSize	= 12		for new filename
ArraySize	= 32		must be multiple of 16
AllSize		= NewAmigaGuide_SIZEOF+TagSize*4+NameSize+ArraySize

pr_CLI		= 172
pr_MsgPort	= 92
pr_CurrentDir	= 152
sm_NumArgs	= 28
sm_ArgList	= 36



;d0-d3:scratch
;d4=RdArgs-struct
;d5=Return-code
;d6=WB-message
;d7=filename of guide

;a0-a2:scratch
;a3=temporary filename
;a4=this task
;a5=dos-base


;init place for needed structures on stack
start	moveq	#20,d5		;set return-code to FAIL
	moveq	#AllSize/4-1,d0
.Wdh	clr.l	-(sp)		;get some space for nag
	dbra	d0,.Wdh
	move.l	4.w,a6		;exec-base to a6
	lea	DosName(pc),a1
	moveq	#36,d0		;check for OS2.0+
	jsr	_LVOOpenLibrary(a6)	;open dos.library (in ROM)
	move.l	d0,a5		;a5=dos-base

;create unique temporary filename in T:
	sub.l	a1,a1
	jsr	_LVOFindTask(a6)	;find this task
	move.l	d0,a4		;a4=this task
	lea	NewAmigaGuide_SIZEOF+TagSize*4(sp),a1
	move.l	a1,a3
	move.w	#"T:",(a1)+	;unpack to T: dir
	moveq	#7,d1		;create unique name using the task adr.
.Nib	move.b	d0,(a1)
	and.b	#$0f,(a1)
	add.b	#"J",(a1)+	;use "J" to "Y" for each nibble
	ror.l	#4,d0
	dbra	d1,.Nib		;do it for all 8 nibbles

;check for WB or CLI start
	moveq	#0,d4		;reset Rdargs-struct
	moveq	#0,d6		;reset WB-msg
	tst.l	pr_CLI(a4)	;a4=this task
	bne.s	.CLI
.WB	lea	pr_MsgPort(a4),a0	;it was WB-start
	jsr	_LVOWaitPort(a6)
	lea	pr_MsgPort(a4),a0
	jsr	_LVOGetMsg(a6)
	move.l	d0,d6		;d6=message from WB
	move.l	d0,a0
	moveq	#2,d0
	cmp.l	sm_NumArgs(a0),d0
	bne	.Ende
	move.l	sm_ArgList(a0),a1
	addq.l	#8,a1
	move.l	(a1)+,pr_CurrentDir(a4)	;Lock on Current Dir
	move.l	(a1),d7		;filename to d7
	bra.s	.UnPack

.CLI	move.l	a5,a6			;started from CLI
	lea	Template(pc),a0
	move.l	a0,d1
	lea	NewAmigaGuide_SIZEOF+TagSize*4+NameSize(sp),a2
	move.l	a2,d2			;a2=arg-array
	moveq	#0,d3
	jsr	_LVOReadArgs(a6)	;process argumentline
	move.l	d0,d4			;d4=RdArgs-struct
	beq	.Ende
	move.l	(a2),d7			;filename to d7
	move.l	4(a2),nag_Node(sp)
	move.l	8(a2),d0		;pointer to linenumber ?
	beq.s	.NoLine
	move.l	d0,a0
	move.l	(a0),nag_Line(sp)
.NoLine	move.l	12(a2),nag_PubScreen(sp)
	move.l	16(a2),nag_ClientPort(sp)

;try to unpack file to temporary file, will fail if not packed
.UnPack	move.l	4.w,a6		;exec-base to a6
	lea	XpkName(pc),a1
	jsr	_LVOOldOpenLibrary(a6)
	tst.l	d0
	beq.s	.Show		;opened xpkmaster.library ?
	move.l	d0,a6
	lea	NewAmigaGuide_SIZEOF(sp),a0	;create tags-field
	move.l	#XPK_InName,(a0)
	move.l	d7,4(a0)	;filename from argumentline
	move.l	#XPK_OutName,8(a0)
	move.l	a3,12(a0)	;unique self-done filename
	move.l	#XPK_TaskPri,16(a0)
	moveq	#-1,d0
	move.l	d0,20(a0)	;unpack in background
	jsr	_LVOXpkUnpack(a6)
	tst.l	d0
	bne.s	.NoPack
	move.l	a3,d7		;only replace filename if it succeded
.NoPack	move.l	a6,a1
	move.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)

;show file using amigaguide.library
.Show	lea	GuideName(pc),a1
	jsr	_LVOOldOpenLibrary(a6)
	tst.l	d0
	beq.s	.Ende		;opened amigaguide.library ?
	move.l	d0,a6
	move.l	d7,nag_Name(sp)	;filename into nag
	move.l	sp,a0		;nag to a0
	sub.l	a1,a1		;must be zero
	jsr	_LVOOpenAmigaGuideA(a6)	;open guide
	tst.l	d0
	beq.s	.NoGuid		;failed to open guide ?
	move.l	d0,a0
	jsr	_LVOCloseAmigaGuide(a6)	;wait till user closes guide
	moveq	#0,d5		;set return-code to OK
.NoGuid	move.l	a6,a1		;Free all stuff
	move.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)

;clean up all things used
.Ende	move.l	a5,a6		;dos-base to a6
	cmp.l	d7,a3		;unpacked file ?
	bne.s	.NoDel
	move.l	a3,d1
	jsr	_LVODeleteFile(a6)	;yes, delete it
.NoDel	move.l	d4,d1
	beq.s	.NoFree
	jsr	_LVOFreeArgs(a6)	;free RdArgs-struct, if needed
.NoFree	move.l	a6,a1		;close dos.library
	move.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)
	lea	AllSize(sp),sp	;restore stack

;end program
	move.l	d5,d0		;set return-code
	tst.l	d6		;wb-msg ? -> started from WB
	bne.s	.Jump
	rts			;THE END ! from CLI
.Jump	jsr	_LVOForbid(a6)	;must be in forbid-state
	move.l	d6,a1
	jmp	_LVOReplyMsg(a6)	;THE END ! from WB

XpkName		dc.b	"xpkmaster.library",0
GuideName	dc.b	"amigaguide.library",0
DosName		dc.b	"dos.library",0
Template	dc.b	"DATABASE,DOCUMENT/K,LINE/N,PUBSCREEN/K,"
		dc.b	"PORTNAME/K",0

		end

