Seminario de Proyecto y II Reporte final.148.206.53.84/tesiuami/UAM7444.pdf · En el caso del...

68
UNIVERSIDAD AUTONOMA METROPOLITANA Un idad lzta pala pa. c. 4 -1. Seminario de Proyecto I y II Reporte final. SISTEMA PARA LA MEDICION Y DETERMINACION DE LA COMPOSICION CORPORAL POR IMPEDANCIMETRIA. Cynthia Ilianabavid AKeola. Mat: 88322378 Asesor: Ing. Enrique Hernández Matos. Diciembre 1994.

Transcript of Seminario de Proyecto y II Reporte final.148.206.53.84/tesiuami/UAM7444.pdf · En el caso del...

UNIVERSIDAD AUTONOMA METROPOLITANA Un idad lzta pala pa.

c. 4 -1.

Seminario de Proyecto I y II Reporte final.

SISTEMA PARA LA MEDICION Y DETERMINACION DE LA COMPOSICION CORPORAL POR IMPEDANCIMETRIA.

Cynthia Ilianabavid AKeola. Mat: 88322378

Asesor: Ing. Enrique Hernández Matos.

Diciembre 1994.

índice

TITULO INTRODUCCI~N

Impedancia en sistemas biológicos.

Estimulación y riesgos de estimulación. Composición corporal. Impedancímetro, medidor de composición corporal.

Antecedentes del desarrollo del hardware. Programación

Diagrama de flujo. Subrutinas más importantes. Unidad de punto flotante.

ANTECEDENTES

OBJETIVO DESARROLLO

Pseudocódigo.

CONCLUSIONES BlBLlOGRAFlA ANEXOS

CONCLUSIONES.

SEMINARIO DE PROYECTOS I Y I I . DAVID ARREOLA CYNTHIA I .

TITULO. Sistema y programa para la determinación de composición

corporal por método impedancimétrico, basado en un sistema mínimo para el microcontrolador 68HC1 I.

I NTRODUCCION.

Este proyecto está basado en la medición de grasa corporal mediante el método de impedancia biológica, ayudado por un sistema mínimo para el microcontrolador 68HC11, con el cual se irnplementaron, por medio de programación, las fórmulas, ya conocidas, para el cálculo de masa libre de grasa (FFM).

Im-dancia en sistemas bioI@icos.

La impedancia, como tal, es la medida cuantitativa de la oposición que ofrece un sistema dado ante cualquier tipo de fuerza, que trata de mantener el paso de una cantidad de algún tipo de flujo a través del sistema.

Hablando de sistemas, entre estos entran los fisidógicos, que no están excentos de oponerse ante algún tipo de fuerza, es decir, de presentar resistencia ante dicha fuerza. Por ejemplo el sistema respiratorio presenta la oposición al fiujo de aire que pasa por las vías respiratorias, o la impedancia, presentada por las arterias, venas o vasos, ante el flujo sanguíneo.

Los mecanismos de propagación en la células, se deben principalmente, a la resistencia eléctrica que presentan sus membranas, ya que esta presenta canales, a través de los cuales fluyen los iones de potasio, sodio y cloro. En el interior de los canales

se da una resistencia al paso de estos ¡ones, a esto se le denomina resistencia de membrana. En las membranas celulares se presenta una alta impedancia a bajas frecuencias, que produce que un gran flujo de corriente se presente en el espacio extracelular.

Para entender la razón por la cual las variables fisiológicas presentan distintas impedancias biológicas ante el paso de corrientes eléctricas, recordamos los modelos de ingeniería, ya estudiados, como son el capacitor de placas paralelas y el resistor cilíndrico.

En el caso del resistor cilíndrico, la resistencia entre los dos polos de un cilindro con una longitud L y una sección transversal A, se expresa:

R=p( UA)

donde p es la resistividad del material del cilindro, el inverso de p, (Up), es la conductividad (a), como se observa en esta expresión, la resistencia está en función de la longitud y el área transversal del objeto, en este caso de tejidos o materiales en vivo.

Por lo anterior todos los tejidos presentan una resistencia eléctrica, la cual difiere de acuerdo a la composición y dimensiones de estos. A continuación se presenta una tabla de la resistividad que presentan algunos tejidos.

f MUESTRA \

RESlSTlVlDAD ( Skm)

sangre plasma fiuido cerebro- espina1 bills orina mOsculo cardlaco

mbculo esquelético fibras transversales músculo esqueiético fibras longitudhales pulmones riñdn hígado bazo

cerebro

150

50-60

65

6il

30

400

1600

300

1500

370 820 885

580

La resistencia presentada por sistemas biológicos, puede ser medida por medio de un impedancímtro, conectado en cualquiera dos puntos del sistema y se observa en la salida una SeRal proporcional a la variable fisiológica y en términos de la impedancia que presenta el sistema, es decir el impedancimetro actúa como transductor, ya que convierte la impedancia que ofrece el sistema biológico en un voltaje proporcional. El impedancímetro, como cualquier transductor, presenta las características demandadas. Las características del impedancímetro diseñado para estos propósitos se describen más adelante.

SISfEñA

BIOLo81CO

ANTECEDENTES.

/ A \ I

SAUDA SEfiAL EN TERMINOS trs Iñ PE DANClñ ETRo

L DE U IURDACICIA / B I 4

Este modelo, utilizado para determinar la composición corporal, fué propuesto a partir de estudios realizados en animales. Las propiedades bioelktricas de los organismos dependen de su geometría, su resistividad específica y de la composición de sus tejidos.

La medición de la impedancia entre la muñeca y el tobillo, generalmente los del lado derecho, se considera como un método sencillo, no invasivo, para determinar en volumen de agua y el porcentaje de grasa en el cuerpo, haciendo varias mediciones en multiples regiones del cuerpo.

Fg.Posiciá, de los electrodas para m- de hpedmcia.

Estimulación Y ries-aos de la estimulación.

La medición de la impedancia biológica requiere de la inyección de una comente que atraviesa el tejido biológico a estudiar, esta corriente no debe provocar calentamiento o algún tipo de daño o cambio, es decir que ningún tejido excitable sea estimulado. Todas las células excitables son sensibles al paso de la corriente eléctrica. Cuando la comente aplicada a algún individuo es adecauda para producir alguna respuesta de los tejidos excitables, se pueden presentar sensaciones de dolor o contracciones del tejido. La corriente debe atravesar el cuerpo por un lado y salir por otro, es decir, el cuerpo debe formar parte del circuito eléctrico, para que se dé un efecto fisiológico.

Tres efectos pueden ser provocados con el paso de corriente eléctrica a través del tejido, estos son: estimulación eléctrica del tejido nervioso, calentamiento resistivo del tejido y quemaduras electroquímicas. El umbral de percepción varía de acuerdo a las condiciones de medición. Dos efectos que se deben evitar son la fibrilación cardiaca (ventricular o auricular), ya que se ocasionaría un paro circulatorio o la muerte; la estimulación vagal, que produce que la frecuencia cardiaca disminuya hasta parar al corazón. La región de fibrilación está entre 50 mA mi^ y 5 A m, valores mayores inducen a contraer sostenidamente el miocardio y producir quemaduras.

Commsición corooral.

El tejido corporal está constituído por tejido adiposo y tejido magro. El tejido adiposo está compuesto de lípidos estructurales y poiiglicéridos, el tejido magro consta de agua, proteínas, minerales. En la clínica, el porcentaje de grasa en relación al tejido corporal es empleado en tratamientos dietéticos y en el análisis de la reacción de fármacos en los pacientes.

Muchos investigadores como Lukaski H.C., W.W. Bolonchuk, Gray D.S. y Segal K.R. usaron y validaron el método de análisis de la impedancia bioeléctrica (BIA) para la estimación de la composición corporal.

Este método se basa en la suposición que la masa libre de grasa (Fat-Free Mass FFM) que contiene la mayoría del fluido y electrolitos en el cuerpo, conduce la energía mucho mejor que el tejido adiposo, que posee bajas cantidades de fluido y electrolitos. Midiendo la resistencia del cuerpo al flujo de corriente alterna de bajo nivel (50 MHz y 800 pA) y relacionando directamente la resistencia contra la longitud de conductor, en este caso la estatura del individuo, e inversamente al volumen del conductor, en este caso el volumen total del cuerpo, la composición del cuerpo puede ser estimada.

Gracias a Lukaski y sus colaboradores, se sabe que la relación (estatura)Wresistencia, tiene una gran relación con la masa libre de grasa, el agua corporal total y al potasio corpopral total, este método es muy confiable ( ~0 .99 ) .

Existen otras técnicas para validar la composición corporal como la hidrodensitometría (dFFM), la dilación con isótopos (TBW) y la determinación de potasio total (TBK), pero todas presentan como desventajas la inexactitud, lentitud y su alto costo.

Mediciones en la impedancia han sido utilizadas para analizar la composición corporal: masa grasa y masa libre de grasa siguiendo el modelo propuesto por Hoffer en 1969 y corregido por Patterson veinte años después.

Hoffer proponía que por la geometría del cuerpo humano, este podía ser considerado como un conductor cilíndrico uniforme, si se asume que la frecuencia de la señal en estudio, es constante, entonces la impedancia Z es función del área transversal A y del largo del conductor L:

Z=px (UA)

multiplicando por UL y sustituyendo AxL=V, se obtiene:

despejando el volumen del conductor, se observa que está relacionado con su largo y su impedancia:

V=px( UZ)

despejando el volumen puede interpretarse como un cuerpo formado por varios componentes de diferentes resistividades, en paralelo. De esta manera el volumen estimado está relacionado aproximadamente con el largo y el componente de mayor resistividad. El volumen del conductor puede, entonces estar relacionado con los parámetros de longitud e impedancia.

Este volumen puede ser interpretado con respecto a la composición del cuerpo como un conjunto de componentes con distintas impedancias arregladas en paralelo.

A .......... ............. ............... ............... ............... ............... ............. .......... c i L

AI .......... ............. .............. .............. .............. ............ ............. .......... F

A2 r 1 L

Z=p UA z- I/ (1/Zl+ln2)

f3g. a) El aierpovlstomoui Conaidaaimpie an gecmeMa urlfomie y a y a hipedaicki depende del su &ea y largihid. b) U aierpovkto cano el -to de

mpaiente!3condlsoitashpedendas.

La resistivídad del tejido adiposo es considerablemente mayor que la de los tejidos musculares y esta diferencia es proporcional al

,-

contenido de agua en el tejido. De esta manera puede asumirse que la grasa posee una alta resisüvidad y que el volumen está relacionado con el contenido libre de grasa.

lm-dan cimetro,meúicbr de composición c o p m 1.

Se cuenta con un bioimpedancímetro construido con circuitería analógica y digital que presenta las siguientes características:

Amplitud de la corriente de esümulaci&n: 880 pA. Frecuencia de la corriente de estimulación: 50 kHz Forma de la corriente de esümulación: altema senoidal Rango de medición en resistencia: O a IO00 i2 Resolución: 1i2 Rango de medición en reactancia: O a 500 w Resolución: IR Exactitud: +/- 1%

Exactitud: +/- 0.5 %

El impedancímetro utiliza la técnica tetrapolar, es decir, emplea dos electrodos para la inyección de una corriente constante y dos electrodos para sensar el voltaje proporcional a los cambios de impedancia. Los puntos de entrada y salida de la comente eléctrica son la mano y el pie derechos. Los puntos de medición de voltaje se encuentran, tanto en la muñeca, como en el tobillo, próximos a los puntos de aplicación de la corriente. con esta disposición de los electrodos y un medio de conducción homogéneo, existe la posibilidad de una distribución de la densidad de corriente más uniforme en el tejido. Para separar el componente reactivo del resistivo se empleó un sistema sensible a la fase. El equipo cumple con las normas de seguridad eléctrica, ya que incluye una fuente de poder de aislamiento para las etapas conectadas al paciente.

A continuación se presenta un diagrama a bloques del impedancímetro.

I i I I

I c I I ' A

OBJETIVO.

El objetivo principal de este proyecto es el de mejorar el trabajo, hasta ahora realizado, utilizando mejor los recursos que el microcontrolador nos proporciona, tanto en el hardware, como en su programación.

DESARROLLO.

Antecedentes del desarrollo del hardware.

Basándose en un sistema mínimo para el microcontrolador 68HC1 I ya construido, se desarrolló un programa que calcula la masa libre de grasa, por método impedancímetrico, llevando a cabo cualquiera de 9 fórmulas que existen con ese propósito. El sistema mínimo recibe como variables de entrada dos voltajes de corriente directa proporcionales a la resistencia y reactancia, la salida del sistema es el despliegue de la masa libre de grasa.

Como este proyecto es una continuación de un proyecto inicial que permitía el cálculo de las variables de composición corporal, como son la masa grasa, la masa libre de grasa y el porcentaje de grasa corporal y cuyo sistema para el microcontrolador 68HC11 es utilizado también en este protecto, sdo se mencionarán algunas de las características más importantes de dicho sistema.

I. Consta de un circuito integrado interface programabie de teclado- despliiegue 8279 de lntd con Operación de despliegue- teclado simultánea, modo de rastro en el teclado, memoria FlFO de teclado de 8 caracteres, despliegue dual de 8 a 96 displays, entrada ??AM de despliegue por la derecha o p r la izquierda, generación de intenupci&n cuando se pulsa una letra.

2, Memoria EPROM 2764. 3. Teclado de 20 teclas. 4. Para e/ despíiegue se cuenta con 8 djspíays de 7 segmentos 5. Dispsitivos necesarios para interconexi&n. 6. Circuito temporizador formado por un cristal de 8MHz con lo que

todo el sistema trabaja a una frecuencia de 2MHz.

