Sie sind auf Seite 1von 16

Universidad de Costa Rica

Escuela de Ingeniería Eléctrica


Estructuras de Computadores Digitales I / IE0503
Primer Proyecto de Programación CPUCR
Profesor: José Luis López Sauma
Elaborado por: Emmanuel Vargas Blanco
I-2011

Introducción

El siguiente informe explica la resolución del primer proyecto grande de programación del a CPUCR en el curso de
Estructuras de Computadores Digitales I, el cual se basa en crear un programa principal que llame a tres subrutinas para
realizar diferentes tareas.
La primer subrutina actúa sobre un grupo de números en BCD sin signo y de doble precisión almacenados en una
sección de memoria (@3000 en adelante), esta subrutina debe sumar todos los números (5 como máximo) y el resultado
debe quedar en el tope de la pila al retornar de la subrutina.
La segunda subrutina también actúa sobre un grupo de datos ubicados después de la dirección @4000, estos
números (10 como máximo) son representados en complemento 2 de triple precisión, esta subrutina le resta todos los
números a cero y el resultado, que es de precisión 4, debe quedar en el tope de la pila al retornar de la subrutina.
Finalmente la subrutina 3 procesar un grupo de números (31 como máximo) representados en signo magnitud de
doble precisión que se encuentran a partir de la dirección @5000, esta subrutina expresa todos los números en complemento
2 y los resultados los coloca en la misma posición que los números originales.
Se realizará una breve descripción de como solucionar cada problema basado en diagramas de flujo del algoritmo a
emplear, todo esto se hace por separado para cada subrutina. Finalmente se unirá todo y se presentará la inicialización de la
memoria junto con las variables definidas para resolver los problemas junto con las llamadas de cada subrutina.

Subrutina 1.

• Descripción de la solución: Para resolver este problema hay que sumar las unidades (Palabra Baja) y decenas
(Palabra Alta) de cada número BCD y además hay que tomar en consideración que se pueden producir centenas. Se
debe tomar en cuenta que para realizar operaciones en BCD los números utilizados solo van de 0 a 9 como se
muestra en la tabla 1. El problema que genera este tipo de operación es que se
Binario BCD debe realizar una corrección en el resultado obtenido a la hora de sumar los
0 0 números en binario porque con 4 bits se pueden obtener resultados desde cero
1 1 hasta 16 pero la respuesta debe quedar entre 0 y 9 por lo tanto luego de obtener el
resultado de cada suma se debe verificar lo siguiente:
10 2
11 3 1. Si el resultado de la suma de los cuatro bits genera un acarreo implica que hay un
100 4 desborde y se debe corregir el resultado, esto se logra sumándole 6 (0110) al
101 5 resultado y el acarreo se suma al bit que le sigue en mayor orden significativo.

110 6 Ejemplo:
111 7 7 0111
1000 8 +9 +1001
16 10000 → en este caso ocupo que el resultado en BCD sea 0001 =1 y
1001 9 0110 = 6 para formar la el resultado 16.
Tabla 1. Código Binario-BCD

Ahora, si le sumo 6 al resultado obtengo el número corregido así:


D U
0001| 0000
0000| 0110
0001| 0110 → que es 1 en las Decenas y 6 en las Unidades.
Para nuestro caso como son números de doble precisión tengo que:

Fig1. Modelo de operación de suma para BCD.

2. Si el resultado de la suma no produce un acarreo entonces al número se le resta 12 de forma que si es mayor o
igual a nueve produzca un acarreo:

7 0111
+8 +1000
15 1111 → en este caso ocupo que el resultado en BCD sea 0001 =1 y 0101 = 5 para formar la el resultado
15 entonces tengo que corregirlo, para darme cuenta de esto a nivel de instrucciones lo que hago es que le
resto 12:
15 → 1111
-12 → +0100
10011 → Como produjo un acarreo entonces se que es un número mayor a nueve por lo que
simplemente le sumo 6 al resultado y el acarreo se lo sumo al bit más significativo.

Para el caso de la CPUCR por trabajar en 6 bits (CPUCR1) tengo que solo los primeros 4 bits serán tomados como
parte del numero de doble precisión (parte baja o alta) por lo que luego de sumarlos en la CPUCR se utiliza el
comando ROL y CLC para depositar el acarreo, si es que se produce; en la bandera C del registro de estado con el
fin de utilizar saltos condicionales. Luego de verificar que el resultado de la suma tiene una forma valida de
representación en BCD se aumentan los punteros creados para recorrer la tabla y se disminuye la cantidad de
palabras en 1 por cada pasada completa que se realice. Tanto la palabra baja, alta y el acarreo del resultado se van
almacenando en una sección de memoria que se utiliza como apoyo para los resultados parciales de cada suma.
Estos apuntadores al final de la subrutina se incrementan de diferente forma, ya que los punteros de las palabras
baja y alta se aumentan finalmente en dos para indicar los campos donde se almacenará el resultado y luego de
colocar las unidades y decenas en su lugar el puntero de la palabra alta se aumenta en uno más con el fin de colocar
las centenas luego de las decenas.
• Diagrama de flujo.
Inicio

Almacena cantidad total de números


por tratar, además de primer
número en región temporal de memoria

Sume PB del número apuntado por


apuntador a PB en memoria temporal

Si
C=0
Reste 12

Sumele 6 al resultado de la suma y


ponga el resultado en espacio
temporal de memoria. Además
aumente en 1 la palabra alta
Si del número BCD
C=0

Sume PA del número apuntado por


Almacene el resultado
apuntador a PA en memoria temporal
en espacio temporal
de memoria.

Si
C=0
Reste 12 Si
C=0

Almacene el resultado Sumele 6 al resultado de la suma y


en espacio temporal ponga el resultado en espacio
de memoria. temporal de memoria. Además
aumente en 1 la palabra “de acarreo”
que serían las centenas del número BCD
Decremente en uno la cantidad total
de números.

Aumente en dos los punteros para


seleccionar el siguiente número

N=0

FIN Si
Incremente punteros en dos, ponga unidades
y decenas al final de la tabla, incremente PA
en uno y ponga centenas.
Subrutina 2.
• Descripción de la solución: Para resolver este problema hay que restarle a cada número cero y sumarlos pero es lo
mismo que sumar todos los números y al final restarle cero, que es equivalente a complementar la suma final. Lo
que hago entonces es sumar todos los números en complemento 2 y al final complemento el resultado, el cual debe
de quedar en el tope de la tabla de datos. Así el algoritmo de sumar dos números con doble precisión usado en la
subrutina 1 me puede servir, solo que ahora tengo números de precisión 3. En general, lo que se hace es sumar la
palabra baja del número, si produce acarreo este se suma a la palabra media (PM) y sino entonces solo se coloca el
resultado en la región temporal de memoria para almacenar el resultado parcial de la suma de las palabras bajas y
se procede a realizar el mismo procedimiento con la palabra media, luego la alta y finalmente como el resultado
hay que darlo con una precisión de 4 la suma de los acarreos generados es colocada en esta posición.
• Diagrama de flujo:

Inicio

Almacena cantidad total de números


por tratar, además de primer
número en región temporal de memoria

Sume PB del número apuntado por


apuntador a PB en memoria temporal y
Almacene resultado en posición temporal
de memoria de la PB

Si
Sume PM del número apuntado por C=0
Aumente en 1 la palabra
apuntador a PM en memoria temporal y
media del número en
almacene el resultado en posición temporal
posición temporal de memoria.
de memoria

Si
C=0
Aumente en 1 la palabra alta del
número en posición temporal
Sume PA del número apuntado por
de memoria.
apuntador a PA en memoria temporal y
almacene el resultado en posición temporal
de memoria
Aumente en 1 la palabra de acarreo
del número en posición
Si temporal de memoria.
C=0

Decremente un 1 cantidad total


de números en posición de
memoria temporal.
N=0

Aumente en tres los punteros para


Si
seleccionar el siguiente número
Complemente el número en posición
temporal de memoria.
FIN (PB, PM, PA, C)

Incremente punteros en tres, ponga PB, PM y PA


almacenados en memoria temporal en el tope
de la tabla, incremente PA en uno y ponga el
acarreo en esa posición.
Subrutina 3.

• Descripción de la solución: esta subrutina se encarga de pasar a complemento 2 los números ubicados en una tabla
a partir de la posición @5000, lo que se hace es crear dos punteros que recorran toda la tabla, uno para la parte baja
y otro para la parte alta del número, además de uno que traiga la cantidad de números que se van a procesar, sus
direcciones son pasadas a la subrutina por medio de la pila y ya dentro de ella se obtiene el dato de de cada parte
del número, primero la parte baja, se complementa, se incrementa y se devuelve al mismo lugar de donde se trajo,
ahora; si luego de procesar el número aparece un acarreo (C=1) este se debe sumar a la parte alta y se complementa
el resultado para luego ser depositado de donde se obtuvo pero si no se genera un acarreo (C=0) entonces
simplemente se procede a complementar la parte alta del número, se incrementan los punteros de dos en dos para
acceder al siguiente número si la cantidad total de números que se encuentra en memoria temporal no ha llegado a
0, de lo contrario se apilan la dirección de retorno y se termina la ejecución.
• Diagrama de flujo:

Inicio

Almacena cantidad total de números


por tratar, además de primer
número en región temporal de memoria

Tome PB del número apuntado por


apuntador a PB en memoria temporal,
Complemente en incremente. Almacene
resultado en posición original de memoria
de la PB

Si
C=0
Tome PA del número apuntado por
apuntador a PB en memoria temporal,
Complemente en incremente. Almacene Aumente en 1 la palabra alta
resultado en posición original de memoria del número en posición
de la PA temporal de memoria.

Decremente un 1 cantidad
Total de números FIN
N=0

Aumente en dos los punteros para


Si
seleccionar el siguiente número
Programa objeto.

Para la descripción del programa objeto se tomaran impresiones de pantalla de la ejecución antes y después de
implementar la ejecución de diferentes secciones de cada subrutina.

• Subrutina 1: Para la subrutina 1 es importante notar ciertos cambios importantes como por ejemplo los saltos
condicionales, resultados particulares y los retornos de subrutina. La ubicación de esta subrutina es la siguiente:

Instrucciones: @1570 ~ @2145


Región Temporal: @0750 ~ @0761
Datos: @3000 ~ @3013 (5 números como máximo)

1. Saltos condicionales: en esta sección se presenta como se determina si un número es mayor a nueve o no en la
sección UNIDADSUM1 que es donde se operan las unidades del número en BCD. Por ejemplo en esta parte el
número que se encuentra en memoria temporal es @1107, y el que se va a operar con este es @0510, cuando
se suman @07 con @10 el resultado en BCD debe ser 1 en decenas y 5 en unidades, pero la suma produce
@17 como se ve en la figura 1.1 pero no se genera un acarreo entonces saco el bit 5 (de 6) de la palabra
rotándola de forma que el acarreo quede en la bandera C y se de el salto condicional inmediato para restarle
12, en el acumulador queda el numero @74 luego de rotarlo como se puede ver en la figura 1.2 y se procede a
restarle 12 para determinar si el número es mayor a 9 lo que producirá un acarreo evitará que se haga un salto
a ALMACENE y se pase a restarle 6 al número para corregirlo, pero esta resta se hace en la suma original si
rotar que estaba en el acumulador (fig 1.4), luego se ordena el número y se almacena en la parte baja temporal
de las unidades como se ve el cambio en la figura 1.5.

Figura 1.1 Figura 1.2

Figura 1.3 Figura 1.4

1 Ver código fuente en Anexo 1.


