home *** CD-ROM | disk | FTP | other *** search
- ;************************************************************************
- ; IFF.i defs for IFF-85 Interchange Format Files - ILBM library. 6/9/89
- ;
- ; Original C includes by Jerry Morrison and Steve Shaw, Electronic Arts.
- ; Assembly include file by Jeff Glatt, dissidents. Some structures have been
- ; modified from the original EA code such that they are not compatible.
- ; This software is in the public domain.
- ;
- ; Set your editor's TAB width to 3 chars.
- ;************************************************************************
-
-
- ;********************* LIB VECTOR OFFSETS (LVO) **************************
- _LVOLoadIFFToWindow equ -30
- _LVOLoadILBM equ -36
- _LVOLoadIFF equ -42
- _LVOGetCMAP equ -48
- _LVOGetBODY equ -54
- _LVOUnPackRow equ -60
- _LVOOpenRIFF equ -66
- _LVOOpenRGroup equ -72
- _LVOFileLength equ -78
- _LVOGetPChunkHdr equ -84
- _LVOGetF1ChunkHdr equ -90
- _LVOGetFChunkHdr equ -96
- _LVOGetChunkHdr equ -102
- _LVOSkipFwd equ -108
- _LVOIFFReadBytes equ -114
- _LVOCloseRGroup equ -120
- _LVOHandleCCRT equ -126
- _LVOHandleCRNG equ -132
- _LVOHandleCAMG equ -138
- _LVOCopyILBMProp equ -144
- _LVOSaveWindowToIFF equ -150
- _LVOSaveILBM equ -156
- _LVOIFFWriteBytes equ -162
- _LVOPutBODY equ -168
- _LVOPackRow equ -174
- _LVOPutCMAP equ -180
- _LVOOpenWIFF equ -186
- _LVOOpenWGroup equ -192
- _LVOStartWGroup equ -198
- _LVOPutCkHdr equ -204
- _LVOPutCk equ -210
- _LVOPutCkEnd equ -216
- _LVOEndWGroup equ -222
- _LVOCloseWGroup equ -228
- _LVOInitBMHdr equ -234
- _LVOGetIFFPMsg equ -240
- _LVOSearchPROP equ -246
- _LVOGetPROPStruct equ -252
- _LVOFreePROPStruct equ -258
- _LVOSaveANIM equ -264
- _LVODecodeVKPlane equ -270
- _LVOMakeYTable equ -276
- _LVODecompDLTA equ -282
- _LVOBlankPointer equ -288
- _LVOScaleImage equ -294
- _LVOSetupBitmap equ -300
- _LVODecompBODY equ -306
- ;_LVO equ -312
- ;_LVO equ -318
- ;_LVO equ -324
- ;_LVO equ -330
- ;_LVO equ -336
- ;_LVO equ -342
- ;_LVO equ -348
- ;_LVO equ -354
- ;_LVO equ -360
- ;_LVO equ -366
- ;_LVO equ -372
- ;_LVO equ -378
- ;_LVO equ -384
- ;_LVO equ -390
-
- ;=========================================================================
- ;The IFF Group IDs (LIST, FORM, PROP, & CAT) are followed by a subtype ID
- ;that identifies what kind of chunks will follow (i.e. ILBM, SMUS, 8SVX...).
- ;"FORM type XXXX", "LIST of FORM type XXXX", "PROPerties associated
- ;with FORM type XXXX", or "conCATenation of XXXX".
- ;
- ;ChunkID dc.b [4 ascii letters] ;also the Group ID in the master Context
- ;ChunkSize dc.l [number of subsequent data bytes, including subID's 4 bytes]
- ;SubID dc.b [4 ascii letters]
- ;
- ; Every IFF file should start with the above Group header (for example:
- ;ChunkID dc.b 'FORM'
- ;ChunkSize dc.l [the number of bytes following this LONG]
- ;SubID dc.b 'ILBM' ;this is an IFF picture then
- ;
- ;The remaining chunks in the file will be those that are expected for that
- ;type of file. (i.e. ILBMs have BMHD, CMAP, CAMG, etc chunks) A chunk
- ;consists of a 4 byte ID, a ULONG indicating the number of data bytes in the
- ;chunk, and then those data bytes.
- ;
- ; Pass chunkSize = UNKNOWN to save routines to mean "compute the size" after
- ; all the data has been written and the context is closed.
-
- UNKNOWN equ $80000001
-
- ;Address Offsets for a chunk header.
- ChunkID equ 0
- ChunkSize equ 4
- ChunkData equ 8
- sizeofChunkHeader equ 12
-
- ;Address Offsets for a group header
- GroupID equ 0
- GroupSize equ 4
- SubID equ 8
- GroupData equ 12
- sizeofGroupHeader equ 16
-
- ;This macro rounds up the 32 bit value in a data register to an even number.
- WordAlign MACRO
- Bclr.l #0,\1
- beq.s _even
- addq.l #2,\1
- _even:
- ENDM
-
- ;This macro computes the total "physical size" of a padded chunk from
- ;its "data size" or "logical size" which is contained in a data register.
- ChunkPSize MACRO
- addq.l #sizeofChunkHeader,\1
- Bclr.l #0,\1
- beq.s _Even
- addq.l #2,\1
- _Even:
- ENDM
-
- ;Standard group IDs. A chunk with one of these IDs contains a
- ;SubTypeID followed by zero or more chunks.
- ID_FORM equ 'FORM'
- ID_PROP equ 'PROP'
- ID_LIST equ 'LIST'
- ID_CAT equ 'CAT '
- ID_FILLER equ ' '
-
- ;SubTypeIDs
- ID_ILBM equ 'ILBM'
- ID_ANIM equ 'ANIM'
-
- ;ILBM Chunk IDs
- ID_BMHD equ 'BMHD'
- ID_CMAP equ 'CMAP'
- ID_GRAB equ 'GRAB'
- ID_DEST equ 'DEST'
- ID_SPRT equ 'SPRT'
- ID_CAMG equ 'CAMG'
- ID_BODY equ 'BODY'
- ID_CRNG equ 'CRNG'
- ID_CCRT equ 'CCRT'
-
- ;ANIM Chunk IDs
- ID_DLTA equ 'DLTA'
- ID_ANHD equ 'ANHD'
-
- ID_ANFR equ 'ANFR'
- ID_MAHD equ 'MAHD'
- ID_MFHD equ 'MFHD'
- ID_CM16 equ 'CM16'
- ID_ATXT equ 'ATXT'
- ID_PTXT equ 'PTXT'
-
- sizeofID equ 4
-
- ;=============IFFP Status code return from the Lib Functions================
- ; A LONG returned in d0, because it must be the same size as a 4 byte ascii,
- ; chunkID (as returned by GetChunkHdr for example).
- ; Note that the error codes below are not legal IFF IDs because they are not
- ; standard ascii chars. If a routine ever returns a LONG that is negative,
- ; then this constitutes an IFFP error code, not an IFF ID.
- ; Always check IFFP error codes (bmi toError). Don't press on after an error!
- ; These routines try to have no side effects in the error case, except
- ; partial I/O is sometimes unavoidable.
-
- IFF_OKAY equ 0 ;Keep going...(not end of file, but we haven't found
- ;our requested FORM or an error yet) Note that the
- ;highest level routines use this to really mean that
- ;everything went well. (see LoadIFFToWindow)
- END_MARK equ -1 ;Encountered the end of a group (i.e. FORM, LIST, etc).
- ;The end of the entire file if you are at the top group.
- IFF_DONE equ -2 ;Returns this when it has READ enough.
- ;It means return thru all levels. File is Okay.
- DOS_ERROR equ -3 ;AmigaDOS Read or Write error.
- NOT_IFF equ -4 ;Not an IFF file.
- NO_FILE equ -5 ;Tried to open file, AmigaDOS didn't find it.
- CLIENT_ERROR equ -6 ;Application made invalid request, for instance, write
- ;a negative size chunk. Also, out of memory error.
- BAD_FORM equ -7 ;A read routine complains about FORM semantics
- ;e.g. valid IFF file, but missing a required chunk such
- ;as an ILBM without a BMHD chunk.
- SHORT_CHUNK equ -8 ;Application asked IFFReadBytes to read more bytes than
- ;left in the chunk. Could be an applic. bug or bad file.
- BAD_IFF equ -9 ;mal-formed IFF file. Found half a chunk? A CAT with a
- ;PROP in it?
- IFF_NOTFOUND equ -10 ;The requested FORM not found within the IFF file
- ;(Did you try to find an ILBM in an SMUS file?)
- UNKNOWN_ERROR equ -11 ;This error is unknown (i.e. not 1 of the preceding)
- ;The library will never return this.
-
- ; =================== BitMapHeader (BMHD Chunk) ==================
-
- ;Choice of masking technique
- mskNone equ 0
- mskHasMask equ 1
- mskHasTransparentColor equ 2
- mskLasso equ 3
-
- ;Choice of compression algorithm applied to
- ;each row of the source and mask planes. "cmpByteRun1" is the byte run
- ;encoding generated by Mac's PackBits.
- cmpNone equ 0
- cmpByteRun1 equ 1
-
- ;Aspect ratios: The proper fraction xAspect/yAspect represents the pixel
- ;aspect ratio pixel_width/pixel_height.
-
- ;For the 4 Amiga display modes:
- ; 320 x 200: 10/11 (these pixels are taller than they are wide)
- ; 320 x 400: 20/11
- ; 640 x 200: 5/11
- ; 640 x 400: 10/11
- x320x200Aspect equ 10
- y320x200Aspect equ 11
- x320x400Aspect equ 20
- y320x400Aspect equ 11
- x640x200Aspect equ 5
- y640x200Aspect equ 11
- x640x400Aspect equ 10
- y640x400Aspect equ 11
-
- ; A BitMapHeader is stored in a BMHD chunk.
- ; dc.w w,h ; raster width & height in pixels
- ; dc.w x,y ; position for this image
- ; dc.b nPlanes ; # source bitplanes
- ; dc.b masking ; masking technique
- ; dc.b compress ; compression algoithm
- ; dc.b pad1 ; UNUSED. For consistency, put 0 here
- ; dc.w transparentColor ; transparent "color number"
- ; dc.b xAspect,yAspect ; aspect ratio, a rational number x/y
- ; dc.w pageWidth,pageHeight ; source "page" size in pixels
-
- BMHD_w equ 0
- BMHD_h equ 2
- BMHD_x equ 4
- BMHD_y equ 6
- BMHD_nPlanes equ 8
- BMHD_masking equ 9
- BMHD_compress equ 10
- BMHD_pad equ 11
- BMHD_color equ 12
- BMHD_xAspect equ 14
- BMHD_yAspect equ 15
- BMHD_pageW equ 16
- BMHD_pageH equ 18
-
- sizeofBMHD equ 20 ;not counting the header ID and chunkSize
-
- ;This macro computes the number of bytes in a row, from the width in pixels.
- RowBytes MACRO
- addi.w #15,\1
- lsr.w #3,\1
- Bclr.l #0,\1
- ENDM
-
- ; ==================== ColorRegister ==========================
- ; A CMAP chunk is a packed array of ColorRegisters (3 bytes each).
-
- sizeofColorRegister equ 3
-
- ;Maximum number of bitplanes in RAM. Current Amiga max w/dual playfield.
- MaxAmDepth equ 6
-
- ;Maximum number of color regs in amiga colorTable
- maxColorReg equ 32
-
- ;This macro is passed the number of colors to save in a data register. It
- ;converts that into the number of bytes in the resulting CMAP chunk (not
- ;counting the header and any pad byte).
- sizeofCMAP MACRO
- mulu.w #3,\1
- ENDM
-
- ; ========================= GRAB ==============================
- ; A Point2D is stored in a GRAB chunk.
-
- GRAB_x equ 0
- GRAB_y equ 2
-
- sizeofGRAB equ 4
-
- ; ========================= DestMerge ===========================
- ; A DestMerge is stored in a DEST chunk.
-
- ; dc.b depth ; # bitplanes in the original source
- ; dc.b pad1 ; UNUSED, for consistency store 0 here
- ; dc.w planePick ; how to scatter source bitplanes into destination
- ; dc.w planeOnOff ; default bitplane data for planePick
- ; dc.w planeMask ; selects which bitplanes to store into
-
- DEST_depth equ 0
- DEST_pad equ 1
- DEST_planePick equ 2
- DEST_planeOnOff equ 4
- DEST_planeMask equ 6
-
- sizeofDEST equ 8
-
- ; =========================== ANHD ==============================
-
- ;operation modes
- DirectSet equ 0
- _XOR equ 1
- LongDelta equ 2
- ShortDelta equ 3
- ShortLong equ 4
- ByteVertical equ 5
- Juggler equ 74
-
- ;Bits values
- ShortData equ 0
- LongData equ 1
- Set equ 0
- _Xor equ 2
- SeparateInfo equ 0
- OneInfoList equ 4
- NotRLC equ 0
- RLC equ 8
- Horizontal equ 0
- Vertical equ 16
- ShortInfo equ 0
- LongInfo equ 32
-
- ; dc.b operation
- ; dc.b mask
- ; dc.w w,h
- ; dc.w x,y
- ; dc.l abstime
- ; dc.l reltime
- ; dc.b interleave
- ; dc.b AnhdPad0
- ; dc.l bits
- ; ds.b 16
-
- ANHD_op equ 0
- ANHD_mask equ 1
- ANHD_w equ 2
- ANHD_h equ 4
- ANHD_x equ 6
- ANHD_y equ 8
- ANHD_abstime equ 10
- ANHD_reltime equ 14
- ANHD_interleave equ 18
- ANHD_pad0 equ 19
- ANHD_bits equ 20
- ANHD_pad1 equ 24
-
- sizeofANHD equ 40
-
- ;======================= Other Chunks ===========================
- ; Commodore Amiga ViewPort->Modes is stored in a CAMG chunk. The
- ; chunk's content is declared as a ULONG.
-
- sizeofCAMG equ 4
- sizeofSPRT equ 4
-
- ; ======================== CRNG ===============================
-
- maxCycles equ 8 ;the ILBMFrame can hold 8 CRNG chunks
- RNG_NORATE equ 36 ;Dpaint uses this rate to mean non-active
-
- ;pad1 dc.w 0 ;future use - store 0 here
- ;rate dc.w 0 ;60/sec=16384, 30/sec=8192, 1/sec=16384/60=273
- ;active dc.w 0 ;lo bit 0=no cycle, 1=yes; next bit 1=reverse
- ;low dc.b 0 ;range lower
- ;high dc.b 0 ;range upper
-
- CRNG_rate equ 2
- CRNG_active equ 4
- CRNG_low equ 6
- CRNG_high equ 7
-
- sizeofCRNG equ 8
-
- ;===================== VECTOR STRUCTURE (16 bytes) ====================
- ; When using mid-level load routines, you must allocate and initialize a
- ; vector structure. This structure holds the addresses of whatever routines
- ; you would like the lib to execute while parsing an IFF file. If the vector
- ; address is 0, then the default lib routine is used.
- ;
- ;
- ;PROPhandler dc.l 0 ;address of routine to handle nonILBM 'PROP's or an ILBM
- ; ;PROP chunk that is "unknown" to the lib (i.e. ANHD,DEST,
- ; ;GRAB,SPRT,DLTA). If NULL, skips nonILBM PROPs.
- ;FORMhandler dc.l 0 ;If not NULL, replaces the lib's default 'FORM' handler.
- ;CHUNKhandler dc.l 0 ;Called by lib's default 'FORM' handler when it encounters
- ; ;"unknown" chunks inside an ILBM (see PROPhandler). If NULL,
- ; ;unknown chunks are skipped. If you don't use the lib's
- ; ;default 'FORM' handler, then this field is free to use.
- ;NonILBMhandler dc.l 0
- ; ;Called by lib's default 'FORM' handler when it encounters
- ; ;a FORM other than ILBM (i.e. 8SVX, etc). If NULL,
- ; ;nonILBM FORMs are skipped. If you don't use the lib's
- ; ;default 'FORM' handler, then this field is free to use.
-
- PROPhand equ 0
- FORMhand equ 4
- CHUNKhand equ 8
- NONILBMhand equ 12
-
- sizeofVectors equ 16
-
- ;================ ILBMFrame structure (172 bytes) ====================
- ;iFlags dc.b 0 ;flags for whether BMHD, CAMG chunk found
- ;iUserFlags dc.b 0 ;for whether you want no title bar, mouse pointer
- ;iBMHD ds.b 20 ;20 byte IFF BitMap Header chunk (BHMD)
- ;iViewModes dc.l 0 ;CAMG chunk (contains just 1 LONG, ViewModes)
- ;iColorTable ds.w 32 ;a WORD for each color (32 colors MAX)
- ;iNumColors dc.b 0 ;number of colorTable values loaded (32 MAX)
- ;iCycleCnt dc.b 0 ;# of cycles for color cycling (Range = 0 to 7)
- ;iCRNG ds.b 8*8 ;8, 8 Byte CRNG chunks for color cycling
- ;iWindow dc.l 0
- ;iScreen dc.l 0
- ;iBMAP dc.l 0
- ;iBmSize dc.l 0
-
- sizeofILBMFrame equ 172
-
- iFlags equ 0
- iUserFlags equ 1
- iBMHD equ 2
- iViewModes equ 22
- iColorTable equ 26
- iNumColors equ 90
- iCycleCnt equ 91
- iCRNG equ 92
- iWindow equ 156
- iScreen equ 160
- iBMAP equ 164
- iBmSize equ 168
-
- ;definitions for bits of iFlags field
- BMHDFLAG equ 0 ;set if a BMHD chunk found in the file
- CAMGFLAG equ 1 ;set if a CAMG chunk found
- ANHDFLAG equ 2 ;set if an ANHD chunk found. This is for the use of your
- ;custom CHUNKhandler or PROPhandler.
-
- ;bit definitions for iUserFlags. These must be initialized by you.
- MOUSEFLAG equ 0 ;set for no mouse pointer
- SCREENFLAG equ 1 ;set for hide screen title bar
- COLORFLAG equ 2 ;set for "Don't use loaded colorMap. Use present map."
-
- ANIMFLAG equ 7 ;set if an ANIM file
-
- ;===================== A PROPList ============================
- ; NextFrame dc.l [the address of the next frame in list]
- ; Entries dc.w [the number of frames in the list]
-
-
- ;================== AN ILBMPropFrame ==============================
- ; Since the routines GetPROPStruct and SearchPROP return the data portion
- ; (the actual ILBMFrame of the structure), you access the fields using the
- ; same offsets as an ILBMFrame. The new, extended fields are at negative
- ; offsets to the data portion, and of course, the size is different.
- ; The extended fields are as follows:
- ;
- ;iNext dc.l 0 ;the Next PropFrame
- ;iID dc.l 0 ;the type of PROP (i.e. 'ILBM')
- ;iPFSize dc.w 0 ;the total size of this structure including this header
-
- sizeofILBMProp equ sizeofILBMFrame+10
-
- iNext equ -10
- iID equ -6
- iPFSize equ -2
-
- ;========36 byte Context structure (to read/write an IFF Group)===========
- ;parentContext dc.l 0 ;Containing group (If NULL, then this is top level)
- ;UserData dc.l 0 ;For application use
- ;fileHandle dc.l 0 ;DOS fileHandle
- ;position dc.l 0 ;The current logical file position.
- ;bound dc.l 0 ;File-absolute context bound
- ; ;(or UNKNOWN size for save routines).
- ;chunkID dc.b [4 ascii] ;Current chunk ID.
- ;chunkSize dc.l 0 ;Current chunk size. If UNKNOWN, this means we need
- ; ;to go back and set the size (save only).
- ;subID dc.b [4 ascii] ;Group's subtype ID when reading.
- ;bytesSoFar dc.l 0 ;# bytes read/written of current chunk's data.
-
- ; To compute the number of bytes not yet read from the current chunk, given
- ; a context structure, remainingBytes = chunkSize - bytesSoFar
-
- conParent equ 0
- conUserData equ 4
- conFile equ 8
- conPosition equ 12
- conBound equ 16
- conChunkID equ 20
- conChunkSize equ 24
- conSubID equ 28
- conSoFar equ 32
-
- sizeofContext equ 36
-