3 ; author: hackbard@hackdaworld.dyndns.org
9 ; vcc card --- atmel vcc
11 ; rst cam --- atmel int0 (pd2)
12 ; rst card --- atmel (pd4)
16 ; gnd card --- gnd cam --- atmel gnd
17 ; i/o card --- atmel icp (pd6)
18 ; i/o cam --- atmel int1 (pd3)
20 .include "../include/2313def.inc"
24 ; stupid mode only by now. just see what cam/card do and redirect
27 ; next implementation:
29 ; try to read one byte of card/cam communication and output via uart.
30 ; output time information in some way.
34 ; buffer/parse whole strings and decide whether to send to card or not.
40 ; baudrate = clock freq / etu
41 ; std smartcard etu: 372
42 ; other smartcards: 625
47 .define baudrate 5 ; UBRR value for 76800 bits/s (8mhz clock)
55 .define overflow_counter r21
61 .define counter_l_tmp r27
62 .define counter_h_tmp r28
72 .define STUPID (1<<0) ; forward cam <-> card communication
74 .define COOL (1<<1) ; send time (clocks) & state via uart
76 .define ELITE (1<<2) ; create bytes, maybe even whole command arrays
78 .define GODLIKE (1<<3) ; filter and mask for commands to card - send rejected via uart only
80 .define INCREDIBLE_HACK (1<<4) ; destroy all your hardware
81 .define INCREDIBLE_HACK_F 5
83 ; but there is only stupid and cool mode right now %)
103 ; timer/counter capt 1
106 ; timer/counter compare
109 ; timer/counter overflow 1
112 ; timer/counter overflow 0
118 ; uart data register empty
137 ; enable interrupts int0,int1
138 ldi tmp,((1<<INT0)|(1<<INT1))
141 ldi tmp,((1<<ISC01)|(0<<ISC00)|(1<<ISC11)|(0<<ISC10))
144 ; enable t/c overflow interrupt and icp
145 ldi tmp,((1<<TOIE1)|(1<<TICIE1))
148 ldi tmp,((1<<CS12)|(1<<CS11)|(1<<CS10)|(1<<ICNC1)|(0<<ICES1))
151 ; configure uart - interrupt enabled when i/o
159 ldi overflow_counter,0
164 ldi state,HIGH ; .. as waiting for falling edge of start bit
166 ldi mode,(STUPID|COOL)
174 ; enable interrupts (global)
186 ; loop and wait for interrupts
203 rcall TOGGLE_ICP_SENSE
205 ; fwd to cam if in stupid mode
209 ; calculate delta clocks if in stupid mode
211 rcall CALC_DELTA_CLOCK ; -> calc delta, store to counter_l_tmp, counter_h_tmp
213 ; send time and state via uart
215 rcall SEND_TO_UART ; -> prepare date & enable uart dre interrupt (sbi UCR,UDRIE)
220 ; ------------------------
221 ; toggle_icp_sense routine
222 ; ------------------------
226 ; toggle according to state
238 ; output state on port to cam
241 lsl tmp ; as we have to set pd3 (dirty, shorter way?)
243 out PORTD,tmp ; <- hunz: low or high if pd3 bit is set ?
249 ; zzZZzZzZZZ .... hier gehts weiter !!!
264 ; output high on port to card
276 ; output low on port to card
287 ; t1_overflow routine
292 add r22,r1 ; inc counter overflow register
309 ; output high on rst port to card
321 ; output low on rst port to cam