Figura 5. Antes de la ejecución Figura 5 después de la ejecución

2. Posiciones finales de memoria: El resultado final se almacena en el tope de la tabla de datos, para este caso
muy específico se van a operar solo los dos números que se presentaron antes, en la figura 1.6 se puede ver la
memoria antes de correr el programa y la memoria después de correr el programa en la figura 1.7 donde el
resultado se encuentra entre las posiciones @3005 a @3007 siendo esta última posición las centenas.

Figura 6. Memoria antes Figura 7. Memoria después.

• Subrutina 2: para la subrutina 2 se tienen situaciones similares a las de la subrutina 1 con respecto a los saltos
condicionales. La ubicación de esta subrutina es la siguiente:

Instrucciones: @1150 ~ @1157


Región Temporal: @0720 ~ @0744
Datos: @4000 ~ @4037 (10 números como máximo)
1. Saltos condicionales: los saltos condicionales se ejecutan de forma similar que el caso anterior, solo que ahora
hay que tener en cuenta que son números de triple precisión y es en binario por lo que estos dependerán, por
ejemplo, de si se genera un acarreo luego de la suma de alguna de las partes, ya sea Baja, Media o Alta este
entonces se deberá aumentar en uno la palabra contigua más significativa pues esto es equivalente a sumar el
acarreo a la palabra de mayor orden de precedencia. Por ejemplo se van a sumar @152650 con @526665, al
sumar las partes bajas el resultado es @135 como se muestra en la figura 2.1 por lo que se genera un acarreo y
se deberá sumar este a la palabra media @26 (o @66, el orden no importa porque al final se suman ambos)
como se muestra en la figura 2.2 debido a que el salto condicional no se lleva acabo, luego de esto se le suma
el acarreo a la palabra media temporal (figura 2.3, atención a contador del programa PC) y se procede a
realizar el mismo procedimiento con las palabras media, alta y de acarreo.
Figura 2.1. C=1 (A) = @35 Figura 2.2

Figura 2.3. PC=@1251, ya se incremento palabra media.

2. Posiciones finales de memoria: El resultado final se almacena en el tope de la tabla de datos, para este caso
muy específico se van a operar solo los dos números que se presentaron antes, en la figura 2.4 se puede ver la
memoria antes de correr el programa y la memoria después de correr el programa en la figura 2.5 donde el
resultado se encuentra entre las posiciones @4007 a @40012 siendo esta última posición del acarreo.

Figura 2.4. Antes de la ejecución Figura 2.5. Después de la ejecución


• Subrutina 3: la subrutina 3 es la mas sencilla de todas porque solo consta de tomar los números en formato signo
más magnitud de doble precisión a partir de la posición @5000 (@5001 porque en la @00 está la cantidad de
números con los que se va a trabajar), complementarlos y finalmente dejarlos en la posición de memoria donde
estaban originalmente. La ubicación de esta subrutina es la siguiente:

Instrucciones: @1000 ~ @1141


Región Temporal: @0710 ~ @0716
Datos: @5000 ~ @5077 (31 números como máximo)

1. Saltos condicionales: en este caso los saltos condicionales se llevan acabo entre operaciones de complemento
sobre la palabra paja y alta de cada número, porque si el complemento 2 de la parte baja genera un acarreo este
se debe sumar a la parte alta de la palabra. Por ejemplo, se pasan dos números al programa, el primero es
@0700 y el otro es @7143, en la figura 3.1 se muestra como al complementar la parte baja de la palabra del
numero @0700 y sumarle 1 se genera un acarreo lo que provoca que se tenga que sumar uno a la parte alta del
número y luego se complementa (figura 3.2 y 3.3 ) dando como resultado @67

Figura 3.1 Figura 3.2

Figura 3.3

