; ;;TO ASSEMBLE->>"m90 stripper.asm"
	objfile	'stripper'

; stripper (C) 1989 Glen McDiarmid
; Started 29th July 1989  8PM
; stripper [-a|d|ad] <sourcefile> <destfile>
; stripper source dest - strips just the labels
; stripper -d source dest - strips labels and debug hunks (strip all debug information)
; stripper -a source dest - strips just about everything except code and data
; stripper -f source dest - no change - just check hunk structures
; Works okay on files with overlays (so far!)

**	Permission is granted to purchasers of Macro68 to modify this source
**	file and to use the executable produced from it.
**	Permission is granted to purchasers of Macro68 to distribute the source
**	code that they have modified subject to the following conditions:
**	1.  That the original, unaltered, source is included with the
**	    distribution.
**	2.  That no charge is made for the distribution, other than the cost of
**	    media.                    (Distribution via Fred Fish is permitted)
**	3.  That this copyright notice remains as part of this and any other
**	    file adapted from this file.
**                                              Glen McDiarmid

**********************************************************************
	jmp	(RealProgStart,PC)

	db	'Stripper V2.102',0
	cnop	0,2

RealProgStart	clr.b	(-1,A0,D0.W)
	lea	(DT,PC),A4
	lea	(BssStart,PC),A1
	move.w	#(((BssEnd-BssStart)+3)/4)-1,D0
ClearLoop	clr.l	(A1)+
	dbra	D0,ClearLoop
	move.l	SP,(SaveSP-DT,A4)
	move.l	A0,(SaveA0-DT,A4)
	lea	(DosName,PC),A1
	moveq	#0,D0
	jsr	(OpenLibrarySUB,PC)
	move.l	D0,(Dos_Base-DT,A4)
	movea.l	D0,A6
	jsr	(_LVOOutput,A6)
	move.l	D0,(COSHandle-DT,A4)
	movea.l	(SaveA0,PC),A2
	bsr	FindWordStart
	beq	ErrorExit1
	cmpi.b	#'-',(A2)
	bne.b	2$
4$	addq.l	#1,A2
	cmpi.b	#' ',(A2)
	beq.b	2$
	cmpi.b	#'a',(A2)
	bne.b	3$
	st	(stripallflag-DT,A4)
	bra.b	4$

3$	cmpi.b	#'f',(A2)
	bne.b	5$
	st	(fixflag-DT,A4)
	bra.b	6$

5$	cmpi.b	#'d',(A2)
	bne	ErrorExit1
	st	(stripdebugflag-DT,A4)
6$	addq.l	#1,A2
2$	bsr	FindWordStart
	lea	(InputFileName,PC),A1
	movea.l	A1,A0
	cmpi.b	#'"',(A2)
	bne.b	NotQuoteCopy
	addq.l	#1,A2
1$	move.b	(A2)+,D0
	beq	ErrorExit1
	cmpi.b	#'"',D0
	beq.b	CopyFilenameJoin
	move.b	D0,(A1)+
	bra.b	1$

NotQuoteCopy	move.b	(A2)+,D0
	cmpi.b	#' ',D0
	bls.b	CopyFilenameJoin
	move.b	D0,(A1)+
	bra.b	NotQuoteCopy

CopyFilenameJoin	clr.b	(A1)
	bsr	FindWordStart
	beq	ErrorExit1
	lea	(OutputFileName,PC),A1
	cmpi.b	#'"',(A2)
	bne.b	2$
	addq.l	#1,A2
1$	move.b	(A2)+,D0
	beq	ErrorExit1
	cmpi.b	#'"',D0
	beq.b	3$
	move.b	D0,(A1)+
	bra.b	1$

2$	move.b	(A2)+,D0
	cmpi.b	#' ',D0
	bls.b	3$
	move.b	D0,(A1)+
	bra.b	2$

