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)
50 .define uart_data_len 4
51 .define uart_data_len_f 3
59 .define overflow_counter r21
65 .define counter_l_tmp r27
66 .define counter_h_tmp r28
78 .define STUPID (1<<0) ; forward cam <-> card communication
80 .define COOL (1<<1) ; send time (clocks) & state via uart
82 .define ELITE (1<<2) ; create bytes, maybe even whole command arrays
84 .define GODLIKE (1<<3) ; filter and mask for commands to card - send rejected via uart only
86 .define INCREDIBLE_HACK (1<<4) ; destroy all your hardware
87 .define INCREDIBLE_HACK_F 5
89 ; but there is only stupid and cool mode right now %)
109 ; timer/counter capt 1
112 ; timer/counter compare
115 ; timer/counter overflow 1
118 ; timer/counter overflow 0
124 ; uart data register empty
143 ; enable interrupts int0,int1
144 ldi tmp,((1<<INT0)|(1<<INT1))
147 ldi tmp,((1<<ISC01)|(0<<ISC00)|(1<<ISC11)|(0<<ISC10))
150 ; enable t/c overflow interrupt and icp
151 ldi tmp,((1<<TOIE1)|(1<<TICIE1))
154 ldi tmp,((1<<CS12)|(1<<CS11)|(1<<CS10)|(1<<ICNC1)|(0<<ICES1))
157 ; configure uart - interrupt enabled when i/o
165 ldi overflow_counter,0
170 ldi state,HIGH ; .. as waiting for falling edge of start bit
172 ldi mode,(STUPID|COOL)
175 ldi address_h,SRAM_START_H
181 ; enable interrupts (global)
193 ; loop and wait for interrupts
210 rcall TOGGLE_ICP_SENSE
212 ; fwd to cam if in stupid mode
216 ; calculate delta clocks if in stupid mode
218 rcall CALC_DELTA_CLOCK ; -> calc delta, store to counter_l_tmp, counter_h_tmp
220 ; send time and state via uart
227 ; ------------------------
228 ; toggle_icp_sense routine
229 ; ------------------------
233 ; toggle according to state
236 sbrs state,HIGH ; maybe toggle according to TCCR1B?
249 ; disable external interrupt 1 while toggling edge
254 ; output state on port to cam
260 ; configure as output and push-pull low/high
264 ; reenable external interrupt 1
271 ; --------------------
272 ; prepare_uart routine
273 ; --------------------
277 ; by now just send state and counter, so there is no data to prepare
279 ; enable uart data register empty interrupt
292 ; first thing - pullup on
304 rcall TOGGLE_INT_SENSE
306 HIER FEHLT NOCH VIEL ...
311 ; ------------------------
312 : toggle_int_sense routine
313 ; ------------------------
326 ; -------------------
327 ; t1_overflow routine
328 ; -------------------
332 ; increment counter overflow
333 add overflow_counter,one
344 ; pull down rst from card
357 ; disable uart data register empty interrupt