;Funktion zum erstellen eines Messageports:

;>= A0 = Zeiger auf den Port

;Die Option 'IDNT' ist nur wichtig, wenn man vor hat sich die Funktion
;'CreatePort' in eine eigene Library einzubauen, um sie dann durch
;hinzulinken immer parat zu haben.

 IDNT "DeletePort.o"

 include "exec/types.i"
 include "exec/ports.i"
 include "exec/memory.i"

CALLSYS	MACRO
	jsr _LVO\1(a6)
	ENDM
XLIB	MACRO
	XREF _LVO\1
	ENDM

;Die Funktion wird anderen Programmen durch die XDEF Option
;zu Verfügung gestellt.

 XDEF _DeletePort

 XREF _AbsExecBase
 XLIB FreeMem
 XLIB FreeSignal

_DeletePort:
	movem.l	a2/a6,-(a7)  ;Register retten
	move.l	a0,a2	       ;Zeiger auf Port
	move.l	_AbsExecBase,a6    ;ExecBase nach A6

	move.l	LN_NAME(a2),d0	;Name eingetragen
	beq.s	1$		;nein, nicht global

	move.l	a2,a1

;'REMOVE' ist ein Macro, das innerhalb des Include-Files 'exec/lists.i'
;zu finden ist. Dieses Macro entfernt eine Node-Struktur aus der 
;zugehörigen Liste. Es handelt sich um die gleiche Funktion wie die
;Exec-Funktion 'Remove'.

	REMOVE		;Port aus Portliste löschen

1$:	move.b	MP_SIGBIT(a2),d0
	ext.w	d0
	ext.l	d0
	CALLSYS	FreeSignal	;Signal für Port belegen

;Die Größe der Port Struktur ist über die Struktur 'MP', die
;innerhalb des Include-File 'exec/ports.i' definiert ist
;festgelegt. Die größe ist in 'MP_SIZE' gespeichert.

	move.l	#MP_SIZE,d0	;Größe der Port-Struktur
	move.l	a2,a1	;Zeiger auf Port

;CALLSYS ist ein Macro, welches zu Beginn des Programms erstellt wurde

	CALLSYS	FreeMem	;Spicher freigeben
	movem.l	(a7)+,a2/a6  ;Register zurückholen
	rts		;Rücksprung

	END
