X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=beginners%2Fseason_junior.asm;h=6ed66de55125ee691cdce1a96ba11001988b5cfe;hb=fe1a3b3896f1f119cdde663e02a709531dffc26d;hp=8380e9215d7cdb6d4d04181f0ebe475d109c48e4;hpb=c8b18c7c3560c9de4704291ca764cd1041228380;p=my-code%2Fatmel.git diff --git a/beginners/season_junior.asm b/beginners/season_junior.asm index 8380e92..6ed66de 100644 --- a/beginners/season_junior.asm +++ b/beginners/season_junior.asm @@ -33,9 +33,69 @@ ; ; 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< 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