Karoshi MSX Community
05 de Julio de 2021, 12:59:41 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: puntero en una función asm en SDCC  (Leído 5030 veces)
0 Usuarios y 1 Visitante están viendo este tema.
aorante
Karoshi Maniac
****
Mensajes: 451


nuTella Power!


WWW Email
« : 16 de Abril de 2010, 07:28:33 am »

Hola!
Help!!! Huh Estoy bloqueado intentando pasar a una función en assembler, la dirección de un puntero a un char donde tengo una cadena.
En el manual del SDCC no he encontrado nada.
¿se puede hacer?

Código:
char *cadena = "Hola Mundo";
Funcion(*cadena);

void Funcion(char *cadena)
{
__asm
  ld l,4(ix)
  ld h,5(ix)
__endasm;
}
En línea

--------------------------------- ------ ----- --- -- -
aorante/303bcn
http://aorante.blogspot.com
http://twitter.com/#!/aorante
http://303bcn.wordpress.com/
--------------------------------- ------ ----- --- -- -
aorante
Karoshi Maniac
****
Mensajes: 451


nuTella Power!


WWW Email
« Respuesta #1 : 16 de Abril de 2010, 11:33:41 am »

He visto que Konamiman, lo utiliza en su lib ASMLIB, pero no consigo descifrar su código Huh

@Nerlaska, esta muy bien explicado el punto "assembler inline", de tu doc para hacer ROMs con SDCC. Si sabes como funciona el tema de los punteros podrías añadirlo y de paso actualizar los tags de _asm ya que al compilar sale un warning diciendo que esta "deprecado". Ahora es con doble subrayado "__asm" (que chorrada  Wink ).

Saludos!!!
En línea

--------------------------------- ------ ----- --- -- -
aorante/303bcn
http://aorante.blogspot.com
http://twitter.com/#!/aorante
http://303bcn.wordpress.com/
--------------------------------- ------ ----- --- -- -
OKI09
Karoshi Maniac
****
Mensajes: 275



WWW Email
« Respuesta #2 : 16 de Abril de 2010, 12:00:04 pm »

No se si te entiendo bien, pero creo que lo que quieres es pasarle a un registro una direccion de memoria que apunte a una cadena. Huh

Si es asi, yo lo haria poniendo esa direccion de memoria en una posicion en RAM y la leeria con el registro que quiero desde la rutina ASM.

No se si me explico. Cheesy
En línea

La derrota no es una opción y no hay excusas.
"Parasiempre"
aorante
Karoshi Maniac
****
Mensajes: 451


nuTella Power!


WWW Email
« Respuesta #3 : 16 de Abril de 2010, 12:50:10 pm »

Gracias Oki09!
Es la solución que justamente he utilizado y me funciona bien, pero quiero aprender a hacerlo con los punteros.
En línea

--------------------------------- ------ ----- --- -- -
aorante/303bcn
http://aorante.blogspot.com
http://twitter.com/#!/aorante
http://303bcn.wordpress.com/
--------------------------------- ------ ----- --- -- -
nerlaska
Karoshi Excellent Member
******
Mensajes: 1102


Programador


WWW Email
« Respuesta #4 : 19 de Abril de 2010, 04:45:40 am »

A ver .. tu lo que quieres es acceder al puntero cadena, no?

Código:
char *cadena = "Hola Mundo";
Funcion(cadena); // Aqui solo deberias poner cadena, que es el valor de la dirección a "Hola Mundo" y no *cadena que seria 'H'

void Funcion(char *cadena)
{
__asm
  ld l,4(ix)
  ld h,5(ix)
__endasm;
}

Luego en función, en HL tendrias la dirección a "Hola Mundo" o sea ld a, (HL) te meteria en A el valor 'H'

Estas preguntando eso?
En línea

MSX4EVER2GETHER
www.nerlaska.com
aorante
Karoshi Maniac
****
Mensajes: 451


nuTella Power!


WWW Email
« Respuesta #5 : 19 de Abril de 2010, 10:55:56 am »

