etwas zu prall ..
[my-code/atmel.git] / beginners / season_junior.asm
index 8380e92..6ed66de 100644 (file)
 ;
 ; buffer/parse whole strings and decide whether to send to card or not.
 
-;
+; #######
+; defines
+; #######
+
+; baudrate = clock freq / etu
+; std smartcard etu: 372
+; other smartcards: 625
+.define clock 8000000
+.define clk_h 4000000
+.define etu 625
+.define etu_h 312
+.define baudrate 5 ; UBRR value for 76800 bits/s (8mhz clock)
+
+; sizes
+.define uart_data_len 4
+.define uart_data_len_f 3
+
+; names for registers
+.define tmp r16
+.define bitcount r17
+.define tmp1 r18
+.define tmp2 r19
+.define byte r20
+.define overflow_counter r21
+.define counter_l r22
+.define counter_h r23
+.define state r24
+.define state_m r25
+.define mode r26
+.define counter_l_tmp r27
+.define counter_h_tmp r28
+.define address_h r31
+.define address_l r30
+.define one r1
+.define zero r0
+
+; state
+.define LOW (1<<0)
+.define LOW_F 1
+.define HIGH (1<<1)
+.define HIGH_F 2
+; mode
+.define STUPID (1<<0) ; forward cam <-> card communication
+.define STUPID_F 1
+.define COOL (1<<1) ; send time (clocks) & state via uart
+.define COOL_F 2
+.define ELITE (1<<2) ; create bytes, maybe even whole command arrays
+.define ELITE_F 3
+.define GODLIKE (1<<3) ; filter and mask for commands to card - send rejected via uart only
+.define GODLIKE_F 4
+.define INCREDIBLE_HACK (1<<4) ; destroy all your hardware
+.define INCREDIBLE_HACK_F 5 
+
+; but there is only stupid and cool mode right now %)
+
+
+; #############
+; programm code
+; #############
+
+; ------------------
 ; interrupt vectors:
-;
+; ------------------
 
 ; reset
 rjmp INIT
@@ -70,47 +130,53 @@ reti
 ; analog comparator
 reti
 
-;
+; ------------
 ; init routine
-;
-
-MAIN:
-rjmp MAIN
+; ------------
 
 INIT:
 
 ; set stackpointer
-ldi r16,low(RAMEND)
-out SPL,r16
+ldi tmp,low(RAMEND)
+out SPL,tmp
 
 ; enable interrupts int0,int1
-ldi r16,((1<<INT0)|(1<<INT1))
-out GIMSK,r16
+ldi tmp,((1<<INT0)|(1<<INT1))
+out GIMSK,tmp
 ; int0/1 setup
-ldi r16,((1<<ISC01)|(1<<ISC00)|(1<<ISC10)|(1<<ISC11))
-out MCUCR,r16
+ldi tmp,((1<<ISC01)|(0<<ISC00)|(1<<ISC11)|(0<<ISC10))
+out MCUCR,tmp
 
 ; enable t/c overflow interrupt and icp
-ldi r16,((1<<TOIE1)|(1<<TICIE1))
-out TIMSK,r16
+ldi tmp,((1<<TOIE1)|(1<<TICIE1))
+out TIMSK,tmp
 ; setup t/c and icp
-ldi r16,((1<<CS12)|(1<<CS11)|(1<<CS10)|(1<<ICNC1))
-out TCCR1B,r16
+ldi tmp,((1<<CS12)|(1<<CS11)|(1<<CS10)|(1<<ICNC1)|(0<<ICES1))
+out TCCR1B,tmp
 
 ; configure uart - interrupt enabled when i/o
-ldi r16,3
-out UBRR,r16
+ldi tmp,baudrate
+out UBRR,tmp
 sbi UCR,TXEN
 
-; init bitcounter and overflow counter
-ldi r20,0 ; bitcounter
-ldi r21,0 ; register for constructing the byte
-ldi r22,0 ; overflow counter
-ldi r23,0 ; temp reg
-
-; constant 1 in r1
-ldi r16,1
-mov r1,r16
+; init registers
+ldi bitcounter,0 
+ldi byte,0
+ldi overflow_counter,0
+ldi tmp1,0
+ldi tmp2,0 
+ldi counter_l,0
+ldi counter_h,0
+ldi state,HIGH ; .. as waiting for falling edge of start bit
+ldi state_m,0x03
+ldi mode,(STUPID|COOL)
+ldi counter_l_tmp,0
+ldi counter_h_tmp,0
+ldi address_h,SRAM_START_H
+ldi tmp,1
+mov one,tmp
+ldi tmp,0
+mov zero,tmp
 
 ; enable interrupts (global)
 sei
@@ -118,154 +184,186 @@ sei
 ; jump to mainloop
 rjmp MAIN
 
-;
+; ------------
 ; main routine
-;
+; ------------
 
 MAIN:
 
+; loop and wait for interrupts
 rjmp MAIN
 
-;
-; rec_card routines
-;
+; ----------------
+; rec_card routine
+; ----------------
 
 REC_CARD:
 
-; decide what to do
-sbic PORTD,PD6
-rjmp REC_CARD_HIGH
-rjmp REC_CARD_LOW
-
-REC_CARD_HIGH:
-
 ; save counter
-in r24,ICR1L
-in r25,ICR1H
+In counter_l,ICR1L
+in counter_h,ICR1H
 
