Ver el código de CAPÍTULO 10 LAS INSTRUCCIONES DE DESPLAZAMIENTO Y MODIFICACIÓN DE LA MEMORIA

===10.0 DEFINICIÓN DE DESPLAZAMIENTO (SHIFT) Y ROTACIÓN (ROTATE)===

En muchos casos, las operaciones de los sistemas de control deben procesar un bit a la vez. Los datos a menudo están disponibles como una serie de bits y, a veces, las operaciones de bits secuenciales son la única forma de resolver un problema particular. Además de eso, para combinar bits en un campo, se necesitan instrucciones de desplazamiento y rotación. Todas las rutinas de multiplicación y división requieren la capacidad de mover bits entre sí en un campo completo de múltiples bytes. La instrucción de desplazamiento es aquella que toma un registro, como por ejemplo el Acumulador, y mueve todos sus bits 1 bit hacia la derecha ó 1 bit hacia la izquierda. A continuación, se muestran ejemplos de instrucciones de desplazamiento y rotación en la familia MCS650X:

((https://www.atariware.cl/archivos/mcs6500/ch10_01a.webp align=center))

Como se puede ver en el ejemplo, el mover los datos 1 bit a la derecha se llama desplazamiento a la derecha (shift right). La consecuencia natural del desplazamiento a la derecha es que el bit de entrada, o bit de orden superior en este caso, se establece en 0. Mover los datos en el registro 1 bit a la izquierda se llama desplazamiento a la izquierda (shift left). En este caso, el 0 se inserta en la posición de orden inferior. Estas son las dos capacidades de desplazamiento que existen en el microprocesador MCS650X. 
Cabe señalar que, en ambos casos, el bit que se desplaza del registro, el bit de orden inferior en el desplazamiento a la derecha y el bit de orden superior en el desplazamiento a la izquierda, se almacena en la bandera de Acarreo. Esto es para permitir que el programador pueda consultar el bit por medio de las bifurcaciones por acarreo que están disponibles y también para permitirle a la capacidad de rotación la transferencia de bits en múltiples desplazamientos de precisión.
La segunda parte de la instrucción de desplazamiento de precisión múltiple es la rotación que se muestra en el ejemplo 10.1, en la que el valor del bit de Acarreo se convierte en el bit de orden inferior del registro, y el bit de salida del desplazamiento se almacena en el Acarreo.

{{anchor href="LSR"}}
===10.1 LSR-DESPLAZAMIENTO LÓGICO A LA DERECHA===

Esta instrucción desplaza al Acumulador o una ubicación de memoria específica 1 bit a la derecha, con el bit superior del resultado siempre establecido en 0, y el bit inferior, que se desplaza fuera del campo, se almacena en la bandera de Acarreo.

La notación simbólica para LSR es ((https://www.atariware.cl/archivos/mcs6500/ch10_01.webp))

La instrucción de desplazamiento a la derecha afecta al Acumulador moviéndolo a la derecha 1 bit; es una instrucción de lectura/modificación/escritura que cambia una ubicación de memoria específica pero no afecta ningún registro interno. El desplazamiento a la derecha no afecta a la bandera de Desbordamiento. La bandera N siempre se borra. La bandera Z se establece en 1 si el resultado del cambio es 0, y de lo contrario se borra. El Acarreo se establece igual al bit de la entrada. 
LSR es una instrucción de lectura/escritura/modificación y tiene los siguientes modos de direccionamiento: Acumulador; Página Cero; Página Cero, X; Absoluto; Absoluto, X. 

{{anchor href="ASL"}}
===10.2 ASL-DESPLAZAMIENTO ARITMÉTICO A LA IZQUIERDA===

La instrucción de desplazamiento a la izquierda desplaza al Acumulador o a una ubicación de memoria 1 bit a la izquierda, con el bit 0 siempre establecido en 0 y el bit 7 asignado a la bandera de Acarreo. ASL desplaza el Acumulador 1 bit a la izquierda; es una instrucción de lectura/modificación/escritura que sólo afecta a la memoria. 

La notación simbólica para ASL es ((https://www.atariware.cl/archivos/mcs6500/ch10_02.webp))

La instrucción no afecta al bit de Desbordamiento; asigna el bit 7 del resultado (bit 6 en la entrada) a la bandera N; establece en 1 la bandera Z si el resultado es igual a 0, de lo contrario borra la bandera Z y almacena el bit 7 de la entrada en la bandera de Acarreo. ASL es una instrucción de lectura/modificación/escritura y tiene los siguientes modos de direccionamiento: Acumulador; Página Cero; Página Cero, X; Absoluto; Absoluto, X.

{{anchor href="ROL"}}
===10.3 ROL-ROTAR A LA IZQUIERDA===

La instrucción de rotación a la izquierda desplaza el Acumulador o la posición de memoria 1 bit a la izquierda, almacenando en el bit 0 la bandera de Acarreo y en la bandera de Acarreo el bit 7 de la entrada. 

La notación simbólica para ROL es ((https://www.atariware.cl/archivos/mcs6500/ch10_03.webp))

La instrucción ROL desplaza al Acumulador 1 bit a la izquierda y almacena el bit 0 del Acumulador en la bandera de Acarreo; no afecta en absoluto a los registros internos. Los conjuntos de instrucciones ROL almacenan en la bandera de Acarreo el bit de entrada 7, en la bandera Negativo el bit de entrada 6, y establece en 1 la bandera Z si el resultado de la rotación es 0; de lo contrario, borra la bandera Z sin afectar la bandera de Desbordamiento.
ROL es una instrucción de lectura/modificación/escritura y tiene los siguientes modos de direccionamiento: Acumulador; Página Cero; Página Cero, X; Absoluto; Absoluto, X. 

{{anchor href="ROR"}}
===10.4 ROR-ROTAR A LA DERECHA (Disponible para Microprocesadores fabricados a partir de Junio de 1976)===

La instrucción de rotación a la derecha desplaza el Acumulador o la posición de memoria 1 bit a la derecha, almacenando en la bandera de Acarreo el bit 0 y la bandera de Acarreo en el bit 7. 

La notación simbólica para ROR es ((https://www.atariware.cl/archivos/mcs6500/ch10_04.webp))

La instrucción ROL desplaza al Acumulador 1 bit a la derecha y almacena la bandera de Acarreo en el bit 7 del Acumulador; no afecta en absoluto a los registros internos. Los conjuntos de instrucciones ROR almacenan en la bandera de Acarreo el bit de entrada 0, en la bandera Negativo la bandera de Acarreo, y establece en 1 la bandera Z si el resultado de la rotación es 0; de lo contrario, borra la bandera Z sin afectar la bandera de Desbordamiento.
ROR es una instrucción de lectura/modificación/escritura y tiene los siguientes modos de direccionamiento: Acumulador; Página Cero; Absoluto; Página Cero, X; Absoluto, X. 

===10.5 EL DIRECCIONAMIENTO POR ACUMULADOR===

Como se indicó anteriormente, todas las instrucciones de desplazamiento pueden operar sobre el Acumulador. Este es un modo de direccionamiento especial que es exclusivo de las instrucciones de desplazamiento y opera con el siguiente conjunto de operaciones:

__Ejemplo 10.2:  Rotar el Acumulador a la Izquierda__

#|
*|Ciclo|Bus de Direcciones|Bus de Datos|Operación Interna|Operación Externa|*
||1|100|OP CODE|Obtener Siguiente 
OP CODE|Finalizar Operación Previa;
Incrementar PC a 101||
||2|101|Siguiente OP CODE|Obtener
OP CODE Descartado|Decodificar Instrucción Actual;
Almacenar Contador-P||
||3|101|Siguiente OP CODE|Obtener Siguiente OP CODE|Desplazar a través del Sumador||
||4|102|?|Obtener Segundo Byte|Almacenar resultado en A;
Interpretar el Siguiente OP CODE||
|#

Como podemos ver, las instrucciones del Acumulador tienen el mismo efecto que las instrucciones de un sólo byte no relativas a la Pila, en el sentido de que la instrucción contiene tanto el OP CODE como el registro en el que van las operaciones a realizar; por lo tanto, en el ciclo 2, el microprocesador contiene el Contador de Programa y en el ciclo 3, obtiene la misma ubicación del Contador de Programa e inicia la operación de la siguiente instrucción. Al mismo tiempo, se transfieren los resultados del sumador al Acumulador; esto se debe a la anticipación y características de segmentación (pipelining) de la familia MCS650X. El cambio del Acumulador y las operaciones de rotación toman 2 ciclos y sólo 1 byte de memoria.

===10.6 INSTRUCCIONES DE LECTURA/MODIFICACIÓN/ESCRITURA===

La familia de microprocesadores MCS650X tiene una serie de instrucciones que permiten al usuario cambiar el contenido de la memoria directamente con una sola instrucción. Estas incluyen todas las instrucciones de desplazamiento, rotación, incremento y decremento de la memoria. El funcionamiento de cada una de estas instrucciones es el mismo, en el sentido de que el modo de direccionamiento que se define para la instrucción se implementa de la misma manera que para las instrucciones normales. Después de que la dirección se ha calculado, se utiliza la dirección efectiva para leer la ubicación de la memoria en la unidad aritmética del microprocesador (ALU). La ALU realiza la operación y luego usa la misma dirección efectiva para volver a escribir los resultados en la memoria. La operación más difícil es el modo de direccionamiento Absoluto Indexado que se ilustra en el ejemplo 10.3 para la instrucción de rotación a la izquierda, ROL: 

__Ejemplo 10.3:  Rotar Memoria a la izquierda, Usando Direccionamiento Absoluto, X__

#|
*|Ciclo|Bus de Direcciones|Bus de Datos|Operación Interna|Operación Externa|*
||1|100|OP CODE|Obtener OP CODE|Terminar Opeeración Previa;
Incrementar PC a 101||
||2|101|ADL|Obtener ADL|Decodificar instrucción actual, Incrementar PC a 102||
||3|102|ADH|Obtener ADH|Sumar ADL+X, Incrementar PC a 103||
||4|ADH, ADL + X|?|Lectura Falsa|Sumar el Acarreo de la Suma previa a ADH||
||5|ADH + C, ADL + X|Datos|Obtener valor| ||      
||6|ADH + C, ADL + X|?|Destruir Memoria|Ejecutar Rotación, Activar Escritura||
||7|ADH + C, ADL + X|Datos Desplazados|Almacenar Resultados|Establecer Banderas||
||8|103|OP CODE|Obtener Siguiente OP CODE|Incrementar PC a 104||
|#

El ciclo 4 es un ciclo desperdiciado porque la instrucción de lectura/modificación/escritura debe esperar hasta que la bandera de Acarreo haya sido sumada al byte superior de la dirección para evitar escribir en una ubicación de memoria falsa. Esta es la misma lógica que se utiliza en la instrucción de almacenamiento, en la que el modo de direccionamiento con anticipación o atajo no es aprovechado. El ciclo 4 es una lectura intermedia, y el ciclo 5 es cuando se leen los datos reales con los que se va a operar.
Las líneas de dirección ahora mantienen esa dirección durante los ciclos 5, 6 y 7. El microprocesador señala tanto a sí mismo como para el mundo exterior esas operaciones durante el cual ignorará la línea RDY (Ready - listo). Lo hace estableciendo en 1 la línea R/W (Read/Write - Lectura/Escritura). La línea R/W se establece en 1 en el ciclo 6 porque se escriben datos en la ubicación de memoria en la que se volverá a escribir de nuevo en el ciclo 7, pero con datos correctos. 
Debido a que los bits de datos leídos de la memoria deben modificarse y devolverse, no hay efecto de segmentación (pipelining) aparte de la superposición de la suma entre el byte inferior de la dirección y el registro Índice. Los 7 ciclos que se necesitan para ejecutar la instrucción de lectura/modificación/escritura en modo Absoluto Indexado, corresponden al peor caso en el tiempo para cualquier sección de la máquina a excepción de las interrupciones. Esta habilidad única de modificar la memoria directamente es quizás mejor ilustrada en el código del Ejemplo 10.4 que se usa para desplazar un número BCD de 4 bits, el que ha sido almacenado en los 4 bits superiores del Acumulador como parte de la operación de decodificación, desde el Acumulador a una posición de memoria. La figura 10.1 es un diagrama de flujo de este ejemplo. Ejemplos como este a menudo ocurren en terminales de punto de venta y otras máquinas en las que los datos BCD son ingresados secuencialmente. Este ejemplo asume que el valor se ingresa con el teclado, a través del cual los datos se introducen en el Acumulador de izquierda a derecha, pero tienen que ser desplazados en la memoria de derecha a izquierda. El valor del campo antes del desplazamiento es 1729, el que después del desplazamiento corresponderá a 17.295. 

((https://www.atariware.cl/archivos/mcs6500/ch10_05.webp align=center))

__Ejemplo 10.4: Mover un Nuevo Número BCD a un Campo__

#|
*| |Antes|Después|*
||Campo|00 
00
17
29|00
01
72
95||
||Acumulador|50|00||
|#

Codificación

#|
*|Bytes|Instrucción|Comentario|*
||2|LDY 4| ||
||2 BUCLE-2|LDX 4|Configurar 4 movidas||
||1|ASL A| ||
||3 BUCLE-1|ROL Precio-1, X| ||
||1|DEX|Desplazar el campo 1 bit||
||2|BNE BUCLE-1| ||
||1|DEY|Desplazar cuatro veces.||
||2|BNE BUCLE-2| ||
||14 bytes| | ||
|#

Hay varios conceptos nuevos introducidos en este ejemplo; el primero es el uso del registro Índice Y como un simple contador para contar el número de veces que el carácter ha sido desplazado 1 bit. El uso de desplazamiento de bits para cambiar los datos en la memoria, tal como se encuentra implementado en la familia MCS650X, es un enfoque común.  El cambiar bits de un byte al siguiente usando sólo la instrucción ROL indexado es una muestra del poder que tiene la capacidad de comunicarse directamente con la memoria. Este ejemplo usa un bucle anidado; nótese que el bucle LOOP-1 ocurre 4 veces cada vez que ocurre el bucle LOOP-2. El bucle interno es muy importante en el sentido de que se ejecuta 16 veces en este caso; por lo tanto, se debe optimizar su tiempo de ejecución. 
Además de tener la capacidad de desplazar y rotar, la familia MCS650X tiene la capacidad de incrementar y disminuir posiciones de memoria.

{{anchor href="INC"}}
===10.7 INC-INCREMENTAR EN UNO EL CONTENIDO DE UNA DIRECCIÓN DE MEMORIA===

Esta instrucción suma 1 al contenido de la posición de memoria direccionada. 
La notación simbólica es M + 1 → M. 
La instrucción de incremento de memoria no afecta a ningún registro interno ni a las banderas de Acarreo ni de Desbordamiento. Si el bit 7 es activado como el resultado del incremento, la bandera Negativo se establece en 1; de lo contrario, se borra; si el incremento hace que el resultado sea 0, la bandera Z se establece en 1; de lo contrario, se borra. 
Los modos de direccionamiento para la instrucción de incremento son: Página Cero; Página Cero, X; Absoluto; Absoluto, X. 

{{anchor href="DEC"}}
===10.8 DEC-DECREMENTAR EN UNO EL CONTENIDO DE UNA DIRECCIÓN DE MEMORIA===

Esta instrucción le resta 1, en complemento a dos, al contenido de la posición de memoria direccionada. 
La notación simbólica para esta instrucción es M - 1 → M. 
La instrucción de decremento no afecta a ningún registro interno en el microprocesador. No afecta a las banderas de Acarreo ni Desbordamiento. Si el bit 7 es activado como resultado del decremento, entonces la bandera Negativo se establece en 1; de lo contrario, se borra. Si el resultado del decremento es 0, la bandera Z se establece en 1; de lo contrario, se borra. Los modos de direccionamiento para la instrucción de decremento son: Página Cero; Página Cero, X; Absoluto; Absoluto, X. 
En muchos ejemplos a lo largo del informe, hemos utilizado la capacidad de incrementar y decrementar registros en los microprocesadores. La ventaja del incremento o decremento en memoria es que es posible mantener contadores externos o influir directamente en el valor de un bit por medio de estas instrucciones. A veces son útiles durante instrucciones de E/S. 

===10.9 NOTAS GENERALES SOBRE LAS INSTRUCCIONES DE LECTURA/MODIFICACIÓN/ESCRITURA===

La capacidad de leer, modificar y escribir en la memoria es exclusiva de los microprocesadores de la serie MCS6500. La utilidad de las instrucciones está limitada únicamente por el enfoque del usuario al momento de organizar la Memoria. Aunque las instrucciones son bastante largas en ejecución, son significativamente más cortas que el tener que cargar y guardar otros registros para realizar la misma función. La experiencia a la hora de organizar programas para aprovechar esta manipulación de la memoria le permitirá al usuario apreciar plenamente el poder de estas instrucciones.