2. Posiciones finales de memoria: como resultado final se obtienen los números en en la posición original de
cada dato expresados en complemento 2 para este caso (dos números); en la figura 3.4 se puede ver la
memoria antes de correr el programa y la memoria después de correr el programa en la figura 3.5.
Figura 3.4. Memoria antes de correr el programa. Figura 3.5. Memoria después de correr el programa.

Anexo

Código fuente:

Subrutina 1: (con comentarios)


* = @0750
CNT1 WRD @00
PALB DBWRD @3001 ;palabra baja del numero BCD
PALA DBWRD @3002 ;palabra alta del numero BCD
INID1 = @3000

*=@0000

INICIO CLA ; limpio el acumulador e inicializo el contador de pila en cero.


TAP

LDA INID1 ; tome el contenido de @3000


STA CNT1 ;guardelo en CNT
PHA ; apilelo
LDA PALB ;palabra baja,parte baja
PHA
LDA PALB+1 ;palabra baja,parte alta
PHA
LDA PALA ;palabra alta, parte baja
PHA
LDA PALA+1 ; palabra alta, parte alta
PHA
CLC
JSR SUB1
HLT

*=@1570
SUB1 PLA ;..organizacion de direcciones
STA @0750 ; parte baja de retorno de subrtna.
PLA
STA @0751 ; parte alta de retorno de subrtna
PLA
STA @0753 ;PALA+1
PLA
STA @0752 ;PALA
PLA
STA @0755 ;PALB+1
PLA
STA @0754 ;PALB
PLA
STA @0756 ; cantidad de numeros a operar ( CNT1 < 5 numeros )

;Organizacion de region temporal del resultado, esto no es necesario pero


;lo voy a hacer para indicarle al lector que esa zona sera usada para
;manipular datos temporales, ademas se almacena el primer numero de la tabla,
;para empezar a manipular todos dos demas datos.
CLA
LDA (@0754)
STA @0757 ;PALBT palabra baja temporal
LDA (@0752)
STA @0760 ;PALAT palabra alta temporal
CLA
STA @0761 ;CRT acumulador de acarreo
JMP STOK ;Disminuya el contador y verifique que no es el ultimo dato
;de la tabla

;Fin de organizacion de region temporal

;Suma de la parte baja del numero

UNIDADSUM CLA
CLC
; Carga las palabras baja y alta y las corre a la izquierda 2 campos
LDA (@0754) ;Acomoda la palabra baja del numero
ADD @0757
PHA
CLC ;Saca el acarreo de la suma BCD a C para usar los saltos
ROL
CLC
ROL
BCC SUB9U ; Si aparece un acarreo el numero es >9
SUM6U PLA
ADD #@06 ;Le sumo 6 para corregir la palabra
CLC
ROL
CLC
ROL
CLC
ROR
ROR
STA @0757 ;Guarde en PALBT
LDA @0760
INA
STA @0760
CLC
JMP DECENASUM
SUB9U SUB #@20 ;Reste 12 al resultado,uso 010000 porque la palabra aun esta
BCC ALMACENE ;en ese estado dentro del acumulador
JMP SUM6U

ALMACENE PLA ;Pongo los dos bits mas significativos en cero y almaceno el
CLC ;resultado de la suma.
ROR
CLC
ROR
STA @0757
DECENASUM CLA
CLC
LDA (@0752)
ADD @0760
PHA
CLC
ROL
CLC
ROL
BCC SUB9D
SUM6D PLA
ADD #@06
CLC
ROL
CLC
ROL
CLC
ROR
ROR
STA @0760
LDA @0761
INA
STA @0761
CLC
JMP STOK
SUB9D SUB #@20
BCC GUARDE
JMP SUM6D

GUARDE PLA
CLC
ROR
CLC
ROR
STA @0760

;Seccion de comprobacion de fin de subrutina


STOK LDA @0756
DCA
STA @0756
BNE INCR1 ; si no es el ultimo numero Incremente punteros de palabra
JMP RTRN

;Macro para incremetar punteros


MACRO APUNTS DIR
LDA DIR
ADD #@02
STA DIR
FINMAC

