Calcular tiempo de ejecución rutina

Programando el Amstrad en Ensamblador.
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
Susso
Lechoncillo
Lechoncillo
Mensajes: 23
Registrado: Jue 13 Nov , 2014 6:13 pm

Calcular tiempo de ejecución rutina

Mensajepor Susso » Lun 17 Nov , 2014 9:07 am

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.

Urusergi
Forum Addict
Forum Addict
Mensajes: 380
Registrado: Sab 25 Feb , 2006 5:45 pm

Re: Calcular tiempo de ejecución rutina

Mensajepor Urusergi » Lun 17 Nov , 2014 3:23 pm

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.

Susso
Lechoncillo
Lechoncillo
Mensajes: 23
Registrado: Jue 13 Nov , 2014 6:13 pm

Re: Calcular tiempo de ejecución rutina

Mensajepor Susso » Lun 17 Nov , 2014 6:09 pm

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.

pacomix
Forum Addict
Forum Addict
Mensajes: 460
Registrado: Dom 11 Nov , 2012 8:05 pm

Re: Calcular tiempo de ejecución rutina

Mensajepor pacomix » Lun 17 Nov , 2014 6:41 pm

Hola Susso... supongo querrás decir la ejecución de .dsk automáticamente

winape.exe path_to_image.dsk /A

Susso
Lechoncillo
Lechoncillo
Mensajes: 23
Registrado: Jue 13 Nov , 2014 6:13 pm

Re: Calcular tiempo de ejecución rutina

Mensajepor Susso » Lun 17 Nov , 2014 6:52 pm

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!

Susso
Lechoncillo
Lechoncillo
Mensajes: 23
Registrado: Jue 13 Nov , 2014 6:13 pm

Re: Calcular tiempo de ejecución rutina

Mensajepor Susso » Mar 18 Nov , 2014 11:37 am

Rulando!!!! :lol: :lol: :lol: :lol:

Susso
Lechoncillo
Lechoncillo
Mensajes: 23
Registrado: Jue 13 Nov , 2014 6:13 pm

Re: Calcular tiempo de ejecución rutina

Mensajepor Susso » Mar 18 Nov , 2014 11:54 am

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...

Urusergi
Forum Addict
Forum Addict
Mensajes: 380
Registrado: Sab 25 Feb , 2006 5:45 pm

Re: Calcular tiempo de ejecución rutina

Mensajepor Urusergi » Mar 18 Nov , 2014 3:23 pm

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.

Susso
Lechoncillo
Lechoncillo
Mensajes: 23
Registrado: Jue 13 Nov , 2014 6:13 pm

Re: Calcular tiempo de ejecución rutina

Mensajepor Susso » Mar 18 Nov , 2014 11:57 pm

Ok!!!! ahora si!
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

Urusergi
Forum Addict
Forum Addict
Mensajes: 380
Registrado: Sab 25 Feb , 2006 5:45 pm

Re: Calcular tiempo de ejecución rutina

Mensajepor Urusergi » Mié 19 Nov , 2014 3:32 pm

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 :-k

EDIT 2: 533 microsegundos usando la pila \:D/

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

Susso
Lechoncillo
Lechoncillo
Mensajes: 23
Registrado: Jue 13 Nov , 2014 6:13 pm

Re: Calcular tiempo de ejecución rutina

Mensajepor Susso » Jue 20 Nov , 2014 12:49 am

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,

Urusergi
Forum Addict
Forum Addict
Mensajes: 380
Registrado: Sab 25 Feb , 2006 5:45 pm

Re: Calcular tiempo de ejecución rutina

Mensajepor Urusergi » Jue 20 Nov , 2014 3:55 pm

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,
Yo no se hacer sudokus pero te doy la razón, esto es un vicio :D

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

Susso
Lechoncillo
Lechoncillo
Mensajes: 23
Registrado: Jue 13 Nov , 2014 6:13 pm

Re: Calcular tiempo de ejecución rutina

Mensajepor Susso » Jue 20 Nov , 2014 6:06 pm

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.

Urusergi
Forum Addict
Forum Addict
Mensajes: 380
Registrado: Sab 25 Feb , 2006 5:45 pm

Re: Calcular tiempo de ejecución rutina

Mensajepor Urusergi » Vie 21 Nov , 2014 3:59 pm

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!
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 :mrgreen:
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.
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

Susso
Lechoncillo
Lechoncillo
Mensajes: 23
Registrado: Jue 13 Nov , 2014 6:13 pm

Re: Calcular tiempo de ejecución rutina

Mensajepor Susso » Sab 22 Nov , 2014 12:55 am

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 :mrgreen:
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.
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
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!


¿Quién está conectado?

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


La Comunidad Española
ESP Soft, juegos para tu CPC Foro de Amstrad CPC Todos los juegos para CPC en un CD Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) Selección de juegos de Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic