3 ; author: hackbard@hackdaworld.dyndns.org
10 ; vcc card --- atmel vcc
12 ; rst cam --- atmel int0 (pd2)
13 ; rst card --- atmel (pd4)
17 ; gnd card --- gnd cam --- atmel gnd
18 ; i/o card --- atmel icp (pd6)
19 ; i/o cam --- atmel int1 (pd3)
21 .include "../include/2313def.inc"
28 ; baudrate = clock freq / etu
29 ; std smartcard etu: 372
30 ; other smartcards: 625
35 .define baudrate 5 ; UBRR value for 76800 bits/s (8mhz clock)
38 .define uart_data_len 4
46 .def overflow_counter = r21
52 .def counter_l_tmp = r27
53 .def counter_h_tmp = r28
65 .define STUPID (1<<0) ; forward cam <-> card communication
67 .define COOL (1<<1) ; send time (clocks) & state via uart
69 .define ELITE (1<<2) ; create bytes, maybe even whole command arrays
71 .define GODLIKE (1<<3) ; filter and mask for commands to card - send rejected via uart only
73 .define INCREDIBLE_HACK (1<<4) ; destroy all your hardware
74 .define INCREDIBLE_HACK_F 5
76 ; but there is only stupid and cool mode right now %)
96 ; timer/counter capt 1
99 ; timer/counter compare
102 ; timer/counter overflow 1
105 ; timer/counter overflow 0
111 ; uart data register empty
126 ; output low on rst to card while init
134 ; enable interrupts int0,int1
135 ldi tmp,((1<<INT0)|(1<<INT1))
138 ldi tmp,((1<<ISC01)|(0<<ISC00)|(1<<ISC11)|(0<<ISC10))
141 ; enable t/c overflow interrupt and icp
142 ldi tmp,((1<<TOIE1)|(1<<TICIE))
145 ldi tmp,((1<<CS12)|(1<<CS11)|(1<<CS10)|(1<<ICNC1)|(0<<ICES1))
148 ; configure uart - interrupt enabled when i/o
153 ; enable pullups on int0, int1, clk, icp io ports
154 ldi tmp,((1<<PD2)|(1<<PD3)|(1<<PD5)|(1<<PD6))
159 ldi overflow_counter,0
162 ldi state,HIGH ; .. as waiting for falling edge of start bit
164 ldi mode,(STUPID|COOL)
171 ; enable interrupts (global)
174 ; output high on rst to card
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 cool mode
211 rcall CALC_DELTA_CLOCK
213 ; send time and state via uart
220 ; ------------------------
221 ; calc_delta_clock routine
222 ; ------------------------
227 mov counter_l_tmp,counter_l
228 mov counter_h_tmp,counter_h
234 ; delta calc on host software by now
239 ; ------------------------
240 ; toggle_icp_sense routine
241 ; ------------------------
245 ; toggle according to state
248 sbrs state,HIGH ; maybe toggle according to TCCR1B?
261 ; disable external interrupt 1 while toggling edge
266 ; output state on port to cam
272 ; configure as output and push-pull low/high
276 ; reenable external interrupt 1
283 ; --------------------
284 ; prepare_uart routine
285 ; --------------------
289 ; write transfer data to sram
291 st address_l+,counter_l
292 st address_l+,counter_h
293 st address_l+,overflow_counter
296 ; enable uart data register empty interrupt
309 ; first thing - pullup on
317 rcall TOGGLE_INT_SENSE
319 ; fwd to card if in stupid mode
323 ; calculate delta clocks if in cool mode
325 rcall CALC_DELTA_CLOCK
330 ; ------------------------
331 ; toggle_int_sense routine
332 ; ------------------------
345 ; -------------------
346 ; fwd_to_card routine
347 ; -------------------
351 ; disable icp interrupt while toggling edge
356 ; output state on port to card
362 ; configure as output and push-pull low/high
366 ; reenable icp interrupt
373 ; -------------------
374 ; t1_overflow routine
375 ; -------------------
379 ; increment counter overflow
380 add overflow_counter,one
391 ; by now just jump to init
400 ; disable uart data register empty interrupt
419 ; read next byte from memmory and transfer via uart
423 ; return if everything was sent
424 cpi tmp,uart_data_len
435 ; wie macht man load mit autoinc richtig?
438 ; read byte from memory and write via uart
442 ; increment counter (maybe needed later)