	opt d+

INC_DOS		EQU	0 1
INC_INT		EQU	 1
INC_GFX		EQU	 1
INC_GAD		EQU	0 1
INC_ASL		EQU	0 1
INC_UTI		EQU	 1
INC_WB		EQU	0 1

	incdir	INCLUDE:
	include	Automacros.i
	include	libraries/notifyintuition.i

	; StartUp Nr,TaskName,Stack     Taskname + Stack only for Async_Run
	STARTUP	1,<'Async TaskName'>,4096	; 0=OFF 1=WB+CLI 2=ONLY_WB 3=ONLY_CLI 4=ASYNC_RUN

 STRUCTURE test,0
	STRUCT	ansc_Notify,IntNotifyRequest_SIZEOF
	LONG	ansc_SigBits
	APTR	ansc_Screen		Workbench-Screenaddress if Pens are locked otherwise NULL
	STRUCT	ansc_Pens,8*2		Pennumber to use Ansi 0-7
	STRUCT	ansc_PenState,8		State if Pen is locked from ColorMap
	LABEL	ansc_SIZEOF

_main:	suba.l	a5,a5
	OPENDOS	0
	OPENUTI	0
	OPENINT	39
	OPENGFX	39
	beq	NotKS31
	OPENLIB	NotIName,_NotIBase(pc),2
	beq	Need
	moveq	#ansc_SIZEOF,d0
	move.l	#MEMF_CLEAR!MEMF_PUBLIC,d1
	CALLEXEC AllocVec
	move.l	d0,a5
	tst.l	d0
	beq	Ende
	CALLDOS	GetArgStr
	move.l	d0,a0
	bsr	Len
	move.l	a0,a2
	move.l	d0,d2
	clr.b	-1(a2,d2.w)
	CALLEXEC CreateMsgPort
	lea	ansc_Notify(a5),a0
	move.l	a2,inr_Name(a0)
	move.l	d0,inr_Port(a0)
	move.b	#105,inr_Pri(a0)	100 hat IPrefs
	move.l	#'ANSC',inr_UniqueID(a0)
	move.l	#INRF_SEND_MESSAGE!INRF_WAIT_REPLY!INRF_BEFORE_OPENSCREEN!INRF_AFTER_OPENSCREEN,ansc_Notify+inr_Flags(a0)
	move.l	_NotIBase(pc),a6
	CALLLIB	NotIStartNotify
	tst.l	d0
	beq	TypeERR
	moveq	#0,d0
	moveq	#0,d1
	move.l	ansc_Notify+inr_Port(a5),a0
	move.b	MP_SIGBIT(a0),d1
	bset	d1,d0
	bset	#12,d0
	move.l	d0,ansc_SigBits(a5)
	bra	Mloop
Wait	move.l	ansc_SigBits(a5),d0
	CALLEXEC Wait
	btst	#12,d0
	bne.s	Ende
Mloop	move.l	ansc_Notify+inr_Port(a5),a0
	CALLEXEC GetMsg
	tst.l	d0
	beq.s	Wait
	move.l	d0,a2
	bsr	WorkOnMsg
Reply	move.l	a2,a1
	CALLEXEC ReplyMsg
	bra.s	Mloop
Need	lea	YouNeed(pc),a0
Text	move.l	a0,d1
	CALLDOS	PutStr
	bra	Ende
NotKS31	lea	NotKS31txt(pc),a0
	bra	Text
TypeERR:
	move.b	ansc_Notify+inr_Error(a5),d0
	lea	UniqueTXT(pc),a0
	cmp.b	#INRERROR_UNIQUE,d0
	beq.s	.type
	lea	LowMem(pc),a0
	cmp.b	#INRERROR_LOWMEM,d0
	bne	Ende
.type	move.l	a0,d1
	CALLDOS	PutStr

Ende:	move.l	a5,d0
	beq.s	.Closelibs
	tst.l	ansc_Notify+inr_ReqSemaphore(a5)
	beq.s	.NotInt
