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 21.3 92/05/18 02:22:57 chris Exp $
** $Revision: 21.3 $
**
** $Filename: IFFLib.S $
** $Author: chris $
** $Release: 19.1 $
** $Date: 92/05/18 02:22:57 $
**
** 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 100 ; D0 bei OpenLibrary
REVISION: EQU 4 ; jedesmal um 1 erhöhen
ELSE
VERSION: EQU 22 ; D0 bei OpenLibrary
REVISION: EQU 1 ; 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 (02.06.92) Copyright © 1990-1992 by Christian A. Weber",10,13,0
ELSE
MyLibName: DC.B "iff.library",0
MyLibInfo: DC.B "IFF 22.1 (02.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
|