La resistencia humana presenta valores dentro del rango de (400 a 650 Q) , la salida del impendancímetro correspondiente a estos valores es de 4.0 a 6.5v, esta salida alimenta a uno de los cuatro canales del convertidor anal6gico-digital de 8 bits del microcontrolador, el cual trabaja dentro de un rango de voltaje que va de O a 5 v, por lo que la conexión del impedancímetro y el sistema no puede realizarse directamente. Para solucionar este problema se tuvó que implementar un circuito restador-multiplicador (*2), con el que se eliminó el voltaje de offset de 4v. (ver diagrama).

Ai igual que para la resistencia, para la reactancia se tuvó que implementar otro circuito que nos permita usar valores dentro del rango del CND CM micro, los valores de voltajes proporcionales a la reactancia leída van de O a lv (O a 100 a). El circuito en este caso está formado por un circuito muitiplicador por 5.

Los voltajes de salida se relacionan de la siguiente forma:

A000-BFFF E000-FFFF

salida del impdancímetro (resistencia): [4.00,6.503 entrada al sistema 68HC 7 7: [O, 5v' salida del impdancimetro (reactancia) .- [Q, 1 v3 entrada al sistema 68HC7 7; [O, 5v3

CI 8279 MEMORIA EPROM

Se realizó el m a p de la siguiente forma:'

I DIRECCION I DISPOSITIVO I I ~ ~ o ~ ~ F F F I PUERTO O I

El diagrama general del circuito fue implementado mediante la técnica llamada wire wrap.

La parte principal de este proyecto consiste en el desarrollo de un programa que mejora en capacidad y facilita el cálculo de la grasa corporal. El usuario ahora dispone de 9 fórmulas experimentales, que le permiten determinar la composición corporal por impedancia, de esta manera podrá comparar la veracidad del programa en los resultados

Estas fórmulas son:

I. FFM= 4.033+0.734(HtA2/res)+0.096(Xc)+0.1 16(Wt)+0.878(sexo) masculino=l femenino=O

2. FFWO .7 34( HtA2/ms)+ O. 1 1 6(Wt)+ O. 096(Xc)-3. I 52

3. FFM=0.827( HtA2/res)+5.214

4. FFM=O.OI 32( HtA2)-0.043M( iitA2/res)+0. 30!52(Wt)-O. 7 676(edad)+22.66827

5. FFM=O .0006636( HtA2)-0. 02 I I 7(res)+O .6284(Wt)-O. 1 238(edad)+9.33285

Tecla F1

6. FFM=O. 00085( HtA2)+0. 3736(Wt)-O. 02375(res)-O. 1 531 (edad)+ I 7.7868

Función simulación

7. Db=l.1554-0.0841 [wt(res)/HtA2]

F2 F3

8. F FM 4 . 4 9 3 +O. 49 36( Ht Wres) + O. 3 3 2(Wt)

ejecución real calibración

9. FFM=O .698exp(4)(HtAZres)+ 1 2.9

donde FFM es la masa libre de grasa(Kg), Ht es la estatura del individuo (cm), Wt es el peso en (Kg), res es la resistencia (ohms), Xc es reactancia (ohms), edad en años y Db es la densidad corporal en (mi)

La mayoría de las ecuaciones estan restringidas por la población muestra en que fueron probadas. En ellas sólo se calcula la masa libre de grasa, para calcular la masa grasa solo se resta al peso total del individuo la masa libre de grasa, para obtener el porcentaje de grasa corporal, se divide la masa libre de grasa entre el peso del individuo y se multiplica el resultado por cien.

Las funciones del teclado están declaradas de la siguiente forma:

Al iniciar el programa en el sistema mínimo del 68HC11, lo primero que aparece es un mensaje de bienvenida, y el sistema espera una tecla de función.

La tecla de función F1 es la tecla que se debe oprimir si el usuario desea realizar la simulación de cualquiera de las nueve fórmulas, antes mencionadas, introduciendo, él mismo los datos del

individuo, incluyendo la resistencia y la reactancia. En algunos casos, como se verá más adelante esta tecla, permite ai usuario regresar al menú inicial, saliéndose de la rutina en la que se encontraba.

La tecla de funciórr F2 es la tecla que se oprime si el usuario desea realizar la ejecución real de alguna de las fórmulas, con los datos reales, lefdos por el CND del micro, de resistencia y reactancia del individuo, el usuario introduce los demás datos del individuo, como son la estatura, el peso, la edad y el sexo.

La tecla de funcibn F3 permite al usuario realizar la calibración del sistema. Esta función se recomienda sea la primera en realizarse. El proceso o subrutina que realiza la calibración, captura y muestra en los diplays el valor promediode 50 datos leídos por el CND, se recomienda que esta rutina se realice con una resistencia de precisión de un valor de 525 Q, que es el valor medio del rango de impedancia.

En términos generales, el programa tiene una estructura como la siguiente:

Después de un reset a l sistema, se despliega un mensaje de bienvenida y espera una t e c l a de función. Dependiendo de l a función tecleada se rea l izarán d i s t i n t a s r u t i nas.

1.-1nicio.Aparece menú pr inc ipa l , se espera t e c l a de función. I

a) Fue F1 vete a r u t i n a Fue F2 t b) Fué F2 vete a r u t i n a Fue F1 c) Fué F3 vete a r u t i n a Fue F3

2.-Fue F1. a)pregunta. b)fue F1, regresa a l punto 1, s i no continua. c) s i mu1 a. d)ejecuta

e)regresa a i n i c i o .

a) pregunta. b)fue F1,regresa a i n i c i o , s i no continua. c)adquiere. d)muestra. e) e j ecu t a . f )regresa a i n i c i o .

a) cal i bra . b)regresa a i n i c i o .

3.-Fue F2.

4.-Fue F3

A continuación se presenta el diagrama de flujo del programa, para que pueda ser entendido.

MENU INICIAL:

T E C U DE FüIClOU [ "" 1-1 MLMSAJEY ESPERA I

M$?LIEOA MENSAJE DE

FUtlclON DE SIMUUCION.

DESPlIE(M MENSAJE DE

EJECUCION REAL. 1 I +

PREUUNTAMPTURA V ALIMCEYAMIENTO

DE LOS MRAMETIIOS:Yi,HtlEDAD,PESO V

SEX0,EW SUS VARIABLES 1 EN FOUMATO

DE PUNTO FLOTANTE.

PREOUNTA&APTURA V ALMACENAMIEITO

DE LOS PARAllETROS:rih,Ht,EDADl~~ Y

TAlURA,SEyO, EMO,RESlSTENCIA Y REAC-

TANCIA.

SI Ft MENU INICIAL

UMUU:PRE9UITA LOS VALORES DE r Y REAC. LOS P M A A FORMATO DE PUNTO

PLES. FLOTANTE V LOS CUARDA EN SUS VARIA-

I

VIA EL CUD, VIA EL IMPEMWCIMETRO

DA EN SUS VARIABLES I LOS MUESTRA. Los PASA A PUNTO FLOTANTE r Los UUA

I

DCSPLIEOA MEWWE PARA ELEUlR UNA DE LAS 9 FORWULAS PARA CALCULAR COMPOSICION GORP.

4 TECLAS DEL I AL 9 1

A BINARIO.

SE REGRESA

ESPERA TECLA

I CUALQUIER TECLA

Subrutinas más imporiantes.

Pregunta los parámetros del individuo (peso,estatura, edad y sexo) y los guarda en formato de punto flotante en sus respectivas variables.

Simula. Se preguntan los datos de resistencia y reactancia, se pasan a formato de punto flotante y se guardan en sus respectivas variables.

Adquiere. Mediante una rutina (Conv),inicializa al convertidor, obtiene 50 muestras del dato y saca el promedio, se parametriza ese dato con respecto a los niveles del convertidor, al rango de impedancias y se le suma el offset restado en la entrada del sistema.

Muestra. Muestra en los diplays el valor de resistencia y de reactancia capturados por el CND, estos valores son los reales.

Ejecuta. Se espera que se teclee un número del 1 al 9. Con los datos almacenados en memoria se realiza la ejecución de la fórmula elegida,convierte el resultado de punto flotante a binario, para desplegarlo en los displays. Espera tecla si es FI, se sale de ejecuta y se regresa al menú inicial, cualquier otra tecla espera otro número para ejecutar otra fórmula con los mismos datos almacenados. En esta rutina se manda a implementar la fórmula pedida por el usuario, aqui entra la unidad de punto flotante.

Ca/jbra Mediante la rutina Conv permite al sistema leer 50 muestras del dato, saca el promedio, parametriza el valor, y muestra la resistencia o la reactancia leída. El usuario, calibra con los potenciómetros del circuito restador, hasta leer el valor de resistencia o de reactancia que se desea tener. Dentro de esta rutina se hace un retardo de 4 mseg, para que el convertidor pueda ser leído.

Unidad de punto flotante.

Unos de los procedimientos más importantes e interesantes son los que se encargan de operar y manejar los datos númericos que se introducen al sistema. Si bien no es tan importante la precisión de los resultados, ya que se trata de porcentajes, esta importancia crece desde el punto de vista del manejo de los números para implementar operaciones, de ahf que se utilizó el formato de punto flotante.

O

En el estandar de la IEEE existen 4 formatos para punto flotante: sencillo, doble, sencillo extendido y doble extendido, pero todos cumplen con el siguiente formato general:

1 ... 254 255

O

-0

El campo S es el del signo y siempre es de 1 bit, pero los campos E (exponente) y F (fracción), varían según el formato que se utilice. El formato utilizado para implementar nuestra unidad de punto flotante está formado por tres bytes para la fraccidn y signo y uno para el exponente. El valor V representado por el formato de punto flotante, se calcula de la siguiente manera:

V=(-I)"SX(I .F)xZ"E-127

O -1 'S(1 .F)2*-127 infinito

o -lAS(1 .F)2AE-127 NaN

donde E es el exponente representado en notación exceso -127, es decir, el exponente está dentro del rango -128...0...+127, será representado en el rango O.. . I 27.. ,255.

Los números representados con este formato de punto flotante se muestran en la siguiente tabla.

I Valor de E I t I I I I

Se implementaron procedimientos encargados de manejar y operar los valores numéricos.

Rutina Bin2Fp. Esta rutina esta encargada de transformar un número binario en

formato de punto flotante, por medio de corrimientos, y de acuerdo al número de corrimientos es el valor que se almacenará en el registro exponente. Los corrimientos son hacia la izquierda y se hacen sobre el byte donde se encuentra almacenado el número binario a transformar. Cada vez que se hace un corrimiento se verifica si ei MSB es igual a uno y se incrementa un contador de corrimientos, de ser así se detienen los corrimientos y se guarda en el exponente la resta de ocho menos el número de corrimientos que se realizaron, en la fracción se almacena el número recorrido.

Rutina Fp2Bin. Esta rutina esta encargada de transformar un número en formato

de punto flotante a binario, aquí es importante considerar el valor del exponente y el signo del número flotante, pues de ahí se harán corrimientos a la derecha o a la izquierda para obtener el valor verdadero en binario.

Rutina Word2Fp. Esta rutina convierte un word a punto flotante, en el registro D se

encuentra el word que se desea pasa a punto flotante y el registro índice X apunta a la variable de punto flotante, en donde se va a guardar el número convertido. La conversión se realiza, por medio de corrimientos, y de acuerdo al número de corrimientos es el valor que se almacenará en el registro exponente. Los corrímientos son hacia la izquierda y se hacen sobre el byte donde se encuentra almacenado el word a transformar.

Rutina Float2Word. Esta rutina es la que se encarga de pasa un número en formato

de punto flotante a word para poder ser mostrado en display. En este

_-”-

proceso solo se muestran ~ O S valores enteros del número, la fracción se desecha.

Rutina Suma3 Esta rutina suma dos números de tres bytes con acarreo (

X+Y+Cf) y pone el resultado en X. Es usada en la rutina que suma dos numeros de punto flotante.

Rutina FpComp. Rutina que compara en magnitud dos números en punto flotante,

analizando las banderas de cero (Zr) y acarreo (Cf). Primero verifica que los exponentes sean iguales, de ser as¡ empieza a comparar cada una de las tres fracciones de cada número.

Rutina FpNeg. Esta rutina cambia el signo de un número de punto flotante y

pone el resultado en una variable de pto. flotante (ñoatl). Esto lo logra haciéndole al número una XOR y solo guardando el MSB que es el de signo.

Rutina Multi3 Es una rutina que se diseñó para multiplicar dos números de tres

bytes (X%YA) y pone el resultado en una variable auxiliar para la multiplicación de 6 bytes. La forma de realizar la multiplicación es multiplicando byte por byte de ambos números y colocando el resultado en la posición que le corresponde. ejemplo:

X%YA XA= ABC YkDEF

CF

BE

Dc

DB

AD ' 0 1 2 3 4 5 Registmawcilia

i

de esa forma los resultados de las multiplicaciones de byte por byte, se irán sumando con los demás que deban ir en su misma posición en el registro auxiliar de resultado.

Rutina Multi. Realiza la multiplicación de dos números de punto flotante.

ayudada por la rutina anterior. En esta rutina se conoce el signo de ambos operandos y a los dos se les enciende el bit escondido, al regresar de hacer la multiplicación (mdti3) ya se tiene el signo del resultado.

Rutina Suma y Resta. Para la realización de la suma se requiere que los exponentes de

ambos números sean iguales, por lo que es indispensable que primero se hagan los corrimientos necesarios sobre las fracciones, después de

esto se realiza la suma de las fracciones de los números. Para realizar una resta se requiere conocer el signo de los números a operar y conocer su magnitud para establecer de antemano el signo del resultado, después se obtiene el complemento del número negativo y se realiza la suma. Se tiene que tener mucho cuidado con la magnitud y los signos de los números, ya que de eso depende terminantemente la rutina que toma este procedimiento y por lo tanto el resultado. Ya que se conocen los signos y las magnitudes, se sabe de antemano el signo del resultado y se guarda en la pila. Estas rutinas estan ayudadas básicamente de FpNeg, FpComp,Suma3.

Rutina Recip2. Saca el recíproco de un número de punto flotante usando sólo

dos bytes de fracción. Ya que la división es DM, en el registro D se carga un 1, en X se carga el número al que se le desea sacar el recíproco, se guarda el resultado en una variable auxiliar. Hace la división fraccionaria con el residuo de la división entera, esto último lo hace dos veces para obtener mayor precisión, ya que se está despreciandc uno de los bytes de la fracción del número de punto flotante.

Con la subrutina de Recip2 y Recip se obtuvieron los valores de las constantes, que se necesitan en las fórmulas, en su formato de punto flotante.

Para implementar una fórmula sólo se llaman a los procedimientos necesarios que realizan las operaciones aritméticas, a las constantes y a los valores introducidos por el usuario, ya transformados en formato de punto flotante.

Lo más importante de este proyecto fue el diseño de la unidad de punto flotante, ya que a pesar de que fue muy complicado implementarla, por los pocos recursos con los que cuenta la programacidn en ensamblador, facilita increfblemente el desarrollo de operaciones aritméticas y ofrece mayor precisión en los resultados. AI implementar esta unidad, fue mucho más sencillo implementar cualquier fórmula. Aunque en este caso no se requiere de gran precisión en los resultados, ya que se está haMando de porcentajes (% de grasa corporal), esta unidad podría ser utilizada en cualquier otro proyecto, en el se requiera de cálculos aritméticos con gran precisión, ya que por la forma en que fue realizado el programa es muy fácil obtener la unidad y las variables que requiere.

Por otro lado no se ha probado el sistema con el impedancímetro, solo se han hecho pruebas simulándolo, tanto en los valores de resistencia, corno de reactancia, con resultados favorables, por lo que se ofrece la seguridad de que funcionará cuando trabaje con el impedancímetro.

Es importante decir, que el poder ejecutar varias fórmulas, con los mismos datos, nos permiten realizar comparaciones entre ellas y poder tomar solo aquellas que se adaptan a la población muestra.

BI BLI OGRAFIA

Coughlin R. F., Driscoll F; Circuitos integrados lineales y amplificadores operacionales. Prentice Hall Hispanoamericana, México, 1987. p 162- 166.

Webster J. Encyclopedia of medical devices and instrumentation. 3th edition. Ed. John Wiley& sons inc. 1988.

Patterson R. "Body fluid determinations using multiple impedance measurements"; IEEE Engineering in medicine and biology; 8:p16-18, 1989.

Shoeller D.A.; Kushner RF."Determination of body fluids by the impedance technique"; I EEE Engineering in medicine and biology;8: p19-21; 1989.

Hemández Matos E. "Medidor de composición corporal por impedancia'' Rev. Mex. Ing Biomedica. 2: p 7581, 1993.

Soto Sanchez JM. Reporte final de Seminario de proyectos 11, México, 1993.

MC68HC11 Refernce manual, Motorola, 1990.

(D

U C aJ -P VI

VI aJ L

(D L a

L O U rg

--

-

a

c

a

i

7'' O

a - U C (D Y U (D al L

m L (D a c O U (D c

a O U rg O + -3 U L

O

-

_-

* Proyecto Terminal I1 * Programa: Método Impedancimétrico * para determinar FFM de un individuo * Cynthia Iliana David Arreola *

***a** * DEFINICIONES PRINCIPALES ****** * Areas de memoria: ROM EQU $E000 INICIO DE LA ROM EO00 RAM EQU $40 INICIO DE LA RAM (INTERNA ver Const INITVAL) PILA EQU $OOFF PILA (La RAM interna va de $0000 a $OOFF ) REGS EQU $0000 INICIO DE LOS REGISTROS (ver Const INITVAL) EEPROM EQU $B600 INICIO DE LA EEPROM KBTABLA EQU $FDOO TABLA DE CODIGOS DE TECLADO TABLA EQU $FDA0 TABLA DE CARACTERES (Codificados para 7-segm)

* Constantes: INITVAL EQU $00 VALOR DEL REGISTRO INIT ( Ver PILA y REGS)

* Teclas: FlKEY EQU TECLA F1 F2KEY EQU $lo $1 1 TECLA F2 F3KEY EQU $1 2 TECLA F3 ENTER EQU $13 TECLA ENTER

* Puertos del controlador de teclado 8279: DATOS EQU $A000 DIRECCION DE DATOS PARA EL 8279 COMMS EQU $A001 DIRECCION DE COMANDOS PARA EL 8279 * Comandos del controlador KBMODE EQU KBCLK EQU RDKBD EQU RDDSPLY EQU WRDSPLY EQU EO1 EQU AI EQU

* Registros: INIT EQU TCNT EQU TOC2 EQU TOC3 EQU TOC4 EQU TCTLl EQU TMSKl EQU TFLGl EQU TMSK2 EQU TFLGZ EQU PACTL EQU BAUD EQU SCCR2 EQU SCSR EQU SCDR EQU ADCTL EQU ADRI EQU ADR2 EQU OPTION EQU HPRIO EQU

CONFIGURACION INICIAL DEL 8279 PREESCALADOR= 20 --> 100kHz LEER TECLADO LEER DISPLAY ESCRIBIR EN DISPLAYS FIN DE INTERRUPCION BIT DE AUTOINCREMENTO

REGISTRO DE MAPEO DE RAM Y REGISTROS REGISTRO CONTADOR DE TIEMPO REGISTRO DE TIEMPO PARA OC2 REGISTRO DE TIEMPO PARA OC3 REGISTRO DE TIEMPO PARA OC4 REGISTRO DE ACCIONES AUTOMATICAS DE OCx REGISTRO DE MASCARAS DE INTERRUPCION OCxI REGISTRO DE BANDERAS DE OCx REGISTRO DE VELOCIDAD DEL RELOJ REGISTRO DE BANDERA DE RTI REGISTRO DE FRECUENCIA DE LA RTI REGISTRO DE BAUD-RATE REGISTRO DE CONTROL DEL SCI REGISTRO DE STATUS DEL SCI REGISTRO DE DATOS DEL SCI REGISTRO DE CONTROL DEL CONVERTIDOR A/D REGISTRO DE DATOS DEL A/D REGISTRO DE DATOS DEL A/D REGISTRO DE ENCENDIDO DEL CONVERTIDOR A/D REGISTRO DE MODO DE OPERACION

-....--"-- p-

* Localidades en RAM (Página Cero): * RAM+$OO ( $07 ) KBOT EQU RAM+$08 KTOP EQU RAM+$OF HEAD EQU RAM+$10

* TAIL EQU RAM+$ll

CURSOR EQU RAM+$IZ ($13) *

S * *Variables de punto flotante FLOAT1 EQU RAM+$14 ($17) FLOAT2 EQU RAM+$18 ($IB) FPAUX EQU RAM+$IC ($lF) MULAUX EQU RAM+$ZO ($25)

CMPAUX EQU RAM+$2A USERFPI EQU RAM+$2B ($2E) USERFP2 EQU RAM+$ZF ($32) USERFP3 EQU RAM+$33 ($36) USERFP4 EQU RAM+$37 ($3A) USERFP5 EQU RAM+$3B ($3E)

S

CÓPIA DEL CONTENIDO DE LOS DISPLAYS INICIO DEL BUFFER DEL TECLADO FIN DEL BUFFER DEL TECLADO PUNTERO AL INICIO DE LA COLA DEL TECLADO

(APUNTA A LA CASILLA VACIA [fi] ) PUNTERO AL FINAL DE LA COLA DEL TECLADO (APUNTA A LA CASILLA LLENA [fo] ) INDICA LA POSICION DEL CURSOR EN DISPLAY

(USA DOS LOCALIDADES PARA USARSE CON IX)

ACUMULADOR DE PUNTO FLOTANTE VARIABLE DE PUNTO FLOTANTE VARIABLE AUXILIAR DE FP REGISTRO DE 6 BYTES PARA MULTIPLICACIONE

BYTE AUXILIAR PARA COMPARACIONES VARIABLES PARA EL USUARIO

*Variables de datos para formulas PESO EQU RAM+$3F ($42) ALTURA EQU RAM+$43 ($46) EDAD EQU RAM+$47 ($4A) RESIST EQU RAM+$4B ($4E) REACT EQU RAM+$4F ($52) SEXO EQU RAM+$53

*Constantes de punto flotante FRAC1 EQU O CONFIGURACION PARA EL FORMATO DE PUNTO FRAC2 EQU 1 FLOTANTE. FRAC3 EQU 2 EXP EQU 3

* Vectores de Interrupción: OC3VEC EQU $FFE4 OC2VEC EQU $FFE6 RTIVEC EQU $FFFO IRQVEC EQU $FFF2 SWIVEC EQU $FFF6 RESET EQU $FFFE

****** * PROGRAMA PRINCIPAL ****** * * Inicializaciones:

ORG ROM PROGRAMA

LDAA STAA INIT LDS #PILA BSET TMSK2 %10

11 I N I TV AL

VECTOR DE INTERRUPCION POR OC3 VECTOR DE INTERRUPCION POR OC2 VECTOR DE RTI VECTOR DE INTERRUPCION EXTERNA IRQ VECTOR DE INTERRRUPCION POR SOFTWARE VECTOR DE RESET

CARGA MAPEO DE RAM Y REGS MUEVE RAM Y REGS STACK POINTER - - -> RAM INTERNA RELOJ PRINCIPAL A 4 ~ s .

LDAA PPI DECA

BNE os LDAA STAA LDAA STAA LDX STX LDAA STAA STAA

CLI

* Principal: INICIO1 JSR

LDX JSR LDX STX

PP 1 JSR CMPA BLO CMPA BHS CMPA BEQ CMPA BEQ

FUE-F3 JSR BRA *

FUE-F2 JSR CMPA BEQ JSR JSR os JSR RA- BRA

FUE-F1 JSR CMPA BEQ JSR AC . JSR RA- BRA

#64

PPI

IjKBMODE COMMS # KB C L K COMMS I O CURSOR lKBOT HEAD TAIL

CLRSCR %GIGI$ PRINT I 6 CURSOR GETCH #F1 KEY PP1 #ENTER PP1 IF1 KEY FUE-F 1 IFZKEY FUE-F2

CALIBRA INICIO1

PREGUNTA #Fl KEY INICIO1 ADQUIE MUESTRA

EJECUTA

INICIO1

PREGUNTA lCFlKEY INICIO1 SIMULA

EJECUTA

INICIO1

RETARDO PARA ASEGURAR REGISTROS PROTEGID

CONFIGURA EL MODO DEL 8279

PROGRAMA EL PREESCALADOR DEL 8279

INICIALIZA CURSOR

INICIALIZA BUFFER TECLADO

ECHA A ANDAR LAS INTERRUPCIONES

LIMPIA LOS DISPLAYS PRESENTA MENSAJE DE MENU INICIAL

PONE EL CURSOR EN EL SEXTO DISPLAY

ESPERA UNA TECLA ESPERA TECLA DE FUNCION, SI FUE LETRA O NUMERO REGRESA FUE ENTER, NO ESPERA TECLA DE FUNCION

COMPARA CON LA TECLA F1 SI FUE VETE A "FUE FI" COMPARA CO LA TECLA F2 SI FUE F2 VETE A "FUE F2"

FUE F3, FUNCION DE CALIBRACION REGRESA DE CALIBRACION Y SE VA A MENU INICIAL

FUE F2, SE VA A PREGUNTA AL REGRESAR, PREGUNTA SI CANCELO SI SI VETE AL MENU INICIAL SI NO VETE A ADQUIERE SE VA A MOSTRAR EN DISPLAY DATOS OBTENID

EJECUTA LAS FORMULAS CON LOS DATOS CAPTU

DOS, Y SE VA A MENU INICIAL.

FUE F1, SE VA A PREGUNTA AL REGRESAR, PREGUNTA SI CANCELO SI SI VETE A MENU INICIAL SI NO VETE A CAPTURAR DATOS DE RES. Y RE

EJECUTA LAS FORMULAS CON LOS DATOS CAPTU

DOS, Y SE VA A MENU INICIAL.

* Fin del principal.

****** * SUBRUTINA: PREGUNTA Pregunta datos del paciente a l usuario. * PREGUNTA: A Devuelve a=O s i ok, a=$10 si cancelo. ****** PESO$ FCC 'INTRODUZCA PESO =KG '

ALTURA$ FCC 'INTRODUZCA ESTATURA =CMM '

EDAD$ FCC 'INTRODUZCA EDAD ANOS '

SEXO$ FCC 'INTRODUZCA SEXO OF 1MM '

FCB $10 Marca fin de cadena.

FCB $10

FCB $10

FCB $10

PREGUNTA PSHB PSHX

PREGO JSR LDX JSR AT JSR LDAA AN- CMPA BEQ JSR CPD BNE LDX JSR BRA

PREGl LDX JSR BRA

PREGFINN JMP

PREGZ JSR LDX JSR JSR S LDAA O CAN- CMPA BEQ JSR CPD BHS LDX JSR BRA

PREG3 LDX JSR

CLRSCR #/PESO$ PRINT

INDAT RAM

IF1 KEY PREGFINN GETNUM #/ O PREGl #/ ERROR $ PRINT PREGO #/PESO WORDZFP PREGZ PREGFIN

CLRSCR #ALTURA$ PRINT INDAT

RAM

#F 1 KEY PREGFIN GETNUM 130 PREG3 %ERROR$ PRINT PREGZ #AL T UR A WORDZFP

LIMPIA LOS DISPLAYS DESPLIEGA MENSAJE DE INTRODUCIR PESO Y LO CAPTURA POR MEDIO DE LA SUBRUTINA IND

LEE EL CONTENIDO DE RAM, PARA SABER SI C

CELO CON LA TECLA F1 SI SI CANCELO, SALTE

TOMA EL VALOR DE PESO ADQUIRIDO SI NO ES O CONTINUA SI SI ERROR PESO>O IMPRIME MENSAJE DE ERROR REGRESA A PREGUNTAR EL PESO DE NUEVO X --> VARIABLE DE PF PARA PESO SUBRUTINA QUE CONVIERTE DE WORD A PF CONTINUA

LIMPIA LOS DISPLAYS IMPRIME MENSAJE DE INTRODUCIR ESTATURA

RUTINA QUE CAPTURA LOS DATOS INTRODUCIDO

LEE EL CONTENIDO DE RAM, PARA SABER SI N

CELO CON LA TECLA F1 SI SI CANCELO, SALTE

TOMA EL VALOR DE ESTATURA ADQUIRIDO SI >= 30 CONTINUA SI NO ERROR ESTATURA>=30 IMPRIME MENSAJE DE ERROR REGRESA A PREGUNTAR ESTATURA DE NUEVO X--> VARIABLE DE FP PARA ESTATURA CONVIERTE DE WORD A PUNTO FLOTANTE

PREG4 JSR CLRSCR LIMPIA LOS DISPLAYS LDX #EDAD$ IMPRIME MENSAJE PARA ADUIRIR EDAD JSR PRINT CAPTURA EDAD POR MEDIO DE INDAT JSR INDAT LDAA RAM LEE CONTENIDO DE RAM, PARA SABER S I NO C AN- CMPA lfFlKEY CELO CON LA TECLA F1

BEQ JSR O CPD BNE LDX JSR BRA

PREG5 LDX JSR

PREGFIN GETNUM

iC O PREG5 #ERROR$ PRINT PREG4 #EDAD WORDZFP

PREG6 JSR CLRSCR LDX #SEXO$ JSR PRINT

SEX1 JSR INPUT2 LDAA RAM+7

CMPA #FlKEY BEQ PREGFIN CMPA if2 BHS SEX1 A PRE- STAA SEXO EN SU CLRA

-

SI SI CANCELO, SALTE SI NO ADQUIERE EL VALOR DEL DATO OBTENID

COMPARA CONTRA CERO SI FUE DIFERENTE DE O CONTINUA SI NO ERROR, EDAD>O IMPRIME MENSAJE DE ERROR Y REGRESA A PREGUNTAR EDAD DE NUEVO X--> VARIABLE DE FP PARA EDAD CONVIERTE DE WORD A FLOATING POINT

LIMPIA LOS DISPLAYS IMPRIME MENSAJE PARA ADQUIRIR SEXO

CAPTURA SEXO POR MEDIO DE INPUT2 LEE RAM+7, PARA VER S I CANCELO CON LA TE

CLA F1 SI SI SALTE SI NO COMPARA CONTRA 2 SI FUE MAYOR O IGUAL A 2, ERROR REGRESA

GUNTAR SEXO DE NUEVO, SI NO GUARDA SEXO

RESPECTIVA VARIABLE

PREGFIN PULX FIN DE ESTA SUBRUTINA PULB RTS ******

* SUBRUTINA: SIMULA Pregunta por los valores de reactancia y resis- * tencia al usuario y guarda los valores en sus * respectivas variables.

RESIST$ FCC 'INTRODUZCA RESISTENCIA --M- ' ******

-

- - M- ' FCB $10

FCB $10 REACT$ FCC 'INTRODUZCA REACTANCIA

SIMULA PSHB PSHX

SIMO JSR LDX IA JSR JSR LDAA A F1 CMPA BEQ JSR CPD BLS LDX JSR BRA

SIMI CPD BHS LDX JSR

CLRSCR #RESIST$

PRINT INDAT RAM

#IF1 KEY SIMFIN GETNUM 1650 SIMI IC E RRO R $ PRINT SIMO H400 SIM2 # ERROR $ PRINT

LIMPIA LOS DISPLAYS IMPRIME MENSAJE PARA PREGUNTAR RESISTENC

CAPTURA SU VALOR POR MEDIO DE INDAT LEE RAM, PARA VER SI CANCELO CON LA TECL

SI SI, SALTE SI NO COMPARA RES. CON 650

VALOR MAXIM0 DE RESISTENCIA, CONTINUA RES>650, IMPRIME ERROR REGRESA A PREGUNTAR RESISTENCIA

COMPARA RES. CON 400 SI RES>= RANGO CORRECTO, CONTINUA SI NO IMPRIME ERROR Y REGRESA A PREGUNTAR RESISTENCIA

SIM2

SIM3

S IM4

SIM5

SIMFIN

I*****

BRA

LDX JSR

JSR LDX

JSR JSR LDAA CMPA BEQ JSR CPD BLS LDX RE- JSR BRA CPD BHS RESA A LDX JSR BRA

LDX JSR

PULX PULB RTS

SIMO

IC RE S I S T WORDZFP

CLRSCR IC REACT $

PRINT INDAT RAM HFIKEY SIMFIN GETNUM #I 50 SIM4 #C E RRO R $

PRINT SIM3 # O SIM5

#C ERROR $ PRINT SIM3

#REACT WORDZFP

X-->VARIABLE DE FP PARA RESISTENCIA CONVIERTE DE WORD A FP

LIMPIA LOS DISPLAYS IMPRIME MENSAJE PARA ADQUIRIR REACTANCIA

CAPTURA EL VALOR POR MEDIO DE INDAT LEE RAM, PARA VER SI NO CANCELO CON F1

SI SI CANCELO, SALTE SI NO COMPARA REAC CON 150

VALOR MAXIM0 DE REACTANCIA REAC>150, IMPRIME MENSAJE DE ERROR Y REG

SA A PREGUNTAR REACTANCIA DE NUEVO

COMPARA REAC CON O SI REAC<O IMPRIME MENSAJE DE ERROR Y REG

PREGUNTAR POR LA REACTANCIA

X--> VARIABLE DE FP PARA REACTANCIA CONVIERTE DE WORD A FP

FIN DE LA RUTINA SIMULA

* SUBRUTINA: CONV Lee los 50 datos del CA/D y saca el promedio. * CONV(A:CANAL):D:DATO ****** CONV PSHX

PSHY

BSET OPTION $80 TAB ADDA #$20

STAA ADCTL

CLRA ADDD ##ADRI XGDY

LDX IC 50 CLRA CLRB

CONVI ADDB 0,y ADCA c O PSHA LDAA # 4 JSR DELAY PULA

SE ACTIVA CONVERTIDOR A/D A Y B=CANAL ACTUAL ESTABLECE EL TIPO DE CONVERSION CONTINUA

Y POR UN SOLO CANAL (EL ACTUAL)

D-->ADRl Y -->REGISTRO DE CANAL ACTUAL

X=50, SE TOMARAN 50 MUESTRAS DEL CAD

D+DATO DEL CAD

SE GUARDA A PARA RETARDO

HACE UN RETARDO DE 40 ms RECUPERA EL VALOR DE A

DEX BNE CONVI

LDX I# 50 IDIV XGDX EL

PULY PULX RTS

*

DECREMENTA CONTADOR DE MUESTRAS SI NO ES CERO ADQUIERE MAS MUESTRAS

SE HACE EL PROMEDIO DE 50 LECTURAS TOMADAS DE CA/D D= PROMEDIO DE LAS 50 MUESTRAS TOMADAS D

CAD FIN DE RUTINA CONV

****** * SUBRUTINA: ADQUIE Adquiere los valores de resistencia y de reactan cia *

* ****** ADQUIE PSHA

PSHB PSHX

JSR LDX JSR

LDAA JSR LDAA MUL LDX IDIV XGDX ADDD LDX JSR

LDAA JSR LDAA MUL LDX IDIV XGDX LDX JSR

PULX PULB PULA RT S

CLRSCR #CAPTURE$ PRINT

#O CONV %250

#255

1400 #RESIST WORDZFP

I 1 CONV ## 1 O0

#255

#RE ACT WORD 2 F P

leidos por el CA/D del impedancimetro, y los gua rda en sus respectivas variables.

LIMPIA LOS DISPLAYS IMPRIME MENSAJE DE CAPTURANDO

CANAL O (RESISTENCIA)

250 OHMS (400 A 650 OHMS)

RANGO DINAMICO

SE SUMA OFFSET DE 400 OHMS X-->VARIABLE DE FP PARA RESISTENCIA CONVIERTE DE WORD A FP

CANAL 1 (REACTANCIA)

100 OHMS ( O A 100 OHMS)

RANGO DINAMICO

X--> VARIABLE DE FP PARA REACTANCIA CONVIERTE DE WORD A FP

FIN DE LA RUTINA AQUIERE

****** * SUBRUTINA: MUESTRA Muestra en los displays los datos de resistencia

* y reactancia obtenidos por el CA/D. ****** MUEST$ FCC 'DATOS ADQUIRIDOS . . . I

MUESTRA PSHA FCB $10

PSHB PSHX PSHY

JSR LDX I- JSR

LDX JSR LDX JSR JSR JSR

LDX JSR LDX JSR JSR JSR

PULY PULX PULB PULA RTS

CLRSCR # MU E S T $

PRINT

#RES I ST FPZWORD #RES$ PRINT PUTINT GETCH

/# RE A C T FPZWORD ##REA$ PRINT PUTINT GETCH

LIMPIA LOS DISPLAY IMPRIME MENSAJE DE MUESTRA DE DATOS ADQU

RIDOS POR EL CAD

X-->VARIABLE DE FP PARA RESISTENCIA CONVIERTE DE FP A WORD IMPRIME RES=.. . ESCRIBE EL VALOR DE RES. ADQUIRIDO ESPERA TECLA PARA CONTINUAR

X-->VARIABLE DE FP PARA REACTANCIA CONVIERTE DE FP A WORD IMPRIME REA=. .. ESCRIBE EL VALOR DE REAC ADQUIRIDO ESPERA TECLA PARA CONTINUAR

FIN DE RUTINA MUESTRA

****** * SUBRUTINA: CALIBRA Muestra continuamente en los diplays el valor de

* ****** CALIB$ FCC

FCB CALIB2$ FCC

FCB

CALIBRA PSHA PSHB PSHX

JSR LDX JSR

JSR

JSR JSR LDAA MUL LDX IDIV XGDX ADDD JSR LDAA CMPA BEQ

CALO LDAA

resistencia y reactancia adquiridos por el CAD.

'CALIBRACION DE DATO DE RESISTENCIA. . . I

'CALIBRACION DE DATO DE REACTANCIA . . . ' $10

$10

CLRSCR # CAL I B $ PRINT

CLRSCR I# O CONV CLRSCR 1250

#I255

#I400 PUTINT HEAD TAIL CALO

LIMPIA LOS DISPLAYS IMPRIME MENSAJE DE CALIBRACION

LIMPIA LOS DISPLAYS CANAL O INICIALIZA EL CAD Y CAPTURA DATOS LIMPIA DISPLAYS 250 OHMS (400 A 650 OHMS)

RANGO DINAMICO

SE SUMA OFFSET DE 400 OHMS ESCRIBE EL VALOR ENTERO DE RESISTENCIA BUFFER DE TECLADO LLENO?

SI BUFFER VACIO REGRESA A DESPLEGAR RES1

S . STAA TAIL

JSR CLRSCR LIMPIA LOS DISPLAYS LDX # CAL I B 2 $ IMPRIME MENSAJE DE CALIBRACION PARA REAC

JSR PRINT

JSR

JSR JSR LDAA MUL LDX IDIV XGDX JSR LDAA CMPA BEQ

CALO LDAA

STAA

CLRSCR # 1 CONV CLRSCR # 1 O0

#255

PUTINT HEAD TAIL CALO

TAIL

LIMPIA LOS DISPLAYS CANAL O

100 OHMS ( O A 100 OHMS)

RANGO DINAMICO

D=DATO ADQUIRIDO POR EL CAD ESCRIBE EL VALOR ENTERO DE REACTANCIA BUFFER DE TECLADO LLENO?

SI BUFFER VACIO REGRESA A DESPLEGAR REAC

PULX FIN DE RUTINA DE CALIBRACION PULB PULA RTS

****** * SUBRUTINA: EJECUTA Ejecuta la formula seleccionada por el usuario ****** EJECUTA PSHA

PSHB PSHX PSHY

EJO JSR CLRSCR LIMPIA LOS DISPLAYS LDX %EJECUTA$ IMPRIME MENSAJE DE EJECUTAR FORMULA JSR PRINT

NOPRMT JSR LDAA CMPA BEQ CMPA BEQ CMPA BHS

INPUT2 RAM+7 # O NOPRMT /IF1 KEY EJEFIN #$OA NOPRMT

CMPA I 1 LA 1 BNE EJI JSR FORM1 BRA EJO E FOR- *

EJ? CMPA I/ 2 LA 2

BNE EJ2 JSR FORM2

ESPERA TECLA DE 1 AL 9 LEE RAM+7 (CONTIENE LA TECLA OPRIMIDA) COMPARA CON O NO SE VALE EL CERO COMPARA CON FI, SI SI ES F1 SALTE COMPARA CON LETRAS O TECLAS DE FUNCION SOLO FORMULAS DEL 1 AL 9

COMPARA CON 1 , SI ES IGUAL EJECUTA FORMU

S I NO COMPARA CON 2

REGRESA A IMPRIMIR MENSAJE DE ELECCION D

MULA A EJECUTAR CON LOS MISMOS DATOS COMPARA CON 2, sr ES IGUAL EJECUTA FORMU

S I NO COMPARA CON 3

BRA EJO E FOR- *

EJ2 CMPA # 3 LA 3

BNE EJ3 JSR FORM3 BRA E JO E FOR- *

EJ3 TODOS

EJ4

EJ5

EJ6

EJ7

EJ8

EJEFIN

******

CMPA

BNE JSR BRA

CMPA BNE JSR JMP

CMPA BNE JSR JMP

CMPA BNE JSR JMP

CMPA BNE JSR JMP

JSR JMP

PULY PULX PULB PULA RTS

# 4

E 54 FORM4 E JO

# 5 EJ5 FORM5 EJO

# 6 EJ6 FORM6 EJO

# 7 EJ7 FORM7 EJO

# 8 E 58 FORM8 EJO

FORM9 EJO

REGRESA A IMPRIMIR MENSAJE DE ELECCION D

MULA A EJECUTAR CON LOS MISMOS DATOS COMPARA CON 3, SI ES IGUAL EJECUTA FORMU

SI NO COMPARA CON 4

REGRESA A IMPRIMIR MENSAJE DE ELECCION D

MULA A EJECUTAR CON LOS MISMOS DATOS. HACE LO MISMO QUE LAS ANTERIORES Y PARA

LOS NUMEROS HASTA EL 9

FIN DE RUTINA DE EJECUCION DE FORMULAS

* SUBRUTINA: FORM1 FFM= -4.033+0.734*HTA2/RES +O.O96*Xc +0.116*WT + * +0.878(SEXO) ****** FORM1 PSHA

PSHB PSHX PSHY

LDX i# RE S I S T X-->VARIABLE DE FP DE RESISTENCIA LDY I# F L O AT 1 Y-->VARIABLE AUX DE FP JSR COPY SE COPIA A FLOAT1 EL VALOR DE RESISTENCI A JSR RECIP FLOATI=I/RES

LDX I/ AL TU R A X-->VARIABLE DE FP DE ALTURA

JSR JSR

LDX JSR

LDX JSR

LDAA BEQ LDX JSR

FORMll LDX LDY JSR

LDX LDY JSR LDX JSR

LDX LDY JSR

LDX LDY JSR LDX JSR

LDX JSR LDX JSR

LDX JSR LDX JSR JSR

JSR

MULTI MULTI

lCTEl9 MULTI

I/ CTE 2 4 RESTA

SEXO FORM1 1 ICTE2 1 SUMA

%FLOAT1 # US E RF P 1 COPY

# RE A C T #/FLOAT1 COPY ICTE9 MULTI

#FLOAT1 #USERFPS COPY

#PESO %FLOAT 1 COPY #CTE 1 O MULTI

lUSERFPl SUMA #/US ERF P 2 SUMA

#/FLOAT1 FP2BIN #FORM $ PRINT PUTNUM

GETCH

PULY PULX PULB PULA RTS

****** * SUBRUTINA: FORM2 ****** 2

FORM2 PSHA PSHB PSHX

MULTIPLICA ALTURA POR 1/RES FLOATl=HT^Z/RES

X-->CTE19 FLOAT1=0.734*HTA2/RES

X-->CTE24 FLOAT1=-4.033+0.734*HTA2/RES

A=SEXO ( O o 1 ) SI SEXO=O (FEM) SALTA A FORMll SI NO X-->CTE21 MASC-->FLOAT1+=0.878

X-->FLOATl Y-->USERFPl USERFPl=FLOATl

X-- >REACT Y-->FLOATl FLOATl=REACT X-->CTE9 FLOATl=REACT*0.096

X-->FLOATl Y-->USERFP2 USERFPZ=REACT*0.096

X-->PESO Y-->FLOATl

X-->CTE10 FLOATl=PESO

FLOATl=PESO*O.l16

X-->USERFPl (ler FACTOR GUARDADO) SE SUMA A FLOATl X-->USERFP2 (2do FACTOR GUARDADO) SE SUMA A FLOATl Y FLOATl=FFMl

X-->FLOATl (RESULTADO) CONVIERTE DE FP A BINAR10 ESCRIBE FFM=...

ESCRIBE EL RESULTADO (ENTERO Y FRACCION)

ESPERA TECLA

FIN DE LA FORMULA 1

FFM=[0.734*HTn2/RESIS] +0.116*Wt +O.O96*Xc -3.15

PSHY

LDX LDY JSR JSR

LDX JSR JSR

LDX JSR

LDX JSR

LDX LDY JSR

LDX LDY JSR LDX JSR

LDX LDY JSR

LDX LDY JSR LDX JSR

LDX JSR LDX JSR

LDX A JSR LDX JSR JSR JSR

I RE S I S T #FLOAT 1 COPY RECIP

# A L T UR A MULTI MULTI

#CTE 1 9 MULTI

tCTE23 RESTA

#FLOAT 1 lCUSERFP1 COPY

#REACT ##FLOAT 1 COPY # CTE 9 MULTI

d# F L O AT 1 #US ERF P 2 COPY

#PESO ##FLOAT1 COPY lCTE 1 O MULTI

#USERFPl SUMA #US E RF P 2 SUMA

#FLOAT1

FP2BIN #FORM$ PRINT PUTNUM GETCH

PULY PULX PULB PULA RTS

*****a * SUBRUTINA: FORM3 ****** FORM3 PSHA

PSHB

FLOATl=l/RES

USERFPl=FLOATl

FLOATl=REACT

FLOATl=REACT*0.096

USERFP2=REACT*0.096

FLOATl=PESO

FLOATl=PESO*O.116

FLOAT1 =FFM1

EL RESULTADO SE PASA DE FP A BINAR10 PAR

PODER SER ESCRITO EN LOS DISPLAYS

ESPERA TECLA DE FUNCION

FIN DE FORMULA 2

FFM=[O.827*HT*2/RESIS] +5.214

1

PSHX PSHY

LDX LDY JSR JSR

LDX JSR JSR

LDX JSR

LDX JSR

LDX JSR LDX JSR JSR JSR

PULY PULX PULB PULA RTS

#RESIST #FLOAT 1 COPY RECIP

I AL T U R A MULTI MULTI

#CTESO MULTI

ICTE25 SUMA

%FLOAT1 FP2BIN #FORM$ PRINT PUTNUM GETCH

FLOATl=l/RES

FLOAT1=HT62/RES

FLOAT1=0.827*HT62/RES+5.Zl4

X-->RESULTADO LO CONVIERTE DE FP A BINAR10

ESCRIBE EL RESULTADO ESPERA TECLA

FIN DE LA FORMULA 3

:***** SUBRUTINA: FORM4 FFM=0.0132*Ht62 -0.04394*HtA2/R +0.3052*Wt -

: c*ck.k*kk

'ORM4 PSHA PSHB PSHX PSHY

LDX LDY JSR LDX JSR LDX LDY JSR

LDX LDY JSR JSR

LDX JSR JSR LDX JSR LDX LDY

-0.1676*EDAD +22.66827

#EDAD #FLOAT1 COPY FLOATl=EDAD #CTE 1 3 MULTI FLOATl=EDAD*0.1676 #FLOAT1 #USERFPl COPY USERFPl=FLOATl

#RESIST #FLOAT1 COPY RECIP FLOATl=l/RES

I/ AL T UR A MULTI MULTI FLOATl=HT*Z/RES #CTE7 MULTI FLOAT1=0.04394*HTA2/RES #FLOAT 1 I/ US E RF P 2

JSR COPY FLOATI=USERZFP

LDX LDY JSR JSR LDX JSR LDX JSR

I# AL T U R A %FLOAT 1 COPY MULTI FLOAT1=HtA2 #CTE4 MULTI FLOAT1=0.0132*HtA2 #CTE3O SUMA FLOATI=O.O132*Ht^2 +22.66827

LDX ##FLOAT 1 LDY #US ERF P 3 JSR COPY USERFP3=FLOATI

LDX LDY JSR LDX JSR LDX JSR LDX JSR LDX JSR

##PESO #FLOAT 1 COPY FLOATI=PESO #CTE 1 4 MULTI FLOATI=PES0*0.3052 tUSERFP3 SUMA FLOATI=PES0*0,3052+USERFP3 I US E RF P 2 RESTA FLOATI=PESO*0.6284+USERFPl-USERFP2 ## US E RF P 1 RESTA FLOATI=FFM

LDX ## F L O AT 1 EL RESULTADO SE CONVIERTE DE FP A BINAR1 O JSR FP2BIN Y SE DESPLEGA LDX ##FORM $ JSR PRINT JSR PUTNUM JSR GETCH ESPERA TECLA

PULY PULX PULB PULA RTS

FIN DE FORMULA 4

****** * SUBRUTINA: FORM5 FFMO=0.0006636*HtA2 -0.02117*resis +0.6284*Wt- * -0.1238*edad +933285

FORM5 PSHA PSHB PSHX PSHY

*****

LDX LDY JSR LDX JSR LDX LDY JSR

%EDAD I FLOAT 1 COPY FLOATl=EDAD #CTEI 1 MULTI FLOATl=EDAD*0.1238 #FLOAT 1 IIUSERFPI COPY USERFPI=FLOATI

LDX I# R E S I S T LDY #FLOAT 1

JSR LDX JSR LDX LDY JSR

LDX LDY JSR JSR LDX JSR LDX JSR

LDX LDY JSR

LDX LDY JSR LDX JSR LDX JSR LDX JSR LDX JSR

LDX JSR LDX JSR JSR JSR

COPY #CTE5 MULTI #FLOAT 1 i'C U S ERF P 2 COPY

# A L T UR A #FLOAT 1 COPY MULTI #CTE2 MULTI #CTE27 SUMA

I F L OAT 1 11 US ERFP 3 COPY

#PESO #FLOAT 1 COPY l#CTE 18 MULTI #US ERF P 3 SUMA #US ERF P 2 RESTA f# US E RF P 1 RESTA

#FLOAT 1 FP2BIN ##FORM$ PRINT PUTNUM GETCH

FLOATI=RESIST

FLOAT1=RESIST*0.02117

USERFP2=FLOATI

FLOAT1=HtA2

FLOATI=O.O006636*Ht*2

FLOAT1=0.0006636*HtA2 +9.33285

USERFP3=FLOATI

FLOAT1 =PESO

FLOATI=PESO*0.6284

FLOATI=PES0*0,6284+USERFP3

FLOATl=PESO*0.6284+USERFPl-USERFP2

FLOATI=FFM

PULY PULX PULB PULA RTS

****** * SUBRUTINA: FORM6 FFM=0.00085*HtA2+0.3736*Wt-O.O2375*Res-O.l53l*ed

* +17.7868

FORM6 PSHA PSHB PSHX PSHY

LDX %EDAD LDY JSR COPY LDX #CTE 12 JSR MULTI LDX #FLOAT 1

ad

******

I# F L O AT 1 FLOATI=EDAD

FLOATI=EDAD*0.1531

LDY %USERFPI JSR COPY USERFPI=FLOATI

LDX LDY JSR LDX JSR LDX LDY JSR

LDX LDY JSR JSR LDX JSR LDX JSR

/#RESIST #FLOAT1 COPY FLOATI=RESIST IICTE6 MULTI FLOATI=RESIST*0.02375 #FLOAT1 ##US ERF P 2 COPY USERFPZ=FLOATI

#AL T U R A #FLOAT 1 COPY MULTI FLOAT1=HtA2 ICTE3 MULTI FLOAT1=0.00085*Htn2 #CTE29 SUMA FLOAT1=0.00085*Htn2 +I7 7868

LDX %FLOAT1 LDY JSR COPY USERFP3=FLOATI

#I US ERF P 3

LDX LDY JSR LDX JSR LDX JSR LDX JSR LDX JSR

#PESO #FLOAT 1 COPY FLOATI=PESO #CTE 1 6 MULTI FLOATl=PES0*0.3736 BUS ERF P 3 SUMA FLOATI=PES0*0.3736+USERFP3 %USERFPZ RESTA FLOATl=PESO*0.6284+USERFPl-USERFP2 lUSERFP1 RESTA FLOATI=FFM

LDX #FLOAT1 JSR FPZBIN LDX I# FORM $ JSR PRINT JSR PUTNUM JSR GETCH

PULY PULX PULB PULA RTS

****** * SUBRUTINA: FORM7 Db=1.1554-[0.0841*(Wt*Res)/HtA2] **I***

FORM7 PSHA PSHB PSHX PSHY

LDX #ALTURA LDY #FLOAT 1 JSR COPY FLOAT1 =Ht

JSR JSR LDX JSR LDX JSR LDX JSR

LDX LDY JSR

LDX LDY JSR LDX JSR

LDX JSR LDX JSR JSR JSR

PULY PULX PULB PULA RTS

******

MULTI FLOAT1=HtA2 RECIP FLOAT1=1/HtA2 #RES I ST MULTI #PESO MULTI FLOATI=Wt*Resis/Ht^Z ICTE8 MULTI FLOAT1=Wt*R/HtA2*0.0841

#FLOAT 1 IC US ER F P 1 COPY

FLOATI=USERFPI

ICTEZZ #FLOAT1 COPY lCUSERFP1 RESTA FLOAT1 =DB

#FLOAT1 FPZBIN IDB$ PRINT PUTNUM GETCH

-

* SUBRUTINA:FORM8 ****** FORM8 PSHA

PSHB PSHX PSHY

LDX LDY JSR JSR

LDX JSR JSR

LDX JSR

LDX JSR

LDX LDY JSR

LDX LDY

FFM=6.493 +0.4936*HtA2/R +0.332*Wt

IRES I S T #FLOAT1 COPY RECIP FLOATl=l/RES

# AL T UR A MULTI MULTI FLOAT1=HTA2/RES

#CTEl7 MULTI FLOAT1=0.4936*HT"Z/RES

# C TE 2 6 SUMA FLOAT1=6.493+0.4936*HTAZ/RES

#FLOAT1 lUSERFP1 COPY USERFPI=FLOATI

#PESO #FLOAT1

JSR COPY FLOATI=PESO LDX 11CTE15 JSR MULTI FLOATI=PESO*0.332

LDX #USERFPI JSR SUMA FLOATI=FFM

LDX ##FLOAT1 JSR FPZBIN LDX #FORM$ JSR PRINT JSR PUTNUM JSR GETCH

PULY PULX PULB PULA RTS

****** * SUBRUTINA: FORM9 FFM=0.0000698*Htn2/R +12.9 ****** FORM9 PSHA

PSHB PSHX PSHY

LDX LDY JSR JSR

LDX JSR JSR

LDX JSR

LDX JSR

LDX JSR LDX JSR JSR JSR

I RE S I S T #FLOAT 1 COPY RECIP FLOATI=I/RES

I1 AL T UR A MULTI MULTI FLOATl=HT*Z/RES

#CTE 1 MULTI FLOAT1=0.0000694*HTn2/RES

BCTE28 SUMA FLOAT1=12.9+0.0000694*HTA2/RES

#FLOAT1 FPZBIN #FORM$ PRINT PUTNUM GETCH

PULY PULX PULB PULA RT S

****** * SUBRUTINA: INPUT2 Pregunta 2 letras, las pone en el buffer de displa

* Fl=Cancelar. (borra ambos displays y pone $10 (FI) Y

* en el 50. display) ENTER= Acepta.

INPUT2 PSHA PSHB PSHX

******

LDAA { I ' ' ESCRIBE ESPACIO EN EL SEXTO DISPLAY LDX /I 6 JSR PUTIN INX INCREMENTA DISPLAY JSR PUTIN PONE CURSOR EN EL 7 DISPLAY STX CURSOR

INLOOP2 JSR GETCH LEE CARACTER CMPA #EN TER FUE ENTER? BEQ FININP SI-->ADIOS CMPA #IF1 KEY FUE FI? BNE IN2 NO-->SIGUE ADELANTE STAA RAM+ 7 SI-->CANCELA BRA FININPZ

IN2 CMPA I$OA FUE ( 2 6 MAS) ? BHS INLOOP2 SI--> IGNORALO, LEE OTRO LDX CURSOR CPX I 8 SE ACABO EL ESPACIO? BNE NOSCROLL 2 NO-->NO HAGAS SCROLL DEX STX CURSOR CURSOR EN 70. DISPLAY

NOSCROLL2 JSR PUTCH IMPRIME CARACTER BRA INLOOP2 LEE OTRO

FININP LDAA / I ' ' A=ESPACIO CMPA #RAM+7 ESTA LIBRE EL 70 . DISPLAY? BEQ INLOOP2 SI-->NO PUEDES SALIR AUN

PULB PULA RTS

FININPZ PULX NO-->VAMONOS

****** * SUBRUTINA: PUTDAT Pone de manera adecuada un dato en el display de d atos * PUTDAT(A:dato) ******

PUTDAT PSHA PSHB PSHX

CLRB LSRD A LSRD

LSRD B LSRD LDX I# 6 JSR PUTIN LSRB

4 LSRB

LIMPIA B, B=O HACE 4 CORRIMIENTOS DE D HACIA LA DERECH

PARA PASAR LOS 4 LSB DE A LOS 4 MSB DE B

Y A TIENE EN SU PARTE BAJA LOS 4 BITS MS

PARA REPRESENTACION ASCII SE ESCRIBE A EN EL DISPLAY 6

SE OBTIENE REPRESENTACION ASCII PARA LOS

BITS RESTANTES YA QUE SOLO SON 2 NUMEROS

LSRB LSRB TBA

INX JSR PUTIN

PULX PULB PULA RTS

****** * SUBRUTINA: INDAT

pone * ****** INDAT

IN44 TES

INPUT

GABY

PSHA PSHB PSHX

LDAA LDX STX JSR

INX CPX BNE JSR CMPA BEQ CMPA BNE JSR STAA BRA CMPA BHS ERO LDX CPX BNE ALOR JSR VALOR

NOSCROLL JSR BRA

INPUTl LDAA

CMPA N 4 BEQ ALTE

IS-

8 ' ' #I O CURSOR PUTIN

1, 4 IN44 GETCH #,ENTER INPUTl ##F 1 KEY GABY CLRSCR RAM FININ4 #C$OA INPUT

CURSOR # 4

SE TRANSFIERE DE B A A PARA PONERLOS EN

EL DISPLAY QUE SIGUE

FIN DE LA RUTINA PUTDAT

Pregunta por los datos (4 digitos [ 0 . . 9 ] ) y los

en el buffer de display. Si flkey cancela edicio n.

IMPRIME ESPACIO EN DISPLAY CERO

Y PONE EL CURSOR AH1 ESTO LO HACE PARA LOS 4 DISPLYAS SIGUIEN

ESPERA TECLA FUE ENTER? SI, VETE A INPUTl NO, COMPARA CON F1 NO ES F1, VETE A GABY SI ES GUARDA F1 EN RAM FUE FlKEY, SE CANCELA SALTE

FUE LETRA O TECLA DE FUNCION, ESPERA NUM

Y PINTA CURSOR EN EL MISMO SITIO COMPARA CONTRA 4

NOSCROLL NO ES IGUAL, IMPRIME TECLA Y GUARDA EL V

SCROLL HAZ SCROLL, E IMPRIME TECLA Y GUARDA EL

PUTCH INPUT

#$20 COMPARA ESPACIO CON EL CONTENIDO DEL 4 D

RAM+3 PLAY, SI SON IGUALES TE ESPERAS, PUES SO

INPUT NUMEROS Y TE FALTAN, SI NO SON IGUALES S

FININ4 PULX PULB PULA

FIN DE LA RUTINA

RTS

****** * SUBRUTINA: GETNUM * * GETNUM: D:WORD ****** GETNUM PSHX

TSX DEX DEX

LDAA LDAB MUL LDAA MUL STD

LDAA LDAB MUL ADDD STD

LDAA LDAB MUL ADDD STD

CLRA LDAB ADDD

El dato que está en el buffer de display lo convierte en un word y lo pone en el acumulador D.

X-->STACK

X-->WORD LOCAL

MI LLARES

CENTENAS

DECENAS

UNIDADES

PULX RTS

****** * SUBRUTINA: PUTNUM Convierte un número de punto f i j o en la representa

* adecuada para el buffer de display y lo pone allí. ción

* PUTNUM(A:int; B:frac)

PUTNUM PSHA PSHB PSHX PSHY

******

PSHX PSHX TSY

SE RESERVA ESPACIO EN LA PILA PARA 2 WORD Y--> DOS WORD LOCALES

STD 0,y LDAA # 1 o MUL LDX ## 7 JSR PUTIN

DEX LDD 0,y TAB CLRA

STX PUTNI LDX

IDIV STX TBA LDX JSR DEX STX LDD BNE

2,y CONTADOR=6 I110

2,y PUTIN IMPRIME DIGIT0

* Enciende el punto decimal. PARCHE: el de soto debe ser I11 en vez de 116

LDAA ADDA STAA LDAA ANDA LDAB ADDB STAB STAA

PULX PULX

IC RDD S PLY t 1 LEER EL ler DISPLAY COMMS DATOS 1$7F IC W RD S P LY IC 1 COMMS DATOS

SE DESTRUYEN LAS VARIABLES LOCALES

PULY PULX PULB PULA RTS

****** * SUBRUTINA: PUTINT Convierte un número entero en D en la representaci

* adecuada para el buffer de display y lo pone allí. 6 n

* PUTNUM(D:WORD) ****** PUTINT PSHA

PSHB PSHX PSHY

PSHX PSHX TSY

SE RESERVA ESPACIO EN LA PILA PARA 2 WORD Y--> DOS WORD LOCALES

STD 0,y GUARDA EL NUMERO EN WORD0 LDX #C 7 CONTADOR=7 (DISPLAY) STX 2 , y GUARDA EL CONTADOR EN WORD1

PUTNI LDX %IO IDIV STX 0,y

TBA LDX 2,y JSR PUTIN IMPRIME DIGIT0 DEX DECREMENTA DISPLAY STX 2,y GUARDA EL VALOR ACTUAL DE DISPLAY LDD 0,y BNE PUTN 1

* Enciende el punto decimal. PARCHE: el de soto debe ser #O en vez de IC7 LDAA IC RDD S PLY ADDA IC O LEER EL ler DISPLAY STAA COMMS LDAA DATOS ANDA #$7F LDAB # WRD S PLY ADDB I O STAB COMMS STAA DATOS

PULX PULX

PULY PULX PULB PULA RTS

****** * SUBRUTINA: CLRSCR *I****

CLRSCR PSHA PSHX

LDX iC o LDAA % '

INX CPX I 8 BNE CLRI LDX IC O STX CURSOR

CLRI BSR PUTIN

PULX PULA RTS

****** * SUBRUTINA: PRINT * * PRINT (X:^cadena) ****** PRINT PSHA

PSHB PSHX

PRTLOOP LDAA 0,x CMPA #$ I0 BEQ FINPRT

SE DESTRUYEN LAS VARIABLES LOCALES

Limpia pantalla y pone cursor al inicio

CONTADOR DE DISPLAYS=O UN ESPACIO ( ' ' ) PONE ESPACIO EN EL DISPLAY INCREMENTA DISPLAY SI NO ES IGUAL A 8 PONE ESPACIO SI SI ES IGUAL SE SALE

FIN DE LA RUTINA

Imprime una cadena en pantalla pausadamente la cadena debe finalizar con el caracter $10 (FI KEY)

LEE LETRA FIN DE CADENA? SI-->FINPRT

PSHA LDAA #20 JSR DELAY RETARDO DE . 2 s PULA BSR PUTCH IMPRIME LETRA INX SIGUIENTE LETRA BRA PRTLOOP REPITE

FINPRT PULX PULB PULA RTS

*I****

* SUBRUTINA: PUTCH Pone un caracter (ac.A) en el display en la posici

* actual del cursor, si no cabe hace SCROLL * 'PUTCH (A:ascii) PUTCH PSHX

on

****** LDX CURSOR X= POSICION DEL CURSOR CPX {# 8 ESTA HASTA EL FINAL? BNE CUROK NO ---> CUROK BSR SCROLL SI ---> HAZ SCROLL DEX x=7

INX STX CURSOR AVANZA CURSOR PULX RTS

CUROK BSR PUTIN PON ac.A EN DISPLAY

****** * SUBRUTINA: SCROLL Recorre el contenido de los displays a la izquier

* desde la pos. O hasta la (CURSOR-I) * PRECAUCION: El cursor debe estar en el rango [2;8] (cerrado) * Hace scroll con todo y cursor. ****** SCROLL PSHA

PSHX

da

LDX

DEX BSR INX INX CPX BNE DEX LDAA BSR STX

SLOOP LDAA /C 1 RAM, X

PUTIN

CURSOR SLOOP

IC' ' PUTIN CURSOR

X-->Zo.DISPLAY LEE POS n

LO PONE EN EL n-I

AVANZA n AUN NO ALCANZAMOS AL CURSOR ? NO ---> SLOOP SI ---> RETROCEDE 1

PONE ESPACIO EN LA NUEVA POS. LIBRE PONE EL CURSOR AH1

PULX PULA RTS

******

* SUBRUTINA: DECODE7 Decodifica de Ascii a 7-Segmentos * * DECODE7(A:ascii) : A:7-seg ****** DECODE7 PSHX

PSHB TAB CLRA ADDD #/TABLA XGDX LDAA 0,x COMA PULB PULX RTS

ASCII EN D D-->POS EN TABLA X=POS EN TABLA LEE 7-SEGM LO NIEGA PARCHE PARA SOTO

****** * SUBRUTINA: PUTIN pone un caracter A en la posición X de los displa YS * X en [0..7] * PUTIN (A:ascii,X:pos) ******

PUTIN PSHA PSHB PSHX

PSHA XGDX CLRA ANDB #$O7 PSHB XGDX PULB

GUARDA LA LETRA D=POS

DEBE ESTAR EN [0..7]

X=POS B=POS

*Parche para el sistema de Soto NEGB ADDB #I 7 LOS DISPLAYS ESTAN INVERTIDOS

*Fin del parche

LDAA #/ WRD S PLY ABA STAA COMMS ESCRIBIR EN LA POSICION B PULA RECUPERO LA LETRA TAB B=A=LETRA BSR DECODE7 PASALA A 7-SEG STAA DATOS ESCRIBELA EN EL DISPLAY STAB RAM, X Y EN LA COPIA

PULX PULB PULA RTS

****** * SUBRUTINA: GETCH saca un caracter del buffer del teclado (de TAIL)

* hace efecto de cursor si el buffer esta vacío y e

* cursor dentro de los displays. * GETCH: A:ascii ******

1

GETCH PSHX PSHB

LDX POLLBUFF SEI

LDAA CMPA CLI BNE CPX BEQ LDAA

PSHA LDAA BSR LDAA JSR PULA BSR LDAA JSR BRA

TOMALO SEI TAB CLRA XGDX LDAA LDAB INCB CMPB BNE LDAB

TOPOK STAB CLI PULB PULX RTS

CURSOR

TAIL HEAD

TOMALO 1/ 8 POLLBUFF RAM, X

I I - '

PUTIN 1/25 DELAY

PUTIN 1/25 DELAY POLLBUFF

0,x TAIL

IKTOP+ 1 TOPOK lCKBOT TAIL

****** * SUBRUTINA: ADDKEY * * * ADDKEY(A:ascii) ****** ADDKEY PSHX

PSHB

PSHA LDAA HEAD INCA CMPA #KTOP+ 1 BNE HEADOK LDAA #KBOT

HEADOK CMPA TAIL BNE BUFFOK PULA PULB

X=CURSOR APAGA INTERRUPCIONES A=TAIL BUFFER VACIO? ACTIVA INTERRUPCIONES NO-->TOMALO CURSOR AFUERA? SI--> HAZ POLLING NO--> EFECTO CURSOR

GUARDA LETRA EN PILA CURSOR PONE '- ' EN LA POS X 250ms RETARDO 250ms RECUPERA LETRA LA VUELVE A PONER

RETARDO 250ms HAZ POLLING

QUITA INTERRUPCIONES

D-->CASILLA CON DATO X-->CASILLA CON DATO LEE ASCII B=TAIL AJUSTA TAIL ME PASE? NO-->TOPOK SI-->CORRIGE GUARDA NUEVO TAIL

Añade una letra (ascii) al buffer del teclado ajustando los punteros HEAD y TAIL y hace BEEP

si no cabe hace SBEEP ,

GUARDA ASCII EN LA PILA LEE TOPE INCREMENTA LLEGO AL MAXIM0 NO-->HEADOK SI-->A=FONDO DEL BUFFER ESTA LLENO EL BUFFER? NO--->BUFOK

PULX RTS FUERA DE AQUI, NO CUPO LA LETRA.

BUFFOK PSHA CLRA LDAB HEAD XGDX PULA STAA HEAD PULA

PULB PULX RTS

STAA 0,x

****** * SUBRUTINA: BADDKEY el *

* BADDKEY ****** BADDKEY PSHB

LDAB TAIL DECB CMPB IIKBOT- 1 BNE TAILOK LDAB lKTOP

TAILOK STAB TAIL PULB RTS

GUARDA NUEVO TOPE

D=CASILLA VACIA X=CASILLA VACIA RECUPERA NUEVO TOPE LO ESCRIBE EN HEAD RECUPERA ASCII LO ESCRIBE EN LA CASILLA VACIA

Recupera la Última letra extraída del buffer d

teclado

LEE TAIL DECREMENTA LLEGO AL FONDO NO-->TAILOK SI-->B=FONDO DEL BUFFER ESCRIBE NUEVO TAIL

****** * INTERRUPCION: RAI-IRQ * Lee el Teclado, decodifica el teclazo,

y lo añade al buffer del teclado. * (RAI = Rutina de Atención a Interrupción ) * (IRQ = Interrupt Request) ****** RAI-IRQ

LDAA IIRDKBD LEER TECLADO STAA COMMS LDAA DATOS LEE EL SCANCODE ANDA #$3F NO USO CTRL NI SHIFT BSR DECODEKB DECODIFICALO BSR ADDKEY METELA AL BUFFER DEL TECLADO LDAA #EO1 STAA COMMS AVISA FIN DE INTERRUPCION RT I

****** * SUBRUTINA: DECODEKB Convierte el SCANCODE en ASCII * Sintaxis: * DECODEKB(A:Scancode): A:ascii

DECODEKB ******

PSHX PSHB LDX I/ KB TAB LA TAB B=SCANCODE ABX X-->ASCI I LDAA 0,x LEE ASCII PULB

PULX RTS

****** * SUBRUTINA: DELAY Hace un retardo utilizando OC4 mediante polling

* DELAY(A:Centésimas de seg) * ****** DELAY PSHA

PSHB CMPA BNE INCA

DLYLOOP PSHA LDD BCLR ADDD STD BRCLR PULA DECA BNE

IC O DLYLOOP

I 2 500 TFLGI %I 1101 1 1 1 APAGA OC4F TCNT LE SUMA LA CUENTA: D=D+CUENTA TOC4 LO ESCRIBE EN OC4 TFLGI $10 * POLLING

DLYLOOP

PULB PULA RTS

****** * SUBRUTINA: DLYIS Hace un retardo de 1 segundos usando DELAY ****** DLYIS PSHA

LDAA I/ 1 200 BSR DELAY PULA RTS

*********I********* UNIDAD DE PUNTO FLOTANTE (inicio) ****************** ****** * SUBRUTINA: WORDZFP Convierte un Word a punto flotante. * * WORDZFP(D:WORD,X":FLOAT) ****** WORD2FP PSHA

PSHB

PSHA LDAA STAA PULA CPD BNE JSR BRA

WZFPO BITA BNE ASLD DEC

#I 5 MULAUX

I O WSFPO CLEAR WSFPFIN # $ 8 0 WZFPI

MULAUX

Verifica que el numero no sea cero Es cero? no, vete a wZfpO Si, pon ceros en el PF Salte EL MSB=O? NO ES CERO, SALTE se recorre D es cero decrementa B y repite

BRA W2FPO

STD FRAC 1 , X CLR FRAC3, X LDAA MULAUX ADDA lf127 STAA EXP, X

W2FP1 ANDA 1$7F

WZFPFIN PULB PULA RTS

SIGNO POSITIVO,(PONE O EN EL MSB)

****** * SUBRUTINA: FP2BIN Conv,erte punto otante a binario * se devuelve en A:entero, B:fraccion

* FPZBIN(X":FLOAT): A:INTBYTE,B:FRACBYTE

FPZBIN PSHX PSHY

* ******

LDY JSR I LDX LDAB BNE CLRA CLRB BRA

FP2BIN1 SUBB CMPB BGE CLRA BSET

FPZBO INCB BEQ CLC JSR BRA

FP22 LDAB BRA

FPZBINZ BGT LDAA JSR LDAB BRA

FP2BIN3 CLC JSR LDAA

FPZBIN4 CLC JSR ROLA DECB BNE LDAB

##FPAUX COPY

#FPAUX EXP, X FP2BIN1

FPZBINX #127 # O FPZBINZ

FRAC1,X $80

FP22

ROTR FP2BO FRAC 1 , X FPZBINX FP2BIN3 lf 1 ROTL FRACl ,X FPZBINX

'Y' APUNTA AL AUXILIAR SE HACE UNA COPIA DEL NUMERO FLOTANTE AH

'Xi APUNTA AL AUXILIAR TOO B=EXPONENTE EXP<>O?, VETE A FP2BIN1 EXP=O?, A=O B=O (FRACCION=O) SALTE B=EXP- 127 AH1 ESTA EL DETALLE CHATO! B>=O?, VETE A FP2BIN2 B<O, ENTONCES A=O (ENTERO) PONE EL "HIDDEN BIT'' SE HIZO CORRIMIENTO

LIMPIA CARRY

B=FRACCION SALTE B>O?, VETE A FP2BIN3 B=O, ENTONCES A=l

B=FRACCION SALTE

B>O ROTL 11 1

LIMPIA EL CARRY ROTL

FP2BIN4 FRACl ,X B=FRACCION

FPZBINX PULY PULX

RTS

****** * SUBRUTINA: FPZWORD Convierte un numero en formato de punto flotante

* en word, solo la parte entera. * * FPZWORD(X":FLOAT):D:WORD ****** FPZWORD PSHX

PSHY

LDY JSR I LDX LDAB BNE CLRA CLRB BRA

FPZWORI SUBB CMPB BGE CLRA CLRB BRA

FPZWORZ BGT LDD BRA

FPZWOR3 STAB CLC JSR LDD

FPZBIN4 CLC JSR ROLB ROLA DEC BNE

#FPAUX COPY

lFPAUX EXP, X FPZWORI

FPZWORX 6 1 27 I O FPZWORZ

FPZWORX FPZWOR3 11 1 FPZWORX

EXP , X

ROTL # 1

ROTL

EXP, X FPZBIN4

'Y' APUNTA AL AUXILIAR SE HACE UNA COPIA DEL NUMERO FLOTANTE AH

'X' APUNTA AL AUXILIAR TOO B=EXPONENTE EXP<>O?, VETE A FPZWORI EXP=O?, D=O

SALTE B=EXP-127 AH1 ESTA EL DETALLE CHATO! B>=O?, VETE A FPZWORZ B<O, ENTONCES D=O (ENTERO=O)

SALTE B>O?, VETE A FPZBIN3 B=O, ENTONCES D=l SALTE

GUARDA EL EXPONENTE B>O

BIT ESCONDIDO EN D

LIMPIA EL CARRY

SE METEN LOS BITS ENTEROS EN D

FPZWORX PULY PULX RTS ******

* SUBRUTINA: ROTL Rotación a la izquierda de una variable de 3 byt

* a la que apunta X.

* ROTL(X",Cf): Cf (Cf: Carry Flag)

ROTL ROL 2,x ROL 1 ,x ROL 0,x RTS

es

* *****

****** * SUBRUTINA: ROTR Rotación a la derecha de una variable de 3 bytes

* * * ROTR(X*,Cf): Cf

ROTR ROR 0,x ROR 1 ,x ROR 2,x RTS

*****

****** * SUBRUTINA: CLEAR * * CLEAR(X*:DWORD) ****** CLEAR PSHA

PSHB

CLRA CLRB STD 0,x STD 2,x

PULB PULA RTS

****** * SUBRUTINA: SUMA3 * * SUMA3(XA,YA):X" ****** SUMA3 PSHA

PULA RTS

****** * SUBRUTINA: MULTI3 * *

a la que apunta X.

(Cf: Carry Flag)

Limpia el dword apuntado por X.

Suma dos numeros de tres bytes con acarreo (X"+Y*+Cf) y pone el resultado en XA.

*MULTI3(Xn,Y*:FLOAT):MULAUX ****** MULTI3 PSHA

PSHB PSHX PSHY

PSHX LDX I/ MULA U X JSR CLEAR

Multiplica dos numeros de 3 bytes (XA*YA) y pone el resultado en MULAUX.

PULX

LDAA LDAB MUL STD

LDAA LDAB MUL ADDB ADCA STD

LDAA LDAB MUL ADDB ADCA STD LDAA ADCA STAA

LDAA LDAB MUL ADDB ADCA STD LDAA ADCA STAA

LDAA LDAB MUL ADDB ADCA STD LDAA ADCA STAA

LDAA LDAB MUL ADDB ADCA STD LDAA ADCA STAA

LDAA LDAB MUL ADDB ADCA STD LDAA

FRAC3, X FRAC3,Y

MULAUX+4

FRAC2, X FRAC3,Y

MULAUX+4 I! O MULAUX+3

FRAC3, X FRAC2, Y

MULAUX+4 MULAUX+3 MULAUX+3 MULAUX+2 if O MULAUX+2

FRACl ,X FRAC3,Y

MULAUX+3 MULAUX+2 MULAUX+2 MULAUX+ 1 i! O MULAUX+ 1

FRAC2 , X FRACZ, Y

MULAUX+3 MULAUX+2 MULAUX+2 MULAUX+ 1 I! O MULAUX+ 1

FRAC3,X FRACl ,Y

MULAUX+3 MULAUX+2 MULAUX+2 MULAUX+ 1 I! O MULAUX+I

FRAC1 , X FRAC2 ,Y

MULAUX+2 MULAUX+ 1 MULAUX+I MULAUX

ADCA # O STAA MULAUX

LDAA LDAB MUL ADDB ADCA STD LDAA ADCA STAA

FRAC2, X FRACl ,Y

MULAUX+Z MULAUX+ 1 MULAUX+ 1 MULAUX l# O MULAUX

LDAA FRAC1 , X LDAB FRAC1 ,Y MUL ADDB MULAUX+I ADCA MULAUX STD MULAUX

PULY PULX PULB PULA RTS

**I***

* SUBRUTINA: MULTI Multiplica dos float (FLOAT1*Xn) y * pone el resultado en FLOAT1

* MULTI(X^:FLOAT): FLOAT1 ****** MULTI PSHA

PSHB PSHX PSHY

*

LDAA EXP, X BNE MULTI 1

MULTIO LDX #FLOAT1 JSR CLEAR EXP DE XA ES CERO--> RESULTADO CERO JMP MULTFIN

BNE MULTI2 BRA MULTIO EXP DE FLOAT1 ES CERO--> RESULTADO CERO

MULTII LDAA FLOATI+EXP

MULTIZ LDAA FRACl ,X EORA FLOATI+FRACI ANDA #$80 PSHA GUARDA EL SIGNO DEL RESULTADO

LDY lCFPAUX JSR COPY FPAUX=XA (EL 20 FACTOR) BSET FRAC1,Y $80 PONE EL "HIDDEN BIT" LDX lCFPAUX

LDY #FLOAT1 FLOAT1=YA BSET FRAC1 ,Y $80 PONE EL "HIDDEN BIT"

LDAA EXP, X SUBA 111 26

ADDA

MUL 1 JSR LDX

MUL3 BRSET CLC LDX JSR LDX JSR DECA BRA

MUL2 LDY JSR

STAA

PULA LDAB ANDB ABA STAA

MULTFIN PULY PULX PULB PULA RTS

EXP, Y

MULTI3 #MU L A U X 0,X $80 MUL2

I MULA UX+ 3 ROTL #MULA UX ROTL

MUL3 I FLOAT 1 COPY

FLOATl+EXP

FLOATl+FRACI 6$7F

****** * SUBRUTINA: COPY * ****** * COPY(X^,Y^) COPY PSHA

PSHB

FLOATI+FRACI

SALTE SI EL MSB=1

SE PONE EL EXPONENTE DEL RESULTADO

RECUPERA EL SIGNO DEL RESULTADO

PONE EL SIGNO AL RESULTADO

Copia el dword de X a Y Xzorigen, Y=destino.

PULB PULA RTS

****** * SUBRUTINA: FPNEG Cambia el signo de un numero de punto * flotante (X^) * FPNEG( X^:FLOAT) ****** FPNEG PSHA

LDAA FRAC1 ,X EORA # $80 STAA FRAC1 ,X PULA RTS

******

* SUBRUTINA: SUMA Suma dos floats ( Floatl,X^ ) y * pone el resultado en float1 * * SUMA( X^:FLOAT): FLOAT1:FLOAT ****** SUMA

SUMl

SUM3

SUML

SUM4

PSHA PSHB PSHX PSHY

LDAA EORA ANDA BEQ LDY JSR LDX JSR JSR JMP

LDAA ANDA PSHA LDY JSR LDX LDAA ORAA STAA LDAA ORAA STAA LDY

LDAA LDAB SUBA SUBB STAA STAB CMPB BEQ BGT PSHX PSHY PULX PULY

LDAA SUBA CLC JSR DECA BNE CLC JSR BCC JSR INC

FRAC 1 , X FLOATl+FRACl #$80 SUMl #FPAUX COPY #FPAUX FPNEG RESTA SUMFIN

FLOATl+FRACl #$80

lFPAUX COPY 11FPAUX FLOATl+FRACl %$80 FLOATl+FRACl FRACl ,X #$80 FRACl , X #FLOAT1

EXP, X EXP,Y 111 27 N127 EXP, X EXP,Y EXP,X SUM4 SUM3

EXP,Y EXP, X

ROTR

SUML

SUMA3 SUM5 ROTR EXP, Y

SE TRATA DE SIGNOS IGUALES

SUMA DE SIGNOS IGUALES

GUARDA EL SIGNO DEL RESULTADO

X -->FPAUX SE PONE EL BIT ESCONDIDO EN AMBOS NUMEROS

X-->OP2, Y-->OPl

A=EXPONENTE DE OP2 B=EXPONENTE DE OP1 RESTAMOS EL EXCESO 127 EN AMBOS OPERANDOS SE GUARDA EN MEMORIA

COMPARA EXPl CON EXP2 EXPl=EXP2 NO RECORRE EXPl ES MAYOR QUE EXP2

INTERCAMBIA OPERANDOS

Y=OPERANDO GRANDE SE SACA LA DIFERENCIA EN A

SE RECORRE EL OP CHICO 'A' VECES

SE CONSIDERA ACARREO

SUM5 LDAA ADDA STAA LDY JSR STAA PULA CMPA BEQ LDAA ORA STAA BRA

SUM6 LDAA ANDA STAA

EXP, Y #I27 EXP, X #FLOAT 1 COPY FLOATl+EXP

i/ o SUM6 FLOATl+FRACl #$80 FLOATI+FRACI SUMFIN

FLOATI+FRACI 1$7F FLOATI+FRACI

RECUPERA SIGNO DEL RESULTADO

PONE SIGNO NEGATIVO

PONE SIGNO POSITIVO

SUMFIN PULY PULX PULB PULA RTS

****** * SUBRUTINA: FPCOMP Compara en magnitud a Float1 con XA. * Ajusta banderas Zf y Cf. * FPCOMP(X^:FLOAT):Zf,Cf ****** FPCOMP PSHA

LDAA CMPA BNE LDAA ANDA STAA LDAA ANDA CMPA BNE LDAA CMPA BNE LDAA CMPA

FPCFIN PULA RTS

FLOATI+EXP COMPARA EN MAGNITUD LOS EXPONENTES EXP, X DE FLOAT1 Y A DONDE APUNTA X FPCFIN EXPONENTES DIFERENTES FRAC1 ,X EXP IGUALES, SE COMPARA 1ERA FRACCION #$7F DE AMBOS NUMEROS SIN SIGNO CMPAUX FLOATI+FRACI #$7F CMPAUX FPCFIN FLOATI+FRACZ SE COMPARA 2DA FRACCION DE NUMEROS FRAC2, X FPCFIN FLOATl+FRAC3 SE COMPARA 3ERA FRACCION FRAC3,X

BANDERAS AJUSTADAS

****** * SUBRUTINA: RESTA Resta dos floats ( Floatl,X^ ) y * pone el resultado en float1 * * RESTA( XA:FLOAT): FLOAT1:FLOAT ****** RESTA PSHA

PSHB PSHX PSHY

LDY JSR LDX LDY

#FPAUX COPY %FPAUX {IFLOAT 1

X -->FPAUX Y -->FLOAT1

LDAA EORA ANDA BEQ

FRACl ,X FLOATl+FRACl /I $80 RES1 SE TRATA DE SIGNOS IGUALES

JSR JSR JMP

FPNEG SUMA RESFIN

SE TRATA DE SIGNOS DISTINTOS SE AJUSTAN PARA QUE SEAN IGUALES Y SE SUMAN

RES1 JSR

BNE LDX JSR JMP

DES FPCOMP RESTA DE SIGNOS IGUALES, COMPARA MAGNITU

RES2 #FLOAT 1 CLEAR RESFIN

MAGNITUDES DISTINTAS MAGNITUDES IGUALES EL RESULTADO ES CERO

RES2 BLO LDAA ANDA PSHA BRA

RES3 FLOATl+FRACl #$80

FLOATl ES MAYOR

EL RESULTADO TIENE EL SIGNO DE FLOATl RES4

RES3 LDAA COMA ANDA AT 1 PSHA

FLOATl+FRACl FLOATl ES MENOR

#.I $80 EL RESULTADO TIENE SIGNO CONTRARIO A FLO

GUARDA EL SIGNO

PSHX PSHY PULX PULY

INTERCAMBIA X y Y PARA QUE LA OPERACION SEA Y^-X* Y QUE SEA DE GRANDE-CHICO

RES4 LDAA ORAA STAA LDAA ORAA STAA

FRACl ,X 1$80 FRAC1 , X FRACl ,Y 1$80 FRACl ,Y

EXP, X EXP, Y #I127 /I127 EXP, X EXP, Y EXP, X RES5

EXP,Y EXP, X

ROTR

SE PONE EL BIT ESCONDIDO EN AMBOS NUMEROS

LDAA LDAB SUBA SUBB STAA STAB CMPB BEQ

A=EXPONENTE DE OP2 B=EXPONENTE DE OP1 RESTAMOS EL EXCESO 127 EN AMBOS OPERANDOS SE GUARDA EN MEMORIA

COMPARA EXPI CON EXP2 EXPI=EXP2 NO RECORRE

Y=OPERANDO GRANDE SE SACA LA DIFERENCIA EN A

SE RECORRE EL OF CHICO ‘ A ’ VECES

LDAA SUBA

RESL CLC JSR DECA

RES5

RESLL

RES6

RES7

RESFIN

******

BNE LDAA SUBA STAA LDAA SBCA STAA LDAA SBCA STAA

LDX LDAB LDAA BITA BNE CLC JSR DECB BRA STAB

ADDB STAB PULA CMPA BEQ LDAA ORA STAA BRA LDAA ANDA STAA

PULY PULX PULB PULA RTS

RESL FRAC3,Y FRAC3, X RESTAMOS Y-X FLOATl+FRAC3 FRAC2 ,Y FRACS, X FLOATI+FRAC2 FRAC 1 ,Y FRAC 1 , X FLOATl+FRACl RESULTADO ES FLOAT1

##FLOAT 1 EXP ,Y FLOATl+FRACl #$80 RES6

ROTL

RESLL FLOATl+EXP

#127 FLOATl+EXP

I# O RES7 FLOATl+FRACl #$80 FLOATl+FRACl PONE SIGNO NEGATIVO RESFIN FLOATl+FRACl #$7F FLOATl+FRACl PONE SIGNO POSITIVO

RECUPERA SIGNO DEL RESULTADO

* SUBRUTINA: RECIP2 * * * RECIPZ(X^:WORD):MULAUX ****** RECIPS PSHA

PSHB PSHX

PSHX LDX 0,x LDD #I $8000 IDIV STX MULAUX

PULX PSHX LDX 0,x

Saca el reciproco de un numero de punto flotante usando solo dos bytes de fracci on

GUARDA DIRECCION LEE DENOMINADOR CARGA NUMERADOR=l HACE LA DIVISION ENTERA GUARDA RESULTADO ENTERO

RECUPERA DIRECCION INICIAL VUELVE A GUARDAR DIRECCION LEE DENOMINADOR

~

RP 1 O RP2 N

RP3 O

RP4 N

CPD BNE LDX BRA FDIV

STX

PULX LDX CPD BNE LDX BRA FDIV

STX

PULX PULB PULA RTS

## O RP1 I# O RP2

HACE DIVISION FRACCIONARIA CON EL RESIDU

MULAUX+2 DEL LA DIV ENTERA Y GUARDA RESUL FRACCIO

0 , x I# O RP 3 ## O RP4

MULAUX+4

****** * SUBRUTINA: RECIP * * RECIP ****** RECIP PSHA

PSHB PSHX PSHY

BRCLR LDX LDAA ANDA STAA CLR CLR LDAA SUBA ADDA STAA JSR

RECI LDX LDAA ANDA PSHA BSET JSR LDAA SUBA NEGA ADDA STAA LD %

RECUPERA DIRECCION INICIAL LEE DENOMINADOR

HACE DIVISION FRACCIONARIA CON EL RESIDU

DEL LA DIV ENTERA Y GUARDA RESUL FRACCIO

Saca el reciproco de FLOAT1 y deja el resultado ahi mismo.

FLOATI+FRAC3 $80 RECI NO NECESITA REDONDEO #FPAUX FLOATl+FRACl LEE SIGNO # $80 FRAC1 ,X LO COPIA FRAC2, X FRAC3, X ##I 27 FLOATl+EXP 81 5+127 EXP, X SUMA SE REDONDEA EL NUMERO

#FLOAT 1 FRAC1 ,X ## $80

FRAC1,X $80 RECIP2 FLOATI+EXP #I127

##127+15 FLOATI+EXP * MULAL))(

SE LEE Y GUARDA SIGNO SE ENCIENDE EL BIT ESCONDIDO SACA EL RECIPROCO NIEGA EL EXPONENTE

REC3 BRSET CLC LDX JSR LDX JSR DECA BRA

REC2 LDY JSR

STAA

PULA LDAB ANDB ABA STAA

0,X $80 REC2 SALTE SI EL MSB=I

I# MUL A U X t 3 ROTL B M U L A UX ROTL

REC3 #FLOAT 1 COPY

FLOATI+EXP SE PONE EL EXPONENTE DEL RESULTADO

RECUPERA EL SIGNO DEL RESULTADO FLOATI+FRACI #$7F

FLOATI+FRACI PONE EL SIGNO AL RESULTADO

PULY PULX PULB PULA RTS

****** * TABLA DE CONSTANTES DE PUNTO FLOTANTE ****I*

CTEI4 CTEI3 CTEIZ CTEI 1 CTE 1 CTE2 CTE3 CTE4 CTE5 CTE6 CTE7 CTE8 CTE9 CTE 1 O CTEl1 CTE12 CTEI 3 CTEl4 CTEI 5 CTE16 CTEI 7 CTE18 CTEI 9 CTE20 CTE21 CTE22 CTE23 CTE24 CTE25 CTE26

FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB FCB

= 1/10000 = 1/1000 = 1/100 = 1/10 = 0.0000694 = 0.0006636 = 0.0008500 = 0.0132 = 0.02117 = 0.02375 = 0,04394 = 0.0841 = 0.096 = 0.116 = 0.1238 = 0.1531 = 0.1676 = 0.3052 = 0.332 = 0.3736 = 0.4936 = 0.6284 = 0.734 = 0.827 = 0.878 = 1.1554 = 3.152 = 4.033 = 5.214 = 6.493

CTE27 FCB $15,$53,$59,$82 = 9.33285 CTE28 FCB $4E,$66,$65,$82 = 12.9 CTE29 FCB $OE,$4B,$5D,$83 = 17.7868 CTE30 FCB $35,$58,$9D,$83 = 22.66827 CTE31 FCB $70,$37,$4A,$83 = 30.027 CTE32 FCB $26,$17,$8C,$84 = 41.523

****** ****** * TABLA DE CODIGOS DE TECLADO para pasar de scancode a ascii

ORG KBTABLA

ORG KBTABLA+$84 FCB $17

ORG KBTABLA+$8C FCB $16

ORG KBTABLA+$94 FCB $15

ORG KBTABLA+$9C FCB $14

'CONTROL F4'

'CONTROL F3'

'CONTROL F2'

'CONTROL FI'

****** * TABLA DE CARACTERES disposición similar al ASCII * Codificados para aparecer en display de 7 segmentos ******

ORG TABLA

****** * MENSAJES ******

GIGI$ FCC 'PROYECTO DE 1 N G . B I O M M E D I C A ' MENU$ FCC I MMENU= ? I

ERROR$ FCC ERROR FCB $10 Marca f i n d e cadena .

FCB $10 Marca f i n de cadena .

CAPTURE$ FCC 'CAPTURANDO . . . I

FCB $10 Marca f i n de cadena .

EJECUTA$ FCC 'EJECUTAR FORMMULA FOR = ? FCB $10 Marca f i n de cadena .

FORM$ FCC FFM= t

FCB $10

DB$ FCC DB=

RES$ FCC RES=

REA$ FCC ' REA=

1

FCB $10

FCB $10

FCB $10

I

1

****** *****I * E s t a b l e c e Vectores de I n t e r r u p c i ó n .

ORG IRQVEC FDB RAI-IRQ

ORG RESET FDB PROGRAMA

Marca f i n de cadena .

Marca f i n de cadena .

Marca f i n de cadena .

Marca f i n de cadena .