diff options
Diffstat (limited to 'Source/IFFLib.S')
-rw-r--r-- | Source/IFFLib.S | 324 |
1 files changed, 324 insertions, 0 deletions
diff --git a/Source/IFFLib.S b/Source/IFFLib.S new file mode 100644 index 0000000..2150632 --- /dev/null +++ b/Source/IFFLib.S @@ -0,0 +1,324 @@ +** +** $Id: $ +** $Revision: $ +** +** $Filename: IFFLib.S $ +** $Author: Christian A. Weber $ +** $Release: 19.1 $ +** $Date: 92/05/11 21:11:27 $ +** +** 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 OpenIFFFunc + XREF CloseIFFFunc + XREF FindChunkFunc + XREF GetBMHDFunc + XREF GetColorTabFunc + XREF DecodePicFunc + XREF SaveBitMapFunc + XREF SaveClipFunc + XREF IFFErrorFunc + XREF GetViewModesFunc + XREF NewOpenIFFFunc + XREF ModifyFrameFunc + IFD PP_VERSION + XREF PPOpenIFFFunc + ENDC + + + IFD PP_VERSION +VERSION: EQU 100 ; D0 bei OpenLibrary +REVISION: EQU 3 ; jedesmal um 1 erhöhen + ELSEIF +VERSION: EQU 19 ; D0 bei OpenLibrary +REVISION: EQU 1 ; jedesmal um 1 erhöhen + ENDC + + +*************** C O D E ***************************************************** + +FirstByte: + bra.s 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 #65,d3 ; Länge des ID-Strings + ELSEIF + moveq.l #45,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 + +***************************************************************************** + +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 100.3 (01-Jul-1990) Copyright © 1990 by Christian A. Weber",10,0 + ELSEIF +MyLibName: DC.B "iff.library",0 +MyLibInfo: DC.B "IFF 19.1 (09-Oct-1990) by Christian A. Weber",10,0 + ENDC + +DOSName: DC.B "dos.library",0 + + EVEN +Init: DC.L ib_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.L OpenFunc ; Offset -6 + DC.L CloseFunc ; Offset -12 + DC.L ExpungeFunc ; Offset -18 + DC.L ExtFunc ; Offset -24 + + *** Jetzt unsere IFF-Routinen: + + DC.L OpenIFFFunc ; Offset -30 + DC.L CloseIFFFunc ; Offset -36 + DC.L FindChunkFunc ; Offset -42 + DC.L GetBMHDFunc ; Offset -48 + DC.L GetColorTabFunc ; Offset -54 + DC.L DecodePicFunc ; Offset -60 + DC.L SaveBitMapFunc ; Offset -66 + DC.L SaveClipFunc ; Offset -72 + DC.L IFFErrorFunc ; Offset -78 + DC.L GetViewModesFunc ; Offset -84 + DC.L NewOpenIFFFunc ; Offset -90 + DC.L ModifyFrameFunc ; Offset -96 + IFD PP_VERSION + DC.L PPOpenIFFFunc ; Offset -102 + ENDC + + DC.L -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,ib_SysBase(a5) ; Save SysBase + move.l a0,ib_SegList(a5) ; Save SegList + + *** Dos-Library öffnen + + lea DOSName(PC),a1 ; dos.library öffnen + JSRLIB OldOpenLibrary + move.l d0,ib_DOSBase(a5) ; DosBase merken + + *** Error-Liste initialisieren + + lea ib_ErrList(a5),a0 + move.l a0,(a0) ; NewList + addq.l #4,(a0) + clr.l 4(a0) + move.l a0,8(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.s .OpenError ; Schon vorhanden ---> Error + + *** Speicher für neuen Error-Node reservieren + + moveq.l #er_SIZEOF,d0 ; Amount + move.l #MEMF_PUBLIC|MEMF_CLEAR,d1 ; Requirements + movea.l ib_SysBase(a5),a6 + JSRLIB AllocMem + tst.l d0 + beq.s .OpenError ; Error ---> 0 zurückgeben + movea.l d0,a2 ; A2 : ErrorNode + + *** Error-Node initialisieren: Task eintragen + + move.l ThisTask(a6),er_Task(a2) + + *** Error-Node an Liste anhängen + + lea ib_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.s 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.s 1$ ; nicht gefunden ---> + movea.l d0,a2 ; ErrorNode retten + movea.l d0,a1 + movea.l ib_SysBase(a5),a6 + JSRLIB Remove + + moveq.l #er_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.s 2$ ; jemand hat sie noch offen + + btst.b #LIBB_DELEXP,LIB_FLAGS(a6) ; haben wir delayed Expunge? + beq.s 2$ ; neenee ---> + bsr.s 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.s 1$ ; nein + bset.b #LIBB_DELEXP,LIB_FLAGS(a5) + moveq.l #0,d0 ; return-code + bra.s 99$ +1$: + movea.l a5,a1 ; LibPtr (zeigt auf NODE) + movea.l ib_SysBase(a5),a6 + JSRLIB Remove ; Library aus Liste entfernen + + movea.l ib_DOSBase(a5),a1 ; dos.library schliessen + JSRLIB CloseLibrary + move.l ib_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 + +ExtFunc: rts ; wird aufgerufen bei Offset -24 + +***************************************************************************** + +EndCode: ; muss hier am Schluss stehen, siehe ROMTag-Struktur + + END |