Calcular tiempo de ejecución rutina
Reglas del Foro
Debido a que hay varios temas pidiendo ayuda para programar en ensamblador máquinas distintas al Amstrad CPC, con micro distinto al Z80 y que incluso dependen del sistema operativo, nos vemos en la necesidad de poner por escrito que estos posts son bienvenidos pero que no es el lugar adecuado ya que por estos lares nos dedicamos más al ensamblador del Z80, un microprocesador de 8 bits que tuvo su gran auge en ordenadores y consolas de los años 80.
De todas formas, esto no quita que alguien que sepa del asunto pueda postear alguna respuesta pero es más fácil encontrar foros dedicados a programar en ensamblador en Windows o MS-DOS que ayudarán más que nosotros:
http://www.lawebdelprogramador.com/news ... nsamblador
Debido a que hay varios temas pidiendo ayuda para programar en ensamblador máquinas distintas al Amstrad CPC, con micro distinto al Z80 y que incluso dependen del sistema operativo, nos vemos en la necesidad de poner por escrito que estos posts son bienvenidos pero que no es el lugar adecuado ya que por estos lares nos dedicamos más al ensamblador del Z80, un microprocesador de 8 bits que tuvo su gran auge en ordenadores y consolas de los años 80.
De todas formas, esto no quita que alguien que sepa del asunto pueda postear alguna respuesta pero es más fácil encontrar foros dedicados a programar en ensamblador en Windows o MS-DOS que ayudarán más que nosotros:
http://www.lawebdelprogramador.com/news ... nsamblador
Calcular tiempo de ejecución rutina
Hola, estoy usando un PC (con el notebook) para programar en Asm usando Pasmo, y ejecutar los binarios con emulador.
¿Hay alguna forma de calcular los tiempos de ejecución de una rutina? Muchas gracias.
¿Hay alguna forma de calcular los tiempos de ejecución de una rutina? Muchas gracias.
Re: Calcular tiempo de ejecución rutina
Usando el debug del emulador winape sólo tienes que poner dos breakpoints, y al pararse la ejecución la primera vez reseteas el contador de micro segundos, y al segundo breakpoint obtienes el dato que buscas.
Re: Calcular tiempo de ejecución rutina
Ok, muchas gracias! El winape no lo uso porque no consigo ejecutar con línea de comandos desde un archivo bak la compilación dsk automáticamente sin tener que hacerlo manualmente.
Re: Calcular tiempo de ejecución rutina
Hola Susso... supongo querrás decir la ejecución de .dsk automáticamente
winape.exe path_to_image.dsk /A
winape.exe path_to_image.dsk /A
Re: Calcular tiempo de ejecución rutina
Ostras!!!!
Si! En efecto, eso era!
Debí haber montado un lío en su momento.
Ya me dan ganas de llegar a casa y probarlo, estoy con un movil.
Muchas gracias nuevamente!
Si! En efecto, eso era!
Debí haber montado un lío en su momento.
Ya me dan ganas de llegar a casa y probarlo, estoy con un movil.
Muchas gracias nuevamente!
Re: Calcular tiempo de ejecución rutina
Rulando!!!!
Re: Calcular tiempo de ejecución rutina
Mmmm... he puesto 2 breakpoints (marcados con círculos rojos) al principio y al final de la rutina, pero no veo ningún contador de microsegundos... ¿hay que añadirle "conditions"?
Perdonadme si estoy pez...
Perdonadme si estoy pez...
Re: Calcular tiempo de ejecución rutina
Lo tienes en la pantalla del debug, justo debajo de los valores de los registros, y para resetear ese contador tienes que darle a un botoncito que tiene una cruz roja.
Re: Calcular tiempo de ejecución rutina
Ok!!!! ahora si!
731 microsegundos dumpear en pantalla un sprite de 16x16 en modo 1 sin desplazamiento ni máscaras.
mmmm...
Tengo esto:
731 microsegundos dumpear en pantalla un sprite de 16x16 en modo 1 sin desplazamiento ni máscaras.
mmmm...
Tengo esto:
Código: Seleccionar todo
main:
ld a,16
ld hl,block
ld b,0
ld ix,vmem
_loop:
ld e,(ix+0)
ld d,(ix+1)
inc ix
inc ix
ld c,4
ldir
dec a
jp nz,_loop
ret
vmem: DW #C000,#C800,#D000,#D800,#E000,#E800,#F000,#F800 ;1
DW #C050,#C850,#D050,#D850,#E050,#E850,#F050,#F850 ;2
DW #C0A0,#C8A0,#D0A0,#D8A0,#E0A0,#E8A0,#F0A0,#F8A0 ;3
DW #C0F0,#C8F0,#D0F0,#D8F0,#E0F0,#E8F0,#F0F0,#F8F0 ;4
DW #C140,#C940,#D140,#D940,#E140,#E940,#F140,#F940 ;5
DW #C190,#C990,#D190,#D990,#E190,#E990,#F190,#F990 ;6
DW #C1E0,#C9E0,#D1E0,#D9E0,#E1E0,#E9E0,#F1E0,#F9E0 ;7
DW #C230,#CA30,#D230,#DA30,#E230,#EA30,#F230,#FA30 ;8
DW #C280,#CA80,#D280,#DA80,#E280,#EA80,#F280,#FA80 ;9
DW #C2D0,#CAD0,#D2D0,#DAD0,#E2D0,#EAD0,#F2D0,#FAD0 ;10
DW #C320,#CB20,#D320,#DB20,#E320,#EB20,#F320,#FB20 ;11
DW #C370,#CB70,#D370,#DB70,#E370,#EB70,#F370,#FB70 ;12
DW #C3C0,#CBC0,#D3C0,#DBC0,#E3C0,#EBC0,#F3C0,#FBC0 ;13
DW #C410,#CC10,#D410,#DC10,#E410,#EC10,#F410,#FC10 ;14
DW #C460,#CC60,#D460,#DC60,#E460,#EC60,#F460,#FC60 ;15
DW #C4B0,#CCB0,#D4B0,#DCB0,#E4B0,#ECB0,#F4B0,#FCB0 ;16
DW #C500,#CD00,#D500,#DD00,#E500,#ED00,#F500,#FD00 ;17
DW #C550,#CD50,#D550,#DD50,#E550,#ED50,#F550,#FD50 ;18
DW #C5A0,#CDA0,#D5A0,#DDA0,#E5A0,#EDA0,#F5A0,#FDA0 ;19
DW #C5F0,#CDF0,#D5F0,#DDF0,#E5F0,#ED50,#F550,#FD50 ;20
DW #C640,#CE40,#D640,#DE40,#E640,#EE40,#F640,#FE40 ;21
DW #C690,#CE90,#D690,#DE90,#E690,#EE90,#F690,#FE90 ;22
DW #C6E0,#CEE0,#D6E0,#DEE0,#E6E0,#EEE0,#F6E0,#FEE0 ;23
DW #C730,#CF30,#D730,#DF30,#E730,#EF30,#F730,#FF30 ;24
DW #C780,#CF80,#D780,#DF80,#E780,#EF80,#F780,#FF80 ;25
DW #C7D0,#CFD0,#D7D0,#DFD0,#E7D0,#EFD0,#F7D0,#FFD0 ;SPARE START
DW #C7FF,#CFFF,#D7FF,#DFFF,#E7FF,#EFFF,#F7FF,#FFFF ;SPARE END
block:
DB #FF, #FF, #FF, #FF
DB #F8, #E0, #07, #1F
DB #F8, #E0, #07, #1F
DB #F8, #E0, #07, #1F
DB #F8, #E0, #07, #1F
DB #F8, #E0, #07, #1F
DB #F8, #E0, #07, #1F
DB #88, #00, #00, #11
DB #88, #00, #00, #11
DB #8F, #0E, #70, #F1
DB #8F, #0E, #70, #F1
DB #8F, #0E, #70, #F1
DB #8F, #0E, #70, #F1
DB #8F, #0E, #70, #F1
DB #8F, #0E, #70, #F1
DB #FF, #FF, #FF, #FF
Re: Calcular tiempo de ejecución rutina
Ha simple vista creo que puedes mejorarlo partiendo la lista vmem en dos, de tal forma que sólo se necesite un único inc ix:
ld e,(ix+0)
ld d,(ix+yy)
inc ix
donde ix+yy apunta dentro de la segunda tabla
Aunque este truco te servirá solo para sprites pequeños
EDIT: Na! no sirve, creía que ix apuntaba a los datos del sprite y en realidad son las posiciones, aunque bien mirado... parece que la pila se podría utilizar para un acceso aun más rápido a esa tabla
EDIT 2: 533 microsegundos usando la pila
ld e,(ix+0)
ld d,(ix+yy)
inc ix
donde ix+yy apunta dentro de la segunda tabla
Aunque este truco te servirá solo para sprites pequeños
EDIT: Na! no sirve, creía que ix apuntaba a los datos del sprite y en realidad son las posiciones, aunque bien mirado... parece que la pila se podría utilizar para un acceso aun más rápido a esa tabla
EDIT 2: 533 microsegundos usando la pila
Código: Seleccionar todo
main:
di
ld (stack+1),sp
ld a,16
ld hl,block
ld b,0
ld sp,vmem
_loop:
pop de
ld c,4
ldir
dec a
jp nz,_loop
stack ld sp,0
ei
ret
vmem: DW #C000,#C800,#D000,#D800,#E000,#E800,#F000,#F800 ;1
DW #C050,#C850,#D050,#D850,#E050,#E850,#F050,#F850 ;2
DW #C0A0,#C8A0,#D0A0,#D8A0,#E0A0,#E8A0,#F0A0,#F8A0 ;3
DW #C0F0,#C8F0,#D0F0,#D8F0,#E0F0,#E8F0,#F0F0,#F8F0 ;4
DW #C140,#C940,#D140,#D940,#E140,#E940,#F140,#F940 ;5
DW #C190,#C990,#D190,#D990,#E190,#E990,#F190,#F990 ;6
DW #C1E0,#C9E0,#D1E0,#D9E0,#E1E0,#E9E0,#F1E0,#F9E0 ;7
DW #C230,#CA30,#D230,#DA30,#E230,#EA30,#F230,#FA30 ;8
DW #C280,#CA80,#D280,#DA80,#E280,#EA80,#F280,#FA80 ;9
DW #C2D0,#CAD0,#D2D0,#DAD0,#E2D0,#EAD0,#F2D0,#FAD0 ;10
DW #C320,#CB20,#D320,#DB20,#E320,#EB20,#F320,#FB20 ;11
DW #C370,#CB70,#D370,#DB70,#E370,#EB70,#F370,#FB70 ;12
DW #C3C0,#CBC0,#D3C0,#DBC0,#E3C0,#EBC0,#F3C0,#FBC0 ;13
DW #C410,#CC10,#D410,#DC10,#E410,#EC10,#F410,#FC10 ;14
DW #C460,#CC60,#D460,#DC60,#E460,#EC60,#F460,#FC60 ;15
DW #C4B0,#CCB0,#D4B0,#DCB0,#E4B0,#ECB0,#F4B0,#FCB0 ;16
DW #C500,#CD00,#D500,#DD00,#E500,#ED00,#F500,#FD00 ;17
DW #C550,#CD50,#D550,#DD50,#E550,#ED50,#F550,#FD50 ;18
DW #C5A0,#CDA0,#D5A0,#DDA0,#E5A0,#EDA0,#F5A0,#FDA0 ;19
DW #C5F0,#CDF0,#D5F0,#DDF0,#E5F0,#ED50,#F550,#FD50 ;20
DW #C640,#CE40,#D640,#DE40,#E640,#EE40,#F640,#FE40 ;21
DW #C690,#CE90,#D690,#DE90,#E690,#EE90,#F690,#FE90 ;22
DW #C6E0,#CEE0,#D6E0,#DEE0,#E6E0,#EEE0,#F6E0,#FEE0 ;23
DW #C730,#CF30,#D730,#DF30,#E730,#EF30,#F730,#FF30 ;24
DW #C780,#CF80,#D780,#DF80,#E780,#EF80,#F780,#FF80 ;25
DW #C7D0,#CFD0,#D7D0,#DFD0,#E7D0,#EFD0,#F7D0,#FFD0 ;SPARE START
DW #C7FF,#CFFF,#D7FF,#DFFF,#E7FF,#EFFF,#F7FF,#FFFF ;SPARE END
block:
DB #FF, #FF, #FF, #FF
DB #F8, #E0, #07, #1F
DB #F8, #E0, #07, #1F
DB #F8, #E0, #07, #1F
DB #F8, #E0, #07, #1F
DB #F8, #E0, #07, #1F
DB #F8, #E0, #07, #1F
DB #88, #00, #00, #11
DB #88, #00, #00, #11
DB #8F, #0E, #70, #F1
DB #8F, #0E, #70, #F1
DB #8F, #0E, #70, #F1
DB #8F, #0E, #70, #F1
DB #8F, #0E, #70, #F1
DB #8F, #0E, #70, #F1
DB #FF, #FF, #FF, #FF
Re: Calcular tiempo de ejecución rutina
Estupendo! Estupendo! Estoy aprendiendo mucho de ti, como mola esto! Es mejor que los sudokus!
EDITADO: La rutina la tengo dentro de una interrupción de vblank, así que no hará falta ni el DI ni el EI,
EDITADO: La rutina la tengo dentro de una interrupción de vblank, así que no hará falta ni el DI ni el EI,
Re: Calcular tiempo de ejecución rutina
Yo no se hacer sudokus pero te doy la razón, esto es un vicioEstupendo! Estupendo! Estoy aprendiendo mucho de ti, como mola esto! Es mejor que los sudokus!
EDITADO: La rutina la tengo dentro de una interrupción de vblank, así que no hará falta ni el DI ni el EI,
Agárrate.... 435 microsegundos!!!!
Código: Seleccionar todo
main:
di
ld (stack+1),sp
ld bc,&0040 ;contador de 16*4
ld hl,block
ld sp,vmem
_loop:
pop de
ldi
ldi
ldi
ldi
jp pe,_loop
stack ld sp,0
ei
ret
vmem: DW #C000,#C800,#D000,#D800,#E000,#E800,#F000,#F800 ;1
DW #C050,#C850,#D050,#D850,#E050,#E850,#F050,#F850 ;2
DW #C0A0,#C8A0,#D0A0,#D8A0,#E0A0,#E8A0,#F0A0,#F8A0 ;3
DW #C0F0,#C8F0,#D0F0,#D8F0,#E0F0,#E8F0,#F0F0,#F8F0 ;4
DW #C140,#C940,#D140,#D940,#E140,#E940,#F140,#F940 ;5
DW #C190,#C990,#D190,#D990,#E190,#E990,#F190,#F990 ;6
DW #C1E0,#C9E0,#D1E0,#D9E0,#E1E0,#E9E0,#F1E0,#F9E0 ;7
DW #C230,#CA30,#D230,#DA30,#E230,#EA30,#F230,#FA30 ;8
DW #C280,#CA80,#D280,#DA80,#E280,#EA80,#F280,#FA80 ;9
DW #C2D0,#CAD0,#D2D0,#DAD0,#E2D0,#EAD0,#F2D0,#FAD0 ;10
DW #C320,#CB20,#D320,#DB20,#E320,#EB20,#F320,#FB20 ;11
DW #C370,#CB70,#D370,#DB70,#E370,#EB70,#F370,#FB70 ;12
DW #C3C0,#CBC0,#D3C0,#DBC0,#E3C0,#EBC0,#F3C0,#FBC0 ;13
DW #C410,#CC10,#D410,#DC10,#E410,#EC10,#F410,#FC10 ;14
DW #C460,#CC60,#D460,#DC60,#E460,#EC60,#F460,#FC60 ;15
DW #C4B0,#CCB0,#D4B0,#DCB0,#E4B0,#ECB0,#F4B0,#FCB0 ;16
DW #C500,#CD00,#D500,#DD00,#E500,#ED00,#F500,#FD00 ;17
DW #C550,#CD50,#D550,#DD50,#E550,#ED50,#F550,#FD50 ;18
DW #C5A0,#CDA0,#D5A0,#DDA0,#E5A0,#EDA0,#F5A0,#FDA0 ;19
DW #C5F0,#CDF0,#D5F0,#DDF0,#E5F0,#ED50,#F550,#FD50 ;20
DW #C640,#CE40,#D640,#DE40,#E640,#EE40,#F640,#FE40 ;21
DW #C690,#CE90,#D690,#DE90,#E690,#EE90,#F690,#FE90 ;22
DW #C6E0,#CEE0,#D6E0,#DEE0,#E6E0,#EEE0,#F6E0,#FEE0 ;23
DW #C730,#CF30,#D730,#DF30,#E730,#EF30,#F730,#FF30 ;24
DW #C780,#CF80,#D780,#DF80,#E780,#EF80,#F780,#FF80 ;25
DW #C7D0,#CFD0,#D7D0,#DFD0,#E7D0,#EFD0,#F7D0,#FFD0 ;SPARE START
DW #C7FF,#CFFF,#D7FF,#DFFF,#E7FF,#EFFF,#F7FF,#FFFF ;SPARE END
block:
DB #FF, #FF, #FF, #FF
DB #F8, #E0, #07, #1F
DB #F8, #E0, #07, #1F
DB #F8, #E0, #07, #1F
DB #F8, #E0, #07, #1F
DB #F8, #E0, #07, #1F
DB #F8, #E0, #07, #1F
DB #88, #00, #00, #11
DB #88, #00, #00, #11
DB #8F, #0E, #70, #F1
DB #8F, #0E, #70, #F1
DB #8F, #0E, #70, #F1
DB #8F, #0E, #70, #F1
DB #8F, #0E, #70, #F1
DB #8F, #0E, #70, #F1
DB #FF, #FF, #FF, #FF
Re: Calcular tiempo de ejecución rutina
Flipante!!!!!
Tengo que conocer mas el z80!!!! Que vengo del 68000 del Amiga hace ya 20 tacos y en su día hice una rutina súper rapidísima con interrupciones, blitter y copperlists!
EDITADO: ah! Bueno, pensaba utilizarla para pasar valores de ancho variables, pero no esta mal para ciertos bloques de anchos conocidos, podríamos poner un máximo de ldi y según el ancho reescribir nops al final.
Tengo que conocer mas el z80!!!! Que vengo del 68000 del Amiga hace ya 20 tacos y en su día hice una rutina súper rapidísima con interrupciones, blitter y copperlists!
EDITADO: ah! Bueno, pensaba utilizarla para pasar valores de ancho variables, pero no esta mal para ciertos bloques de anchos conocidos, podríamos poner un máximo de ldi y según el ancho reescribir nops al final.
Re: Calcular tiempo de ejecución rutina
Vaya! a ver si vas a ser un nuevo Rhino que se marque una super producción para el CPC y dejes en vergüenza a los coders del cpc de toda la vidaFlipante!!!!!
Tengo que conocer mas el z80!!!! Que vengo del 68000 del Amiga hace ya 20 tacos y en su día hice una rutina súper rapidísima con interrupciones, blitter y copperlists!
No se dónde vi una rutina que calculaba el valor que modificaba un salto relativo hacia adelante que permitía hacer un ldir variable pero más rápido, usando una ristra de ldi's, de tal manera que si pones por ejemplo 8 ldi seguidos y antes un jr puedes hacer que el jr salte al cuarto ldi para que sean 4, 12, 20 etc... ajustando convenientemente el valor de BC. Si encuentro la página te la pongo.EDITADO: ah! Bueno, pensaba utilizarla para pasar valores de ancho variables, pero no esta mal para ciertos bloques de anchos conocidos, podríamos poner un máximo de ldi y según el ancho reescribir nops al final.
EDIT: aquí está, al final de la página:
http://map.grauw.nl/articles/fast_loops.php
Re: Calcular tiempo de ejecución rutina
Jaja, hago lo que puedo, me gustaría hacer algo decente y ganas tengo muchas, lamentablemente tengo muy poco tiempo por motivos de trabajo que me deja completamente reventao, trabajo en una cadena de montaje. En cuanto pueda prosigo.Vaya! a ver si vas a ser un nuevo Rhino que se marque una super producción para el CPC y dejes en vergüenza a los coders del cpc de toda la vida
Ostras, ostras! eso es ingeniería pura de assembler, MOOOOLAAAAA, en principio pensaba rellenar con ops lo necesario, así como copiar lo que viene después de la ristra de ldi`s hasta el ret más para arriba sobre los ldis innecesarios (inviable), lo del jr es la leche! ¡muy inteligente! Muchas gracias por compartirlo!No se dónde vi una rutina que calculaba el valor que modificaba un salto relativo hacia adelante que permitía hacer un ldir variable pero más rápido, usando una ristra de ldi's, de tal manera que si pones por ejemplo 8 ldi seguidos y antes un jr puedes hacer que el jr salte al cuarto ldi para que sean 4, 12, 20 etc... ajustando convenientemente el valor de BC. Si encuentro la página te la pongo.
EDIT: aquí está, al final de la página:
http://map.grauw.nl/articles/fast_loops.php
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro
La Comunidad Española |