Duda con instrucciones de carga

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Responder
sejuan
Jack The Nipper
Mensajes: 155
Registrado: Mié May 09, 2007 10:25 am

Duda con instrucciones de carga

Mensaje por sejuan » Sab Jun 13, 2015 9:22 am

Hay una serie de instrucciones de carga que no entiendo muy bien el motivo por el que fueron incorporadas al z80. Supongo que debe tener algún sentido y por eso pregunto por aquí. Que siempre habrá gente que pueda responder a mi ignorancia supina.
¿Qué motivo tiene la siguiente instrucción?
ld a,a
Seguro que hay infinidad de casos en los que usarlo, pero no se me ocurre ninguno. :oops: Salvo el que a posteriori en el programa puedas cambiar el segundo registro por otro cualquiera, claro.

¿No hubiera sido mucho más útil esta otra?
ld a,a'
Al menos a mí me hubiera resultado más útil. Si tenemos ex af,af' pero hay veces que necesitas que tanto A como A' contenga la misma información. Y no puedes o no quieres usar otros registros ni la pila.
Osea que si ld a,a' hubiera existido y hubiera gastado los estados que ld a,b hubiera estado muy bien.
En fin.

zup
Freddy Hardest
Mensajes: 666
Registrado: Vie Ago 15, 2008 2:43 pm

Re: Duda con instrucciones de carga

Mensaje por zup » Sab Jun 13, 2015 10:37 am

Existen porque tienen que existir, ya que eso simplifica mucho la construcción del microprocesador.

Es tan simple como que cada registro de uso general en el Z80 tiene asociado un número (de 0 a 7) y ese número acaba "incrustado" en el opcode. Las instrucciones ld a,registro (en binario) son las siguientes:

ld a,b --> 01111000
ld a,c --> 01111001
ld a,d --> 01111010
ld a,e --> 01111011
ld a,h --> 01111100
ld a,l --> 01111101
ld a,(hl) --> 01111110
ld a,a --> 01111111

Hay alguna más (ld a,r o ld a,i) y fíjate que el acceso a memoria (hl) se trata como si fuera un registro.

De manera que cuando la unidad de ejecución del Z80 se encuentra con un opcode del tipo 01111xxx, sabe que los últimos 3 bits son el registro origen (aún iría más lejos, creo que un opcode 01xxxyyy codifica tanto el registro origen como el destino). Hasta ahí vamos bien.

Internamente, eso significa que la CPU tiene que "abrir" la puerta de un registro (a) para recibir los datos de otro registro. A estos niveles ya no es un tema de programación, sino de electrónica. Lo que estás haciendo es menear datos por un bus interno, y cada opcode genera señales eléctricas dentro del microprocesador.

Ahora ya sabes cómo lo hace, pero no por qué existen estas instrucciones. Como ya he dicho, tenerlas simplifica mucho la vida. Si quisieras asignar el opcode de ld a,a (o el de ld b,b) a otra instrucción, ya no te valdría la regla de que si empieza por 01111xxx es un ld a,a... lo que te complica la vida. Esto es así tanto a nivel electrónico como si quisieras hacer un emulador en C. Meter excepciones suele traer dolores de cabeza siempre. En ese sentido, es mejor tenerlas ahí aunque no se usen que tener que meter un porrón de transistores para eliminarlas. En la tabla de opcodes del Z80, la única excepción a la regla del 01xxxyyy es la instrucción 01110110 (debería ser ld (hl),(hl)) que en realidad es halt. Supongo que es intencional, aunque podría ser resultado de la arquitectura del z80.

Todavía te faltan algunas instrucciones para completar el juego de ld a,"algo". Básicamente las que se encargan de registros indexados (prefijos FD y DD), ld a,r y ld a,i. Por ejemplo, si el z80 se encuentra una byte FD, sabe que debe sustituir (hl) por (IY+nn). De nuevo, debido a que simplifica el diseño, nos encontramos cosas "raras". Supuestamente IY es un registro de 16 bits indivisible, pero hay una serie de operaciones no documentadas para tratar con las mitades de ese registro. Por ejemplo, ld h,a con el prefijo FD se convertiría en ld iyh,a (cargar la parte alta del registro IY con el contenido de a). Esto no es una instrucción oficial, pero si mal no recuerdo lo usan las protecciones speedlock y alkatraz. Ahí tenemos otro ejemplo de instrucciones que no deberían existir.

Las otras dos que quedan, ld a,r y ld a,i pertenecen al juego de instrucciones "extendidas" (prefijo ED).

Hay mejores electrónicos por aquí que lo podrían explicar mejor... yo hablo un poco de memorieta. En esta página tienes el juego de instrucciones del z80, que muestra un poco como las han organizado.
Última edición por zup el Sab Jun 13, 2015 11:04 am, editado 1 vez en total.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...

sejuan
Jack The Nipper
Mensajes: 155
Registrado: Mié May 09, 2007 10:25 am

Re: Duda con instrucciones de carga

Mensaje por sejuan » Sab Jun 13, 2015 10:57 am

Osea que existen por utilidad en la propia construcción del micro. Muchas gracias por la respuesta Zup.

Avatar de Usuario
climacus
Sabreman
Mensajes: 411
Registrado: Mar Ago 25, 2009 1:46 pm

Re: Duda con instrucciones de carga

Mensaje por climacus » Sab Jun 13, 2015 11:20 am

Qué interesante!!!!
Muchas gracias.
Todos mis juegos en formato físico
http://www.matranet.net/boutique/zx/zx.php

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 9 invitados