You are on page 1of 10

COMENTARIO TCNICO

Buceando en los MCUs Freescale......


Por Ing. Daniel Di Lella Dedicated Field Application Engineer EDUDEVICES www.edudevices.com.ar dilella@arnet.com.ar

Matemtica de Punto Flotante


Por el CETAD UNLP Coordinador Ing. Jose Rapallini Participantes: Sebastin Ledesma e-mail: sledesma@barcala.ing.unlp.edu.ar Federico Costantino, e-mail: fcostant@barcala.ing.unlp.edu.ar Jorge R. Osio, e-mail: josio@gioia.ing.unlp.edu.ar

3era. Parte.
Nota: La presente serie de artculos est basada en el trabajo realizado por el Centro de Tcnicas Analgicas Digitales (CETAD) de la universidad Nacional de La Plata, y constituye una Nota de Aplicacin para los MCUs de 8 Bits de las familias HC908 y HC9S08 de Freescale Semiconductor. Listado de materiales de la placa de prueba. 1 Microcontrolador de la Familia HC908. 1 conversor RS-232. 4 capacitores de 1 uF. 2 capacitores de 0,1 uF. 2 capacitores de 68 pF 1 resitencia de 10 M.

Un cristal de 10 Mhz. 1 conector DB9. 1 fuente de 5 V.

Cdigo Fuente en lenguaje Assembler. El cdigo fuente fue desarrollado en gran parte en base a la informacin provista por el Ing. Gabriel Dubatti en [5]. En las rutinas de suma, resta, multiplicacin y divisin se incluye la subrutina de comunicacin SCI como un archivo INCLUDE.
Subrutina de suma y resta:
$BASE 10T pta ptb DDRB DDRA caracter cuenta_bit aux VAR FLOTA EXPOA FLOTB EXPOB OPERA FLOTR FLOTBX Equ EQU EQU EQU ORG RMB RMB RMB FCB RMB DS RMB DS FCB DS DS ORG clr clrx lda sta lda sta sta lda sta brclr lda sta jsr lda sta jsr lda sta jsr lda sta jsr lda sta bclr jsr lda sta jsr lda sta jsr lda sta jsr lda sta bclr $00 $01 $05 $04 $80 1 1 1 $00 4 1 4 1 0 4 4 $EE00 $80 #$FE DDRB #$01 DDRA ptb ;setea el pin ;entrada y el ;setea el pin ;salida ;pone un 1 en ;y un cero en 0 del Ptb como pin 1 como salida cero del Pta como pin 0 de Ptb los dems ;Nmero B en punto flotante ;0 ES SUMA ;1 ES RESTA ;resultado de la suma ;Auxiliar para la resta

;Nmero A en punto flotante

leedato

#$00 pta 1,pta,leedato 1 OPERA lee_caracter caracter FLOTA lee_caracter caracter FLOTA+1 lee_caracter caracter FLOTA+2 lee_carcter caracter FLOTA+3 0,pta lee_caracter caracter FLOTB lee_caracter caracter FLOTB+1 lee_caracter caracter FLOTB+2 lee_carcter caracter FLOTB+3 0,pta

; si el pin 1 de pta es 0 hay suma ;si es 1 hay una resta ;lee el 1 byte del 1 sumando ; guarda primer byte en FLOTA ; lee segundo byte ; guarda segundo byte en FLOTA+1 ; lee tercer byte ;guarda tercer byte en FLOTA+2 ; lee cuarto byte ;guarda cuarto byte en FLOTA+3 ;lee el 1 byte del 2sumando ;guarda primer byte en FLOTB ; lee segundo byte ; guarda segundo byte en FLOTB+1 ; lee tercer byte ; guarda tercer byte en FLOTB+2 ; lee cuarto byte ; guarda cuarto byte en FLOTB+3

