Página 4 de 10

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Lun, 19 May 2014, 13:17
por Hark0
$this->bbcode_second_pass_quote('na_th_an', 'T')e lo he recortado yo, con esto debería ser suficiente.


deJcargando... ;)

Si me echas una manica ahora con la función rand() que funque en la versión Radastan...

... con esto tengo para dejaros en paz unos días. :mrgreen:

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Lun, 19 May 2014, 13:23
por na_th_an
Ahora ando liao, pero si te bajas la última versión de la churrera tienes un rand () y un srand () en engine.h. También necesitarás las variables que usa la rutina que están definidas en definitions.h. Con un poco de cortapega lo tienes, y creo que te servirá como aprendizaje.

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Lun, 19 May 2014, 14:07
por Hark0
$this->bbcode_second_pass_quote('na_th_an', 'A')hora ando liao, pero si te bajas la última versión de la churrera tienes un rand () y un srand () en engine.h. También necesitarás las variables que usa la rutina que están definidas en definitions.h. Con un poco de cortapega lo tienes, y creo que te servirá como aprendizaje.



prefestro...

Para el tema del texto, he cortapegado de tu simple-printer.h.... (que te has dejado un #asm por ahi en medio entre función y función y al meterla a saco petaba por todas partes.... :P)

Yo he puesto la definición de la typo en mi .h de graficos y las funciones en mi video.h

;)

Y he aqui lo que pacha:

Image


Y digo yo.... jejejeje.... usando la "lógica ZX", podria coger, modificar los defb de los carácteres que no vaya a usar y "pintarlos" con esta misma función draw_fast de a uno para "hacerme" un pintatile8x8... cierto?

Como le cambio el valor de atributos ink+paper+bright+flash? toqueteando el valor de clr verdad?

Ay... como decia el Macario: "qué contento estoooooooooooy"... :mrgreen:

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Lun, 19 May 2014, 14:24
por na_th_an
Sí, puedes hacerlo así. De hecho, puedes añadirlos después de los que ya hay. En los datos que hay tras _letters sólo se definen los caracteres de 32 a 127... Si pones tus gráficos después puedes tener hasta 128 caracteres más sin problemas. Con usar los valores correctos en las variables y llamar a la función draw_char, se imprimirá tu gráfico.

Lo puedes hacer muy fácilmente. Pon esto al final:

$this->bbcode_second_pass_code('', 'void put8x8 (unsigned char x, unsigned char y, unsigned char c, unsigned char n) {
unsigned char *address = (unsigned char *) (22528 + x + (y << 5));
ncx [0] = x; ncy [0] = y; ncn [0] = n;
*address = c;
#asm
call _drawchar
#endasm
}')

Como ves, simplemente se ponen los valores de los parámetros en las variables que se usan desde ensamblador y se llama a _drawchar. Hay mejores formas de hacerlo, pero esta era la única que me salía a mí cuando hicimos Maritrini en 2011. Lo de *address = c es para darle el color.

Puedes probarlo añadiendo 85,170,85,170,85,170,85,170 al final de todos los números y llamando a put8x8 (10, 10, 70, 128); para ver un bonito cuadrado con trama.

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Mar, 20 May 2014, 07:29
por Hark0
Hoy lo pruebo junto con lo de rand(), que ayer me comió el reloj!

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Mar, 20 May 2014, 14:25
por radastan
Respecto a un rutinita para imprimir sprites de 8x8 pixels a color...