INCR1 APUNTS @0754


APUNTS @0752
JMP UNIDADSUM

;Preparando retorno de subrutina


RTRN APUNTS @0754 ;Acomoda los punteros para recibir el resultado
APUNTS @0752
CLC
LDA @0757 ;Acomoda las palabras baja y alta para guardarlas
STA (@0754)
LDA @0760
STA (@0752)
LDA @0752 ;Incrementando el contador de la palabra alta en uno obtengo
INA ;la tercera posicion que ocupo para almacenar las centenas.
STA @0752
LDA @0761
STA (@0752)
LDA @0751
PHA
LDA @0750
PHA
RTS

Subrutina 2:

* = @0720
CNT2 WRD @00
PALBA DBWRD @4001 ;palabra baja del numero A
PALMA DBWRD @4002 ;palabra media del numero A
PALAA DBWRD @4003 ;palabra alta del numero A
INID2 = @4000

*=@0000

INICIO CLA ; limpio el acumulador e inicializo el contador de pila en cero.


TAP
LDA INID2 ; tome el contenido de @4000
STA CNT2 ;guardelo en CNT
PHA ; apilelo
LDA PALBA ;palabra baja,parte baja, numero A
PHA
LDA PALBA+1 ;palabra baja,parte alta
PHA
LDA PALMA ;palabra media, parte baja
PHA
LDA PALMA+1 ;palabra media, parte alta
PHA
LDA PALAA ;palabra alta, parte baja
PHA
LDA PALAA+1 ; palabra alta, parte alta
PHA
JSR SUB2
HLT

*=@1150
SUB2 PLA ;..organizacion de direcciones
STA @0730 ; parte baja de ret. sub.
PLA
STA @0731 ; parte alta de ret. sub.
PLA
;Organizacion de numero de entrada a subrutina
STA @0733 ;PALAA+1
PLA
STA @0732 ;PALAA
PLA
STA @0735 ;PALMA+1
PLA
STA @0734 ;PALMA
PLA
STA @0737 ; PALBA+1
PLA
STA @0736 ; PALBA

;Organizacion de region temporal del resultado, esto no es necesario pero


;lo voy a hacer simplemente para indicar al lector que esa zona sera usada
;para manupilar datos temporales.

CLA
STA @0740 ;PALAT palabra alta temporal
STA @0741 ;PALMT palabra media temporal
STA @0742 ;PALBT palabra baja temporal
STA @0743 ;CRY acarreo temporal total
;................ Fin de organizacion
PLA
STA @0744 ;cantidad de numeros a tratar CNT2
;......... Inicio de suma
;Suma de las palabras bajas
SUMAB CLC
LDA @0742 ; carga la palabra baja de resultado temporal (PALBT)
ADD (@0736) ; Suma palabra baja del numero (PALBA)
STA @0742 ;guarde en palabra baja de resultado temporal
BCC SUMAM; si C=0 pase a sumar palabra media
LDA @0741; sume C a la palabra media del resultado temporal (PALMT)
INA
STA @0741
;Suma de las palabras medias
SUMAM LDA @0741 ;cargue PALMT
ADD (@0734);Suma palabra media del numero a PALMT
STA @0741
BCC SUMAA; si C=0 pase a sumar palabra alta
LDA @0740; sume C a la palabra alta del resultado temporal (PALAT)
INA
STA @0740
SUMAA LDA @0740 ;cargue PALAT
ADD (@0732);Suma palabra alta del numero a PALAT
STA @0740
BCC VERF; si C=0 verifique cuantos numeros quedan
LDA @0743 ; si se genero un acarreo este se almacena en CRY
INA
STA @0743
;Verifica cuantos numeros quedan por tratar
VERF LDA @0744
DCA
STA @0744
BNE INCRT ; si no es el ultimo numero Incremente punteros de palabra
JMP RET

;Incremento punteros 3 unidades para seleccionar el siguiente numero


