Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previaÚltima revisiónAmbos lados, revisión siguiente | ||
cursos:ensamblador:avanzadas2 [12-01-2024 15:11] – [Uso de los Shadow Registers] sromero | cursos:ensamblador:avanzadas2 [19-01-2024 08:35] – [Uso de los Shadow Registers] sromero | ||
---|---|---|---|
Línea 17: | Línea 17: | ||
<code z80> | <code z80> | ||
- | | + | |
loop: | loop: | ||
; ... código de nuestro bucle ... | ; ... código de nuestro bucle ... | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
</ | </ | ||
- | El problema es que tenemos que hacer operaciones costosas como el '' | + | El problema es que tenemos que hacer operaciones costosas como el '' |
Para eso, esta página nos propone aprovechar '' | Para eso, esta página nos propone aprovechar '' | ||
- | Poniendo B a 0, tras ejecutar el código 1 vez, se decrementa B, con lo que pasa a valer $FF (255), así que nos aseguramos 255 ejecuciones más la inicial, total 256. | + | Poniendo B a 0, tras ejecutar el código 1 vez, se decrementa B, con lo que pasa a valer $ff (255), así que nos aseguramos 255 ejecuciones más la inicial, total 256. |
Debido a esto, podemos hacer algo como lo siguiente: partimos el número de 16 bits a iterar en 2 registros e iteramos el primero un total de veces almacenado en el segundo. Cada vez que el primer registro llegue a cero, volveremos a iterar 256 veces, salvo la primera vez que iteramos el " | Debido a esto, podemos hacer algo como lo siguiente: partimos el número de 16 bits a iterar en 2 registros e iteramos el primero un total de veces almacenado en el segundo. Cada vez que el primer registro llegue a cero, volveremos a iterar 256 veces, salvo la primera vez que iteramos el " | ||
Línea 38: | Línea 38: | ||
<code z80> | <code z80> | ||
- | | + | |
- | | + | |
loop: | loop: | ||
; ... código de nuestro bucle ... | ; ... código de nuestro bucle ... | ||
- | | + | |
- | | + | |
- | | + | |
</ | </ | ||
- | Este bucle iterará un total de 522 veces ($050A). | + | Este bucle iterará un total de 522 veces ($050a). |
Ahora la pregunta es ¿cómo calculamos los valores que tenemos que poner en D y en B? | Ahora la pregunta es ¿cómo calculamos los valores que tenemos que poner en D y en B? | ||
Línea 55: | Línea 55: | ||
<code z80> | <code z80> | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
</ | </ | ||
Línea 64: | Línea 64: | ||
<code z80> | <code z80> | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
loop: | loop: | ||
; ... código de nuestro bucle ... | ; ... código de nuestro bucle ... | ||
- | | + | |
- | | + | |
- | | + | |
</ | </ | ||
Línea 78: | Línea 78: | ||
<code z80> | <code z80> | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
loop: | loop: | ||
; ... código de nuestro bucle ... | ; ... código de nuestro bucle ... | ||
- | | + | |
- | | + | |
- | | + | |
</ | </ | ||
Línea 95: | Línea 95: | ||
El bucle de 16 bits estándar que hemos visto en el primer ejemplo utiliza 4 instrucciones para hacer el bucle, lo que suma un total de 28 ciclos de reloj o T-states por iteración. | El bucle de 16 bits estándar que hemos visto en el primer ejemplo utiliza 4 instrucciones para hacer el bucle, lo que suma un total de 28 ciclos de reloj o T-states por iteración. | ||
- | En cambio, el bucle con '' | + | En cambio, el bucle con '' |
El bucle exterior se ejecuta de forma poco frecuente (1 vez cada 256 iteraciones), | El bucle exterior se ejecuta de forma poco frecuente (1 vez cada 256 iteraciones), | ||
Línea 111: | Línea 111: | ||
* https:// | * https:// | ||
- | Finalmente, un caso muy interesante del uso de '' | + | Finalmente, un caso muy interesante del uso de '' |
Por ejemplo, supongamos que hacemos un scroll de un bitmap así: | Por ejemplo, supongamos que hacemos un scroll de un bitmap así: | ||
<code z80> | <code z80> | ||
- | | + | |
- | | + | |
</ | </ | ||
Línea 125: | Línea 125: | ||
<code z80> | <code z80> | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
</ | </ | ||