Pregunta

Actualmente estoy desarrollando un emulador para el Buen Viejo GameBoy y estoy enfrentando algunos problemas, entiende cómo se deben implementar algunos códigos de operación básicos.

ahora mismo estoy implementando las operaciones; Los primeros (0xa0 -> 0xa3; 0xa6 & 0xa7) son bastante rectos, pero las operaciones de los registros H, L son un poco diferentes.

Puede descargar la documentación del Z80 debajo de este enlace: um0080.pdf (página 172)

Aquí hay algunos ejemplos para mostrar lo que quiero decir (con el pseudo-código) y básicamente lo que hago:

y a, h (note el cambio de bits)

(read HL register; >> 8) save in cache C
R->C = R->HL >> 8;

perform AND operation with cache
AND_H(R->C);
R->A &= R->C;

y a, L (nota el enmascaramiento de bits)

(read HL register; &0xFF) save in cache C
R->C = R->HL &0xFF;

Conozco todas las operaciones de bits y sé lo que hacen, pero parece que no puedo averiguar por qué es necesario que se haga así. Tengo algunas teorías (corríjame si estoy equivocado: -)):

Lo que ya entendí es, que los registros H y L son básicamente el registro HL, que es un registro de 16 bits. Dado que la CPU / bus solo puede manejar las operaciones de 8 bits, debe ser dividida; O la sugerencia más lógica: dado que es solo un solo registro, los valores de H y L están enmascarados en el registro y simplemente deben separarse entre sí (mordisco superior / inferior?).

Estaría profundamente agradecido si alguien puede hacerlo más claro para mí porque solo quiero tener más conocimiento de antecedentes (cómo funciona todas estas cosas internamente), así que es muy importante para mí que sé lo que estoy haciendo.

¿Fue útil?

Solución

A medida que se señalan los comentarios, el hecho de que la implementación ha encontrado tiendas, los registros H y L se registran juntos como la entidad HL de 16 bits y luego se descompone de que en H al cambiar el derecho y en L en el enmascaramiento es puramente una implementación. específico.

El Z80 original tiene un ALU de 4 bits (consulte los comentarios de Shima que comienzan en la parte inferior de la página 9 en esta transcripción de un panel de museo de historial de computadora ) por lo que en realidad (i) y los cuatro bits de L y el acumulador de cuatro bajos; Luego (ii) y los cuatro bits de L y el acumulador. Sin embargo, expone a sus registros como entidades discretas de 8 bits para que la implementación interna esté completamente oculta.

HL se llama pareja de registro porque son dos registros tomados juntos para hacer una cantidad de 16 bits. Ignorando los registros de sombra e índice, el Z80 original en realidad tiene tres de esos: HL, BC y DE. BC y DE Sobreviven en la CPU de GameBoy como pares alternativos para la carga indirecta (como el opcode 0x1a - LD A, (BC)) y para la aritmética de 16 bits (por ejemplo, 0x09 agregan HL, BC) y tienen algunos otros usos en un z80.

SP y PC se consideran generalmente considerados como registros indivisibles de 16 bits (aunque, por supuesto, pueden dividirlos almacenándolos a la memoria y leer los bytes de vuelta individualmente) y existe AF para empujar y aparecer, pero F es un especial. Caso que AF no suele ser particularmente útil como un entero de 16 bits.

Resumen corto Luego: no tiene problemas con la comprensión de cómo los opodes tienen que ser implementados, simplemente cómo han sido implementados por un autor en particular.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top