Código:
;###################################################################################
;# Emulador de Tarjetas SLE4436 (T3G) v1.2 #
;# Diseñado Por: JMB4U (www.bruah.es.vg) #
;# Hardware: DIL o SMD (Preferiblemente Diodo) #
;# Pulsador: Entre Pata 17 y Vcc (Patas 17>-<4) #
;# Resistencia Pulsador: de 4k7 a 47K Entre Pata 17 y GND (Patas 17>-<5) #
;# Resistencia Oscilacion: (Si es tipo "A" debe de llevar un Condesador de 100nF) #
;# en un -04: Entre 8K2 y 18K #
;# en un -10: Entre 6K8 y 18K #
;# en un -20: Entre 4K7 y 18K #
;# Disclaimer: Para uso educativo y NO lucrativo, no me responsabilizo del mal #
;# Uso que se le pueda dar ya que es DELITO usarlo en una Cabina. #
;# LammerInfo: Este ASM Sólo puede ser descargado desde: http://www.bruah.es.vg/ #
;###################################################################################
LIST P=PIC16F84
#INCLUDE <P16F84.INC>
__CONFIG _CP_ON & _WDT_OFF & _RC_OSC
; Definicion de Macros para mayor Comodidad
#define BANK1 BSF STATUS, RP0 ; Macro BANCO 1
#define BANK0 BCF STATUS, RP0 ; Macro BANCO 0
#define RST PORTB, 0
#define IO PORTA, 4
#define CLK PORTB, 7
; Variables en RAM
BitCounter EQU 0x0C ; Contador de Bits en el BYTE
#define WRITED 0x0D,1 ; Bit Activo Si Se Puede Borrar
BACKUP EQU 0x0E ; Para Guardar Temporalmente EEDATA
CCounter EQU 0x0F
BYTE3 EQU 0x10
BYTE4 EQU 0x11
BYTE5 EQU 0x12
BYTE6 EQU 0x13
BYTE EQU 0x14
BYTEN EQU 0x15
BitCounter2 EQU 0x16
C0 EQU 0X17 ; Byte 0 Del Challenge
C1 EQU 0X18 ; Byte 1 Del Challenge
C2 EQU 0X19 ; Byte 2 Del Challenge
C3 EQU 0X1A ; Byte 3 Del Challenge
C4 EQU 0X1B ; Byte 4 Del Challenge
C5 EQU 0X1C ; Byte 5 Del Challenge
R0 EQU 0X1D ; Byte 0 Del Response
R1 EQU 0X1E ; Byte 1 Del Response
;*********************************************************************************
ORG 0x2100 ; MAPA EEPROM
DE 0xEC, 0x3C, 0x33, 0x0F ;
DE 0x3A, 0xBB, 0xCC, 0xD0 ; A,BB,CC,D=Numero De Serie
DE 0x00, 0x01, 0x01, 0x07, 0x00 ; Ábaco 6 €
DE 0xFE ; Byte 13, Activacion del C/R
DE 0x00, 0x00 ; Authentication key 1
DE 0xFF, 0xFF, 0xFF, 0xFF
DE 0xFF, 0xFF, 0xFF, 0xFF
DE 0xFF, 0xFF, 0xFF, 0xFF
DE 0xFF, 0xFF, 0xFF, 0xFF
DE 0xFF, 0xFF, 0xFF, 0xFF
DE 0xFF, 0xFF, 0xFF, 0xFF
DE 0xFF, 0xFF, 0xFF, 0xFF ; Authentication key 2
DE 0xFF, 0xFF, 0xFF, 0xFF ; Authentication key 2
DE 0xFF, 0xFF, 0xFF, 0xFF
DE 0xFF, 0xFF, 0xFF, 0xFF
DE 0xFF, 0xFF, 0xFF, 0xFF
;*********************************************************************************
ORG 0x00 ; Vector de MCLR, VCC=1
BTFSS PORTA,0
GOTO INICIO
GOTO RECARGA
;*********************************************************************************
ORG 0x04 ; Vector de interrupcion
;*********************************************************************************
; Vector de Interrupcion, Se Detecta si es RESET, WRITE o Writecarry
;*********************************************************************************
INT BTFSC CLK ; Detecta si CLK es 1 para RST
GOTO RESET ; Si Lo es, Produce RESET
BTFSC RST ; No Hay Reset, puede ser borrado o Writecarry
GOTO INT ; Ni RESET ni WRITE ni Writecarry, keep Waiting...
BTFSC EEDATA,7 ;
BSF IO ; Si RESET=0, Saca el Ultimo BIT Usado
BTFSS WRITED ; Si WRITED es 1 se prudujo un borrado antes
GOTO WRITE ; por lo que pasara a hacer Writecarry
GOTO WCARRY
;*********************************************************************************
; Reset General De La Tarjeta (MCLR), Configuracion del Puertos
;*********************************************************************************
INICIO BANK1
BCF TRISA,4 ; RA4 salida, PORTB entradas
BANK0
MOVLW 0x88 ; Direccionamiento indirecto de EECON1
MOVWF FSR
;*********************************************************************************
; Reset del Contador de Direcciones
;*********************************************************************************
RESET ;BTFSC CLK ; Deberia Esperar a Que Baje CLK...
;GOTO $-1 ; ---------
; _____| |__________ RST
; ------
; ___________| |_______ CLK
; Pero Como Asi Tambien Se Reseta, Pos da igual...
CLRF EEADR ; Weno, Seguimos...Se direcciona BYTE0
BSF INDF,0 ; Y Lo leemos
BCF WRITED ; No Se Puede hacer Writecarry (Por Si Acaso...)
MOVLW 0x08
MOVWF BitCounter ; Resetea el contador de bits
Wait_RST
BTFSC RST ; Espera que RST=0
GOTO $-1
MOVLW b'10010000' ; Activa interrupcion para RST (INTE y GIE)
MOVWF INTCON
BSF IO ; 1º bit despues del RST a 1
;*********************************************************************************
; Rutina de Proceso de la Señal de CLOCK
;*********************************************************************************
CLOCK BTFSS CLK ; Espero Pulso para empezar el proceso de CLK
GOTO $-1
BCF WRITED ; Se desabilita la posibilidad de Writecarry
RLF EEDATA,1 ; Rota el siguiente bit a la izquierda
DECFSZ BitCounter,1 ; Quita un contador de bits, si=0 Termina Byte
GOTO CLKoff ; Espera a que Baje CLK
MOVLW 0x08 ; Resetea el contador de bits
MOVWF BitCounter
INCF EEADR,F ; Incrementa el contador de bytes
MOVLW 0x3C ; 60 bytes
SUBWF EEADR,0
BTFSC STATUS,Z ; Comprueba que ha llegado al byte 60
CLRF EEADR ; Puesta a Cero del Contador de Direcciones
BSF INDF,0 ; Lee byte Actual del Puntero
CLKoff BTFSC CLK ; Espera a que CLK=0
GOTO CLKoff
BTFSS EEDATA,7 ; Bit 7 de EEDATA a I/O
BCF IO
BTFSC EEDATA,7
BSF IO
GOTO CLOCK ; Espera el Siguiente Pulso
;*********************************************************************************
; Borrado de un Bit
;*********************************************************************************
WRITE BTFSS CLK ; Espera el pulso de clk para escribir
GOTO $-1
;*********************************************************************************
; Proteccion de las Zona No-Borrables
;*********************************************************************************
PROTEC MOVF EEADR,0
ADDWF PCL,F
GOTO WNULL ; Byte0
GOTO BUCLE ; Byte1
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE ; Byte05
GOTO BUCLE
GOTO BUCLE
GOTO Writeable ; Byte8 4096 u del Ábaco
GOTO Writeable ; Byte12 512 u del Ábaco
GOTO Writeable ; Byte10 64 u del Ábaco
GOTO Writeable ; Byte12 8 u del Ábaco
GOTO Writeable ; Byte12 1 u del Ábaco
GOTO CHALLENGE_TEST ; Byte13 (bit 1 del Byte 13 es Challenge)
GOTO Writeable ; Authentication key 1
GOTO Writeable ; Authentication key 1
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE ; Byte20
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE ; Byte25
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE ; Byte30
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE ; Byte35
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE ; Byte40
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE ; Byte45
GOTO Writeable ; Authentication key 2
GOTO Writeable ; Authentication key 2
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE ; Byte50
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE ; Byte55
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE ; Byte60
Writeable
BTFSS EEDATA,7 ; Comprueba si ya ha sido Borrado el Bit
GOTO WNULL ; De No Ser Asi, Lo Borra
BSF WRITED
BCF IO ; Baja I/O
MOVF EEDATA,0 ; Backup de EEDATA
MOVWF BACKUP
BCF EEDATA,7 ; Pone el Bit a 0 para Evitar Varios Borrados
BSF INDF,0 ; Lee el byte en el que se quedo EEADR
MOVF BitCounter,0 ; Comprobamos que bit fue el ultimo leido
ADDWF BitCounter,0 ; para pasar a ponerlo a 0
ADDWF PCL,1
NOP ; ¿¿Qué numero entero Entre 0 y 8 Al Multiplicarlo por 2
NOP ; Tiene Como Resultado un numero Menor que 2??, NINGUNO!!!
BCF EEDATA,0 ; Bit0
GOTO EndBit
BCF EEDATA,1 ; Bit1
GOTO EndBit
BCF EEDATA,2 ; Bit2
GOTO EndBit
BCF EEDATA,3 ; Bit3
GOTO EndBit
BCF EEDATA,4 ; Bit4
GOTO EndBit
BCF EEDATA,5 ; Bit5
GOTO EndBit
BCF EEDATA,6 ; Bit6
GOTO EndBit
BCF EEDATA,7 ; Bit7
EndBit CALL WEEPROM ; Escribe el Contenido en la EEPROM
Wend MOVF BACKUP,0 ; Restaura el contenido Anterior de EEDATA
MOVWF EEDATA
WNULL BTFSC CLK ; Espera a que Baje CLK
GOTO $-1
MOVLW b'10010000' ; Activa interrupcion para RST (INTE y GIE)
MOVWF INTCON
GOTO CLOCK
CHALLENGE_TEST
MOVF BitCounter,0 ; Comprobamos que bit fue el ultimo leido
ADDWF BitCounter,0 ; Deteccion de Escritura en Bit 110
ADDWF PCL,1
NOP ; ¿¿Qué numero entero Entre 0 y 8 Al Multiplicarlo por 2
NOP ; Tiene Como Resultado un numero Menor que 2??, NINGUNO!!!
GOTO BUCLE
GOTO BUCLE
GOTO Get_Challenge ; Yeah!, A Recibir el Chellenge...
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
GOTO BUCLE
Get_Challenge
MOVLW b'10010000' ; Activa interrupcion para RST (INTE y GIE)
MOVWF INTCON
MOVLW .178 ; 177+1 por motivos de Optimizacion en el Codigo
MOVWF CCounter ; Pone el Contador de Espera de Semilla
CWait BTFSC CLK
GOTO $-1 ; espero a que baje El Clock del Write
CPulse BTFSS CLK
GOTO $-1
DECFSZ CCounter ; espero los 177 Ciclos para el Challenge
GOTO CWait
BANK1 ; Fin De Los 177 Ciclos
BSF TRISA,4 ; RA4 como Entrada
BANK0
MOVLW 0x06
MOVWF BYTEN
rec CLRF BYTE ; Limpia el buffer de Recepcion (BYTE)
MOVLW 0x08 ; Va a Recibir 8 Bits
MOVWF BitCounter2
rnext BTFSS CLK
GOTO $-1
BTFSC CLK
GOTO $-1 ; Espera Pulso de CLK
BCF STATUS,C ; Limpia el flag C (Carry)
BTFSC PORTA,4 ; Mira la linea de recepcion
BSF STATUS,C ; Si esta en alto sube el carry
RLF BYTE,1 ; Rota el buffer de recepcion
DECFSZ BitCounter2,1 ; Decrementa la cant. de Bits a recibir
GOTO rnext ; Si faltan Bits por Recibir Continua
CALL LOCATEBYTE ; Mira que Byte Estamos Tratando
DECFSZ BYTEN,1
GOTO rec
GOTO PROCESS
PROCESS
MOVF C0,0
XORWF C1,0
XORWF C2,0
XORWF C3,0
XORWF C4,0
XORWF C5,0
MOVWF R0
COMF R0,0
MOVWF R1 ; Hago este Proceso por hacer algo, porque aqui
; Es Donde va el Algoritmo que, 'aun' no se conoce
SendResponse ; Envia el Resultado del algoritmo
BANK1
BCF TRISA,4 ; RA4 como sALIDA
BANK0
MOVLW 0x02 ; Va a Enviar 2 Bytes
MOVWF BYTEN
MOVF R0,0
MOVWF BYTE
ssend MOVLW 0x08 ; Va a Enviar 8 Bits
MOVWF BitCounter2
Send BTFSS BYTE,7
GOTO SEND_0
MOVLW .160 ; Se Esperan los 160 Pulsos entre Bit y Bit
MOVWF CCounter
BTFSS CLK
GOTO $-1
BTFSC CLK
GOTO $-1
DECFSZ CCounter
GOTO $-5
BSF PORTA,4
GOTO Next
SEND_0 MOVLW .160
MOVWF CCounter
BTFSS CLK
GOTO $-1
BTFSC CLK
GOTO $-1
DECFSZ CCounter
GOTO $-5
BCF PORTA,4
Next RLF BYTE,1
DECFSZ BitCounter2,1
GOTO Send
MOVF R1,0
MOVWF BYTE
DECFSZ BYTEN,1
GOTO ssend
GOTO CLOCK ; Fin del Envio, Vuelve a estado normal y espera CLK
BUCLE MOVLW b'10010000' ; Activa interrupcion para RST (INTE y GIE)
MOVWF INTCON ; lo unico que saca del BUCLE es RST o Vcc=0
GOTO $-2
;*********************************************************************************
; Rutina Del Transporte de Escritura (Writecarry)
;*********************************************************************************
WCARRY BTFSS CLK ; Espera El Pulso De CLOCK Para
GOTO $-1 ; Comenzar el Proceso de Writecarry
MOVF EEDATA,0
MOVWF BACKUP ; Backup De EEDATA para Cuando Termine
BCF WRITED ; Se deshabilita Writecarry
INCF EEADR,1 ; Incrementa EEADR al siguiente al ultimo
MOVLW 0xFF ; leido y lo pone a FF
MOVWF EEDATA
CALL WEEPROM
DECF EEADR,1 ; Pone EEADR donde estaba
GOTO Wend
;*********************************************************************************
; Rutina De Escritura en EEPROM (Valores En EEDATA y EEADR Previamente)
;*********************************************************************************
WEEPROM BANK1 ; Escritura del Byte Actual en la EEPROM
BSF EECON1,WREN
MOVLW 0x55
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1,WR
BTFSC EECON1,WR ;
GOTO $-1 ; Espero a que Termine...
BCF EECON1,WREN
BANK0
RETURN ; Retorno de la LLamada
LOCATEBYTE
MOVF BYTEN, W ; Ponemos el valor del contador de Bytes de la semilla en W
ADDWF PCL, F ; Sumamos PCL + W y salta a guardar el Byte correspondiente
NOP
GOTO SAVE5
GOTO SAVE4
GOTO SAVE3
GOTO SAVE2
GOTO SAVE1
MOVF BYTE,0
MOVWF C0
RETURN
SAVE5
MOVF BYTE,0
MOVWF C5
RETURN
SAVE1
MOVF BYTE,0
MOVWF C1
RETURN
SAVE2
MOVF BYTE,0
MOVWF C2
RETURN
SAVE3
MOVF BYTE,0
MOVWF C3
RETURN
SAVE4
MOVF BYTE,0
MOVWF C4
RETURN
;*********************************************************************************
; Rutina Principal de Recarga.
;*********************************************************************************
RECARGA
CALL Abaco6E
CALL READSN
INCF BYTE5,1
INCF BYTE6,1
INCF BYTE6,1 ; Incremento del Nuemro de serie
CALL CHANGESN ; Escribe el SN ya incrementado a la EEprom
GOTO JMB4U
;*********************************************************************************
; Rutinas de Escritura en la EEPROM
;*********************************************************************************
Abaco6E
CLRF EEDATA ; Dato del Ábaco 4096 Centimos
MOVLW 0x08 ; Este Byte siempre es 0
MOVWF EEADR ; Escribe el Byte8
CALL WRITEE
MOVLW 0x01
MOVWF EEDATA ; Dato del Ábaco 512 Centimos
INCF EEADR,1 ; Escribe el Byte9
CALL WRITEE
MOVLW 0x01
MOVWF EEDATA ; Dato del Ábaco 64 Centimos
INCF EEADR,1 ; Escribe el Byte10
CALL WRITEE
MOVLW 0x07
MOVWF EEDATA ; Dato del Ábaco 8 Centimos
INCF EEADR,1 ; Escribe el Byte11
CALL WRITEE
CLRF EEDATA ; Dato del Ábaco 1 Centimo
INCF EEADR,1 ; Escribe el Byte10
CALL WRITEE
RETURN
WRITEE BANK1 ; Seleccionamos el banco 1.
RETRY BCF EECON1,WRERR
BSF EECON1,WREN ; Permiso de escritura.
MOVLW 0x55 ; Inicio secuencia de escritura.
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1,WR ; Comienza la escritura.
BTFSC EECON1,WR ; Y espero hasta que se complete
GOTO $-1 ; la escritura.
BTFSC EECON1,WRERR ; Comprobacion de Error
GOTO RETRY ; Joderr!!, Repite la Escritura
BANK0 ; No Hay error, Continua
RETURN
CHANGESN
MOVF BYTE5,0
MOVWF EEDATA ; Escribe El Numero De Serie
MOVLW 0x05
MOVWF EEADR ; Escribe en 05h
CALL WRITEE
MOVF BYTE6,0
MOVWF EEDATA ; Escribe El Numero De Serie LSB
INCF EEADR,1 ; Escribe en 06h
CALL WRITEE
RETURN
READSN MOVLW 0x05 ; Lee El Byte5 y lo almacena en la variable BYTE5
MOVWF EEADR
BANK1
BSF EECON1,RD
BANK0
MOVF EEDATA,0
MOVWF BYTE5
INCF EEADR,1 ; Lee El Byte6 y lo almacena en la variable BYTE6
BANK1
BSF EECON1,RD
BANK0
MOVF EEDATA,0
MOVWF BYTE6
RETURN
JMB4U NOP ; Fin de la Recrga
GOTO JMB4U
END
NOTA: Lo siento por lo extenso del post.
Marcadores