CPI compara un valor inmediato con el acumulador, utilizando internamente una operación de resta:
En particular, el bit cero se establece si las cantidades son iguales y se restablece si son desiguales.
Dado que se realiza una operación de resta, el bit de acarreo se establecerá si no se lleva a cabo el bit 7, lo que indica que los datos inmediatos son mayores que el contenido del acumulador, y se restablecerá de otra manera.
(Algunas notas sobre el uso aquí: estoy usando I para el valor medio I y A para el A ccumulator).
- Primera comparación: (A < 0) - > ERR
Por lo tanto, está buscando que el bit de acarreo sea 1 ( I > A ) para la primera rama ERR. Eso se puede lograr con JC (Jump if Carry).
- Segunda comparación: (A > 9) - > ERR
El segundo CPI quiere ver si I < A , que usar el mismo método que el anterior hace que las cosas sean un poco difíciles. Debe saber que el bit de transporte no está establecido ( I < = A ) y el bit cero no está establecido, lo que obtiene un poco complicado.
JNC realiza un Salto si no lleva, y JZ realiza un Salto si es cero. Así que quieres combinarlos.
En primer lugar, usted sabe que el bit cero no debe establecerse bajo ninguna circunstancia. El bit que se establece indicaría que los dos valores son los mismos, lo que es válido. Así que primero puedes revisar ese bit para descartarlo. La configuración de Z significa que es una entrada válida ('9') independientemente del estado del acarreo:
JZ GOOD
Y luego, si el bit de transporte no está configurado, puede hacer un JNC a su rutina de error:
JNC ERR
Y finalmente, dalo en algún lugar para la etiqueta BUENO para saltar a:
GOOD:
Así que para envolverlo todo:
CPI '0' ; Compare with '0'
JC ERR ; Jump to ERR if Acc < '0'
CPI '9' ; Compare with '9'
JZ GOOD ; Jump to GOOD if Acc == '9'
JNC ERR ; Jump to ERR if Acc > '9'
GOOD: NOP ; This is where we end up if it's all valid.
Entonces, cuando hagas un CPI, puedes probar las tres cosas: exactamente igual a (Z = 1), menor que (C = 1) y mayor que o igual a (C = 0).
Si desea perder alguna legibilidad, pero puede guardar un byte o dos de espacio en el programa, en lugar de comparar su límite superior con '9', compárelo con '9' + 1, que es ':'. De esa manera, solo está realmente interesado en la parte "menos que" del IPC, y todos los demás van a ERR:
CPI '0' ; Compare with '0'
JC ERR ; Jump to ERR if Acc < '0'
CPI ':' ; Compare with '9'+1 = ':'
JNC ERR ; Jump to ERR if Acc >= ':'