; Defines para el uso de la libreria
NXT_TEXT_T EQU 0
NXT_TXTSC_T EQU 1
NXT_TXT_OPT EQU 0
NXT_BCO_OPT EQU 1
NXT_PCO_OPT EQU 2
NXT_FNT_OPT EQU 3
; Vars para la libreria
CBLOCK 0x20
NXT_TIPO
NXT_NUMBER
NXT_OPTION
NumH ; Binary a BCD
NumL
TenK ; BCD Result
Thou
Hund
Tens
Ones
TMP ; Temporal
ENDC
;Comienzo de programa
;Vector de reset
ORG 0x00
GOTO INICIO
;Vector de interrupcion
ORG 0x04
RETURN
TIPO_TABLA:
ADDWF PCL, F
RETLW 't'
RETLW 'g'
OBTENER_OPT:
ADDWF PCL, F
TXT_OPT_TXT: DT "txt",0x00
TXT_OPT_BCO: DT "bco",0x00
TXT_OPT_PCO: DT "pco",0x00
TXT_OPT_FNT: DT "fnt",0x00
OPT_TABLA:
ADDWF PCL, F
RETLW TXT_OPT_TXT - TXT_OPT_TXT
RETLW TXT_OPT_BCO - TXT_OPT_TXT
RETLW TXT_OPT_PCO - TXT_OPT_TXT
RETLW TXT_OPT_FNT - TXT_OPT_TXT
OPT_STRING:
;MOVLW 02H
;MOVWF PCLATH
MOVF NXT_OPTION, W
CALL OPT_TABLA
MOVWF TMP
OPT_STRING_1:
MOVF TMP, W
CALL OBTENER_OPT
ADDLW 0
BTFSC STATUS, Z
GOTO OPT_STRING_2
CALL ENVIAR_CHAR
INCF TMP, F
GOTO OPT_STRING_1
OPT_STRING_2:
RETURN
INICIO:
CLRF NXT_TIPO
CLRF NXT_NUMBER
CLRF NXT_OPTION
CLRF NumH
CLRF NumL
CLRF TenK
CLRF Thou
CLRF Hund
CLRF Tens
CLRF Ones
PRINCIPAL:
MOVLW NXT_TEXT_T
MOVWF NXT_TIPO
MOVLW .12
MOVWF NXT_NUMBER
MOVLW NXT_PCO_OPT
MOVWF NXT_OPTION
CALL NXT_ENVIAR_INICIO
CALL NXT_ENVIAR_MENSAJE
CALL NXT_ENVIAR_FINAL
GOTO PRINCIPAL
NXT_ENVIAR_INICIO:
MOVF NXT_TIPO, W ; Envio el tipo
CALL TIPO_TABLA
CALL ENVIAR_CHAR
CLRF NumH
MOVF NXT_NUMBER, W
MOVWF NumL
CALL BIN_BCD
CALL ENVIAR_NUMERO ; Envio el numero
MOVLW '.'
CALL ENVIAR_CHAR ; Envio el .
CALL OPT_STRING ; Envio la opcion
MOVLW '='
CALL ENVIAR_CHAR ; Envio el IGUAL
RETURN
NXT_ENVIAR_FINAL:
MOVLW 0xFF
CALL ENVIAR_CHAR ; Envio el final
MOVLW 0xFF
CALL ENVIAR_CHAR
MOVLW 0xFF
CALL ENVIAR_CHAR
RETURN
ENVIAR_CHAR:
;Aca enviar por UART.
RETURN
ENVIAR_NUMERO:
MOVLW 6
MOVWF TMP
MOVLW TenK
MOVWF FSR
ENVIAR_NUMERO_1:
DECF TMP, F
BTFSC STATUS, Z
RETURN
MOVF INDF, W
BTFSC STATUS, Z
GOTO ENVIAR_NUMERO_2
ADDLW '0'
CALL ENVIAR_CHAR
ENVIAR_NUMERO_2:
INCF FSR, F
GOTO ENVIAR_NUMERO_1
NXT_ENVIAR_MENSAJE:
RETURN
;Takes hex number in NumH:NumL Returns decimal in ;TenK:Thou:Hund:Tens:Ones
;written by John Payson
;input
;=A3*163 + A2*162 + A1*161 + A0*160
;=A3*4096 + A2*256 + A1*16 + A0
BIN_BCD:
swapf NumH,w ;w = A2*16+A3
andlw 0x0F ;w = A3 *** PERSONALLY, I'D REPLACE THESE 2
addlw 0xF0 ;w = A3-16 *** LINES WITH "IORLW b'11110000B' " -AW
movwf Thou ;B3 = A3-16
addwf Thou,f ;B3 = 2*(A3-16) = 2A3 - 32
addlw .226 ;w = A3-16 - 30 = A3-46
movwf Hund ;B2 = A3-46
addlw .50 ;w = A3-46 + 50 = A3+4
movwf Ones ;B0 = A3+4
movf NumH,w ;w = A3*16+A2
andlw 0x0F ;w = A2
addwf Hund,f ;B2 = A3-46 + A2 = A3+A2-46
addwf Hund,f ;B2 = A3+A2-46 + A2 = A3+2A2-46
addwf Ones,f ;B0 = A3+4 + A2 = A3+A2+4
addlw .233 ;w = A2 - 23
movwf Tens ;B1 = A2-23
addwf Tens,f ;B1 = 2*(A2-23)
addwf Tens,f ;B1 = 3*(A2-23) = 3A2-69 (Doh! thanks NG)
swapf NumL,w ;w = A0*16+A1
andlw 0x0F ;w = A1
addwf Tens,f ;B1 = 3A2-69 + A1 = 3A2+A1-69 range -69...-9
addwf Ones,f ;B0 = A3+A2+4 + A1 = A3+A2+A1+4 and Carry = 0 (thanks NG)
rlf Tens,f ;B1 = 2*(3A2+A1-69) + C = 6A2+2A1-138 and Carry is now 1 as tens register had to be negitive
rlf Ones,f ;B0 = 2*(A3+A2+A1+4) + C = 2A3+2A2+2A1+9 (+9 not +8 due to the carry from prev line, Thanks NG)
comf Ones,f ;B0 = ~(2A3+2A2+2A1+9) = -2A3-2A2-2A1-10 (ones complement plus 1 is twos complement. Thanks SD)
;;Nikolai Golovchenko [golovchenko at MAIL.RU] says: comf can be regarded like:
;; comf Ones, f
;; incf Ones, f
;; decf Ones, f
;;First two instructions make up negation. So,
;;Ones = -1 * Ones - 1
;; = - 2 * (A3 + A2 + A1) - 9 - 1
;; = - 2 * (A3 + A2 + A1) - 10
rlf Ones,f ;B0 = 2*(-2A3-2A2-2A1-10) = -4A3-4A2-4A1-20
movf NumL,w ;w = A1*16+A0
andlw 0x0F ;w = A0
addwf Ones,f ;B0 = -4A3-4A2-4A1-20 + A0 = A0-4(A3+A2+A1)-20 range -215...-5 Carry=0
rlf Thou,f ;B3 = 2*(2A3 - 32) = 4A3 - 64
movlw 0x07 ;w = 7
movwf TenK ;B4 = 7
;B0 = A0-4(A3+A2+A1)-20 ;-5...-200
;B1 = 6A2+2A1-138 ;-18...-138
;B2 = A3+2A2-46 ;-1...-46
;B3 = 4A3-64 ;-4...-64
;B4 = 7 ;7
; At this point, the original number is
; equal to TenK*10000+Thou*1000+Hund*100+Tens*10+Ones
; if those entities are regarded as two's compliment
; binary. To be precise, all of them are negative
; except TenK. Now the number needs to be normal-
; ized, but this can all be done with simple byte
; arithmetic.
movlw .10 ;w = 10
Lb1: ;do
addwf Ones,f ; B0 += 10
decf Tens,f ; B1 -= 1
btfss 3,0
;skip no carry
goto Lb1 ; while B0 < 0
;jmp carry
Lb2: ;do
addwf Tens,f ; B1 += 10
decf Hund,f ; B2 -= 1
btfss 3,0
goto Lb2 ; while B1 < 0
Lb3: ;do
addwf Hund,f ; B2 += 10
decf Thou,f ; B3 -= 1
btfss 3,0
goto Lb3 ; while B2 < 0
Lb4: ;do
addwf Thou,f ; B3 += 10
decf TenK,f ; B4 -= 1
btfss 3,0
goto Lb4 ; while B3 < 0
retlw 0
END