X-Git-Url: https://hackdaworld.org/gitweb/?p=my-code%2Fatmel.git;a=blobdiff_plain;f=beginners%2Fseason_junior.asm;h=9171e7c57128f3289017444e242ce0789a0f557b;hp=703b29fbe203ed2bcd020c27a2e256022968822b;hb=322f236d2088f0ffc8335fa10fd52a7cc2317519;hpb=db9964b83523d6892548d2e55cbfede35c33d473 diff --git a/beginners/season_junior.asm b/beginners/season_junior.asm index 703b29f..9171e7c 100644 --- a/beginners/season_junior.asm +++ b/beginners/season_junior.asm @@ -6,6 +6,7 @@ ; at90s2313 ; setup: +; ; vcc card --- atmel vcc ; vcc cam --- ; rst cam --- atmel int0 (pd2) @@ -19,19 +20,6 @@ .include "../include/2313def.inc" -; functions by now: -; -; stupid mode only by now. just see what cam/card do and redirect -; this to card/cam. -; -; next implementation: -; -; try to read one byte of card/cam communication and output via uart. -; output time information in some way. -; -; future: -; -; buffer/parse whole strings and decide whether to send to card or not. ; ####### ; defines @@ -40,45 +28,52 @@ ; 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) +.equ etu = 625 +.equ etu_h = 312 +.equ baudrate = 8 ; UBRR value for 57600 bits/s (8mhz clock) + +; sizes +.equ uart_data_len = 4 ; 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 one r1 -.define zero r0 +.def tmp = r16 +.def bitcount = r17 +.def tmp1 = r18 +.def tmp2 = r19 +.def byte = r20 +.def overflow_counter = r21 +.def counter_l = r22 +.def counter_h = r23 +.def state = r24 +.def state_m = r25 +.def mode = r26 +.def counter_l_tmp = r27 +.def counter_h_tmp = r28 +.def one = r1 +.def zero = r0 ; state -.define LOW (1<<0) -.define LOW_F 1 -.define HIGH (1<<1) -.define HIGH_F 2 +.equ LOW = (1<<0) +.equ LOW_F = 1 +.equ HIGH = (1<<1) +.equ 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 +.equ STUPID = (1<<0) ; forward cam <-> card communication +.equ STUPID_F = 1 +.equ COOL = (1<<1) ; send time (clocks) & state via uart +.equ COOL_F = 2 +.equ ELITE = (1<<2) ; create bytes, maybe even whole command arrays +.equ ELITE_F = 3 +.equ GODLIKE = (1<<3) ; filter and mask for commands to card - send rejected via uart only +.equ GODLIKE_F = 4 +.equ INCREDIBLE_HACK = (1<<4) ; destroy all your hardware +.equ INCREDIBLE_HACK_F = 5 +; leds +.equ LED_CARD = PB0 +.equ LED_CAM = PB1 +.equ LED_FWD_TO_CAM = PB2 +.equ LED_FWD_TO_CARD = PB3 +.equ LED_OVERFLOW = PB4 ; but there is only stupid and cool mode right now %) @@ -107,7 +102,7 @@ rjmp REC_CARD reti ; timer/counter overflow 1 -rjmp CLK_OVERFLOW +rjmp T1_OVERFLOW ; timer/counter overflow 0 reti @@ -130,19 +125,23 @@ reti INIT: +; output low on rst to card while init +sbi DDRD,DDD4 +cbi PORTD,PD4 + ; set stackpointer ldi tmp,low(RAMEND) out SPL,tmp -; enable interrupts int0,int1 +; enable interrupts int0,int1,sleep ldi tmp,((1< calc delta, store to counter_l_tmp, counter_h_tmp +rcall CALC_DELTA_CLOCK ; send time and state via uart sbrc mode,COOL_F -rcall SEND_TO_UART ; -> prepare date & enable uart dre interrupt (sbi UCR,UDRIE) +rcall PREPARE_UART ; return reti +; ------------------------ +; calc_delta_clock routine +; ------------------------ + +CALC_DELTA_CLOCK: + +.ifdef DEBUG +ldi tmp,0x63 +out UDR,tmp +.endif + +; store counters +mov counter_l_tmp,counter_l +mov counter_h_tmp,counter_h + +; get new ones +in counter_l,ICR1L +in counter_h,ICR1H + +; delta calc on host software by now + +; return +ret + ; ------------------------ ; toggle_icp_sense routine ; ------------------------ TOGGLE_ICP_SENSE: +.ifdef DEBUG +ldi tmp,0x54 +out UDR,tmp +.endif + ; toggle according to state -cbi TCCR1B,ICES1 -sbrs state,HIGH -sbi TCCR1B,ICES1 +in tmp,TCCR1B +cbr tmp,ICES1 +sbrs state,HIGH ; maybe toggle according to TCCR1B? +sbr tmp,ICES1 +out TCCR1B,tmp ; return ret @@ -235,105 +296,244 @@ ret ; fwd_to_cam routine ; ------------------ +FWD_TO_CAM: + +.ifdef DEBUG +ldi tmp,0x66 +out UDR,tmp +.endif + +; activate led +sbi PORTB,LED_FWD_TO_CARD +cbi PORTB,LED_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 -mov tmp,state -andi tmp,HIGH -lsl tmp ; as we have to set pd3 (dirty, shorter way?) +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,tmp ; <- hunz: low or high if pd3 bit is set ? +out PORTD,tmp1; + +; reenable external interrupt 1 +sbr tmp,INT1 +out GIMSK,tmp ; return ret +; -------------------- +; prepare_uart routine +; -------------------- -; zzZZzZzZZZ .... hier gehts weiter !!! +PREPARE_UART: -; -; rec_cam routines -; +.ifdef DEBUG +ldi tmp,0x50 +out UDR,tmp +.endif + +; write transfer data to sram +ldi ZL,0x60 +st Z+,counter_l +st Z+,counter_h +st Z+,overflow_counter +st Z+,state + +; enable uart data register empty interrupt +sbi UCR,UDRIE + +; return +ret + + +; --------------- +; rec_cam routine +; --------------- REC_CAM: -; decide what to do -sbic PORTD,PD3 -rjmp REC_CAM_HIGH -rjmp REC_CAM_LOW +.ifdef DEBUG +ldi tmp,0x72 +out UDR,tmp +.endif -REC_CAM_HIGH: +; first thing - pullup on +cbi DDRD,DDD3 +sbi DDRD,PD3 -; output high on port to card -sbi PORTD,PD6 +; activate led +sbi PORTB,LED_CARD +cbi PORTB,LED_CAM + +; toggle state +eor state,state_m + +; toggle int sense +rcall TOGGLE_INT_SENSE -; toggle int1 sense -in r16,MCUCR -cbr r16,ISC10 -out MCUCR,r16 +; fwd to card if in stupid mode +sbrc mode,STUPID_F +rcall FWD_TO_CARD +; calculate delta clocks if in cool mode +sbrc mode,COOL_F +rcall CALC_DELTA_CLOCK + +; return reti -REC_CAM_LOW: +; ------------------------ +; toggle_int_sense routine +; ------------------------ + +TOGGLE_INT_SENSE: -; output low on port to card -cbi PORTD,PD6 +.ifdef DEBUG +ldi tmp,0x73 +out UDR,tmp +.endif -; toggle int 1 sense -in r16,MCUCR -sbr r16,ISC10 -out MCUCR,r16 +in tmp,MCUCR +cbr tmp,ISC10 +sbrs state,HIGH_F +sbr tmp,ISC10 +out MCUCR,tmp -reti +; return +ret -; +; ------------------- +; fwd_to_card routine +; ------------------- + +FWD_TO_CARD: + +.ifdef DEBUG +ldi tmp,0x46 +out UDR,tmp +.endif + +; activate led +sbi PORTB,LED_FWD_TO_CAM +cbi PORTB,LED_FWD_TO_CARD + +; disable icp interrupt while toggling edge +in tmp,TIMSK +cbr tmp,TICIE +out TIMSK,tmp + +; output state on port to card +in tmp1,PORTD +sbr tmp1,PD6 +sbrs state,HIGH_F +cbr tmp1,PD6 + +; configure as output and push-pull low/high +sbi DDRD,DDD6 +out PORTD,tmp1; + +; reenable icp interrupt +sbr tmp,TICIE +out TIMSK,tmp + +; return +ret + +; ------------------- ; t1_overflow routine -; +; ------------------- T1_OVERFLOW: -add r22,r1 ; inc counter overflow register +.ifdef DEBUG +ldi tmp,0x74 +out UDR,tmp +.endif +; increment counter overflow +add overflow_counter,one + +; toggle led status +mov tmp,overflow_counter +and tmp,one +sbi PORTB,LED_OVERFLOW +sbrs tmp,1 +cbi PORTB,LED_OVERFLOW + +; return reti -; +; --------------- ; rst_cam routine -; +; --------------- RST_CAM: -; decide what to do -sbic PORTD,PD2 -rjmp RST_CAM_HIGH -rjmp RST_CAM_LOW +.ifdef DEBUG +ldi tmp,0x69 +out UDR,tmp +.endif -RST_CAM_HIGH: +; by now just jump to init +rjmp INIT -; output high on rst port to card -sbi PORTD,PD4 +; ---------------- +; uart_out routine +; ---------------- + +UART_OUT: -; toggle int0 sense -in r16,MCUCR -cbr r16,ISC00 -out MCUCR,r16 +; disable uart data register empty interrupt +cbi UCR,UDRIE +; init counter(s) +mov tmp,zero + +; send the data +rcall UART_SEND + +; return reti -RST_CAM_LOW: +; ----------------- +; uart_send routine +; ----------------- -; output low on rst port to cam -cbi PORTD,PD4 +UART_SEND: -; toggle int0 sense -in r16,MCUCR -sbr r16,ISC00 -out MCUCR,r16 +; read next byte from memmory and transfer via uart +sbic USR,UDRE +rcall UART_GS -reti +; return if everything was sent +cpi tmp,uart_data_len +brne UART_SEND +ret -; -; uart_out routines -; +; --------------- +; uart_gs routine +; --------------- -UART_OUT: +UART_GS: +; +; wie macht man load mit autoinc richtig? ; -; hier weiter ... -; + +; read byte from memory and write via uart +ld tmp1,Z+ +out UDR,tmp1 + +; increment counter (maybe needed later) +add tmp,one + +; return +ret