Source file: /~heha/basteln/Haus/Telefon/Mithören-ISDN/Firmware.zip/Simulator/isdnsimu.c

/*ISDN-Simulator
  zum Test von ISDN-Sniffer (mv-17)
  Alle D-Bits sind 1!
 */

#include <avr/io.h>
#define LH 1			// Leitung Hören, innere Doppelader, blau
#define LS 2			// Leitung Sprechen, äußere Doppelader, grün
#define BT 4			// Bit-Trigger
#define FT 8			// Frame-Trigger (für Oszilloskop)

#define nobreak
typedef unsigned char uchar;
typedef unsigned short ushort;

static void waitint() {
 uchar c;
 while (!(c=TIFR0));		// warte bit „Interrupt“
 TIFR0=c;
}

register uchar v asm("r2");
register uchar h asm("r4");
register uchar s asm("r5");
register ushort h1 asm("r8");
register ushort s1 asm("r10");
register ushort h2 asm("r12");
register ushort s2 asm("r14");
register uchar d asm("r3");
 
// Bit 7 von h und s ausgeben, v beachten und durchreichen
void outbit(void) {
 waitint();		// warte bit „Interrupt“
 PORTC|=BT;
 
 if (h&0x80) {
  DDRC&=~LH;		// hochohmig (0V)
 }else{
  if (v&LH) v&=~LH;	// Nicht invertieren
  else PINC=LH;		// Standard-AMI-Kodierregel
  DDRC|=LH;		// niederohmig (+ oder -)
 }

 if (s&0x80) {
  DDRC&=~LS;
 }else{
  if (v&LS) v&=~LS;
  else PINC=LS;
  DDRC|=LS;
 }
 h<<=1;			// nächstes Bit
 s<<=1;
 PORTC&=~BT;
}

// 250 µs Info S0 (Ruhe)
void infos0(void) {
 PORTC|=FT;
 waitint();
 DDRC&=~LH;
 DDRC&=~LS;
 PORTC&=~FT;
 uchar c=47;
 do waitint(); while(--c);
}

#define L_S() s=0; if ((PORTC^v)&LS) s=0x80
#define L_H() h=0; if ((PORTC^v)&LH) h=0x80

// 250 µs Info S2 (auf „Hören“), Info S1 (auf "Sprechen")
void infos2(void) {
 v=LH;		// Codeverletzungs-Request beim nächsten 0-Bit	//	Hören	Sprechen
 PORTC|=FT;	h=0;		s=0xCF;		outbit();	//	F=0+	1
 PORTC&=~FT;					outbit();	//	L=0-	1
 v=LH;					 	outbit();	//	B1=0-	0+
						outbit();	//	B1=0+	0-
						outbit();	//	B1=0-	1
						outbit();	//	B1=0+	1
						outbit();	//	B1=0-	1
						outbit();	//	B1=0+	1
				s=0xCF;		outbit();	//	B1=0-	1
						outbit();	//	B1=0+	1
						outbit();	//	E=0-	0+
 						outbit();	//	D=0+	0-
						outbit();	//	A=0-	1
						outbit();	//	FA=0+	1
		h=0x80;				outbit();	//	N=1	1
						outbit();	//	B2=0-	1
				s=0xCF;		outbit();	//	B2=0+	1
						outbit();	//	B2=0-	1
						outbit();	//	B2=0+	0+
						outbit();	//	B2=0-	0-
						outbit();	//	B2=0+	1
						outbit();	//	B2=0-	1
						outbit();	//	B2=0+	1
						outbit();	//	E=0-	1
 				s=0xCF;		outbit();	//	D=0+	1
						outbit();	//	S1=0-	1
						outbit();	//	B1=0+	0+
						outbit();	//	B1=0-	0-
						outbit();	//	B1=0+	1
						outbit();	//	B1=0-	1
						outbit();	//	B1=0+	1
						outbit();	//	B1=0-	1
				s=0xCF;		outbit();	//	B1=0+	1
						outbit();	//	B1=0-	1
						outbit();	//	E=0+	0+
 						outbit();	//	D=0-	0-
						outbit();	//	S2=0+	1
						outbit();	//	B2=0-	1
						outbit();	//	B2=0+	1
						outbit();	//	B2=0-	1
				s=0xCF;		outbit();	//	B2=0+	1
						outbit();	//	B2=0-	1
						outbit();	//	B2=0+	0+
						outbit();	//	B2=0-	0-
						outbit();	//	B2=0+	1
						outbit();	//	E=0-	1
 						outbit();	//	D=0+	1
		L_H();				outbit();	//	L=1	1
}