.Again	lea	ansc_Notify(a5),a0
	move.l	_NotIBase(pc),a6
	CALLLIB	NotIEndNotify
	tst.l	d0
	bne.s	.NotInt
	move.b	ansc_Notify+inr_Error(a5),d0
	cmp.b	#INRERROR_OUTSTANDING_MSGS,d0
	beq.s	.ClearPort
	cmp.b	#INRERROR_ISLOCKED,d0
	beq.s	.wait
	cmp.b	#INRERROR_UNKNOWN,d0
	beq.s	.NotInt
	illegal
.wait	moveq	#5,d1
	CALLDOS	Delay
.ClearPort
	move.l	ansc_Notify+inr_Port(a5),a0
	CALLEXEC GetMsg
	tst.l	d0
	beq.s	.Again
	move.l	d0,a1
	CALLLIB	ReplyMsg
	bra.s	.ClearPort
.NotInt	move.l	ansc_Notify+inr_Port(a5),d0
	beq.s	.NoPort
	move.l	d0,a0
	CALLEXEC DeleteMsgPort
.NoPort	move.l	a5,a1
	CALLEXEC FreeVec
.Closelibs
	CLOSEDOS	MACRO schließt die dos.lib wenn sie offen war
	CLOSEUTI
	CLOSEINT
	CLOSEGFX
	CLOSELIB _NotIBase
	moveq	#0,d0
	rts
WorkOnMsg:
	cmp.w	#INRCODE_BEFORE_OPENSCREEN,inm_Code(a2)
	bne	After
	bsr	ClearVar
.tags	tst.l	inm_TagListPtr(a2)		TagList ?
	beq	.nsStruct

	move.l	#SA_LikeWorkbench,d0
	move.l	inm_TagListPtr(a2),a0
	CALLUTI	FindTagItem
	tst.l	d0
	bne	.x

	move.l	#SA_Depth,d0
	moveq	#0,d1
	move.l	inm_TagListPtr(a2),a0
	CALLLIB	GetTagData
	beq	.nsStruct
	cmp.w	#3,d0
	ble	.x

	move.l	#SA_SharePens,d0
	move.l	inm_TagListPtr(a2),a0
	CALLLIB	FindTagItem
	tst.l	d0
	beq	.addnew
	move.l	d0,a0
	moveq	#1,d0
	move.l	d0,4(a0)

	move.l	#SA_FullPalette,d0
	move.l	inm_TagListPtr(a2),a0
	CALLLIB	FindTagItem
	tst.l	d0
	beq	.addnew
	move.l	d0,a0
	moveq	#1,d0
	move.l	d0,4(a0)

	bra	.x
.nsStruct
	move.l	inm_IntObject(a2),d0
	beq	.x
	move.l	d0,a0
	cmp.w	#3,ns_Depth(a0)		8 Farben oder weniger ?
	ble	.x
.addnew
	moveq	#80,d0
	move.l	#MEMF_CLEAR!MEMF_PUBLIC,d1
	CALLEXEC AllocVec
	move.l	d0,a3
	move.l	d0,a4

	moveq	#1,d0
	move.l	ID_TAG(pc),(a4)+
	move.l	d0,(a4)+
	move.l	#SA_SharePens,(a4)+
	move.l	d0,(a4)+
	move.l	#SA_Type,(a4)+
	move.l	#PUBLICSCREEN,(a4)+
	move.l	#SA_SysFont,(a4)+
	move.l	d0,(a4)+
	move.l	#SA_FullPalette,(a4)+
	move.l	d0,(a4)+
	move.l	#TAG_MORE,(a4)+
	move.l	inm_TagListPtr(a2),(a4)
	move.l	a3,inm_TagListPtr(a2)
.x	rts
After:
	cmp.w	#INRCODE_AFTER_OPENSCREEN,inm_Code(a2)
	bne	.x
	move.l	inm_TagListPtr(a2),d0		TagList ?
	beq	.colors
	move.l	d0,a0
	move.l	ID_TAG(pc),d0
	CALLUTI	FindTagItem
	tst.l	d0
	beq.s	.colors
	move.l	d0,a1
	move.l	d0,a0
	moveq	#TAG_MORE,d0
.1	cmp.l	(a0)+,d0
	lea	4(a0),a0
	bne.s	.1
	move.l	-4(a0),inm_TagListPtr(a2)
	CALLEXEC FreeVec
