Z88DK scroll arriba y abajo en baja resolución

Soporte técnico sobre los lanzamientos de MojonTwins y comentarios sobre los güegos. Ofrecemos soporte técnico con Fourspriter, te ayudamos con ZX Basic o Z88DK, te damos pistas some cómo saltarse un bicho y cosas así.

Moderador: na_th_an

Avatar de Usuario
radastan
Mensajes: 692
Registrado: Vie, 20 Ago 2010, 12:54
Contactar:

Z88DK scroll arriba y abajo en baja resolución

Mensajepor radastan » Mar, 04 Feb 2014, 22:49

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
}