	opt	AMIGA
;* $Revision Header built automatically *************** (do not edit) ************
;*
;* © Copyright by F.Delacroix
;*
;* File             : DH0{42MB}:Progs/ScreenSaver/Screen2IFF.s
;* Created on       : Samedi, 22-Jan-94   16:47:02
;* Created by       : Frédéric DELACROIX
;* Current revision : V1.00
;*
;*
;* Purpose
;* -------
;*     This commodity saves the front screen to disk (in IFF ILBM
;*     format) when hotkey is pressed. Supports some WB & CLI
;*     options. Written on Hisoft's Devpac 3.
;*
;* Revision V1.00
;* --------------
;*     --- Initial release ---
;*
;*********************************************************************************
REVISION  MACRO
          dc.b "1.00"
          ENDM
REVDATE   MACRO
          dc.b "22-Jan-94  "
          ENDM
REVTIME   MACRO
          dc.b "16:47:02"
          ENDM
AUTHOR    MACRO
          dc.b "Frédéric DELACROIX"
          ENDM
VERNUM    EQU  01
REVNUM    EQU  00

	include	exec/execbase.i
	include	exec/alerts.i
	include	libraries/commodities.i
	include	libraries/commodities_lib.i
	include	dos/dostags.i
	include	workbench/icon_lib.i
	include	workbench/workbench.i
	include	libraries/iffparse.i
	include	libraries/iffparse_lib.i
	include	graphics/layers_lib.i

IE_SAVESCREEN	EQU	1
;DEBUG	SET	1

Start	move.l	4.w,a6
	move.l	ThisTask(a6),a4
	tst.l	pr_CLI(a4)
	bne.s	FromCLI
	lea	pr_MsgPort(a4),a0
	jsr	_LVOWaitPort(a6)
	lea	pr_MsgPort(a4),a0
	jsr	_LVOGetMsg(a6)
	move.l	d0,WB.Startup

FromCLI	lea	Intuition.Name(pc),a1
	jsr	_LVOOldOpenLibrary(a6)
	move.l	d0,Intuition.Base
	bne.s	IntuitionOK
	move.l	#AT_Recovery!AG_OpenLib!AO_Intuition,d7
	jsr	_LVOAlert(a6)
	bra	exit
IntuitionOK
	move.l	d0,a1
	cmp.w	#37,LIB_VERSION(a1)
	bge.s	KickOK
	move.l	a1,a6
	move.l	#RECOVERY_ALERT,d0
	lea	BadKickstart.ALT,a0
	move.l	#BadKickstart.HGT,d1
	jsr	_LVODisplayAlert(a6)
	bra.s	CloseIntuition

KickOK	lea	DOS.Name(pc),a1
	moveq	#37,d0
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,DOS.Base
	bne.s	DOSOK
	move.l	#AT_Recovery!AG_OpenLib!AO_DOSLib,d7
	jsr	_LVOAlert(a6)
	bra.s	CloseIntuition

DOSOK	bsr.s	ReadArgs
	IFD	DEBUG
	jmp	Resident
	ENDC
	lea	Start-4(pc),a0
	move.l	(a0),Child.SegList
	clr.l	(a0)
	move.l	#NewProc.Tags,d1
	move.l	DOS.Base,a6
	jsr	_LVOCreateNewProc(a6)
	tst.l	d0
	beq.s	CloseDOS
	bra.s	exit
CloseDOS
	bsr	SmallCleanUp
	move.l	DOS.Base,a1
	move.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)
CloseIntuition
	move.l	Intuition.Base,a1
	move.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)
exit	move.l	WB.Startup(pc),d0
	beq.s	ExitToCLI
	move.l	4.w,a6
	jsr	_LVOForbid(a6)
	move.l	d0,a1
	jsr	_LVOReplyMsg(a6)
ExitToCLI
	moveq	#0,d0
	rts

