Hola
Bueno, haciendo mis pruebecillas y chorradillas en asembler se me
ocurrió probar a hacer un scroll lateral (Der->Izq), asi que empecé
y parece que mas o menos funciona, pero creo que mi código tiene de
tener algún error y mas bien grande, lo noto sobre todo el la
velocidad ridícula que alcanza.
Si alguien es tan amable de mirárselo un poquillo y decirme que
puede ser, aunque solo sea darme una pista
.
El programa hace todas las operaciones sobre el VDP no se si seria
mas correcto hacer el scroll sobre la ram y luego volcarlo al vdp,
también deciros que antes de usar directamente el vdp (con in y
out's) estuve con las rutinas de la bios, lo que pasa es que como lo
vi tan lento poooosss me dio por probar :P
Bueno, aquí esta el código, lamento que este tan mal comentado, pero
todo se mejorara.
Las variables b y c indican el rango de pantalla donde se ejecutara
el scroll, tal y como estan ahora el scroll lo hace asi:
0,0 ----------------------------
| | |
| | |
|-----------10,10 |
|
|
| |
----------------------------
Compila sin problemas con el asMSX
.basic
.bios
.org 40000
SCREEN equ 0000h
COLOR equ 8192
ld b,25 // y
ld c,32 // x
di
// bucle para patearse el area de scroll
bucle: call scroll
ld a,c
dec a
ld c,a
jp nz,bucle
ld a,b
dec a
ld b,a
jp nz,bucle
ei
ret
//
// calcula la dirección en la que debe leer y escribir
//
scroll: ld de,32
ld hl,0
ld a,b
cp 0
jp z,columna
fila: sra a // divido la fila entre 8
sra a
sra a
cp 0
jp z,nosup // si el resultado de la división es 0 salta
a nosup
supera: add hl,de
dec a
jp nz,supera
nosup: ld a,b // selecciona solo los 3 primeros bis's de b
and 7
add a,l
ld l,a
columna:ld de,8
ld a,c
cp 0
jr z,sada
increm: add hl,de
dec a
cp 0
jr nz,increm
//
// aquí termina el calculo de la dirección (read/write)
//
sada: ld de,SCREEN
add hl,de
ld a,[tmpdat] // comprueba si la operación anterior
tuvo tmpdat
cp 1
jp nz,ncarry // si no hay tmpdat salta a ncarry
ld a,0
ld [tmpdat],a
call LEEV
sla a
jr nc,nada // si no hay tmpdat en la operario salta
a "nada"
push af // en caso contrario pone [tmpdat] a 1
ld a,1
ld [tmpdat],a
pop af
nada: set 0,a // pone el bit 0 a 1 y lo escribe en la vram
call ESCRIV
ret
ncarry: ld a,0
ld [tmpdat],a
call LEEV
sla a
jp nc,nada1
push af
ld a,1
ld [tmpdat],a
pop af
nada1: call ESCRIV
ret
ESCRIV: push af
ld a,l
out (99h),a
ld a,h
or 40h
out (99h),a
pop af
out (98h),a
ret
LEEV: ld a,l
out (99h),a
ld a,h
out (99h),a
in a,(98h)
ret
tmpdat: db 0