domingo, 25 de abril de 2010

Mostrar números en Screen 2

Para resolver esta tarea, tendremos que convertir el valor de nuestra variable a una cadena de caracteres y luego mostrarlo en la pantalla de forma similar a como lo hicimos con la función vprint del post anterior. Para la conversión he adaptado una función en assembler de baze (Z80bits Collection of Z80 routines). La he llamado Num2Dec16 y como parámetros se le pasa un valor de tipo entero y la cadena donde se ha de escribir el resultado.

/*
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(unsigned 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
$Num2:
inc a
add hl,bc
jr c,$Num2
sbc hl,bc
ld (de),a
inc de
ret
$Num3:

__endasm;
}

La función que tenemos que utilizar se llama vprintNumber y le pasaremos como parámetros la posición de la pantalla, el valor y el número de cifras a mostrar (máximo 5). Para desempeñar su tarea, llama a la función de conversión y luego utiliza getAddress para obtener la dirección VRAM correspondiente a la posición que le hemos dado. Seguidamente, realizará un bucle para mostrar con vpoke la cadena que contiene el valor.

// vprintNumber: muestra un numero en la pantalla
// column = numero de columna (0 a 31)
// line = numero de fila (0 a 23)
// aNumber = valor a mostrar
// aLength = numero de cifras a mostrar
void vprintNumber(char column, char line, unsigned int aNumber, char aLength)
{
char pos=5;
unsigned int tiladdre=0;
char strBuff[5];

Num2Dec16(aNumber, strBuff);

// proporciona la direccion de la VRAM a partir de una posicion
tiladdre = getAddress(column, line);

//coloca el contador en la posicion donde se ha de empezar a mostrar
pos = 5-aLength;

// muestra el numero en la pantalla
while (aLength-->0){ vpoke(tiladdre++,strBuff[pos++]);}
}

Ejemplo de uso:
unsigned int valor=1024;
vprintNumber(9, 14, valor, 4);

No hay comentarios:

Publicar un comentario