6ed66de55125ee691cdce1a96ba11001988b5cfe
[my-code/atmel.git] / beginners / season_junior.asm
1 ; season - junior
2 ;
3 ; author: hackbard@hackdaworld.dyndns.org
4 ;
5
6
7 ; at90s2313
8 ; setup:
9 ; vcc card --- atmel vcc
10 ; vcc cam  --- 
11 ; rst cam  --- atmel int0 (pd2)
12 ; rst card --- atmel (pd4)
13 ; clk card -\ 
14 ;            -  atmel t1 (pd5)
15 ; clk cam  -/
16 ; gnd card --- gnd cam --- atmel gnd
17 ; i/o card --- atmel icp (pd6)
18 ; i/o cam  --- atmel int1 (pd3)
19
20 .include "../include/2313def.inc"
21
22 ; functions by now:
23 ;
24 ; stupid mode only by now. just see what cam/card do and redirect
25 ; this to card/cam.
26 ;
27 ; next implementation:
28
29 ; try to read one byte of card/cam communication and output via uart.
30 ; output time information in some way.
31 ;
32 ; future:
33 ;
34 ; buffer/parse whole strings and decide whether to send to card or not.
35
36 ; #######
37 ; defines
38 ; #######
39
40 ; baudrate = clock freq / etu
41 ; std smartcard etu: 372
42 ; other smartcards: 625
43 .define clock 8000000
44 .define clk_h 4000000
45 .define etu 625
46 .define etu_h 312
47 .define baudrate 5 ; UBRR value for 76800 bits/s (8mhz clock)
48
49 ; sizes
50 .define uart_data_len 4
51 .define uart_data_len_f 3
52
53 ; names for registers
54 .define tmp r16
55 .define bitcount r17
56 .define tmp1 r18
57 .define tmp2 r19
58 .define byte r20
59 .define overflow_counter r21
60 .define counter_l r22
61 .define counter_h r23
62 .define state r24
63 .define state_m r25
64 .define mode r26
65 .define counter_l_tmp r27
66 .define counter_h_tmp r28
67 .define address_h r31
68 .define address_l r30
69 .define one r1
70 .define zero r0
71
72 ; state
73 .define LOW (1<<0)
74 .define LOW_F 1
75 .define HIGH (1<<1)
76 .define HIGH_F 2
77 ; mode
78 .define STUPID (1<<0) ; forward cam <-> card communication
79 .define STUPID_F 1
80 .define COOL (1<<1) ; send time (clocks) & state via uart
81 .define COOL_F 2
82 .define ELITE (1<<2) ; create bytes, maybe even whole command arrays
83 .define ELITE_F 3
84 .define GODLIKE (1<<3) ; filter and mask for commands to card - send rejected via uart only
85 .define GODLIKE_F 4
86 .define INCREDIBLE_HACK (1<<4) ; destroy all your hardware
87 .define INCREDIBLE_HACK_F 5 
88
89 ; but there is only stupid and cool mode right now %)
90
91
92 ; #############
93 ; programm code
94 ; #############
95
96 ; ------------------
97 ; interrupt vectors:
98 ; ------------------
99
100 ; reset
101 rjmp INIT
102
103 ; int0
104 rjmp RST_CAM
105
106 ; int1
107 rjmp REC_CAM
108
109 ; timer/counter capt 1
110 rjmp REC_CARD
111
112 ; timer/counter compare
113 reti
114
115 ; timer/counter overflow 1
116 rjmp CLK_OVERFLOW
117
118 ; timer/counter overflow 0
119 reti
120
121 ; uart rx complete
122 reti
123
124 ; uart data register empty
125 rjmp UART_OUT
126
127 ; uart tx complete
128 reti
129
130 ; analog comparator
131 reti
132
133 ; ------------
134 ; init routine
135 ; ------------
136
137 INIT:
138
139 ; set stackpointer
140 ldi tmp,low(RAMEND)
141 out SPL,tmp
142
143 ; enable interrupts int0,int1
144 ldi tmp,((1<<INT0)|(1<<INT1))
145 out GIMSK,tmp
146 ; int0/1 setup
147 ldi tmp,((1<<ISC01)|(0<<ISC00)|(1<<ISC11)|(0<<ISC10))
148 out MCUCR,tmp
149
150 ; enable t/c overflow interrupt and icp
151 ldi tmp,((1<<TOIE1)|(1<<TICIE1))
152 out TIMSK,tmp
153 ; setup t/c and icp
154 ldi tmp,((1<<CS12)|(1<<CS11)|(1<<CS10)|(1<<ICNC1)|(0<<ICES1))
155 out TCCR1B,tmp
156
157 ; configure uart - interrupt enabled when i/o
158 ldi tmp,baudrate
159 out UBRR,tmp
160 sbi UCR,TXEN
161
162 ; init registers
163 ldi bitcounter,0 
164 ldi byte,0
165 ldi overflow_counter,0
166 ldi tmp1,0
167 ldi tmp2,0 
168 ldi counter_l,0
169 ldi counter_h,0
170 ldi state,HIGH ; .. as waiting for falling edge of start bit
171 ldi state_m,0x03
172 ldi mode,(STUPID|COOL)
173 ldi counter_l_tmp,0
174 ldi counter_h_tmp,0
175 ldi address_h,SRAM_START_H
176 ldi tmp,1
177 mov one,tmp
178 ldi tmp,0
179 mov zero,tmp
180
181 ; enable interrupts (global)
182 sei
183
184 ; jump to mainloop
185 rjmp MAIN
186
187 ; ------------
188 ; main routine
189 ; ------------
190
191 MAIN:
192
193 ; loop and wait for interrupts
194 rjmp MAIN
195
196 ; ----------------
197 ; rec_card routine
198 ; ----------------
199
200 REC_CARD:
201
202 ; save counter
203 In counter_l,ICR1L
204 in counter_h,ICR1H
205
206 ; toggle state
207 eor state,state_m
208
209 ; toggle icp sense
210 rcall TOGGLE_ICP_SENSE
211
212 ; fwd to cam if in stupid mode
213 sbrc mode,STUPID_F
214 rcall FWD_TO_CAM
215
216 ; calculate delta clocks if in stupid mode
217 sbrc mode,COOL_F
218 rcall CALC_DELTA_CLOCK ; -> calc delta, store to counter_l_tmp, counter_h_tmp
219
220 ; send time and state via uart
221 sbrc mode,COOL_F
222 rcall PREPARE_UART
223
224 ; return
225 reti
226
227 ; ------------------------
228 ; toggle_icp_sense routine
229 ; ------------------------
230
231 TOGGLE_ICP_SENSE:
232
233 ; toggle according to state
234 in tmp,TCCR1B
235 cbi tmp,ICES1
236 sbrs state,HIGH ; maybe toggle according to TCCR1B?
237 sbi tmp,ICES1
238 out TCCR1B,tmp
239
240 ; return 
241 ret
242
243 ; ------------------
244 ; fwd_to_cam routine
245 ; ------------------
246
247 FWD_TO_CAM:
248
249 ; disable external interrupt 1 while toggling edge
250 in tmp,GIMSK
251 cbr tmp,INT1
252 out GIMSK,tmp
253
254 ; output state on port to cam
255 in tmp1,PORTD
256 sbr tmp1,PD3
257 sbrs state,HIGH_F
258 cbr tmp1,PD3
259
260 ; configure as output and push-pull low/high
261 sbi DDRD,DDD3
262 out PORTD,tmp1;
263
264 ; reenable external interrupt 1
265 cbr tmp,INT1
266 out GIMSK,tmp
267
268 ; return
269 ret
270
271 ; --------------------
272 ; prepare_uart routine
273 ; --------------------
274
275 PREPARE_UART:
276
277 ; by now just send state and  counter, so there is no data to prepare
278
279 ; enable uart data register empty interrupt
280 sbi UCR,UDRIE
281
282 ; return
283 ret
284
285
286 ; ---------------
287 ; rec_cam routine
288 ; ---------------
289
290 REC_CAM:
291
292 ; first thing - pullup on
293 cbi DDRD,DDD3
294 sbi DDRD,PD3
295
296 ; save counter
297 in counter_l,ICR1L
298 in counter_h,ICR1H
299
300 ; toggle state
301 eor state,state_m
302
303 ; toggle int sense
304 rcall TOGGLE_INT_SENSE
305
306 HIER FEHLT NOCH VIEL ...
307
308 ; return
309 reti
310
311 ; ------------------------
312 : toggle_int_sense routine
313 ; ------------------------
314
315 TOGGLE_INT_SENSE:
316
317 in tmp,MCUCR
318 cbr tmp,ISC10
319 sbis state,HIGH_F
320 sbr tmp,ISC10
321 out MCUCR,tmp
322
323 ; return
324 ret
325
326 ; -------------------
327 ; t1_overflow routine
328 ; -------------------
329
330 T1_OVERFLOW:
331
332 ; increment counter overflow
333 add overflow_counter,one
334
335 ; return
336 reti
337
338 ; ---------------
339 ; rst_cam routine
340 ; ---------------
341
342 RST_CAM:
343
344 ; pull down rst from card
345 sbi DDRD,DDD4
346 cbi PORTD,PD4
347
348 ; jump to init
349 rjmp INIT
350
351 ; ----------------
352 ; uart_out routine
353 ; ----------------
354
355 UART_OUT:
356
357 ; disable uart data register empty interrupt
358 cbi UCR,UDRIE
359
360 ; init counter
361 mov address_l,zero
362
363 ; send the data
364 rcall UART_SEND
365
366 ; return
367 reti
368
369 .... wahhh ! zzZz