summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/CompressBlock.S40
-rw-r--r--Source/DecompressBlock.S51
2 files changed, 54 insertions, 37 deletions
diff --git a/Source/CompressBlock.S b/Source/CompressBlock.S
index 36bed53..9bec2d3 100644
--- a/Source/CompressBlock.S
+++ b/Source/CompressBlock.S
@@ -1,11 +1,11 @@
**
-** $Id: CompressBlock.S,v 2.1 92/05/13 01:48:05 chris Exp $
-** $Revision: 2.1 $
+** $Id: CompressBlock.S,v 21.1 92/05/15 03:23:52 chris Exp $
+** $Revision: 21.1 $
**
** $Filename: CompressBlock.S $
** $Author: chris $
** $Release: $
-** $Date: 92/05/13 01:48:05 $
+** $Date: 92/05/15 03:23:52 $
**
** iff.library/IFFL_CompressBlock
**
@@ -22,9 +22,10 @@
INCLUDE "IffLib.i"
- XREF ClearError
+ XREF SetError
XDEF CompressBlockFunc
+ XDEF Compress_NONE,Compress_BYTERUN1 ;,Compress_FIBDELTA
******* iff.library/IFFL_CompressBlock **************************************
*
@@ -48,10 +49,15 @@
* size - Number of data bytes to compress
* mode - Compression mode. Currently, the following modes
* are supported:
-* $$$
+*
+* IFFL_COMPR_NONE - Vanilla copy
+* IFFL_COMPR_BYTERUN1 - CmpByteRun1 (ILBM BODY data)
+* IFFL_COMPR_FIBDELTA - Fibonacci Delta (8SVX BODY data)
*
* RESULTS
* Length of compressed data or 0 if an error occurred.
+* IFFL_IFFError() returns IFFL_ERROR_BADCOMPRESSION if you ask for
+* an unsupported compression mode.
*
* SEE ALSO
* IFFL_DecompressBlock()
@@ -59,17 +65,23 @@
*****************************************************************************
CompressBlockFunc:
- tst.l d1 ; Modus == 0 ?
- beq.b Mode_Copy
- subq.l #1,d1 ; Modus == 1 ?
- beq.b Mode_CmpByteRun1
- moveq.l #0,d0
+ subq.l #1,d1
+ beq.b Compress_BYTERUN1 ; Modus == 1
+ bmi.b Compress_NONE ; Modus == 0
+
+ *** Unbekannter Modus --> Error setzen
+
+ movem.l a5-a6,-(SP)
+ movea.l a6,a5 ; A5 : IFFBase für SetError()
+ moveq.l #IFFL_ERROR_BADCOMPRESSION,d0
+ bsr SetError ; Setzt auch D0 auf 0
+ movem.l (SP)+,a5-a6
rts
*****************************************************************************
-** Kopiermodus
+** Kopiermodus (für CompressBlock() UND DecompressBlock() benutzt)
-Mode_Copy: movem.l d0/a6,-(SP)
+Compress_NONE: movem.l d0/a6,-(SP)
movea.l iffb_SysBase(a6),a6
JSRLIB CopyMem
movem.l (SP)+,d0/a6
@@ -78,7 +90,7 @@ Mode_Copy: movem.l d0/a6,-(SP)
*****************************************************************************
** CmpByteRun1 komprimieren
-Mode_CmpByteRun1:
+Compress_BYTERUN1:
movem.l d2-d3/a2-a3,-(SP)
lea (a0,d0.l),a2 ; A2 : Source-Endadresse
moveq #0,d3 ; Byte-Zähler
@@ -140,5 +152,5 @@ CountEq: move.l a0,-(SP)
3$: move.l (SP)+,a0
rts
- END
+ END
diff --git a/Source/DecompressBlock.S b/Source/DecompressBlock.S
index 54f2fec..9a50da0 100644
--- a/Source/DecompressBlock.S
+++ b/Source/DecompressBlock.S
@@ -1,11 +1,11 @@
**
-** $Id: DecompressBlock.S,v 2.1 92/05/13 01:48:41 chris Exp $
-** $Revision: 2.1 $
+** $Id: DecompressBlock.S,v 21.1 92/05/15 03:23:32 chris Exp $
+** $Revision: 21.1 $
**
** $Filename: DecompressBlock.S $
** $Author: chris $
** $Release: $
-** $Date: 92/05/13 01:48:41 $
+** $Date: 92/05/15 03:23:32 $
**
** iff.library/IFFL_DecompressBlock
**
@@ -22,9 +22,12 @@
INCLUDE "IffLib.i"
- XREF ClearError
+ XREF SetError
XDEF DecompressBlockFunc
+ XREF Compress_NONE
+ XDEF Decompress_BYTERUN1 ;,Decompress_FIBDELTA
+
******* iff.library/IFFL_DecompressBlock ************************************
*
@@ -45,13 +48,18 @@
* INPUTS
* source - Pointer to data to decompress
* destination - Target address for decompression
-* size - Number of data bytes to decompress
+* size - Number of _DECOMPRESSED_ data bytes
* mode - Compression mode. Currently, the following modes
* are supported:
-* $$$
+*
+* IFFL_COMPR_NONE - Vanilla copy
+* IFFL_COMPR_BYTERUN1 - CmpByteRun1 (ILBM BODY data)
+* IFFL_COMPR_FIBDELTA - Fibonacci Delta (8SVX BODY data)
*
* RESULTS
* Length of uncompressed data or 0 if an error occurred.
+* IFFL_IFFError() returns IFFL_ERROR_BADCOMPRESSION if you ask for
+* an unsupported compression mode.
*
* SEE ALSO
* IFFL_CompressBlock()
@@ -59,27 +67,24 @@
*****************************************************************************
DecompressBlockFunc:
- tst.l d1 ; Modus == 0 ?
- beq.b Mode_Copy
- subq.l #1,d1 ; Modus == 1 ?
- beq.b Mode_CmpByteRun1
- moveq.l #0,d0
- rts
+ subq.l #1,d1
+ beq.b Decompress_BYTERUN1 ; Modus == 1
+ bmi Compress_NONE ; Modus == 0
-*****************************************************************************
-** Kopiermodus
+ *** Unbekannter Modus --> Error setzen
-Mode_Copy: movem.l d0/a6,-(SP)
- movea.l iffb_SysBase(a6),a6
- JSRLIB CopyMem
- movem.l (SP)+,d0/a6
+ movem.l a5-a6,-(SP)
+ movea.l a6,a5 ; A5 : IFFBase für SetError()
+ moveq.l #IFFL_ERROR_BADCOMPRESSION,d0
+ bsr SetError ; Setzt auch D0 auf 0
+ movem.l (SP)+,a5-a6
rts
*****************************************************************************
** CmpByteRun1 dekomprimieren
-Mode_CmpByteRun1:
- move.l d2,-(SP)
+Decompress_BYTERUN1:
+ movem.l d0/d2,-(SP)
1$: moveq.l #0,d1
move.b (a0)+,d1 ; D1 : nächstes Kommando-Byte
@@ -94,14 +99,14 @@ Mode_CmpByteRun1:
bmi.b 3$ ; ~$80 (== $80) ist 'NOP'
move.b (a0)+,d2 ; Zu repetierender Wert
.RepLoop: move.b d2,(a1)+
- subq.l #1,d0 ; DEC ColumnCounter
+ subq.l #1,d0 ; DEC length counter
dble d1,.RepLoop
3$:
tst.l d0 ; Linie fertig ? (Braucht's das tst??)
bgt.b 1$ ; noch nicht ---> Loop
- move.l (SP)+,d2
+ movem.l (SP)+,d0/d2
rts
- END
+ END