-; output high on port to cam
-sbi PORTD,PD3
+; toggle state
+eor state,state_m
 
 ; toggle icp sense
-cbi TCCR1B,ICES1
-;in r16,TCCR1B
-;cbr r16,ICES1
-;out TCCR1B,r16
+rcall TOGGLE_ICP_SENSE
 
-; status tu submit
-ldi r26,1
+; fwd to cam if in stupid mode
+sbrc mode,STUPID_F
+rcall FWD_TO_CAM
 
-; enable uart dre interrupt
-sbi UCR,UDRIE
+; calculate delta clocks if in stupid mode
+sbrc mode,COOL_F
+rcall CALC_DELTA_CLOCK ; -> calc delta, store to counter_l_tmp, counter_h_tmp
 
+; send time and state via uart
+sbrc mode,COOL_F
+rcall PREPARE_UART
+
+; return
 reti
 
-REC_CARD_LOW:
+; ------------------------
+; toggle_icp_sense routine
+; ------------------------
 
-; save counter
-in r27,ICR1L
-in r28,ICR1H
+TOGGLE_ICP_SENSE:
 
-; output low on port to cam
-cbi PORTD,PD3
+; toggle according to state
+in tmp,TCCR1B
+cbi tmp,ICES1
+sbrs state,HIGH ; maybe toggle according to TCCR1B?
+sbi tmp,ICES1
+out TCCR1B,tmp
 
-; toggle icp sense
-sbi TCCR1B,ICES1
+; return 
+ret
+
+; ------------------
+; fwd_to_cam routine
+; ------------------
+
+FWD_TO_CAM:
+
+; disable external interrupt 1 while toggling edge
+in tmp,GIMSK
+cbr tmp,INT1
+out GIMSK,tmp
+
+; output state on port to cam
+in tmp1,PORTD
+sbr tmp1,PD3
+sbrs state,HIGH_F
+cbr tmp1,PD3
+
+; configure as output and push-pull low/high
+sbi DDRD,DDD3
+out PORTD,tmp1;
+
+; reenable external interrupt 1
+cbr tmp,INT1
+out GIMSK,tmp
+
+; return
+ret
+
+; --------------------
+; prepare_uart routine
+; --------------------
 
-; status to submit
-ldi r26,0
+PREPARE_UART:
 
-; enable uart dre interrupt
+; by now just send state and  counter, so there is no data to prepare
+
+; enable uart data register empty interrupt
 sbi UCR,UDRIE
 
-reti
+; return
+ret
 
-;
-; rec_cam routines
-;
+
+; ---------------
+; rec_cam routine
+; ---------------
 
 REC_CAM:
 
-; decide what to do
-sbic PORTD,PD3
-rjmp REC_CAM_HIGH
-rjmp REC_CAM_LOW
+; first thing - pullup on
+cbi DDRD,DDD3
+sbi DDRD,PD3
+
+; save counter
+in counter_l,ICR1L
+in counter_h,ICR1H
 
-REC_CAM_HIGH:
+; toggle state
+eor state,state_m
 
-; output high on port to card
-sbi PORTD,PD6
+; toggle int sense
+rcall TOGGLE_INT_SENSE
 
-; toggle int1 sense
-in r16,MCUCR
-cbr r16,ISC10
-out MCUCR,r16
+HIER FEHLT NOCH VIEL ...
 
+; return
 reti
 
-REC_CAM_LOW:
+; ------------------------
+: toggle_int_sense routine
+; ------------------------
 
-; output low on port to card
-cbi PORTD,PD6
+TOGGLE_INT_SENSE:
 
-; toggle int 1 sense
-in r16,MCUCR
-sbr r16,ISC10
-out MCUCR,r16
+in tmp,MCUCR
+cbr tmp,ISC10
+sbis state,HIGH_F
+sbr tmp,ISC10
+out MCUCR,tmp
 
-reti
+; return
+ret
 
-;
+; -------------------
 ; t1_overflow routine
-;
+; -------------------
 
 T1_OVERFLOW:
 
-add r22,r1 ; inc counter overflow register
+; increment counter overflow
+add overflow_counter,one
 
+; return
 reti
 
-;
+; ---------------
 ; rst_cam routine
-;
+; ---------------
 
 RST_CAM:
 
-; decide what to do
-sbic PORTD,PD2
-rjmp RST_CAM_HIGH
-rjmp RST_CAM_LOW
-
-RST_CAM_HIGH:
+; pull down rst from card
+sbi DDRD,DDD4
+cbi PORTD,PD4
 
-; output high on rst port to card
-sbi PORTD,PD4
+; jump to init
+rjmp INIT
 
-; toggle int0 sense
-in r16,MCUCR
-cbr r16,ISC00
-out MCUCR,r16
+; ----------------
+; uart_out routine
+; ----------------
 
-reti
+UART_OUT:
 
-RST_CAM_LOW:
+; disable uart data register empty interrupt
+cbi UCR,UDRIE
 
-; output low on rst port to cam
-cbi PORTD,PD4
+; init counter
+mov address_l,zero
 
-; toggle int0 sense
-in r16,MCUCR
-sbr r16,ISC00
-out MCUCR,r16
+; send the data
+rcall UART_SEND
 
+; return
 reti
 
-;
-; uart_out routines
-;
-
-UART_OUT:
-
-;
-; hier weiter ...
-;
+.... wahhh ! zzZz