** ** $Id: PopChunk.S,v 21.2 92/05/17 03:31:01 chris Exp $ ** $Revision: 21.2 $ ** ** $Filename: PopChunk.S $ ** $Author: chris $ ** $Date: 92/05/17 03:31:01 $ ** ** 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: *** ParentChunk-Grösse += Chunk-Grösse moveq.l #8,d0 ; Chunkheadersize add.l ifffh_ChunkSize(a2),d0 ; plus Chunksize add.l d0,ifffh_ChunkSize+8(a2) ; und zur Parent-Chunk-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 bne.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 *** Chunk vom Stack holen (Stack eins nach unten rutschen) lea iffh_CStack(a2),a1 ; Destination lea 8(a1),a0 ; Source moveq #(iffh_CStackEnd-iffh_CStack-8)/4-1,d0 .StackDown: move.l (a0)+,(a1)+ dbf d0,.StackDown *** 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