ReadArgs
	tst.l	WB.Startup
	bne.s	.WBArgs
	move.l	#Args.Template,d1
	move.l	#Args.Array,d2
	moveq	#0,d3
	move.l	DOS.Base,a6
	jsr	_LVOReadArgs(a6)
	move.l	d0,Args.RDArgs
	rts

.WBArgs	lea	Icon.Name,a1
	moveq	#37,d0
	move.l	4.w,a6
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,Icon.Base
	beq.s	.NoIconLib
	move.l	WB.Startup(pc),a2
	tst.l	sm_NumArgs(a2)
	beq.s	.NoIconLib
	move.l	sm_ArgList(a2),d0
	beq.s	.NoIconLib
	move.l	d0,a2
	move.l	wa_Lock(a2),d1
	move.l	DOS.Base,a6
	jsr	_LVOCurrentDir(a6)
	move.l	wa_Name(a2),a0
	move.l	Icon.Base,a6
	jsr	_LVOGetDiskObject(a6)
	move.l	d0,Program.DiskObject
	beq.s	.NoIconLib
	move.l	d0,a2

	lea	HotKey.TT(pc),a1
	move.l	do_ToolTypes(a2),a0
	jsr	_LVOFindToolType(a6)
	move.l	d0,SaveScreen.Descr

	lea	BaseName.TT(pc),a1
	move.l	do_ToolTypes(a2),a0
	jsr	_LVOFindToolType(a6)
	move.l	d0,BaseName

	lea	CXPri.TT(pc),a1
	move.l	do_ToolTypes(a2),a0
	jsr	_LVOFindToolType(a6)
	move.l	d0,d1
	move.l	#CXPri,d2
	move.l	DOS.Base,a6
	jsr	_LVOStrToLong(a6)
.NoIconLib
	rts

SmallCleanUp
	move.l	Program.DiskObject,d0
	beq.s	.NoDiskOb
	move.l	Icon.Base,a6
	move.l	d0,a0
	jsr	_LVOFreeDiskObject(a6)
.NoDiskOb
	move.l	Args.RDArgs,d1
	beq.s	.NoRDArgs
	move.l	DOS.Base,a6
	jsr	_LVOFreeArgs(a6)
.NoRDArgs
	move.l	Icon.Base,d0
	beq.s	.NoIcon
	move.l	d0,a1
	move.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)
.NoIcon	rts


WB.Startup	dc.l	0
NewProc.Tags	dc.l	NP_Seglist
Child.SegList	dc.l	0
	dc.l	NP_Name,Screen2IFF.Name
	dc.l	NP_Priority,2
	dc.l	NP_WindowPtr,0
	dc.l	TAG_DONE

DOS.Name	dc.b	'dos.library',0
Intuition.Name	dc.b	'intuition.library',0
Args.Template	dc.b	'HOTKEY,BASENAME,CXPRI/N',0
HotKey.TT	dc.b	'HOTKEY',0
BaseName.TT	dc.b	'BASENAME',0
CXPri.TT	dc.b	'CXPRI',0

	section	Resident,CODE
Resident
	lea	Graphics.Name(pc),a1
	moveq	#37,d0
	move.l	4.w,a6
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,Graphics.Base
	bne.s	GraphicsOK
	move.l	#AT_Recovery!AG_OpenLib!AO_GraphicsLib,d7
	jsr	_LVOAlert(a6)
	bra	CloseDOSResident

GraphicsOK
	lea	Layers.Name(pc),a1
	moveq	#37,d0
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,Layers.Base
	bne.s	LayersOK
	move.l	#AT_Recovery!AG_OpenLib!AO_LayersLib,d7
	jsr	_LVOAlert(a6)
	bra	CloseGraphics

LayersOK
	lea	Commodities.Name(pc),a1
	moveq	#37,d0
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,Commodities.Base
	bne.s	CommoditiesOK
	lea	NoCommodities.MSG(pc),a0
	bsr	Print
	bra.s	CloseLayers