********************************************************************************** ;Parte Inicial: Testeo de casos especiales y obtencin de los ;exponentes ********************************************************************************** MOV MOV MOV MOV LDA SUB BNE LDA ADD STA LDA LDX ROLX ROLA STA BNE LDA AND ADD ADC BCS BNE LDHX JSR JMP ADD BCC LDHX JSR INC LDA AND ADD ADC BCS BNE LDA LDX ROLX ROLA STA BNE LDA AND ADD ADC BCS BNE LDHX JSR JMP ADD BCC LDA AND ADD ADC BCS BNE DEC BNE BRA CASIFIN BRA FLOTB,FLOTBX FLOTB+1,FLOTBX+1 FLOTB+2,FLOTBX+2 FLOTB+3,FLOTBX+3 OPERA #1 AUXILIAR FLOTBX #128 FLOTBX FLOTA ;DE AC PARA ABAJO CAMBIAR FLOTB CON FLOTBX FLOTA+1 ;Tengo en A el expoA EXPOA NORMAL FLOTA+1 #127 FLOTA+2 FLOTA+3 NORMAL NORMAL #FLOTBX COPIAR FIN #1 NOFF #FLOTA COPIAR VAR FLOTA+1 #127 FLOTA+2 FLOTA+3 CASIFIN CASIFIN FLOTBX FLOTBX+1 ;Tengo en A el expoB EXPOB NORMAL2 FLOTBX+1 #127 FLOTBX+2 FLOTBX+3 NORMAL2 NORMAL2 #FLOTA COPIAR FIN #1 NOFF2 FLOTBX+1 #127 FLOTBX+2 FLOTBX+3 COPIARB COPIARB VAR COPIAR NOSALTA FIN ; Salta si no es cero ;Salta si no es cero ;Borro el LSB del exponente

AUXILIAR

; A es cero por lo que la suma ser B ; Si no es cero, A es un nmero ; desnormalizado ; Pruebo si es $FF ; Salta si no hubo carry

NORMAL

;Borro el LSB del exponente

;A es NaN, la suma ser NaN, o sea A ;Si no es cero, a es infinito

NOFF

NORMAL2

; Pruebo si es $FF ; Salta si no hubo carry

; B es NaN ; Si no es cero, b es infinito ;(Tengo que chequear operacin para ver ; si cambio el signo de b) ; Si no salt es porque ambos son infinito ; Estos dos saltos estn porque no ; llego desde ; mas arriba hasta el final.

NOSALTA ERASUMA

LDHX #FLOTA LDA FLOTBX EOR ,X ASLA BCC FIN BSET INC 6,FLOTR+1 VAR

;Si los signos son iguales el resultado ; es infinito ;Si son distintos es QNaN -->busco ; que la mantisa sea distinta de cero

NOFF2

DEC VAR BEQ FIN

;Ya tengo FLOTA en FLOTR, si era infinito ;ese es el resultado --> salgo

********************************************************************************** ;Segunda Parte: preparativos para realizar la suma o la resta ********************************************************************************** LDA EXPOB BNE BUENO LDHX #FLOTBX JSR COPIAR LDA EXPOA BEQ DOSDESN LDA EXPOB LDX EXPOA BEQ NOSE SUB EXPOA BLS MENORIGUAL INCA DECA STA VAR SUB #24 BHS COPIARB LDHX #FLOTA JSR COPIAR LDA EXPOA BEQ NOSET BSET 7,FLOTR+1 CLC JSR DESPLA LDHX #FLOTBX JSR TESTSIG

BUENO

;expB-expA ;expB<=expA

NOSE

;expB>expA ---> veo si la dif es mayor a 23 ;Salta si la resta es menor que cero

NOSET

;Despus de desplazar puedo sumar ;Testeo los signos para ver si son ;diferentes

COPIARB MENORIGUAL

JSR MODEXP BRA FIN LDHX #FLOTBX JSR COPIAR ; Copio FLOTB en FLOTR BRA FIN NEGA STA VAR SUB #24 ;expA>expB -> veo si la dif es mayor a 23 BHS COPIARA LDHX #FLOTBX JSR COPIAR ; Si la diferencia es menor BSET 7,FLOTR+1 LDA VAR BEQ DOSDESN CLC JSR DESPLA ; Despus de desplazar puedo sumar LDHX #FLOTA JSR TESTSIG JSR MODEXP BRA FIN LDHX #FLOTA JSR COPIAR ; Copio FLOTA en FLOTR lda FLOTR ; se enva el resultado de la operacin sta caracter ; por puerto serie. jsr saca_caracter lda FLOTR+1 sta caracter jsr saca_caracter lda FLOTR+2 sta caracter jsr saca_caracter lda FLOTR+3

DOSDESN:

COPIARA: FIN:

sta jsr SWI

caracter saca_caracter

********************************************************************************** ;Subrutinas empleadas en la operacin matemtica ********************************************************************************** COPIAR: MOV MOV MOV MOV RTS LDA ADD STA LDA ADC STA LDA ORA ADC STA X+,FLOTR X+,FLOTR+1 X+,FLOTR+2 X+,FLOTR+3 ;Rutina para copiar

SUMA:

3,X FLOTR+3 FLOTR+3 2,X FLOTR+2 FLOTR+2 1,X #128 FLOTR+1 FLOTR+1

;Rutina de suma y resta

;Ac podra chequear si la resta da cero ;pero como pienso incluir la subrutina de resta ;lo dejo para despus DEC BNE CLC RTS LDA COMA STA LDA COMA STA LDA COMA ADD STA LDA ADC STA LDA ADC STA RTS LDA BEQ ROR ROR ROR CLC DEC BNE RTS CLR LDA EOR ASLA BCC MOV JSR JSR RTS VAR SALE ; Tengo que establecer si fue suma o resta

SALE COMP2:

FLOTR+1 FLOTR+1 FLOTR+2 FLOTR+2 FLOTR+3 #$1 FLOTR+3 FLOTR+2 #$0 FLOTR+2 FLOTR+1 #$0 FLOTR+1 VAR NO FLOTR+1 FLOTR+2 FLOTR+3 VAR DESPLA ;Rutina de complemento a 2

DESPLA:

;Rutina para desplazar mantisa ;La primera no es LSR porque uso la subrutina ;para acomodar el exponente

NO TESTSIG:

VAR FLOTR ,X IGUAL #1,VAR COMP2 SUMA

;Si los signos son iguales hago la suma ;y coloco el signo de uno de los dos ; Si son diferentes hago la resta y el signo ;ser el del mayor exponente

IGUAL

MODEXP:

MOV ROL LDA STA LSL LDA ROLA BCC BSET LSR BCS INCA SUB BEQ ASL ROL ROL BCC BRA ADD BCC CLR CLR CLR DECA LSR RORA STA BRA

#$2,VAR VAR 1,X FLOTR FLOTR ,X POS 1,VAR VAR YA #1 RECUPSIG FLOTR+3 FLOTR+2 FLOTR+1 NUEVO RECUPSIG #2 ETIQUETA FLOTR+1 FLOTR+2 FLOTR+3 VAR FLOTR DESPLA

;Tengo que volver a normalizar el nmero ; y modificar el exponente ; Levanto el byte con el LSB del ; exponente ;Levanto el byte que contiene el resto del exp ;y el signo ;Si es negativo

POS: NUEVO:

; El nmero es menor que uno ; Desplazo hacia izquierda y ; decremento exponente ; Si al decrementar obtengo exp ;cero es desnorm.

YA:

; El exp FF est reservado ; Si C=1 --> infinito ; Borro la mantisa para formar el infinito ; Tengo el exponente ; Agrego el signo ; Inserto el LSB del exponente a FLOTR+1 ;En VAR tengo 1

ETIQUETA RECUPSIG

$INCLUDE SCI_TXTR.INC;inclusin del archivo de comunicacin serie Org dw dw dw $FFFA $EE00 $EE00 $EE00 ;IRQ ;SWI ;Reset

Subrutina de Multiplicacin: $BASE part part1 part2 part3 exp1 exp2 nbytes nbytes2 numA numB partalt acum resp temp 10T org ds ds ds ds ds ds ds ds db db ds ds ds ds $80 1 1 1 1 1 1 1 1 $00,$7F,$FF,$FF $40,$49,$0F,$DA 1 1 7 1

***************************************************************************

org clrresp otra

$EE00 ldx clr dbnzx mov mov mov mov mov #6 resp,x otra #3,nbytes #3,nbytes2 #6,part3 #5,part2 #4,part1 ;Pone a cero todo el espacio para la mantisa

