📄 mifare1.lst
字号:
631 4 longtobuf86(epvalue, cmd+1);
632 4 }
633 3 // success
634 3 cmd[0] = SUCCESS;
635 3 return 5;
636 3 }
637 2 }
638 1
639 1 // 使用philips的命令加减钱包
640 1 else if(cmd[1] == CMD_PINCEP)
641 1 {
642 2 uchar m1bakblock, m1eptype;
643 2
644 2 m1bakblock = m1data[0];
645 2 m1eptype = m1data[1];
646 2 m1data += 2;
647 2 m1block = (m1sector << 2) + m1block;
648 2 m1bakblock = (m1sector << 2) + m1bakblock;
649 2
650 2 if(len != 10)
651 2 {
652 3 cmd[0] = ERRORCMDLEN;
653 3 return 1;
654 3 }
655 2
656 2 // convert data
657 2 if(m1eptype) // msb first ep
658 2 {
659 3 epvalue = buftolong86(m1data);
660 3 longtobuf51(epvalue, m1data);
661 3 }
662 2
663 2 epstatus = M500GetEpStatus(m1block, m1bakblock);
664 2
665 2 // increment
666 2 if(epstatus & 0x01)
667 2 {
668 3 i = M500Increment(m1block, m1data, m1bakblock);
669 3 }
670 2 else if(epstatus & 0x02)
671 2 {
672 3 i = M500Increment(m1bakblock, m1data, m1block);
673 3 }
674 2 else
C51 COMPILER V8.00 MIFARE1 04/23/2009 15:56:16 PAGE 12
675 2 {
676 3 cmd[0] = FAIL;
677 3 cmd[1] = MI_VALERR;
678 3 return 2;
679 3 }
680 2 // either success or fail, i will send the ep value
681 2 if(i != MI_OK)
682 2 {
683 3 cmd[0] = FAIL;
684 3 //cmd[1] = i;
685 3 //CommSend(cmd, 2);
686 3 //break;
687 3 }
688 2 else
689 2 {
690 3 cmd[0] = SUCCESS;
691 3 }
692 2
693 2 i = M500ReadValue(m1block, cmd+1, m1bakblock);
694 2 if(i != MI_OK)
695 2 {
696 3 cmd[0] = FAIL;
697 3 cmd[1] = i;
698 3 return 2;
699 3 }
700 2 else
701 2 {
702 3 // success
703 3 if(m1eptype) // msb first ep
704 3 {
705 4 epvalue = buftolong51(cmd+1);
706 4 longtobuf86(epvalue, cmd+1);
707 4 }
708 3
709 3 return 5;
710 3 }
711 2 }
712 1 else if(cmd[1] == CMD_PDECEP)
713 1 {
714 2 uchar m1bakblock, m1eptype;
715 2
716 2 m1bakblock = m1data[0];
717 2 m1eptype = m1data[1];
718 2 m1data += 2;
719 2 m1block = (m1sector << 2) + m1block;
720 2 m1bakblock = (m1sector << 2) + m1bakblock;
721 2
722 2 if(len != 10)
723 2 {
724 3 cmd[0] = ERRORCMDLEN;
725 3 return 1;
726 3 }
727 2
728 2 // convert data
729 2 if(m1eptype) // msb first ep
730 2 {
731 3 epvalue = buftolong86(m1data);
732 3 longtobuf51(epvalue, m1data);
733 3 }
734 2
735 2 epstatus = M500GetEpStatus(m1block, m1bakblock);
736 2
C51 COMPILER V8.00 MIFARE1 04/23/2009 15:56:16 PAGE 13
737 2 // increment
738 2 if(epstatus & 0x01)
739 2 {
740 3 i = M500Decrement(m1block, m1data, m1bakblock);
741 3 }
742 2 else if(epstatus & 0x02)
743 2 {
744 3 i = M500Decrement(m1bakblock, m1data, m1block); //070207, switch bakblock and block
745 3 }
746 2 else
747 2 {
748 3 cmd[0] = FAIL;
749 3 cmd[1] = MI_VALERR;
750 3 return 2;
751 3 }
752 2 // either success or fail, i will send the ep value
753 2 if(i != MI_OK)
754 2 {
755 3 cmd[0] = FAIL;
756 3 //cmd[1] = i;
757 3 //CommSend(cmd, 2);
758 3 //break;
759 3 }
760 2 else
761 2 {
762 3 cmd[0] = SUCCESS;
763 3 }
764 2
765 2 i = M500ReadValue(m1block, cmd+1, m1bakblock);
766 2 if(i != MI_OK)
767 2 {
768 3 cmd[0] = FAIL;
769 3 cmd[1] = i;
770 3 return 2;
771 3 }
772 2 else
773 2 {
774 3 // success
775 3 if(m1eptype) // msb first ep
776 3 {
777 4 epvalue = buftolong51(cmd+1);
778 4 longtobuf86(epvalue, cmd+1);
779 4 }
780 3
781 3 // cmd[0] = SUCCESS; // see the dec operation
782 3 return 5;
783 3 }
784 2 }
785 1 else if(cmd[1] == CMD_BLOCKCOPY)
786 1 {
787 2 uchar m1bakblock;
788 2
789 2 m1bakblock = m1data[0];
790 2 m1block = (m1sector << 2) + m1block;
791 2 m1bakblock = (m1sector << 2) + m1bakblock;
792 2
793 2 if(len != 5)
794 2 {
795 3 cmd[0] = ERRORCMDLEN;
796 3 return 1;
797 3 }
798 2
C51 COMPILER V8.00 MIFARE1 04/23/2009 15:56:16 PAGE 14
799 2 i = M500Copy(m1block, m1bakblock);
800 2 if(i != MI_OK)
801 2 {
802 3 cmd[0] = FAIL;
803 3 cmd[1] = i;
804 3 return 2;
805 3 }
806 2 else
807 2 {
808 3 cmd[0] = SUCCESS;
809 3 return 1;
810 3 }
811 2 }
812 1
813 1 else
814 1 {
815 2 // error package
816 2 cmd[0] = ERRORCMD;
817 2 return 1;
818 2 }
819 1
820 1 }
821
822 bit M1Search(unsigned char *snr)
823 {
824 1 char atq[2];
825 1 static bit fret = 0;
826 1 unsigned char i;
827 1 static unsigned int starttime = 0;
828 1 static unsigned int hascardtime = 0;
829 1
830 1 if(GetTenTickCount() - starttime <= 50)
831 1 return fret;
832 1
833 1 starttime = GetTenTickCount();
834 1
835 1 for(i=0; i<4; i++)
836 1 {
837 2 if(M500Request(PICC_REQALL /*PICC_REQSTD*/, atq) == MI_OK)
838 2 {
839 3 if(MI_OK == M500Anticoll(snr))
840 3 {
841 4 if(MI_OK == M500Select(snr))
842 4 {
843 5 if(fret == 0)
844 5 {
845 6 if(starttime - hascardtime >= CardConfirmTime)
846 6 fret = 1;
847 6 }
848 5 return fret;
849 5 }
850 4 }
851 3 }
852 2
853 2 #ifdef WATCHDOG
//ResetWDT();
#endif
856 2 }
857 1
858 1 hascardtime = starttime;
859 1 return (fret = 0);
860 1 }
C51 COMPILER V8.00 MIFARE1 04/23/2009 15:56:16 PAGE 15
861
862 long buftolong86(char *buf)
863 {
864 1 char invbuf[4];
865 1
866 1 invbuf[0] = buf[3];
867 1 invbuf[1] = buf[2];
868 1 invbuf[2] = buf[1];
869 1 invbuf[3] = buf[0];
870 1
871 1 return *(long *)invbuf;
872 1 }
873
874 void longtobuf86(long val, char *buf)
875 {
876 1 char *invbuf;
877 1
878 1 invbuf = (char *)&val;
879 1
880 1 buf[0] = invbuf[3];
881 1 buf[1] = invbuf[2];
882 1 buf[2] = invbuf[1];
883 1 buf[3] = invbuf[0];
884 1 }
885
886 long buftolong51(char *buf)
887 {
888 1 return *(long *)buf;
889 1 }
890
891 void longtobuf51(long val, char *buf)
892 {
893 1 memcpy(buf, (char *)&val, 4);
894 1 }
895
896 unsigned char M1Auth(unsigned char keyab, unsigned char *key, unsigned char sec)
897 {
898 1 unsigned char i;
899 1
900 1 if(keyab)
901 1 keyab = PICC_AUTHENT1B;
902 1 else
903 1 keyab = PICC_AUTHENT1A;
904 1
905 1 i = M500Auth(keyab, snr, key, sec);
906 1 if(MI_OK != i)
907 1 {
908 2 return i;
909 2 }
910 1 else
911 1 {
912 2 // search current key in key buffer
913 2 for(i=0; i<m1keycnt; i++)
914 2 {
915 3 if(sec == (m1keystatus[i] & 0x7f))
916 3 break;
917 3 }
918 2
919 2 if(i >= m1keycntmax) // not found and buffer full
920 2 i = 0;
921 2 else if(i >= m1keycnt) // not found and buffer not full
922 2 m1keycnt += 1;
C51 COMPILER V8.00 MIFARE1 04/23/2009 15:56:16 PAGE 16
923 2 // else // found
924 2
925 2 ///////////////////////////////////////////////////////
926 2 memcpy(m1keys[i], key, 6); // store key
927 2 if(PICC_AUTHENT1A == keyab)
928 2 m1keystatus[i] = sec & 0x7f; // key a
929 2 else
930 2 m1keystatus[i] = sec | 0x80; // key b
931 2
932 2 return MI_OK;
933 2 }
934 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 4895 ----
CONSTANT SIZE = 1 ----
XDATA SIZE = 128 61
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = 3 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -