summaryrefslogtreecommitdiff
path: root/Source/PopChunk.S
diff options
context:
space:
mode:
authorChristian A. Weber <chris@gna.ch>1992-05-15 03:24:13 +0000
committerChristian A. Weber <chris@gna.ch>1992-05-15 03:24:13 +0000
commitb4425496e443c1d95593a4b1cd22e0c84a114ed0 (patch)
tree55671e882649d03e1b7dc38cac5e534418894894 /Source/PopChunk.S
parent6f59b3d06fbda6695a495bc09c0607b20b0dd39b (diff)
downloadiff-library-b4425496e443c1d95593a4b1cd22e0c84a114ed0.tar.gz
iff-library-b4425496e443c1d95593a4b1cd22e0c84a114ed0.tar.bz2
iff-library-b4425496e443c1d95593a4b1cd22e0c84a114ed0.zip
Initial revision
Diffstat (limited to 'Source/PopChunk.S')
-rw-r--r--Source/PopChunk.S128
1 files changed, 128 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