const byte card_idle = 0 const byte card_wait_sync = 1 const byte card_wait_b0 = 2 const byte card_wait_b1 = 3 const byte card_wait_b2 = 4 const byte card_wait_b3 = 5 const byte card_wait_parity = 6 var byte card_state = card_idle var byte packed = 0b_0011_0000 var bit b0 at packed : 0 var bit b1 at packed : 1 var bit b2 at packed : 2 var bit b3 at packed : 3 var bit parity procedure do_card is if intcon_rbif then if card_missing_pin then card_state = card_idle q_param = 10 queue_put serial_send else card_state = card_wait_sync end if return end if if card_state == card_idle then return end if if card_state == card_wait_sync then if ! card_not_data_pin then card_state = card_wait_b0 -- FALL THROUGH else return end if end if if card_state == card_wait_b0 then b0 = ! card_not_data_pin card_state = card_wait_b1 return end if if card_state == card_wait_b1 then b1 = ! card_not_data_pin card_state = card_wait_b2 return end if if card_state == card_wait_b2 then b2 = ! card_not_data_pin card_state = card_wait_b3 return end if if card_state == card_wait_b3 then b3 = ! card_not_data_pin card_state = card_wait_parity return end if if card_state == card_wait_parity then parity = ! card_not_data_pin card_state = card_wait_b0 if ( b3 ^ b2 ^ b1 ^ b0 ^ parity ) then q_param = packed queue_put serial_send end if return end if end procedure