;*****************************************groundman *******
; PROGRAMA : texto-pdu.asm
; Funcion : pasar pdu a texto sms
;
;
; Revision : 1.0 7/2/2002 Programa para : PIC16F876
; CPU Clock : 4 MHz Reloj instruccion : 1 MHz = 1 us
; WDT : Deshabilitado Tipo de reloj : XT
; Code Prot : OFF
;**********************************************************
;ESTE PROGRAMA DESCOMPRIME LOS DATOS PDU A FORMATO TEXTO PARA SMS
LIST P=16F876 ;Se indica el modo de procesador
RADIX HEX ;Sistema de numeracion hexadecimal
INCLUDE <P16f876.inc> ;se incluye la definicion de los
;registros internos
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF &_WRT_ENABLE_OFF
ERRORLEVEL -302
KEY_1 EQU 20h
TEMP EQU 21h
TEMP_FSR EQU 22h
CONT EQU 23h
SECTOR_000 MACRO
BCF PCLATH,0
BCF PCLATH,1
ENDM
SECTOR_100 MACRO
BSF PCLATH,0
BCF PCLATH,1
ENDM
SECTOR_200 MACRO
BCF PCLATH,0
BSF PCLATH,1
ENDM
SECTOR_300 MACRO
BSF PCLATH,0
BSF PCLATH,1
ENDM
;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
ORG 0x00 ;Inicio en el Vector de Reset
goto INICIO ;Va a la primera instruccion del programa
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO call TRASPASS
clrf INDF ;borra el byte de fin de tabla
movlw 0x2A ;16 bytes mas abajo de la direccion donde
movwf TEMP_FSR ;hemos metido la tabla
;<<<<zona donde calculamos e introducimos el valor del byte en blanco "byte ocavo">>>>>>>>>>
DESCOMP movlw .5
movwf CONT
movlw .6
addwf TEMP_FSR,F ;situate en el primer Byte
movf TEMP_FSR,W
movwf FSR
movlw .6
addwf FSR,F
movf INDF,W
incf FSR,F
movwf INDF
movlw .7
subwf FSR,F
movf INDF,w
xorlw 0X00 ;termina si no hay mas datos
btfsc STATUS,Z
sleep ;fin del programa,poner aqui a donde queremos que salte o un return
;<<<<<<programa principal,donde se realizan la mayor parte de las instruciones>>>>>>>>>>>>
;<<<<<<<<<<<<<<<<<de rotacion para el calculo de la descompresion>>>>>>>>>>>>>>>>>>>>>>>>>>
movlw .6
movwf TEMP
call REP_IZQ_UP
PROG movf CONT,W
movwf TEMP
call REP_BAJA
movf CONT,W
movwf TEMP
call REP_IZQ_UP
decfsz CONT,F
goto PROG
rlf INDF,F
call REMETE
incf TEMP_FSR,f
incf TEMP_FSR,f
goto DESCOMP
REP_IZQ_UP rlf INDF,F
RPE2 incf FSR,F
rlf INDF,F
decfsz TEMP,F
goto RPE2
return
REP_BAJA decf FSR,F
decfsz TEMP,F
goto REP_BAJA
return
;<<<<<<<<<<<<REMETE UN PASO HACIA LA DERECHA DEL CONJUNTO DE 8 Bytes >>>>>>>>>>>>>>>
REMETE incf FSR,F
bcf STATUS,C
rrf INDF,F
decf FSR,F
bcf STATUS,C
rrf INDF,F
decf FSR,F
bcf STATUS,C
rrf INDF,F
decf FSR,F
bcf STATUS,C
rrf INDF,F
decf FSR,F
bcf STATUS,C
rrf INDF,F
decf FSR,F
bcf STATUS,C
rrf INDF,F
decf FSR,F
bcf STATUS,C
rrf INDF,F
decf FSR,F
bcf STATUS,C
rrf INDF,F
decf FSR,F
return
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<TRASPASO DATOS A LA RAM>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TRASPASS movlw 0x30 ;direccion donde empieza a pasar los datos
movwf FSR
CONTIN call TEXTO
movwf INDF
xorlw 0XFF ;si encuentra este valor,termina de leer.
btfsc STATUS,Z
return
incf KEY_1,F
incf FSR,F
goto CONTIN
;<<<<<<-----------------LISTA DEL TEXTO A CONVERTIR ------------------->>>>>>
;si introducimos muchas cadenas de texto,deveremos tener cuidado de no pasar
;de la direccion 1FF,en tal caso deveremos crear otra tabla ejm.
; org 0x200
;TEXTO2 SECTOR_200
;y luego lo mismo que en la tabla anterior,excepto los datos que queramos introducir
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=================================>>>>>>>>>>>>>>>>>>>
;ademas cada 7 Bytes pondremos un byte con valor 0x00 para que cuando descomprimamos
;los datos este lugar nos sirva para el dato resultante de la descompresion
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
org 0x100
TEXTO SECTOR_100
movf KEY_1,W
addwf PCL,F
retlw 0XE8 ;primer grupo
retlw 0X32
retlw 0X9B
retlw 0XFD
retlw 0X46
retlw 0X97
retlw 0XD9
retlw 0X00 ;fin del grupo
retlw 0XEC ;segundo grupo
retlw 0X37
;aqui no hace falta el valor 00h ya que tenemos espacio de sobra,o almenos aseguraros de que lo hay
retlw 0XFF ;fin de tabla
end