3$	clr.b	(A1)
	lea	(InputFileName,PC),A2
	move.l	A2,D1
	jsr	(LockReadSUB,PC)
	move.l	D0,(filelock-DT,A4)
	beq	ErrorExit2
	move.l	D0,D1
	lea	(fileinfoblock,PC),A0
	move.l	A0,D2
	jsr	(ExamineSUB,PC)
	move.l	D0,-(SP)
	move.l	(filelock,PC),D1
	clr.l	(filelock-DT,A4)
	jsr	(UnLockSUB,PC)
	move.l	(SP)+,D0
	beq	ErrorExit2
	move.l	A2,D1
	jsr	(OpenOldSUB,PC)
	move.l	D0,(filehandle-DT,A4)
	beq	ErrorExit2
	move.l	(CSD_fib_Size,PC),D0
	beq	ErrorExit3
	btst	#0,D0
	bne	ErrorExit3
	move.l	D0,(InputBufferSize-DT,A4)
	move.l	D0,(OutputBufferSize-DT,A4)
	jsr	(AllocClearedMemSUB,PC)
	move.l	D0,(OutputBufferPtr-DT,A4)
	beq	ErrorExit4
	move.l	(InputBufferSize,PC),D0
	jsr	(AllocPublicSUB,PC)
	move.l	D0,(InputBufferPtr-DT,A4)
	beq	ErrorExit4
	move.l	D0,D2
	move.l	(InputBufferSize,PC),D3
	move.l	(filehandle,PC),D1
	jsr	(ReadSUB,PC)
	cmp.l	D0,D3
	bne	ErrorExit5
	move.l	(filehandle,PC),D1
	clr.l	(filehandle-DT,A4)
	jsr	(CloseSUB,PC)
**********************************************************************
	movea.l	(InputBufferPtr,PC),A2
	move.l	A2,D0
	add.l	(InputBufferSize,PC),D0
	move.l	D0,(InputBufferEnd-DT,A4)
	moveq	#0,D6
	movea.l	(InputBufferPtr,PC),A2
	movea.l	(OutputBufferPtr,PC),A6
**********************************************************************
	bra.b	LoopBase

LoopTop	move.l	(A2)+,D0
	tst.b	(stripallflag-DT,A4)
	bne.b	1$
	move.l	D0,(A6)+
1$	andi.l	#$3FFFFFFF,D0
	subi.l	#$3E7,D0
	bcs	ErrorExit6
	cmpi.l	#($3F6-$3E7),D0
	bhi	ErrorExit6
	lsl.l	#2,D0
	movea.l	(jumptable,PC,D0.W),A0
	jsr	(A0)
LoopBase	cmpa.l	(InputBufferEnd,PC),A2
	bne.b	LoopTop
**********************************************************************
	move.l	A6,D3
	lea	(OutputFileName,PC),A0
	move.l	A0,D1
	jsr	(OpenNewSUB,PC)
	move.l	D0,(filehandle-DT,A4)
	beq.b	ErrorExit7
	move.l	D0,D1
	move.l	(OutputBufferPtr,PC),D2
	sub.l	D2,D3
	jsr	(WriteSUB,PC)
	cmp.l	D0,D3
	beq	NormalExit
	bra.b	ErrorExit8

jumptable	dl	hunkunit.handler
	dl	hunkname.handler
	dl	hunkcode.handler
	dl	hunkdata.handler
	dl	hunkbss.handler
	dl	hunkreloc32.handler
	dl	hunkreloc16.handler
	dl	hunkreloc8.handler
	dl	hunkext.handler
	dl	hunksymbol.handler
	dl	hunkdebug.handler
	dl	hunkend.handler
	dl	hunkheader.handler
	dl	ErrorExit6		; 3F4 unknown!
	dl	hunkoverlay.handler
	dl	hunkbreak.handler

ErrorExit1	lea	(badparmsmsg,PC),A0
	bra.b	showmsgexit

ErrorExit2	lea	(cantopeninputmsg,PC),A0
	bra.b	showmsgexit

ErrorExit3	lea	(corruptmsg,PC),A0
	bra.b	showmsgexit

ErrorExit4	lea	(outofmemmsg,PC),A0
	bra.b	showmsgexit

ErrorExit5	lea	(readerrorinputmsg,PC),A0
	bra.b	showmsgexit

ErrorExit6	lea	(corruptfile,PC),A0
	bra.b	showmsgexit

ErrorExit7	lea	(cantopenoutput,PC),A0
	bra.b	showmsgexit

ErrorExit8	lea	(errorduringwrite,PC),A0
showmsgexit	move.l	A0,D3
1$	tst.b	(A0)+
	bne.b	1$
	subq.l	#1,A0
	exg	D3,A0
	sub.l	A0,D3
	move.l	A0,D2
	move.l	(COSHandle-DT,A4),D1
	jsr	(WriteSUB-DT,A4)
errorexit	moveq	#10,D0
	bra.b	Exit

NormalExit	moveq	#0,D0
Exit	move.b	D0,(ReturnCode-DT,A4)
	lea	(AllocTable,PC),A2
	lea	(AllocTableEnd,PC),A3
