📄 telecrd1.lst
字号:
MPASM 01.02 Released TELECRD1.ASM 9-16-1994 10:19:21 PAGE 1
ISO 7816 Synchronous Memory Card Emulator
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
0001
0002 TITLE "ISO 7816 Synchronous Memory Card Emulator"
0003 LIST P=PIC16C84, R=HEX
0004 INCLUDE "PICREG.EQU"
0001 ; PIC16Cxx Microcontroller Include File
0002
01FF 0003 PIC54 equ 0x1ff ; PIC16C54 Reset Vector
01FF 0004 PIC55 equ 0x1ff ; PIC16C55 Reset Vector
03FF 0005 PIC56 equ 0x3ff ; PIC16C56 Reset Vector
07FF 0006 PIC57 equ 0x7ff ; PIC16C57 Reset Vector
0000 0007 PIC71 equ 0x000 ; PIC16C71 Reset Vector
0000 0008 PIC84 equ 0x000 ; PIC16C84 Reset Vector
0004 0009 INTVEC equ 0x004 ; PIC16C71/84 Interupt Vector
0010
0000 0011 INDIR equ 0x000 ; Indirect File Reg Address Register
0001 0012 RTCC equ 0x001 ; Real Time Clock Counter
0002 0013 PCL equ 0x002 ; Program Counter Low Byte
0003 0014 STATUS equ 0x003 ; Status Register
0004 0015 FSR equ 0x004 ; File Select Register
0005 0016 PORTA equ 0x005 ; Port A I/O Register
0006 0017 PORTB equ 0x006 ; Port B I/O Register
0007 0018 PORTC equ 0x007 ; Port C I/O Register
0008 0019 ADCON0 equ 0x008 ; PIC16C71 A/D Control Reg 0
0009 0020 ADRES equ 0x009 ; PIC16C71 A/D Converter Result Register
0008 0021 EEDATA equ 0x008 ; PIC16C84 EEPROM Data Register
0009 0022 EEADR equ 0x009 ; PIC16C84 EEPROM Address Register
000A 0023 PCLATH equ 0x00a ; Program Counter High Bits
000B 0024 INTCON equ 0x00b ; Interrupt Control Register
0005 0025 TRISA equ 0x005 ; Port A I/O Direction Register
0006 0026 TRISB equ 0x006 ; Port B I/O Direction Register
0007 0027 TRISC equ 0x007 ; Port C I/O Direction Register
0008 0028 ADCON1 equ 0x008 ; PIC16C71 A/D Control Reg 1
0008 0029 EECON1 equ 0x008 ; PIC16C84 EEPROM Control Reg. 1
0009 0030 EECON2 equ 0x009 ; PIC16C84 EEPROM Control Reg. 2
0001 0031 OPTION equ 0x001 ; Option Register
0032
0007 0033 MSB equ 0x007 ; Most-Significant Bit
0000 0034 LSB equ 0x000 ; Least-Significant Bit
0001 0035 TRUE equ 1
0001 0036 YES equ 1
0000 0037 FALSE equ 0
0000 0038 NO equ 0
0039
0040 ; Status Register (f03) Bits
0041
0000 0042 CARRY equ 0x000 ; Carry Bit
0000 0043 C equ 0x000 ; Carry Bit
0001 0044 DCARRY equ 0x001 ; Digit Carry Bit
0001 0045 DC equ 0x001 ; Digit Carry Bit
0002 0046 Z_BIT equ 0x002 ; Zero Bit
0002 0047 Z equ 0x002 ; Zero Bit
0003 0048 P_DOWN equ 0x003 ; Power Down Bit
0003 0049 PD equ 0x003 ; Power Down Bit
MPASM 01.02 Released TELECRD1.ASM 9-16-1994 10:19:21 PAGE 2
ISO 7816 Synchronous Memory Card Emulator
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
0004 0050 T_OUT equ 0x004 ; Watchdog Time-Out Bit
0004 0051 TO equ 0x004 ; Watchdog Time-Out Bit
0005 0052 RP0 equ 0x005 ; Register Page Select 0
0006 0053 RP1 equ 0x006 ; Register Page Select 1
0007 0054 IRP equ 0x007 ; Indirect Addressing Reg. Page Sel.
0055
0056 ; INTCON Register (f0b) Bits
0057
0000 0058 RBIF equ 0x000 ; RB Port change interrupt flag
0001 0059 INTF equ 0x001 ; INT Interrupt Flag
0002 0060 RTIF equ 0x002 ; RTCC Overflow Interupt Flag
0003 0061 RBIE equ 0x003 ; RB Port Ch. Interupt Enable
0004 0062 INTE equ 0x004 ; INT Interupt Enable
0005 0063 RTIE equ 0x005 ; RTCC Overflow Int. Enable
0006 0064 ADIE equ 0x006 ; PIC16C71 A/D Int. Enable
0006 0065 EEIE equ 0x006 ; PIC16C84 EEPROM Write Int. Enable
0007 0066 GIE equ 0x007 ; Global Interupt Enable
0067
0068 ; OPTION Register (f81) Bits
0069
0000 0070 PS0 equ 0x000 ; Prescaler Bit 0
0001 0071 PS1 equ 0x001 ; Prescaler Bit 1
0002 0072 PS2 equ 0x002 ; Prescaler Bit 2
0003 0073 PSA equ 0x003 ; Prescaler Assignment Bit
0004 0074 RTE equ 0x004 ; RTCC Signal Edge Select
0005 0075 RTS equ 0x005 ; RTCC Signal Source Select
0006 0076 INTEDG equ 0x006 ; Interupt Edge Select
0007 0077 RBPU equ 0x007 ; Port B Pull-up Enable
0078
0079 ; ADCON0 Register (f08) Bits
0080
0000 0081 ADON equ 0x000 ; A/D Converter Power Switch
0001 0082 ADIF equ 0x001 ; A/D Conversion Interupt Flag
0002 0083 ADGO equ 0x002 ; A/D Conversion Start Flag
0003 0084 CHS0 equ 0x003 ; A/D Converter Channel Select 0
0004 0085 CHS1 equ 0x004 ; A/D Converter Channel Select 1
0006 0086 ADCS0 equ 0x006 ; A/D Conversion Clock Select 0
0007 0087 ADCS1 equ 0x007 ; A/D Conversion Clock Select 0
0088
0089 ; ADCON1 Register (f88) Bits
0090
0000 0091 PCFG0 equ 0x000 ; RA0-RA3 Configuration Bit 0
0001 0092 PCFG1 equ 0x001 ; RA0-RA3 Configuration Bit 0
0093
0094 ; EECON1 Register (f88) Bits
0095
0000 0096 RD equ 0x000 ; PIC16C84 EEPROM Read Data Flag
0001 0097 WR equ 0x001 ; PIC16C84 EEPROM Write Data Flag
0002 0098 WREN equ 0x002 ; PIC16C84 EEPROM Write Enable Flag
0003 0099 WRERR equ 0x003 ; PIC16C84 EEPROM Write Error Flag
0004 0100 EEIF equ 0x004 ; PIC16C84 EEPROM Interupt Flag
0101
0102 ; Some useful macros...
MPASM 01.02 Released TELECRD1.ASM 9-16-1994 10:19:21 PAGE 3
ISO 7816 Synchronous Memory Card Emulator
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
0103
0104 PUSH macro
0105 movwf TEMP_W
0106 swapf STATUS,W
0107 movwf TEMP_S
0108 endm
0109
0110 POP macro
0111 swapf TEMP_S,W
0112 movwf STATUS
0113 swapf TEMP_W
0114 swapf TEMP_W,W
0115 endm
0116
0117 END
0004
0005
0006 ; PIC16C84 I/O Pin Assignment List
0007
0000 0008 CRD_CLK equ 0 ; RB0 + RA4 = Card Clock
0000 0009 CRD_DTA equ 0 ; RA0 = Card Data Output
0001 0010 CRD_RST equ 1 ; RB1 = Card Reset, Low-Active
0007 0011 CRD_WE equ 7 ; RB7 = Card Write-Enable, Hi-Active
0012
0013 ; PIC16C84 RAM Register Assignments
0014
000C 0015 CRD_ID equ 0x00c ; Smartcard ID, 12 bytes
0018 0016 FUSCNT equ 0x018 ; Fused units counter
0019 0017 BITCNT equ 0x019 ; Bitcounter
001A 0018 LOOPCNT equ 0x01a ; Loop Counter
001B 0019 EE_FLAG equ 0x01b ; EEPROM Write Flag
001C 0020 TEMP1 equ 0x01c ; Temporary Storage #1
001D 0021 TEMP2 equ 0x01d ; Temporary Storage #2
001E 0022 TEMP3 equ 0x01e ; Temporary Storage #3
001F 0023 TEMP4 equ 0x01f ; Temporary STorage #4
002E 0024 TEMP_W equ 0x02e ; Temporary W Save Address
002F 0025 TEMP_S equ 0x02f ; Temporary STATUS Save Address
0026
0027 org 0x2000 ; Chip ID Data
Warning: Address exceeds maximum range for this processor
Warning: Address exceeds maximum range for this processor
Warning: Address exceeds maximum range for this processor
2000 0042 0042 0042 0028 dw 042,042,042,042
Warning: Address exceeds maximum range for this processor
2003 0042 0028
0029
0030 org 0x2007 ; Configuration Fuses
Warning: Address exceeds maximum range for this processor
2007 0001 0031 dw B'00000001'
0032
0033 org PIC84 ; Reset-vector
0000 2810 0034 goto INIT ; Jump to initialization routine
0035
MPASM 01.02 Released TELECRD1.ASM 9-16-1994 10:19:21 PAGE 4
ISO 7816 Synchronous Memory Card Emulator
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
0036 org INTVEC ; Interupt-vector
0037 push ; Save registers
0004 00AE M movwf TEMP_W
0005 0E03 M swapf STATUS,W
0006 00AF M movwf TEMP_S
0007 204D 0038 call INTMAIN ; Call main interupt routine
0039 pop ; Restore registers
0008 0E2F M swapf TEMP_S,W
0009 0083 M movwf STATUS
000A 0EAE M swapf TEMP_W
000B 0E2E M swapf TEMP_W,W
000C 0009 0040 retfie ; return from interupt & clear flag
0041
0042 org 0x010 ; Start address for init rout.
0010 1683 0043 INIT bsf STATUS,RP0 ; Access register bank 1
0011 0064 0044 clrwdt ; Clear watchdog timer
0012 30E8 0045 movlw B'11101000' ; OPTION reg. settings
0013 0081 0046 movwf OPTION ; Store in OPTION register
0014 30FE 0047 movlw B'11111110' ; Set PORT A Tristate Latches
0015 0085 0048 movwf TRISA ; Store in PORT A tristate register
0016 30FF 0049 movlw B'11111111' ; Set PORT B Tristate Latches
0017 0086 0050 movwf TRISB ; Store in PORT B tristate register
0018 1283 0051 bcf STATUS,RP0 ; Access register bank 0
0019 0181 0052 clrf RTCC ; Clear RTCC
001A 0185 0053 clrf PORTA ; Clear PORTA
001B 0186 0054 clrf PORTB ; Clear PORTB
001C 300C 0055 movlw 0c ; EEPROM Fused Units Counter is at $0c
001D 0089 0056 movwf EEADR ; Store in EEPROM Address Pointer
001E 1683 0057 bsf STATUS,RP0 ; Access register bank 1
001F 1408 0058 bsf EECON1,RD ; Set EECON1 Read Data Flag
0020 1283 0059 bcf STATUS,RP0 ; Access register bank 0
0021 0808 0060 movfw EEDATA ; Read EEPROM fused units counter
0022 0098 0061 movwf FUSCNT ; Store in FUSCNT
0023 300C 0062 movlw 0c ; 12 bytes to copy
0024 009A 0063 movwf LOOPCNT ; Store in LOOPCNT
0025 300C 0064 movlw 0c ; Start storing at $0c in RAM
0026 0084 0065 movwf FSR ; Store in FSR
0027 0189 0066 clrf EEADR ; Start at EEPROM Address 0
0028 0067 EECOPY
0028 0809 0068 movfw EEADR
0029 2092 0069 call CARDID
002A 0080 0070 movwf INDIR ; Store in RAM pointed at by FSR
002B 0A84 0071 incf FSR ; Increase FSR pointer
002C 0A89 0072 incf EEADR ; Increase EEPROM Address Pointer
002D 0B9A 0073 decfsz LOOPCNT,1 ; Decrease LOOPCNT until it's 0
002E 2828 0074 goto EECOPY ; Go and get some more bytes!
002F 1683 0075 bsf STATUS,RP0 ; Access register bank 1
0030 1208 0076 bcf EECON1,EEIF ; Clear EEPROM Write Int. Flag
0031 1108 0077 bcf EECON1,WREN ; EEPROM Write Disable
0032 1283 0078 bcf STATUS,RP0 ; Access register bank 0
0033 3090 0079 movlw B'10010000' ; Enable INT Interupt
MPASM 01.02 Released TELECRD1.ASM 9-16-1994 10:19:21 PAGE 5
ISO 7816 Synchronous Memory Card Emulator
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
0034 008B 0080 movwf INTCON ; Store in INTCON
0081
0035 1683 0082 MAIN bsf STATUS,RP0 ; Access register bank 1
0036 1888 0083 btfsc EECON1,WR ; Check if EEPROM Write Flag Set
0037 2835 0084 goto MAIN ; Skip if EEPROM Write is Completed
0038 1208 0085 bcf EECON1,EEIF ; Reset Write Completion Flag
0039 1108 0086 bcf EECON1,WREN ; EEPROM Write Disable
003A 1283 0087 bcf STATUS,RP0 ; Access register bank 0
003B 1C1B 0088 btfss EE_FLAG,LSB ; Check for EEPROM Write Flag
003C 2835 0089 goto MAIN ; If not set, jump back and wait some more
003D 019B 0090 clrf EE_FLAG ; Clear EEPROM Write Flag
003E 300C 0091 movlw 0c ; Units is stored in byte $0c
003F 0089 0092 movwf EEADR ; Store in EEPROM Address Counter
0040 0818 0093 movfw FUSCNT ; Get fused units counter
0041 0088 0094 movwf EEDATA ; Store in EEDATA
0042 1683 0095 bsf STATUS,RP0 ; Access register bank 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -