** ** $Id: CloseIFF.S,v 21.3 92/05/26 17:57:17 chris Exp $ ** $Revision: 21.3 $ ** ** $Filename: CloseIFF.S $ ** $Author: chris $ ** $Date: 92/05/26 17:57:17 $ ** ** iff.library/IFFL_CloseIFF ** ** 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_CloseIFF SECTION text,CODE INCLUDE "IffLib.i" XREF ClearError XDEF CloseIFFFunc ******* iff.library/IFFL_CloseIFF ******************************************* * * NAME * IFFL_CloseIFF -- Close an IFF file and deallocate buffers * * SYNOPSIS * IFFL_CloseIFF( iff ) * A1 * * void IFFL_CloseIFF( IFFL_HANDLE ) * * FUNCTION * Returns the memory previously allocated by IFFL_OpenIFF(). * * INPUTS * iff - IFF file handle, from IFFL_OpenIFF() * * RESULTS * For now, always results TRUE (this may change in the future). * * SEE ALSO * IFFL_OpenIFF() * ***************************************************************************** CloseIFFFunc: movem.l d2-d3/a2/a5-a6,-(SP) movea.l a6,a5 ; IFFBase für ClearError() move.l a1,d0 ; Ist a1 == NULL ? beq.b .End ; ja ---> don't free anything cmpi.l #IFFFH_MAGIC,ifffh_Magic(a1) beq.b .WriteMode *** Read-Modus move.l -(a1),d0 ; Grösse des reservierten Bereichs movea.l iffb_SysBase(a5),a6 JSRLIB FreeMem ; Bereich freigeben bra.b .End ; ---> fertig *** Write-Modus .WriteMode: movea.l a1,a2 ; A2 : IFF-Handle movea.l iffb_DOSBase(a5),a6 ; A6 : DOSBase move.l ifffh_File(a2),d1 beq.b .FileNotOpen ; File nicht offen ---> *** Pad-Word schreiben falls FORM-Länge nicht LONG-aligned ist IFD ISPADWORDREALLYREQUIRED moveq.l #3,d0 ; LONG-Bitmaske and.l ifffh_FormSize(a2),d0 ; Bits gesetzt ? beq.b .NoPad ; noe ---> clr.l -(SP) move.l SP,d2 moveq.l #2,d3 ; 1 WORD JSRLIB Write addq.l #4,SP add.l d3,ifffh_FormSize(a2) .NoPad: ENDC *** An Offset 4 (FORM-Längen-Eintrag) des Files seeken move.l ifffh_File(a2),d1 moveq.l #4,d2 moveq.l #OFFSET_BEGINNING,d3 JSRLIB Seek tst.l d0 bmi.b .SeekError *** FORM-Länge updaten move.l ifffh_File(a2),d1 lea ifffh_ChunkSize(a2),a0 move.l a0,d2 moveq.l #4,d3 JSRLIB Write .SeekError: *** File schliessen move.l ifffh_File(a2),d1 JSRLIB Close .FileNotOpen: *** IFF-Handle freigeben movea.l a2,a1 ; IFF-Handle moveq.l #ifffh_SIZEOF,d0 ; Grösse movea.l iffb_SysBase(a5),a6 JSRLIB FreeMem *** Routine beenden .End: bsr ClearError ; IFFError zurücksetzen, D0 := 1 movem.l (SP)+,d2-d3/a2/a5-a6 rts END