Página 1 de 2

Z88DK - Ayudita pasando parámetros a una función

Publicado: Mié, 13 Nov 2013, 18:31
por radastan
Veamos, estoy tratando de hacer una pruebecilla, y necesito pasarle parámetros a una función. Pasar parámetros no es problema en si mismo, se hacerlo, lo que no se es como pasarle el puntero de un sprites a HL.

Es decir, supongamos el sprite:

$this->bbcode_second_pass_code('', 'extern unsigned char sprite_cubo [];

#asm
._sprite_cubo
defb 255,255,128,1,128,1,128,1,128,1,128,1,128,1,128,1
defb 128,1,128,1,128,1,128,1,128,1,128,1,128,1,255,255
defb 12,13,14,15
#endasm')

Yo quiero hacer algo parecido a:

$this->bbcode_second_pass_code('', 'put_sprite_x16 (sprite_cubo, 10, 10);')

Y que la rutina sea:

$this->bbcode_second_pass_quote('', 'v')oid put_sprite_x16 (int posicion, int x, int y)
{
#asm
ld hl,2 ;pasamos y a D, x a E, y posicion a HL
add hl,sp
ld d, (hl)
inc hl
inc hl
ld e, (hl)
inc hl
inc hl
.
.
.
}


¿Qué demonios hago mal? se que es culpa del puntero que no he pasado a entero, pero es que estoy tratando de cambiar mi mente de ensamblador a C con ensamblador (que tiene su miga, oiga).

Re: Z88DK - Ayudita pasando parámetros a una función

Publicado: Mié, 13 Nov 2013, 18:40
por na_th_an
No sé cómo va el paso de parámetros exactamente, pero supongo que si los tres parámetros son de 16 bits, deberían ser recogidos en tres registros de 16 bits.

De todos modos creo que el paso de parámetros si la función no es __FASTCALL__ se hace por la pila. Tendrías que sacar los valores de la pila en orden ¿inverso? no recuerdo ya estas cosas, hace muchos años.

Mira, el amigo Villena lo puso el otro día:

viewtopic.php?p=44834#p44834

Re: Z88DK - Ayudita pasando parámetros a una función

Publicado: Mié, 13 Nov 2013, 18:41
por radastan
Efectivamente, si te fijas saco los valores en orden inverso. Los valores de X e Y no me dan problema, pero el puntero al sprite se le atraganta.

Re: Z88DK - Ayudita pasando parámetros a una función

Publicado: Mié, 13 Nov 2013, 18:46
por na_th_an
Ah, vale, que no lo había visto.

Pero en el código que tienes ahí todavía no has sacado el puntero, ¿no? Sólo te has saltado la dirección de retorno en la pila (sumando 2 a SP), y luego has puesto el byte menos significativo de x e y en los registros D y E... Yo seguiría el código asín:

$this->bbcode_second_pass_code('', '
ld b, (hl)
inc hl
ld c, (hl)
ld h, b
ld l, c
')

Sacamos el tercer parámetro a BC de forma temporal, y luego lo movemos a HL.

Pero no me eches cuenta, yo estas cosas no las manejo.

Re: Z88DK - Ayudita pasando parámetros a una función

Publicado: Mié, 13 Nov 2013, 18:53
por radastan
¿Qué sentido tiene sacar de HL el puntero para volver a meterlo en HL?

Re: Z88DK - Ayudita pasando parámetros a una función

Publicado: Mié, 13 Nov 2013, 18:59
por antoniovillena
$this->bbcode_second_pass_quote('radastan', 'Â')¿Qué sentido tiene sacar de HL el puntero para volver a meterlo en HL?


Tiene sentido si además de HL quieres sacar más parámetros (DE, BC). Sino lo haces con FASTCALL y lo tienes directamente en HL.

Ten en cuenta que el Z80 es little endian, si quieres leer un valor tienes que leer primero el byte bajo y luego el byte alto. Por ejemplo con este código leo HL y DE desde la pila.

$this->bbcode_second_pass_code('', '
ld hl, 2
add hl, sp
ld e, (hl)
inc hl
ld d, (hl)
inc hl
ld a, (hl)
inc hl
ld h, (hl)
ld l, a
')

Re: Z88DK - Ayudita pasando parámetros a una función

Publicado: Mié, 13 Nov 2013, 19:35
por radastan
Aún leyendo HL sigo teniendo el mismo problema al compilar:

Warning:#9:Converting pointer to integer without cast

Re: Z88DK - Ayudita pasando parámetros a una función

Publicado: Mié, 13 Nov 2013, 19:53
por antoniovillena
Es que el cubo es un puntero a char y según tu función el primer parámetro es un entero.

void put_sprite_x16 (int posicion, int x, int y)

Re: Z88DK - Ayudita pasando parámetros a una función

Publicado: Mié, 13 Nov 2013, 20:31
por D_Skywalk
En teoría para Spectrum si quieres enviar valores para asm sería mas sencillo usar int, cierto?

Por que igualmente tiene que hacer luego el compilador la conversión de char a int... :?
Lo que no se es si sería mas lento o no...

Re: Z88DK - Ayudita pasando parámetros a una función

Publicado: Mié, 13 Nov 2013, 20:36
por na_th_an
$this->bbcode_second_pass_quote('radastan', 'Â')¿Qué sentido tiene sacar de HL el puntero para volver a meterlo en HL?

Porque en HL no está el puntero. HL, en ese punto, apunta adónde está el puntero.

El puntero está en la pila y HL apunta a la pila, donde está el puntero. Si quieres el puntero en HL, lo tienes que copiar de la pila a HL. Es un caso de doble indirección.

$this->bbcode_second_pass_quote('', 'A')ún leyendo HL sigo teniendo el mismo problema al compilar:

Warning:#9:Converting pointer to integer without cast


Porque el problema no está ahí, sino en la parte C. Estás pasando un unsigned char * y la función espera un int. O cambias el prototipo de la función, o usas un cast al pasar el parámetro. La parte que está en ensamblador ni siquiera se coscará, ambos son valores de 16 bits que van igualmente en la pila.

O sea, o bien declaras void put_sprite_x16 (unsigned char *posicion, int x, int y), o bien llamas con put_sprite_x16 ((int) (posicion), 100, 100);.