Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: j4mk3 en 17 de Marzo de 2009, 04:10:42 pm



Título: Array con punteros (mejor solucion)
Publicado por: j4mk3 en 17 de Marzo de 2009, 04:10:42 pm
Hola MSceneX :)

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

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 !  :P

Muchas gracias a todos ! :)


Título: Re: Array con punteros (mejor solucion)
Publicado por: Dioniso en 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 :(

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  ;D

Edit: He cambiado los "&" por "$", que es el símbolo hexadecimal... En fin, las cosas.  ::)


Título: Re: Array con punteros (mejor solucion)
Publicado por: SapphiRe_MSX en 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


Título: Re: Array con punteros (mejor solucion)
Publicado por: Dioniso en 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 ;D Obviamente, el código automodificable sólo va en RAM.


Título: Re: Array con punteros (mejor solucion)
Publicado por: j4mk3 en 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  ;)
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 :)
@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 ! :) 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 :P




Título: Re: Array con punteros (mejor solucion)
Publicado por: j4mk3 en 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! :) )


Título: Re: Array con punteros (mejor solucion)
Publicado por: SapphiRe_MSX en 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.


Título: Re: Array con punteros (mejor solucion)
Publicado por: j4mk3 en 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 :) si es q no miro nada.
Finalmente mi rutina ha llego a ocupar 920 bytes ! :) y aun creo q la podré compactar más.
Una vez mas gracias.