reworked part of the code
[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 ; names for registers
50 .define tmp r16
51 .define bitcount r17
52 .define tmp1 r18
53 .define tmp2 r19
54 .define byte r20
55 .define overflow_counter r21
56 .define counter_l r22
57 .define counter_h r23
58 .define state r24
59 .define state_m r25
60 .define mode r26
61 .define counter_l_tmp r27
62 .define counter_h_tmp r28
63 .define one r1
64 .define zero r0
65
66 ; state
67 .define LOW (1<<0)
68 .define LOW_F 1
69 .define HIGH (1<<1)
70 .define HIGH_F 2
71 ; mode
72 .define STUPID (1<<0) ; forward cam <-> card communication
73 .define STUPID_F 1
74 .define COOL (1<<1) ; send time (clocks) & state via uart
75 .define COOL_F 2
76 .define ELITE (1<<2) ; create bytes, maybe even whole command arrays
77 .define ELITE_F 3
78 .define GODLIKE (1<<3) ; filter and mask for commands to card - send rejected via uart only
79 .define GODLIKE_F 4
80 .define INCREDIBLE_HACK (1<<4) ; destroy all your hardware
81 .define INCREDIBLE_HACK_F 5 
82
83 ; but there is only stupid and cool mode right now %)
84
85
86 ; #############
87 ; programm code
88 ; #############
89
90 ; ------------------
91 ; interrupt vectors:
92 ; ------------------
93
94 ; reset
95 rjmp INIT
96
97 ; int0
98 rjmp RST_CAM
99
100 ; int1
101 rjmp REC_CAM
102
103 ; timer/counter capt 1
104 rjmp REC_CARD
105
106 ; timer/counter compare
107 reti
108
109 ; timer/counter overflow 1
110 rjmp CLK_OVERFLOW
111
112 ; timer/counter overflow 0
113 reti
114
115 ; uart rx complete
116 reti
117
118 ; uart data register empty
119 rjmp UART_OUT
120
121 ; uart tx complete
122 reti
123
124 ; analog comparator
125 reti
126
127 ; ------------
128 ; init routine
129 ; ------------
130
131 INIT:
132
133 ; set stackpointer
134 ldi tmp,low(RAMEND)
135 out SPL,tmp
136
137 ; enable interrupts int0,int1
138 ldi tmp,((1<<INT0)|(1<<INT1))
139 out GIMSK,tmp
140 ; int0/1 setup
141 ldi tmp,((1<<ISC01)|(0<<ISC00)|(1<<ISC11)|(0<<ISC10))
142 out MCUCR,tmp
143
144 ; enable t/c overflow interrupt and icp
145 ldi tmp,((1<<TOIE1)|(1<<TICIE1))
146 out TIMSK,tmp
147 ; setup t/c and icp
148 ldi tmp,((1<<CS12)|(1<<CS11)|(1<<CS10)|(1<<ICNC1)|(0<<ICES1))
149 out TCCR1B,tmp
150
151 ; configure uart - interrupt enabled when i/o
152 ldi tmp,baudrate
153 out UBRR,tmp
154 sbi UCR,TXEN
155
156 ; init registers
157 ldi bitcounter,0 
158 ldi byte,0
159 ldi overflow_counter,0
160 ldi tmp1,0
161 ldi tmp2,0 
162 ldi counter_l,0
163 ldi counter_h,0
164 ldi state,HIGH ; .. as waiting for falling edge of start bit
165 ldi state_m,0x03
166 ldi mode,(STUPID|COOL)
167 ldi counter_l_tmp,0
168 ldi counter_h_tmp,0
169 ldi tmp,1
170 mov one,tmp
171 ldi tmp,0
172 mov zero,tmp
173
174 ; enable interrupts (global)
175 sei
176
177 ; jump to mainloop
178 rjmp MAIN
179
180 ; ------------
181 ; main routine
182 ; ------------
183
184 MAIN:
185
186 ; loop and wait for interrupts
187 rjmp MAIN
188
189 ; ----------------
190 ; rec_card routine
191 ; ----------------
192
193 REC_CARD:
194
195 ; save counter
196 in counter_l,ICR1L
197 in counter_h,ICR1H
198
199 ; toggle state
200 eor state,state_m
201
202 ; toggle icp sense
203 rcall TOGGLE_ICP_SENSE
204
205 ; fwd to cam if in stupid mode
206 sbrc mode,STUPID_F
207 rcall FWD_TO_CAM
208
209 ; calculate delta clocks if in stupid mode
210 sbrc mode,COOL_F
211 rcall CALC_DELTA_CLOCK ; -> calc delta, store to counter_l_tmp, counter_h_tmp
212
213 ; send time and state via uart
214 sbrc mode,COOL_F
215 rcall SEND_TO_UART ; -> prepare date & enable uart dre interrupt (sbi UCR,UDRIE)
216
217 ; return
218 reti
219
220 ; ------------------------
221 ; toggle_icp_sense routine
222 ; ------------------------
223
224 TOGGLE_ICP_SENSE:
225
226 ; toggle according to state
227 cbi TCCR1B,ICES1
228 sbrs state,HIGH
229 sbi TCCR1B,ICES1
230
231 ; return 
232 ret
233
234 ; ------------------
235 ; fwd_to_cam routine
236 ; ------------------
237
238 ; output state on port to cam
239 mov tmp,state
240 andi tmp,HIGH
241 lsl tmp ; as we have to set pd3 (dirty, shorter way?)
242 sbi DDRD,DDD3
243 out PORTD,tmp ; <- hunz: low or high if pd3 bit is set ?
244
245 ; return
246 ret
247
248
249 ; zzZZzZzZZZ .... hier gehts weiter !!!
250
251 ;
252 ; rec_cam routines
253 ;
254
255 REC_CAM:
256
257 ; decide what to do
258 sbic PORTD,PD3
259 rjmp REC_CAM_HIGH
260 rjmp REC_CAM_LOW
261
262 REC_CAM_HIGH:
263
264 ; output high on port to card
265 sbi PORTD,PD6
266
267 ; toggle int1 sense
268 in r16,MCUCR
269 cbr r16,ISC10
270 out MCUCR,r16
271
272 reti
273
274 REC_CAM_LOW:
275
276 ; output low on port to card
277 cbi PORTD,PD6
278
279 ; toggle int 1 sense
280 in r16,MCUCR
281 sbr r16,ISC10
282 out MCUCR,r16
283
284 reti
285
286 ;
287 ; t1_overflow routine
288 ;
289
290 T1_OVERFLOW:
291
292 add r22,r1 ; inc counter overflow register
293
294 reti
295
296 ;
297 ; rst_cam routine
298 ;
299
300 RST_CAM:
301
302 ; decide what to do
303 sbic PORTD,PD2
304 rjmp RST_CAM_HIGH
305 rjmp RST_CAM_LOW
306
307 RST_CAM_HIGH:
308
309 ; output high on rst port to card
310 sbi PORTD,PD4
311
312 ; toggle int0 sense
313 in r16,MCUCR
314 cbr r16,ISC00
315 out MCUCR,r16
316
317 reti
318
319 RST_CAM_LOW:
320
321 ; output low on rst port to cam
322 cbi PORTD,PD4
323
324 ; toggle int0 sense
325 in r16,MCUCR
326 sbr r16,ISC00
327 out MCUCR,r16
328
329 reti
330
331 ;
332 ; uart_out routines
333 ;
334
335 UART_OUT:
336
337 ;
338 ; hier weiter ...
339 ;