@@ -26,15 +26,14 @@ _____ _ _ _ ___________
2626#include <stdio.h>
2727#include <stdlib.h>
2828
29- // #define DEBUGGING 1
3029#include "debug.h"
3130
3231typedef UBYTE DataMode ;
3332#define dmAccessPoints 1
3433#define dmConfig 2
3534#define dmEthernet 3
3635
37- #define PAULA_INDEX_PADDING 128
36+ #define PAULA_INDEX_PADDING 64
3837#define PAULA_WRITE_PADDING (4+2) // (write padding in bytes, 4 for the two sync)
3938#define CHIPBUFFER_SIZE (MAX_TRANSFER_SIZE + (PAULA_INDEX_PADDING<<2))
4039
@@ -48,6 +47,8 @@ typedef UBYTE DataMode;
4847
4948#define COMPRESSION_WORSTCASE (((ETH_MTU+127)/127)+2)
5049
50+ #define LZ4_MIN_MATCH 4
51+
5152#define TRACK_OFFSET (track , side ) ((track<<1) + side)
5253#define TRACK_SEEK_OFFSET (track , side ) (((track<<1) + side) * NUMSECS * TD_SECTOR)
5354
@@ -100,33 +101,51 @@ struct CompressionHeader {
100101 UWORD originalSize ;
101102};
102103
104+ static const UWORD stuffChar [] = {0x16c0 , 0x4e75 };
105+ #ifdef DEBUG
106+ void ssprintf (struct PaulaNET * dev , const char * messageFormat , char * buf , ...) {
107+ va_list args ;
108+ va_start (args , buf ); /* FIX: last named param before ... is buf, not messageFormat */
109+ RawDoFmt ((STRPTR )messageFormat , (APTR )args , (void (* )(void ))stuffChar , buf );
110+ va_end (args );
111+ }
103112
104- #ifdef DEBUGGING
105- void hexDump (BPTR out , const void * data , ULONG length ) {
113+ void hexDump (struct PaulaNET * out , const void * data , ULONG length ) {
106114 const UBYTE * p = (const UBYTE * )data ;
115+ char buffer [160 ]; /* slightly larger to be safe */
116+ char tmp [32 ];
107117 ULONG i , j ;
108118 for (i = 0 ; i < length ; i += 16 ) {
109- FPrintf (out , "%04lx: " , i );
119+ buffer [0 ] = '\0' ;
120+ ssprintf (out , "%04lx: " , tmp , i );
121+ strcat (buffer , tmp );
110122 for (j = 0 ; j < 16 ; j ++ ) {
111- if (i + j < length )
112- FPrintf (out , "%02lx " , (ULONG )p [i + j ]);
113- else
114- FPrintf ( out , " " );
123+ if (i + j < length ) {
124+ ssprintf (out , "%02lx " , tmp , (ULONG )p [i + j ]);
125+ strcat ( buffer , tmp );
126+ } else strcat ( buffer , " " );
115127 }
116- FPrintf (out , " " );
128+
129+ strcat (buffer , " " );
117130 for (j = 0 ; j < 16 && i + j < length ; j ++ ) {
118131 UBYTE c = p [i + j ];
119- FPrintf (out , "%lc" , (ULONG )(c >= 32 && c < 127 ? c : '.' ));
132+ tmp [0 ] = (c >= 32 && c < 127 ) ? (char )c : '.' ;
133+ tmp [1 ] = '\0' ;
134+ strcat (buffer , tmp );
120135 }
121- FPrintf (out , "\n" );
136+
137+ strcat (buffer , "\n" );
138+ D ((buffer ));
122139 }
123140}
124141#endif
125142
143+
144+
126145// Formatted logging to console window
127- static const UWORD stuffChar [] = { 0x16c0 , 0x4e75 };
146+
128147static void logMessagef (struct PaulaNET * dev , const char * messageFormat , ...) {
129- #ifdef DEBUGGING
148+ #ifdef DEBUG
130149 char buf [100 ];
131150 va_list args ;
132151 va_start (args , messageFormat );
@@ -241,6 +260,55 @@ UWORD rleDecompress(struct PaulaNET* dev, const UBYTE* src, UWORD srclen, UBYTE*
241260 return dstPos ;
242261}
243262
263+ // Decompress LZ4 block format data.
264+ UWORD lz4Decompress (struct PaulaNET * dev , const UBYTE * src , UWORD srcLen , UBYTE * dst , UWORD dstMax ) {
265+ UWORD srcPos = 0 ;
266+ UWORD dstPos = 0 ;
267+
268+ while (srcPos < srcLen ) {
269+ // --- Token ---
270+ const UBYTE token = src [srcPos ++ ];
271+ UWORD litLen = token >> 4 ;
272+ UWORD matchLen = token & 0x0F ;
273+
274+ // --- Extra literal length ---
275+ if (litLen == 15 ) {
276+ UBYTE extra ;
277+ do { extra = src [srcPos ++ ]; litLen += extra ; } while (extra == 255 );
278+ }
279+
280+ // --- Literals ---
281+ if (dstPos + litLen > dstMax ) break ;
282+ if (srcPos + litLen > srcLen ) break ;
283+ memcpy (& dst [dstPos ], & src [srcPos ], litLen );
284+ srcPos += litLen ;
285+ dstPos += litLen ;
286+
287+ // --- End of stream: final sequence has no match ---
288+ if (srcPos >= srcLen ) break ;
289+
290+ // --- Match offset ---
291+ if (srcPos + 2 > srcLen ) break ;
292+ const UWORD offset = ((UWORD )src [srcPos ] << 8 ) | ((UWORD )src [srcPos + 1 ]);
293+ srcPos += 2 ;
294+ if (offset == 0 || offset > dstPos ) break ; // corrupt
295+
296+ // --- Extra match length ---
297+ matchLen += LZ4_MIN_MATCH ;
298+ if ((token & 0x0F ) == 15 ) {
299+ UBYTE extra ;
300+ do { extra = src [srcPos ++ ]; matchLen += extra ; } while (extra == 255 );
301+ }
302+
303+ // --- Match copy (may overlap, so byte-by-byte) ---
304+ if (dstPos + matchLen > dstMax ) break ;
305+ const UBYTE * matchSrc = & dst [dstPos - offset ];
306+ for (UWORD i = 0 ; i < matchLen ; i ++ ) dst [dstPos ++ ] = matchSrc [i ];
307+ }
308+
309+ return dstPos ;
310+ }
311+
244312// This generate a valid MFM output for the data input, it's not how it should be done (bits being spread into bytes, its an odd/even approach, which is faster)
245313int mfmEncode (const UBYTE * src , UWORD srcLen , UWORD * dst , UWORD * lastBit ) {
246314 UWORD * out = dst ;
@@ -898,9 +966,6 @@ BOOL paulaNetReceivePackets(APTR device, APTR userContext, PacketReceivedCallbac
898966 int realDataLength = dataLength ;
899967 if (realDataLength & 1 ) realDataLength ++ ; // has to be even
900968 if (((UBYTE * )pkt ) + realDataLength > (UBYTE * )pktEnd ) {
901- #ifdef DEBUGGING
902- FPrintf (Output (), "Packet data content past end of buffer\n" );
903- #endif
904969 return TRUE;
905970 }
906971
@@ -911,12 +976,11 @@ BOOL paulaNetReceivePackets(APTR device, APTR userContext, PacketReceivedCallbac
911976 callback (userContext , (UBYTE * )dev -> compressionSpace , cHeader .originalSize );
912977 } else {
913978 // Compressed
979+ //int res = lz4Decompress(dev, (UBYTE*)pkt, dataLength, (UBYTE*)dev->compressionSpace, CHIPBUFFER_SIZE);
980+ //if (res == cHeader.originalSize) {
914981 if (rleDecompress (dev , (UBYTE * )pkt , dataLength , (UBYTE * )dev -> compressionSpace , CHIPBUFFER_SIZE ) == cHeader .originalSize ) {
915982 callback (userContext , (UBYTE * )dev -> compressionSpace , cHeader .originalSize );
916983 } else {
917- #ifdef DEBUGGING
918- FPrintf (Output (), "Packet decompressed to wrong size\n" );
919- #endif
920984 }
921985 }
922986
0 commit comments