Gracias, funciona!
pero no se por que motivo, necesita que le de al puntero una dirección:
Lo utilizo para una adaptación de una función de conversión de un número a ASCII, para luego mostrarlo en una screen 2.

La llamada a la función:
Código:
char *strBuff;                           
strBuff = 0xC400;
Num2Dec16(1000, strBuff);

La función:
Código:
/*
16-bit Integer to ASCII (decimal)
by baze
Input: HL = number to convert, DE = location of ASCII string
Output: ASCII string at (DE)
*/
void Num2Dec16(int aNumber, char *address)
{
  aNumber;
  address;
__asm
  ld l,4(ix)
  ld h,5(ix)
 
  ld e,6(ix)
  ld d,7(ix)
 
  ld bc,#-10000
call $Num1
ld bc,#-1000
call $Num1
ld bc,#-100
call $Num1
ld c,#-10
call $Num1
ld c,b
call $Num1
  jr  $Num3 
$Num1:
  ld a,#47  ;codigo ASCII de "0" -1
$Num2:
  inc a
add hl,bc
jr c,$Num2
sbc hl,bc
ld (de),a
inc de
ret
$Num3:
__endasm;
}
En línea

--------------------------------- ------ ----- --- -- -
aorante/303bcn
http://aorante.blogspot.com
http://twitter.com/#!/aorante
http://303bcn.wordpress.com/
--------------------------------- ------ ----- --- -- -
nerlaska
Karoshi Excellent Member
******
Mensajes: 1102


Programador


WWW Email
« Respuesta #6 : 20 de Abril de 2010, 07:20:09 am »

Es lo que te decia .. lo que necesita que le pases a DE es una dirección donde guardar el ASCIIZ (string).
Tu pones 0xC400 que imagino será donde quieres almacenar el numero convertido a String, correcto?
si tuvieras...

char myNumber[10];

Num2Dec16 (145, myNumber);

Al salir de la función tendriás el numero convertido en la variable myNumber.
En línea

MSX4EVER2GETHER
www.nerlaska.com
aorante
Karoshi Maniac
****
Mensajes: 451


nuTella Power!


WWW Email
« Respuesta #7 : 21 de Abril de 2010, 08:08:23 pm »

Solucionado!!!
Me funciona perfectamente.
Aunque utilizando el puntero, al compilar la salida me ocupa menos espacio, por lo que deduzco que debe de ser más optimo (no suelo mirar la salida en assembler por que no tengo nivel para entenderlo).
Me gusta más así por que no acabo de controlar la memoria y así le dejo la tarea al compilador. Tongue (cuando sea mayor ya haré más hard code Wink )

Gracias!

Antes:
Código:
void vPrintNumber(byte column, byte line, uint aNumber, byte aLength)
{
  uint tiladdre=0;
  char *strBuff;                           
  strBuff = 0xC400;

  Num2Dec16(aNumber, strBuff);
 
  // proporciona la direccion de la VRAM a partir de una posicion
  tiladdre = getAddress(column, line);
 
  //coloca el puntero en la posicion donde se ha de empezar a mostrar
  strBuff = strBuff + (5-aLength);
 
  // muestra el numero en la pantalla
  while (aLength-->0){ vpoke(tiladdre++,*(strBuff++));}
}

Ahora:
Código:
void vPrintNumber(byte column, byte line, uint aNumber, byte aLength)
{
  byte pos=5;
  uint tiladdre=0;
  char strBuff[5];   

  Num2Dec16(aNumber, strBuff);
 
  // proporciona la direccion de la VRAM a partir de una posicion
  tiladdre = getAddress(column, line);
 
  //posicion de inicio de la cadena
  pos= 5-aLength;
 
  // muestra el numero en la pantalla
  while (aLength-->0){ vpoke(tiladdre++,strBuff[pos++]);}
}
En línea

--------------------------------- ------ ----- --- -- -
aorante/303bcn
http://aorante.blogspot.com
http://twitter.com/#!/aorante
http://303bcn.wordpress.com/
--------------------------------- ------ ----- --- -- -
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!