Página 1 de 1

Z88DK scroll arriba y abajo en baja resolución

Publicado: Mar, 04 Feb 2014, 22:49
por radastan
Bien, os dejo la rutina para hacer scroll hacia arriba en baja resolución, va de perlas:

$this->bbcode_second_pass_quote('', '
')// ___________________________________________
// Scroll arriba
// ___________________________________________

void scroll_arriba (unsigned int x, unsigned int y, unsigned int ancho, unsigned int alto)
{
#asm
ld hl,2 ;pasamos la variable de entrada al acumulador
add hl,sp
ld b, 0
ld c, (hl)
dec c ; decrementamos en uno la altura, ya que la fila inferior no se moverá
push bc ; la altura la metemos en la pila
inc hl
inc hl
ld c, (hl) ; BC = ancho
inc hl
inc hl
ld d, (hl)
inc hl
inc hl
ld e, (hl)
; FIN DE LA RECOGIDA DE LOS DATOS DE ENTRADA
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
; FIN DEL CÁLCULO DE LA DIRECCIÓN DE PANTALLA
.otra3
ld h,d ; ponemos en HL DE + una línea de caracteres
ld l,e
ld a,l ; incrementamos una línea de caracteres (+32 bytes)
add a,32
ld l,a
jr nc, saltohl
ld a,h
add a,8
ld h,a ; aquí finaliza la suma a HL de un línea
.saltohl
push de ; guardamos la posición de la línea a mover
push hl ; guardamos la posición de la línea a mover
push de ; guardamos la posición de la línea a mover
push hl ; guardamos la posición de la línea a mover
ld a,8
.scroll3
push bc ; guardamos los bytes a mover
ldir ; scroll de una línea de pixels
pop bc ; recuperamos los bytes a mover
pop hl
pop de

inc d
inc h

push de
push hl
dec a
jr nz, scroll3 ; iteramos las 8 líneas
; INICIO DEL SCROLL DE LOS ATRIBUTOS
pop hl
pop de
pop hl ; recuperamos el valor vertical
pop de ; recuperamos el valor horizontal

push de
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

push hl
ld a,h ; 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 h,a ; ya tenemos h listo, h no hay que cambiarlo

push bc ; guardamos los bytes a mover
ldir ; scroll de una línea de pixels
pop bc ; recuperamos los bytes a mover
; FIN DEL SCROLL DE LOS ATRIBUTOS
pop hl ; recuperamos la altura
pop de ; recuperamos la línea a mover
pop hl ;recuperamos la altura, pero no la metemos en BC
dec l
jr nz, seguir3 ; iteramos hasta terminar el scroll de toda el área
ret ; FIN DE LA RUTINA
.seguir3
push hl
ld a,e ; incrementamos una línea de caracteres (+32 bytes)
add a,32
ld e,a ; aquí finaliza la suma de 32 a E
jr nc, saltox3
ld a,d
add a,8
ld d,a ; aquí finaliza la suma de 32 a D
.saltox3
jr otra3
#endasm
}

Re: Z88DK scroll arriba y abajo en baja resolución

Publicado: Mar, 04 Feb 2014, 22:52
por radastan
La cuestión es que me estoy devanando los sesos porque no me sale la que hace la dirección contraria, hacia abajo.

Teóricamente debería ser tan sencillo como empezar desde la parte de abajo e ir copiando hacia arriba, pero es que no me funciona. ¡Ayudaaaaaaaaaaaaaaaa!

$this->bbcode_second_pass_quote('', '
')// ___________________________________________
// Scroll abajo
// ___________________________________________

void scroll_abajo (unsigned int x, unsigned int y, unsigned int ancho, unsigned int alto)
{
#asm
ld hl,2 ;pasamos la variable de entrada al acumulador
add hl,sp
ld b, 0
ld c, (hl)
dec c ; decrementamos en uno la altura, ya que la fila inferior no se moverá
push bc ; la altura la metemos en la pila
inc hl
inc hl
ld c, (hl) ; BC = ancho
inc hl
inc hl
ld d, (hl)
inc hl
inc hl
ld e, (hl)
; FIN DE LA RECOGIDA DE LOS DATOS DE ENTRADA
ld a, d ; recuperamos el valor vertical
pop hl
add a,l ; le sumamos la altura
inc a
push hl
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
pop hl
add a,l ; le sumamos la altura
inc a
push hl
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
; FIN DEL CÁLCULO DE LA DIRECCIÓN DE PANTALLA
.otra4
ld h,d ; ponemos en DE HL + una línea de caracteres
ld l,e
ld a,l ; incrementamos una línea de caracteres (+32 bytes)
add a,32
ld e,a
jr nc, saltoh2
ld a,h
add a,8
ld d,a ; aquí finaliza la suma a HL de un línea
.saltoh2
push de ; guardamos la posición de la línea a mover
push hl ; guardamos la posición de la línea a mover
push de ; guardamos la posición de la línea a mover
push hl ; guardamos la posición de la línea a mover
ld a,8
.scroll4
push bc ; guardamos los bytes a mover
ldir ; scroll de una línea de pixels
pop bc ; recuperamos los bytes a mover
pop hl
pop de

inc d
inc h

push de
push hl
dec a
jr nz, scroll4 ; iteramos las 8 líneas
; INICIO DEL SCROLL DE LOS ATRIBUTOS
pop hl
pop de
pop hl ; recuperamos el valor vertical
pop de ; recuperamos el valor horizontal

push de
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

push hl
ld a,h ; 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 h,a ; ya tenemos h listo, h no hay que cambiarlo

push bc ; guardamos los bytes a mover
ldir ; scroll de una línea de pixels
pop bc ; recuperamos los bytes a mover
; FIN DEL SCROLL DE LOS ATRIBUTOS
pop hl ; recuperamos la altura
pop de ; recuperamos la línea a mover
pop hl ; recuperamos la altura, pero no la metemos en BC
dec l
jr nz, seguir4 ; iteramos hasta terminar el scroll de toda el área
ret ; FIN DE LA RUTINA
.seguir4
push hl
ld a,e ; decrementamos una línea de caracteres (+32 bytes)
dec a,32
ld e,a ; aquí finaliza la resta de 32 a E
jr nc, saltox4
ld a,d
dec a,8
ld d,a ; aquí finaliza la resta de 32 a D
.saltox4
jr otra4
#endasm
}

Re: Z88DK scroll arriba y abajo en baja resolución

Publicado: Mar, 04 Feb 2014, 23:10
por antoniovillena
Usa lddr en lugar de ldir, y por supuesto cambia los valores con los que los inicializas.

Re: Z88DK scroll arriba y abajo en baja resolución

Publicado: Mié, 05 Feb 2014, 08:47
por radastan
$this->bbcode_second_pass_quote('antoniovillena', 'U')sa lddr en lugar de ldir, y por supuesto cambia los valores con los que los inicializas.


Vamos a ver, es que yo hago el scroll por filas de caracteres con sus atributos y todo. Es decir, da igual que sea arriba o abajo porque la parte en la que desplazo es la misma, sólo tengo que decrecer filas cuando termino una en vez de incrementarlas.

El problema es que no doy con la tecla con la inicialización y con decrecer líneas por lo visto, algo mal hago.

Re: Z88DK scroll arriba y abajo en baja resolución

Publicado: Vie, 07 Feb 2014, 23:40
por radastan
¿Sabéis esa idiotez que os jode durante semanas y de repente lo veis, allí puesto, y pensáis si no estabais borrachos hasta ese momento? pues eso me ha pasado.

Estaba usando DEC en vez de SUB, es decir, decrementaba en uno en vez de substraer el valor que necesitaba.

Este es el código correcto y funcionan perfectamente:

$this->bbcode_second_pass_code('', '
// ___________________________________________
// Scroll abajo
// ___________________________________________

void scroll_abajo (unsigned int x, unsigned int y, unsigned int ancho, unsigned int alto)
{
#asm
ld hl,2 ;pasamos la variable de entrada al acumulador
add hl,sp
ld b, 0
ld c, (hl)
dec c ; decrementamos en uno la altura, ya que la fila inferior no se moverá
push bc ; la altura la metemos en la pila
inc hl
inc hl
ld c, (hl) ; BC = ancho
inc hl
inc hl
ld d, (hl)
inc hl
inc hl
ld e, (hl)
; FIN DE LA RECOGIDA DE LOS DATOS DE ENTRADA
ld a, d ; recuperamos el valor vertical
pop hl
add a,l ; le sumamos la altura
dec a
push hl
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
pop hl
add a,l ; le sumamos la altura
dec a
push hl
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
; FIN DEL CÁLCULO DE LA DIRECCIÓN DE PANTALLA
.otra4
ld h,d ; ponemos en DE HL + una línea de caracteres
ld l,e
ld a,l ; incrementamos una línea de caracteres (+32 bytes)
add a,32
ld e,a
jr nc, saltoh2
ld a,h
add a,8
ld d,a ; aquí finaliza la suma a HL de un línea
.saltoh2
push de ; guardamos la posición de la línea a mover
push hl ; guardamos la posición de la línea a mover
push de ; guardamos la posición de la línea a mover
push hl ; guardamos la posición de la línea a mover
ld a,8
.scroll4
push bc ; guardamos los bytes a mover
ldir ; scroll de una línea de pixels
pop bc ; recuperamos los bytes a mover
pop hl
pop de

inc d
inc h

push de
push hl
dec a
jr nz, scroll4 ; iteramos las 8 líneas
; INICIO DEL SCROLL DE LOS ATRIBUTOS
pop hl
pop de
pop hl ; recuperamos el valor vertical
pop de ; recuperamos el valor horizontal

push de
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

push hl
ld a,h ; 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 h,a ; ya tenemos h listo, h no hay que cambiarlo

push bc ; guardamos los bytes a mover
ldir ; scroll de una línea de pixels
pop bc ; recuperamos los bytes a mover
; FIN DEL SCROLL DE LOS ATRIBUTOS
pop de ; recuperamos la línea a mover
pop hl
pop hl ; recuperamos la altura, pero no la metemos en BC
dec l
jr nz, seguir4 ; iteramos hasta terminar el scroll de toda el área
ret ; FIN DE LA RUTINA
.seguir4
push hl

ld a,e ; decrementamos una línea de caracteres (-32 bytes)
sub a,32
ld e,a ; aquí finaliza la resta de 32 a E
jr nc, saltox4
ld a,d
sub a,8
ld d,a ; aquí finaliza la suma de 32 a D
.saltox4
jr otra4
#endasm
}
')

Ala, ya he terminado todas las rutinas básicas en baja resolución, ahora crear las mismas para CPC y terminar el tutorial.

Z88DK scroll arriba y abajo en baja resolución

Publicado: Sab, 08 Feb 2014, 09:43
por jrodriguezv
¡Muy buenas noticias!