CommoditiesOK
	lea	IFFParse.Name(pc),a1
	moveq	#37,d0
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,IFFParse.Base
	bne.s	IFFParseOK
	lea	NoIFFParse.MSG(pc),a0
	bsr	Print
	bra.s	CloseCommodities
IFFParseOK
	move.l	d0,a6
	jsr	_LVOAllocIFF(a6)
	move.l	d0,SaveFile.IFF
	bne.s	IFFOK
	lea	NotEnoughMem.MSG(pc),a0
	bsr.s	Print
	bra.s	CloseIFFParse
IFFOK	move.l	d0,a0
	jsr	_LVOInitIFFasDOS(a6)

	bsr	SetCommodity
	tst.l	d0
	beq.s	CloseCommodities
	bsr	ProcessMessages
	bsr	RemCommodity

FreeIFF	move.l	SaveFile.IFF(pc),a0
	move.l	IFFParse.Base(pc),a6
	jsr	_LVOFreeIFF(a6)
CloseIFFParse
	move.l	IFFParse.Base(pc),a1
	move.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)
CloseCommodities
	move.l	Commodities.Base(pc),a1
	move.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)
CloseLayers
	move.l	Layers.Base(pc),a1
	move.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)
CloseGraphics
	move.l	Graphics.Base(pc),a1
	move.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)
CloseDOSResident
	move.l	DOS.Base(pc),a1
	move.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)
	move.l	Intuition.Base(pc),a1
	move.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)
	moveq	#0,d0
	rts

Print	movem.l	d0-d1/a0-a3/a6,-(sp)	; Print(Message)(A0)
	lea	EasyPrint(pc),a1
	move.l	a0,es_TextFormat(a1)
	suba.l	a0,a0
	move.l	a0,a2
	move.l	a2,a3
	move.l	Intuition.Base(pc),a6
	jsr	_LVOEasyRequestArgs(a6)
	movem.l	(sp)+,d0-d1/a0-a3/a6
	rts

SetCommodity	; (D0)Success=SetCommodity()
	move.l	4.w,a6
	jsr	_LVOCreateMsgPort(a6)
	lea	Screen2IFF.NewBroker(pc),a0
	move.l	d0,nb_Port(a0)
	bne.s	.PortOK
	lea	NotEnoughMem.MSG(pc),a0
	bsr	Print
	bra.s	.Failure

.PortOK	move.l	CXPri(pc),d0
	beq.s	.NoPri
	move.l	d0,a1
	move.b	3(a1),nb_Pri(a0)
.NoPri	move.l	#CXError,d0
	move.l	Commodities.Base(pc),a6
	jsr	_LVOCxBroker(a6)
	move.l	d0,CXBroker
	bne.s	.BrokerOK
	move.l	CXError(pc),d0
	cmp.l	#CBERR_SYSERR,d0
	beq.s	.NoMem
	cmp.l	#CBERR_DUP,d0
	beq.s	.Removed
	lea	UnknownCXError.MSG(pc),a0
	bra.s	.ErrorDone
.Removed
	lea	Removed.MSG(pc),a0
	bra.s	.ErrorDone
.NoMem	lea	NotEnoughMem.MSG(pc),a0
.ErrorDone
	bsr	Print
	bra.s	.Failure

.BrokerOK
	lea	SaveScreen.HKD(pc),a0
	bsr.s	CreateHotKey
	move.l	d0,SaveScreen.HK
	beq.s	.Failure

	move.l	CXBroker(pc),a0
	moveq	#-1,d0
	move.l	Commodities.Base(pc),a6
	jsr	_LVOActivateCxObj(a6)

	moveq	#-1,d0
	rts

.Failure
	move.l	CXBroker(pc),a0
	bsr	DeleteObj
	move.l	CXPort(pc),d0
	beq.s	.NoPortToRemove
	move.l	d0,a0
	move.l	4.w,a6
	jsr	_LVODeleteMsgPort(a6)
.NoPortToRemove
	moveq	#0,d0
	rts