$this->bbcode_second_pass_code('', '
// ___________________________________________
// Posiciona un Sprite de 8x8 a color
// ___________________________________________

void put_sprite_x8 (unsigned char *posicion, unsigned int x, unsigned int y)
{
// -------------------------------------------
// RUTINA DE IMPRESION DE UN SPRITE 8x8 PIXELS
// CON ATRIBUTOS EN CUALQUIER POSICION DE CARACTER
// ENTRADAS:
// D será la posición del cursor vertical en caracteres
// E será la posición del cursor horizontal en caracteres
// HL es la posición de memoria donde tenemos el sprite
// SALIDAS: se escribe en el mapa de pantalla
// ADVERTENCIAS: no comprueba límites de pantalla
// -------------------------------------------
#asm
ld hl,2 ;pasamos la variable de entrada al acumulador
add hl,sp
ld d, (hl)
inc hl
inc hl
ld e, (hl)
inc hl
inc hl
ld a, (hl)
inc hl
ld h, (hl)
ld l, a
ld a, d ; recuperamos el valor vertical
and 7 ; nos quedamos con la posición en el tercio
rrca
rrca
rrca ; rotamos para dejar su valor en múltiplos de 32 (linea)
and 224 ; borramos el resto de bits por si las moscas
or e ; sumamos el valor horizontal
ld e, a ; e preparado
ld a, d
and 24 ; modificamos según el tercio de pantalla
or 64 ; nos posicionamos a partir de 16384 (16384=64+0 en dos bytes)
ld d, a ; d preparado, ya tenemos la posición en pantalla
push de ; guardamos DE (la posición de pantalla)
ld b, 8
ld c,255 ; cargamos C con 255 para no afectar B con LDI

.draw25
ldi
dec de
inc d
djnz draw25 ; decrementa B y si es cero deja de saltar a draw

; Ahora imprimimos los atributos
pop de ; recuperamos el valor horizontal
ld a,d ; calculamos el valor de posición en la pantalla
rra
rra
rra ; multiplicamos por 32
and 3 ; nos quedamos con los tres bits bajos
or 88 ; apuntamos al comienzo del mapa de atributos
ld d,a ; ya tenemos d listo, e no hay que cambiarlo
ldi ; imprimimos los colores
ret

#endasm
}
')

Lo añades a motorzx.h y ya puedes usarla.

Por cierto, es interesante la misma rutina pero sin color, ya que es la que usaré para el tema de imprimir texto:

$this->bbcode_second_pass_code('', '
// ___________________________________________
// Posiciona una letra de 8x8 sin color
// ___________________________________________

void put_char (unsigned char *posicion, unsigned int x, unsigned int y)
{
// -------------------------------------------
// RUTINA DE IMPRESION DE UNA LETRA DE 8x8 PIXELS
// EN CUALQUIER POSICION DE CARACTER
// ENTRADAS:
// D será la posición del cursor vertical en caracteres
// E será la posición del cursor horizontal en caracteres
// HL es la posición de memoria donde tenemos la letra
// SALIDAS: se escribe en el mapa de pantalla
// ADVERTENCIAS: no comprueba límites de pantalla
// -------------------------------------------
#asm
ld hl,2 ;pasamos la variable de entrada al acumulador
add hl,sp
ld d, (hl)
inc hl
inc hl
ld e, (hl)
inc hl
inc hl
ld a, (hl)
inc hl
ld h, (hl)
ld l, a
ld a, d ; recuperamos el valor vertical
and 7 ; nos quedamos con la posición en el tercio
rrca
rrca
rrca ; rotamos para dejar su valor en múltiplos de 32 (linea)
and 224 ; borramos el resto de bits por si las moscas
or e ; sumamos el valor horizontal
ld e, a ; e preparado
ld a, d
and 24 ; modificamos según el tercio de pantalla
or 64 ; nos posicionamos a partir de 16384 (16384=64+0 en dos bytes)
ld d, a ; d preparado, ya tenemos la posición en pantalla
ld b, 8
ld c,255 ; cargamos C con 255 para no afectar B con LDI
.draw26
ldi
dec de
inc d
djnz draw26 ; decrementa B y si es cero deja de saltar a draw
ret

#endasm
}
')

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Mar, 20 May 2014, 14:40
por radastan
El tema de random ya es harina de otro costal, y para nada banal, usa la solución de los mojones de momento mientras yo me curro la mía (debe ser independiente de tener ROM o no).

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Mar, 20 May 2014, 14:50
por na_th_an
La que hay en la churrera no necesita la ROM.

De todos modos en Ninjajar hay una mucho mejor (que puedes encontrar en WOS, por cierto), más corta, más rápida, y que ofrece más random. Mañana podrás pillarla del código.

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Mar, 20 May 2014, 15:06
por radastan
$this->bbcode_second_pass_quote('na_th_an', 'M')añana podrás pillarla del código.


HYPE

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Mar, 20 May 2014, 15:36
por angel
$this->bbcode_second_pass_quote('radastan', '')$this->bbcode_second_pass_quote('na_th_an', 'M')añana podrás pillarla del código.


HYPE


Yeah! :ojo: :poke: