'**************************************************************** '* Name : MITM_RI.BAS * '* Author : Lucas Volwater * '* Notice : Copyright (c) 2010 Lucas Volwater * '* : All Rights Reserved * '* Date : 23-8-2010 * '* Version : 1.0 * '* Notes : Man In The Middle tussen 2 TI rekenmachines * '* : Man In The Middle tussen 2 TI rekenmachines * '**************************************************************** 'Getest met TI84+, zou moeten werken met Ti83, Ti83+ etc. zo lang er maar een 2.5mm link port op zit. 'Tested with Ti 84+, should work with TI 83, TI 83+ etc. as long as it has the 2.5mm link port. 'comments are in Dutch, if realy necessary ask me for a translation. Otherwise use a machine translator an laugh at how it messes up... Device 16F628A Config HS_OSC, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_on Xtal = 20 '4 Mhz was te traag! 20 werkt. Lager misschien ook wel... maar 4 is te laag. Declare Hserial_Baud 4800 ;8n1 All_Digital = true PortB_Pullups = false 'eerst testen zonder pullups, 3,3v bus dus liever geen 5v op zetten Symbol ringgr1in = PORTB.1 Symbol tipgr1in = PORTB.0 Symbol ringgr1out = PORTA.3 Symbol tipgr1out = PORTA.2 Symbol tipgr2in = PORTA.0 Symbol ringgr2in = PORTA.1 Symbol tipgr2out = PORTB.3 Symbol ringgr2out = PORTB.5 Input ringgr1in Input tipgr1in Input tipgr2in Input ringgr2in Output ringgr1out Output tipgr1out Output tipgr2out Output ringgr2out tipgr1out = 0 '0 betekend dat er 5V op staat, ofwel bus inactief als 't op alle lijnen is, zoals hier. ringgr1out = 0 tipgr2out = 0 ringgr2out = 0 Dim timeout As Byte 'telertje wat bijhoudt of er geen transmissiefout is Dim bytegr1 As Byte 'byte ontvangen van 1e TI84+ (of 83+) Dim bytegr2 As Byte 'byte ontvangen van 2e GR Dim bittel1 As Byte 'bitteller voor 1e byte Dim bittel2 As Byte 'bitteller voor 2e byte Dim gr1 As Bit Dim gr2 As Bit Clear HSerOut ["Man In The Middle between two TI Graphing Calculators", 10, 13] HSerOut ["(c)LJPV 2010"] GoTo mainloop fout: 'subroutine voor als we er niet meer uitkomen tipgr1out = 1 'signaal voor de GR dat er wat foutloopt tipgr2out = 1 ringgr1out = 1 ringgr2out = 1 DelayMS 1200 'max bittime: 1s :) Dus dit moet wel gezien worden tipgr1out = 0 'release de bus weer, anders loopt GR vast... tipgr2out = 0 ringgr1out = 0 ringgr2out = 0 Return mainloop: bittel1 = 0 bittel2 = 0 timeout = 0 While tipgr1in = 1 And tipgr2in = 1 And ringgr1in = 1 And ringgr2in = 1: Wend Repeat nextbit: If tipgr1in = 0 Then 'in dat geval stuurt GR1 een 0 tipgr2out = 1 'tip van 2e GR ook laag maken (doorsturen) ringgr1out = 1 'ring van 1e gr laag maken (bevestigen/ ACK) Repeat Until tipgr1in = 1 And ringgr2in = 0 'wacht tot GR1 de ack begrepen heeft en tegelijkertijd tot gr2 het bit geacked heeft tipgr2out = 0 'GR2 heeft het begrepen, release lijn ringgr1out = 0 'GR1 heeft het begrepen, release lijn Repeat Until ringgr2in = 1 'wacht tot gr2 klaar is met acken ClearBit bytegr1,bittel1 'clear het ontvange bit in de buffer Inc bittel1 'volgende keer volgende bit ontvangen timeout = 0 'wat extra tijd regelen GoTo nextbit 'en volgende bit proberen ' voor het volgende bit bovenaan beginnen om te voorkomen dat de GR net toevallig aan de volgende if-then voldoet ' met als gevolg bittel1=24 en bittel2 = 8 fouten... ' alleen krijgen we nu (op 4mhz) timouts. Ofwel: we zijn onheroepelijk te traag. 20 Mhz kristal moet redding brengen. End If If ringgr1in = 0 Then 'dan stuurt GR1 een 1 ringgr2out = 1 'ring van 2e gr ook laag maken (doorsturen) tipgr1out = 1 'tip 1e gr laagmaken (ACK) Repeat Until ringgr1in = 1 And tipgr2in = 0 'wachten tot GR1 de ACK heeft begrepen en tegelijkertijd tot GR2 het bit heeft geacked ringgr2out = 0 ' GR2 heeft het bit geacked, dus stop met sturen tipgr1out = 0 ; GR1 heef de ack begrepen, dus release de lijn Repeat Until tipgr2in = 1 ' wacht tot GR2 klaar is met acken SetBit bytegr1,bittel1 ' sla het bit op Inc bittel1 ' volgende keer volgende bit timeout = 0 'wat extra tijd regelen GoTo nextbit 'en volgende bit proberen End If If tipgr2in = 0 Then ' dan stuurt GR2 een 0 tipgr1out = 1 ' doorsturen ringgr2out = 1 ' acken Repeat Until tipgr2in = 1 And ringgr1in = 0 'wacht tot GR2 de ack begrepen heeft, en gr1 het bit acked tipgr1out = 0 'lijn loslaten ringgr2out = 0 'lijn loslaten Repeat Until ringgr1in = 1 'wacht tot GR1 klaar is met acken ClearBit bytegr2, bittel2 'sla het bit op Inc bittel2 'volgende keer volgende bit timeout = 0 'wat extra tijd regelen GoTo nextbit End If If ringgr2in = 0 Then 'dan stuurt GR2 een 1 (afhandelen gelijkaardig bovenstaanden) ringgr1out = 1 tipgr2out = 1 Repeat Until ringgr2in = 1 And tipgr1in = 0 ringgr1out = 0 tipgr2out = 0 Repeat Until tipgr1in = 1 SetBit bytegr2,bittel2 Inc bittel2 timeout = 0 'wat extra tijd regelen GoTo nextbit End If Inc timeout Until timeout > 254 Or bittel1 = 8 Or bittel2 = 8 If timeout > 254 Then ' als het te lang duurt voor er weer een byte binnen is GoSub fout ' communicatie beindigen HSerOut [10, 13, "TIME OUT"] ' melden in terminal wat er fout ging GoTo mainloop ' en opnieuw beginnen End If If bittel1 = 8 Then ' als er een byte van GR 1 ontvangen is gr2 = 0 'GR1 talkin' now, GR2 better shut up! If bittel2 <> 0 Then ' controleren of er niets is foutgegaan GoSub fout 'ingeval van een fout, communicatie beindigen HSerOut [10, 13, "FOUT: bitteller 1 = ", Dec bittel1, " en bitteller 2 = ", Dec bittel2] 'melden wat er fout ging End If 'en anders If gr1 = 0 Then 'zorgt ervoor dat er 1x GR1 says: voor een regel met bytes van GR1 wordt gezet HSerOut [10, 13, "GR1 says: "] gr1 = 1 End If HSerOut [Hex bytegr1, " "] 'het ontvangen byte naar de terminal gooien, voorafgegaan door de bron End If If bittel2= 8 Then 'zelfde geintje voor GR2 gr1 = 0 'GR2 talkin' now. GR1 better shut up (ok, not all comments are in dutch... The funny ones are not. The helpfull ones still are though...) If bittel1 <> 0 Then GoSub fout HSerOut [10, 13, "FOUT: bitteller 1 = ", Dec bittel1, " en bitteller 2 = ", Dec bittel2] End If If gr2 = 0 Then HSerOut [10, 13, "GR2 says: "] gr2 = 1 End If HSerOut [Hex bytegr2, " "] End If GoTo mainloop 'have another go (Ok, that one is not funny...) End