; hotkey description structure
	rsreset
HKD_ID	rs.l	1
HKD_Current	rs.l	1	; (pointer to pointer to string)
HKD_Default	rs.l	1
HKD_SIZEOF	rs.w	0

CreateHotKey	; (D0)(Filter)=CreateHotKey(Descr)(A0)
	movem.l	d2/a0-a3/a6,-(sp)
	move.l	a0,a2
	moveq	#CX_FILTER,d0
	move.l	HKD_Current(a2),a0
	move.l	(a0),d1
	bne.s	.DescOK
	move.l	HKD_Default(a2),d1
.DescOK	move.l	d1,a0
	suba.l	a1,a1
	move.l	Commodities.Base(pc),a6
	jsr	_LVOCreateCxObj(a6)
	move.l	d0,d2
	beq.s	.NoFilter
	move.l	d2,a0
	jsr	_LVOCxObjError(a6)
	cmp.l	#COERR_BADFILTER,d0
	bne.s	.DescrOK
	lea	BadHotKeyDescr.MSG(pc),a0
	bsr	Print
	move.l	HKD_Default(a2),a1
	move.l	d2,d0
	jsr	_LVOSetFilter(a6)
.DescrOK
	moveq	#CX_SEND,d0
	move.l	CXPort(pc),a0
	move.l	HKD_ID(a2),a1
	jsr	_LVOCreateCxObj(a6)
	move.l	d0,a1
	move.l	a1,d0
	beq.s	.NoSender
	move.l	d2,a0
	jsr	_LVOAttachCxObj(a6)
	moveq	#CX_TRANSLATE,d0
	suba.l	a0,a0
	move.l	a0,a1
	jsr	_LVOCreateCxObj(a6)
	move.l	d2,a0
	move.l	d0,a1
	move.l	a1,d0
	beq.s	.NoTranslate
	jsr	_LVOAttachCxObj(a6)
	move.l	d2,a1
	move.l	CXBroker(pc),a0
	jsr	_LVOAttachCxObj(a6)
	move.l	d2,d0
	movem.l	(sp)+,d2/a0-a3/a6
	rts

.NoTranslate
.NoSender
	move.l	d2,a0
	jsr	_LVODeleteCxObjAll(a6)
.NoFilter
	lea	NotEnoughMem.MSG(pc),a0
	bsr	Print
	movem.l	(sp)+,d2-d3/a0-a3/a6
	moveq	#0,d0
	move.l	d0,d1
	rts

DeleteObj	; DeleteObj(Object)(A0)
	movem.l	d0-d1/a0-a1/a6,-(sp)
	move.l	Commodities.Base(pc),a6
	jsr	_LVODeleteCxObjAll(a6)
	movem.l	(sp)+,d0-d1/a0-a1/a6
	rts

RemCommodity
	move.l	CXBroker(pc),a0
	bsr	DeleteObj
	move.l	4.w,a6
.MsgLoop
	move.l	CXPort(pc),a0
	jsr	_LVOGetMsg(a6)
	move.l	d0,a1
	move.l	a1,d0
	beq.s	.EndOfMsg
	jsr	_LVOReplyMsg(a6)
	bra.s	.MsgLoop
.EndOfMsg
	move.l	CXPort(pc),a0
	jsr	_LVODeleteMsgPort(a6)
	rts

ProcessMessages
	move.l	CXPort(pc),a0
	move.l	4.w,a6
	jsr	_LVOWaitPort(a6)
GetCXMessage
	move.l	CXPort(pc),a0
	move.l	4.w,a6
	jsr	_LVOGetMsg(a6)
	move.l	d0,a2
	move.l	a2,d0
	beq.s	ProcessMessages
	move.l	a2,a0
	move.l	Commodities.Base(pc),a6
	jsr	_LVOCxMsgType(a6)
	move.l	d0,d2
	move.l	a2,a0
	jsr	_LVOCxMsgID(a6)
	move.l	d0,d3
	move.l	a2,a1
	move.l	4.w,a6
	jsr	_LVOReplyMsg(a6)
	cmp.l	#CXM_COMMAND,d2
	beq.s	ProcessCommand
	cmp.l	#CXM_IEVENT,d2
	beq.s	ProcessEvent
	lea	UnknownCXMessage.MSG,a0
	bsr	Print
	bra.s	GetCXMessage
