; 1). Set your editor's TAB width to 3 in order to correctly view this file.
; 2). Delete the following 2 directives if not using MANX. If using LATTICE,
;		make sure that you assemble this module with large CODE and DATA
;     model.

  far code  ;for Manx only, it means large code, large data (int = 32 bits)
  far data  ;this module must be assembled expecting passed ints as 32 bits

; 3). Copy the file "IFF.i" to the current directory.
; 4). Assemble this module and link it with your C application modules.
;
;As an additional savings in size, you may wish to clip out the interface code
;for any routines that you do not wish to use. For example, if you don't plan
;on using "GetIFFPMsg", delete the 7 lines starting at XDEF _GetIFFPMsg.

	SECTION	ilbmcode,CODE

	INCLUDE	"IFF.i"	;supplies the LVO offsets

	XREF	_ILBMBase	;ilbm.library opened from C code, and base stored there

	XDEF	_GetIFFPMsg
	XDEF	__GetIFFPMsg
_GetIFFPMsg:
	movea.l	_ILBMBase,a6
__GetIFFPMsg:
	move.l	4(sp),d0
	jmp		_LVOGetIFFPMsg(a6)

	XDEF	_BlankPointer
	XDEF	__BlankPointer
_BlankPointer:
	movea.l	_ILBMBase,a6
__BlankPointer:
	movea.l	4(sp),a0
	jmp		_LVOBlankPointer(a6)


;######################## IFF READER ROUTINES ##########################

;***********************************************************************
;BOOL = LoadIFFToWindow(fileName, ILBMFrame)
; d0								d1				a1

	XDEF	_LoadIFFToWindow,__LoadIFFToWindow
_LoadIFFToWindow:
	movea.l	_ILBMBase,a6
__LoadIFFToWindow:
	move.l	4(sp),d1
	movea.l	8(sp),a1
	jmp		_LVOLoadIFFToWindow(a6)


;**************************** LoadIFF() *********************************
; IFFP = LoadIFF(fileHandle, Vectors, masterFrame)
;  d0						d1			a0				a1

	XDEF	_LoadIFF,__LoadIFF
_LoadIFF:
	movea.l	_ILBMBase,a6
__LoadIFF:
	movem.l	4(sp),d1/a0/a1
	bsr.s		SetVectors
	jmp		_LVOLoadIFF(a6)


;**************************** ScaleImage() *********************************
;BOOL ScaleImage(dest_rectangle,source_rectangle,dest_rport,source_bitmap)
;							a0					a1						a2				a4


	XDEF	_ScaleImage,__ScaleImage
_ScaleImage:
	movea.l	_ILBMBase,a6
__ScaleImage:
	movem.l	a2/a4,-(sp)
	movem.l	12(sp),a0/a1/a2/a4
	jsr		_LVOScaleImage(a6)
	movem.l	(sp)+,a2/a4
	rts

;**************************** SetupBitmap() *********************************
; SetupBitmap(raster, Bitmap, BMHD)
;					d0			a0		a1


	XDEF	_SetupBitmap,__SetupBitmap
_SetupBitmap:
	movea.l	_ILBMBase,a6
__SetupBitmap:
	movem.l	4(sp),d0/a0/a1
	jmp		_LVOSetupBitmap(a6)


