 IDNT "IO.o"

 include "exec/types.i"
 include "exec/io.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 _CreateIO
 XDEF _CreateStdIO

 XDEF _DeleteIO
 XDEF _DeleteStdIO

 XREF _AbsExecBase
 XLIB AllocMem
 XLIB FreeMem

;------------------------------------------------

;>= D0 = Größe der IO-Struktur
;>= A0 = Zeiger auf Messageport

;=> D0 = Zeiger auf IO-Struktur oder Null => Fehler aufgetreten

_CreateIO:
	movem.l	d2/a2/a6,-(a7)	;Register retten
	move.l	a0,a2		;Zeiger auf den Port
	move.l	d0,d2		;Länge der Struktur
	move.l	_AbsExecBase,a6	;Zeiger auf ExecBase
	move.l	a0,d0		;ist ein Port angegeben
	beq.s	1$		;Fehler, kein Port
	move.l	d2,d0		;Länge übergeben
	move.l	#MEMF_PUBLIC!MEMF_CLEAR,d1 ;Speicherangabe
	CALLSYS	AllocMem		;Speicher belegen
	tst.l	d0		;wurde Speicher belegt
	beq.s	1$		;kein Speicher belegt
	move.l	d0,a1		;Zeiger auf Speicher
	move.b	#NT_MESSAGE,LN_TYPE(a1)	;Type eintragen
	move.w	d2,MN_LENGTH(a1)	;Länge eintagen
	move.l	a2,MN_REPLYPORT(a1)	;Zeiger auf Port eintragen
1$:	movem.l	(a7)+,d2/a2/a6	;Register zurückgeben
	rts			;Rücksprung

;------------------------------------------------
;>= A0 = Zeiger auf Messageport

_CreateStdIO:
	move.l	#IOSTD_SIZE,d0	;Länge der StdIO-Struktur
	bsr	_CreateIO		;Struktur erstellen
	rts

;------------------------------------------------
;>= A0 = Zeiger IORequest-Struktur

_DeleteIO:
_DeleteStdIO:
	move.l	a6,-(a7)
	move.l	_AbsExecBase,a6
	move.w	MN_LENGTH(a0),d0
	ext.l	d0
	move.l	a0,a1
	CALLSYS	FreeMem
	move.l	(a7)+,a6
	rts

	END