FreeMemLoop	cmpa.l	A3,A2
	beq.b	FreeMemDone
	move.l	(A2)+,D0
	movea.l	(A2)+,A1
	bsr.b	FreeMemSUB
	bra.b	FreeMemLoop

FreeMemDone
	move.l	(filelock,PC),D1
	beq.b	1$
	jsr	(UnLockSUB,PC)
1$	move.l	(filehandle,PC),D1
	beq.b	2$
	bsr.b	CloseSUB
2$	
	movea.l	(Dos_Base,PC),A1
	bsr.b	CloseLibrarySUB
	moveq	#0,D0
	move.b	(ReturnCode,PC),D0
	movea.l	(SaveSP,PC),SP
	rts
**********************************************************************
FindWordStart
1$	cmpi.b	#' ',(A2)+
	bls.b	1$
	tst.b	-(A2)
	rts
**********************************************************************
AllocClearedMemSUB
	move.l	#MEMF_PUBLIC|MEMF_CLEAR,D1
	bra.b	AllocSubJoin
AllocPublicSUB
	moveq	#MEMF_PUBLIC,D1
AllocSubJoin	move.l	A6,-(SP)
	movea.l	(4),A6
	jsr	(_LVOAllocMem,A6)
	movea.l	(SP)+,A6
	rts

CloseSUB
	move.l	A6,-(SP)
	movea.l	(Dos_Base,PC),A6
	jsr	(_LVOClose,A6)
	movea.l	(SP)+,A6
	rts

CloseLibrarySUB
	move.l	A6,-(SP)
	movea.l	(4),A6
	jsr	(_LVOCloseLibrary,A6)
	movea.l	(SP)+,A6
	rts

ExamineSUB
	move.l	A6,-(SP)
	movea.l	(Dos_Base,PC),A6
	jsr	(_LVOExamine,A6)
	movea.l	(SP)+,A6
	rts

FreeMemSUB
	move.l	A1,D1
	beq.b	1$
	move.l	A6,-(SP)
	movea.l	(4),A6
	jsr	(_LVOFreeMem,A6)
	movea.l	(SP)+,A6
1$	rts


LockReadSUB
	moveq	#ACCESS_READ,D2
	move.l	A6,-(SP)
	movea.l	(Dos_Base,PC),A6
	jsr	(_LVOLock,A6)
	movea.l	(SP)+,A6
	rts

OpenLibrarySUB
	move.l	A6,-(SP)
	movea.l	(4),A6
	jsr	(_LVOOpenLibrary,A6)
	movea.l	(SP)+,A6
	rts

OpenNewSUB
	move.l	#MODE_NEWFILE,D2
	bra.b	OpenSubJoin

OpenOldSUB
	move.l	#MODE_OLDFILE,D2
OpenSubJoin	move.l	A6,-(SP)
	movea.l	(Dos_Base,PC),A6
	jsr	(_LVOOpen,A6)
	movea.l	(SP)+,A6
	rts

ReadSUB
	move.l	A6,-(SP)
	movea.l	(Dos_Base,PC),A6
	jsr	(_LVORead,A6)
	movea.l	(SP)+,A6
	rts

UnLockSUB
	move.l	A6,-(SP)
	movea.l	(Dos_Base,PC),A6
	jsr	(_LVOUnLock,A6)
	movea.l	(SP)+,A6
	rts

WriteSUB
	move.l	A6,-(SP)
	movea.l	(Dos_Base,PC),A6
	jsr	(_LVOWrite,A6)
	movea.l	(SP)+,A6
	rts

hunkdebug.handler
	tst.b	(stripdebugflag-DT,A4)
	beq.b	hunkunit.handler
	tst.b	(stripallflag-DT,A4)
	bne.b	getridofdebugcrap
	subq.l	#4,A6
	bra.b	getridofdebugcrap

hunkunit.handler
hunkname.handler	tst.b	(stripallflag-DT,A4)
	beq.b	hunkdata.handler
getridofdebugcrap	move.l	(A2)+,D0
	lsl.l	#2,D0
	adda.l	D0,A2
	rts

hunkdata.handler
hunkcode.handler	move.l	(A2)+,D0
	andi.l	#$3FFFFFFF,D0
	move.l	D0,(A6)+
	bsr.b	teststripallflag
	tst.l	D0
	beq.b	localrts