ProcessCommand
	cmp.l	#CXCMD_DISABLE,d3
	beq.s	.Disable
	cmp.l	#CXCMD_ENABLE,d3
	beq.s	.Enable
	cmp.l	#CXCMD_UNIQUE,d3
	beq.s	.Kill
	cmp.l	#CXCMD_KILL,d3
	beq.s	.Kill
	lea	UnknownCXMessage.MSG,a0
	bsr	Print
	bra.s	GetCXMessage
.Disable
	moveq	#0,d0
	bra.s	.ActBro
.Enable	moveq	#-1,d0
.ActBro	move.l	CXBroker(pc),a0
	move.l	Commodities.Base(pc),a6
	jsr	_LVOActivateCxObj(a6)
	bra	GetCXMessage
.Kill	rts

ProcessEvent
	cmp.l	#IE_SAVESCREEN,d3
	bne.s	.NoSaveScreen
	bsr.s	SaveScreen
.NoSaveScreen
	bra	GetCXMessage


SaveScreen
	move.l	Intuition.Base(pc),a6
	IFND	DEBUG
	moveq	#0,d0
	jsr	_LVOLockIBase(a6)
	move.l	d0,d2
	ENDC
	move.l	ib_FirstScreen(a6),a5
	IFND	DEBUG
	move.l	4.w,a6
	jsr	_LVOForbid(a6)
	move.l	Intuition.Base(pc),a6
	move.l	d2,a0
	jsr	_LVOUnlockIBase(a6)

	lea	sc_LayerInfo(a5),a0
	move.l	Layers.Base(pc),a6
	jsr	_LVOLockLayerInfo(a6)
	move.l	4.w,a6
	jsr	_LVOPermit(a6)
	ENDC

; lets copy the bitplanes into fresh memory while screen is locked
DebugHere
	move.l	sc_RastPort+rp_BitMap(a5),a4
	moveq	#0,d0
	move.l	d0,d1
	move.w	bm_BytesPerRow(a4),d0
	move.w	bm_Rows(a4),d1
	mulu	d1,d0
	move.l	d0,d7			; d7= Plane size
	moveq	#0,d6
	move.b	bm_Depth(a4),d6		; d6= Depth
	lsl.l	d6,d0
	move.l	d0,Body.Size
	move.l	#MEMF_PUBLIC,d1
	move.l	4.w,a6
	jsr	_LVOAllocVec(a6)
	move.l	d0,a3			; a3= Copy of bitplanes (interleaved)
	move.l	a3,Bitplanes.Copy
	bne.s	.MemOK
	bsr	SurrenderLI
	lea	NotEnoughMem.MSG(pc),a0
	bra	Print
.MemOK
	moveq	#0,d7			; line offset
	move.l	d7,d6
	move.w	bm_BytesPerRow(a4),d6	; byte counter
	move.w	bm_Rows(a4),d5		; line counter
	subq.w	#1,d5
.NextLine
	moveq	#0,d4			; plane counter
	move.b	bm_Depth(a4),d4
	subq.w	#1,d4
	lea	bm_Planes(a4),a0	; plane pointer pointer
.NextPlane
	move.l	(a0)+,a1		; plane pointer
	add.l	d7,a1			; point right line
	move.l	d6,d3		; number of bytes to transfer
	subq.l	#1,d3
