Karoshi MSX Community
05 de Julio de 2021, 12:59:17 pm *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1]
  Imprimir  
Autor Tema: Array con punteros (mejor solucion)  (Leído 5178 veces)
0 Usuarios y 1 Visitante están viendo este tema.
j4mk3
Karoshi Maniac
****
Mensajes: 376


MSx Powa!


WWW Email
« : 17 de Marzo de 2009, 04:10:42 pm »

Hola MSceneX Smiley

Estaba yo pasando un codigo que tengo en basic [suelo hacerlo primero en Basic para probar si mi idea es realizable] a Assembler y me ha surgido una duda.

La rutina en cuestion escribe en una Matriz de 64 bytes (8x8 bytes). Controlo donde se escribe la matriz con un puntero (DB) inicializado al principio de la matriz.

Este es el codigo que hago para hacer el posicionamiento y escribir el dato.
Código:
ld HL,du     ; Cargo posicion inicial del Array (posicion RAM etiqueta "du")
ld A,(di)    ; Cargo variable que me hace de puntero (posicion RAM etiqueta "di")
ld C,A       ; Lo preparao en BC para hacer la suma
xor B         ; B a zero
add HL,BC
ld A,(HL)    ; Cargo el valor que quiero de la posicion du(di) del Array
;Aqui van instrucciones que modifican el dato
ld (HL),A    ; Guardo el resultado de nuevo en el Array
Queria hacerlo usando el registro IX, pero no puedo hacer un LD (IX+B),A ya que IX+ solo admite numeros no registros. Así que tengo que sumar a HL el desplazamiento Sad

Mi pregunta es ¿ es esta la mejor manera de hacerlo? o ¿ hay alguna manera mejor de optimizar esta parte del codigo?. A mi me parece que es mucha vuelta y seguro que hay alguna manera de hacerlo mejor, digo yo eh !  Tongue

Muchas gracias a todos ! Smiley
En línea

---  G Fan  ---  Galious & Gradius  & G Boys   ---
--- Play HANS' ADVENTURE, STAN, THE DREAMER & BITLOGIC ---
Dioniso
Visitante
« Respuesta #1 : 17 de Marzo de 2009, 04:55:50 pm »

Queria hacerlo usando el registro IX, pero no puedo hacer un LD (IX+B),A ya que IX+ solo admite numeros no registros. Así que tengo que sumar a HL el desplazamiento Sad

Poder, se puede. No sé si merecerá la pena, pero por experimentar un poco... A ver: quieres utilizar LD (IX+B),A. Pues no pasa nada, se hace. Sería algo así:

Primero cargas IX con el comienzo del array.
LD (IX+B),A sería en hexadecimal "$DD $70+r $xx".

-El primer byte, $DD, no lo modificamos.
-El segundo byte sería $70+$07, donde $07 se le suma a $70 para indicar que pasamos el contenido del acumulador ($07) a IX ($70)
-El tercer byte, $xx, indicaría el byte donde se guardará el contenido del acumulador- es decir, $xx sería la variable B de tu ejemplo que se sumará a IX. En tu caso debes parchear la rutina con un valor de 0 a 64 (decimal). Cuidado que va con signo; si sólo lo necesitas para un salto de 64 bytes no pasa nada, tranquilo.

Es decir, que en vez de escribir:

Código:
LD (IX+B),A

debes escribir

Código:
LD A,"byte_del_array_a_escribir" ;número de 0 a 64 (decimal)
LD HL,PATCH + 2 ;vamos a parchear la instrucción
LD (HL),A
... ;aquí cargas el acumulador con el valor a escribir en el array
PATCH:
DB $DD, $77, $77 ;el tercer valor hexadecimal no tiene importancia pero si escribes el mismo valor que el byte anterior te puede ayudar algo si comprimes el código  :D
... ; y sigues con tu programa

Esto no lo he probado en la vida real. Personas y animales pueden resultar heridos.

Si te funciona me lo cuentas y nos hechamos unas risas  Grin

Edit: He cambiado los "&" por "$", que es el símbolo hexadecimal... En fin, las cosas.  Roll Eyes
« Última modificación: 17 de Marzo de 2009, 05:51:12 pm por Dioniso » En línea
SapphiRe_MSX
Visitante
« Respuesta #2 : 17 de Marzo de 2009, 06:25:57 pm »

Eeeem, Dionisoooo que le vas a liar al pobre!! ¿Código automodificable para empezar con ensamblador? ¡¡Eso es una locura!!

El problema de ese código es que sólo funcionaría en RAM, por lo que si lo pruebas en ROM no iría ni patrás.

Vamos a ver el código de j4mk3:

Código:
ld HL,du     ; Cargo posicion inicial del Array (posicion RAM etiqueta "du")
ld A,(di)    ; Cargo variable que me hace de puntero (posicion RAM etiqueta "di")
ld C,A       ; Lo preparao en BC para hacer la suma
xor B         ; B a zero
add HL,BC
ld A,(HL)    ; Cargo el valor que quiero de la posicion du(di) del Array
;Aqui van instrucciones que modifican el dato
ld (HL),A    ; Guardo el resultado de nuevo en el Array

Mal... La instrucción XOR B no pone B a cero, sino que hace lo siguiente (transcrito en BASIC para que me entiendas):

