** ** $Id: $ ** $Revision: $ ** ** $Filename: OpenIFF.S $ ** $Author: Christian A. Weber $ ** $Release: 19.1 $ ** $Date: 92/05/11 21:11:27 $ ** ** iff.library/IFFLib_OpenIFF ** ** 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 IFFLib_OpenIFF SECTION text,CODE INCLUDE "IFFLib.i" XREF SetError,ClearError XDEF OpenIFFFunc,NewOpenIFFFunc ******* iff.library/IFFLib_NewOpenIFF *************************************** * * NAME * IFFLib_NewOpenIFF -- allocate memory for an IFF-file and read it * * SYNOPSIS * ifffile = IFFLib_NewOpenIFF( filename, memattr ) * D0 A0 D0 * * IFFFILE IFFLib_OpenIFF( char * ) * * FUNCTION * This function opens a file on a disk and looks whether it's an IFF * file or not. If it is an IFF file, memory is allocated and the file * is read into memory. The 'memattr' argument is taken to define the * memory type. Normally memattr is set to MEMF_ANY or MEMF_PUBLIC. * If an error occurs, NULL is returned, and you can call * IFFLib_IFFError() to get the error number. * * INPUTS * filename - Pointer to a null-terminated string * memattr - Memory requirements as used for Exec's AllocMem(), * such as MEMF_CHIP, MEMF_PUBLIC ... * (MEMF_CLEAR is not necessary) * * RESULT * ifffile - 'FileHandle', points to the beginning of the IFF file * ("FORM...."), Zero if unsuccessful. Call IFFLib_IFFError() to get * the reason of the failure. * * SEE ALSO * IFFLib_OpenIFF(), IFFLib_CloseIFF(), IFFLib_IFFError() * * BUGS * None known * ***************************************************************************** OpenIFFFunc: movem.l d2-d6/a2/a5-a6,-(SP) moveq.l #-1,d6 ; Kein MemType angegeben bra.s DoCont ******* iff.library/IFFLib_OpenIFF ****************************************** * * NAME * IFFLib_OpenIFF -- allocate memory for an IFF-file and read it * * SYNOPSIS * ifffile = IFFLib_OpenIFF( filename ) * D0 A0 * * IFFFILE IFFLib_OpenIFF( char * ) * * FUNCTION * This function does the same as the IFFLib_NewOpenIFF() routine * above, except that you cannot specify the type of memory which is * allocated for the file. Normally the type is 0 which means 'any * memory', but if the IFF file type is '8SVX', the file is ALWAYS * loaded into CHIP memory. If you wish to override these defaults, * use IFFLib_NewOpenIFF() instead of IFFLib_OpenIFF(). * * INPUTS * filename - Pointer to a null-terminated string * * RESULT * ifffile - 'FileHandle', points to the beginning of the IFF file * ("FORM...."), 0 if unsuccessful. Call IFFError() to get the * reason of the failure. * * BUGS * None * * SEE ALSO * IFFLib_NewOpenIFF(), IFFLib_CloseIFF(), IFFLib_IFFError() * ***************************************************************************** NewOpenIFFFunc: movem.l d2-d6/a2/a5-a6,-(SP) move.l d0,d6 ; D6 : MemType DoCont: movea.l a6,a5 ; IFFBase lea -12(SP),SP ; Arbeitsspeicher reservieren moveq.l #0,d5 ; Fehlernummer rücksetzen *** File öffnen move.l a0,d1 ; Name move.l #MODE_OLDFILE,d2 ; accessmode movea.l ib_DOSBase(a5),a6 JSRLIB Open move.l d0,d4 ; D4 := FileHandle bne.s 1$ moveq #IFF_CANTOPENFILE,d5 bra.s .Error2 ; ---> 1$: *** Erste 12 Bytes lesen, testen ob 'FORM' move.l d4,d1 ; File move.l SP,d2 ; Adr moveq.l #12,d3 ; Len JSRLIB Read ; erste 3 Longwords lesen cmpi.l #'FORM',(SP) beq.s 2$ moveq #IFF_NOTIFF,d5 bra.s .Error1 ; ---> 2$: *** Testen ob Chip-Speicher erwünscht (bei 8SVX-Files) move.l d6,d1 ; Default-Requirements bpl.s 3$ ; sind gültig ---> moveq.l #MEMF_PUBLIC,d1 cmpi.l #'8SVX',8(SP) ; 8SVX-File ? bne.s 3$ ; nein ---> moveq.l #MEMF_CHIP|MEMF_PUBLIC,d1 ; sonst CHIP-Memory! 3$: *** Speicher für File reservieren moveq.l #12,d2 ; 'Remember' + FORM.... move.l 4(SP),d3 ; D3 : FORM-Länge add.l d3,d2 ; D2 : Gesamtlänge subq.l #4,d3 ; FUCK!!! IFF-Typ ist ja schon gelesen! move.l d2,d0 movea.l ib_SysBase(a5),a6 JSRLIB AllocMem ; requirements von D1 movea.l d0,a2 ; A2 : IFFFile-Adresse tst.l d0 bne.s 4$ ; OK ---> moveq #IFF_NOMEM,d5 bra.s .Error1 ; ---> 4$: *** File einladen move.l d2,(a2)+ ; Länge des reserv. Bereichs move.l d4,d1 ; File move.l a2,d2 ; Adr addq.l #8,d2 ; FORM.... schon gelesen! addq.l #4,d2 ; IFF-Typ schon gelesen movea.l ib_DOSBase(a5),a6 JSRLIB Read ; D3 war schon Länge tst.l d0 bpl.s 5$ ; OK ---> moveq #IFF_READERROR,d5 bra.s .Error1 5$: movem.l (SP),d0-d2 ; FORM, Länge und Type movem.l d0-d2,(a2) ; IFF-Filetyp .Error1: move.l d4,d1 ; File movea.l ib_DOSBase(a5),a6 JSRLIB Close .Error2: move.l d5,d0 ; Error ? beq.s 6$ ; nein ---> bsr SetError ; Löscht auch D0 bra.s Ende 6$: bsr ClearError move.l a2,d0 ; Adresse als Return-Code Ende: lea 12(SP),SP ; Lokalen Speicher freigeben movem.l (SP)+,d2-d6/a2/a5-a6 rts END