// Info S4 und S3
void infos4(void) {
 v=LH;		// Codeverletzungs-Request beim nächsten 0-Bit	//	Hören	Sprechen
 PORTC|=FT;	h=0;		s=d; 		outbit();	//	F=0+	D
 PORTC&=~FT;			s=d;		outbit();	//	L=0-	L
 v=LH|LS;	h=h1&0xFF;	s=0;	 	outbit();	//	B1	F=0+
						outbit();	//	B1	L=0-
 v|=LS; 			s=s1&0xFF;	outbit();	//	B1	B1
						outbit();	//	B1	B1
						outbit();	//	B1	B1
						outbit();	//	B1	B1
						outbit();	//	B1	B1
						outbit();	//	B1	B1
		h=d;				outbit();	//	E	B1
 d<<=1;						outbit();	//	D	B1
		h=0xA0;		L_S();		outbit();	//	A=1	L
				s=d;		outbit();	//	FA=0	D
				s=d;		outbit();	//	N=1	L
		h=h2&0xFF;	s=0; 		outbit();	//	B2	FA=0-
						outbit();	//	B2	L=0
				s=s2&0xFF;	outbit();	//	B2	B2
						outbit();	//	B2	B2
						outbit();	//	B2	B2
						outbit();	//	B2	B2
						outbit();	//	B2	B2
						outbit();	//	B2	B2
		h=d;				outbit();	//	E	B2
 d<<=1;						outbit();	//	D	B2
		h=0;		L_S();		outbit();	//	S1=0	L
		h=h1>>8;	s=d;		outbit();	//	B1	D
				s=d;		outbit();	//	B1	L
				s=s1>>8;	outbit();	//	B1	B1
						outbit();	//	B1	B1
						outbit();	//	B1	B1
						outbit();	//	B1	B1
						outbit();	//	B1	B1
						outbit();	//	B1	B1
		h=d;				outbit();	//	E	B1
 d<<=1;						outbit();	//	D	B1
		h=0;		L_S();		outbit();	//	S2=0	L
		h=h2>>8;	s=d;		outbit();	//	B2	D
				s=d;		outbit();	//	B2	L
				s=s2>>8;	outbit();	//	B2	B2
						outbit();	//	B2	B2
						outbit();	//	B2	B2
						outbit();	//	B2	B2
						outbit();	//	B2	B2
						outbit();	//	B2	B2
		h=d;				outbit();	//	E	B2
 d<<=1;						outbit();	//	D	B2
		L_H();		L_S();		outbit();	//	L	L
}

int main() {
// Hören, NT->TE, innere Doppelader
// Sprechen, TE->NT, 2 Bit nacheilend
 MCUCR=0x10;			// keine PullUps für Gleichspannungsfreiheit

 OCR0A=124;
 OCR0B=62;
 TCCR0A=0x02;			// CTC-Mode (0..OCR0A)
 TCCR0B=1;			// Timer0 starten
 DDRC=BT|FT;
 
 h1=0xFFFF;
 s1=0xFFFF;
 h2=0xFFFF;
 s2=0xFFFF;
 
 for(;;) {
  ushort cnt;
  PINC=LS;
  PINC=LH;
  cnt=8000;			// 2 Sekunden
  do infos0(); while(--cnt);
  
  cnt=8000;			// 1 Sekunde
  do infos2(); while(--cnt);
  
  cnt=40000;			// 10 Sekunden
  do {
//   if (!(cnt&0xFF)) s2++;
   d=0xFF;
   infos4(); 
  }while (--cnt);
 }
#if 0 
 bit=0;
 for(;;) {


  bit++;
  switch (bit) {

   case 2: v|=LH|LS; nobreak;
   case 26: h=h1; /*h1++;*/ break;	// Δ = 24
   case 14: h=0x80; break;	// Überrahmen-Bit (immer „1“)
   case 15:
   case 37: h=h2; /*h2--;*/ break;	// Δ = 22!
   case 48: bit=0; v|=LH; break;	// Kodierregel verletzen
   
   case 4: v|=LS; nobreak;
   case 28: s=s1; /*s1++;*/ break;
   case 17:
   case 39: s=s2; /*s2--;*/ break;
   
   case 47: if (PORTC&LH) h=0x80; nobreak;	// Ausgleich für positives F (?)
   case 12:
   case 36:
   case 25:  break;
  }
  
  PORTC&=~BT;			// Laufzeit abschätzen
 }
#endif
}
Detected encoding: UTF-80