summaryrefslogtreecommitdiff
path: root/Source/IFFLib.S
blob: 9361edba8f0109eac1f78899580dee61227bb46f (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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
**
**	$Id: IFFLib.S,v 22.1 92/06/02 16:49:02 chris Exp $
**	$Revision: 22.1 $
**
**	$Filename: IFFLib.S $
**	$Author: chris $
**	$Release: 19.1 $
**	$Date: 92/06/02 16:49:02 $
**
**	Disk-resident library for simple IFF file I/O. Does not handle
**	nested PROPs and CATs. Contains special ILBM support routines.
**
**	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.
**
**	Modification history
**	--------------------
**
**	Date        Version  Modification
**
**	14-Sep-87   V 1.0   Created this file!
**	24-Oct-87   V 6.1   Writing crunched ILBMs now works
**	27-Nov-87   V 7.1   Fully multi-tasking compatible and reentrant
**	14-Dec-87   V 8.1   SaveClip() fixed
**	07-Feb-88   V 9.1   bmhd.Width is now WORD aligned, for DPaint
**	20-Feb-88   V 10.1  IffError() implemented, Source split into files
**	06-Mar-88   V 11.1  Stencil pictures are correctly decoded
**	08-Mar-88   V 12.1  GetViewModes() implemented
**	24-Mar-88   V 14.1  8SVX files go automatically to CHIP RAM
**	30-Jun-88   V 15.1  CMAP size bug fixed (3*64 instead of 2*32)
**	30-Jun-88   V 15.2  SaveClip() now generates CAMG chunks
**	20-Jul-88   V 15.3  Closes DOS library if started as a command
**	16-Nov-88   V 15.4  GetViewModes(): upto 384 pixels is now LoRes
**	30-Nov-88   V 15.5  DecodePic() rounds bmhd.width up to WORDs
**	01-Dec-88   V 16.1  NewOpenIFF() with MemType added
**	03-Mar-89   V 16.2  GetBMHD now sets IFFError (0 or IFF_NOBMHD)
**	18-Mar-89   V 16.3  GetViewModes(): upto 400 LoRes, 320 hor. NoLace
**	16-May-89   V 16.4  Code cleaned up, labels capitalized etc.
**	21-Feb-90   V 18.1  Uses CBM include files, GetColorTab() fixed
**	25-Feb-90   V 18.2  ModifyFrame() added
**	26 Feb-90   V 18.3  Decruncher handles corrupt pics & height=0
**	28-Feb-90   V 18.4  DecodePic() handles depth=1 again
**	12-Mar-90   V 18.5  OpenIFF() liest nicht mehr 4 Bytes zuviel ein
**	11-Apr-90   V 18.6  DecodePic geht auch wenn bm.Depth < bmh.Depth
**	13-Apr-90   V 18.7  DecodePic geht bis 24 Bitplanes
**	07-Oct-90   V 19.1  SaveClip() speichert 256 Farben bei 24 Planes
**	                    An neue 2.0 Includefiles angepasst (JSRLIB..)
**
**

		IDNT	IFFLib
		SECTION	text,CODE

* PP_VERSION

		INCLUDE	"IFFLib.i"

		XREF	FindOurNode		 ; Error-Node finden

		XREF	OldOpenIFFFunc
		XREF	CloseIFFFunc
		XREF	FindChunkFunc
		XREF	GetBMHDFunc
		XREF	GetColorTabFunc
		XREF	DecodePicFunc
		XREF	SaveBitMapFunc
		XREF	SaveClipFunc
		XREF	IFFErrorFunc
		XREF	GetViewModesFunc
		XREF	OldNewOpenIFFFunc
		XREF	ModifyFrameFunc
	IFD PP_VERSION
		XREF	PPOpenIFFFunc
	ENDC
		XREF	OpenIFFFunc
		XREF	PushChunkFunc
		XREF	PopChunkFunc
		XREF	WriteChunkBytesFunc
		XREF	CompressBlockFunc
		XREF	DecompressBlockFunc


	IFD PP_VERSION
VERSION:	EQU	101			 ; D0 bei OpenLibrary
REVISION:	EQU	4			 ; jedesmal um 1 erhöhen
	ELSE
VERSION:	EQU	22			 ; D0 bei OpenLibrary
REVISION:	EQU	2			 ; jedesmal um 1 erhöhen
	ENDC

*****************************************************************************
** Diese Routine wird aufgerufen wenn man iff.library als Programm startet

FirstByte:
		bra.b	1$
		dc.b	"CHW!"
1$:
	*** wird aufgerufen, wenn mann die Library vom CLI aus startet

		lea	DOSName(PC),a1		; dos.library öffnen
		movea.l	4.W,a6
		JSRLIB	OldOpenLibrary
		movea.l	d0,a6			; DosBase
		JSRLIB	Output
		move.l	d0,d1			; file: stdout
		lea	MyLibInfo(PC),a0	; Adresse des ID-Strings
		move.l	a0,d2
	IFD PP_VERSION
		moveq.l	#67,d3			; Länge des ID-Strings
	ELSE
		moveq.l	#42,d3			; Länge des ID-Strings
	ENDC
		JSRLIB	Write
		movea.l	a6,a1
		movea.l	4.W,a6
		JSRLIB	CloseLibrary		; For Chris
		moveq.l	#5,d0			; return-code: WARN
		rts

*****************************************************************************
**	So, nun das eigentliche Library-Zeug...

MyROMTag:	DC.W	RTC_MATCHWORD
		DC.L	MyROMTag	; RT_MATCHTAG
		DC.L	EndCode		; Ende der Library
		DC.B	RTF_AUTOINIT
		DC.B	VERSION
		DC.B	NT_LIBRARY
		DC.B	0		; Priorität
		DC.L	MyLibName	; Name der Bibliothek
		DC.L	MyLibInfo	; Name, Version, Revision etc.
		DC.L	Init		; Zeiger auf Init-Struktur

	IFD PP_VERSION
MyLibName:	DC.B	"iffpp.library",0
MyLibInfo:	DC.B	"IFFPP 101.4 (03.06.92) Copyright © 1990-1992 by Christian A. Weber",10,13,0
	ELSE
MyLibName:	DC.B	"iff.library",0
MyLibInfo:	DC.B	"IFF 22.2 (03.06.92) by Christian A. Weber",10,13,0
	ENDC

DOSName:	DC.B	"dos.library",0

		EVEN
Init:		DC.L	iffb_SIZEOF	; data space size
		DC.L	FuncTable	; Zeiger auf Funktions-Initializers
		DC.L	DataTable	; Zeiger auf Data-Initializers
		DC.L	InitRoutine	; Initialisierungs-Routine


FuncTable: 	DC.W	-1		; Switch to WORD-Offset-Mode

	*** Die 4 Standard Library Routinen:

		DC.W	OpenFunc-FuncTable		; Offset -6
		DC.W	CloseFunc-FuncTable		; Offset -12
		DC.W	ExpungeFunc-FuncTable		; Offset -18
		DC.W	ExtFunc-FuncTable		; Offset -24

	*** Jetzt unsere IFF-Routinen:

		DC.W	OldOpenIFFFunc-FuncTable	; Offset -30
		DC.W	CloseIFFFunc-FuncTable		; Offset -36
		DC.W	FindChunkFunc-FuncTable		; Offset -42
		DC.W	GetBMHDFunc-FuncTable		; Offset -48
		DC.W	GetColorTabFunc-FuncTable	; Offset -54
		DC.W	DecodePicFunc-FuncTable		; Offset -60
		DC.W	SaveBitMapFunc-FuncTable	; Offset -66
		DC.W	SaveClipFunc-FuncTable		; Offset -72
		DC.W	IFFErrorFunc-FuncTable		; Offset -78
		DC.W	GetViewModesFunc-FuncTable	; Offset -84
		DC.W	OldNewOpenIFFFunc-FuncTable	; Offset -90
		DC.W	ModifyFrameFunc-FuncTable	; Offset -96
	IFD PP_VERSION
		DC.W	PPOpenIFFFunc-FuncTable		; Offset -102
	ELSE
		DC.W	ExtFunc-FuncTable		; Offset -102
	ENDC
		DC.W	ExtFunc-FuncTable		; Offset -108
		DC.W	ExtFunc-FuncTable		; Offset -114

		* V21-Routinen
		DC.W	OpenIFFFunc-FuncTable		; Offset -120
		DC.W	PushChunkFunc-FuncTable		; Offset -126
		DC.W	PopChunkFunc-FuncTable		; Offset -132
		DC.W	WriteChunkBytesFunc-FuncTable	; Offset -138
		DC.W	CompressBlockFunc-FuncTable	; Offset -144
		DC.W	DecompressBlockFunc-FuncTable	; Offset -150

		DC.W	-1				; End-Markierung

	*** Daten zur Initialisierung der Library-Struktur

DataTable:	INITBYTE  LN_TYPE,NT_LIBRARY
		INITLONG  LN_NAME,MyLibName
		INITBYTE  LIB_FLAGS,LIBF_SUMUSED|LIBF_CHANGED
		INITWORD  LIB_VERSION,VERSION
		INITWORD  LIB_REVISION,REVISION
		INITLONG  LIB_IDSTRING,MyLibInfo
		DC.L	  0

*****************************************************************************

	*** D0: Library Base, A0: Segment list, A6: SysBase

InitRoutine:	movem.l	d0-d1/a0-a1/a5,-(SP)
		movea.l	d0,a5			; Library pointer
		move.l	a6,iffb_SysBase(a5)	; Save SysBase
		move.l	a0,iffb_SegList(a5)	; Save SegList

	*** Dos-Library öffnen

		lea	DOSName(PC),a1		; dos.library öffnen
		JSRLIB	OldOpenLibrary
		move.l	d0,iffb_DOSBase(a5)	; DosBase merken

	*** Error-Liste initialisieren

		lea	iffb_ErrList(a5),a0
		NEWLIST	a0

		movem.l	(SP)+,d0-d1/a0-a1/a5	; d0/a5 wiederherstellen
		rts				; Library jetzt benutzbar

*****************************************************************************

	*** wird jedesmal bei OpenLibrary() aufgerufen, A6: IFFBase

OpenFunc:	movem.l	d1/a0-a2/a5-a6,-(SP)
		movea.l	a6,a5			; A5 :  IFFBase

	*** Testen ob schon ein Node für uns vorhanden ist

		bsr	FindOurNode		; Set Z bit if not found
		bne.b	.OpenError		; Schon vorhanden ---> Error

	*** Speicher für neuen Error-Node reservieren

		moveq.l	#ifferr_SIZEOF,d0		; Amount
		move.l	#MEMF_PUBLIC|MEMF_CLEAR,d1	; Requirements
		movea.l	iffb_SysBase(a5),a6
		JSRLIB	AllocMem
		tst.l	d0
		beq.b	.OpenError		; Error ---> 0 zurückgeben
		movea.l	d0,a2			; A2 :  ErrorNode

	*** Error-Node initialisieren: Task eintragen

		move.l	ThisTask(a6),ifferr_Task(a2)

	*** Error-Node an Liste anhängen

		lea	iffb_ErrList(a5),a0	; Liste
		movea.l	a2,a1			; Node
		JSRLIB	AddTail

	*** Normales Library-Zeug

		addq.w	#1,LIB_OPENCNT(a5)
		bclr.b	#LIBB_DELEXP,LIB_FLAGS(a5)
		move.l	a5,d0			; Return IFFBase
99$:
		movem.l	(SP)+,d1/a0-a2/a5-a6
		rts				; Library ist jetzt offen

.OpenError:	moveq.l	#0,d0			; ERROR!
		bra.b	99$

*****************************************************************************

	*** Wird jedesmal bei CloseLibrary() aufgerufen, A6: IFFBase

CloseFunc:	movem.l	a2/a5-a6,-(SP)
		movea.l	a6,a5			; IFFBase

	*** Error-Node suchen und entfernen

		bsr	FindOurNode		; our error-node nach D0 & A0
		beq.b	1$			; nicht gefunden --->
		movea.l	d0,a2			; ErrorNode retten
		movea.l	d0,a1
		movea.l	iffb_SysBase(a5),a6
		JSRLIB	Remove

		moveq.l	#ifferr_SIZEOF,d0
		movea.l	a2,a1
		JSRLIB	FreeMem
1$:		movem.l	(SP)+,a2/a5-a6

	*** Normales Library-Zeugs

		moveq.l	#0,d0			; return-code
		subq.w	#1,LIB_OPENCNT(a6)
		bne.b	2$			; jemand hat sie noch offen

		btst.b	#LIBB_DELEXP,LIB_FLAGS(a6) ; haben wir delayed Expunge?
		beq.b	2$			; neenee --->
		bsr.b	ExpungeFunc		; sonst Expunge
2$:
		rts				; Library ist jetzt zu

*****************************************************************************

	*** Wird beim letzten CloseLibrary aufgerufen, A6: IFFBase

ExpungeFunc:	movem.l	d2/a5-a6,-(SP)
		movea.l	a6,a5			; IFFBase

		tst.w	LIB_OPENCNT(a5)		; sind wir noch offen?
		beq.b	1$			; nein
		bset.b	#LIBB_DELEXP,LIB_FLAGS(a5)
		moveq.l	#0,d0			; return-code
		bra.b	99$
1$:
		movea.l	a5,a1			; LibPtr (zeigt auf NODE)
		movea.l	iffb_SysBase(a5),a6
		JSRLIB	Remove			; Library aus Liste entfernen

		movea.l	iffb_DOSBase(a5),a1	; dos.library schliessen
		JSRLIB	CloseLibrary
		move.l	iffb_SegList(a5),d2	; Segmentliste retten

		moveq.l	#0,d0
		movea.l	a5,a1			; LibPtr
		move.w	LIB_NEGSIZE(a5),d0	; Grösse der Sprungtabelle
		sub.w	d0,a1			; A1 := Anfang der Sprungtab.
		add.w	LIB_POSSIZE(a5),d0	; D0 := Lib-Grösse gesamt
		JSRLIB	FreeMem			; freigeben
		move.l	d2,d0			; return-code: Segmentliste

99$:		movem.l	(SP)+,d2/a5-a6
		rts

*****************************************************************************

	*** Wird aufgerufen bei Offset -24 und freien Slots

ExtFunc:	moveq.l	#0,d0
		rts

*****************************************************************************

EndCode:	; muss hier am Schluss stehen, siehe ROMTag-Struktur

		END