summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Source/PopChunk.S128
-rw-r--r--Source/PushChunk.S121
-rw-r--r--Source/WriteChunkBytes.S93
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