diff options
author | Christian A. Weber <chris@gna.ch> | 1992-05-15 03:24:13 +0000 |
---|---|---|
committer | Christian A. Weber <chris@gna.ch> | 1992-05-15 03:24:13 +0000 |
commit | b4425496e443c1d95593a4b1cd22e0c84a114ed0 (patch) | |
tree | 55671e882649d03e1b7dc38cac5e534418894894 /Source/PopChunk.S | |
parent | 6f59b3d06fbda6695a495bc09c0607b20b0dd39b (diff) | |
download | iff-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.S | 128 |
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 |