;Solo lo hago con las partes bajas de los punteros porque el rango maximo es
;de @5000 a @5075 (10 numeros)

MACRO INCR3 DATO


LDA DATO
ADD #@03
STA DATO
FINMAC

INCRT INCR3 @0736


INCR3 @0734
INCR3 @0732
JMP SUMAB
;Le paso palabra Baja, Media, Alta y Carry para restarle el resultado total
;a cero (complementar el resultado)
MACRO COMPT3 NUMRB, NUMRM,NUMRA,NUMRC
LDA NUMRM
CPA
STA NUMRM
LDA NUMRA
CPA
STA NUMRA
LDA NUMRC
CPA
STA NUMRC
LDA NUMRB
CPA
INA
STA NUMRB
BCC FMAC
LDA NUMRM
INA
STA NUMRM
BCC FMAC
LDA NUMRA
INA
LDA NUMRA
BCC FMAC
LDA NUMRC
INA
STA NUMRC
FMAC CLA
FINMAC

;Preparando retorno de subrutina


RET COMPT3 @0742,@0741,@0740,@0743
INCR3 @0736 ;incremento los punteros para almacenar el resultado en el
INCR3 @0734 ;tope de la tabla de datos
INCR3 @0732
LDA @0742 ;almacene PALBR
STA (@0736)
LDA @0741 ;almacene PALMR
STA (@0734)
LDA @0740 ;almacene PALAR
STA (@0732)
LDA @0732 ;con esto obtengo el lugar de la palabra donde debe quedar CRY
INA
STA @0732
LDA @0743 ;almacene CRY
STA (@0732)
LDA @0731 ;parte baja dir. retorno
PHA
LDA @0730 ;parte alta dir. retorno
PHA
RTS
Subrutina 3:
* = @0700
CNT WRD @00
PALB DBWRD @5001 ;palabra baja del numero
PALA DBWRD @5002 ;palabra alta del numero
INID = @5000

*=@0000

INICIO CLA ; limpio el acumulador e inicializo el contador de pila en cero.


TAP

LDA INID ; tome el contenido de @5000


STA CNT ;guardelo en CNT
PHA ; apilelo
LDA PALB ;palabra baja,parte baja
PHA
LDA PALB+1 ;palabra baja,parte alta
PHA
LDA PALA ;palabra alta, parte baja
PHA
LDA PALA+1 ; palabra alta, parte alta
PHA
CLC ; limpie el carry
JSR SUB3
PLA
HLT

*=@1000
SUB3 PLA ;..organizacion de direcciones
STA @0710 ; parte baja de ret. sub.
PLA
STA @0711 ; parte alta de ret. sub.
PLA
STA @0713 ;PALA+1
PLA
STA @0712 ;PALA
PLA
STA @0715 ;PALB+1
PLA
STA @0714 ;PALB
PLA
STA @0716 ; Numeros de doble prec. a complementar

;......... Inicio de complemento


COMP CLA
LDA (@0714) ; carga la palabra baja, la complementa y le suma 1
CPA
INA
STA (@0714)
BCC COMPCC ;
CLA
ROL
ADD (@0712) ; sume la palabra alta al carry.
CPA
STA (@0712)
JMP CDOK

;........... Complemento si C=0


COMPCC LDA (@0712)
CPA
STA (@0712)

;Seccion de comprobacion de fin de subrutina


CDOK LDA @0716
DCA
STA @0716
BNE INCR ; si no es el ultimo numero Incremente punteros de palabra
JMP RETORNO

;Incremento punteros 2 unidades para seleccionar el siguiente numero


;Solo lo hago con las partes bajas de los punteros porque el rango maximo es
;de @5000 a @5075 (31 numeros)

INCR LDA @0714


ADD #@02
STA @0714
LDA @0712
ADD #@02
STA @0712
JMP COMP
;Preparando retorno de subrutina
RETORNO LDA @0711
PHA
LDA @0710
PHA
RTS

Das könnte Ihnen auch gefallen