*************************************************************************** ;1 Deteccin de cifras desnormalizadas *************************************************************************** inicio clr clr mov lda rola rol lda bne mov lda bpl inc bra dec mov lda rola rol lda bne clc lda add bcs sta bpl inc bra dec acum temp numA,exp1 (numA+1) exp1 exp1 nodes1A #$FF,acum exp1 esnegat1 temp esposit1 temp numB,exp2 (numB+1) exp2 exp2 nodes1B acum #1 alcero acum esnegat2 temp first temp ; numB es desnormalisado ; Ambos nmeros son desnormalizados => resultado=0 ;N=0 =>el exp es negativo, N=1 =>el exp es positivo

; numA es desnormalisado ; N=0 => el exp es negativo, N=1 => el exp es

nodes1A positivo esnegat1 esposit1

nodes1B esnegat2

******************************************************************************* ;2 Detecion de los QNaN, SNaN, Cero e Infinito ******************************************************************************* first clr part bclr 7,numA+1 bclr 7,numA+1 clc lda numA+3 add numA+2 adc numA+1 bcs sigo3 bne sigo3 lda exp1 beq sigo cmp #$FF beq sigo2 bra second inc part bra second dec part bra second lda exp1 cmp #$FF beq SNaN

sigo sigo2 sigo3

; numA=0 ; numa = infinito

second

sigo5 sigo4

clc lda add adc bcs bne lda beq cmp bne dec beq jmp inc beq jmp lda cmp beq dec beq inc inc beq

numB+3 numB+2 numB+1 sigo4 sigo4 exp2 sigo5 #$FF sumar part QNan infin part QNaN cero exp2 #$FF SNaN part alcero part part alinfin

***************************************************************** ;3 Suma de los exponentes ***************************************************************** sumar lda add sub bpl sta lda bmi bra exp1 exp2 #127 sumnegat exp1 temp alcero desdetec

; La suma es positiva ; El exponente es muy chico(o sea cero)

******************************************************************* alcero alinfin SNaN jmp jmp cero infin ; Uno o ambos nmeros son no validos

mov #0,resp Bset 0,resp+1 jmp fin mov #0,resp Bset 6,resp+1 jmp fin rol dbnzx rts rol dbnzx rts mov ror ror jmp mov jmp numA,x desno2A numB,x desno2B #$FF,resp resp resp+1 signo #0,resp fin

QNaN

; La operacin da valor no valido

desno2A

desno2B

infin

;El resultado es +/- infinito

cero

;El resultado es cero

******************************************************************* sumnegat sta lda beq bpl exp1 temp desdetec alinfin ; La suma es negativa ; El exponente es muy grande(+/- infinito)

********************************************************************************** ;4 Se adecuan las cifras desnormalisadas ********************************************************************************** desdetec mov bset bset clc ldx lda add bcc clc jsr bra dec bne clc bsr exp1,resp 7,(numA+1) 7,(numB+1) #3 acum #1 nodes2A desno2A mulmant acum mulmant desno2B

nodes2A

********************************************************************************** ;5 Multiplicacin de la mantisa ********************************************************************************** mulmant despacum ldx nbytes clr partalt lda numB,x sta acum lda part1-1,x sta part pshx bsr multacum pulx dbnzx despacum bra despmant ldx clc lda rolx pshx ldx mul add bcc incx stx pulx lsrx pshx ldx adc sta decx stx pulx decx bne bcc inc ldx lda sta rts nbytes2 numA,x acum partalt noincre partalt

multacum seguir

noincre

part resp,x resp,x part seguir noincre2 partalt part partalt resp,x

noincre2

****************************************************************************** ;6 Arreglo de la presentacin de la cifra ****************************************************************************** despmant mov brclr inc bra lda beq brset ldx rol dbnzx dec bra clc ldx rol dbnzx dec bne clrx lda ror incx deca bne bra #2,part 7,resp+1,multdeci resp yaincre resp signo 6,resp+1,sigue3 #4 resp,x sigue4 resp multdeci #4 resp,x sigue part sigue2 #4 resp,x sigue5 signo

multdeci

sigue4

sigue3 sigue2 sigue yaincre

sigue5

************************************************************************* ;7 Se establece el signo ************************************************************************* signo bclr lda eor and beq bset swi 7,resp numA numB #$80 fin 7,resp ;Rutina que determina el signo

fin

Continuar ...... Nota de Redaccin: El lector puede descargar este artculo y artculos anteriores de Buceando... desde la seccin Artculos Tcnicos en el sitio web de EduDevices (www.edudevices.com.ar )

You might also like