1$	move.l	(A2)+,(A6)+
	subq.l	#1,D0
	bne.b	1$
	rts

hunkbss.handler	move.l	(A2)+,(A6)+
	bsr.b	teststripallflag
hunkend.handler
localrts	rts

teststripallflag	tst.b	(stripallflag-DT,A4)
	beq.b	1$
	subq.l	#4,A6
1$	rts

hunkreloc8.handler
hunkreloc16.handler
hunkreloc32.handler	move.l	(A2)+,D0
	move.l	D0,(A6)+
	bsr	teststripallflag
	tst.l	D0
	beq.b	localrts
	move.l	(A2)+,(A6)+
	bsr	teststripallflag
2$	move.l	(A2)+,(A6)+
	bsr	teststripallflag
	subq.l	#1,D0
	bne.b	2$
	bra.b	hunkreloc8.handler

hunkext.handler	move.l	(A2)+,D0
	beq.b	localrts
	move.l	D0,(A6)+
	bsr	teststripallflag
	andi.l	#$FFFFFF,D0
	bne.b	1$
	rts

2$	move.l	(A2)+,(A6)+
	bsr	teststripallflag
1$	subq.l	#1,D0
	bne.b	2$
	bra.b	hunkext.handler

hunksymbol.handler	tst.b	(stripdebugflag-DT,A4)
	bne.b	2$
	tst.b	(fixflag-DT,A4)
	bne.b	2$
	subq.l	#4,A6
1$	move.l	(A2)+,D0
	beq.b	localrts
	lsl.l	#2,D0
	adda.l	D0,A2
	addq.l	#4,A2
	bra.b	1$

2$	move.l	(A2)+,D0
	move.l	D0,(A6)+
	beq.b	localrts
3$	move.l	(A2)+,(A6)+
	dbra	D0,3$
	subi.l	#$10000,D0
	bcc.b	3$
	bra.b	2$

hunkheader.handler	move.l	(A2)+,D0
	move.l	D0,(A6)+
	bsr	teststripallflag
	tst.l	D0
	beq.b	1$
2$	move.l	(A2)+,(A6)+
	bsr	teststripallflag
	subq.l	#1,D0
	bne.b	2$
1$	move.l	(A2)+,(A6)+
	bsr	teststripallflag
	movem.l	(A2)+,D0/D1
	movem.l	D0/D1,(A6)
	addq.l	#8,A6
	bsr	teststripallflag
	bsr	teststripallflag
	sub.l	D0,D1
	addq.l	#1,D1
4$	move.l	(A2)+,(A6)+
	bsr	teststripallflag
	subq.l	#1,D1
	bne.b	4$
	rts

hunkoverlay.handler
	bsr	hunkunit.handler
	move.l	(A2)+,(A6)+
	bsr	teststripallflag
hunkbreak.handler	rts
**********************************************************************
badparmsmsg	db	'Syntax: stripper [-d] <input file> <output file>',10,0
cantopeninputmsg	db	'Can''t open input file',10,0
corruptmsg	db	'Bad input file length',10,0
outofmemmsg	db	'Not enough memory!',10,0
readerrorinputmsg	db	'Read error - source file',10,0
corruptfile	db	'Unexpected hunk type in source file',10,0
cantopenoutput	db	'Can''t open output file!',10,0
errorduringwrite	db	'Error while writing to destination file!',10,0
DosName	db	'dos.library',0
	cnop	0,4
BssStart
fileinfoblock
	dx.l	1
	dx.l	1
	dx.b	108
	dx.l	1
	dx.l	1
CSD_fib_Size	dx.l	1
	dx.l	1
	dx.l	1
	dx.l	1
	dx.l	1
	dx.b	116
**********************************************************************
SaveA0	dx.l	1
SaveSP	dx.l	1
Dos_Base	dx.l	1
filelock	dx.l	1
filehandle	dx.l	1
InputBufferEnd	dx.l	1
COSHandle	dx.l	1
**********************************************************************
AllocTable	; size, then pointer
InputBufferSize	dx.l	1
InputBufferPtr	dx.l	1
OutputBufferSize	dx.l	1
OutputBufferPtr	dx.l	1
AllocTableEnd
DT
**********************************************************************
ReturnCode	dx.b	1
InputFileName	dx.b	$100
OutputFileName	dx.b	$100
stripallflag	dx.b	1
stripdebugflag	dx.b	1
fixflag	dx.b	1
BssEnd

	END

Ideas:  Optionally display a map of the file, including hunk types found,
