;################################################# ################################## ;# 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 __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