seminario de proyecto y ii reporte final.148.206.53.84/tesiuami/uam7444.pdf · en el caso del...
TRANSCRIPT
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 $
#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 .