From b4425496e443c1d95593a4b1cd22e0c84a114ed0 Mon Sep 17 00:00:00 2001 From: "Christian A. Weber" Date: Fri, 15 May 1992 03:24:13 +0000 Subject: Initial revision --- Source/PopChunk.S | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 Source/PopChunk.S (limited to 'Source/PopChunk.S') 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 -- cgit v1.2.3