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
33 .equ baudrate = 5 ; UBRR value for 76800 bits/s (8mhz clock)
36 .equ uart_data_len = 4
44 .def overflow_counter = r21
50 .def counter_l_tmp = r27
51 .def counter_h_tmp = r28
61 .equ STUPID = (1<<0) ; forward cam <-> card communication
63 .equ COOL = (1<<1) ; send time (clocks) & state via uart
65 .equ ELITE = (1<<2) ; create bytes, maybe even whole command arrays
67 .equ GODLIKE = (1<<3) ; filter and mask for commands to card - send rejected via uart only
69 .equ INCREDIBLE_HACK = (1<<4) ; destroy all your hardware
70 .equ INCREDIBLE_HACK_F = 5
72 ; but there is only stupid and cool mode right now %)
92 ; timer/counter capt 1
95 ; timer/counter compare
98 ; timer/counter overflow 1
101 ; timer/counter overflow 0
107 ; uart data register empty
122 ; output low on rst to card while init
130 ; enable interrupts int0,int1
131 ldi tmp,((1<<INT0)|(1<<INT1))
134 ldi tmp,((1<<ISC01)|(0<<ISC00)|(1<<ISC11)|(0<<ISC10))
137 ; enable t/c overflow interrupt and icp
138 ldi tmp,((1<<TOIE1)|(1<<TICIE))
141 ldi tmp,((1<<CS12)|(1<<CS11)|(1<<CS10)|(1<<ICNC1)|(0<<ICES1))
144 ; configure uart - interrupt enabled when i/o
149 ; enable pullups on int0, int1, clk, icp io ports
150 ldi tmp,((1<<PD2)|(1<<PD3)|(1<<PD5)|(1<<PD6))
155 ldi overflow_counter,0
158 ldi state,HIGH ; .. as waiting for falling edge of start bit
160 ldi mode,(STUPID|COOL)
167 ; enable interrupts (global)
170 ; output high on rst to card
182 ; loop and wait for interrupts
199 rcall TOGGLE_ICP_SENSE
201 ; fwd to cam if in stupid mode
205 ; calculate delta clocks if in cool mode
207 rcall CALC_DELTA_CLOCK
209 ; send time and state via uart
216 ; ------------------------
217 ; calc_delta_clock routine
218 ; ------------------------
223 mov counter_l_tmp,counter_l
224 mov counter_h_tmp,counter_h
230 ; delta calc on host software by now
235 ; ------------------------
236 ; toggle_icp_sense routine
237 ; ------------------------
241 ; toggle according to state
244 sbrs state,HIGH ; maybe toggle according to TCCR1B?
257 ; disable external interrupt 1 while toggling edge
262 ; output state on port to cam
268 ; configure as output and push-pull low/high
272 ; reenable external interrupt 1
279 ; --------------------
280 ; prepare_uart routine
281 ; --------------------
285 ; write transfer data to sram
289 st Z+,overflow_counter
292 ; enable uart data register empty interrupt
305 ; first thing - pullup on
313 rcall TOGGLE_INT_SENSE
315 ; fwd to card if in stupid mode
319 ; calculate delta clocks if in cool mode
321 rcall CALC_DELTA_CLOCK
326 ; ------------------------
327 ; toggle_int_sense routine
328 ; ------------------------
341 ; -------------------
342 ; fwd_to_card routine
343 ; -------------------
347 ; disable icp interrupt while toggling edge
352 ; output state on port to card
358 ; configure as output and push-pull low/high
362 ; reenable icp interrupt
369 ; -------------------
370 ; t1_overflow routine
371 ; -------------------
375 ; increment counter overflow
376 add overflow_counter,one
387 ; by now just jump to init
396 ; disable uart data register empty interrupt
414 ; read next byte from memmory and transfer via uart
418 ; return if everything was sent
419 cpi tmp,uart_data_len
430 ; wie macht man load mit autoinc richtig?
433 ; read byte from memory and write via uart
437 ; increment counter (maybe needed later)