Tablas e índices

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
Meta
Forero habitual
Forero habitual
Mensajes: 103
Registrado: Jue 04 Ene , 2018 9:36 am

Tablas e índices

Mensajepor Meta » Mar 27 Feb , 2018 7:05 pm

Buenas,
Estoy optimizando código y necesito ayuda para acceder a índices de tablas de forma más eficiente. De momento estoy usando el registro IX y funciona bién, pero he probado con HL y no me sale.
La función "table_str" me da un poco igual, aunque supongo que se puede mejorar bastante.
La que me preocupa es la que la llama que gasta 9 bytes, que tengo que repetir en diferentes partes del programa y reutilizaré para gestionar sprites también.
Alguna idea mejor sin usar IX?
Gracias de antemano

Código: Seleccionar todo

.menu_static_strings:
ld b,6 ;(2B) ;total filas
ld ix,menu_static_str_table;(4B) ;tabla a leer
jp table_str ;(3B)

.table_str:
table_str_lp:
ld e,(ix):inc ix ;(5B)
ld d,(ix):inc ix ;(5B)
ld l,(ix):inc ix ;(5B)
ld h,(ix) ;(3B)
push bc ;(1B)
call prep_text_spr ;(3B) ;Función de texto: requiere HL DE / AF BC DE HL afectados
pop bc ;(1B)
inc ix ;(2B)
djnz table_str_lp ;(2B)
ret ;(1B)

.menu_static_str_table: ;posición y address de la string
defw &1C88,string_redef1 ;(4B)
defw &1C90,string_redef2
defw &1C98,string_modo
defw &1CA0,string_victoria
defw &1CA8,string_equip
defw &1CB0,string_comenz
:
:
defw....

.string_redef1 db "1 CONTROL J1",0
.string_redef2 db "2 CONTROL J2",0
.string_modo db "3 MODO JUEGO",0
.string_victoria db "4 C.VICTORIA",0
.string_equip db "5 MESA/COLOR",0
:
:
db....

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8420
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: Tablas e índices

Mensajepor Artaburu » Mar 27 Feb , 2018 7:26 pm

Así, a priori, ya que estás usando ix, puedes hacerlo usandolo como índice:

Código: Seleccionar todo

.table_str:
table_str_lp:
ld e,(ix+0) ;(3B)
ld d,(ix+1) ;(3B)
ld l, (ix+2) ;(3B)
ld h, (ix+3) ;(3B)
push bc ;(1B)
call prep_text_spr ;(3B) ;Función de texto: requiere HL DE / AF BC DE HL afectados
pop bc ;(1B)
ld de,4 ;(3B)
add ix,de ;(2B)
djnz table_str_lp ;(2B)
ret
y ya te ahorras 3 bytes, que no son muchos pero que algo es algo.
Salu2,
Arta

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8420
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: Tablas e índices

Mensajepor Artaburu » Mar 27 Feb , 2018 7:29 pm

Los 9 bytes de la función que llama poca solución tiene porque de los 9 bytes 6 son por parámetros y si en lugar de ir a ix fuera a hl solo ahorrarías un byte.
Salu2,
Arta

Meta
Forero habitual
Forero habitual
Mensajes: 103
Registrado: Jue 04 Ene , 2018 9:36 am

Re: Tablas e índices

Mensajepor Meta » Mar 27 Feb , 2018 8:12 pm

Bueno quizás resulta algo tacaño, pero quería ahorrame ese byte que se pueden convertir en muchos si accedo a la función en varios sitios. Estoy planteándome el doble buffer y puede que necesite más espacio. aunque ahora mismo ya tengo reservado &4000-&7fff
Lo de meter a ix+0, ix+1 ya lo había probado pero lo deje con inc's porque no hice bien el resto que era meter ese "add ix" que pones tu. Aveces a uno se le pasa lo mas trivial...

Para hacerlo con hl con, ¿quizás una variable temporal que vaya guardando el indice?
o convertir hl en ix de alguna manera en la función principal y liberar a la otra de ix?

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8420
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: Tablas e índices

Mensajepor Artaburu » Mar 27 Feb , 2018 8:27 pm

Puedes cambiar a HL y usar A como contador de bucle en vez de BC:

Código: Seleccionar todo

ld hl, menu_static_str_table
ld a,6
jp table_str_lp
table_str_lp:
ld e, (hl): inc hl
ld d, (hl): inc hl
ld c, (hl): inc hl
ld b, (hl): inc hl
push hl
ex hl, de
push af
call prep_text_spr
pop af
pop hl
dec a
jr nz,table_str_lp
Con esto ganas 1 byte en la llamada y unos cuantos más en la función que lee la tabla. Si no he contado mal ahorras 9 bytes, 10 en total.
Salu2,
Arta

Meta
Forero habitual
Forero habitual
Mensajes: 103
Registrado: Jue 04 Ene , 2018 9:36 am

Re: Tablas e índices

Mensajepor Meta » Mar 27 Feb , 2018 8:44 pm

mmm BC lo voy a tener que usar para dimensiones de sprites... pero genial, creo que se acerca a lo que quería.
Muchísimas gracias Arta, voy a seguir probando a ver como puedo gestionar estas tablitas. un saludo!!


¿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