.CopyLoop
	move.b	(a1)+,(a3)+
	dbra	d3,.CopyLoop
	dbra	d4,.NextPlane
	add.l	d6,d7
	dbra	d5,.NextLine

	moveq	#0,d0
	move.w	bm_BytesPerRow(a4),d0
	lsl.l	#3,d0
	move.w	d0,BMHD.Wid
	move.w	d0,BMHD.pageWidth
	moveq	#0,d1
	move.w	bm_Rows(a4),BMHD.H
	move.w	bm_Rows(a4),BMHD.pageHeight
	move.b	bm_Depth(a4),BMHD.nPlanes

	moveq	#1,d3
	moveq	#0,d1
	move.b	bm_Depth(a4),d1
	lsl.l	d1,d3
	move.l	d3,NColors
	move.l	d3,d0
	mulu	#3,d0
	move.l	#MEMF_CLEAR,d1
	move.l	4.w,a6
	jsr	_LVOAllocVec(a6)
	move.l	d0,CMap
	bne.s	.CMAPAllocated
	bsr	SurrenderLI
	lea	NotEnoughMem.MSG(pc),a0
	bsr	Print
	bra	.FreeBODY
.CMAPAllocated
	move.l	d0,a2
	move.l	sc_ViewPort+vp_ColorMap(a5),a3
	move.l	Graphics.Base(pc),a6
	subq.l	#1,d3
.FillCMap
	move.l	NColors(pc),d0
	sub.l	d3,d0
	subq.l	#1,d0
	move.l	a3,a0
	jsr	_LVOGetRGB4(a6)
	move.l	d0,d1
	and.l	#%0000111100000000,d0
	lsr.l	#4,d0
	move.b	d0,(a2)+
	move.l	d1,d0
	and.l	#%0000000011110000,d0
	move.b	d0,(a2)+
	move.l	d1,d0
	and.l	#%0000000000001111,d0
	lsl.l	#4,d0
	move.b	d0,(a2)+
	dbra	d3,.FillCMap

	move.w	sc_ViewPort+vp_Modes(a5),d0
	and.l	#(~(V_SPRITES|GENLOCK_VIDEO))&$FFFF,d0
	move.l	d0,CAMG
	bsr	SurrenderLI

.TryThisFile
	move.l	BaseName(pc),d1
	move.l	#MODE_OLDFILE,d2
	move.l	DOS.Base(pc),a6
	jsr	_LVOOpen(a6)
	move.l	d0,d1
	beq.s	.ThisFile
	jsr	_LVOClose(a6)
	move.l	BaseName(pc),a0
	bsr	StrLen
	move.b	-1(a0,d0),d1
	addq.b	#1,d1
	cmp.b	#'Z',d1
	ble.s	.NotZ
	move.b	#'A',d1
.NotZ	move.b	d1,-1(a0,d0)
	bra.s	.TryThisFile

.ThisFile
	move.l	BaseName(pc),d1
	move.l	#MODE_NEWFILE,d2
	jsr	_LVOOpen(a6)
	move.l	d0,SaveFile.Handle
	bne.s	.SaveFileOpened
	lea	CantOpenSaveFile.MSG(pc),a0
	bsr	Print
	bra	.FreeCMAP
.SaveFileOpened
	move.l	SaveFile.IFF(pc),a0
	move.l	d0,iff_Stream(a0)
	move.l	#IFFF_WRITE,d0
	move.l	IFFParse.Base(pc),a6
	jsr	_LVOOpenIFF(a6)
	tst.l	d0
	beq.s	.IFFOpened
	lea	CantOpenSaveFile.MSG(pc),a0
	bsr	Print
	bra	.CloseFile
.IFFOpened
	move.l	SaveFile.IFF(pc),a0
	move.l	#'ILBM',d0
	move.l	#'FORM',d1
	move.l	#IFFSIZE_UNKNOWN,d2
	jsr	_LVOPushChunk(a6)
	tst.l	d0
	beq.s	.FORMPushed
.IFFError
	lea	ErrorWriting.MSG(pc),a0
	bsr	Print
	bra	.CloseIFF