;**************************** DecompBODY() *********************************
; DecompBODY(BODY, BMHD, Bitmap)
;					a0		a1		a2
; Decompresses the BODY chunk into the passed BitMap's planes based on the
; passed BMHD's w, h, numPlanes, and pageWidth. This is used for the first
; frame of the ANIM (ANHD's opmode = 0). BODY is the address of the loaded
; BODY chunk of the first frame of the ANIM file (minus the 8 byte header).


	XDEF	_DecompBODY,__DecompBODY
_DecompBODY:
	movea.l	_ILBMBase,a6
__DecompBODY:
	move.l	a2,-(sp)
	movem.l	8(sp),a0/a1/a2
	jsr		_LVODecompBODY(a6)
	movea.l	(sp)+,a2
	rts

;**************************** LoadILBM() *********************************
; IFFP = LoadILBM(fileHandle, Vectors, ILBMFrame)
;  d0						d1			a0				a1


	XDEF	_LoadILBM,__LoadILBM
_LoadILBM:
	movea.l	_ILBMBase,a6
__LoadILBM:
	movem.l	4(sp),d1/a0/a1
	bsr.s		SetVectors
	jmp		_LVOLoadILBM(a6)


SetVectors:
	movem.l	a0/a2/a3,-(sp)
	;---Setup CInterface to PROP handler
	lea		PROPVector,a3
	move.l	(a0)+,(a3)+
	beq.s		noPROP
	lea		PropHandler,a2
	move.l	a2,-4(a0)
noPROP:
	;---Setup CInterface to FORM handler
	move.l	(a0)+,(a3)+
	beq.s		noFORM
	lea		FormHandler,a2
	move.l	a2,-4(a0)
noFORM:
	;---Setup CInterface to Chunk handler
	move.l	(a0)+,(a3)+
	beq.s		noChunk
	lea		ChunkHandler,a2
	move.l	a2,-4(a0)
noChunk:
	;---Setup CInterface to Non-ILBM FORM handler
	move.l	(a0),(a3)
	beq.s		noNon
	lea		NONILBM,a2
	move.l	a2,(a0)
noNon:
	movem.l	(sp)+,a0/a2/a3
	rts

; Calls C PROP routine as follows:
; IFFP = PropRoutine(chunkID,PropID,Context,Vectors,Frame,PROPList)
PropHandler:
	movem.l	d0/d2/a0/a2/a3/a4,-(sp)
	movea.l	PROPVector,a1
	jsr		(a1)
	movem.l	(sp)+,d1/d2/a0/a2/a3/a4
	rts

; Calls C FORM routine as follows:
; IFFP = FormRoutine(chunkID,Context,Vectors,Frame,PROPList)
FormHandler:
	movea.l	FORMVector,a1
do_hand:
	movem.l	d0/a0/a2/a3/a4,-(sp)
	jsr		(a1)
	movem.l	(sp)+,d1/a0/a2/a3/a4
	rts

 ; An Unknown chunk in an ILBM (i.e. DLTA, ANHD, DEST, GRAB...)
ChunkHandler:
	movea.l	ChunkVector,a1
	bra.s		do_hand

 ; A Non-ILBM FORM
NONILBM:
	movea.l	NonILBMVector,a1
	bra.s		do_hand

;*************************** GetPROPStruct() *****************************
; PropStruct = GetPROPStruct(size, PropID, PROPList)
;		d0								d0		d1			a1


	XDEF _GetPROPStruct,__GetPROPStruct
_GetPROPStruct:
	movea.l	_ILBMBase,a6
__GetPROPStruct:
	movem.l	4(sp),d0/d1/a1
	jmp		_LVOGetPROPStruct(a6)


;*************************** SearchPROP() *****************************
; PropStruct = SearchPROP(PropID, PROPList)
;		d0							d0			a1


	XDEF _SearchPROP,__SearchPROP
_SearchPROP:
	movea.l	_ILBMBase,a6
__SearchPROP:
	movem.l	4(sp),d0/a1
	jmp		_LVOSearchPROP(a6)


;*************************** CopyILBMProp() *****************************
; CopyILBMProp(FromFrame, ToFrame)
;						d0			a1


	XDEF _CopyILBMProp,__CopyILBMProp
_CopyILBMProp:
	movea.l	_ILBMBase,a6
__CopyILBMProp:
	movem.l	4(sp),d0/a1
	jmp		_LVOCopyILBMProp(a6)

;*************************** FreePROPStruct() *****************************
; FreePROPStruct(PROPList)
;						a1


	XDEF _FreePROPStruct,__FreePROPStruct
_FreePROPStruct:
	movea.l	_ILBMBase,a6
__FreePROPStruct:
	movea.l	4(sp),a1
	jmp		_LVOFreePROPStruct(a6)


;*************************** HandleCAMG() *******************************
; HandleCAMG(Context,ILBMFrame)
;					a0			a1


	XDEF _HandleCAMG,__HandleCAMG
_HandleCAMG:
		movea.l	_ILBMBase,a6
__HandleCAMG:
		movem.l	4(sp),a0/a1
		jmp		_LVOHandleCAMG(a6)


;*************************** HandleCRNG() *******************************
; HandleCRNG(Context,ILBMFrame)
;					a0			a1

	XDEF _HandleCRNG,__HandleCRNG
_HandleCRNG:
		movea.l	_ILBMBase,a6
__HandleCRNG:
		movem.l	4(sp),a0/a1
		jmp		_LVOHandleCRNG(a6)


;*************************** HandleCCRT() *******************************
; HandleCCRT(Context,ILBMFrame)
;					a0			a1

	XDEF _HandleCCRT,__HandleCCRT
_HandleCCRT:
		movea.l	_ILBMBase,a6
__HandleCCRT:
		movem.l	4(sp),a0/a1
		jmp		_LVOHandleCCRT(a6)


;**************************** OpenRIFF() *******************************
; IFFP = OpenRIFF(fileHandle, newContext, Frame)
;  d0						d1				a0			a1

	XDEF	_OpenRIFF,__OpenRIFF
_OpenRIFF:
	movea.l	_ILBMBase,a6
__OpenRIFF:
	movem.l	4(sp),d1/a0/a1
	jmp		_LVOOpenRIFF(a6)


;**************************** FileLength() *****************************
;FileSize = FileLength(fileHandle)
;	d0								d1

	XDEF	_FileLength,__FileLength
_FileLength:
	movea.l	_ILBMBase,a6
__FileLength:
	move.l	4(sp),d1
	move.l	a6,-(sp)
	jsr		_LVOFileLength(a6)
	movea.l	(sp)+,a6
	rts


;********************** OpenRGroup() *****************************
; IFFP = OpenRGroup(parent, new)   passed 2 Context structures
;  d0						a0		 a1


	XDEF	_OpenRGroup,__OpenRGroup
_OpenRGroup:
	movea.l	_ILBMBase,a6
__OpenRGroup:
	movea.l	4(sp),a0
	movea.l	8(sp),a1
	jmp		_LVOOpenRGroup(a6)


;***************************** CloseRGroup ******************************
; IFFP = CloseRGroup(context)
;  d0							a0

	XDEF	_CloseRGroup,__CloseRGroup
_CloseRGroup:
	movea.l	_ILBMBase,a6
__CloseRGroup:
	movea.l	4(sp),a0
	jmp		_LVOCloseRGroup(a6)


;*************************** SkipFwd() **********************************
; IFFP = SkipFwd(context, bytes)
;  d0              a0       d1


	XDEF	_SkipFwd,__SkipFwd
_SkipFwd:
	movea.l	_ILBMBase,a6
__SkipFwd:
	movea.l	4(sp),a0
	move.l	8(sp),d1
	jmp		_LVOSkipFwd(a6)


;*************************** GetChunkHdr *******************************
; ID = GetChunkHdr(context)
; d0						a0


	XDEF	_GetChunkHdr,__GetChunkHdr
_GetChunkHdr:
	movea.l	_ILBMBase,a6
__GetChunkHdr:
	movea.l	4(sp),a0
	jmp		_LVOGetChunkHdr(a6)


;************************** IFFReadBytes ********************************
; IFFP = IFFReadBytes(nBytes, context, buffer)
;  d0							d0			a0			a1


	XDEF	_IFFReadBytes,__IFFReadBytes
_IFFReadBytes:
	movea.l	_ILBMBase,a6
__IFFReadBytes:
	movem.l	4(sp),d0/a0/a1
	jmp		_LVOIFFReadBytes(a6)


;************************* GetFChunkHdr() ******************************
; ID = GetFChunkHdr(context)
; d0						a0

	XDEF	_GetFChunkHdr,__GetFChunkHdr
_GetFChunkHdr:
	movea.l _ILBMBase,a6
__GetFChunkHdr:
	movea.l	4(sp),a0
	jmp		_LVOGetFChunkHdr(a6)


;************************* GetF1ChunkHdr() ******************************
; ID = GetF1ChunkHdr(context)
; d0							a0


	XDEF	_GetF1ChunkHdr,__GetF1ChunkHdr
_GetF1ChunkHdr:
	movea.l	_ILBMBase,a6
__GetF1ChunkHdr:
	movea.l	4(sp),a0
	jmp		_LVOGetF1ChunkHdr(a6)


;**************************** GetPChunkHdr ****************************
; ID = GetPChunkHdr(context)
; d0                  a0


	XDEF	_GetPChunkHdr,__GetPChunkHdr
_GetPChunkHdr:
	movea.l	_ILBMBase,a6
__GetPChunkHdr:
	movea.l	4(sp),a0
	jmp		_LVOGetPChunkHdr(a6)


;**************************** GetCMAP() *******************************
; IFFP = GetCMAP(Context, colorMap, pNColorRegs)
;  d0						d0			a0			a1

	XDEF	_GetCMAP,__GetCMAP
_GetCMAP:
	movea.l	_ILBMBase,a6
__GetCMAP:
	movem.l	4(sp),d0/a0/a1
	jmp		_LVOGetCMAP(a6)


;****************************** GetBODY() *******************************
; IFFP = GetBODY(bitmap, mask, context, BMHD)
;  d0					d0			d1		a0			a1

	XDEF	_GetBODY,__GetBODY
_GetBODY:
	movea.l	_ILBMBase,a6
__GetBODY:
	movem.l	4(sp),d0/d1/a0/a1
	jmp		_LVOGetBODY(a6)

;*********************************************************************
;BOOL = UnPackRow(dstBytes0, srcBytes0, Source, Dest)
; d0						d1				d3			a2		a3

	XDEF	_UnPackRow,__UnPackRow
_UnPackRow:
	movea.l	_ILBMBase,a6
__UnPackRow:
	movem.l	d3/a2/a3,-(sp)
	movem.l	16(sp),d1/d3/a2/a3
	jsr		_LVOUnPackRow(a6)
	movem.l	(sp)+,d3/a2/a3
	rts

;****************************** DecompDLTA() *******************************
; DecompDLTA(DLTA,bitmap)
;				  a0		a2

	XDEF	_DecompDLTA,__DecompDLTA
_DecompDLTA:
	movea.l	_ILBMBase,a6
__DecompDLTA:
	move.l	a2,-(sp)
	movem.l	8(sp),a0/a2
	jsr		_LVODecompDLTA(a6)
	movea.l	(sp)+,a2
	rts

;****************************** DecodeVKPlane() *******************************
; DecodeVKPlane(linebytes, ytable, in, out)
; 						d0				d1		a0	 a1

	XDEF	_DecodeVKPlane,__DecodeVKPlane
_DecodeVKPlane:
	movea.l	_ILBMBase,a6
__DecodeVKPlane:
	movem.l	4(sp),d0/d1/a0/a1
	jmp		_LVODecodeVKPlane(a6)

;****************************** MakeYTable() *******************************
; MakeYTable(width, height, table)
;  				d0		d1			a0

	XDEF	_MakeYTable,__MakeYTable
_MakeYTable:
	movea.l	_ILBMBase,a6
__MakeYTable:
	movem.l	4(sp),d0/d1/a0
	jmp		_LVOMakeYTable(a6)


;######################## IFF WRITER ROUTINES #########################

;*************************************************************************
; IFFP = SaveWindowToIFF(fileName, window)
;  d0                       d1       a0

   XDEF   _SaveWindowToIFF,__SaveWindowToIFF
_SaveWindowToIFF:
    movea.l _ILBMBase,a6
__SaveWindowToIFF:
    movem.l 4(sp),d1/a0
    jmp     _LVOSaveWindowToIFF(a6)

;******************************* SaveILBM() ******************************
;IFFP = SaveILBM(ViewModes,Compress,fhandle,Mask,CTable,BitMap,xyPnt,Handler)
; d0                 d0       d1       d2    d3    a0      a1    a2     a3

   XDEF _SaveILBM,__SaveILBM
_SaveILBM:
    movea.l _ILBMBase,a6
__SaveILBM:
    movem.l d2/d3/a2/a3,-(sp)
    movem.l 20(sp),d0/d1/d2/d3/a2/a3
    move.l  a3,C_Vector1
    beq.s   noCHand
    lea     C_Handler1,a3
noCHand:
    jsr     _LVOSaveILBM(a6)
    movem.l (sp)+,d2/d3/a2/a3
    rts

C_Handler1:
	move.l	a0,-(sp)		;pass Context to C routine
	movea.l	C_Vector1,a1
	jsr		(a1)
	movea.l	(sp)+,a0
	rts


;******************************* SaveANIM() ******************************
;IFFP = SaveANIM(Modes,Compress,fhandle,Mask,CTable,BitMap,xyPnt,Handler,ANHD)
; d0              d0      d1       d2    d3    a0      a1    a2     a3    a4

   XDEF _SaveANIM,__SaveANIM
_SaveANIM:
    movea.l _ILBMBase,a6
__SaveANIM:
    movem.l d2/d3/a2/a3/a4,-(sp)
    movem.l 24(sp),d0/d1/d2/d3/a2/a3/a4
    move.l  a3,C_Vector2
    beq.s   noCHand2
    lea     C_Handler2,a3
noCHand2:
    jsr     _LVOSaveANIM(a6)
    movem.l (sp)+,d2/d3/a2/a3/a4
    rts

C_Handler2:
	movem.l	a0/a1,-(sp)		;pass Context and Parent to C routine
	movea.l	C_Vector2,a1
	jsr		(a1)
	movem.l	(sp)+,a0/a1
	rts


;**************************** OpenWIFF() *****************************
;IFFP = OpenWIFF(limit, fileHandle, newContext)
; d0					d0			d1				a0

	XDEF	_OpenWIFF,__OpenWIFF
_OpenWIFF:
	movea.l	_ILBMBase,a6
__OpenWIFF:
	movem.l	4(sp),d0/d1/a0
	jmp		_LVOOpenWIFF(a6)


;*************************** StartWGroup() ********************************
;IFFP = StartWGroup(groupType, groupSize, subtype, parent, new)
; d0							d0				d1			d2			a0		a1

	XDEF	_StartWGroup,__StartWGroup
_StartWGroup:
	movea.l _ILBMBase,a6
__StartWGroup:
	move.l   d2,-(sp)
	movem.l  8(sp),d0/d1/d2/a0/a1
	jsr     _LVOStartWGroup(a6)
	move.l  (sp)+,d2
	rts


;*************************** OpenWGroup() *******************************
;IFFP = OpenWGroup(parent, new)
; d0                 a0    a1

   XDEF _OpenWGroup,__OpenWGroup
_OpenWGroup:
    movea.l _ILBMBase,a6
__OpenWGroup:
    movea.l 4(sp),a0
    movea.l 8(sp),a1
    jmp     _LVOOpenWGroup(a6)


;***************************** EndWGroup() ********************************
;IFFP = EndWGroup(old)
; d0               a0

   XDEF _EndWGroup,__EndWGroup
_EndWGroup:
    movea.l _ILBMBase,a6
__EndWGroup:
    movea.l 4(sp),a0
    jmp     _LVOEndWGroup(a6)


;************************ CloseWGroup *********************************
;IFFP = CloseWGroup(old)
; d0                a0

   XDEF _CloseWGroup,__CloseWGroup
_CloseWGroup:
    movea.l _ILBMBase,a6
__CloseWGroup:
    movea.l 4(sp),a0
    jmp     _LVOCloseWGroup(a6)


;******************************* PutCk **********************************
;IFFP = PutCk(ckID, ckSize, context, data)
; d0           d0     d1      a0      a1

   XDEF   _PutCk,__PutCk
_PutCk:
    movea.l _ILBMBase,a6
__PutCk:
    movem.l  4(sp),d0/d1/a0/a1
    jmp     _LVOPutCk(a6)


;******************************* PutCkHdr() ****************************
;IFFPreturn = PutCkHdr(chunkID, chunkSize, context)
;                        d0        d1        a0

   XDEF   _PutCkHdr,__PutCkHdr
_PutCkHdr:
    movea.l _ILBMBase,a6
__PutCkHdr:
    movem.l  4(sp),d0/d1/a0
    jmp     _LVOPutCkHdr(a6)


;*************************** IFFWriteBytes() ***************************
;IFFP IFFWriteBytes(nBytes, context, data)
;                     d0       a0     a1

   XDEF   _IFFWriteBytes,__IFFWriteBytes
_IFFWriteBytes:
    movea.l _ILBMBase,a6
__IFFWriteBytes:
    movem.l  4(sp),d0/a0/a1
    jmp     _LVOIFFWriteBytes(a6)


;****************************** PutCkEnd() ******************************
;IFFP = PutCkEnd(context)
; d0               a0

   XDEF   _PutCkEnd,__PutCkEnd
_PutCkEnd:
    movea.l _ILBMBase,a6
__PutCkEnd:
    move.l  4(sp),a0
    jmp     _LVOPutCkEnd(a6)


;*************************** InitBMHdr() ********************************
;IFFP InitBMHdr(masking, compression, transparentColor,
;                 d0          d1              d2
;               pageWidth, pageHeight, BMHD, bitmap)
;                   d3         d4       a0     a1

   XDEF   _InitBMHdr,__InitBMHdr
_InitBMHdr:
    movea.l _ILBMBase,a6
__InitBMHdr:
    movem.l  d2/d3/d4,-(sp)
    movem.l  16(sp),d0/d1/d2/d3/d4/a0/a1
    jsr      _LVOInitBMHdr(a6)
    movem.l  (sp)+,d2/d3/d4
    rts

;**************************** PutCMAP() *********************************
;IFFP PutCMAP(depth, context, colorTable)
;               d0     a0        a1

   XDEF _PutCMAP,__PutCMAP
_PutCMAP:
    movea.l _ILBMBase,a6
__PutCMAP:
    movem.l  4(sp),d0/a0/a1
    jmp     _LVOPutCMAP(a6)


;******************************** PutBODY() ******************************
;IFFP = PutBODY(mask, context, bmHdr, bitmap)
; d0             d0     d1       a0     a1

   XDEF _PutBODY,__PutBODY
_PutBODY:
    movea.l _ILBMBase,a6
__PutBODY:
    movem.l  4(sp),d0/d1/a0/a1
    jmp     _LVOPutBODY(a6)

;============================ PackRow ===========================
;bytes = PackRow(rowSize, pSource, pDest)
; d0               d0       a0      a1

   XDEF _PackRow,__PackRow
_PackRow:
    movea.l _ILBMBase,a6
__PackRow:
    movem.l  4(sp),d0/a0/a1
    jsr     _LVOPackRow(a6)
    move.l  a6,d1
    lea     _sourceptr,a6
    move.l  a0,(a6)+
    move.l  a1,(a6)
    movea.l d1,a6
    rts

  SECTION  ilbmdata,DATA

C_Vector2	dc.l 0

C_Vector1	dc.l 0

  XDEF _sourceptr,_destptr
_sourceptr: dc.l 0
_destptr    dc.l 0

PROPVector		dc.l 0
FORMVector		dc.l 0
ChunkVector		dc.l 0
NonILBMVector	dc.l 0

	END
