summaryrefslogtreecommitdiff
path: root/Source/OpenIFF.S
diff options
context:
space:
mode:
authorChristian A. Weber <chris@gna.ch>1992-05-12 22:26:12 +0000
committerChristian A. Weber <chris@gna.ch>1992-05-12 22:26:12 +0000
commit36c824864c02f0a3f62c8a1d365d1670835c8c96 (patch)
treef3f433e4af522925d4c91f56865d38efaf83a456 /Source/OpenIFF.S
downloadiff-library-36c824864c02f0a3f62c8a1d365d1670835c8c96.tar.gz
iff-library-36c824864c02f0a3f62c8a1d365d1670835c8c96.tar.bz2
iff-library-36c824864c02f0a3f62c8a1d365d1670835c8c96.zip
Initial revision
Diffstat (limited to 'Source/OpenIFF.S')
-rw-r--r--Source/OpenIFF.S193
1 files changed, 193 insertions, 0 deletions
diff --git a/Source/OpenIFF.S b/Source/OpenIFF.S
new file mode 100644
index 0000000..2b0d026
--- /dev/null
+++ b/Source/OpenIFF.S
@@ -0,0 +1,193 @@
+**
+** $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