.FORMPushed
	move.l	SaveFile.IFF(pc),a0	; let's create BMHD
	move.l	#'BMHD',d1
	move.l	#BMHD.SIZEOF,d2
	jsr	_LVOPushChunk(a6)
	tst.l	d0
	bne.s	.IFFError
	lea	BMHD.Buffer(pc),a1
	move.l	SaveFile.IFF(pc),a0
	move.l	d2,d0
	jsr	_LVOWriteChunkBytes(a6)
	cmp.l	d0,d2
	bne.s	.IFFError
	move.l	SaveFile.IFF(pc),a0
	jsr	_LVOPopChunk(a6)
	tst.l	d0
	bne.s	.IFFError

	move.l	SaveFile.IFF(pc),a0		; go CAMG
	move.l	#'CAMG',d1
	move.l	#4,d2
	jsr	_LVOPushChunk(a6)
	tst.l	d0
	bne.s	.IFFError
	lea	CAMG(pc),a1
	move.l	SaveFile.IFF(pc),a0
	move.l	d2,d0
	jsr	_LVOWriteChunkBytes(a6)
	cmp.l	d0,d2
	bne.s	.IFFError
	move.l	SaveFile.IFF(pc),a0
	jsr	_LVOPopChunk(a6)
	tst.l	d0
	bne.s	.IFFError

	move.l	SaveFile.IFF(pc),a0		; we're going to write the CMAP
	move.l	#'CMAP',d1
	move.l	NColors(pc),d2
	mulu	#3,d2
	jsr	_LVOPushChunk(a6)
	tst.l	d0
	bne	.IFFError
	move.l	SaveFile.IFF(pc),a0
	move.l	CMap(pc),a1
	move.l	d2,d0
	jsr	_LVOWriteChunkBytes(a6)
	cmp.l	d0,d2
	bne	.IFFError
	move.l	SaveFile.IFF(pc),a0
	jsr	_LVOPopChunk(a6)
	tst.l	d0
	bne	.IFFError
	
	move.l	SaveFile.IFF(pc),a0		; the big one: BODY
	move.l	#'BODY',d1
	move.l	Body.Size(pc),d2
	jsr	_LVOPushChunk(a6)
	tst.l	d0
	bne	.IFFError
	move.l	SaveFile.IFF(pc),a0
	move.l	Bitplanes.Copy(pc),a1
	move.l	d2,d0
	jsr	_LVOWriteChunkBytes(a6)
	cmp.l	d2,d0
	bne	.IFFError
	move.l	SaveFile.IFF(pc),a0
	jsr	_LVOPopChunk(a6)
	tst.l	d0
	bne	.IFFError

	move.l	SaveFile.IFF(pc),a0
	jsr	_LVOPopChunk(a6)
	tst.l	d0
	bne	.IFFError

.CloseIFF
	move.l	SaveFile.IFF(pc),a0
	move.l	IFFParse.Base(pc),a6
	jsr	_LVOCloseIFF(a6)
.CloseFile
	move.l	SaveFile.Handle(pc),d1
	move.l	DOS.Base(pc),a6
	jsr	_LVOClose(a6)
.FreeCMAP
	move.l	CMap(pc),a1
	move.l	4.w,a6
	jsr	_LVOFreeVec(a6)	
.FreeBODY
	move.l	Bitplanes.Copy(pc),a1
	move.l	4.w,a6
	jsr	_LVOFreeVec(a6)
	rts

SurrenderLI
	IFND	DEBUG
	movem.l	d0-d1/a0-a1/a6,-(sp)
	lea	sc_LayerInfo(a5),a0
	move.l	Layers.Base(pc),a6
	jsr	_LVOUnlockLayerInfo(a6)
	movem.l	(sp)+,d0-d1/a0-a1/a6
	ENDC
	rts

StrLen	; (D0,Z)Len=StrLen(String)(A0)
	move.l	a0,-(sp)
	move.l	a0,d0