Código:
a=a XOR b

por lo que no tiene el efecto que necesitas. ¿Quieres velocidad? Lo más sencillo sería alinear la tabla en una dirección en RAM que tuviera el byte bajo a cero, así, si la tabla es de, como mucho, 256 bytes, el acceso es rapidísimo y sencillísimo. Por ejemplo, imagina que la tabla está situada en $C000, tú lo que harías (en BASIC) sería:

Código:
HL=&HC000
A=OFFSET
C=A
B=0
HL=HL+BC
A=PEEK(HL)
REM MODIFICO DATO
POKE HL,A

Pero se puede optimizar como sigue:

Código:
H=&HC0
A=OFFSET
L=A
A=PEEK(HL)
REM MODIFICO DATO
POKE HL,A

Algo que, en ensamblador, sería:

Código:
ld h,$C0
ld a,[offset]
ld l,a
ld a,[hl]
; MODIFICO DATO
ld [hl],a

De esta forma te ahorras la suma de 16 bits, que es bastante costosa. Por cierto, tú conoces a Humphrey de las BCN parties, ¿no?

Saludos
--
SapphiRe
En línea
Dioniso
Visitante
« Respuesta #3 : 17 de Marzo de 2009, 06:31:19 pm »

Eeeem, Dionisoooo que le vas a liar al pobre!! ¿Código automodificable para empezar con ensamblador? ¡¡Eso es una locura!!

Si ya lo dije: que poder hacerse, se puede, pero que no merecería la pena. Tan sólo le ofrecía la posibilidad que j4mk3 no veía viable Grin Obviamente, el código automodificable sólo va en RAM.
En línea
j4mk3
Karoshi Maniac
****
Mensajes: 376


MSx Powa!


WWW Email
« Respuesta #4 : 17 de Marzo de 2009, 07:56:01 pm »

@Dionisio
emmm uff...vale lo entiendo a nivel de opcodes y tal. Y ciertamente la idea es q este codigo termine en ROM  Wink
Me gusta la solucion, es un poco a pelo y sin condon XD, ya la aplicare en algun otro momento o programa que pueda hacerlo.
Gracias Smiley
@SapphiRe
Lo del Xor B...dios q mal ! :p he pensado en assembler de 8086 y ahi si que se puede hacer :p tonces ? tengo que hacer un ld B,0
Gracias por la trascripcion al Basic, pero bueno que en assembler lo entiendo eh ! Smiley gracias jeje, es super didactico.
Miraré de poner el array en una posicion fija asi de 00 en bajo byte. Mola !
Y si, conozco a Humphery, jeje bastante. Me entrevisto en una BECANE la primera creo recordar. Y yo a tí te conocí en la RU de hace un par de ediciones que me explicastes lo del PSG que haces en el Qbix para meterle FX en medio de la musica.

Espero poder serguir aprendiendo mucho de vosotros y q yo pueda aportar mucho a tambien a la comunidad.
Y tengo más dudas de más cosas jejee, ya os diré.

Un abrazo
P.D: menos mal q me has dicho lo del XOR, pq no lo hubiera visto en tarde y tarde de mirarlo Tongue


En línea

---  G Fan  ---  Galious & Gradius  & G Boys   ---
--- Play HANS' ADVENTURE, STAN, THE DREAMER & BITLOGIC ---
j4mk3
Karoshi Maniac
****
Mensajes: 376


MSx Powa!


WWW Email
« Respuesta #5 : 20 de Marzo de 2009, 11:58:53 am »

Al tema de punteros he indexaciones, me he encontrado con otra duda.
Cuando usamos estas instrucciones tipo LD A,(IX+N) o LD (IX+N),A
¿Se puede poner q N sea negativo ? es decir, ¿ Se puede hacer esto ?
LD A,(IX-8) o LD (IX-8),A
He mirado la documentacion de datasheets del Z80 y siempre habla de desplazamiento, offset, pero no me deja claro si se puede hacer un offset en complemento a 2 (negativo)

Gracias por vuestra ayuda.
Nos seguimos charlando (Irc powa! Smiley )
En línea

---  G Fan  ---  Galious & Gradius  & G Boys   ---
--- Play HANS' ADVENTURE, STAN, THE DREAMER & BITLOGIC ---
SapphiRe_MSX
Visitante
« Respuesta #6 : 20 de Marzo de 2009, 04:44:26 pm »

He mirado la documentacion de datasheets del Z80 y siempre habla de desplazamiento, offset, pero no me deja claro si se puede hacer un offset en complemento a 2 (negativo)

Sí, el offset va desde -128 hasta +127.
En línea
j4mk3
Karoshi Maniac
****
Mensajes: 376


MSx Powa!


WWW Email
« Respuesta #7 : 22 de Marzo de 2009, 07:45:16 pm »

Ole ! si señor, muchas gracias.
Tras nuestra mini charla por irc, ya me has comentado que esta documentado en el portar Smiley si es q no miro nada.
Finalmente mi rutina ha llego a ocupar 920 bytes ! Smiley y aun creo q la podré compactar más.
Una vez mas gracias.
En línea

---  G Fan  ---  Galious & Gradius  & G Boys   ---
--- Play HANS' ADVENTURE, STAN, THE DREAMER & BITLOGIC ---
Páginas: [1]
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!