diff options
Diffstat (limited to 'Source')
| -rw-r--r-- | Source/PopChunk.S | 128 | ||||
| -rw-r--r-- | Source/PushChunk.S | 121 | ||||
| -rw-r--r-- | Source/WriteChunkBytes.S | 93 | 
3 files changed, 342 insertions, 0 deletions
diff --git a/Source/PopChunk.S b/Source/PopChunk.S new file mode 100644 index 0000000..ae0d001 --- /dev/null +++ b/Source/PopChunk.S @@ -0,0 +1,128 @@ +** +**	$Id: $ +**	$Revision: $ +** +**	$Filename: PopChunk.S $ +**	$Author: Christian A. Weber $ +**	$Release: 21.1 $ +**	$Date: 92/05/14 22:26:34 $ +** +**	iff.library/IFFL_PopChunk +** +**	COPYRIGHT (C) 1987-1992 BY CHRISTIAN A. WEBER, BRUGGERWEG 2, +**	CH-8037 ZUERICH, SWITZERLAND.  ALL RIGHTS RESERVED.  NO PART +**	OF THIS SOFTWARE MAY BE COPIED, REPRODUCED,  OR  TRANSMITTED +**	IN ANY FORM OR BY ANY MEANS,  WITHOUT THE PRIOR WRITTEN PER- +**	MISSION OF THE AUTHOR. USE AT YOUR OWN RISK. +** + + +		IDNT	IFFL_PopChunk +		SECTION	text,CODE + +		INCLUDE	"IffLib.i" + +		XREF	SetError,ClearError +		XDEF	PopChunkFunc + + +******* iff.library/IFFL_PopChunk ******************************************* +* +*    NAME +*	IFFL_PopChunk -- Pop top context node off context stack. +* +*    SYNOPSIS +*	success = IFFL_PopChunk( iff ) +*	D0                       A0 +* +*	BOOL IFFL_PopChunk( IFFL_HANDLE ) +* +*    FUNCTION +*	Pops top context chunk and updates the file accordingly. +*	The function is normally called only for writing files and signals +*	the end of a chunk. +* +*    INPUTS +*	iff - IFF handle +* +*    RESULTS +*	Non-zero  if successful or 0 if not successful (call IFFL_IFFError() +*	to get an IFFL_ERROR_... error code. +* +*    SEE ALSO +*	IFFL_PushChunk(), IFFL_WriteChunkBytes() +* +***************************************************************************** + +PopChunkFunc:	movem.l	d2-d3/a2/a5-a6,-(SP) +		movea.l	a6,a5			; IFFBase für ClearError() +		movea.l	a0,a2			; A2 :  IFF-Handle +		movea.l	iffb_DOSBase(a5),a6	; A6 :  DOSBase + +	*** Pad-Byte schreiben falls Chunk-Länge ungerade ist + +		btst.b	#0,ifffh_ChunkSize+3(a2) +		beq.b	.NoOddChunkSize + +		move.l	ifffh_File(a2),d1 +		move.l	a2,d2			; Hier hat's ein 0 Byte +		moveq.l	#1,d3			; Länge: 1 Byte +		JSRLIB	Write +		cmp.l	d3,d0 +		bne.b	.WriteError +		add.l	d3,ifffh_ChunkSize(a2) +.NoOddChunkSize: + +	*** FORM-Grösse += Chunk-Grösse + +		moveq.l	#8,d0			; Chunkheadersize +		add.l	ifffh_ChunkSize(a2),d0	; plus Chunksize +		add.l	d0,ifffh_FormSize(a2)	; zur Form-Size dazu + +	*** An den Anfang des Chunks seeken + +		move.l	ifffh_File(a2),d1 +		moveq.l	#4,d2			; Grössen-Eintrag im Chunk-Header +		add.l	ifffh_ChunkFPos(a2),d2	; Plus Chunk-Anfang +		moveq.l	#OFFSET_BEGINNING,d3 +		JSRLIB	Seek +		tst.l	d0 +		bmi.b	.SeekError + +	*** Richtige Chunk-Grösse eintragen + +		move.l	ifffh_File(a2),d1 +		lea	ifffh_ChunkSize(a2),a0 +		move.l	a0,d2 +		moveq.l	#4,d3			; 1 Langwort +		JSRLIB	Write			; schreiben +		cmp.l	d3,d0 +		beq.b	.WriteError + +	*** An das Ende des Chunks seeken + +		move.l	ifffh_File(a2),d1 +		moveq.l	#0,d2 +		moveq.l	#OFFSET_END,d3 +		JSRLIB	Seek +		tst.l	d0 +		bmi.b	.SeekError + +	*** Okay + +		bsr	ClearError		; Setzt auch D0 auf TRUE +		bra.b	.End + +	*** Schreibfehler oder Seekfehler + +.SeekError: +.WriteError:	moveq.l	#IFFL_ERROR_WRITE,d0 +		bsr	SetError		; Setzt auch D0 auf FALSE + +	*** Routine beenden + +.End:		movem.l	(SP)+,d2-d3/a2/a5-a6 +		rts + + +		END diff --git a/Source/PushChunk.S b/Source/PushChunk.S new file mode 100644 index 0000000..b021340 --- /dev/null +++ b/Source/PushChunk.S @@ -0,0 +1,121 @@ +** +**	$Id: $ +**	$Revision: $ +** +**	$Filename: PushChunk.S $ +**	$Author: Christian A. Weber $ +**	$Release: 21.1 $ +**	$Date: 92/05/14 22:26:34 $ +** +**	iff.library/IFFL_PushChunk +** +**	COPYRIGHT (C) 1987-1992 BY CHRISTIAN A. WEBER, BRUGGERWEG 2, +**	CH-8037 ZUERICH, SWITZERLAND.  ALL RIGHTS RESERVED.  NO PART +**	OF THIS SOFTWARE MAY BE COPIED, REPRODUCED,  OR  TRANSMITTED +**	IN ANY FORM OR BY ANY MEANS,  WITHOUT THE PRIOR WRITTEN PER- +**	MISSION OF THE AUTHOR. USE AT YOUR OWN RISK. +** + + +		IDNT	IFFL_PushChunk +		SECTION	text,CODE + +		INCLUDE	"IffLib.i" + +		XREF	SetError,ClearError +		XDEF	PushChunkFunc + + +******* iff.library/IFFL_PushChunk ****************************************** +* +*    NAME +*	IFFL_PushChunk -- Push a new context node on the context stack. +* +*    SYNOPSIS +*	success = IFFL_PushChunk( iff, type, id ) +*	D0                        A0   D0    D1 +* +*	BOOL IFFL_PushChunk( IFFL_HANDLE, ULONG, ULONG ) +* +*    FUNCTION +*	Pushes a new context node on the context stack by reading it from the +*	stream if this is a read file, or by creating it from the passed +*	parameters if this is a write file.  Normally this function is only +*	called in write mode, where the type and id codes specify the new +*	chunk to create.  If this is a leaf chunk, i.e. a local chunk inside +*	a FORM or PROP chunk, then the type argument is ignored. +* +*    INPUTS +*	iff  - IFF handle +*	type - chunk type specifier (ex. ILBM) (ignored for read mode or +*	       leaf chunks). +*	id   - chunk id specifier (ex. CMAP) (ignored for read mode). +* +*    RESULTS +*	Non-zero if successful or 0 if not successful (call IFFL_IFFError() +*	to get an IFFL_ERROR_... error code. +* +*    SEE ALSO +*	IFFL_PopChunk(), IFFL_WriteChunkBytes() +* +***************************************************************************** + +PushChunkFunc:	movem.l	d0-d3/a2/a5-a6,-(SP) +		movea.l	a6,a5			; IFFBase für ClearError() +		movea.l	a0,a2			; A2 :  IFF-Handle +		movea.l	iffb_DOSBase(a5),a6	; A6 :  DOSBase + +	*** File-Type schreiben falls dies der erste Chunk ist + +		tst.l	ifffh_FormSize(a2)	; 1. Chunk ? +		bne.b	.NotFirstChunk		; nee ---> + +		move.l	ifffh_File(a2),d1	; Filehandle +		move.l	SP,d2			; Type aufm Stack +		moveq.l	#4,d3			; Länge: 1 Langwort +		JSRLIB	Write +		cmp.l	d3,d0			; OK geschrieben ? +		bne.b	.WriteError +		add.l	d3,ifffh_FormSize(a2)	; FORM-Grösse anpassen +.NotFirstChunk: + +	*** Chunk im IFF-Handle initialisieren + +		clr.l	ifffh_ChunkSize(a2)	; Chunk-Grösse resstten + +		move.l	ifffh_File(a2),d1 +		moveq.l	#0,d2			; Aktuelle Position +		moveq.l	#OFFSET_CURRENT,d3 +		JSRLIB	Seek +		move.l	d0,ifffh_ChunkFPos(a2)	; Chunk-Position eintragen +		bmi.b	.SeekError		; Error ---> + +	*** ID und provisorische Länge schreiben + +		move.l	ifffh_File(a2),d1 +		lea	4(SP),a0 +		move.l	a0,d2			; ID und 1 LONG garbage +		moveq.l	#8,d3			; ID und provisorische Länge +		JSRLIB	Write +		cmp.l	d3,d0			; OK geschrieben ? +		bne.b	.WriteError + +	*** Okay + +		bsr	ClearError		; Setzt auch D0 auf TRUE +		bra.b	.End + +	*** Schreibfehler oder Seekfehler + +.SeekError: +.WriteError:	moveq.l	#IFFL_ERROR_WRITE,d0 +		bsr	SetError		; Setzt auch D0 auf FALSE + +	*** Routine beenden + +.End:		move.l	d0,(SP)			; D0 in Stack (--> wieder D0) +		movem.l	(SP)+,d0-d3/a2/a5-a6 +		rts + + +		END diff --git a/Source/WriteChunkBytes.S b/Source/WriteChunkBytes.S new file mode 100644 index 0000000..68f1b44 --- /dev/null +++ b/Source/WriteChunkBytes.S @@ -0,0 +1,93 @@ +** +**	$Id: $ +**	$Revision: $ +** +**	$Filename: WriteChunkBytes.S $ +**	$Author: Christian A. Weber $ +**	$Release: 21.1 $ +**	$Date: 92/05/14 22:26:34 $ +** +**	iff.library/IFFL_WriteChunkBytes +** +**	COPYRIGHT (C) 1987-1992 BY CHRISTIAN A. WEBER, BRUGGERWEG 2, +**	CH-8037 ZUERICH, SWITZERLAND.  ALL RIGHTS RESERVED.  NO PART +**	OF THIS SOFTWARE MAY BE COPIED, REPRODUCED,  OR  TRANSMITTED +**	IN ANY FORM OR BY ANY MEANS,  WITHOUT THE PRIOR WRITTEN PER- +**	MISSION OF THE AUTHOR. USE AT YOUR OWN RISK. +** + + +		IDNT	IFFL_WriteChunkBytes +		SECTION	text,CODE + +		INCLUDE	"IffLib.i" + +		XREF	SetError,ClearError +		XDEF	WriteChunkBytesFunc + + +******* iff.library/IFFL_WriteChunkBytes ************************************ +* +*   NAME +*	IFFL_WriteChunkBytes -- Write data into the current chunk +* +*   SYNOPSIS +*	success = IFFL_WriteChunkBytes( iff, buf, size ) +*	D0                              A0   A1   D0 +* +*	LONG IFFL_WriteChunkBytes( IFFL_HANDLE, APTR, LONG ) +* +*   FUNCTION +*	Writes "size" bytes from the specified buffer into the current chunk. +* +*   INPUTS +*	iff   - IFF file handle, from IFFL_OpenIFF(). +*	buf   - pointer to buffer area with bytes to be written. +*	size  - number of bytes to write. +* +*   RESULT +*	number of bytes written if successful or NULL if an error +*	occurred. Call IFFL_IFFError() to know what's going on. +* +*   SEE ALSO +*	IFFL_PushChunk(), IFFL_PopChunk(), IFFL_IFFError() +* +***************************************************************************** + +WriteChunkBytesFunc: +		movem.l	d2-d3/a2/a5-a6,-(SP) +		movea.l	a6,a5			; IFFBase für ClearError() +		movea.l	a0,a2			; A2 :  IFF-Handle +		movea.l	iffb_DOSBase(a5),a6	; A6 :  DOSBase + +	*** Daten in Chunk schreiben (Seek-Position ist schon richtig) + +		move.l	ifffh_File(a2),d1 +		move.l	a1,d2			; Adresse +		move.l	d0,d3			; Länge +		JSRLIB	Write +		cmp.l	d3,d0 +		bne.b	.WriteError + +	*** Chunk-Grösse updaten + +		add.l	d3,ifffh_ChunkSize(a2) + +	*** Okay + +		bsr	ClearError		; Setzt auch D0 auf TRUE +		bra.b	.End + +	*** Schreibfehler oder Seekfehler + +.SeekError: +.WriteError:	moveq.l	#IFFL_ERROR_WRITE,d0 +		bsr	SetError		; Setzt auch D0 auf FALSE + +	*** Routine beenden + +.End:		movem.l	(SP)+,d2-d3/a2/a5-a6 +		rts + + +		END  | 