.Loop	tst.b	(a0)+
	bne.s	.Loop
	sub.l	d0,a0
	move.l	a0,d0
	move.l	(sp)+,a0
	subq.l	#1,d0
	rts

EasyPrint	dc.l	es_SIZEOF
	dc.l	0
	dc.l	EasyPrint.Title
	dc.l	0
	dc.l	EasyPrint.Gad

Screen2IFF.NewBroker
	dc.b	NB_VERSION,0
	dc.l	Screen2IFF.Name
	dc.l	Screen2IFF.Title
	dc.l	Screen2IFF.Descr
	dc.w	NBU_UNIQUE!NBU_NOTIFY
	dc.w	0
	dc.b	10,0
CXPort	dc.l	0
	dc.w	0

CXBroker	dc.l	0
CXError	dc.l	0

SaveScreen.HKD	dc.l	IE_SAVESCREEN,SaveScreen.Descr,SaveScreen.Def

Args.Array
SaveScreen.Descr
	dc.l	0
BaseName
	dc.l	DefaultFile.Name
CXPri	dc.l	0

SaveScreen.HK	dc.l	0

BMHD.Buffer
BMHD.Wid	dc.w	0
BMHD.H	dc.w	0
	dc.w	0,0
BMHD.nPlanes	dc.b	0,0
BMHD.Compression	dc.b	0,0	; not compressed (yet?)
	dc.w	0,$0101
BMHD.pageWidth	dc.w	0
BMHD.pageHeight	dc.w	0
BMHD.SIZEOF=*-BMHD.Buffer

NColors	dc.l	0
CMap	dc.l	0

CAMG	dc.l	0

Bitplanes.Copy	dc.l	0
Body.Size	dc.l	0

Args.RDArgs	dc.l	0
Program.DiskObject	dc.l	0

SaveFile.Handle	dc.l	0
SaveFile.IFF	dc.l	0

Intuition.Base	dc.l	0
DOS.Base	dc.l	0
Icon.Base	dc.l	0
Graphics.Base	dc.l	0
Layers.Base	dc.l	0
Commodities.Base	dc.l	0
IFFParse.Base	dc.l	0

Graphics.Name	dc.b	'graphics.library',0
Layers.Name	dc.b	'layers.library',0
Commodities.Name	dc.b	'commodities.library',0
IFFParse.Name	dc.b	'iffparse.library',0
Icon.Name	dc.b	'icon.library',0
Screen2IFF.Name	dc.b	'Screen2IFF',0
DefaultFile.Name	dc.b	'ScreenA',0

NoCommodities.MSG	dc.b	'Unable to open commodities.library V37+ !',0
NoIFFParse.MSG	dc.b	'Unable to open iffparse.library V37+ !',0
NotEnoughMem.MSG	dc.b	'Not enough memory !',0
UnknownCXError.MSG	dc.b	'Commodities reports an unknown error !',0
Removed.MSG	dc.b	'Removed Screen2IFF',0
BadHotKeyDescr.MSG	dc.b	'Bad hotkey description string.',10
	dc.b	'Default used.',0
UnknownCXMessage.MSG	dc.b	'Unknown Commodities message received !',10
	dc.b	'(This is VERY strange !)',0
CantOpenSaveFile.MSG	dc.b	'Cannot open save file !',0
ErrorWriting.MSG	dc.b	'Error writing output file !',0

EasyPrint.Title	dc.b	'Message from Screen2IFF:',0
EasyPrint.Gad	dc.b	'Aha.',0
Screen2IFF.Title	dc.b	'Screen2IFF '
	REVISION
	dc.b	' © 1994 F.Delacroix',0
Screen2IFF.Descr	dc.b	'Saves screen when hotkey pressed.',0

SaveScreen.Def	dc.b	'lcommand rcommand f10',0

BadKickstart.ALT	dc.b	0,176,14
	dc.b	'You need kickstart V37.175 (2.04) !',0,0
BadKickstart.HGT	EQU	24
