Felicitaciones por el logro.
Cuando se generan rutinas para sumar, restar, multiplicar o dividir, es mejor trabajarlas directamente en hexadecimal o binario ya que el CP trabaja en base a dos (el ser humano cuenta en base de 10); es por ello que has tenido que restar 100 para saber si hubo acarreo o no.
El número 30.000 (decimal) ocupa dos posiciones de RAM y se expresa como 7530. Esto quiere decir que, si tenemos dos posiciones de RAM llamadas sumandoB y sumandoA, para grabarle el número 30.000, sumandoB tiene que tener grabado 30 y samandoA 75.
Por ejemplo, veamos en distintas anotaciones el contenido de estas dos posiciones de memoria para un valor de 30.000 (en decimal)
HEX BIN DEC
sumandoA 75 01110101 117
sumandoB 30 00110000 48Noten los valores en decimales (11748) que irónicamente, es igual a 30.000; esta "paradoja" ocurre porque el microcontrolador, no es capaz de contar más allá de 255 y hay que usar un truco por software para que logre hacerlo.
Lo bueno de tu rutina, es que puedes guardar los valores en notaciones decimales (en base a 10) y esto evita un posible error y la contra que tiene es que agrega una resta en la suma.
La forma más común de hacer una suma que supere los 255 es de la siguiente manera.
Supongamos 4 posiciones de memorias llamadas sumandoA; sumandoB; resultadoA; resultadoB y haremos 8.447 + 4.097 = 12.544 (en decimal)
8.447 = 20FF (hex); 4.097 = 1001 (hex) y 12.544 = 3100 (hex)
sumandoA = 20
sumandoB = FF
resultadoA = 10
resultadoB = 01
La rutina sería así:
MOVFW sumandoB
ADDWF resultadoB,F ;sumo sumandoB + resultadoB y el resultado de la operación queda guardado en resultadoB
BTFSS STATUS,C ;¿hubo acarrero?
GOTO $+3 ;no hubo acarreo.
MOVLW .1 ;si, hubo acarreo entonces sumo uno a sumandoA (también es válido sumárselo a resultadoA)
ADDWF sumandoA,F
MOVFW sumandoA
ADDWF resultadoA,F ;sumo sumandoA + resultadoA y el resultado de la operación queda guardado en resultadoA
Cuando el CP haga la suma de sumandoB + resultadoB hará lo siguiente FF + 01 = 00 (con acarreo y se lo suma a sumandoA, ahora sumandoA vale 21). Luego sumará 21 + 10 = 31 y como se puede apreciar queda formado la cifra 3100 que es igual a 12.544
La ventaja de trabajar de esta forma, es que directamente trabajas en los números que puede operar el CP, en cambio de la otra manera, tienes que transformar un valor en HEX a decimal.
Espero que se entienda la ventaja de sumar en HEX con respecto en sumar en DEC (decimal), además de quedar un programa/rutina más corto.