M cycles, T states. IX, IY vs HL

Door assembler

Champion (378)

afbeelding van assembler

05-10-2010, 19:29

Estoy tratando de optimizar un código antes de que crezca demasiado, y se me plantean varias dudas.

Para ver si una instrucción o conjunto de ellas es más optima que otra u otras, basta con considerar los T states, o tiene algo que ver los M Cycles. (Así es como lo he leido, pero se me antoja que serían M States y T Cycles, ¿no?).

Otra cosa, Para acceder a la "estructura" de datos de cada jugador, he creado las siguientes variables:

tanque_x equ 0
tanque_x_dec equ 1
tanque_y equ 2
tanque_y_dec equ 3
tanque_dir equ 4
tanque_dx equ 5
tanque_dx_dec equ 6
tanque_dy equ 7
tanque_dy_dec equ 8
tanque_retdir equ 9
tanque_retdir_dec equ 10
tanque_retmov equ 11
tanque_retmov_dec equ 12

tanque1:
x1: .word
y1: .word
dir1: .byte
dx1: .word
dy1: .word
ret_dir1: .word
ret_mov1: .word
relleno1: ds (32-13)

tanque2:
x2: ...
x2: ...

para cada ciclo, hago
LD IX, tanque(lo que corresponda)

y para ver cada valor
LD H,[ix+tanque_x]
LD L,[ix+tanque_x_dec]
y similares

Para hacerlo con HL, tendría que calcular cada vez que quiero usar una variable, el desplazamiento para cada jugador y el desplazamiento de la variable.

No he pensado todavía como hacerlo, no me he puesto, pero si me pudierais decir qué es mejor, si dejarlo con IX, o intentar hacer algo sin usar ese registro, igual puedo "ahorrarme unos cuantos ciclos de reloj (yo)"

Muchas gracias.

Aangemeld of registreer om reacties te plaatsen

Van anonymous

incognito ergo sum (109)

afbeelding van anonymous

06-10-2010, 15:35

Si tienes varias estructuras similares (en tu caso parece que son tanques), yo te recomiendo que uses IX. El código quedará mucho más claro aunque el acceso no sea todo lo rápido que sería con HL... siempre que todos los accesos estuvieran agrupados.

En el momento en el que tuvieras que acceder a una propiedad concreta de la estructura, tendrías que andar sumando a HL el desplazamiento hasta la propiedad seleccionada, lo cual ya complica el código y enlentece todo el acceso.

En resumen: mi recomendación es que uses IX (yo lo hago en el QBIQS).

Van assembler

Champion (378)

afbeelding van assembler

06-10-2010, 16:15

Ok, con tu ejemplo tengo suficiente.

Otra cosa, para el tema de optimización, con los ciclos tengo bastante?
Es decir, (es solo un ejemplo de instrucciones, voy a seguir usando IX+o)

LD (HL),n 10 ciclos
LD (IX+o),n 19 ciclos

Esa instrucción con IX tarda casi el doble que con HL, ¿así de simple? (entiendo que para hacerlas equivalentes tendría que cargar HL con la posición inicial, y sumarle el desplazamiento, así que termina tardando más)

Muchas gracias SapphiRe

Van anonymous

incognito ergo sum (109)

afbeelding van anonymous

12-10-2010, 09:46

Si las tablas son lo suficientemente pequeñas, no vas a tener ningún problema. De otra forma imagina que tendrías que hacer por ejemplo lo siguiente:

LD HL,XXXX
LD E,desplazamiento
LD D,0
ADD HL,DE
LD [HL],dato

mientras que con IX sería

LD IX,XXXX
LD [IX+desplazamiento],dato

Suma ciclos y verás qué te sale más rentable. Si vas a tener estructuras similares para diferentes objetos y puedes acceder a ellas con los registros índice no lo dudes Big smile

Van assembler

Champion (378)

afbeelding van assembler

23-10-2010, 10:56

Definitivamente, es más cómodo usar IX e IY.

Para ciertos cálculos "precisos" he utilizado el hook de la dirección 0xFD9F. Pero he comprobado que se ejecuta "pocas" veces por segundo.

¿Hay alguna forma de modificar la frecuencia con que se llama a esa interrupción, o usar otra que se ejecute más veces?
Question