Página 1 de 2

Leyendo el teclado ASM + Z88DK

Publicado: Vie, 14 Mar 2014, 23:19
por radastan
Bien, he realizado esta rutina:

$this->bbcode_second_pass_code('', 'int port_in (int port)
{
#asm
ld hl,2
add hl,sp
ld c, (hl)
in a,(c)
ld h,0
ld l, a
#endasm
}')

Si hago un:

if (port_in(64510)&1) ....

Debería detectar si se pulsa la tecla Q.

¿Me estoy equivocando? es que "no doy con la tecla". :mrgreen:

Re: Leyendo el teclado ASM + Z88DK

Publicado: Sab, 15 Mar 2014, 00:09
por iforeve
hola radastran

ld c, (hl) cambialo por ld bc, (hl). La instruccion in a, (c) lo que hace es que pone en la mitad inferior del bus de direcciones el valor de c y en el superior el b. Si te das cuenta, en tu rutina el registro B puede tener cualquier bazofia

Salu2.

Re: Leyendo el teclado ASM + Z88DK

Publicado: Sab, 15 Mar 2014, 00:28
por antoniovillena
Has hecho mal dos cosas, primero estás tratando al parámetro como un puntero y segundo lo que te indica iforeve (salvo que ld bc,(hl) no existe). Usando fastcall se te queda tan sencillo como esto:

$this->bbcode_second_pass_code('', '
int port_in __FASTCALL__ (int port)
{
#asm
ld b, h
ld c, l
ld h, 0
in l, (c)
#endasm
}')

Re: Leyendo el teclado ASM + Z88DK

Publicado: Sab, 15 Mar 2014, 00:42
por iforeve
tienes razon antonio, he visto que faltaba cargar el registro b y no he reparado en que no existe la instruccion. Es que la noche me confunde :lol:

Re: Leyendo el teclado ASM + Z88DK

Publicado: Sab, 15 Mar 2014, 10:23
por radastan
Pues gracias a ambos, pero ninguna de vuestras dos soluciones funciona.

:lol: :lol: :lol: :lol:

Os cuento:

ld bc, (hl)

esa instruccción no se puede hacer en Z88DK.

Y el fastcall da error de compilación.

Lo que me ha ido bien es hacer:

$this->bbcode_second_pass_code('', 'int port_in (int port)
{
#asm
ld b, h
ld c, l
ld h, 0
in l, (c)
#endasm
}')

Todo perfecto, al final habéis dado con la solución pero el problema era que os habíais pasado de sofisticación. :mrgreen:

Lo importante es que funciona, muchísimas gracias a los dos.

Re: Leyendo el teclado ASM + Z88DK

Publicado: Sab, 15 Mar 2014, 10:40
por iforeve
tu ere un cachondo radastran, nos has vacilao :lol: :lol: :lol: :lol: :lol:

Re: Leyendo el teclado ASM + Z88DK

Publicado: Sab, 15 Mar 2014, 11:38
por antoniovillena
Radastan creo que el fastcall va delante de la función. Que funcione ahora no te garantiza que lo haga en futuras versiones

Re: Leyendo el teclado ASM + Z88DK

Publicado: Sab, 15 Mar 2014, 22:33
por radastan
$this->bbcode_second_pass_quote('antoniovillena', 'R')adastan creo que el fastcall va delante de la función. Que funcione ahora no te garantiza que lo haga en futuras versiones


¿Y cuál es la función de __FASTCALL__?

Re: Leyendo el teclado ASM + Z88DK

Publicado: Sab, 15 Mar 2014, 22:39
por antoniovillena
Que en caso de recibir un sólo parámetro puedes pasarlo por registro (HL) en lugar de por pilla

Re: Leyendo el teclado ASM + Z88DK

Publicado: Dom, 16 Mar 2014, 11:22
por radastan
OK, la forma correcta entonces es:

$this->bbcode_second_pass_code('', 'int __FASTCALL__ port_in (int port)
{
#asm
ld b, h
ld c, l
ld h, 0
in l, (c)
#endasm
}')

Ahora viene lo raro, y es que si hago:

$this->bbcode_second_pass_code('', 'if (port_in(64510)&1) // Tecla Q')

Se ejecuta SIEMPRE, es decir siempre detecta que está pulsada Q. Lo más cachondo viene cuando pongo la dirección contraria de forma seguida:

$this->bbcode_second_pass_code('', 'if (port_in(65022)&1) // Tecla A')

Entonces me ejecuta ambas rutinas como si estuvieran pulsada ambas teclas... salvo si pulso una de ellas, que entonces deja de ejecutarse la tecla que pulso. ¿? Claro, uno piensa: es que es normalmente a 1... pero si digo:

$this->bbcode_second_pass_code('', 'if (port_in(64510)&1==0) // Tecla Q')

Ahora no se ejecuta la función nunca.

Para mi que este fin de semana estoy espeso, debería de irme de cañas.