*
* Questo programma controlla che un comando residente sia realemente puro
* calcolando un semplice crc e restituendo il numero di segmenti.
*
* Basta confrontare che i valori restituiti appena dopo aver residentato il
* comando da controllare corrispondano a quelli restituiti dopo alcune
* esecuzioni del comando da controllare.
*

	INCDIR	"include:"
	INCLUDE	"exec/types.i"
	INCLUDE	"exec/strings.i"

	INCLUDE	"exec/exec_lib.i"
	INCLUDE	"dos/dos_lib.i"

	INCLUDE	"dos/dosextens.i"
NULL	EQU	0

	OPT	o+

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

	STRUCTURE STATIC_DATA,0
	APTR	sd_dosbase
	APTR	sd_exebase

	APTR	sd_dosargs
	LABEL	sd_cliargs
	APTR	sd_clicmd

	ALIGNLONG
	LABEL	sd_SIZE

DOSBASE	MACRO
	movea.l	(a5),a6				; = sd_dosbase(a5),
	ENDM
EXEBASE	MACRO
	movea.l	sd_exebase(a5),a6
	ENDM

**********************************************************************
**  CLI ONLY EASYSTART  **********************************************
**********************************************************************

easysta	movea.l	4.w,a6
	suba.l	a1,a1
	jsr	_LVOFindTask(a6)
	movea.l	d0,a2
	tst.l	pr_CLI(a2)
	bne.s	easycli
	lea	pr_MsgPort(a2),a0
	jsr	_LVOWaitPort(a6)
	lea	pr_MsgPort(a2),a0
	jsr	_LVOGetMsg(a6)
	movea.l	d0,a1
	jmp	_LVOReplyMsg(a6)

****************************************
**  OPEN DOS AND ALLOCATE STATIC DATA

easyold	moveq	#ERROR_INVALID_RESIDENT_LIBRARY,d0
	move.l	d0,pr_Result2(a2)
	rts

easycli	lea	dosname(pc),a1
	moveq	#37,d0				; kick 2.0+
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,d2
	beq.s	easyold

	moveq	#NULL,d1
	moveq	#(sd_SIZE/BYTESPERLONG)-1,d0
easystk	move.l	d1,-(sp)
	dbf	d0,easystk
	movem.l	d2/a6,(sp)			; sd_dosbase(a5) sd_exebase(a5)
	movea.l	sp,a5
	movea.l	d2,a6

****************************************
**  PARSE COMMAND LINE AND RUN MAIN

	lea	templat(pc),a0
	lea	sd_cliargs(a5),a1
	move.l	a0,d1
	move.l	a1,d2
	moveq	#NULL,d3
	jsr	_LVOReadArgs(a6)
	move.l	d0,sd_dosargs(a5)
	beq.s	easyerr

	movem.l	a5-a6,-(sp)
	bsr.s	main
	movem.l	(sp)+,a5-a6
	move.l	sd_dosargs(a5),d1
	jsr	_LVOFreeArgs(a6)

****************************************
**  CLOSE DOS AND FREE STATIC DATA

easyend	movea.l	a6,a1
	movea.l	sd_exebase(a5),a6
	jsr	_LVOCloseLibrary(a6)
	adda.l	#sd_SIZE,sp
	move.l	d7,d0
	rts

easyerr	jsr	_LVOIoErr(a6)
	move.l	d0,d1
	moveq	#NULL,d2
	jsr	_LVOPrintFault(a6)
	moveq	#RETURN_ERROR,d7
	bra.s	easyend

**********************************************************************
**  MAIN PROGRAM  ****************************************************
**********************************************************************
**
** INPUT:   a5=static a6=dos
** OUTPUT:  d7=result
** SCRATCH: 
**

main	moveq	#RETURN_FAIL,d7
	moveq	#0,d6
	moveq	#0,d5
	move.l	sd_clicmd(a5),d4

	EXEBASE
	jsr	_LVOForbid(a6)

	DOSBASE
	move.l	d4,d1
	moveq	#NULL,d2
	moveq	#DOSFALSE,d3
	jsr	_LVOFindSegment(a6)
	tst.l	d0
	beq.s	fail
	movea.l	d0,a0
	move.l	seg_Seg(a0),d1
	beq.s	sumdone

sumnext	lsl.l	#2,d1
	movea.l	d1,a4
	move.l	(a4),d1				; next
	move.l	-(a4),d0			; len
sumloop	add.l	(a4)+,d5
	bcc.s	sumwrap
	addq.l	#1,d5
sumwrap	subq.l	#BYTESPERLONG,d0
	bgt.s	sumloop
	addq.l	#1,d6
	tst.l	d1
	bne.s	sumnext

sumdone	EXEBASE
	jsr	_LVOPermit(a6)

	DOSBASE
	lea	fmtstr(pc),a0
	movem.l	d4-d6,-(sp)
	move.l	a0,d1
	move.l	sp,d2
	jsr	_LVOPrintf(a6)
	lea	(BYTESPERLONG*3)(sp),sp

	moveq	#RETURN_OK,d7
	rts

fail	EXEBASE
	jsr	_LVOPermit(a6)
	DOSBASE
	move.l	d4,d2
	move.l	#ERROR_OBJECT_NOT_FOUND,d1
	jsr	_LVOPrintFault(a6)
	rts

**********************************************************************
**  STRING CONSTANTS  ************************************************
**********************************************************************

	DC.B	"$","VER: "
	DC.B	"ChkSeg 37.01 (03.09.97) "
	DC.B	"by Nik Soggia",EOS

templat	DC.B	"CMD/A",EOS

dosname	DOSNAME

fmtstr	DC.B	"%s sum: 0x%08lx (%ld segments)",LF,EOS

	EVEN
	END