.colors	move.l	inm_IntObject(a2),d0
	beq.s	.x
	bsr	LockAnsi
.x	rts
ClearVar:
	moveq	#0,d0
	move.l	d0,ansc_Screen(a5)
	move.l	d0,ansc_Pens(a5)
	move.l	d0,ansc_Pens+4(a5)
	move.l	d0,ansc_Pens+8(a5)
	move.l	d0,ansc_Pens+12(a5)
	move.l	d0,ansc_PenState(a5)
	move.l	d0,ansc_PenState+4(a5)

	rts
LockAnsi:
	movem.l	d0-a6,-(sp)
	move.l	d0,a3
	move.l	a3,ansc_Screen(a5)
	move.l	sc_RastPort+rp_BitMap(a3),a0
	moveq	#BMA_DEPTH,d1
	CALLGFX	GetBitMapAttr
	cmp.w	#3,d0
	ble	.err
	moveq	#1,d1
	lsl	d0,d1
	subq	#1,d1
	move.l	d1,d7
	asr.w	#1,d7
	move.l	d1,d6
	sub.l	d7,d6
	moveq	#0,d4	PEN_EXCLUSIVE=1     PEN_NO_SETCOLOR=2
	moveq	#0,d5
	move.l	sc_ViewPort+vp_ColorMap(a3),-(sp)

.lo1	move.l	d5,d0
	move.w	d0,d1
	asl	#1,d1
	move.w	d6,ansc_Pens(a5,d1.w)		Pen n locked
	bsr	GetRegs
	move.l	d6,d0
	move.l	(sp),a0		sc_ViewPort+vp_ColorMap(a3),a0
	CALLLIB	ObtainPen
	tst.l	d0
	spl	ansc_PenState(a5,d5.w)

	moveq	#7,d0
	sub.w	d5,d0
	move.w	d0,d1
	asl	#1,d1
	move.w	d7,ansc_Pens(a5,d1.w)
	bsr	GetRegs
	move.l	d7,d0
	move.l	(sp),a0		sc_ViewPort+vp_ColorMap(a3),a0
	CALLLIB	ObtainPen
	moveq	#7,d1
	sub.w	d5,d1
	tst.l	d0
	spl	ansc_PenState(a5,d1.w)

	subq	#1,d7
	addq	#1,d6
	addq	#1,d5
	cmp.b	#4,d5
	bne.s	.lo1

	moveq	#0,d5
	lea	ansc_Pens(a5),a2
.lo2	tst.b	ansc_PenState(a5,d5.w)
	bne.s	.next
	move.l	d5,d0
	bsr	GetRegs
	movem.w	(a2),d0
	lea	sc_ViewPort(a3),a0
  	CALLLIB	SetRGB32		Pens vordefinieren
.next	addq.l	#2,a2
	addq	#1,d5
	cmp.w	#8,d5
	bne.s	.lo2

	addq.l	#4,sp
	bra	.ok
.err	clr.l	ansc_Screen(a5)
.ok
.x	movem.l	(sp)+,d0-a6
	rts
	LEN
GetRegs:
	move.b	COL_R(pc),d1
	btst	d0,d1
	sne	d1
	ext.w	d1
	ext.l	d1
	move.b	COL_G(pc),d2
	btst	d0,d2
	sne	d2
	ext.w	d2
	ext.l	d2
	move.b	COL_B(pc),d3
	btst	d0,d3
	sne	d3
	ext.w	d3
	ext.l	d3
	rts
ID_TAG	dc.l	$800BABA1
COL_R		dc.b	%10101010
COL_G		dc.b	%11001100
COL_B		dc.b	%11110000
		dc.b	0
	INCLUDE	INC_NAMES.i
_NotIBase	dc.l	0

NotKS31txt	dc.b	'Sorry. Immer noch eine Kickstart 3.x. bye bye..',10,0
NotIName	dc.b	'notifyintuition.library',0
YouNeed		dc.b	'You need "notifyintuition.library" to run this programm.',10,0
UniqueTXT	dc.b	'Error : Ein Programm mit der ID "ANSC" läuft schon.',10,0
LowMem		dc.b	'Error : Speicherplatzmangel',10,0
