summaryrefslogtreecommitdiff
path: root/Source/PushChunk.S
blob: b021340d3caa95524aa366c2f8447cfc72d51f70 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
**
**	$Id: $
**	$Revision: $
**
**	$Filename: PushChunk.S $
**	$Author: Christian A. Weber $
**	$Release: 21.1 $
**	$Date: 92/05/14 22:26:34 $
**
**	iff.library/IFFL_PushChunk
**
**	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_PushChunk
		SECTION	text,CODE

		INCLUDE	"IffLib.i"

		XREF	SetError,ClearError
		XDEF	PushChunkFunc


******* iff.library/IFFL_PushChunk ******************************************
*
*    NAME
*	IFFL_PushChunk -- Push a new context node on the context stack.
*
*    SYNOPSIS
*	success = IFFL_PushChunk( iff, type, id )
*	D0                        A0   D0    D1
*
*	BOOL IFFL_PushChunk( IFFL_HANDLE, ULONG, ULONG )
*
*    FUNCTION
*	Pushes a new context node on the context stack by reading it from the
*	stream if this is a read file, or by creating it from the passed
*	parameters if this is a write file.  Normally this function is only
*	called in write mode, where the type and id codes specify the new
*	chunk to create.  If this is a leaf chunk, i.e. a local chunk inside
*	a FORM or PROP chunk, then the type argument is ignored.
*
*    INPUTS
*	iff  - IFF handle
*	type - chunk type specifier (ex. ILBM) (ignored for read mode or
*	       leaf chunks).
*	id   - chunk id specifier (ex. CMAP) (ignored for read mode).
*
*    RESULTS
*	Non-zero if successful or 0 if not successful (call IFFL_IFFError()
*	to get an IFFL_ERROR_... error code.
*
*    SEE ALSO
*	IFFL_PopChunk(), IFFL_WriteChunkBytes()
*
*****************************************************************************

PushChunkFunc:	movem.l	d0-d3/a2/a5-a6,-(SP)
		movea.l	a6,a5			; IFFBase für ClearError()
		movea.l	a0,a2			; A2 :  IFF-Handle
		movea.l	iffb_DOSBase(a5),a6	; A6 :  DOSBase

	*** File-Type schreiben falls dies der erste Chunk ist

		tst.l	ifffh_FormSize(a2)	; 1. Chunk ?
		bne.b	.NotFirstChunk		; nee --->

		move.l	ifffh_File(a2),d1	; Filehandle
		move.l	SP,d2			; Type aufm Stack
		moveq.l	#4,d3			; Länge: 1 Langwort
		JSRLIB	Write
		cmp.l	d3,d0			; OK geschrieben ?
		bne.b	.WriteError
		add.l	d3,ifffh_FormSize(a2)	; FORM-Grösse anpassen
.NotFirstChunk:

	*** Chunk im IFF-Handle initialisieren

		clr.l	ifffh_ChunkSize(a2)	; Chunk-Grösse resstten

		move.l	ifffh_File(a2),d1
		moveq.l	#0,d2			; Aktuelle Position
		moveq.l	#OFFSET_CURRENT,d3
		JSRLIB	Seek
		move.l	d0,ifffh_ChunkFPos(a2)	; Chunk-Position eintragen
		bmi.b	.SeekError		; Error --->

	*** ID und provisorische Länge schreiben

		move.l	ifffh_File(a2),d1
		lea	4(SP),a0
		move.l	a0,d2			; ID und 1 LONG garbage
		moveq.l	#8,d3			; ID und provisorische Länge
		JSRLIB	Write
		cmp.l	d3,d0			; OK geschrieben ?
		bne.b	.WriteError

	*** Okay

		bsr	ClearError		; Setzt auch D0 auf TRUE
		bra.b	.End

	*** Schreibfehler oder Seekfehler

.SeekError:
.WriteError:	moveq.l	#IFFL_ERROR_WRITE,d0
		bsr	SetError		; Setzt auch D0 auf FALSE

	*** Routine beenden

.End:		move.l	d0,(SP)			; D0 in Stack (--> wieder D0)
		movem.l	(SP)+,d0-d3/a2/a5-a6
		rts


		END