La mayoría de la gente supone que el número 1789 significa mil setecientos ochenta y nueve, ó 1 x 10^^3^^ + 7 x 10^^2^^ + 8 x 10^^1^^ + 9 x 10^^0^^. Sin embargo, hasta que se defina la base numérica, podría significar
%%(wacko wrapper=text wrapper_align=center)1 x 16^^3^^ + 7 x 16^^2^^ + 8 x 16^^1^^ + 9 x 16^^0^^%%
lo que corresponde a hexadecimal, la forma utilizada en un microprocesador.
Para distinguir entre números en diferentes bases, los matemáticos suelen escribir 178910 o simplemente 1789 base 10, o decimal, y 178916 para base 16, o hexadecimal. Debido a que muy pocas computadoras o dispositivos de E/S permiten subíndices, todos los números hexadecimales están precedidos por la notación $. Entonces 1789 significa base 10 y $1789 significa base 16. ¿Por qué hexadecimal? Porque ésta es una forma cómoda de representar 2 dígitos en 8 bits.
El MCS650X es un microprocesador orientado al byte, lo que significa que la mayoría de las operaciones tienen operaciones de 8 bits.
Hay 2 formas de entender 8 bits. El primero es que corresponden a 8 bits individuales en los que 00001000 significa que el bit 3 (bit 7 para la representación) está activado y todos los demás bits están desactivados; o como un número binario de 8 bits, en cuyo caso el valor es
%%(wacko wrapper=text wrapper_align=center)0 x 2^^7^^ + 0 x 2^^6^^ + 0 x 2^^5^^ + 0 x 2^^4^^ + 1 x 2^^3^^ + 0 x 2^^2^^ + 0 x 2^^1^^ + 0 x 2^^0^^ = 8 ó $08.%%
Para fines de análisis lógico, cada bit es único; pero para fines aritméticos, los 8 bits se tratan como un número binario.
__Reglas de la Aritmética Binaria:__
%% 0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 0 con un Acarreo%%
El acarreo ocurre cuando el número resultante es demasiado largo para la base. En decimal, 8 + 4 = 2 + 10.
En hexadecimal, $8 + $4 = $C (Ver detalles de la notación hexadecimal), de modo que 8 + 4 tiene un acarreo en base 10 pero no en base 16.
Usando estas reglas para sumar 8 + 2 en binario nos da lo siguiente:
00001000 8 1 x 2^^3^^
00000010 +2 1 x 2^^1^^
00001010 10 1 x 2^^3^^ + 1 x 2^^1^^
Por lo tanto, cualquier número del 0 al 255 se puede representar en 8 bits y la suma binaria se puede realizar utilizando la ecuación básica de suma binaria, Rvvjvv =(Avvjvv --∨-- Bvvjvv --∨-- Cvvj-1vv), donde tal como se definió anteriormente, --∨-- es la notación de la operación "O Exclusivo".
En la mayoría de las aplicaciones, también es necesario restar. Las operaciones de resta requieren una implementación de hardware diferente o, en su defecto, una nueva forma de representar números.
Una combinación de lo anterior es implementar un inversor simple en cada bit.
Esto produciría
%% 00001100 12
11110011 -12%%
Sin embargo, al restar 12 con 12, el resultado también debería ser 0.
%% 00001100 +12
11110011 -12
11111111 0%%
Sin embargo, si se suma el Acarreo al número complementado:
%% 1 Acarreo
00001100 12
11110011 -12
00000000 = 0%%
Si en lugar de representar -12 como complemento de 12, se representa como complemento más acarreo, se obtiene lo siguiente:
%% 11110011 = 12
1 = Acarreo
11110011 -12
00001100 = +12
00000000 = 0%%
A esta representación se llama complemento a dos y representa la forma en que se guardan los números negativos en los microcomputadores. A continuación se muestran ejemplos de números negativos representados en forma de complemento a dos.
%%-0 = 00000000
-1 = 11111111
-2 = 11111110
-3 = 11111101
-4 = 11111100
-5 = 11111011
-6 = 11111010
-7 = 11111001
-S = 11111000
-9 = 11110111%%
La notación Hexadecimal es la representación de números en base 16. La siguiente tabla muestra las ventajas de esta notación:
%% Hexadecimal Binario Decimal
0 0000 00
1 0001 01
2 0010 02
3 0011 03
4 0100 04
5 0101 05
6 0110 06
7 0111 07
8 1000 08
9 1001 09
A 1010 10
B 1011 11
C 1100 12
D 1101 13
E 1110 14
F 1111 15%%
Dado que 16 es múltiplo de 2, la notación hexadecimal es una abreviatura conveniente para la representación de 4 dígitos o bits binarios. Las reglas de la aritmética también se cumplen.
%% Binario Hexadecimal
0100 1111 4F
+ 0110 0010 + 62
1011 0001 Bl%%
Para aprovechar esta abreviatura, todas las direcciones de este manual se muestran en notación hexadecimal. Cabe señalar que el lector deberá aprender a operar en Hexadecimal lo antes posible. La traducción continua a decimal requiere mucho tiempo y es propensa a errores. Trabajar en hexadecimal y binario le obligará rápidamente a aprender la manipulación hexadecimal y a familiarizarse a trabajar con esta cómoda representación.
Aunque muchas operaciones se pueden realizar exitosamente con operaciones binarias, algunas se realizan mejor en modo decimal. Aunque el uso de un carácter decimal por byte sería una forma legítima de resolver este problema, se trata de un uso ineficiente de la capacidad del byte de 8 bits.
El microprocesador permite el uso de representación BCD empaquetada. Esta representación es, en forma de 4 bits:
%% 0 = 0000
1 = 0001
2 = 0010
3 = 0011
4 = 0100
5 = 0101
6 = 0110
7 = 0111
8 = 1000
9 = 1001%%
En BCD, el número 79 está representado por:
%% Binario BCD Hexadecimal
01111001 = 79 = 79%%
El microprocesador tiene esto en cuenta automáticamente y corrige el hecho de que
%% Decimal BCD Hexadecimal
79 = 01111001 79 = 01111001
+12 = 00010010 12 = 00010010
91 = 10010001 88 = 10001011%%
La única diferencia entre la representación Hexadecimal y BCD es que el microprocesador se ajusta automáticamente al hecho de que BCD no permite valores hexadecimales de la A a la F durante las operaciones de suma y resta.
El desplazamiento que sigue a una instrucción de bifurcación está en forma de complemento a dos con signo, lo que significa que
%% $+50 = +80 = 01010000
y $-50 = -80 = 10110000
Prueba = 00000000%%
El signo de esta operación está en el bit 7, donde un 0 es igual a positivo y un 1 es igual a negativo.
Este bit es correcto para la representación en complemento a dos, pero también indica al microprocesador si debe considerar el acarreo o el préstamo del byte superior de la dirección.
Los siguientes cuatro ejemplos representan las combinaciones de compensaciones (offsets) que pueden ocurrir (Todas las notaciones están en hexadecimal):
Ejemplo H.4.1: Referencia hacia adelante, sin cruce de página
%% 0105 BNE
0106 +55
0107 Siguiente OP CODE%%
Para calcular la siguiente instrucción, si se tomó la bifurcación:
%% Offset +55 01010101
Dirección Inferior
del siguiente
OP CODE 07 00000111
5C 01011100%%
sin acarreo, dando como resultado 015C.
__Ejemplo H.4.2: Referencia hacia atrás, sin cruce de página__
%% 015A BNE
015B -55
015C Siguiente OP CODE%%
Para calcular si se toma la bifurcación,
%% Offset -55 = AB = 10101011
+ Dirección Inferior del
Siguiente OP CODE +55 = 5C = 01011100
07 07 00000111%%
Debido al desplazamiento negativo se espera un acarreo, el que se ignora, lo que nos da como resultado 0107.
__Ejemplo H.4.3 : Referencia hacia atrás, con cruce de página__
%% 0105 BNE
0106 -55
0107 Siguiente OP CODE%%
Para calcular si se toma la bifurcación, primero calcule el byte inferior
%% Offset -55 = AB = 10101011
Dirección Inferior del
Siguiente OP CODE 07 = 07 = 00000111
B2 = B2 = 10110010%%
No hay acarreo de una compensación negativa; por lo tanto, se debe realizar un acarreo:
%% -1 = -1 = FF = 11111111
+ Byte Superior = 01 = 01 = 00000001
00 00 00000000%%
Esto da como resultado 00 B2.
__Ejemplo H.4.4: Referencia hacia adelante, con cruce de página__
%% 00B0 BNE
00B1 +55
00B2 Siguiente OP CODE%%
Para calcular la siguiente instrucción si se toma la bifurcación.
%% Offset 55 = 01010101
Byte Inferior
del Siguiente
OP CODE B2 = 10110010
07 00000111%%
con acarreo de número positivo.
%% +1 1 = 00000001
Byte Superior 00 = 00000000
1 = 00000001%%
lo que nos da 0107.
((https://www.atariware.cl/archivos/mcs6500/apph_01.webp))
((https://www.atariware.cl/archivos/mcs6500/apph_02.webp))
((https://www.atariware.cl/archivos/mcs6500/apph_03.webp))
((https://www.atariware.cl/archivos/mcs6500/apph_04.webp))
((https://www.atariware.cl/archivos/mcs6500/apph_05.webp))
((https://www.atariware.cl/archivos/mcs6500/apph_06.webp))