diff -Naur lmilk-0.14.orig/lmilk/CParallelI2c.h lmilk-0.14/lmilk/CParallelI2c.h
--- lmilk-0.14.orig/lmilk/CParallelI2c.h	2002-11-25 00:40:25.000000000 +0100
+++ lmilk-0.14/lmilk/CParallelI2c.h	2003-04-10 23:55:41.000000000 +0200
@@ -15,6 +15,57 @@
  *                                                                         *
  ***************************************************************************/
 
+class sp5668 {
+	public:
+		sp5668(unsigned char *b) {
+			const unsigned int ratio[] = { 2000000, 1000000, 500000, 250000, 125000, 62500, 31250, 15625 };
+			p   = (b[0]) & 7;
+			to  = (b[1] >> 7) & 1;
+			os  = (b[1] >> 6) & 1;
+			co  = (b[1] >> 5) & 1;
+			r   = (b[1] >> 2) & 7;
+			pe  = (b[1] >> 1) & 1;
+			div = ((b[1] & 1) << 16) | (b[2] << 8) | b[3];
+
+			unsigned int f = (div * ratio[r - pe]) - 479500000;
+
+			ghz = f / (1000 * 1000 * 1000);
+			f -= (ghz * 1000 * 1000 * 1000);
+			mhz = f / (1000 * 1000);
+			f -= (mhz * 1000 * 1000);
+			khz = f / (1000);
+			f -= (khz * 1000);
+			hz = f;
+		}
+
+		void dump(void) {
+			printf(" P=%d TO=%d OS=%d CO=%d R=%d PE=%d DIV=0x%05x F=", p, to, os, co, r, pe, div);
+
+			if (hz != 0)
+				printf("%hu.%03hu.%03hu.%03huHz", ghz, mhz, khz, hz);
+			else if (khz != 0)
+				printf("%hu.%03hu.%03huKHz", ghz, mhz, khz);
+			else if (mhz != 0)
+				printf("%hu.%03huMHz", ghz, mhz);
+			else
+				printf("%huGHz", ghz);
+		}
+
+		unsigned p	: 3;
+		unsigned to	: 1;
+		unsigned os	: 1;
+		unsigned co	: 1;
+		unsigned r	: 3;
+		unsigned pe	: 1;
+		unsigned div	: 17;
+
+		unsigned int f;
+		unsigned short ghz;
+		unsigned short mhz;
+		unsigned short khz;
+		unsigned short hz;
+};
+
 class CI2CEvent
 {
 	public:
@@ -26,7 +77,151 @@
 	public:
 		CI2CEvent() { Reset(); }
 		void Reset() { m_bAdsRwLsb=0; m_fnAcked=m_fAcked=false; m_dwDataFollowing=0; m_i64Timestamp=0; }
+
+		void DumpVES1893(char c, unsigned char *cmd, size_t len) {
+			printf("ves %c ", c);
+
+			static const char *VES1893REG[] = {
+				"CLEAR", "CARC", "CSWP", "CARINIT", "RHYC", "AGCR", "BDR_LSB", "BDR_MID",
+				"BDR_MSB", "BDR_INV", "VAFC", "VAGC", "CONF", "RATE", "SYNC", "STATUS",
+				"UNKNWN_0", "POLA", "UNKNWN_1", "UNKNWN_2", "UNKNWN_3", "VBER_LSB", "VBER_MID", "VBER_MSB",
+				"CPT_UNCOR", "UNKNWN_4", "MODE", "NTHR", "NEST", "UNKNWN_5", "IDENTITY", "TEST",
+				"ADCONF", "FCONF", "GAIN", "CLAMPIN", "CLAMP1", "CLAMP2", "CLAMP3", "CLAMP4",
+				"CLAMPA", "CLAMPMID", "THRES1", "THRES2", "UNKNWN_6", "UNKNWN_7", "UNKNWN_8", "UNKNWN_9",
+				"AFC0", "AFC1", "ITSEL", "ITSTAT", "H22K_LSB", "H22K_MSB"
+			};
+
+			if ((c != 'W') || (len == 0))
+				return;
+ 
+			if (cmd[0] == 0) {
+				if (len == 2)
+					printf("READ %s", VES1893REG[cmd[1]]);
+				else if (len >= 3)
+					printf("WRITE %s", VES1893REG[cmd[1]]);
+				else
+					return;
+			}
+			else
+				return;
+
+			printf(" ");
+		}
+
+		void DumpFP(char c, unsigned char *cmd, size_t len) {
+			printf("fp  %c ", c);
+
+			if ((c != 'W') || (len == 0))
+				return;
+
+			if (cmd[0] == 0) {
+				if (len == 1)
+					printf("READ_FP_CMD");
+				else if (len >= 2) {
+					if (cmd[1] == 0x00)
+						printf("FP_ID");	// ? -> cf. GET_FPID 1D
+					else if (cmd[1] == 0x03)
+						printf("PWROFF");
+					else if (cmd[1] == 0x05) {
+						printf("TUNER");
+						if (len == 6) {
+							sp5668 s(&cmd[2]);
+							s.dump();
+						}
+					}
+					//else if (cmd[1] == 0x0C)
+					//else if (cmd[1] == 0x0D)
+					else if (cmd[1] == 0x18)
+						printf("DISEQC");
+					else if (cmd[1] == 0x1B)
+						printf("DISEQC+MINI_A");
+					else if (cmd[1] == 0x1C)
+						printf("DISEQC+MINI_B");
+					else
+						return;
+				}
+				else
+					return;
+			}
+			else if (cmd[0] == 0x01)
+				printf("GET_REMOTE_EVENT");
+			else if (cmd[0] == 0x03)
+				printf("GET_KEYBOARD_EVENT");
+			else if (cmd[0] == 0x05)
+				printf("GET_MOUSE_EVENT");
+			else if (cmd[0] == 0x11)
+				printf("WAKEUP");
+			//else if (cmd[0] == 0x14) // init #4	val 29
+			//else if (cmd[0] == 0x15) // init #5	val 23
+			//else if (cmd[0] == 0x17) // init #6	val 00
+			else if (cmd[0] == 0x18)
+				printf("LCDDIM");
+			//else if (cmd[0] == 0x19) // init #2	val 04
+			else if (cmd[0] == 0x1D)
+				printf("GET_FPID");	// first read == 5a 00 51, second read == 5a
+			//else if (cmd[0] == 0x1E) // init #3	// get fp sub id / revision	read == 00 51
+			else if (cmd[0] == 0x20)
+				printf("FP_IRQ_STATUS");
+				/*
+				 * 0x01 == IR_REMOTE_OLD
+				 * 0x02 == IR_KEYBOARD
+				 * 0x04 == IR_MOUSE
+				 * 0x08 == IR_REMOTE_NEW
+				 * 0x10 == PANEL_BUTTON
+				 * 0x40 == SEC
+				 */
+			else if (cmd[0] == 0x21) {
+				printf("SEC");
+				if (m_dwDataFollowing == 1)
+					printf(" READ_STATUS");
+				else if (m_dwDataFollowing >= 2) {
+					if (cmd[1] & 0x40)
+						printf(" LNB_POWER");
+					if (cmd[1] & 0x20)
+						printf(" 18V");
+					else
+						printf(" 13V");
+					if (cmd[1] & 0x10)
+						printf(" +1V");
+					if (cmd[1] & 0x01)
+						printf(" 22kHz");
+					else
+						printf(" 0kHz");
+				}
+				else
+					return;
+			}
+			//else if (cmd[0] == 0x22) // init	1st val 40, bf	2nd val be, bf
+			else if (cmd[0] == 0x23)
+				printf("FP_EVENT_QUEUE");
+			else if (cmd[0] == 0x24)
+				printf("SEC_STATUS");
+			else if (cmd[0] == 0x25)
+				printf("GET_BUTTON_EVENT");
+			else if (cmd[0] == 0x26)
+				printf("BREAKCODE");
+			else if (cmd[0] == 0x2D)
+				printf("DISEQC_STATUS");
+			else
+				return;
+
+			printf(" ");
+		}
+
+		void DumpSEC(char c, unsigned char *cmd, size_t len) {
+			printf("cam %c ", c);
+		}
+		
+		void DumpSAA7126(char c, unsigned char *cmd, size_t len) {
+			printf("saa %c ", c);
+		}
+
+		void DumpCXA2092(char c, unsigned char *cmd, size_t len) {
+			printf("avs %c ", c);
+		}
+
 		DWORD Dump(__int64 i64Datum, __int64 i64ClocksPerThousandSeconds) {
+			unsigned char *cmd = ((unsigned char *)this)+sizeof(CI2CEvent);
 			char c='W';
 			DWORD dw=0;
 			if(m_bAdsRwLsb&1) c='r';
@@ -43,7 +238,27 @@
 				}
 			}
 
-			printf("%02X %c ", m_bAdsRwLsb>>1, c);
+			switch (m_bAdsRwLsb>>1) {
+			case 0x08:
+				DumpVES1893(c, cmd, m_dwDataFollowing);
+				break;
+			case 0x30:
+				DumpFP(c, cmd, m_dwDataFollowing);
+				break;
+			case 0x37:
+				DumpSEC(c, cmd, m_dwDataFollowing);
+				break;
+			case 0x44:
+				DumpSAA7126(c, cmd, m_dwDataFollowing);
+				break;
+			case 0x48:
+				DumpCXA2092(c, cmd, m_dwDataFollowing);
+				break;
+			default:
+				printf("%02X  %c ", m_bAdsRwLsb>>1, c);
+				break;
+			}
+
 			if(m_fnAcked) { printf(" -nak-"); }
 			if((!m_fAcked) && (!m_fnAcked)) { printf(" -interrupted-"); }
 			while(dw<m_dwDataFollowing) {
